Table of Contents |
---|
Purpose
This WS allows to add activity to the specified Care plan.
Key points
With one request can be added only one activity to the Care plan
Activity can be added by the employee who has an Approval granted by the patient on write Care plan resource
Activity adds in async way. Result of the activity addition job should be link on the created activity (look at Get Care plan activity by ID).
Activity should be signed with DS. Signed content stores in the media storage.
Specification
Authorization
Verify the validity of access token
Return (401, 'Invalid access token') in case of validation fails
Verify that token is not expired
in case of error - return (401, 'Invalid access token')
Check user scopes in order to perform this action (scope = 'care_plan:write')
Return (403, 'Your scope does not allow to access this resource. Missing allowances: care_plan:write') in case of invalid scope(s)
Validate legal entity
Extract client_id from token
Check legal entity status is ACTIVE
In case of error - return 409 ('client_id refers to legal entity that is not active')
Check legal entity type in ME_ALLOWED_TRANSACTIONS_LE_TYPES config parameter
in case of error - return 409 ('client_id refers to legal entity with type that is not allowed to create medical events transactions')
Validate Care plan
Get Care plan identifier from the URL
Check Care plan:
belongs to patient (from url)
in case of error - return 422 ('Care plan with such id is not found')
is not in final status
in case of error - return 422 ('Invalid care plan status')
Care plan’s period.end >= current date.
in case of error - return 422 ('Care Plan end date is expired')
Validate Patient
Get person_id from URL
Validate patient status is active
in case of error - return 409 ('Person is not active')
Validate User
Extract user_id from token.
Check user has an active and approved employee from legal entity (token) that:
has an active Approval granted by the Patient on write the Care plan resource (care plan id from URL)
Return 403 ('Access denied') in case employee has no Approval on write
Validate Digital Sign
Validate request is signed
in case of error - return 422 (“document must be signed by 1 signer but contains 0 signatures”)
Check DS is valid and not expired
Validate that DS belongs to the author of the activity
Check that DRFO from DS and user's party.tax_id matches
in case of error - return 409 (“Signer DRFO doesn't match with requester tax_id“)
Validate activity
Activity should be validated. User fills following fields in the activity:
Validate activity identifier
Validate value in the field $.id, required
Check it is unique within Care plan and has UUID format
Return 422 ("Activity with such id already exists")
Validate care plan identifier
As care plan identifier should be contained in signed content, $.care_plan required in the request body.
Check value matches with care plan identifier from URL
in case of error - return 409 ('Care Plan from url does not match to Care Plan ID specified in body')
Validate activity author
Validate value in the field $.author, required
Check employee belongs to the user and legal entity (from token)
Employee is:
an employee who has active Approval on write the Care plan
belongs to user
in case of error - return 422 ('User is not allowed to create care plan activity for the employee')
Validate activity detail
1. Kind
Validate value in the field $.detail.kind, required
Check value in enum: medication_request, service_request
Return 422 ('value is not allowed in enum')
2. Product
Validate value in the field $.detail.product_reference, required
...
Check that value is a reference on service or service_group
Return 422 ('Cannot refer to medication for kind = service_request')
Check service or service_group is active
Return 422 ('<Service/Service group> should be active')
Check there is no activities (status=scheduled, in_progress) with the same service or service_group in the Care plan
Return 422 (“Another activity with status ‘scheduled' or ‘in_progress' already exists in the current Care plan“)
3. Reason code
Validate value in the field $.detail.reason_code, if submitted
Check that value matches with values in
eHealth/ICD10_AM/condition_codes
dictionaryin case of error - return 422 ('value is not allowed in enum')
4. Reason reference
Validate value in the field $.detail.reason_reference, if submitted
Check that value is an array with references of condition, observation or diagnostic report types.
in case of error - return 422 ('value is not allowed in enum')
Check that each reference:
is valid ME
belongs to the patient ($.subject)
in case of error - return 422 ('<medical event type> with such ID is not found')
5. Goal
Validate value in the field $.detail.goal, if submitted
Check that value matches with values in
eHealth/care_plan_activity_goals
dictionaryin case of error - return 422 ('value is not allowed in enum')
6. Quantity
Validate value in the field $.quantity, if submitted
Check $.quantity.value is not empty, is integer, greater than zero
Return 422 schema validation error
Set remaining_quantity.value = $.quantity.value
7. Scheduled
If submitted, validate there is one of the $.detail.scheduled_[x] field: scheduled_timing, scheduled_period or scheduled_string.
...
Validate value with schema of the Period type
in case of error - return 422 schema validation error
Check values within $.CarePlan.Period
in case period.end validation error - return 422 ('Period end time must be within care plan period range, after period start date')
in case period.start validation error - return 422 ('Period start time must be within care plan period range')
8. Location
Validate value in the field $.detail.location, if submitted
Check the value is valid reference on division resource
Check the division is active and division’s legal entity has active status
Return 422 ('Division is not active')
9. Performer
Validate value in the field $.detail.performer, if submitted
Check the value is valid reference o employee resource
Check employee is active and approved
Return 422 ('Invalid employee status')
10. Daily amount
Validate value in the field $.detail.daily_amount, if submitted.
Check activity kind is medication_request
Return 422 ('Field is allowed for medication request activities only') in case kind is not medication_request
11. Medical program
Validate value in the field $.program, if submitted
...
Expand | ||
---|---|---|
| ||
SELECT * FROM medications MI -- 2nd level: Medication - type = INNM_DOSAGE INNER JOIN ingredients I ON I.medication_child_id = MI.id AND I.is_primary =TRUE INNER JOIN medications MED -- 3rd level: Medication - type = BRAND ON MED.type == BRAND AND I.parent_id = MED.id AND MED.is_active == TRUE INNER JOIN program_medications MP ON MP.medical_program_id == `$.product.identifier.value` MED.id = MP.medication_id AND MP.is_active == TRUE AND MP.medication_request_allowed == TRUE WHERE MI.id == $.medication_id AND MI.type == INNM_DOSAGE AND MI.is_active == TRUE |
12. Do not perform flag
Validate value in the field $.do_not_perform
Check it is
false
in case of error - return 422 ('not allowed in enum')
Service logic
Save signed content to media storage
Save data to care_plan_activities collection in DB according to Care plan data model_EN
Save link from media storage to the $.signed_content_links field in care plan activities collection
If Care plan has status = new:
Set care plan status = active
Check if patient has another active or/and new Care plans with such condition code in the addresses field:
If such Care plans found - set these Care plans statuses to TERMINATED
Create job and return it’s id.