ЕСОЗ - публічна документація
RC_Rx_Create Medication Dispense (modified - UA)
- 1 Ціль
- 2 Специфікація
- 3 Логіка веб-сервісу
- 3.1 Авторизація користувача
- 3.2 Перевірити запит
- 3.2.1 Перевірка схеми
- 3.2.2 Перевірити ЛЗ по програмі
- 3.2.3 Отримати юридичну особу з токену
- 3.2.4 Отримати пати з токену
- 3.2.5 Перевірити FK
- 3.2.6 Перевірити код
- 3.2.7 Перевірити пов'язаний план лікування
- 3.2.8 Перевірити відділення
- 3.2.9 Перевірити рецепт
- 3.2.9.1 Відпуск просрочено
- 3.2.9.2 Відпуск дозволено
- 3.2.10 Перевірити статуси
- 3.2.11 Перевірити ліцензію відділення
- 3.2.12 Перевірити період відпуску
- 3.2.13 Перевірити інші відпуски ЛЗ
- 3.2.14 Перевірити кількість ЛЗ
- 3.2.15 Перевірити кратність ЛЗ
- 3.2.16 Перевірити суму знижки на ліки
- 3.3 Отримати розмір відшкодування за ЛЗ
- 3.4 Логіка сервісу
Ціль
Даний метод був створений для створення бронювання (холд) на лікарський засіб для попередження декількох відпусків по одному рецепту. Даний холд триває деякий час (конфігураційний праметр MEDICATION_DISPENSE_EXPIRATION) після цього переходить в статус EXPIRED
Відпуск ЛЗ можливий тільки по рецепту та протягом періоду вказаного у рецепті (dispense_valid_from, dispense_valid_to)
Dispense details - декілька ЛЗ різних виробників з тією ж діючою речовиною можуть бути відпущені за один раз. Загальний medication_qty повинен бути менше або дорівнювати кількості ЛЗ, вказаних в рецепті
Якщо пацієнт бажає розділити відпуск рецепту на декілька частин, то можливо створити та обробити відпуск рецепту з вказаною кількістю лікарського засобу.
Специфікація
Логіка веб-сервісу
Авторизація користувача
Перевірити валідність токену доступу
Повернути 401 в разі неуспішної валідації
Перевірити скоупи користувачів на можливість виконання даної дії (scope = 'medication_dispense:write')
Повернути 403 в разі невалідних скоупів
Перевірити запит
Перевірка схеми
Перевірити запит на відповідність схемі JSON
Повернути 422 зі списком помилок валідації в разі їх неуспішності (422 EView)
Перевірити ЛЗ по програмі
В разі відпуску ЛЗ пацієнту, вказані medical program, program medication id повинні надатися клієнтом або бути розраховані системою
В разі наявності program medication id в запиті:
Перевірити, що дані id ЛЗ по програмі пов'язані до вказаної медичної програми
в разі помилки - повернути 422 (Invalid program medication id)
Розрахувати program medication id якщвін о відснутній в запиті:
Отримати program_medication_id пов'язаний до медичної програми та ЛЗ
в разі помилки - повернути 422 (There are no active program medications for this program and medication)
Отримати юридичну особу з токену
Отримати legal_entity_id (client_id) з токену
Отримати пати з токену
Отримати party_user (user_id) з токену.
Перевірити FK
Перевірити
legal_entity_id - legal_entity_id існує
В разі помилки - повернути 422:
{:error, [{%{
description: "Legal entity not found",
params: [],
rule: :invalid
}, "$.legal_entity_id"}]} |
Перевірити
medication_request_id - medication_request_id існує
{:error, [{%{
description: "Medication request not found",
params: [],
rule: :invalid
}, "$.medication_request_id"}]} |
Перевірити
party_id - party_id існує
{:error, [{%{
description: "Party not found",
params: [],
rule: :invalid
}, "$.party_id"}]} |
Перевірити
division_id - division_id існує
Перевірити
medical_program_id - medical_program_id існує
5.1 Перевірити, що є contract в PRM.contracts який відповідає наступним вимогам:
Якщо відпуск рецепту має програму, для якої вказано наступні налаштування skip_contract_provision_verify = true, то пропустити валідацію договору.
Перевірити, що є contract в PRM.contracts який відповідає наступним вимогам:
contracts.type==reimbursement
contracts.status==VERIFIED
Дати договору: start_date <= current_date & end_date >= current_date
contracts.contractor_legal_entity_id=token.client_id
$division_id in contract_divisions
contracts.medical_program_id==$.medical_program_id
сontracts.is_suspended ==false
В разі помилки 409 - "Program cannot be used - no active contract exists"
Перевірити всі medication_id (brand_id) - brand_id існують
Перевірити код
Перевірити, що code в запиті рівний коду в medication_request (або обидва пусті)
в разі code наявний в рецепті - він повинен відповідати коду в medication_request
Повернути 401 в разі, якщо код не відповідає (message = "Incorrect code")
в разі code відсутній в запиті - перевірити, що код в medication_request є NULL
Повернути 401 в разі, якщо код в medication_request не NULL (повідомлення = "Missing or Invalid code")
Перевірити пов'язаний план лікування
Якщо (medication_request.based_on наявний і не пусто) ТА medication_program відсутня:
Перевірити план лікування:
Він повинен бути в статусі active
в разі помилки - повернути 409 (повідомлення: "Invalid care plan status")
Період плану лікування end (якщо існує) повинен бути більше поточної дати або дорівнювати.
в разі помилки - повернути 409 (повідомлення: “Care plan expired“)
Перевірити активність плану лікування:
Має статус scheduled, in_progress
в разі помилки - повернути 409 (повідомлення: "Invalid activity status")
Перевірити відділення
Якщо вказано division_id:
Перевірити, що відділення активні
в разі помилки - повернути 409 ("Division is not active")
Перевірити, що відділення належить до юридичної особи користувача
в разі помилки - повернути 409 ("Division does not belong to user's legal entity")
Якщо параметр чарту DISPENSE_DIVISION_DLS_VERIFY включено, то перевірити відділення в списку ДЛС (dls_verified=true)
в разі помилки - повернути 409 "Invalid division dls status"
Якщо параметр чарту вказано MEDICAL_PROGRAM_PROVISION_VERIFY, перевірити, що відділення надає послуги по програмам. Для кожного відділення по програмі перевірити:
Якщо для програми не вказано skip_contract_provision_verify або дорівнює false/null:
що він існує та активний:
в разі помилки - повернути статус =INVALID for a program, rejection_reason= "Division does not provide the medical program"
що він пов'язаний до дійсного договору реімбурсації: contract.start_date <= current_date <= contract.end_date, is_active = true, status = VERIFIED.
в разі помилки - повернути статус=INVALID для програми, rejection_reason="Medical program provision is not related to any actual contract for the current date"
в іншому випадку, якщо skip_contract_provision_verify = true, то пропустити перевірку відділень для медичної програми
Перевірити рецепт
Важливо: Дана перевірка повинна бути виконана тільки якщо medical_program наявна в запиті
Перевірити, що рецепт валідний та доступний для відпуску
Викликати Qualify method
Використати medication_requests.medical_program_id як програму для перевірки
Перевірити, що program_medication_id в запиті на перевірку
Відпуск просрочено
Рецепт просрочено для відпуску в разі $.data[?(@.program_id=medication_requests.medical_program_id)].status = 'INVALID' or program_medication_id відсутній у відповіді
В разі помилки - повернути код 409 (повідомлення = "Medication request can not be dispensed. Invoke qualify medication request API to get detailed info")
Відпуск дозволено
Рецепт дозволено для відпуску у випадку $.data[?(@.program_id=medication_requests.medical_program_id)].status = 'VALID' та program_medication_id наявна у відповіді
Перевірити статуси
Юридична особа повинен бути активний для відпуску ЛЗ
is_active = true
status = 'ACTIVE'
тип в pharmacy_allowed_transactions_le_types
mis_verified = `VERIFIED`
Рецепт поинен бути активним для відпуску ЛЗ
is_active = true
status = 'ACTIVE'
started_at <= current_date() and ended_at >= current_date()
Паті повинен посилатися на активного співробітника в поточному legal_entity
employees.is_active = true
employees.status = 'APPROVED'
employees.legal_entity_id = client_id (context)
Медична програма повинна бути активна для можливості відпуску ЛЗ по даній програмі та дорівнювати програмі в рецепті
is_active = true
request.medical_program_id = medication_requests.medical_program_id
в разі помилки повернути код 409 (`Medical program in dispense doesn't match the one in medication request`)
ЛЗ (brand) повинен бути активним
medications.is_active = true
medications.type = 'BRAND'
ingredients.medication_child_id = medication_request.medication_id and ingredients.is_primary = true
medication_id існує в program_medications (is_active = true)
Перевірити ліцензію відділення
Відділення повинно мати активну ліценцію аптеки для можливості відпуску ЛЗ
Перевірити параметри відділень
division.dls_verified повинні бути дійсні
в будь-якому випадку - повернути помилку 409 ('Invalid division dls status')
Перевірити період відпуску
Перевірити, що дата відпуску в періоді, вказаному в рецепті
dispense_valid_from <= current_date()
dispense_valid_to >= current_date()
Перевірити інші відпуски ЛЗ
Перевірити всі пов'язані відпуски ЛЗ
просумувати medication_qty всіх пов'язаних відпусків ЛЗ < medication_request.medication_qty
статус відпуску ЛЗ в ('NEW', 'PROCESSED')
В разі помилки - повернути помилку 403 (повідомлення = "No more medication dispense could be done with this medication request")
Перевірити кількість ЛЗ
Отримати параметр multi_medication_dispense_allowed з налаштувань програми:
якщо дорівнює true - перевірити, що запитана кількість ЛЗ менше або дорівнює кількості ЛЗ в Рецепті
sum(:medication_qty) <= medication_request.medication_qty
в разі помилки - повернути 422 "Dispensed medication quantity must be lower or equal to medication quantity in Medication Request. Available quantity is #{available_qty}"
якщо дорівнює false (absent) - перевірити, що запитана кілкість ЛЗ дорівнює кількості в рецепті
medication_qty = medication_request.medication_qty
в разі помилки - повернути 422 "Dispensed medication quantity must be equal to medication quantity in Medication Request"
Перевірити кратність ЛЗ
Перевірити, що запитана кількість ЛЗ в відпуску для ЛЗ кратно package_min_qty для цієї medications.id
Mod($medication_qty, medications.package_min_qty) = 0
В разі помилки (якщо хоча б один з ЛЗ не проходить перевірку) - повернути помилку 422
Перевірити суму знижки на ліки
Примітка: Є два різні правила перевірки в залежності від пакету ліків та мінімальної кількості
Якщо мінімальна кількість дорівню кількості пакету - не повинно бути ніякої знижки при розрахунку.
Перевірка 1: Мінімальна кількість пакету дорівнює кількості пакету
Перевірити, що зареєстрована ціна зі знижкою дорівнює допустимому розміру по договору реімбурсації для запитаної кількості ЛЗ (спосіб розрахунку дозволеної кількості для договору реімбурсації нижче)
Перевірка 2: Мінімальна кількість пакету НЕ дорівнює кількості пакету
Перевірити, що запитана ціна зі знижкою менше або дорівнює допустимій кількості по договору реімбурсації (включаючи відхилення) для запитаної кількості ЛЗ (спосіб розрахунку дозволеної кількості для договору реімбурсації нижче)
1 > =
discount_amount/ (((reimbursement_amount/package_qty)*medication_qty)) >= 1 - deviation
В разі помилки - повернути 422 =
Отримати розмір відшкодування за ЛЗ
Існує два способи розрахунку розміру відшкодування за договором реімбурсації:
FIXED - рівень ремібурсації визначений для package_qty без розрахунків
EXTERNAL - рівень ремібурсації або кількість повинен бути розрахований по виклику API
Важливо: Тільки спосіб FIXED дозволено на першому етапі
Отримати кількість відпуску для medication_id відповідно до medical_program_id
Визначити спосіб розрахунку (FIXED, EXTERNAL)
Розрахувати кількість відпуску для запитаної кількості ЛЗ:
Отримати reimbursement_amount з program_medications.reimbursement.reimbursement_amount (для упаковки)
На основі цього, package_min_qty та запитаний розмір medication_qty та дозволений ромір відпуску ((reimbursement_amount/package_qty)*medication_qty)
Логіка сервісу
Отримати skip_medication_dispense_sign з налаштувань медичної програми.
2. Якщо skip_medication_dispense_sign = false або відсутня:
2.1. Перевірити payment_id, payment_amount не присутній в запиті.
В разі наявності - повернути 422 зі шляхом: $.<field_name> та додати повідомлення "schema does not allow additional properties"
2.2. Додати запис до таблиці medication_dispenses:
Параметр | Ресурс | Опис |
---|---|---|
id | UUID | Генерується автоматично |
payment_id | NULL | NULL для записів |
status | Const: NEW | NEW skip_medication_dispense_sign = false |
is_active | Const: TRUE | завжди TRUE для нових записів |
inserted_at | Timestamp: now() | Отримати поточні дату та час |
inserted_by | Token: user_id | Отримати користувача з токену |
updated_at | Timestamp: now() | Отримати поточні дату та час |
updated_by | Token: user_id | Отримати користувача з токену |
2.3. Додати записи до таблиці medication_dispense_details:
Пареметр | Ресурс | Опис |
---|---|---|
id | UUID | Генерується автоматично |
medication_dispense_id | FK: medication_dispense |
|
reimbursement_amount |
|
3. Якщо skip_medication_dispense_sign =
true:
3.1. Перевірити, чи payment_amount наявний в запиті.
в разі відсутності - повернути 422 зі шляхом: $.payment_amount та повідомленням "required property payment_amount was not present"
3.2. Визвати процес Process Medication Dispense, але без перевірки цифрового підпису та збереження підписного контенту в бакет.
3.3. Додати записи як описано на кроках 2.2-2.3, але з наступними відмінностями:
medication_dispenses таблиця
Параметр | Джерело | Опис |
---|---|---|
payment_id | Request: payment_id | опціональний параметр |
payment_amount | Request: payment_amount | обов'язковий параметр |
status | Const: PROCESSED | PROCESSED skip_medication_dispense_sign = true
|
ЕСОЗ - публічна документація