ЕСОЗ - публічна документація

RC_CSI-2483_Sign Medication request Request

Purpose

This WS is designed to sign Request fo Medication request (patch). If successful signed - automatically create Medication request.

Specification

Apiary

Key points

  1. Only authenticated and authorized users with appropriate scope can Sign Medication Request Request (MRR)

  2. Request should be signed with DS.

  3. MRR data should be changed when it has submitted to the method.

Authorize

  1. Verify the validity of access token

    1. in case of error - return 401 (“Invalid access token”) in case of validation fails

  2. Verify that token is not expired

    1. in case of error - return 401 (“Invalid access token”)

  3. Check user scopes in order to perform this action (scope = 'medication_request_request:sign')

    1. return 403 (“Your scope does not allow to access this resource. Missing allowances: medication_request_request:sign”) in case of invalid scope(s)

Validations

Validate employee

  1. Validate employee from the medication request request relates to user from token.

    1. in case of error - return 403 “Only doctor that in Medication request Request can sign it“

  2. Perform another validation described at Create MRR: Validate employee

Validate division

Validate division as described on Create MRR: Validate division

Validate context

Validate division as described on Create MRR: Validate context

Validate medical program

  1. Validate medical_program_id: medical_program_id exists and has medication_request_allowed = true

    1. in case of error return 422 ("Forbidden to create medication request for this medical program!")

Validate existing medication request request

If medical program setting skip_treatment_period = false (absent), then validate division as described on PreQualify Medication request: 2. Check absence the same medications for the programs

Validate digital signature

Decode content that is encrypted in an electronic digital signature.
Use Digital signature WS. Method checks digital signature and returns result.

Validate request status

Purpose validation: Valid ability transition.

  1. For info - status charts: [Transferred] Medication request status model

  2. Get Medication request Request status by $.id

  3. Check status == NEW

    1. if invalid - return 409 error (message: "Invalid status Medication request Request for sign transition!")'

Validate person

Validate person with it’s verification status as described on Create MRR: Validate person

Validate signed content

Purpose validation: Check equality decoded signed content with previously created on IL.db.

  1. Get data 

    SELECT data FROM medication_request_requests WHERE id = $.id
  2. If they are not equal with decoded signed content - generate 422 error (message: "Signed content does not match the previously created content!")

Validate authorize_with

Get value of THIRD_PERSON_CONFIDANT_PERSON_RELATIONSHIP_CHECK config parameter, if it is set to true:

  1. If authorize_with of medication request request is not empty and contains authentication method with type = THIRD_PERSON - validate that person from value is an approved confidant for a person from request – exists active and approved confidant person relationship between person from request and person_id from authentication method value (using following logic: https://e-health-ua.atlassian.net/wiki/spaces/CSI/pages/17667883028 with person_id = person_id from request and confidant_person_id = value from auth method - expected :ok, :approved response)

    1. in case of error - return 422 ('Cannot be verified by method with not approved confidant person relationship' 'Auth method is not active or confidant person relationship is invalid')

Service Logic

Save signed medication request to media storage

  1. Get url for medication request upload.

  2. Upload signed medication request request to media storage

Parameter

Source

Parameter

Source

action

GET

bucket

from MEDIA_STORAGE_MEDICATION_REQUEST_REQUEST_BUCKET chart var

resource_id

medication_request_id

resource_name

signed_content

Create medication request

  1.  Create new record in medication_requests with status ACTIVE

    1. if there is existing record in the medication_requests table with the same id and medication_request_request_id, return ok to IL

  2. Mapping (where <rd>medication_request_request.data )

Destination

Source

Destination

Source

id

 

request_number

<rd>.request_number

verification_code

<rd>.verification_code

created_at

<rd>.created_at

started_at

<rd>.started_at

ended_at

<rd>.ended_at

dispense_valid_from

<rd>.dispense_valid_from

dispense_valid_to

<rd>.dispense_valid_to

person_id

<rd>.person_id

employee_id

<rd>.employee_id

division_id

<rd>.division_id

medication_id

<rd>.medication_id

medication_qty

<rd>.medication_qty

medical_program_id

<rd>.medical_program_id

status

ACTIVE

is_active

true

recall_at

NULL

recalled_by

 

NULL

recall_reason

 

NULL

request_for_medication_request_id

$.id

inserted_at

:timestamp

inserted_by

user_id

updated_at

:timestamp

updated_by

user_id

intent

<rd>.intent

category

<rd>.category

context

<rd>.context

dosage_instructions

<rd>.dosage_instructions

container_dosage

<rd>.container_dosage

priority

<rd>.priority

prior_prescription

<rd>.prior_prescription

authorize_with

<rd>.authorize_with

Generate printout form

Invoke ael.api in order to render MEDICATION_REQUEST_TEMPLATE

Template parameters

Parameter

Source

Parameter

Source

<%=get_in(assigns, ~w(request_number)a) %>

bar code

<%= render_barcode(assigns[:request_number], xdim: 2, margin: 0) %>

request_number

<%=get_in(assigns, ~w(created_at)a) %>

created_at

<%=get_in(assigns, ~w(dispense_valid_to)a) %>

dispense_valid_to

<%=get_in(assigns, ~w(program name)a) %>

program.name

<%=get_in(assigns, ~w(person short_name)a) %>

person.short_name

<%=get_in(assigns, ~w(person age)a) %>

person.age

<%=get_in(assigns, ~w(medication name)a) %>

medication.name

<%=get_in(assigns, ~w(medication_qty)a) %>

medication_qty

<%=get_in(assigns, ~w(started_at)a) %>

started_at

<%=get_in(assigns,~w(ended_at)a) %>

ended_at

<%=get_in(assigns, ~w(dosage_instruction_text)a) %>

dosage_instruction_text

<%=get_in(assigns, ~w(employee short_name)a) %>

employee.short_name

<%=get_in(assigns, ~w(employee phone_number)a) %>

employee.phone_number

<%=get_in(assigns, ~w(legal_entity name)a) %>

legal_entity.name

<%=get_in(assigns, ~w(division name)a) %>

 

division.name

<% division_address = get_in(assigns, ~w(division address)a) %>

 

<%=Keyword.get(division_address, :zip) %>
<%=Keyword.get(division_address, :street_type) %>
<%=if Keyword.get(division_address, :street) do %>
<%=Keyword.get(division_address, :street) %>, <% end %>
<%=if Keyword.get(division_address, :building) do %> буд.
<%=Keyword.get(division_address, :building) %>, <% end %>
<%=if Keyword.get(division_address, :apartment) do %> кв.
<%=Keyword.get(division_address, :apartment) %>, <% end %>
<%=Keyword.get(division_address, :settlement_type) %>
<%=if Keyword.get(division_address, :settlement) do %>
<%=Keyword.get(division_address, :settlement) %>, <% end %>
<%=if Keyword.get(division_address, :region) do %>
<%=Keyword.get(division_address, :region) %> район, <% end %>
<%=if Keyword.get(division_address, :area) do %>
<%=Keyword.get(division_address, :area) %> область <% end %>

legal_entity.address

<%=get_in(assigns, ~w(legal_entity edrpou)a) %>

legal_entity.edrpou

<% legal_entity_license = get_in(assigns, ~w(legal_entity license)a) %>

legal_entity.license

<%=Keyword.get(legal_entity_license, :license_number) %>

legal_entity.license.license_number

<%=Keyword.get(legal_entity_license, :what_licensed) %>

legal_entity.license.what_licensed

<%=Keyword.get(legal_entity_license, :issued_date) %>

legal_entity.license.issued_date

<%=Keyword.get(legal_entity_license, :issued_by) %>

legal_entity.license.issued_by

<%=Keyword.get(legal_entity_license, :active_from_date) %>

legal_entity.license.active_from_date

<%=Keyword.get(legal_entity_license, :expiry_date) %><

legal_entity.license.expiry_date

<%=Keyword.get(legal_entity_license, :order_no) %>

legal_entity.license.order_no

<%=get_in(assigns,
~w(person authentication_method)a) %>

person.authentication_method

<%=get_in(assigns, ~w(program mr_blank_type)a) %>

program.mr_blank_type

getFromDictionary(<rd>.container-dosage.unit;'MR_BLANK_TYPES')

<%=get_in(assigns, ~w(program funding_source)a) %>

 

<% funding_source = get_in(assigns, ~w(program funding_source)a) %> <%= if funding_source = "PERSON" do %>повна оплата пацієнтом<% else if funding_source in ["NHS", "LOCAL"]) %>з доплатою/безоплатно<% else %><% end %> 

program.funding_source

 

 

<%= if funding_source == "PERSON" do %><% else %><%= if funding_source in ["NHS", "LOCAL"] do %> <tr> <td>Власник програми:</td> <td><%=get_in(assigns, ~w(program funding_source_text)a) %></td> </tr> <% end %><% end %>

 

program.funding_source_text

if {program.funding_source}<>"PERSON" then

getFromDictionary({program.funding_source},'FUNDING_SOURCE)'

else ""

endif

<%=get_in(assigns, ~w(person age_unit)a) %>

person.age_unit

returns in years ("р.")

<%=get_in(assigns, ~w(medication innm_primary_denumerator_unit)a) %>

medication.innm_primary_denumerator_unit

getFromDictionary({innm_primary.dosage.denumerator_unit};'MEDICATION_UNIT'),

<%=get_in(assigns, ~w(container_dosage value)a) %>

container_dosage.value

<rd>container_dosage.value

 

<%=get_in(assigns, ~w(container_dosage unit)a) %>

container_dosage.unit

getFromDictionary(<rd>container_dosage.unit;'MEDICATION_UNIT')

Medication request form example: 

Update Medication request Request status

Update Medication request Request:

Send SMS for person 

If MR has program with medical program setting request_notification_disabledtrue, then don't send SMS.

Else:

  1. Get authentication_method from authorize_with (if exists and not empty), else get authentication_method of MPI

  2. If authentication_method == OTP -  send SMS:

    1. Generate text SMS (call Man method- templates rendering service with template "TEMPLATE_SMS_FOR_SIGN_MEDICATION_REQUEST".

    2. Sending SMS for MPI

  3. If authentication_method == OFFLINE -  set medication_request_request.verification_code to MEDICATION_REQUEST_TEMPLATE

Calculate and set remaining quantity for the activity

  1. If the medication request request is based on activity with quantity:

    1. recalculate and set remaining_quantity for the activity as described at PreQualify Medication Request: 6.Check Care Plan and Activity (p. 2.d )

ЕСОЗ - публічна документація