...
This web service allows to cancel encounter and other components of Data Package such as conditions, observations, allergy_intolerances and immunizations in case they were entered in error.
Note : You have only one attempt to cancel each package via API. In case you signed and cancelled package partly and now you need to cancel more entities from this package - appeal to eHealth administrator.
Note |
---|
Note: Current diagnoses on the episode will be replaced automatically with the last accurate diagnoses in case encounter was cancelled. |
...
Check user scopes in order to perform this action (scope = 'encounter:cancel')
Return 403 in case invalid scope(s)
If BLOCK_UNVERIFIED_PARTY_USERS is true, then check party's data match following condition: verification_status != NOT_VERIFIED or (verification_status = NOT_VERIFIED and updated_at <= current_date - UNVERIFIED_PARTY_PERIOD_DAYS_ALLOWED):
in case not match - return 403 ("Access denied. Party is not verified")
Headers
Наприклад:
Content-Type:application/json
Authorization:Bearer {{access_token}}
API-key:{{secret}}
...
Validate digital signature
ds.drfo == PRM.parties.tax_id where PRM.parties.id==PRM.employees.party_id where:
PRM.employees.id==$.encounter.performer.identifier.value)
OR PRM.employees.id==$.approval.granted_to.identifier.value ($.approvals.granted_resources.identifier.value==$.encounter_id AND $.approvals.access_level='write')
OR PRM.employees.employee_type==MED_ADMIN
Compare signed_content to previously created content
select encounter, select * from observations, conditions, immunizations, allergy_intolerances where context.identifier.value=encounter_id and compare to signed_content (do not include statuses to comparation, cancellation_reason and explanatory_letter )
in case of inconsistencies return "Submitted signed content does not correspond to previously created content"
Validate diagnoses still valid
if ($.encounter.status!="entered_in_error") validate ($.conditions[?(@.verification_status=="entered_in_error")].id is not IN $.encounter.diagnoses[*].condition.identifier.value)
in case of error "The condition can not be canceled while encounter is not canceled"
Validate encounter.status in DB !=
entered_in_error
.Validate entities refers to encounter.
Validate cancellation_reason
$.cancellation_reason.coding[*].system == "eHealth/cancellation_reasons"
Validate status_reason if present
$.status_reason.code is a value from the dictionary that is referenced in $.status_reason.coding[*].system
in case of error - return 422 ("value is not allowed in enum")
If
cancellation_reason
in DB !=nullCheck
cancellation_reason
= (cancellation_reason
in DB)in case of error - return 422 ("cancellation_reason can’t be changed")
Validate entities are not canceled yet (status!= "entered_in_error")
in case of error "Invalid transition"
Validate at least one entity in the request marked as "entered_in_error"
in case of error "At least one entity should have status "entered_in_error""
Validate user performs action with an episode that belong to his legal entity
ME.patient{patinet_id}.episodes{episode_id}.managing_organization==token.client_id
in case of error return 422 "Managing_organization in the episode does not correspond to user`s legal_entity"
If entity is device_dispense:
Check that status != “entered_in_error” and status != “completed”
in case of error - return 409 error ('Device dispense in status <status> cannot be marked in error')
If status =
entered_in_error
is set for encountercheck that all entities are in request
in case of error - return 422 error (“required entities %{entities}{id} was not present”)
status =
entered_in_error
is set for each entitiesin case of error - return 422 ("value is not allowed in enum")
if some entities was canceled (status in DB =
entered_in_error)
ignore rule 8
Validate legal entity
Validate episode belongs to the legal entity where the current user works
ME.episode.managing_organization==token.client_id
in case of error return 409 "User is not allowed to perform actions with an episode that belongs to another legal entity"
...
Save signed_content to Media Storage
Set status `entered_in_error` for objects, submitted with status `entered_in_error`
Set cancellation_reason
Set explanatory_letter for entities, submitted with status
entered_in_error
if some entities was canceled (status in DB =
entered_in_error)
before ignore this step
Deactivate corresponding diagnoses in the episode in case encounter was entered_in_error
Find episode where id == encouners{encounter_id}.context.identifier.value
Find record in episodes{episode_id}.diagnoses_hstr.evidence.identifier.value==encounter_id
Set is_active = false for this record
Replace current diagnoses
Set in episodes.current_diagnoses the last record from diagnoses_history where is_active==true
...