canvas 0.58.1__py3-none-any.whl → 0.60.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of canvas might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: canvas
3
- Version: 0.58.1
3
+ Version: 0.60.0
4
4
  Summary: SDK to customize event-driven actions in your Canvas instance
5
5
  Author-email: Canvas Team <engineering@canvasmedical.com>
6
6
  License-Expression: MIT
@@ -81,8 +81,8 @@ canvas_cli/utils/urls/urls.py,sha256=KwWTh5ERrEsZEvdBrZpZB71xtyWkDuglpXUbycWmBOo
81
81
  canvas_cli/utils/validators/__init__.py,sha256=rBvSR2O1hWkNAnUBdcr-zUkmqT796_A61b9pnvEhwrM,113
82
82
  canvas_cli/utils/validators/manifest_schema.py,sha256=XNw-sbFgxaXzffWnQd6zLg5V74odv7jGiEFENWKnluA,6057
83
83
  canvas_cli/utils/validators/validators.py,sha256=lrUBQ0sF7seTe_pNGsNgASdr2BGp6g-Qui58V4H9qfQ,1598
84
- canvas_generated/messages/effects_pb2.py,sha256=jZi-ms2OMQ86B36c8YqYUytV72dgiOmC0Owk0j5umOA,14068
85
- canvas_generated/messages/effects_pb2.pyi,sha256=n5qyeVh3hBgQKiQ2sUyKRspH89IXD6HaGcdCxlsZ3-w,25171
84
+ canvas_generated/messages/effects_pb2.py,sha256=S8DwZqNNukADofnE4iUw6J_AE1Gyj5J5DrUiKxF_IqY,14157
85
+ canvas_generated/messages/effects_pb2.pyi,sha256=eYGOGEh7HPW3TvIAFFFHNfbx0Qrgpc0XPJwoVCQmM4k,25351
86
86
  canvas_generated/messages/effects_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
87
87
  canvas_generated/messages/events_pb2.py,sha256=h7Uh37N5qEcocRFjLc3P-8WQXgU419hDbXAMcCqhbfw,55788
88
88
  canvas_generated/messages/events_pb2.pyi,sha256=1Q6Htlh7bjD4U67OYrdpQDyc6yLVW74nPeKvbsQdqBI,100563
@@ -171,9 +171,10 @@ canvas_sdk/effects/note/appointment.py,sha256=ca46df8onI-I6szPJWSz_N745PWchKMBcr
171
171
  canvas_sdk/effects/note/base.py,sha256=3TeUdVsWWl0iJ8fkbCLJ0SjcZ0fEASy50r-ubSXvCpI,7587
172
172
  canvas_sdk/effects/note/message.py,sha256=T6p6h4J_I0k2jQSirFtIusydak4tem9yBPOTexvOQ0s,3740
173
173
  canvas_sdk/effects/note/note.py,sha256=_iVVagZUM4fWOMw3Cy4KXl5rd-1_NgF57QSBl5y9d7w,4610
174
- canvas_sdk/effects/patient/__init__.py,sha256=POWxjgR3zAawvaP0XVxFAVDmatAySR1kJSWg9_jOfpU,358
175
- canvas_sdk/effects/patient/base.py,sha256=OXqymxGvRTSd8DxtGQuhORFIxDQYimkXFsYLgjkKNls,4596
174
+ canvas_sdk/effects/patient/__init__.py,sha256=QC5UszNibt-BTC3rfCq9y-j4-APuBMUZfAllB8WnIDY,636
175
+ canvas_sdk/effects/patient/base.py,sha256=E60n-RtD8q5Fo1UxCS1-RmZu14qBV5raiYtm2TcxrWU,8342
176
176
  canvas_sdk/effects/patient/create_patient_external_identifier.py,sha256=d03jzJcz2n19_NVo_wAq88iKZRuuM60qsZhGGhL7pGE,1055
177
+ canvas_sdk/effects/patient/create_patient_preferred_pharmacies.py,sha256=Vaby6L5PALtLAiJCNmqKsDec8UZ7DVFyP7kU0fHrpT4,2096
177
178
  canvas_sdk/effects/patient_metadata/__init__.py,sha256=vxTpaP9gY1iNf0iVSoh24buFR7XfY2FKVYKn_P7BJkg,342
178
179
  canvas_sdk/effects/patient_metadata/base.py,sha256=pq_xtFLyzHfYWTCjWEicOfsLkG3Nu_ECzLB85tYOToM,1286
179
180
  canvas_sdk/effects/patient_metadata/patient_metadata_create_form.py,sha256=ePoPcG2vuFrsnhPWU_XavMK5UVAxBvcMzDhpu9HzTu0,1918
@@ -213,8 +214,10 @@ canvas_sdk/questionnaires/utils.py,sha256=avDMUcQ5XmLfhlBpPJNMtNrVqrPy7g7HtqbSzz
213
214
  canvas_sdk/templates/__init__.py,sha256=LtUmLDsGSTq249T6sA7PUzkl2OfCAyvtIOGPNHr6wTo,83
214
215
  canvas_sdk/templates/utils.py,sha256=J-wDQ9ijOr_jz1SJxjpyZgR7JwXqtGMSS5IperLi2qE,1475
215
216
  canvas_sdk/test_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
- canvas_sdk/test_utils/factories/__init__.py,sha256=mtd247ZUaW3-w5RfuXGMC2iM8XYLnxXUIzbDWqSvo7o,171
217
- canvas_sdk/test_utils/factories/patient.py,sha256=KKHUcgqu3r3sOc21gQ5p__71zBLm9QZysW5TSnJ631U,1138
217
+ canvas_sdk/test_utils/factories/__init__.py,sha256=xzQECzqaDsPAYEBNqfSiz7CEFFI9I7pnYQtHaTuP2r0,398
218
+ canvas_sdk/test_utils/factories/facility.py,sha256=9ZNBHCgPelD4oQynwez32I4Gx0kV1O78kgKvuiByyhg,697
219
+ canvas_sdk/test_utils/factories/patient.py,sha256=zXy47K9C6cmQympOABHGUv-1hOqYIXNb7c4TziFO1RE,1594
220
+ canvas_sdk/test_utils/factories/protocol_current.py,sha256=twq6GdTM29WYZ-AvfE3vkfV3dOMhZDmv_lNZC2eGe8g,1904
218
221
  canvas_sdk/test_utils/factories/user.py,sha256=QLxilvK22fHSsGFxe1j354VdMrdquO8nyWApdXXdS8Q,306
219
222
  canvas_sdk/utils/__init__.py,sha256=PADveJMf-BtOapK5Cczy-nOuZzVh-HT2H6sfJW_SK9U,198
220
223
  canvas_sdk/utils/db.py,sha256=wOZORBfyBVxQkay5vyEtQ4i0KVCfASFGREmecHMR8DE,409
@@ -224,7 +227,7 @@ canvas_sdk/utils/plugins.py,sha256=OPq9OiE1v1AF24HSdEEOlSJxRVc2NVksK0Gpf6OH1NE,1
224
227
  canvas_sdk/v1/__init__.py,sha256=YYXr5tEQlnwMgTXJbOG963tKSPiUOM4mUkX8wuiqp7U,17
225
228
  canvas_sdk/v1/apps.py,sha256=4MwQfQu78oX5bUVlyxYzbt4rZODi0ZesXe_3QOsEWO8,170
226
229
  canvas_sdk/v1/models.py,sha256=LqeHZ-Hz3EWyM9vYr9uZ9rBYdMXNuuvJqbmojV8EcEM,224
227
- canvas_sdk/v1/data/__init__.py,sha256=z2v3leRHvkPEjULJq2OxlTzURXI7-o9r1z2QokUUaP4,5281
230
+ canvas_sdk/v1/data/__init__.py,sha256=z-mtXiNq6ylRVfICK6xizERIx2F3DHUqLB2Gw3-HM2U,5524
228
231
  canvas_sdk/v1/data/allergy_intolerance.py,sha256=KXfU7UqTdRfHUFrP8yncQGMvlRPEt2K6TrC_y7JYgiE,2453
229
232
  canvas_sdk/v1/data/appointment.py,sha256=UXvn6wYEgsphhTQaFbFg-UE7Bumy_UR-AQFnsSrL5Dk,2658
230
233
  canvas_sdk/v1/data/assessment.py,sha256=vnVoaKWoJGCfaYn6WilxpI5cTgkvM647hFIuTyi_AgY,1663
@@ -244,28 +247,32 @@ canvas_sdk/v1/data/coverage.py,sha256=i03BeVxNCsxXWnBL8klySFRXXN-T1hF01HyCvcCnlY
244
247
  canvas_sdk/v1/data/detected_issue.py,sha256=k-tOX6fpzfRf9WmG7neHPEeWrpZUdTiTEqYzKaa2haI,1865
245
248
  canvas_sdk/v1/data/device.py,sha256=5YnCApQR3ZprGO9zCsSP-4spwo4HVRDSTY3QCNwqYlo,1932
246
249
  canvas_sdk/v1/data/discount.py,sha256=Bqa0PcytSdqZ0MJor9EShtRUmNWGcBKtivGCmjk9Pbw,618
250
+ canvas_sdk/v1/data/facility.py,sha256=_Ux4D34Evcexu95iRMLN0foGcHJI6KweIYkbyYVAe0s,947
247
251
  canvas_sdk/v1/data/fields.py,sha256=bI7mPI_3B36ntyoVQ6vuDq8eGLoUIkwZZr14lTC-4To,1104
252
+ canvas_sdk/v1/data/goal.py,sha256=dOI0rakLBnnYSkdMt5W2uh7_W5Pp21G6s1z70PzU3TY,2465
248
253
  canvas_sdk/v1/data/imaging.py,sha256=N0OkJjmHI3jtv1w8RBhqGZGDGidNpf1ZwT0ypm1o60M,5246
249
254
  canvas_sdk/v1/data/invoice.py,sha256=F5j_Hvu-YwqhHFkp6FDui8vx6GumCAgj14YgDvfyeYU,1877
250
255
  canvas_sdk/v1/data/lab.py,sha256=8FPnApgcEfZ5f62387EgY6RZd8za2wps5LMzCB0_x6U,12969
251
256
  canvas_sdk/v1/data/line_item_transaction.py,sha256=OJA_3DLA1RF0v8jCgQ8SHaoqij_Z97Iatfi5i6CVEis,2406
252
257
  canvas_sdk/v1/data/medication.py,sha256=QMAUqqldJeQK9IuaoO5mWFp3IEjbqcqrxkzIgFZ4O0U,2333
253
258
  canvas_sdk/v1/data/message.py,sha256=EKc2kkWGuzrgBH3sDUa9jiNpRP7J1ZdWE6BnPhY2gvs,2268
254
- canvas_sdk/v1/data/note.py,sha256=ZZN0CoQbXmXxzo1cb7bpiXBcy7kLpTzZueGgdd6H95Q,9301
259
+ canvas_sdk/v1/data/note.py,sha256=Eq0JgDRzwK84BAT6Y51f47Gke2rseC3vvcjoqhzAsVE,9335
255
260
  canvas_sdk/v1/data/observation.py,sha256=l1EXGQ8FBBInxQthsmY1Oms9v73ni_J7SAP5M8Hmkvg,3881
256
261
  canvas_sdk/v1/data/organization.py,sha256=gt0KZC1hklwWf57vCxs2K0qPnLpMyyNFWNL7-WZ6AqI,1159
257
- canvas_sdk/v1/data/patient.py,sha256=7D_bxeCAoA_I8-2ZLzAMkCrV9ziZ_-IND9uOq0Wp83I,10515
262
+ canvas_sdk/v1/data/patient.py,sha256=VMFlr6P5BxLN6MK0k8hjIccfumdkL8CJrMtDrLms0qY,11748
258
263
  canvas_sdk/v1/data/patient_consent.py,sha256=zx1C__E6On-MC7OnTgEeP50tn77R6UXw15wC125jDog,2704
259
264
  canvas_sdk/v1/data/payment_collection.py,sha256=h17qmQkCCwSdukIeeYMqBHZnpxpahOa03ckMHmgZV-I,954
260
265
  canvas_sdk/v1/data/payor_specific_charge.py,sha256=TtByy7-QF00PfONC-QDo2kkxRAOdLaRjkhssQBPvZjw,770
261
266
  canvas_sdk/v1/data/posting.py,sha256=fZhglI5WNGCuZy-kcCurX9hnNUtFUFKjwsqjxyiOC7U,7749
262
267
  canvas_sdk/v1/data/practicelocation.py,sha256=O-avErANUE3KwUB_vlRbTe9MywVj2jfBgcZda_q-_Vw,4381
268
+ canvas_sdk/v1/data/protocol_current.py,sha256=TpJR0u6dncWALhGzYgkyJbdSKRtKD-KjWWJplc8pJL0,615
263
269
  canvas_sdk/v1/data/protocol_override.py,sha256=zSDHngf9Pqz4irYN_BoX5wy-uJc83NFunPBJnUfS1OI,2259
270
+ canvas_sdk/v1/data/protocol_result.py,sha256=PTzNx57ADsGzG_Zrt3HUa1vi_QyejIYuVMFRZqqJS2A,1604
264
271
  canvas_sdk/v1/data/questionnaire.py,sha256=4vQFbBjnvfXwvb73Q0ES64bnWME6P-Oy_9E9ioWAOg8,7209
265
272
  canvas_sdk/v1/data/reason_for_visit.py,sha256=diXbeGUUc_XBmIDpzubxesc6Nhj5F87zw2oYurPSE3M,669
266
273
  canvas_sdk/v1/data/referral.py,sha256=qVPHWqDlJoBzrYsNhP6z2NQ2Wpus_OxW8LwHYpLlM-M,3589
267
274
  canvas_sdk/v1/data/service_provider.py,sha256=LQfQ0esg97NpmSYnftsWqYUJyJIQOZKmpZFNnGsxXoQ,1917
268
- canvas_sdk/v1/data/staff.py,sha256=iVqBXwANp1qYEL39DIpveKbuqd1nw1oSDQ917xw8xgk,8302
275
+ canvas_sdk/v1/data/staff.py,sha256=osAPzLw2y-SJW5TQt69RnKBmsDx5wKeDNmbBtfxYDWw,9392
269
276
  canvas_sdk/v1/data/task.py,sha256=9jSqr7e7ODJTs4hanWsOD-1Rb8gByJOuLta90V9V_hY,3480
270
277
  canvas_sdk/v1/data/team.py,sha256=J4s98sS7UuUw9jJCe-_7eikr1dV4SQARDzK5oxmsO_o,2832
271
278
  canvas_sdk/v1/data/user.py,sha256=82jnqVrYeWo2eBXY_MH2r75LZo5EKgY9kalahrUl0_s,511
@@ -295,7 +302,7 @@ canvas_sdk/views/__init__.py,sha256=YYXr5tEQlnwMgTXJbOG963tKSPiUOM4mUkX8wuiqp7U,
295
302
  logger/__init__.py,sha256=uMIOf1CDdKSmBKxKwO4CmDpvnJITci76IMXENOwSHEo,85
296
303
  logger/logger.py,sha256=l5W5jn3vGQt6TM7OxOpoMy-vC7RNNA2pGnQJJgHeXWA,2068
297
304
  plugin_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
298
- plugin_runner/allowed-module-imports.json,sha256=pFydies3GLrUmloVwuPgULHTR2ZEao_qbam7D97Fx8Q,35931
305
+ plugin_runner/allowed-module-imports.json,sha256=Z0WtFFA52DUF-oCeI50_4iURWRSN2-vdd1T-ewxh4rM,36717
299
306
  plugin_runner/authentication.py,sha256=UyyhXajokVFH866dpDhoTlXS9Cg7y0sQltn0_LcwXrY,1131
300
307
  plugin_runner/aws_headers.py,sha256=wZ8584E1fTW0CdGxOCnLSF8alH27z-URcUyoc6y6ohg,2782
301
308
  plugin_runner/exceptions.py,sha256=ltqn56SMTg-T5miSh5hux4ojwx0hZGSWaB7BxyAmcAo,545
@@ -304,7 +311,7 @@ plugin_runner/installation.py,sha256=2KTDWWsQ97WIN2k9tC4d50zN77WWK_1D5obXlhLfWw8
304
311
  plugin_runner/load_all_plugins.py,sha256=4T2gW2YljhIx4xfwf1c0F_8oIbE1ubsLj0ShkHRtlVY,5847
305
312
  plugin_runner/plugin_runner.py,sha256=RpcZoXXzGEflJGuHJaAOCP24mWb4fG1bLw3ryA6n88k,26623
306
313
  plugin_runner/sandbox.py,sha256=A5iaxQePwA5FERK232MArq2VzZzHKM5ydrfTDFeXcLg,30232
307
- protobufs/canvas_generated/messages/effects.proto,sha256=wQBRk0_XN8ssIjDtRttxsEG6pZJbYS8czGzdvpx3g6M,9756
314
+ protobufs/canvas_generated/messages/effects.proto,sha256=ovVNjjWd6LvRnrk0Pu76AeT6wQjA_K-vvxMvgafQYMI,9827
308
315
  protobufs/canvas_generated/messages/events.proto,sha256=21qM3Ct9-iIG_T7O-XoFPWpnVafocYJ1KGiZ2nn1CFM,52047
309
316
  protobufs/canvas_generated/messages/plugins.proto,sha256=xJyEeTwM6wWja3vGECLsIzfabwf1VahDgacoPL3TuwI,323
310
317
  protobufs/canvas_generated/services/plugin_runner.proto,sha256=PZ0Ts11b9tdA5Gkg2M05JVEKAm0R4LFEwrGRS-TQ16E,466
@@ -324,7 +331,7 @@ canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookie
324
331
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/README.md,sha256=3QKoJQq3YmdplGnDOBMsLCJ3Ya1_aKjoz-QiWc4QfjA,291
325
332
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/protocols/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
333
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/protocols/my_protocol.py,sha256=fKLLcOIwvSWenW8-7tr8VqnF4Iox_5wU9V-Qw9UySsA,2381
327
- canvas-0.58.1.dist-info/METADATA,sha256=3X9kEv7rwoBL0FHJVrtoGNhJYPYU_lojLmyJxgVY6n0,4758
328
- canvas-0.58.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
329
- canvas-0.58.1.dist-info/entry_points.txt,sha256=0Vs_9GmTVUNniH6eDBlRPgofmADMV4BES6Ao26M4AbM,47
330
- canvas-0.58.1.dist-info/RECORD,,
334
+ canvas-0.60.0.dist-info/METADATA,sha256=ubqSX0pfGxciJWZiyzLwb2dijpOB5f8uM3PPV1DHFF8,4758
335
+ canvas-0.60.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
336
+ canvas-0.60.0.dist-info/entry_points.txt,sha256=0Vs_9GmTVUNniH6eDBlRPgofmADMV4BES6Ao26M4AbM,47
337
+ canvas-0.60.0.dist-info/RECORD,,
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'canvas_generated/messages/effects.proto\x12\x06\x63\x61nvas\"y\n\x06\x45\x66\x66\x65\x63t\x12 \n\x04type\x18\x01 \x01(\x0e\x32\x12.canvas.EffectType\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x13\n\x0bplugin_name\x18\x03 \x01(\t\x12\x11\n\tclassname\x18\x04 \x01(\t\x12\x14\n\x0chandler_name\x18\x05 \x01(\t*\xb2\x43\n\nEffectType\x12\x12\n\x0eUNKNOWN_EFFECT\x10\x00\x12\x07\n\x03LOG\x10\x01\x12\x14\n\x10\x41\x44\x44_PLAN_COMMAND\x10\x02\x12\x1f\n\x1b\x41UTOCOMPLETE_SEARCH_RESULTS\x10\x03\x12\x14\n\x10\x41\x44\x44_BANNER_ALERT\x10\x04\x12\x17\n\x13REMOVE_BANNER_ALERT\x10\x05\x12\x1c\n\x18ORIGINATE_ASSESS_COMMAND\x10\x06\x12\x17\n\x13\x45\x44IT_ASSESS_COMMAND\x10\x07\x12\x19\n\x15\x44\x45LETE_ASSESS_COMMAND\x10\x08\x12\x19\n\x15\x43OMMIT_ASSESS_COMMAND\x10\t\x12!\n\x1d\x45NTER_IN_ERROR_ASSESS_COMMAND\x10\n\x12\x1e\n\x1aORIGINATE_DIAGNOSE_COMMAND\x10\x0b\x12\x19\n\x15\x45\x44IT_DIAGNOSE_COMMAND\x10\x0c\x12\x1b\n\x17\x44\x45LETE_DIAGNOSE_COMMAND\x10\r\x12\x1b\n\x17\x43OMMIT_DIAGNOSE_COMMAND\x10\x0e\x12#\n\x1f\x45NTER_IN_ERROR_DIAGNOSE_COMMAND\x10\x0f\x12\x1a\n\x16ORIGINATE_GOAL_COMMAND\x10\x10\x12\x15\n\x11\x45\x44IT_GOAL_COMMAND\x10\x11\x12\x17\n\x13\x44\x45LETE_GOAL_COMMAND\x10\x12\x12\x17\n\x13\x43OMMIT_GOAL_COMMAND\x10\x13\x12\x1f\n\x1b\x45NTER_IN_ERROR_GOAL_COMMAND\x10\x14\x12\x19\n\x15ORIGINATE_HPI_COMMAND\x10\x15\x12\x14\n\x10\x45\x44IT_HPI_COMMAND\x10\x16\x12\x16\n\x12\x44\x45LETE_HPI_COMMAND\x10\x17\x12\x16\n\x12\x43OMMIT_HPI_COMMAND\x10\x18\x12\x1e\n\x1a\x45NTER_IN_ERROR_HPI_COMMAND\x10\x19\x12*\n&ORIGINATE_MEDICATION_STATEMENT_COMMAND\x10\x1a\x12%\n!EDIT_MEDICATION_STATEMENT_COMMAND\x10\x1b\x12\'\n#DELETE_MEDICATION_STATEMENT_COMMAND\x10\x1c\x12\'\n#COMMIT_MEDICATION_STATEMENT_COMMAND\x10\x1d\x12/\n+ENTER_IN_ERROR_MEDICATION_STATEMENT_COMMAND\x10\x1e\x12\x1a\n\x16ORIGINATE_PLAN_COMMAND\x10\x1f\x12\x15\n\x11\x45\x44IT_PLAN_COMMAND\x10 \x12\x17\n\x13\x44\x45LETE_PLAN_COMMAND\x10!\x12\x17\n\x13\x43OMMIT_PLAN_COMMAND\x10\"\x12\x1f\n\x1b\x45NTER_IN_ERROR_PLAN_COMMAND\x10#\x12\x1f\n\x1bORIGINATE_PRESCRIBE_COMMAND\x10$\x12\x1a\n\x16\x45\x44IT_PRESCRIBE_COMMAND\x10%\x12\x1c\n\x18\x44\x45LETE_PRESCRIBE_COMMAND\x10&\x12\x1c\n\x18\x43OMMIT_PRESCRIBE_COMMAND\x10\'\x12$\n ENTER_IN_ERROR_PRESCRIBE_COMMAND\x10(\x12\x1b\n\x16SEND_PRESCRIBE_COMMAND\x10\x99\n\x12#\n\x1fORIGINATE_QUESTIONNAIRE_COMMAND\x10)\x12\x1e\n\x1a\x45\x44IT_QUESTIONNAIRE_COMMAND\x10*\x12 \n\x1c\x44\x45LETE_QUESTIONNAIRE_COMMAND\x10+\x12 \n\x1c\x43OMMIT_QUESTIONNAIRE_COMMAND\x10,\x12(\n$ENTER_IN_ERROR_QUESTIONNAIRE_COMMAND\x10-\x12&\n\"ORIGINATE_REASON_FOR_VISIT_COMMAND\x10.\x12!\n\x1d\x45\x44IT_REASON_FOR_VISIT_COMMAND\x10/\x12#\n\x1f\x44\x45LETE_REASON_FOR_VISIT_COMMAND\x10\x30\x12#\n\x1f\x43OMMIT_REASON_FOR_VISIT_COMMAND\x10\x31\x12+\n\'ENTER_IN_ERROR_REASON_FOR_VISIT_COMMAND\x10\x32\x12%\n!ORIGINATE_STOP_MEDICATION_COMMAND\x10\x33\x12 \n\x1c\x45\x44IT_STOP_MEDICATION_COMMAND\x10\x34\x12\"\n\x1e\x44\x45LETE_STOP_MEDICATION_COMMAND\x10\x35\x12\"\n\x1e\x43OMMIT_STOP_MEDICATION_COMMAND\x10\x36\x12*\n&ENTER_IN_ERROR_STOP_MEDICATION_COMMAND\x10\x37\x12!\n\x1dORIGINATE_UPDATE_GOAL_COMMAND\x10\x38\x12\x1c\n\x18\x45\x44IT_UPDATE_GOAL_COMMAND\x10\x39\x12\x1e\n\x1a\x44\x45LETE_UPDATE_GOAL_COMMAND\x10:\x12\x1e\n\x1a\x43OMMIT_UPDATE_GOAL_COMMAND\x10;\x12&\n\"ENTER_IN_ERROR_UPDATE_GOAL_COMMAND\x10<\x12\x1d\n\x19ORIGINATE_PERFORM_COMMAND\x10=\x12\x18\n\x14\x45\x44IT_PERFORM_COMMAND\x10>\x12\x1a\n\x16\x44\x45LETE_PERFORM_COMMAND\x10?\x12\x1a\n\x16\x43OMMIT_PERFORM_COMMAND\x10@\x12\"\n\x1e\x45NTER_IN_ERROR_PERFORM_COMMAND\x10\x41\x12\x1e\n\x1aORIGINATE_INSTRUCT_COMMAND\x10\x42\x12\x19\n\x15\x45\x44IT_INSTRUCT_COMMAND\x10\x43\x12\x1b\n\x17\x44\x45LETE_INSTRUCT_COMMAND\x10\x44\x12\x1b\n\x17\x43OMMIT_INSTRUCT_COMMAND\x10\x45\x12#\n\x1f\x45NTER_IN_ERROR_INSTRUCT_COMMAND\x10\x46\x12\x1f\n\x1bORIGINATE_LAB_ORDER_COMMAND\x10G\x12\x1a\n\x16\x45\x44IT_LAB_ORDER_COMMAND\x10H\x12\x1c\n\x18\x44\x45LETE_LAB_ORDER_COMMAND\x10I\x12\x1c\n\x18\x43OMMIT_LAB_ORDER_COMMAND\x10J\x12$\n ENTER_IN_ERROR_LAB_ORDER_COMMAND\x10K\x12\x1b\n\x16SEND_LAB_ORDER_COMMAND\x10\x9a\n\x12$\n ORIGINATE_FAMILY_HISTORY_COMMAND\x10L\x12\x1f\n\x1b\x45\x44IT_FAMILY_HISTORY_COMMAND\x10M\x12!\n\x1d\x44\x45LETE_FAMILY_HISTORY_COMMAND\x10N\x12!\n\x1d\x43OMMIT_FAMILY_HISTORY_COMMAND\x10O\x12)\n%ENTER_IN_ERROR_FAMILY_HISTORY_COMMAND\x10P\x12\x1d\n\x19ORIGINATE_ALLERGY_COMMAND\x10Q\x12\x18\n\x14\x45\x44IT_ALLERGY_COMMAND\x10R\x12\x1a\n\x16\x44\x45LETE_ALLERGY_COMMAND\x10S\x12\x1a\n\x16\x43OMMIT_ALLERGY_COMMAND\x10T\x12\"\n\x1e\x45NTER_IN_ERROR_ALLERGY_COMMAND\x10U\x12$\n ORIGINATE_REMOVE_ALLERGY_COMMAND\x10V\x12\x1f\n\x1b\x45\x44IT_REMOVE_ALLERGY_COMMAND\x10W\x12!\n\x1d\x44\x45LETE_REMOVE_ALLERGY_COMMAND\x10X\x12!\n\x1d\x43OMMIT_REMOVE_ALLERGY_COMMAND\x10Y\x12)\n%ENTER_IN_ERROR_REMOVE_ALLERGY_COMMAND\x10Z\x12&\n\"ORIGINATE_SURGICAL_HISTORY_COMMAND\x10[\x12!\n\x1d\x45\x44IT_SURGICAL_HISTORY_COMMAND\x10\\\x12#\n\x1f\x44\x45LETE_SURGICAL_HISTORY_COMMAND\x10]\x12#\n\x1f\x43OMMIT_SURGICAL_HISTORY_COMMAND\x10^\x12+\n\'ENTER_IN_ERROR_SURGICAL_HISTORY_COMMAND\x10_\x12\x0f\n\x0b\x43REATE_TASK\x10\x64\x12\x0f\n\x0bUPDATE_TASK\x10\x65\x12\x17\n\x13\x43REATE_TASK_COMMENT\x10\x66\x12%\n!ORIGINATE_MEDICAL_HISTORY_COMMAND\x10g\x12 \n\x1c\x45\x44IT_MEDICAL_HISTORY_COMMAND\x10h\x12\"\n\x1e\x44\x45LETE_MEDICAL_HISTORY_COMMAND\x10i\x12\"\n\x1e\x43OMMIT_MEDICAL_HISTORY_COMMAND\x10j\x12*\n&ENTER_IN_ERROR_MEDICAL_HISTORY_COMMAND\x10k\x12\x1f\n\x1b\x41\x44\x44_OR_UPDATE_PROTOCOL_CARD\x10n\x12\x1b\n\x16ORIGINATE_TASK_COMMAND\x10\x85\x01\x12\x16\n\x11\x45\x44IT_TASK_COMMAND\x10\x86\x01\x12\x18\n\x13\x44\x45LETE_TASK_COMMAND\x10\x87\x01\x12\x18\n\x13\x43OMMIT_TASK_COMMAND\x10\x88\x01\x12 \n\x1b\x45NTER_IN_ERROR_TASK_COMMAND\x10\x89\x01\x12\x1c\n\x18ORIGINATE_REFILL_COMMAND\x10q\x12\x17\n\x13\x45\x44IT_REFILL_COMMAND\x10r\x12\x19\n\x15\x44\x45LETE_REFILL_COMMAND\x10s\x12\x19\n\x15\x43OMMIT_REFILL_COMMAND\x10t\x12!\n\x1d\x45NTER_IN_ERROR_REFILL_COMMAND\x10u\x12\x18\n\x13SEND_REFILL_COMMAND\x10\x9c\n\x12\x1c\n\x18ORIGINATE_VITALS_COMMAND\x10v\x12\x17\n\x13\x45\x44IT_VITALS_COMMAND\x10w\x12\x19\n\x15\x44\x45LETE_VITALS_COMMAND\x10x\x12\x19\n\x15\x43OMMIT_VITALS_COMMAND\x10y\x12!\n\x1d\x45NTER_IN_ERROR_VITALS_COMMAND\x10z\x12&\n\"ORIGINATE_UPDATE_DIAGNOSIS_COMMAND\x10{\x12!\n\x1d\x45\x44IT_UPDATE_DIAGNOSIS_COMMAND\x10|\x12#\n\x1f\x44\x45LETE_UPDATE_DIAGNOSIS_COMMAND\x10}\x12#\n\x1f\x43OMMIT_UPDATE_DIAGNOSIS_COMMAND\x10~\x12+\n\'ENTER_IN_ERROR_UPDATE_DIAGNOSIS_COMMAND\x10\x7f\x12!\n\x1cORIGINATE_CLOSE_GOAL_COMMAND\x10\x80\x01\x12\x1c\n\x17\x45\x44IT_CLOSE_GOAL_COMMAND\x10\x81\x01\x12\x1e\n\x19\x44\x45LETE_CLOSE_GOAL_COMMAND\x10\x82\x01\x12\x1e\n\x19\x43OMMIT_CLOSE_GOAL_COMMAND\x10\x83\x01\x12&\n!ENTER_IN_ERROR_CLOSE_GOAL_COMMAND\x10\x84\x01\x12\x1c\n\x17ORIGINATE_REFER_COMMAND\x10\x8b\x01\x12\x17\n\x12\x45\x44IT_REFER_COMMAND\x10\x8c\x01\x12\x19\n\x14\x44\x45LETE_REFER_COMMAND\x10\x8d\x01\x12\x19\n\x14\x43OMMIT_REFER_COMMAND\x10\x8e\x01\x12!\n\x1c\x45NTER_IN_ERROR_REFER_COMMAND\x10\x8f\x01\x12(\n#ORIGINATE_CHANGE_MEDICATION_COMMAND\x10\x96\x01\x12#\n\x1e\x45\x44IT_CHANGE_MEDICATION_COMMAND\x10\x97\x01\x12%\n DELETE_CHANGE_MEDICATION_COMMAND\x10\x98\x01\x12%\n COMMIT_CHANGE_MEDICATION_COMMAND\x10\x99\x01\x12-\n(ENTER_IN_ERROR_CHANGE_MEDICATION_COMMAND\x10\x9a\x01\x12 \n\x1b\x43REATE_QUESTIONNAIRE_RESULT\x10\x8a\x01\x12-\n(ANNOTATE_PATIENT_CHART_CONDITION_RESULTS\x10\xc8\x01\x12%\n ANNOTATE_CLAIM_CONDITION_RESULTS\x10\xac\x02\x12(\n#SHOW_PATIENT_CHART_SUMMARY_SECTIONS\x10\x90\x03\x12\"\n\x1dSHOW_PATIENT_PROFILE_SECTIONS\x10\xf4\x03\x12\x37\n2PATIENT_PROFILE__ADD_PHARMACY__POST_SEARCH_RESULTS\x10\xf5\x03\x12)\n$SEND_SURESCRIPTS_ELIGIBILITY_REQUEST\x10\xd8\x04\x12\x30\n+SEND_SURESCRIPTS_MEDICATION_HISTORY_REQUEST\x10\xd9\x04\x12&\n!SEND_SURESCRIPTS_BENEFITS_REQUEST\x10\xda\x04\x12\x1b\n\x16ORIGINATE_EXAM_COMMAND\x10\xbc\x05\x12\x16\n\x11\x45\x44IT_EXAM_COMMAND\x10\xbd\x05\x12\x18\n\x13\x44\x45LETE_EXAM_COMMAND\x10\xbe\x05\x12\x18\n\x13\x43OMMIT_EXAM_COMMAND\x10\xbf\x05\x12 \n\x1b\x45NTER_IN_ERROR_EXAM_COMMAND\x10\xc0\x05\x12\x1a\n\x15ORIGINATE_ROS_COMMAND\x10\xa0\x06\x12\x15\n\x10\x45\x44IT_ROS_COMMAND\x10\xa1\x06\x12\x17\n\x12\x44\x45LETE_ROS_COMMAND\x10\xa2\x06\x12\x17\n\x12\x43OMMIT_ROS_COMMAND\x10\xa3\x06\x12\x1f\n\x1a\x45NTER_IN_ERROR_ROS_COMMAND\x10\xa4\x06\x12,\n\'ORIGINATE_STRUCTURED_ASSESSMENT_COMMAND\x10\x84\x07\x12\'\n\"EDIT_STRUCTURED_ASSESSMENT_COMMAND\x10\x85\x07\x12)\n$DELETE_STRUCTURED_ASSESSMENT_COMMAND\x10\x86\x07\x12)\n$COMMIT_STRUCTURED_ASSESSMENT_COMMAND\x10\x87\x07\x12\x31\n,ENTER_IN_ERROR_STRUCTURED_ASSESSMENT_COMMAND\x10\x88\x07\x12 \n\x1bORIGINATE_FOLLOW_UP_COMMAND\x10\x89\x07\x12\x1b\n\x16\x45\x44IT_FOLLOW_UP_COMMAND\x10\x8a\x07\x12\x1d\n\x18\x44\x45LETE_FOLLOW_UP_COMMAND\x10\x8b\x07\x12\x1d\n\x18\x43OMMIT_FOLLOW_UP_COMMAND\x10\x8c\x07\x12%\n ENTER_IN_ERROR_FOLLOW_UP_COMMAND\x10\x8d\x07\x12$\n\x1fORIGINATE_IMAGING_ORDER_COMMAND\x10\xcc\x08\x12\x1f\n\x1a\x45\x44IT_IMAGING_ORDER_COMMAND\x10\xcd\x08\x12!\n\x1c\x44\x45LETE_IMAGING_ORDER_COMMAND\x10\xce\x08\x12!\n\x1c\x43OMMIT_IMAGING_ORDER_COMMAND\x10\xcf\x08\x12)\n$ENTER_IN_ERROR_IMAGING_ORDER_COMMAND\x10\xd0\x08\x12(\n#ORIGINATE_RESOLVE_CONDITION_COMMAND\x10\xb0\t\x12#\n\x1e\x45\x44IT_RESOLVE_CONDITION_COMMAND\x10\xb1\t\x12%\n DELETE_RESOLVE_CONDITION_COMMAND\x10\xb2\t\x12%\n COMMIT_RESOLVE_CONDITION_COMMAND\x10\xb3\t\x12-\n(ENTER_IN_ERROR_RESOLVE_CONDITION_COMMAND\x10\xb4\t\x12*\n%ORIGINATE_ADJUST_PRESCRIPTION_COMMAND\x10\x94\n\x12%\n EDIT_ADJUST_PRESCRIPTION_COMMAND\x10\x95\n\x12\'\n\"DELETE_ADJUST_PRESCRIPTION_COMMAND\x10\x96\n\x12\'\n\"COMMIT_ADJUST_PRESCRIPTION_COMMAND\x10\x97\n\x12/\n*ENTER_IN_ERROR_ADJUST_PRESCRIPTION_COMMAND\x10\x98\n\x12%\n SEND_ADJUST_PRESCRIPTION_COMMAND\x10\x9b\n\x12+\n&ORIGINATE_CHART_SECTION_REVIEW_COMMAND\x10\xf8\n\x12-\n(ORIGINATE_IMMUNIZATION_STATEMENT_COMMAND\x10\xdc\x0b\x12(\n#EDIT_IMMUNIZATION_STATEMENT_COMMAND\x10\xdd\x0b\x12*\n%DELETE_IMMUNIZATION_STATEMENT_COMMAND\x10\xde\x0b\x12*\n%COMMIT_IMMUNIZATION_STATEMENT_COMMAND\x10\xdf\x0b\x12\x32\n-ENTER_IN_ERROR_IMMUNIZATION_STATEMENT_COMMAND\x10\xe0\x0b\x12&\n!COMMAND_AVAILABLE_ACTIONS_RESULTS\x10\xc0\x0c\x12\x17\n\x12SHOW_ACTION_BUTTON\x10\xe8\x07\x12 \n\x1bPATIENT_PORTAL__FORM_RESULT\x10\xd0\x0f\x12.\n)PATIENT_PORTAL__APPOINTMENT_IS_CANCELABLE\x10\xd1\x0f\x12\x31\n,PATIENT_PORTAL__APPOINTMENT_IS_RESCHEDULABLE\x10\xd2\x0f\x12\x32\n-PATIENT_PORTAL__APPOINTMENT_SHOW_MEETING_LINK\x10\xd3\x0f\x12 \n\x1bPATIENT_PORTAL__SEND_INVITE\x10\xd4\x0f\x12=\n8PATIENT_PORTAL__APPOINTMENTS__SLOTS__POST_SEARCH_RESULTS\x10\xd5\x0f\x12M\nHPATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__PRE_SEARCH_RESULTS\x10\xd6\x0f\x12N\nIPATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__POST_SEARCH_RESULTS\x10\xd7\x0f\x12\x45\n@PATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__PRE_SEARCH_RESULTS\x10\xd8\x0f\x12\x46\nAPATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__POST_SEARCH_RESULTS\x10\xd9\x0f\x12\x45\n@PATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__PRE_SEARCH_RESULTS\x10\xda\x0f\x12\x46\nAPATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__POST_SEARCH_RESULTS\x10\xdb\x0f\x12.\n)PATIENT_PORTAL__APPLICATION_CONFIGURATION\x10\xdc\x0f\x12\x1a\n\x15\x41\x44\x44_BILLING_LINE_ITEM\x10\xee\x0f\x12\x1d\n\x18UPDATE_BILLING_LINE_ITEM\x10\xef\x0f\x12\x1d\n\x18REMOVE_BILLING_LINE_ITEM\x10\xf0\x0f\x12#\n\x1eSHOW_PATIENT_PORTAL_MENU_ITEMS\x10\xb4\x10\x12\x12\n\rPORTAL_WIDGET\x10\xb5\x10\x12\x11\n\x0cLAUNCH_MODAL\x10\xb8\x17\x12\x18\n\x13SIMPLE_API_RESPONSE\x10\xa0\x1f\x12 \n\x1bSIMPLE_API_WEBSOCKET_ACCEPT\x10\xa1\x1f\x12\x1e\n\x19SIMPLE_API_WEBSOCKET_DENY\x10\xa2\x1f\x12#\n\x1eSIMPLE_API_WEBSOCKET_BROADCAST\x10\xa3\x1f\x12\x10\n\x0bUPDATE_USER\x10\x88\'\x12\x10\n\x0b\x43REATE_NOTE\x10\xf0.\x12\x10\n\x0bUPDATE_NOTE\x10\xfd.\x12\x17\n\x12\x43REATE_APPOINTMENT\x10\xf1.\x12\x17\n\x12UPDATE_APPOINTMENT\x10\xfe.\x12\x17\n\x12\x43\x41NCEL_APPOINTMENT\x10\xff.\x12\x1a\n\x15\x43REATE_SCHEDULE_EVENT\x10\xf2.\x12\x1a\n\x15UPDATE_SCHEDULE_EVENT\x10\x80/\x12\x1a\n\x15\x44\x45LETE_SCHEDULE_EVENT\x10\x81/\x12\x13\n\x0e\x43REATE_PATIENT\x10\xf3.\x12\x13\n\x0e\x43REATE_MESSAGE\x10\xf4.\x12\x11\n\x0cSEND_MESSAGE\x10\xf5.\x12\x1c\n\x17\x43REATE_AND_SEND_MESSAGE\x10\xf6.\x12\x11\n\x0c\x45\x44IT_MESSAGE\x10\xf7.\x12/\n*PATIENT_METADATA__CREATE_ADDITIONAL_FIELDS\x10\xfa.\x12\x1c\n\x17UPSERT_PATIENT_METADATA\x10\xfb.\x12\'\n\"CREATE_PATIENT_EXTERNAL_IDENTIFIER\x10\xfc.\x12\x1f\n\x1a\x43REATE_COMPOUND_MEDICATION\x10\x84/\x12\x1f\n\x1aUPDATE_COMPOUND_MEDICATION\x10\x85/\x12\x1f\n\x1aPATIENT_CHART__GROUP_ITEMS\x10\x8e/\x12\x18\n\x13SHOW_PANEL_SECTIONS\x10\xd4/\x12\x15\n\x10REDIRECT_CONTEXT\x10\xb8\x30\x12)\n$REVENUE__PAYMENT_PROCESSOR__METADATA\x10\xd9\x36\x12%\n REVENUE__PAYMENT_PROCESSOR__FORM\x10\xda\x36\x12\x38\n3REVENUE__PAYMENT_PROCESSOR__CREDIT_CARD_TRANSACTION\x10\xdb\x36\x12/\n*REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD\x10\xdc\x36\x12=\n8REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__ADD_RESPONSE\x10\xdd\x36\x12@\n;REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__REMOVE_RESPONSE\x10\xde\x36\x62\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'canvas_generated/messages/effects.proto\x12\x06\x63\x61nvas\"y\n\x06\x45\x66\x66\x65\x63t\x12 \n\x04type\x18\x01 \x01(\x0e\x32\x12.canvas.EffectType\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x13\n\x0bplugin_name\x18\x03 \x01(\t\x12\x11\n\tclassname\x18\x04 \x01(\t\x12\x14\n\x0chandler_name\x18\x05 \x01(\t*\xf1\x43\n\nEffectType\x12\x12\n\x0eUNKNOWN_EFFECT\x10\x00\x12\x07\n\x03LOG\x10\x01\x12\x14\n\x10\x41\x44\x44_PLAN_COMMAND\x10\x02\x12\x1f\n\x1b\x41UTOCOMPLETE_SEARCH_RESULTS\x10\x03\x12\x14\n\x10\x41\x44\x44_BANNER_ALERT\x10\x04\x12\x17\n\x13REMOVE_BANNER_ALERT\x10\x05\x12\x1c\n\x18ORIGINATE_ASSESS_COMMAND\x10\x06\x12\x17\n\x13\x45\x44IT_ASSESS_COMMAND\x10\x07\x12\x19\n\x15\x44\x45LETE_ASSESS_COMMAND\x10\x08\x12\x19\n\x15\x43OMMIT_ASSESS_COMMAND\x10\t\x12!\n\x1d\x45NTER_IN_ERROR_ASSESS_COMMAND\x10\n\x12\x1e\n\x1aORIGINATE_DIAGNOSE_COMMAND\x10\x0b\x12\x19\n\x15\x45\x44IT_DIAGNOSE_COMMAND\x10\x0c\x12\x1b\n\x17\x44\x45LETE_DIAGNOSE_COMMAND\x10\r\x12\x1b\n\x17\x43OMMIT_DIAGNOSE_COMMAND\x10\x0e\x12#\n\x1f\x45NTER_IN_ERROR_DIAGNOSE_COMMAND\x10\x0f\x12\x1a\n\x16ORIGINATE_GOAL_COMMAND\x10\x10\x12\x15\n\x11\x45\x44IT_GOAL_COMMAND\x10\x11\x12\x17\n\x13\x44\x45LETE_GOAL_COMMAND\x10\x12\x12\x17\n\x13\x43OMMIT_GOAL_COMMAND\x10\x13\x12\x1f\n\x1b\x45NTER_IN_ERROR_GOAL_COMMAND\x10\x14\x12\x19\n\x15ORIGINATE_HPI_COMMAND\x10\x15\x12\x14\n\x10\x45\x44IT_HPI_COMMAND\x10\x16\x12\x16\n\x12\x44\x45LETE_HPI_COMMAND\x10\x17\x12\x16\n\x12\x43OMMIT_HPI_COMMAND\x10\x18\x12\x1e\n\x1a\x45NTER_IN_ERROR_HPI_COMMAND\x10\x19\x12*\n&ORIGINATE_MEDICATION_STATEMENT_COMMAND\x10\x1a\x12%\n!EDIT_MEDICATION_STATEMENT_COMMAND\x10\x1b\x12\'\n#DELETE_MEDICATION_STATEMENT_COMMAND\x10\x1c\x12\'\n#COMMIT_MEDICATION_STATEMENT_COMMAND\x10\x1d\x12/\n+ENTER_IN_ERROR_MEDICATION_STATEMENT_COMMAND\x10\x1e\x12\x1a\n\x16ORIGINATE_PLAN_COMMAND\x10\x1f\x12\x15\n\x11\x45\x44IT_PLAN_COMMAND\x10 \x12\x17\n\x13\x44\x45LETE_PLAN_COMMAND\x10!\x12\x17\n\x13\x43OMMIT_PLAN_COMMAND\x10\"\x12\x1f\n\x1b\x45NTER_IN_ERROR_PLAN_COMMAND\x10#\x12\x1f\n\x1bORIGINATE_PRESCRIBE_COMMAND\x10$\x12\x1a\n\x16\x45\x44IT_PRESCRIBE_COMMAND\x10%\x12\x1c\n\x18\x44\x45LETE_PRESCRIBE_COMMAND\x10&\x12\x1c\n\x18\x43OMMIT_PRESCRIBE_COMMAND\x10\'\x12$\n ENTER_IN_ERROR_PRESCRIBE_COMMAND\x10(\x12\x1b\n\x16SEND_PRESCRIBE_COMMAND\x10\x99\n\x12#\n\x1fORIGINATE_QUESTIONNAIRE_COMMAND\x10)\x12\x1e\n\x1a\x45\x44IT_QUESTIONNAIRE_COMMAND\x10*\x12 \n\x1c\x44\x45LETE_QUESTIONNAIRE_COMMAND\x10+\x12 \n\x1c\x43OMMIT_QUESTIONNAIRE_COMMAND\x10,\x12(\n$ENTER_IN_ERROR_QUESTIONNAIRE_COMMAND\x10-\x12&\n\"ORIGINATE_REASON_FOR_VISIT_COMMAND\x10.\x12!\n\x1d\x45\x44IT_REASON_FOR_VISIT_COMMAND\x10/\x12#\n\x1f\x44\x45LETE_REASON_FOR_VISIT_COMMAND\x10\x30\x12#\n\x1f\x43OMMIT_REASON_FOR_VISIT_COMMAND\x10\x31\x12+\n\'ENTER_IN_ERROR_REASON_FOR_VISIT_COMMAND\x10\x32\x12%\n!ORIGINATE_STOP_MEDICATION_COMMAND\x10\x33\x12 \n\x1c\x45\x44IT_STOP_MEDICATION_COMMAND\x10\x34\x12\"\n\x1e\x44\x45LETE_STOP_MEDICATION_COMMAND\x10\x35\x12\"\n\x1e\x43OMMIT_STOP_MEDICATION_COMMAND\x10\x36\x12*\n&ENTER_IN_ERROR_STOP_MEDICATION_COMMAND\x10\x37\x12!\n\x1dORIGINATE_UPDATE_GOAL_COMMAND\x10\x38\x12\x1c\n\x18\x45\x44IT_UPDATE_GOAL_COMMAND\x10\x39\x12\x1e\n\x1a\x44\x45LETE_UPDATE_GOAL_COMMAND\x10:\x12\x1e\n\x1a\x43OMMIT_UPDATE_GOAL_COMMAND\x10;\x12&\n\"ENTER_IN_ERROR_UPDATE_GOAL_COMMAND\x10<\x12\x1d\n\x19ORIGINATE_PERFORM_COMMAND\x10=\x12\x18\n\x14\x45\x44IT_PERFORM_COMMAND\x10>\x12\x1a\n\x16\x44\x45LETE_PERFORM_COMMAND\x10?\x12\x1a\n\x16\x43OMMIT_PERFORM_COMMAND\x10@\x12\"\n\x1e\x45NTER_IN_ERROR_PERFORM_COMMAND\x10\x41\x12\x1e\n\x1aORIGINATE_INSTRUCT_COMMAND\x10\x42\x12\x19\n\x15\x45\x44IT_INSTRUCT_COMMAND\x10\x43\x12\x1b\n\x17\x44\x45LETE_INSTRUCT_COMMAND\x10\x44\x12\x1b\n\x17\x43OMMIT_INSTRUCT_COMMAND\x10\x45\x12#\n\x1f\x45NTER_IN_ERROR_INSTRUCT_COMMAND\x10\x46\x12\x1f\n\x1bORIGINATE_LAB_ORDER_COMMAND\x10G\x12\x1a\n\x16\x45\x44IT_LAB_ORDER_COMMAND\x10H\x12\x1c\n\x18\x44\x45LETE_LAB_ORDER_COMMAND\x10I\x12\x1c\n\x18\x43OMMIT_LAB_ORDER_COMMAND\x10J\x12$\n ENTER_IN_ERROR_LAB_ORDER_COMMAND\x10K\x12\x1b\n\x16SEND_LAB_ORDER_COMMAND\x10\x9a\n\x12$\n ORIGINATE_FAMILY_HISTORY_COMMAND\x10L\x12\x1f\n\x1b\x45\x44IT_FAMILY_HISTORY_COMMAND\x10M\x12!\n\x1d\x44\x45LETE_FAMILY_HISTORY_COMMAND\x10N\x12!\n\x1d\x43OMMIT_FAMILY_HISTORY_COMMAND\x10O\x12)\n%ENTER_IN_ERROR_FAMILY_HISTORY_COMMAND\x10P\x12\x1d\n\x19ORIGINATE_ALLERGY_COMMAND\x10Q\x12\x18\n\x14\x45\x44IT_ALLERGY_COMMAND\x10R\x12\x1a\n\x16\x44\x45LETE_ALLERGY_COMMAND\x10S\x12\x1a\n\x16\x43OMMIT_ALLERGY_COMMAND\x10T\x12\"\n\x1e\x45NTER_IN_ERROR_ALLERGY_COMMAND\x10U\x12$\n ORIGINATE_REMOVE_ALLERGY_COMMAND\x10V\x12\x1f\n\x1b\x45\x44IT_REMOVE_ALLERGY_COMMAND\x10W\x12!\n\x1d\x44\x45LETE_REMOVE_ALLERGY_COMMAND\x10X\x12!\n\x1d\x43OMMIT_REMOVE_ALLERGY_COMMAND\x10Y\x12)\n%ENTER_IN_ERROR_REMOVE_ALLERGY_COMMAND\x10Z\x12&\n\"ORIGINATE_SURGICAL_HISTORY_COMMAND\x10[\x12!\n\x1d\x45\x44IT_SURGICAL_HISTORY_COMMAND\x10\\\x12#\n\x1f\x44\x45LETE_SURGICAL_HISTORY_COMMAND\x10]\x12#\n\x1f\x43OMMIT_SURGICAL_HISTORY_COMMAND\x10^\x12+\n\'ENTER_IN_ERROR_SURGICAL_HISTORY_COMMAND\x10_\x12\x0f\n\x0b\x43REATE_TASK\x10\x64\x12\x0f\n\x0bUPDATE_TASK\x10\x65\x12\x17\n\x13\x43REATE_TASK_COMMENT\x10\x66\x12%\n!ORIGINATE_MEDICAL_HISTORY_COMMAND\x10g\x12 \n\x1c\x45\x44IT_MEDICAL_HISTORY_COMMAND\x10h\x12\"\n\x1e\x44\x45LETE_MEDICAL_HISTORY_COMMAND\x10i\x12\"\n\x1e\x43OMMIT_MEDICAL_HISTORY_COMMAND\x10j\x12*\n&ENTER_IN_ERROR_MEDICAL_HISTORY_COMMAND\x10k\x12\x1f\n\x1b\x41\x44\x44_OR_UPDATE_PROTOCOL_CARD\x10n\x12\x1b\n\x16ORIGINATE_TASK_COMMAND\x10\x85\x01\x12\x16\n\x11\x45\x44IT_TASK_COMMAND\x10\x86\x01\x12\x18\n\x13\x44\x45LETE_TASK_COMMAND\x10\x87\x01\x12\x18\n\x13\x43OMMIT_TASK_COMMAND\x10\x88\x01\x12 \n\x1b\x45NTER_IN_ERROR_TASK_COMMAND\x10\x89\x01\x12\x1c\n\x18ORIGINATE_REFILL_COMMAND\x10q\x12\x17\n\x13\x45\x44IT_REFILL_COMMAND\x10r\x12\x19\n\x15\x44\x45LETE_REFILL_COMMAND\x10s\x12\x19\n\x15\x43OMMIT_REFILL_COMMAND\x10t\x12!\n\x1d\x45NTER_IN_ERROR_REFILL_COMMAND\x10u\x12\x18\n\x13SEND_REFILL_COMMAND\x10\x9c\n\x12\x1c\n\x18ORIGINATE_VITALS_COMMAND\x10v\x12\x17\n\x13\x45\x44IT_VITALS_COMMAND\x10w\x12\x19\n\x15\x44\x45LETE_VITALS_COMMAND\x10x\x12\x19\n\x15\x43OMMIT_VITALS_COMMAND\x10y\x12!\n\x1d\x45NTER_IN_ERROR_VITALS_COMMAND\x10z\x12&\n\"ORIGINATE_UPDATE_DIAGNOSIS_COMMAND\x10{\x12!\n\x1d\x45\x44IT_UPDATE_DIAGNOSIS_COMMAND\x10|\x12#\n\x1f\x44\x45LETE_UPDATE_DIAGNOSIS_COMMAND\x10}\x12#\n\x1f\x43OMMIT_UPDATE_DIAGNOSIS_COMMAND\x10~\x12+\n\'ENTER_IN_ERROR_UPDATE_DIAGNOSIS_COMMAND\x10\x7f\x12!\n\x1cORIGINATE_CLOSE_GOAL_COMMAND\x10\x80\x01\x12\x1c\n\x17\x45\x44IT_CLOSE_GOAL_COMMAND\x10\x81\x01\x12\x1e\n\x19\x44\x45LETE_CLOSE_GOAL_COMMAND\x10\x82\x01\x12\x1e\n\x19\x43OMMIT_CLOSE_GOAL_COMMAND\x10\x83\x01\x12&\n!ENTER_IN_ERROR_CLOSE_GOAL_COMMAND\x10\x84\x01\x12\x1c\n\x17ORIGINATE_REFER_COMMAND\x10\x8b\x01\x12\x17\n\x12\x45\x44IT_REFER_COMMAND\x10\x8c\x01\x12\x19\n\x14\x44\x45LETE_REFER_COMMAND\x10\x8d\x01\x12\x19\n\x14\x43OMMIT_REFER_COMMAND\x10\x8e\x01\x12!\n\x1c\x45NTER_IN_ERROR_REFER_COMMAND\x10\x8f\x01\x12(\n#ORIGINATE_CHANGE_MEDICATION_COMMAND\x10\x96\x01\x12#\n\x1e\x45\x44IT_CHANGE_MEDICATION_COMMAND\x10\x97\x01\x12%\n DELETE_CHANGE_MEDICATION_COMMAND\x10\x98\x01\x12%\n COMMIT_CHANGE_MEDICATION_COMMAND\x10\x99\x01\x12-\n(ENTER_IN_ERROR_CHANGE_MEDICATION_COMMAND\x10\x9a\x01\x12 \n\x1b\x43REATE_QUESTIONNAIRE_RESULT\x10\x8a\x01\x12-\n(ANNOTATE_PATIENT_CHART_CONDITION_RESULTS\x10\xc8\x01\x12%\n ANNOTATE_CLAIM_CONDITION_RESULTS\x10\xac\x02\x12(\n#SHOW_PATIENT_CHART_SUMMARY_SECTIONS\x10\x90\x03\x12\"\n\x1dSHOW_PATIENT_PROFILE_SECTIONS\x10\xf4\x03\x12\x37\n2PATIENT_PROFILE__ADD_PHARMACY__POST_SEARCH_RESULTS\x10\xf5\x03\x12)\n$SEND_SURESCRIPTS_ELIGIBILITY_REQUEST\x10\xd8\x04\x12\x30\n+SEND_SURESCRIPTS_MEDICATION_HISTORY_REQUEST\x10\xd9\x04\x12&\n!SEND_SURESCRIPTS_BENEFITS_REQUEST\x10\xda\x04\x12\x1b\n\x16ORIGINATE_EXAM_COMMAND\x10\xbc\x05\x12\x16\n\x11\x45\x44IT_EXAM_COMMAND\x10\xbd\x05\x12\x18\n\x13\x44\x45LETE_EXAM_COMMAND\x10\xbe\x05\x12\x18\n\x13\x43OMMIT_EXAM_COMMAND\x10\xbf\x05\x12 \n\x1b\x45NTER_IN_ERROR_EXAM_COMMAND\x10\xc0\x05\x12\x1a\n\x15ORIGINATE_ROS_COMMAND\x10\xa0\x06\x12\x15\n\x10\x45\x44IT_ROS_COMMAND\x10\xa1\x06\x12\x17\n\x12\x44\x45LETE_ROS_COMMAND\x10\xa2\x06\x12\x17\n\x12\x43OMMIT_ROS_COMMAND\x10\xa3\x06\x12\x1f\n\x1a\x45NTER_IN_ERROR_ROS_COMMAND\x10\xa4\x06\x12,\n\'ORIGINATE_STRUCTURED_ASSESSMENT_COMMAND\x10\x84\x07\x12\'\n\"EDIT_STRUCTURED_ASSESSMENT_COMMAND\x10\x85\x07\x12)\n$DELETE_STRUCTURED_ASSESSMENT_COMMAND\x10\x86\x07\x12)\n$COMMIT_STRUCTURED_ASSESSMENT_COMMAND\x10\x87\x07\x12\x31\n,ENTER_IN_ERROR_STRUCTURED_ASSESSMENT_COMMAND\x10\x88\x07\x12 \n\x1bORIGINATE_FOLLOW_UP_COMMAND\x10\x89\x07\x12\x1b\n\x16\x45\x44IT_FOLLOW_UP_COMMAND\x10\x8a\x07\x12\x1d\n\x18\x44\x45LETE_FOLLOW_UP_COMMAND\x10\x8b\x07\x12\x1d\n\x18\x43OMMIT_FOLLOW_UP_COMMAND\x10\x8c\x07\x12%\n ENTER_IN_ERROR_FOLLOW_UP_COMMAND\x10\x8d\x07\x12$\n\x1fORIGINATE_IMAGING_ORDER_COMMAND\x10\xcc\x08\x12\x1f\n\x1a\x45\x44IT_IMAGING_ORDER_COMMAND\x10\xcd\x08\x12!\n\x1c\x44\x45LETE_IMAGING_ORDER_COMMAND\x10\xce\x08\x12!\n\x1c\x43OMMIT_IMAGING_ORDER_COMMAND\x10\xcf\x08\x12)\n$ENTER_IN_ERROR_IMAGING_ORDER_COMMAND\x10\xd0\x08\x12(\n#ORIGINATE_RESOLVE_CONDITION_COMMAND\x10\xb0\t\x12#\n\x1e\x45\x44IT_RESOLVE_CONDITION_COMMAND\x10\xb1\t\x12%\n DELETE_RESOLVE_CONDITION_COMMAND\x10\xb2\t\x12%\n COMMIT_RESOLVE_CONDITION_COMMAND\x10\xb3\t\x12-\n(ENTER_IN_ERROR_RESOLVE_CONDITION_COMMAND\x10\xb4\t\x12*\n%ORIGINATE_ADJUST_PRESCRIPTION_COMMAND\x10\x94\n\x12%\n EDIT_ADJUST_PRESCRIPTION_COMMAND\x10\x95\n\x12\'\n\"DELETE_ADJUST_PRESCRIPTION_COMMAND\x10\x96\n\x12\'\n\"COMMIT_ADJUST_PRESCRIPTION_COMMAND\x10\x97\n\x12/\n*ENTER_IN_ERROR_ADJUST_PRESCRIPTION_COMMAND\x10\x98\n\x12%\n SEND_ADJUST_PRESCRIPTION_COMMAND\x10\x9b\n\x12+\n&ORIGINATE_CHART_SECTION_REVIEW_COMMAND\x10\xf8\n\x12-\n(ORIGINATE_IMMUNIZATION_STATEMENT_COMMAND\x10\xdc\x0b\x12(\n#EDIT_IMMUNIZATION_STATEMENT_COMMAND\x10\xdd\x0b\x12*\n%DELETE_IMMUNIZATION_STATEMENT_COMMAND\x10\xde\x0b\x12*\n%COMMIT_IMMUNIZATION_STATEMENT_COMMAND\x10\xdf\x0b\x12\x32\n-ENTER_IN_ERROR_IMMUNIZATION_STATEMENT_COMMAND\x10\xe0\x0b\x12&\n!COMMAND_AVAILABLE_ACTIONS_RESULTS\x10\xc0\x0c\x12\x17\n\x12SHOW_ACTION_BUTTON\x10\xe8\x07\x12 \n\x1bPATIENT_PORTAL__FORM_RESULT\x10\xd0\x0f\x12.\n)PATIENT_PORTAL__APPOINTMENT_IS_CANCELABLE\x10\xd1\x0f\x12\x31\n,PATIENT_PORTAL__APPOINTMENT_IS_RESCHEDULABLE\x10\xd2\x0f\x12\x32\n-PATIENT_PORTAL__APPOINTMENT_SHOW_MEETING_LINK\x10\xd3\x0f\x12 \n\x1bPATIENT_PORTAL__SEND_INVITE\x10\xd4\x0f\x12=\n8PATIENT_PORTAL__APPOINTMENTS__SLOTS__POST_SEARCH_RESULTS\x10\xd5\x0f\x12M\nHPATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__PRE_SEARCH_RESULTS\x10\xd6\x0f\x12N\nIPATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__POST_SEARCH_RESULTS\x10\xd7\x0f\x12\x45\n@PATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__PRE_SEARCH_RESULTS\x10\xd8\x0f\x12\x46\nAPATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__POST_SEARCH_RESULTS\x10\xd9\x0f\x12\x45\n@PATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__PRE_SEARCH_RESULTS\x10\xda\x0f\x12\x46\nAPATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__POST_SEARCH_RESULTS\x10\xdb\x0f\x12.\n)PATIENT_PORTAL__APPLICATION_CONFIGURATION\x10\xdc\x0f\x12\x1a\n\x15\x41\x44\x44_BILLING_LINE_ITEM\x10\xee\x0f\x12\x1d\n\x18UPDATE_BILLING_LINE_ITEM\x10\xef\x0f\x12\x1d\n\x18REMOVE_BILLING_LINE_ITEM\x10\xf0\x0f\x12#\n\x1eSHOW_PATIENT_PORTAL_MENU_ITEMS\x10\xb4\x10\x12\x12\n\rPORTAL_WIDGET\x10\xb5\x10\x12\x11\n\x0cLAUNCH_MODAL\x10\xb8\x17\x12\x18\n\x13SIMPLE_API_RESPONSE\x10\xa0\x1f\x12 \n\x1bSIMPLE_API_WEBSOCKET_ACCEPT\x10\xa1\x1f\x12\x1e\n\x19SIMPLE_API_WEBSOCKET_DENY\x10\xa2\x1f\x12#\n\x1eSIMPLE_API_WEBSOCKET_BROADCAST\x10\xa3\x1f\x12\x10\n\x0bUPDATE_USER\x10\x88\'\x12\x10\n\x0b\x43REATE_NOTE\x10\xf0.\x12\x10\n\x0bUPDATE_NOTE\x10\xfd.\x12\x17\n\x12\x43REATE_APPOINTMENT\x10\xf1.\x12\x17\n\x12UPDATE_APPOINTMENT\x10\xfe.\x12\x17\n\x12\x43\x41NCEL_APPOINTMENT\x10\xff.\x12\x1a\n\x15\x43REATE_SCHEDULE_EVENT\x10\xf2.\x12\x1a\n\x15UPDATE_SCHEDULE_EVENT\x10\x80/\x12\x1a\n\x15\x44\x45LETE_SCHEDULE_EVENT\x10\x81/\x12\x13\n\x0e\x43REATE_PATIENT\x10\xf3.\x12\x13\n\x0eUPDATE_PATIENT\x10\xf8.\x12\x13\n\x0e\x43REATE_MESSAGE\x10\xf4.\x12\x11\n\x0cSEND_MESSAGE\x10\xf5.\x12\x1c\n\x17\x43REATE_AND_SEND_MESSAGE\x10\xf6.\x12\x11\n\x0c\x45\x44IT_MESSAGE\x10\xf7.\x12/\n*PATIENT_METADATA__CREATE_ADDITIONAL_FIELDS\x10\xfa.\x12\x1c\n\x17UPSERT_PATIENT_METADATA\x10\xfb.\x12\'\n\"CREATE_PATIENT_EXTERNAL_IDENTIFIER\x10\xfc.\x12(\n#CREATE_PATIENT_PREFERRED_PHARMACIES\x10\x82/\x12\x1f\n\x1a\x43REATE_COMPOUND_MEDICATION\x10\x84/\x12\x1f\n\x1aUPDATE_COMPOUND_MEDICATION\x10\x85/\x12\x1f\n\x1aPATIENT_CHART__GROUP_ITEMS\x10\x8e/\x12\x18\n\x13SHOW_PANEL_SECTIONS\x10\xd4/\x12\x15\n\x10REDIRECT_CONTEXT\x10\xb8\x30\x12)\n$REVENUE__PAYMENT_PROCESSOR__METADATA\x10\xd9\x36\x12%\n REVENUE__PAYMENT_PROCESSOR__FORM\x10\xda\x36\x12\x38\n3REVENUE__PAYMENT_PROCESSOR__CREDIT_CARD_TRANSACTION\x10\xdb\x36\x12/\n*REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD\x10\xdc\x36\x12=\n8REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__ADD_RESPONSE\x10\xdd\x36\x12@\n;REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__REMOVE_RESPONSE\x10\xde\x36\x62\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -22,7 +22,7 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'canvas_generated.messages.e
22
22
  if _descriptor._USE_C_DESCRIPTORS == False:
23
23
  DESCRIPTOR._options = None
24
24
  _globals['_EFFECTTYPE']._serialized_start=175
25
- _globals['_EFFECTTYPE']._serialized_end=8801
25
+ _globals['_EFFECTTYPE']._serialized_end=8864
26
26
  _globals['_EFFECT']._serialized_start=51
27
27
  _globals['_EFFECT']._serialized_end=172
28
28
  # @@protoc_insertion_point(module_scope)
@@ -236,6 +236,7 @@ class EffectType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
236
236
  UPDATE_SCHEDULE_EVENT: _ClassVar[EffectType]
237
237
  DELETE_SCHEDULE_EVENT: _ClassVar[EffectType]
238
238
  CREATE_PATIENT: _ClassVar[EffectType]
239
+ UPDATE_PATIENT: _ClassVar[EffectType]
239
240
  CREATE_MESSAGE: _ClassVar[EffectType]
240
241
  SEND_MESSAGE: _ClassVar[EffectType]
241
242
  CREATE_AND_SEND_MESSAGE: _ClassVar[EffectType]
@@ -243,6 +244,7 @@ class EffectType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
243
244
  PATIENT_METADATA__CREATE_ADDITIONAL_FIELDS: _ClassVar[EffectType]
244
245
  UPSERT_PATIENT_METADATA: _ClassVar[EffectType]
245
246
  CREATE_PATIENT_EXTERNAL_IDENTIFIER: _ClassVar[EffectType]
247
+ CREATE_PATIENT_PREFERRED_PHARMACIES: _ClassVar[EffectType]
246
248
  CREATE_COMPOUND_MEDICATION: _ClassVar[EffectType]
247
249
  UPDATE_COMPOUND_MEDICATION: _ClassVar[EffectType]
248
250
  PATIENT_CHART__GROUP_ITEMS: _ClassVar[EffectType]
@@ -483,6 +485,7 @@ CREATE_SCHEDULE_EVENT: EffectType
483
485
  UPDATE_SCHEDULE_EVENT: EffectType
484
486
  DELETE_SCHEDULE_EVENT: EffectType
485
487
  CREATE_PATIENT: EffectType
488
+ UPDATE_PATIENT: EffectType
486
489
  CREATE_MESSAGE: EffectType
487
490
  SEND_MESSAGE: EffectType
488
491
  CREATE_AND_SEND_MESSAGE: EffectType
@@ -490,6 +493,7 @@ EDIT_MESSAGE: EffectType
490
493
  PATIENT_METADATA__CREATE_ADDITIONAL_FIELDS: EffectType
491
494
  UPSERT_PATIENT_METADATA: EffectType
492
495
  CREATE_PATIENT_EXTERNAL_IDENTIFIER: EffectType
496
+ CREATE_PATIENT_PREFERRED_PHARMACIES: EffectType
493
497
  CREATE_COMPOUND_MEDICATION: EffectType
494
498
  UPDATE_COMPOUND_MEDICATION: EffectType
495
499
  PATIENT_CHART__GROUP_ITEMS: EffectType
@@ -1,11 +1,23 @@
1
- from canvas_sdk.effects.patient.base import Patient, PatientContactPoint, PatientExternalIdentifier
1
+ from canvas_sdk.effects.patient.base import (
2
+ Patient,
3
+ PatientAddress,
4
+ PatientContactPoint,
5
+ PatientExternalIdentifier,
6
+ PatientPreferredPharmacy,
7
+ )
2
8
  from canvas_sdk.effects.patient.create_patient_external_identifier import (
3
9
  CreatePatientExternalIdentifier,
4
10
  )
11
+ from canvas_sdk.effects.patient.create_patient_preferred_pharmacies import (
12
+ CreatePatientPreferredPharmacies,
13
+ )
5
14
 
6
15
  __all__ = __exports__ = (
7
16
  "Patient",
17
+ "PatientAddress",
8
18
  "PatientContactPoint",
9
19
  "PatientExternalIdentifier",
20
+ "PatientPreferredPharmacy",
10
21
  "CreatePatientExternalIdentifier",
22
+ "CreatePatientPreferredPharmacies",
11
23
  )
@@ -7,8 +7,15 @@ from pydantic_core import InitErrorDetails
7
7
 
8
8
  from canvas_generated.messages.effects_pb2 import Effect
9
9
  from canvas_sdk.base import TrackableFieldsModel
10
+ from canvas_sdk.v1.data import Patient as PatientModel
10
11
  from canvas_sdk.v1.data import PracticeLocation, Staff
11
- from canvas_sdk.v1.data.common import ContactPointSystem, ContactPointUse, PersonSex
12
+ from canvas_sdk.v1.data.common import (
13
+ AddressType,
14
+ AddressUse,
15
+ ContactPointSystem,
16
+ ContactPointUse,
17
+ PersonSex,
18
+ )
12
19
 
13
20
 
14
21
  @dataclass
@@ -47,14 +54,63 @@ class PatientExternalIdentifier:
47
54
  }
48
55
 
49
56
 
57
+ @dataclass
58
+ class PatientPreferredPharmacy:
59
+ """A class representing a preferred pharmacy."""
60
+
61
+ ncpdp_id: str
62
+ default: bool = False
63
+
64
+ def to_dict(self) -> dict[str, Any]:
65
+ """Convert the preferred pharmacy to a dictionary."""
66
+ return {
67
+ "ncpdp_id": self.ncpdp_id,
68
+ "default": self.default,
69
+ }
70
+
71
+
72
+ @dataclass
73
+ class PatientAddress:
74
+ """A class representing a patient address."""
75
+
76
+ line1: str
77
+ country: str
78
+ line2: str | None = None
79
+ use: AddressUse = AddressUse.HOME
80
+ type: AddressType = AddressType.BOTH
81
+ city: str | None = None
82
+ district: str | None = None
83
+ state_code: str | None = None
84
+ postal_code: str | None = None
85
+ longitude: float | None = None
86
+ latitude: float | None = None
87
+
88
+ def to_dict(self) -> dict[str, Any]:
89
+ """Convert the address to a dictionary."""
90
+ return {
91
+ "line1": self.line1,
92
+ "line2": self.line2,
93
+ "country": self.country,
94
+ "use": self.use.value,
95
+ "type": self.type.value,
96
+ "city": self.city,
97
+ "district": self.district,
98
+ "state_code": self.state_code,
99
+ "postal_code": self.postal_code,
100
+ "longitude": self.longitude,
101
+ "latitude": self.latitude,
102
+ }
103
+
104
+
50
105
  class Patient(TrackableFieldsModel):
51
106
  """Effect to create a Patient record."""
52
107
 
53
108
  class Meta:
54
109
  effect_type = "PATIENT"
55
110
 
56
- first_name: str
57
- last_name: str
111
+ patient_id: str | None = None
112
+ first_name: str | None = None
113
+ last_name: str | None = None
58
114
  middle_name: str | None = None
59
115
  birthdate: datetime.date | None = None
60
116
  prefix: str | None = None
@@ -69,36 +125,94 @@ class Patient(TrackableFieldsModel):
69
125
  previous_names: list[str] | None = None
70
126
  contact_points: list[PatientContactPoint] | None = None
71
127
  external_identifiers: list[PatientExternalIdentifier] | None = None
128
+ preferred_pharmacies: list[PatientPreferredPharmacy] | None = None
129
+ addresses: list[PatientAddress] | None = None
72
130
 
73
131
  @property
74
132
  def values(self) -> dict[str, Any]:
75
133
  """Return the values of the patient as a dictionary."""
76
- return {
77
- "first_name": self.first_name,
78
- "last_name": self.last_name,
79
- "middle_name": self.middle_name,
80
- "previous_names": self.previous_names or [],
81
- "birthdate": self.birthdate.isoformat() if self.birthdate else None,
82
- "prefix": self.prefix,
83
- "suffix": self.suffix,
84
- "sex_at_birth": self.sex_at_birth.value if self.sex_at_birth else None,
85
- "nickname": self.nickname,
86
- "social_security_number": self.social_security_number,
87
- "administrative_note": self.administrative_note,
88
- "clinical_note": self.clinical_note,
89
- "default_location": self.default_location_id,
90
- "default_provider": self.default_provider_id,
91
- "contact_points": [cp.to_dict() for cp in self.contact_points]
92
- if self.contact_points
93
- else None,
94
- "external_identifiers": [ids.to_dict() for ids in self.external_identifiers]
95
- if self.external_identifiers
96
- else None,
97
- }
134
+ values = super().values
135
+
136
+ if self.is_dirty("contact_points"):
137
+ values["contact_points"] = (
138
+ [cp.to_dict() for cp in self.contact_points]
139
+ if self.contact_points is not None
140
+ else None
141
+ )
142
+
143
+ if self.is_dirty("external_identifiers"):
144
+ values["external_identifiers"] = (
145
+ [ids.to_dict() for ids in self.external_identifiers]
146
+ if self.external_identifiers is not None
147
+ else None
148
+ )
149
+
150
+ if self.is_dirty("addresses"):
151
+ values["addresses"] = (
152
+ [addr.to_dict() for addr in self.addresses] if self.addresses is not None else None
153
+ )
154
+
155
+ if self.is_dirty("preferred_pharmacies"):
156
+ values["preferred_pharmacies"] = (
157
+ [pharmacy.to_dict() for pharmacy in self.preferred_pharmacies]
158
+ if self.preferred_pharmacies
159
+ else None
160
+ )
161
+
162
+ return values
98
163
 
99
164
  def _get_error_details(self, method: Any) -> list[InitErrorDetails]:
100
165
  errors = super()._get_error_details(method)
101
166
 
167
+ # Validate create-specific requirements
168
+ if method == "create":
169
+ if self.patient_id:
170
+ errors.append(
171
+ self._create_error_detail(
172
+ "value",
173
+ "Patient ID should not be set when creating a new patient.",
174
+ self.patient_id,
175
+ )
176
+ )
177
+
178
+ # first_name and last_name are required for create
179
+ if not self.first_name:
180
+ errors.append(
181
+ self._create_error_detail(
182
+ "value",
183
+ "First name is required when creating a new patient.",
184
+ self.first_name,
185
+ )
186
+ )
187
+
188
+ if not self.last_name:
189
+ errors.append(
190
+ self._create_error_detail(
191
+ "value",
192
+ "Last name is required when creating a new patient.",
193
+ self.last_name,
194
+ )
195
+ )
196
+
197
+ # Validate update-specific requirements
198
+ if method == "update":
199
+ if not self.patient_id:
200
+ errors.append(
201
+ self._create_error_detail(
202
+ "value",
203
+ "Patient ID must be set when updating an existing patient.",
204
+ self.patient_id,
205
+ )
206
+ )
207
+ elif not PatientModel.objects.filter(id=self.patient_id).exists():
208
+ errors.append(
209
+ self._create_error_detail(
210
+ "value",
211
+ f"Patient with ID {self.patient_id} does not exist.",
212
+ self.patient_id,
213
+ )
214
+ )
215
+
102
216
  if (
103
217
  self.default_location_id
104
218
  and not PracticeLocation.objects.filter(id=self.default_location_id).exists()
@@ -138,5 +252,24 @@ class Patient(TrackableFieldsModel):
138
252
  ),
139
253
  )
140
254
 
255
+ def update(self) -> Effect:
256
+ """Update an existing Patient."""
257
+ self._validate_before_effect("update")
258
+
259
+ return Effect(
260
+ type=f"UPDATE_{self.Meta.effect_type}",
261
+ payload=json.dumps(
262
+ {
263
+ "data": self.values,
264
+ }
265
+ ),
266
+ )
267
+
141
268
 
142
- __exports__ = ("Patient", "PatientContactPoint", "PatientExternalIdentifier")
269
+ __exports__ = (
270
+ "Patient",
271
+ "PatientAddress",
272
+ "PatientContactPoint",
273
+ "PatientExternalIdentifier",
274
+ "PatientPreferredPharmacy",
275
+ )
@@ -0,0 +1,70 @@
1
+ import json
2
+ from typing import Any
3
+ from uuid import UUID
4
+
5
+ from pydantic_core import InitErrorDetails
6
+
7
+ from canvas_generated.messages.effects_pb2 import Effect
8
+ from canvas_sdk.effects import _BaseEffect
9
+ from canvas_sdk.effects.patient import PatientPreferredPharmacy
10
+ from canvas_sdk.v1.data import Patient
11
+
12
+
13
+ class CreatePatientPreferredPharmacies(_BaseEffect):
14
+ """Effect to create a Patient External Identifier record."""
15
+
16
+ class Meta:
17
+ effect_type = "CREATE_PATIENT_PREFERRED_PHARMACIES"
18
+
19
+ pharmacies: list[PatientPreferredPharmacy]
20
+ patient_id: str | UUID
21
+
22
+ def _get_error_details(self, method: Any) -> list[InitErrorDetails]:
23
+ errors = super()._get_error_details(method)
24
+
25
+ if not Patient.objects.filter(id=self.patient_id).exists():
26
+ errors.append(
27
+ self._create_error_detail(
28
+ "value",
29
+ f"Patient with ID {self.patient_id} does not exist.",
30
+ self.patient_id,
31
+ )
32
+ )
33
+
34
+ default_count = sum(1 for pharmacy in self.pharmacies if pharmacy.default)
35
+ if default_count > 1:
36
+ errors.append(
37
+ self._create_error_detail(
38
+ "value",
39
+ "Only one preferred pharmacy can be set as default.",
40
+ None,
41
+ )
42
+ )
43
+
44
+ return errors
45
+
46
+ @property
47
+ def values(self) -> dict[str, Any]:
48
+ """Return the values of the preferred pharmacies."""
49
+ return {
50
+ "preferred_pharmacies": [
51
+ preferred_pharmacy.to_dict() for preferred_pharmacy in self.pharmacies
52
+ ],
53
+ "patient_id": str(self.patient_id),
54
+ }
55
+
56
+ def create(self) -> Effect:
57
+ """Create Patient Preferred Pharmacies."""
58
+ self._validate_before_effect("create")
59
+
60
+ return Effect(
61
+ type=self.Meta.effect_type,
62
+ payload=json.dumps(
63
+ {
64
+ "data": self.values,
65
+ }
66
+ ),
67
+ )
68
+
69
+
70
+ __exports__ = ("CreatePatientPreferredPharmacies",)
@@ -1,4 +1,13 @@
1
- from .patient import PatientAddressFactory, PatientFactory
1
+ from .facility import FacilityFactory
2
+ from .patient import PatientAddressFactory, PatientFacilityAddressFactory, PatientFactory
3
+ from .protocol_current import ProtocolCurrentFactory
2
4
  from .user import CanvasUserFactory
3
5
 
4
- __all__ = ("CanvasUserFactory", "PatientAddressFactory", "PatientFactory")
6
+ __all__ = (
7
+ "CanvasUserFactory",
8
+ "FacilityFactory",
9
+ "PatientAddressFactory",
10
+ "PatientFacilityAddressFactory",
11
+ "PatientFactory",
12
+ "ProtocolCurrentFactory",
13
+ )
@@ -0,0 +1,21 @@
1
+ import factory
2
+
3
+ from canvas_sdk.v1.data import Facility
4
+
5
+
6
+ class FacilityFactory(factory.django.DjangoModelFactory[Facility]):
7
+ """Factory for creating a Facility."""
8
+
9
+ class Meta:
10
+ model = Facility
11
+
12
+ name = factory.Faker("company")
13
+ npi_number = factory.Faker("numerify", text="##########") # 10 digit NPI number
14
+ phone_number = factory.Faker("numerify", text="##########") # 10 digit phone number
15
+ active = True
16
+ line1 = factory.Faker("street_address")
17
+ line2 = factory.Faker("secondary_address")
18
+ city = factory.Faker("city")
19
+ district = factory.Faker("city_suffix")
20
+ state_code = factory.Faker("state_abbr")
21
+ postal_code = factory.Faker("postcode")
@@ -3,8 +3,9 @@ import datetime
3
3
  import factory
4
4
  from factory.fuzzy import FuzzyDate
5
5
 
6
+ from canvas_sdk.test_utils.factories.facility import FacilityFactory
6
7
  from canvas_sdk.test_utils.factories.user import CanvasUserFactory
7
- from canvas_sdk.v1.data import Patient, PatientAddress
8
+ from canvas_sdk.v1.data import Patient, PatientAddress, PatientFacilityAddress
8
9
 
9
10
 
10
11
  class PatientAddressFactory(factory.django.DjangoModelFactory[PatientAddress]):
@@ -37,3 +38,14 @@ class PatientFactory(factory.django.DjangoModelFactory[Patient]):
37
38
  last_name = factory.Faker("last_name")
38
39
  addresses = factory.RelatedFactory(PatientAddressFactory, "patient")
39
40
  user = factory.SubFactory(CanvasUserFactory)
41
+
42
+
43
+ class PatientFacilityAddressFactory(factory.django.DjangoModelFactory[PatientFacilityAddress]):
44
+ """Factory for creating a PatientFacilityAddress."""
45
+
46
+ class Meta:
47
+ model = PatientFacilityAddress
48
+
49
+ facility = factory.SubFactory(FacilityFactory)
50
+ patient = factory.SubFactory(PatientFactory)
51
+ room_number = factory.Faker("building_number")
@@ -0,0 +1,44 @@
1
+ import datetime
2
+
3
+ import factory
4
+ from factory.fuzzy import FuzzyChoice, FuzzyDate, FuzzyInteger
5
+
6
+ from canvas_sdk.test_utils.factories.patient import PatientFactory
7
+ from canvas_sdk.v1.data import ProtocolCurrent
8
+ from canvas_sdk.v1.data.protocol_result import ProtocolResultStatus
9
+
10
+
11
+ class ProtocolCurrentFactory(factory.django.DjangoModelFactory[ProtocolCurrent]):
12
+ """Factory for creating a ProtocolCurrent."""
13
+
14
+ class Meta:
15
+ model = ProtocolCurrent
16
+
17
+ # Fields from ProtocolResult (abstract base class)
18
+ title = factory.Faker("sentence", nb_words=4)
19
+ narrative = factory.Faker("text", max_nb_chars=200)
20
+ types = factory.LazyFunction(lambda: ["screening", "preventive"])
21
+ protocol_key = factory.Faker("slug")
22
+ plugin_name = factory.Faker("slug")
23
+ status = FuzzyChoice(ProtocolResultStatus.choices, getter=lambda c: c[0])
24
+ due_in = FuzzyInteger(-30, 365) # Days until due (can be negative for overdue)
25
+ days_of_notice = FuzzyInteger(7, 60)
26
+ snoozed = factory.Faker("boolean", chance_of_getting_true=20)
27
+ sources = factory.LazyFunction(lambda: {"conditions": [], "medications": [], "labs": []})
28
+ recommendations = factory.LazyFunction(lambda: {"primary": "Schedule annual checkup"})
29
+ top_recommendation_key = factory.Faker("slug")
30
+ next_review = factory.Faker("date_time_between", start_date="+1d", end_date="+1y")
31
+ feedback_enabled = factory.Faker("boolean", chance_of_getting_true=30)
32
+ plugin_can_be_snoozed = factory.Faker("boolean", chance_of_getting_true=70)
33
+
34
+ # Fields specific to ProtocolCurrent
35
+ patient = factory.SubFactory(PatientFactory)
36
+ result_hash = factory.Faker("md5")
37
+ snooze_date = factory.Maybe(
38
+ "snoozed",
39
+ yes_declaration=FuzzyDate(
40
+ start_date=datetime.date.today(),
41
+ end_date=datetime.date.today() + datetime.timedelta(days=90),
42
+ ),
43
+ no_declaration=None,
44
+ )
@@ -15,6 +15,8 @@ from .coverage import Coverage, Transactor, TransactorAddress, TransactorPhone
15
15
  from .detected_issue import DetectedIssue, DetectedIssueEvidence
16
16
  from .device import Device
17
17
  from .discount import Discount
18
+ from .facility import Facility
19
+ from .goal import Goal
18
20
  from .imaging import ImagingOrder, ImagingReport, ImagingReview
19
21
  from .invoice import Invoice
20
22
  from .lab import (
@@ -50,6 +52,7 @@ from .patient import (
50
52
  PatientAddress,
51
53
  PatientContactPoint,
52
54
  PatientExternalIdentifier,
55
+ PatientFacilityAddress,
53
56
  PatientMetadata,
54
57
  PatientSetting,
55
58
  )
@@ -68,6 +71,7 @@ from .posting import (
68
71
  PatientPosting,
69
72
  )
70
73
  from .practicelocation import PracticeLocation, PracticeLocationSetting
74
+ from .protocol_current import ProtocolCurrent
71
75
  from .protocol_override import ProtocolOverride
72
76
  from .questionnaire import (
73
77
  Interview,
@@ -82,7 +86,7 @@ from .questionnaire import (
82
86
  from .reason_for_visit import ReasonForVisitSettingCoding
83
87
  from .referral import Referral, ReferralReport
84
88
  from .service_provider import ServiceProvider
85
- from .staff import Staff, StaffAddress, StaffContactPoint, StaffPhoto, StaffRole
89
+ from .staff import Staff, StaffAddress, StaffContactPoint, StaffLicense, StaffPhoto, StaffRole
86
90
  from .task import Task, TaskComment, TaskLabel, TaskTaskLabel
87
91
  from .team import Team, TeamContactPoint
88
92
  from .user import CanvasUser
@@ -120,6 +124,8 @@ __all__ = __exports__ = (
120
124
  "DetectedIssueEvidence",
121
125
  "Device",
122
126
  "Discount",
127
+ "Facility",
128
+ "Goal",
123
129
  "ImagingOrder",
124
130
  "ImagingReport",
125
131
  "ImagingReview",
@@ -159,6 +165,7 @@ __all__ = __exports__ = (
159
165
  "PatientAddress",
160
166
  "PatientContactPoint",
161
167
  "PatientExternalIdentifier",
168
+ "PatientFacilityAddress",
162
169
  "PatientPosting",
163
170
  "PatientSetting",
164
171
  "PatientMetadata",
@@ -169,6 +176,7 @@ __all__ = __exports__ = (
169
176
  "PaymentCollection",
170
177
  "PracticeLocation",
171
178
  "PracticeLocationSetting",
179
+ "ProtocolCurrent",
172
180
  "ProtocolOverride",
173
181
  "Question",
174
182
  "Questionnaire",
@@ -181,6 +189,7 @@ __all__ = __exports__ = (
181
189
  "ServiceProvider",
182
190
  "Staff",
183
191
  "StaffAddress",
192
+ "StaffLicense",
184
193
  "StaffPhoto",
185
194
  "StaffRole",
186
195
  "StaffContactPoint",
@@ -0,0 +1,27 @@
1
+ from django.db import models
2
+
3
+ from canvas_sdk.v1.data.base import IdentifiableModel
4
+
5
+
6
+ class Facility(IdentifiableModel):
7
+ """Facility model representing a healthcare facility."""
8
+
9
+ class Meta:
10
+ db_table = "canvas_sdk_data_api_facility_001"
11
+
12
+ name = models.CharField(max_length=255)
13
+ npi_number = models.CharField(verbose_name="NPI number", max_length=10, blank=True)
14
+ phone_number = models.CharField(max_length=10, blank=True, default="")
15
+ active = models.BooleanField(default=True)
16
+ line1 = models.CharField(max_length=255, default="", blank=True)
17
+ line2 = models.CharField(max_length=255, default="", blank=True)
18
+ city = models.CharField(max_length=255)
19
+ district = models.CharField(max_length=255, blank=True, default="")
20
+ state_code = models.CharField(max_length=2)
21
+ postal_code = models.CharField(max_length=255)
22
+
23
+ def __str__(self) -> str:
24
+ return self.name
25
+
26
+
27
+ __exports__ = ("Facility",)
@@ -0,0 +1,70 @@
1
+ from django.db import models
2
+
3
+ from canvas_sdk.v1.data.base import IdentifiableModel
4
+
5
+
6
+ class GoalLifecycleStatus(models.TextChoices):
7
+ """GoalLifecycleStatus choices."""
8
+
9
+ PROPOSED = "proposed", "Proposed"
10
+ PLANNED = "planned", "Planned"
11
+ ACCEPTED = "accepted", "Accepted"
12
+ ACTIVE = "active", "Active"
13
+ ON_HOLD = "on-hold", "On Hold"
14
+ COMPLETED = "completed", "Completed"
15
+ CANCELLED = "cancelled", "Cancelled"
16
+ REJECTED = "rejected", "Rejected"
17
+
18
+
19
+ class GoalAchievementStatus(models.TextChoices):
20
+ """GoalAchievementStatus choices."""
21
+
22
+ IN_PROGRESS = "in-progress", "In Progress"
23
+ IMPROVING = "improving", "Improving"
24
+ WORSENING = "worsening", "Worsening"
25
+ NO_CHANGE = "no-change", "No Change"
26
+ ACHIEVED = "achieved", "Achieved"
27
+ SUSTAINING = "sustaining", "Sustaining"
28
+ NOT_ACHIEVED = "not-achieved", "Not Achieved"
29
+ NO_PROGRESS = "no-progress", "No Progress"
30
+ NOT_ATTAINABLE = "not-attainable", "Not Attainable"
31
+
32
+
33
+ class GoalPriority(models.TextChoices):
34
+ """GoalPriority choices."""
35
+
36
+ HIGH = "high-priority", "High Priority"
37
+ MEDIUM = "medium-priority", "Medium Priority"
38
+ LOW = "low-priority", "Low Priority"
39
+
40
+
41
+ class Goal(IdentifiableModel):
42
+ """Goal."""
43
+
44
+ class Meta:
45
+ db_table = "canvas_sdk_data_api_goal_001"
46
+
47
+ created = models.DateTimeField(auto_now_add=True)
48
+ modified = models.DateTimeField(auto_now=True)
49
+ originator = models.ForeignKey(
50
+ "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
51
+ )
52
+ committer = models.ForeignKey(
53
+ "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
54
+ )
55
+ entered_in_error = models.ForeignKey(
56
+ "v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
57
+ )
58
+
59
+ patient = models.ForeignKey("v1.Patient", on_delete=models.DO_NOTHING, related_name="goals")
60
+ note = models.ForeignKey("v1.Note", on_delete=models.DO_NOTHING, related_name="goals")
61
+ lifecycle_status = models.CharField(max_length=20, choices=GoalLifecycleStatus.choices)
62
+ achievement_status = models.CharField(max_length=20, choices=GoalAchievementStatus.choices)
63
+ priority = models.CharField(max_length=20, choices=GoalPriority.choices)
64
+ due_date = models.DateField()
65
+ progress = models.TextField()
66
+ goal_statement = models.TextField()
67
+ start_date = models.DateField()
68
+
69
+
70
+ __exports__ = ("Goal", "GoalLifecycleStatus", "GoalAchievementStatus", "GoalPriority")
@@ -223,6 +223,7 @@ class CurrentNoteStateEvent(IdentifiableModel):
223
223
  """Returns a boolean to indicate if the related note can be edited."""
224
224
  return self.state in [
225
225
  NoteStates.NEW,
226
+ NoteStates.CONVERTED,
226
227
  NoteStates.PUSHED,
227
228
  NoteStates.UNLOCKED,
228
229
  NoteStates.RESTORED,
@@ -116,13 +116,6 @@ class Patient(Model):
116
116
  def __str__(self) -> str:
117
117
  return f"{self.first_name} {self.last_name}"
118
118
 
119
- @property
120
- def full_name(self) -> str:
121
- """Returns the patient's full name."""
122
- return " ".join(
123
- n for n in (self.first_name, self.middle_name, self.last_name, self.suffix) if n
124
- )
125
-
126
119
  def age_at(self, time: arrow.Arrow) -> float:
127
120
  """Given a datetime, returns what the patient's age would be at that datetime."""
128
121
  age = float(0)
@@ -147,6 +140,13 @@ class Patient(Model):
147
140
  except PatientSetting.DoesNotExist:
148
141
  return None
149
142
 
143
+ @property
144
+ def full_name(self) -> str:
145
+ """Returns the patient's full name."""
146
+ return " ".join(
147
+ n for n in (self.first_name, self.middle_name, self.last_name, self.suffix) if n
148
+ )
149
+
150
150
  @property
151
151
  def preferred_pharmacy(self) -> dict[str, str] | None:
152
152
  """Returns the patient's preferred pharmacy."""
@@ -158,6 +158,20 @@ class Patient(Model):
158
158
  return None
159
159
  return pharmacy_setting
160
160
 
161
+ @property
162
+ def preferred_pharmacies(self) -> list[dict[str, Any]] | None:
163
+ """
164
+ Returns the pharmacy patient setting, a list of dicts of the patient's preferred pharmacies.
165
+ If the pharmacy setting is currently a dict, make it the default and a list.
166
+ """
167
+ pharmacy_setting = self.get_setting(PatientSettingConstants.PHARMACY) or []
168
+ if isinstance(pharmacy_setting, dict):
169
+ return [{**pharmacy_setting, "default": True}]
170
+ elif isinstance(pharmacy_setting, list):
171
+ return pharmacy_setting
172
+
173
+ return None
174
+
161
175
  @property
162
176
  def preferred_full_name(self) -> str:
163
177
  """Returns the patient's preferred full name, taking nickname into consideration."""
@@ -168,6 +182,11 @@ class Patient(Model):
168
182
  """Returns the patient's preferred first name, taking nickname into consideration."""
169
183
  return self.nickname or self.first_name
170
184
 
185
+ @property
186
+ def primary_phone_number(self) -> PatientContactPoint | None:
187
+ """Returns the patient's primary phone number, if available."""
188
+ return (self.telecom.filter(system=ContactPointSystem.PHONE).order_by("rank")).first()
189
+
171
190
 
172
191
  class PatientContactPoint(IdentifiableModel):
173
192
  """A class representing a patient contact point."""
@@ -274,12 +293,25 @@ class PatientMetadata(IdentifiableModel):
274
293
  value = models.CharField(max_length=255)
275
294
 
276
295
 
296
+ class PatientFacilityAddress(PatientAddress):
297
+ """PatientFacilityAddress."""
298
+
299
+ class Meta:
300
+ db_table = "canvas_sdk_data_api_patientfacilityaddress_001"
301
+
302
+ room_number = models.CharField(max_length=100, null=True)
303
+ facility = models.ForeignKey(
304
+ "v1.Facility", on_delete=models.DO_NOTHING, related_name="patient_facilities", null=True
305
+ )
306
+
307
+
277
308
  __exports__ = (
278
309
  "SexAtBirth",
279
310
  "PatientSettingConstants",
280
311
  "Patient",
281
312
  "PatientContactPoint",
282
313
  "PatientAddress",
314
+ "PatientFacilityAddress",
283
315
  "PatientExternalIdentifier",
284
316
  "PatientSetting",
285
317
  "PatientMetadata",
@@ -0,0 +1,23 @@
1
+ from django.db import models
2
+
3
+ from canvas_sdk.v1.data.base import IdentifiableModel
4
+ from canvas_sdk.v1.data.protocol_result import ProtocolResult
5
+
6
+
7
+ class ProtocolCurrent(ProtocolResult, IdentifiableModel):
8
+ """ProtocolCurrent."""
9
+
10
+ class Meta:
11
+ db_table = "canvas_sdk_data_api_protocolcurrent_001"
12
+
13
+ patient = models.ForeignKey(
14
+ "v1.Patient", on_delete=models.DO_NOTHING, related_name="protocol_currents"
15
+ )
16
+ result_hash = models.CharField(max_length=32, default="")
17
+ snooze_date = models.DateField(null=True)
18
+
19
+
20
+ __exports__ = (
21
+ "ProtocolCurrent",
22
+ "ProtocolCurrentStatus",
23
+ )
@@ -0,0 +1,46 @@
1
+ from django.contrib.postgres.fields import ArrayField
2
+ from django.db import models
3
+
4
+
5
+ class ProtocolResultStatus(models.TextChoices):
6
+ """Constants for ProtocolResultStatus."""
7
+
8
+ STATUS_DUE = "due"
9
+ STATUS_SATISFIED = "satisfied"
10
+ STATUS_NOT_APPLICABLE = "not_applicable"
11
+ STATUS_PENDING = "pending"
12
+ STATUS_NOT_RELEVANT = "not_relevant"
13
+
14
+
15
+ class ProtocolResult(models.Model):
16
+ """ProtocolResult."""
17
+
18
+ class Meta:
19
+ abstract = True
20
+
21
+ title = models.TextField(blank=True, default="")
22
+ narrative = models.TextField(blank=True, default="")
23
+ result_identifiers = ArrayField(base_field=models.TextField())
24
+ types = ArrayField(base_field=models.TextField())
25
+ protocol_key = models.TextField(default="")
26
+ plugin_name = models.TextField(null=True, blank=True)
27
+ status = models.TextField(
28
+ choices=ProtocolResultStatus.choices, default=ProtocolResultStatus.STATUS_NOT_APPLICABLE
29
+ )
30
+ due_in = models.IntegerField(null=True, default=-1)
31
+ days_of_notice = models.IntegerField(default=30)
32
+ snoozed = models.BooleanField(default=False)
33
+ sources = models.JSONField(default=dict)
34
+ recommendations = models.JSONField(default=dict)
35
+ top_recommendation_key = models.TextField(blank=True, default="")
36
+ next_review = models.DateTimeField(null=True)
37
+ feedback_enabled = models.BooleanField(default=False)
38
+ plugin_can_be_snoozed = models.BooleanField(default=False)
39
+ created = models.DateTimeField(auto_now_add=True)
40
+ modified = models.DateTimeField(auto_now=True)
41
+
42
+
43
+ __exports__ = (
44
+ "ProtocolResult",
45
+ "ProtocolResultStatus",
46
+ )
@@ -211,4 +211,39 @@ class StaffRole(Model):
211
211
  role_type = models.CharField(max_length=50, choices=RoleType.choices, blank=True)
212
212
 
213
213
 
214
- __exports__ = ("Staff", "StaffContactPoint", "StaffAddress", "StaffPhoto", "StaffRole")
214
+ class StaffLicense(IdentifiableModel):
215
+ """StaffLicense."""
216
+
217
+ class Meta:
218
+ db_table = "canvas_sdk_data_api_stafflicense_001"
219
+
220
+ class LicenseType(TextChoices):
221
+ CLIA = "CLIA", "CLIA"
222
+ DEA = "DEA", "DEA"
223
+ PTAN = "PTAN", "PTAN"
224
+ STATE_LICENSE = "STATE", "State license"
225
+ TAXONOMY = "TAXONOMY", "Taxonomy"
226
+ SPI = "SPI", "SPI"
227
+ OTHER = "OTHER", "Other"
228
+
229
+ staff = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name="licenses")
230
+ issuing_authority_long_name = models.CharField(max_length=200, null=True, blank=True)
231
+ issuing_authority_url = models.URLField(blank=True, null=True)
232
+ license_or_certification_identifier = models.CharField(max_length=50)
233
+ issuance_date = models.DateField()
234
+ expiration_date = models.DateField()
235
+ license_type = models.CharField(
236
+ max_length=50, choices=LicenseType.choices, null=True, blank=True
237
+ )
238
+ primary = models.BooleanField(default=False)
239
+ state = models.CharField(max_length=2, blank=True, null=True)
240
+
241
+
242
+ __exports__ = (
243
+ "Staff",
244
+ "StaffAddress",
245
+ "StaffContactPoint",
246
+ "StaffLicense",
247
+ "StaffPhoto",
248
+ "StaffRole",
249
+ )
@@ -244,18 +244,26 @@
244
244
  ],
245
245
  "canvas_sdk.effects.patient": [
246
246
  "CreatePatientExternalIdentifier",
247
+ "CreatePatientPreferredPharmacies",
247
248
  "Patient",
249
+ "PatientAddress",
248
250
  "PatientContactPoint",
249
- "PatientExternalIdentifier"
251
+ "PatientExternalIdentifier",
252
+ "PatientPreferredPharmacy"
250
253
  ],
251
254
  "canvas_sdk.effects.patient.base": [
252
255
  "Patient",
256
+ "PatientAddress",
253
257
  "PatientContactPoint",
254
- "PatientExternalIdentifier"
258
+ "PatientExternalIdentifier",
259
+ "PatientPreferredPharmacy"
255
260
  ],
256
261
  "canvas_sdk.effects.patient.create_patient_external_identifier": [
257
262
  "CreatePatientExternalIdentifier"
258
263
  ],
264
+ "canvas_sdk.effects.patient.create_patient_preferred_pharmacies": [
265
+ "CreatePatientPreferredPharmacies"
266
+ ],
259
267
  "canvas_sdk.effects.patient_chart_group": [
260
268
  "PatientChartGroup"
261
269
  ],
@@ -532,6 +540,8 @@
532
540
  "DetectedIssueEvidence",
533
541
  "Device",
534
542
  "Discount",
543
+ "Facility",
544
+ "Goal",
535
545
  "ImagingOrder",
536
546
  "ImagingReport",
537
547
  "ImagingReview",
@@ -574,6 +584,7 @@
574
584
  "PatientConsentRejectionCoding",
575
585
  "PatientContactPoint",
576
586
  "PatientExternalIdentifier",
587
+ "PatientFacilityAddress",
577
588
  "PatientMetadata",
578
589
  "PatientPosting",
579
590
  "PatientSetting",
@@ -581,6 +592,7 @@
581
592
  "PayorSpecificCharge",
582
593
  "PracticeLocation",
583
594
  "PracticeLocationSetting",
595
+ "ProtocolCurrent",
584
596
  "ProtocolOverride",
585
597
  "Question",
586
598
  "Questionnaire",
@@ -594,6 +606,7 @@
594
606
  "Staff",
595
607
  "StaffAddress",
596
608
  "StaffContactPoint",
609
+ "StaffLicense",
597
610
  "StaffPhoto",
598
611
  "StaffRole",
599
612
  "Task",
@@ -706,6 +719,15 @@
706
719
  "canvas_sdk.v1.data.discount": [
707
720
  "Discount"
708
721
  ],
722
+ "canvas_sdk.v1.data.facility": [
723
+ "Facility"
724
+ ],
725
+ "canvas_sdk.v1.data.goal": [
726
+ "Goal",
727
+ "GoalAchievementStatus",
728
+ "GoalLifecycleStatus",
729
+ "GoalPriority"
730
+ ],
709
731
  "canvas_sdk.v1.data.imaging": [
710
732
  "ImagingOrder",
711
733
  "ImagingReport",
@@ -775,6 +797,7 @@
775
797
  "PatientAddress",
776
798
  "PatientContactPoint",
777
799
  "PatientExternalIdentifier",
800
+ "PatientFacilityAddress",
778
801
  "PatientMetadata",
779
802
  "PatientSetting",
780
803
  "PatientSettingConstants",
@@ -804,11 +827,19 @@
804
827
  "PracticeLocationPOS",
805
828
  "PracticeLocationSetting"
806
829
  ],
830
+ "canvas_sdk.v1.data.protocol_current": [
831
+ "ProtocolCurrent",
832
+ "ProtocolCurrentStatus"
833
+ ],
807
834
  "canvas_sdk.v1.data.protocol_override": [
808
835
  "IntervalUnit",
809
836
  "ProtocolOverride",
810
837
  "Status"
811
838
  ],
839
+ "canvas_sdk.v1.data.protocol_result": [
840
+ "ProtocolResult",
841
+ "ProtocolResultStatus"
842
+ ],
812
843
  "canvas_sdk.v1.data.questionnaire": [
813
844
  "Interview",
814
845
  "InterviewQuerySet",
@@ -834,6 +865,7 @@
834
865
  "Staff",
835
866
  "StaffAddress",
836
867
  "StaffContactPoint",
868
+ "StaffLicense",
837
869
  "StaffPhoto",
838
870
  "StaffRole"
839
871
  ],
@@ -291,6 +291,7 @@ enum EffectType {
291
291
  DELETE_SCHEDULE_EVENT = 6017;
292
292
 
293
293
  CREATE_PATIENT = 6003;
294
+ UPDATE_PATIENT = 6008;
294
295
 
295
296
  CREATE_MESSAGE = 6004;
296
297
  SEND_MESSAGE = 6005;
@@ -300,7 +301,7 @@ enum EffectType {
300
301
  PATIENT_METADATA__CREATE_ADDITIONAL_FIELDS = 6010;
301
302
  UPSERT_PATIENT_METADATA = 6011;
302
303
  CREATE_PATIENT_EXTERNAL_IDENTIFIER = 6012;
303
-
304
+ CREATE_PATIENT_PREFERRED_PHARMACIES = 6018;
304
305
  CREATE_COMPOUND_MEDICATION = 6020;
305
306
  UPDATE_COMPOUND_MEDICATION = 6021;
306
307
 
@@ -316,6 +317,7 @@ enum EffectType {
316
317
  REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD = 7004;
317
318
  REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__ADD_RESPONSE = 7005;
318
319
  REVENUE__PAYMENT_PROCESSOR__PAYMENT_METHOD__REMOVE_RESPONSE = 7006;
320
+
319
321
  }
320
322
 
321
323
  message Effect {