canvas 0.59.0__py3-none-any.whl → 0.61.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.59.0
3
+ Version: 0.61.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
@@ -102,7 +102,7 @@ canvas_sdk/caching/exceptions.py,sha256=WIQIveMzmGm9WGhZqBhsGbbcydpS0AzMpkhzUmTa
102
102
  canvas_sdk/caching/plugins.py,sha256=VWVj7iBQQDHJTMX8El4YHkUPRgSEWZef7aaS7Jls7RU,607
103
103
  canvas_sdk/caching/utils.py,sha256=lg-2RVl7uujO0_KOvWKZ5c3q7RyrrmLG5JNaxCL2lOw,875
104
104
  canvas_sdk/commands/__init__.py,sha256=qX7xkagyYk4W4JqczoTHv3W3Bk16BXQG4Ut7zQV8wX0,3337
105
- canvas_sdk/commands/base.py,sha256=NuReIfAun8oumtA5fWT_uddtD1K81dzzyx_gHFjAb-U,6629
105
+ canvas_sdk/commands/base.py,sha256=XHHS2mvTm0Do3y5xxUJJzj1JFMZ3Jp-E0Go7ZtnXkww,6763
106
106
  canvas_sdk/commands/constants.py,sha256=0iuPRW1xC0O7i1KxxQbFhjbOA5VAnBkfyxELRJ3M86o,1652
107
107
  canvas_sdk/commands/commands/__init__.py,sha256=YYXr5tEQlnwMgTXJbOG963tKSPiUOM4mUkX8wuiqp7U,17
108
108
  canvas_sdk/commands/commands/adjust_prescription.py,sha256=LgA0x7YS6wK84kxI5r3ULSBSvxi4XFB6hdIMdfakPNQ,453
@@ -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=eW5hFb0LQmLzpvvULEnWX5TAsHZxwU4K7TK0fFxqUaE,5316
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,6 +247,7 @@ 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
248
252
  canvas_sdk/v1/data/goal.py,sha256=dOI0rakLBnnYSkdMt5W2uh7_W5Pp21G6s1z70PzU3TY,2465
249
253
  canvas_sdk/v1/data/imaging.py,sha256=N0OkJjmHI3jtv1w8RBhqGZGDGidNpf1ZwT0ypm1o60M,5246
@@ -255,18 +259,20 @@ canvas_sdk/v1/data/message.py,sha256=EKc2kkWGuzrgBH3sDUa9jiNpRP7J1ZdWE6BnPhY2gvs
255
259
  canvas_sdk/v1/data/note.py,sha256=Eq0JgDRzwK84BAT6Y51f47Gke2rseC3vvcjoqhzAsVE,9335
256
260
  canvas_sdk/v1/data/observation.py,sha256=l1EXGQ8FBBInxQthsmY1Oms9v73ni_J7SAP5M8Hmkvg,3881
257
261
  canvas_sdk/v1/data/organization.py,sha256=gt0KZC1hklwWf57vCxs2K0qPnLpMyyNFWNL7-WZ6AqI,1159
258
- canvas_sdk/v1/data/patient.py,sha256=7D_bxeCAoA_I8-2ZLzAMkCrV9ziZ_-IND9uOq0Wp83I,10515
262
+ canvas_sdk/v1/data/patient.py,sha256=VMFlr6P5BxLN6MK0k8hjIccfumdkL8CJrMtDrLms0qY,11748
259
263
  canvas_sdk/v1/data/patient_consent.py,sha256=zx1C__E6On-MC7OnTgEeP50tn77R6UXw15wC125jDog,2704
260
264
  canvas_sdk/v1/data/payment_collection.py,sha256=h17qmQkCCwSdukIeeYMqBHZnpxpahOa03ckMHmgZV-I,954
261
265
  canvas_sdk/v1/data/payor_specific_charge.py,sha256=TtByy7-QF00PfONC-QDo2kkxRAOdLaRjkhssQBPvZjw,770
262
266
  canvas_sdk/v1/data/posting.py,sha256=fZhglI5WNGCuZy-kcCurX9hnNUtFUFKjwsqjxyiOC7U,7749
263
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
264
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
265
271
  canvas_sdk/v1/data/questionnaire.py,sha256=4vQFbBjnvfXwvb73Q0ES64bnWME6P-Oy_9E9ioWAOg8,7209
266
272
  canvas_sdk/v1/data/reason_for_visit.py,sha256=diXbeGUUc_XBmIDpzubxesc6Nhj5F87zw2oYurPSE3M,669
267
273
  canvas_sdk/v1/data/referral.py,sha256=qVPHWqDlJoBzrYsNhP6z2NQ2Wpus_OxW8LwHYpLlM-M,3589
268
274
  canvas_sdk/v1/data/service_provider.py,sha256=LQfQ0esg97NpmSYnftsWqYUJyJIQOZKmpZFNnGsxXoQ,1917
269
- canvas_sdk/v1/data/staff.py,sha256=iVqBXwANp1qYEL39DIpveKbuqd1nw1oSDQ917xw8xgk,8302
275
+ canvas_sdk/v1/data/staff.py,sha256=osAPzLw2y-SJW5TQt69RnKBmsDx5wKeDNmbBtfxYDWw,9392
270
276
  canvas_sdk/v1/data/task.py,sha256=9jSqr7e7ODJTs4hanWsOD-1Rb8gByJOuLta90V9V_hY,3480
271
277
  canvas_sdk/v1/data/team.py,sha256=J4s98sS7UuUw9jJCe-_7eikr1dV4SQARDzK5oxmsO_o,2832
272
278
  canvas_sdk/v1/data/user.py,sha256=82jnqVrYeWo2eBXY_MH2r75LZo5EKgY9kalahrUl0_s,511
@@ -296,7 +302,7 @@ canvas_sdk/views/__init__.py,sha256=YYXr5tEQlnwMgTXJbOG963tKSPiUOM4mUkX8wuiqp7U,
296
302
  logger/__init__.py,sha256=uMIOf1CDdKSmBKxKwO4CmDpvnJITci76IMXENOwSHEo,85
297
303
  logger/logger.py,sha256=l5W5jn3vGQt6TM7OxOpoMy-vC7RNNA2pGnQJJgHeXWA,2068
298
304
  plugin_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
299
- plugin_runner/allowed-module-imports.json,sha256=cGmKEtU3lzLzWZ0isxNGlsT-HKSPO5K5jz3KSfUsWAA,36066
305
+ plugin_runner/allowed-module-imports.json,sha256=Z0WtFFA52DUF-oCeI50_4iURWRSN2-vdd1T-ewxh4rM,36717
300
306
  plugin_runner/authentication.py,sha256=UyyhXajokVFH866dpDhoTlXS9Cg7y0sQltn0_LcwXrY,1131
301
307
  plugin_runner/aws_headers.py,sha256=wZ8584E1fTW0CdGxOCnLSF8alH27z-URcUyoc6y6ohg,2782
302
308
  plugin_runner/exceptions.py,sha256=ltqn56SMTg-T5miSh5hux4ojwx0hZGSWaB7BxyAmcAo,545
@@ -305,7 +311,7 @@ plugin_runner/installation.py,sha256=2KTDWWsQ97WIN2k9tC4d50zN77WWK_1D5obXlhLfWw8
305
311
  plugin_runner/load_all_plugins.py,sha256=4T2gW2YljhIx4xfwf1c0F_8oIbE1ubsLj0ShkHRtlVY,5847
306
312
  plugin_runner/plugin_runner.py,sha256=RpcZoXXzGEflJGuHJaAOCP24mWb4fG1bLw3ryA6n88k,26623
307
313
  plugin_runner/sandbox.py,sha256=A5iaxQePwA5FERK232MArq2VzZzHKM5ydrfTDFeXcLg,30232
308
- protobufs/canvas_generated/messages/effects.proto,sha256=wQBRk0_XN8ssIjDtRttxsEG6pZJbYS8czGzdvpx3g6M,9756
314
+ protobufs/canvas_generated/messages/effects.proto,sha256=ovVNjjWd6LvRnrk0Pu76AeT6wQjA_K-vvxMvgafQYMI,9827
309
315
  protobufs/canvas_generated/messages/events.proto,sha256=21qM3Ct9-iIG_T7O-XoFPWpnVafocYJ1KGiZ2nn1CFM,52047
310
316
  protobufs/canvas_generated/messages/plugins.proto,sha256=xJyEeTwM6wWja3vGECLsIzfabwf1VahDgacoPL3TuwI,323
311
317
  protobufs/canvas_generated/services/plugin_runner.proto,sha256=PZ0Ts11b9tdA5Gkg2M05JVEKAm0R4LFEwrGRS-TQ16E,466
@@ -325,7 +331,7 @@ canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookie
325
331
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/README.md,sha256=3QKoJQq3YmdplGnDOBMsLCJ3Ya1_aKjoz-QiWc4QfjA,291
326
332
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/protocols/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
327
333
  canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/{{ cookiecutter.__package_name }}/protocols/my_protocol.py,sha256=fKLLcOIwvSWenW8-7tr8VqnF4Iox_5wU9V-Qw9UySsA,2381
328
- canvas-0.59.0.dist-info/METADATA,sha256=wX9YSrF81yvm0F5QUd0_A4SXBRCPi0FY-7xhUWuId1E,4758
329
- canvas-0.59.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
330
- canvas-0.59.0.dist-info/entry_points.txt,sha256=0Vs_9GmTVUNniH6eDBlRPgofmADMV4BES6Ao26M4AbM,47
331
- canvas-0.59.0.dist-info/RECORD,,
334
+ canvas-0.61.0.dist-info/METADATA,sha256=wdSKy9Zu8AvBVwf_eIOzqSOTysRria1WdmZMXmaJ9mo,4758
335
+ canvas-0.61.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
336
+ canvas-0.61.0.dist-info/entry_points.txt,sha256=0Vs_9GmTVUNniH6eDBlRPgofmADMV4BES6Ao26M4AbM,47
337
+ canvas-0.61.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
@@ -77,7 +77,8 @@ class _BaseCommand(TrackableFieldsModel):
77
77
  annotation_args = get_args(annotation)
78
78
  # Filter out NoneType and take the first valid type
79
79
  annotation = next(
80
- (arg for arg in annotation_args if arg is not NoneType), annotation_args[0]
80
+ (arg for arg in annotation_args if arg is not NoneType),
81
+ annotation_args[0],
81
82
  )
82
83
 
83
84
  if type(annotation) is EnumType:
@@ -158,8 +159,13 @@ class _BaseCommand(TrackableFieldsModel):
158
159
  """Returns a command recommendation to be inserted via Protocol Card."""
159
160
  if button is None:
160
161
  button = self.constantized_key().lower().replace("_", " ")
161
- command = self.Meta.key.lower()
162
- return Recommendation(title=title, button=button, command=command, context=self.values)
162
+ command = self.Meta.key
163
+ return Recommendation(
164
+ title=title,
165
+ button=button,
166
+ command=command,
167
+ context=self.values | {"effect_type": f"ORIGINATE_{self.constantized_key()}_COMMAND"},
168
+ )
163
169
 
164
170
 
165
171
  class _SendableCommandMixin:
@@ -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,7 @@ 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
18
19
  from .goal import Goal
19
20
  from .imaging import ImagingOrder, ImagingReport, ImagingReview
20
21
  from .invoice import Invoice
@@ -51,6 +52,7 @@ from .patient import (
51
52
  PatientAddress,
52
53
  PatientContactPoint,
53
54
  PatientExternalIdentifier,
55
+ PatientFacilityAddress,
54
56
  PatientMetadata,
55
57
  PatientSetting,
56
58
  )
@@ -69,6 +71,7 @@ from .posting import (
69
71
  PatientPosting,
70
72
  )
71
73
  from .practicelocation import PracticeLocation, PracticeLocationSetting
74
+ from .protocol_current import ProtocolCurrent
72
75
  from .protocol_override import ProtocolOverride
73
76
  from .questionnaire import (
74
77
  Interview,
@@ -83,7 +86,7 @@ from .questionnaire import (
83
86
  from .reason_for_visit import ReasonForVisitSettingCoding
84
87
  from .referral import Referral, ReferralReport
85
88
  from .service_provider import ServiceProvider
86
- from .staff import Staff, StaffAddress, StaffContactPoint, StaffPhoto, StaffRole
89
+ from .staff import Staff, StaffAddress, StaffContactPoint, StaffLicense, StaffPhoto, StaffRole
87
90
  from .task import Task, TaskComment, TaskLabel, TaskTaskLabel
88
91
  from .team import Team, TeamContactPoint
89
92
  from .user import CanvasUser
@@ -121,6 +124,7 @@ __all__ = __exports__ = (
121
124
  "DetectedIssueEvidence",
122
125
  "Device",
123
126
  "Discount",
127
+ "Facility",
124
128
  "Goal",
125
129
  "ImagingOrder",
126
130
  "ImagingReport",
@@ -161,6 +165,7 @@ __all__ = __exports__ = (
161
165
  "PatientAddress",
162
166
  "PatientContactPoint",
163
167
  "PatientExternalIdentifier",
168
+ "PatientFacilityAddress",
164
169
  "PatientPosting",
165
170
  "PatientSetting",
166
171
  "PatientMetadata",
@@ -171,6 +176,7 @@ __all__ = __exports__ = (
171
176
  "PaymentCollection",
172
177
  "PracticeLocation",
173
178
  "PracticeLocationSetting",
179
+ "ProtocolCurrent",
174
180
  "ProtocolOverride",
175
181
  "Question",
176
182
  "Questionnaire",
@@ -183,6 +189,7 @@ __all__ = __exports__ = (
183
189
  "ServiceProvider",
184
190
  "Staff",
185
191
  "StaffAddress",
192
+ "StaffLicense",
186
193
  "StaffPhoto",
187
194
  "StaffRole",
188
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",)
@@ -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,7 @@
532
540
  "DetectedIssueEvidence",
533
541
  "Device",
534
542
  "Discount",
543
+ "Facility",
535
544
  "Goal",
536
545
  "ImagingOrder",
537
546
  "ImagingReport",
@@ -575,6 +584,7 @@
575
584
  "PatientConsentRejectionCoding",
576
585
  "PatientContactPoint",
577
586
  "PatientExternalIdentifier",
587
+ "PatientFacilityAddress",
578
588
  "PatientMetadata",
579
589
  "PatientPosting",
580
590
  "PatientSetting",
@@ -582,6 +592,7 @@
582
592
  "PayorSpecificCharge",
583
593
  "PracticeLocation",
584
594
  "PracticeLocationSetting",
595
+ "ProtocolCurrent",
585
596
  "ProtocolOverride",
586
597
  "Question",
587
598
  "Questionnaire",
@@ -595,6 +606,7 @@
595
606
  "Staff",
596
607
  "StaffAddress",
597
608
  "StaffContactPoint",
609
+ "StaffLicense",
598
610
  "StaffPhoto",
599
611
  "StaffRole",
600
612
  "Task",
@@ -707,6 +719,9 @@
707
719
  "canvas_sdk.v1.data.discount": [
708
720
  "Discount"
709
721
  ],
722
+ "canvas_sdk.v1.data.facility": [
723
+ "Facility"
724
+ ],
710
725
  "canvas_sdk.v1.data.goal": [
711
726
  "Goal",
712
727
  "GoalAchievementStatus",
@@ -782,6 +797,7 @@
782
797
  "PatientAddress",
783
798
  "PatientContactPoint",
784
799
  "PatientExternalIdentifier",
800
+ "PatientFacilityAddress",
785
801
  "PatientMetadata",
786
802
  "PatientSetting",
787
803
  "PatientSettingConstants",
@@ -811,11 +827,19 @@
811
827
  "PracticeLocationPOS",
812
828
  "PracticeLocationSetting"
813
829
  ],
830
+ "canvas_sdk.v1.data.protocol_current": [
831
+ "ProtocolCurrent",
832
+ "ProtocolCurrentStatus"
833
+ ],
814
834
  "canvas_sdk.v1.data.protocol_override": [
815
835
  "IntervalUnit",
816
836
  "ProtocolOverride",
817
837
  "Status"
818
838
  ],
839
+ "canvas_sdk.v1.data.protocol_result": [
840
+ "ProtocolResult",
841
+ "ProtocolResultStatus"
842
+ ],
819
843
  "canvas_sdk.v1.data.questionnaire": [
820
844
  "Interview",
821
845
  "InterviewQuerySet",
@@ -841,6 +865,7 @@
841
865
  "Staff",
842
866
  "StaffAddress",
843
867
  "StaffContactPoint",
868
+ "StaffLicense",
844
869
  "StaffPhoto",
845
870
  "StaffRole"
846
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 {