Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: updated from https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/2124972044/8.21.0+PreProd+initial+release+change+log

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

Purpose

This method is designed to create hold (reservation) on medication in order to prevent multiple dispenses under the same Medication Request. This hold lasts certain time (configuration parameter MEDICATION_DISPENSE_EXPIRATION) after with it goes to EXPIRED status

...

Specification

Apiary

WS logic

Authorize user

  1. Verify the validity of access token

    1. Return 401 in case validation fails

  2. Check user scopes in order to perform this action (scope = 'medication_dispense:write')

    1. Return 403 in case invalid scope(s)

...

  1. Check that this program medication id relates to provided medical program and relates to provided medication

    1. In case of error - return 422 (Invalid program medication id)

...

  1. Extract party_user (user_id) from token.

Validate FK

...

  1. Validate 

legal_entity_id - legal_entity_id exists

In case error - return 422 error:

Code Block
languageerl
{:error, [{%{
        description: "Legal entity not found",
        params: [],
        rule: :invalid
      }, "$.legal_entity_id"}]}

...

  1. Validate 

medication_request_id - medication_request_id exists

erl
Code Block
language
{:error, [{%{
        description: "Medication request not found",
        params: [],
        rule: :invalid
      }, "$.medication_request_id"}]}

...

  1. Validate 

party_id - party_id exists

Code Block
languageerl
{:error, [{%{
        description: "Party not found",
        params: [],
        rule: :invalid
      }, "$.party_id"}]}

...

  1. Validate 

division_id - division_id exists

erl
Code Block
language
{:error, [{%{
        description: "Division not found",
        params: [],
        rule: :invalid
      }, "$.division_id"}]}

...

  1. Validate 

medical_program_id - medical_program_id exists

erl
Code Block
language
{:error, [{%{
        description: "Medical program not found",
        params: [],
        rule: :invalid
      }, "$.medical_program_id"}]}

...

  1. contracts.type==reimbursement

  2. contracts.status==VERIFIED

  3. Contract dates: start_date <= current_date & end_date >= current_date

  4. contracts.contractor_legal_entity_id=token.client_id

  5. $division_id in contract_divisions

  6. contracts.medical_program_id==$.medical_program_id

  7. сontracts.is_suspended ==false

In  case of error 409 - "Program cannot be used - no active contract exists"

Validate all medication_id (brand_id) - brand_id exists

Code Block
languageerl
{:error, [{%{
        description: "Medication not found",
",
        params: [],
        rule: :invalid
       params: [],
        rule: :invalid
      }, "$.dispense_details[:index].medication_id"}]}}, "$.dispense_details[:index].medication_id"}]}

Validate related Care plan

If (medication_request.based_on is present and not null) AND medication_program is absent:

  1. Verify Care plan:

    1. It should be in active status

      1. in case of error - return 409 (message: "Invalid care plan status")

  2. Verify care plan Activity:

    1. It has scheduled, in_progress status

      1. in case of error - return 409 (message: "Invalid activity status")

 

Validate code

  1. Check that code in request is equal to code in medication_request (or both is empty)

    1. In case code exists in request - it should match with code in medication_request

      1. Return 401 in case code doesn't match (message = "Incorrect code")

    2. In case code is missing in request - check that code in medication_request is NULL

      1. Return 401 in case code in medication_request is not NULL (message = "Missing or Invalid code")

...

Medication request is prohibited for dispense in case $.data[?(@.program_id=medication_requests.medical_program_id)].status = 'INVALID' or program_medication_id is absent in qualify response

erl
Code Block
language
{
    "meta": {
        "url": "http://dev.ehealth.world/api/medication_requests/ed56699a-4a6d-427c-9b93-33a4a8d0b7b0/actions/qualify",
        "type": "list",
        "request_id": "unrbcrs34t0cinqpe8fb6nu7oem17qim",
        "code": 200
    },
    "data": [
        {
            "status": "INVALID",
            "rejection_reason": "For the patient at the same term there can be only 1 dispensed medication request per one and the same innm!",
            "program_name": "Доступні ліки",
            "program_id": "3c7d7a7f-82c2-4f5c-806e-f1f5b55164a2",
            "participants": []
        }
    ]
}

In case of error - return 409 error (message = "Medication request can not be dispensed. Invoke qualify medication request API to get detailed info")

Dispense is allowed

Medication request is allowed for dispense in case $.data[?(@.program_id=medication_requests.medical_program_id)].status = 'VALID' and program_medication_id is present in qualify response

erl
Code Block
language
{
    "meta": {
        "url": "http://dev.ehealth.world/api/medication_requests/ed56699a-4a6d-427c-9b93-33a4a8d0b7b0/actions/qualify",
        "type": "list",
        "request_id": "unrbcrs34t0cinqpe8fb6nu7oem17qim",
        "code": 200
    },
    "data": [
        {
            "status": "VALID",
            "program_name": "Доступні ліки",
            "program_id": "3c7d7a7f-82c2-4f5c-806e-f1f5b55164a2",
            "participants": []
        }
    ]
}

...

  1. Legal entity should be active in order to dispense medication

    • is_active = true

    • status = 'ACTIVE'

    • type in pharmacy_allowed_transactions_le_types

    • mis_verified = `VERIFIED`

  2. Medication request should be active in order to dispense medication

    • is_active = true

    • status = 'ACTIVE'

    • started_at <= current_date() and ended_at >= current_date()

  3. Party should refer to active employee in current legal_entity

    • employees.is_active = true

    • employees.status = 'APPROVED'

    • employees.legal_entity_id = client_id (context)

  4. Division should be active and refers to current legal_entity

    • is_active = true

    • status = 'ACTIVE'

    • divisions.legal_entity_id = client_id (context)

  5. Medical Program should be active in order to dispense medication under this program and the same as medical program in medication request

    • is_active = true

    • If medication_requests.medical_program_id was set, then check request.medical_program_id = medication_requests.medical_program_id

      • in case of error return 409 Error (`Medical `Medical program in dispense doesn't match the one in medication request`)

  6. Medication (brand) medication should be active

    1. medications.is_active = true

    2. medications.type = 'BRAND'

    3. ingredients.medication_child_id = medication_request.medication_id and ingredients.is_primary = true

    4. medication_id exists in program_medications (is_active = true)

...

Check other Medication Dispenses

...

  1. Check all connected medication dispenses

  • sum of medication_qty of all connected medication dispenses <= medication_request.medication_qty

  • medication dispenses status in ('NEW', 'PROCESSED')

...

  1. Check that requested medication quantity in dispense for all medications is multiplier of packageof package_min_qty for this medications.id

    •  Mod($medication_qty, medications.package_min_qty) = 0

In case of error (if at least one of medication don't pass verification) - return 422 error

Code Block
languageerl
{:error, [{%{
        description: "Requested medication brand quantity is not a multiplier of package minimal quantity",
        params: [],
        rule: :invalid
      }, "$.dispense_details[:index].medication_qty"}]}

...

  1. Check that requested discount price less or equal to allowed reimbursement amount (including deviation) for the requested medication quantity (the way how to calculate allowed reimbursement amount is below)

  • 1 > = discount_amount/ (((reimbursement_amount/package_qty)*medication_qty)) >= 1 - deviation

In case of error - return 422 error

Code Block
languageerl
{:error, [{%{
        description: "Requested discount price doesn't not satisfy allowed reimbursement amount",
        params: [],
        rule: :invalid
      }, "$.dispense_details[:index].discount_amount"}]}

...

  1. Check that requested medication quantity in dispense for all medications is multiplier of packageof package_min_qty for this medications.id

    •  Mod($medication_qty, medications.package_min_qty) = 0

In case of error - return 422 error

language
Code Block
erl
{:error, [{%{
        description: "Requested medication brand quantity is not a multiplier of package minimal quantity",
        params: [],
        rule: :invalid
      }, "$.dispense_details[:index].medication_qty"}]}

...

  1. Check that medication_qty on medication dispense should not exceed the sum of medication_qty already dispensed under this medication request.

    • Find existing medication dispenses by its medication_request_id

    • Count the amount of medication_qty dispensed for this medication request

      1. $.medication_dispense.medication_request_id = $.medication_request.id

      2. $.medication_dispense.status = PROCESSED

      3. $.medication_dispense.medication_qty <= sumpreviously processed(medication_dispense_details.medication_qty)

In case of error - return 422 error

erl
Code Block
language
{:error, [{%{
        description: "Sum of dispense's medication quantity can not be more then medication_request.medication_qty",
        params: [],
        rule: :invalid
      }, "$.dispense_details[:index].medication_qty"}]}

...

Get reimbursement amount

There are two types of calculation of reimbursement amount:

...