ЕСОЗ - публічна документація
Create Medication request Request_UA
- 1 Призначення
- 2 Специфікація
- 3 Логіка
- 4 Передумови
- 5 Вхідні параметри
- 6 Фільтри
- 7 Структура запиту
- 8 Авторизація
- 9 Headers
- 10 Перевірити запит
- 11 Перевірити дані запиту
- 11.1 Перевірте поле container_dosage
- 11.2 Перевірити пріоритет
- 11.3 Перевірити prior_prescription
- 11.4 Перевірити співробітника
- 11.5 Перевірити підрозділ
- 11.6 Перевірити юридичну особу
- 11.7 Перевірити персону
- 11.8 Перевірити дати
- 11.9 Перевірити препарат
- 11.10 Перевірити контекст
- 11.11 Перевірити інструкцію дозування
- 11.12 Перевірити based_on
- 11.13 Перевірити медичну програму
- 11.14 Перевірити множинність та запит на рецепт дозволений учасникам
- 12 Параметри, які застосовуються при опрацюванні запиту
- 12.1 Конфігураційні параметри
- 12.2 Довідники
- 13 Обробка
- 14 Структура відповіді
- 15 Подальша обробка
- 16 HTTP статус коди
- 17 Зворотна сумісність
Призначення
Даний веб-сервіс розроблений для створення запиту на рецепт
Є два види запиту на рецепт:
plan - Запит відображає намір на формування мед. препаратів без необхідності підтвердження дії. Запит на рецепт з типом план не може бути відпущений та тільки надає інструкцію для адміністрування мед препаратів.
order - Запит відображає намір запиту/вимоги авторизації на дію. Запит на рецепт з типом запит може бути відпущений
Специфікація
Link | Посилання на Apiary або Swagger | |
Resource | /api/medication_request_requests | Посилання на ресурс, наприклад: /api/persons/create |
Scope | medication_request_request:write | Scope для доступу |
Components | ePrescription | Зазначається перелік бізнес компонентів, які використовують цей метод, наприклад: ePrescription |
Microservices | Немає даних | Перелік мікросервісів, які використовує метод API, наприклад: Auth, ABAC |
Protocol type | REST | Тип протоколу, який використовується запитом, наприклад: SOAP | REST |
Request type | POST | Тип запиту API, наприклад: GET, POST, PATCH… |
Sync/Async | Sync | Метод є синхронним чи асинхронним? |
Логіка
Процеси роботи з випискою електронних рецептів
Передумови
Лише автентифіковані та авторизовані користувачі з відповідним скоупом можуть створювати запит на лікування (MRR)
Пацієнт повинен зберігатися в хешованому вигляді відповідно до вимог безпеки.
Вхідні параметри
ATTRIBUTES - see on Apiary
Фільтри
Немає
Структура запиту
Дивись на Apiary
Приклад:
Авторизація
Перевірити валідність токену доступу
в разі помилки - повернути 401 (“Invalid access token”) в разі невалідних валідацій
Перевірити, що токен дійсний
в разі помилки - повернути 401 (“Invalid access token”)
Перевірити скоупи користувача (scope = 'medication_request_request:write') на можливість виконання даної дії
в разі помилки - надіслати у відповіді код 401
Якщо BLOCK_UNVERIFIED_PARTY_USERS є true, тоді перевірити дані співробітника на свіпадіння наступним умовам: verification_status != NOT_VERIFIED або (verification_status = NOT_VERIFIED та updated_at <= current_date - UNVERIFIED_PARTY_PERIOD_DAYS_ALLOWED):
в разі неспівпадіння - повернути 403 ("Access denied. Party is not verified")
Headers
Content-Type:application/json
Authorization:Bearer c2778f3064753ea70de870a53795f5c9
Перевірити запит
Перевірити запит використовуючи схему JSON.
В разі помилки повернути код 422 з повідомленням ("required property %{property} was not present")
Перевірити дані запиту
Перевірте поле container_dosage
$.container_dosage - об'єм основного контейнера ліків, який вимагається лікарем або видачею запиту на ліки для видачі пацієнту.
Перевірте поле $.container_dosage за допомогою схем
$.container_dosage.code і $.container_dosage.value мають бути заповнені
у разі помилки повертає помилку 422 ("необхідна властивість %{property} відсутня")
$.container_dosage.system має бути «MEDICATION_UNIT»
у разі помилки повертає помилку 422 ("значення не допускається в enum")
якщо $.container_dosage заповнено, то $.container_dosage.unit слід перевірити за допомогою словника MEDICATION_UNIT за допомогою $.container_dosage.code як ключа.
у разі помилки повертає помилку 422 ("значення не допускається в enum")
Перевірити пріоритет
Перевірте за схемами, чи $.priority заповнено значенням словника MEDICATION_REQUEST_PRIORITY
у разі помилки повертає помилку 422 ("значення не допускається в enum")
Перевірити prior_prescription
Переконайтеся, що $.prior_prescription є UUID, існує та належить цій особі:
is_active = true, і та сама особа.
у разі помилки - повернути 422 (повідомлення: "Попередній рецепт не знайдено")
Перевірити співробітника
Ціль валідації: Перевірити співробітника на можливість створення запиту на рецепт.
Забрати employee_id з запиту
Перевірити співробітника
На існування
в разі помилки повернути код 422 з повідомленням ("Employee not found")
Перевірити, що $.employees.status == APPROVED
в разі помилки повернути код 409 з повідомленням ("Employee is not active")
Перевірити, що $.employees.legal_entity_id == client_id from token
в разі помилки повернути код 422 з повідомленням ("Employee does not belong to legal entity from token")
Перевірити, що $.employees.employee_type == <employee_type>
якщо medical_program_id є в запиті перевірити medical_program_settings.skip_employee_validation == false (або відсутня)
перевірити <employee_type>
отримати $.medical_programs.medical_program_setting по medical_program_id з запиту
перевірити, що employee_type наявна в параметрі employee_types_for_create_medication_request
в разі помилки повернути код 422 з повідомленням ("Employee type can't create medication request with medical program from request")
якщо employee_type = DOCTOR
отримати $.declarations by employee_id, person_id, status=ACTIVE або перевірити параметр MEDICATION_REQUEST_DECLARATION_VERIFY (який дозволяє створити запит на рецепт для будь-якого лікаря в LE де персона має декларацію)
якщо не знайдено - повернути код 422 (повідомлення: "Employee must have an active declaration with the patient to create medication request!")
якщо employee_type = SPECIALIST
отримати $.employees.speciality.speciality(speciality_officio == true)
перевірити, що вказана спеціальність in$.medical_programs.medical_program_setting.speciality_types_allowed variable
в разі помилки повернути код 422 з повідомленням ("Employee's specialty doesn't allow create medication request with medical program from request")
у випадку, якщо Employee_type = MED_COORDINATOR
і. пропустити перевірку спеціальності в змінній $.medical_programs.medical_program_setting.speciality_types_allowed
якщо medical_program_settings.skip_employee_validation == true або відсутня medical_program_id в запиті, будь-який користувач, який має скоуп може створити запит на рецепт
Перевірити підрозділ
Ціль валідації: Перевірити підрозділ на можливість створення запиту на рецепт.
Отримати Get division details
Перевірити division_id - division_id існує
а разі помилки направити код 422 з повідомленням ("Division not found")
Перевірити Response $.data.status==ACTIVE
якщо не знайдено - повернути код 422 (повідомлення: "Only employee of active divisions can create medication request!")
Підрозділ повинен бути активним або посилатися на поточну legal_entity
is_active = true
status = 'ACTIVE'
division.legal_entity_id = client_id (context)
Перевірити юридичну особу
Ціль перевірки: Перевірити юридичну особу на можливість створенна запиту на рецепт.
Отримати client_id з токену
Перевірити client_id=legal_entity_id
перевірити, що юридична особа існує
в разі помилки повернути код 422 з повідомленням (422 Legal entity not found)
перевірити, що legal_entities.status == ACTIVE
в разі помилки повернути код 422 з повідомленням ("Only active legal entity can provide medication request")
Перевірити персону
Ціль перевірки: Перевірити персону на можливість створення запиту на рецепт.
Отримати Get patient by ID
Перевірити, що person_id - mpi_id існують
в разі помилки повернути код 422 (422 Person not found)
Зберегти перемінні параметри з: $.data.authentication_methods
Перевірити відповідь $.data.is_active==TRUE
якщо не знайдено - повернути помилку з кодом 422 (повідомлення: "Only for active MPI record can be created medication request!")
Первірити статус верифікації персони:
Якщо MRR має based_on з валідною активністю, пропустити перевірку.
В іншому випадку перевірити, що verification_status не рівний NOT_VERIFIED.
в разі NOT_VERIFIED - повернути помилку 409, "Patient is not verified"
Перевірити дати
created_at - схожа з датою погодженя FHIR -> Актуальній даті створення запиту на рецепт
inserted_at - дата, коли запит на рецепт був створений в E-Health
started_at/ended_at - Період лікування. Не може бути меньше ніж дата закінчення MR. Визначається лікарем.
dispence_valid_from - Використовується для перевірки відпуску. Аналогічно для дат створення.
dispense_valid_to - Відпуск валідний з + medication_dispense_period значення параметру. Вказує на дату закінчення строку відпуску.
Ціль валідації: Повинна бути: ended_at >= started_at >= created_at
Перевірити, що created_at, started_at, ended_at в форматі дати
в разі помилки повернути код 422 в повідомленні ("expected \"%{actual}\" to be a valid ISO 8601 date")
Перевірити ended_at >= started_at
якщо помилка - повернути код 422 (повідомлення: "Ended date must be >= Started date!")
Перевірити started_at` >= created_at
якщо помилка - повернути код 422 (повідомлення: "Started date must be >= Created date!")
Перевірити started_at >= current_date()
якщо помилка - повернути код 422 (повідомлення: "Started date must be >= current date!")
Перевірити created_at >= current_date() - mrr_delay_input
якщо помилка - повернути код 422 (повідомлення: "Create date must be = current date!")
Перевірити started_at у відповідності до частоти отримання препаратів
отримати $.medical_programs.medical_program_setting по medical_program_id з запиту
перевірити параметр skip_mnn_in_treatment_period
в разі skip_mnn_in_treatment_period == FALSE (or absent)
перевірити запит на відповідність: PreQualify Medication request#2.Checkabsencethesamemedicationsfortheprograms
в разі skip_mnn_in_treatment_period == TRUE
пропустити перевірку періодичності отримання препаратів
Перевірити created_at у відповідності до періодичності отримання препаратів
отримати $.medical_programs.medical_program_setting по medical_program_id з запиту
перевірити параметр skip_mnn_in_treatment_period
в разі skip_mnn_in_treatment_period == FALSE (або відсутня)
перевірити запит у відповідності до логіки: PreQualify Medication request#2.Checkabsencethesamemedicationsfortheprograms
в разі skip_mnn_in_treatment_period == TRUE
пропустити перевірку періодичності отримання препаратів
Перевірити тривалість періоду (ended_at - started_at):
Якщо медична программа була вказана:
перевірити запит на відповідність логіки: PreQualify Medication request: 7. Validate period
в іншому випадку:
Перевірити, що період рецепту меньше або дорівнює MEDICATION_REQUEST_MAX_PERIOD_DAY параментру з чартів
в разі помилки - повернути код 409 “Period length exceeds default maximum value“
Перевірити препарат
Ціль валідації: Перевірити FK, status `is_active`=TRUE, type = INNM_DOSAGE
Отримати Get INNM Dosage by ID
Перевірити, що medication_id - medication_id існує
в разі помилки повернути код 422 ("Medication not found")
Перевірити код відповіді == 200
в разі помилки - повернути код 422 (повідомлення: "Only medication with type `INNM_DOSAGE` can be use for created medication request!")\
Перевірити відповідь $.is_active==TRUE
якщо не знайдено - повернути код 422 (повідомлення: "Only active innm_dosage can be use for created medication request!")
Перевірити контекст
Перевірити наявність "context"
у разу помилки повернути код 422 “required property context was not present“
Перевірити "context" це активна сутність (не entered-in-error) з відповідного довідника, який належить поточному пацієнту
Перевірити на наявність в колекції сутності $.data.context.identifier.type.coding[0].code з id == $.data.context.identifier.value , який належить поточному пацієнту
в разі помилки повернути код 409 "{$.data.context.identifier.type.coding[*].code} not found"
Перевірити, що сутність не в статусі "entered-in-error"
в разі помилки повернути код 409 "Entity in status "entered-in-error" can not be referenced"
Перевірити інструкцію дозування
Кожний не порожній атрибут повинен бути валідним та посилатися на відповідний довідник або об'єкт
Послідовність повинна бути унікальна включаючи масив інстркцій дозування
в разі помилки повернути код (422, "Sequence must be unique")
Додаткова інструкція повинна посилатися на валідний довідник
$.dosage_instruction[*].additional_instruction.coding[*].system == "eHealth/SNOMED/additional_dosage_instructions"
$.dosage_instruction[*].additional_instruction.coding[*].code це валдіне значення в довіднику "eHealth/SNOMED/additional_dosage_instructions"
в разі помилки повернути код 409 "Incorrect additional instruction"
Місце має посилатися на валдіний довідник
$.dosage_instruction[*].site.coding[*].system == "eHealth/SNOMED/anatomical_structure_administration_site_codes"
$.dosage_instruction[*].site.coding[*].code це валідне місце в довіднику "eHealth/SNOMED/anatomical_structure_administration_site_codes"
в разі помилки повернути код 409 "Incorrect site"
Шлях повинен посилатися на валідний довідник
$.dosage_instruction[*].route.coding[*].system == "eHealth/SNOMED/route_codes"
$.dosage_instruction[*].route.coding[*].code це валідне місце в довіднику "eHealth/SNOMED/route_codes"
в разі помилки повернути код 409 "Incorrect route"
Метод повинен посилатися на валідний довідник
$.dosage_instruction[*].method.coding[*].system == "eHealth/SNOMED/administration_methods"
$.dosage_instruction[*].method.coding[*].code це валідне місце в довіднику "eHealth/SNOMED/administration_methods"
в разі помилки повернути код 409 "Incorrect method"
Дозування та тип дозування повинні посилатися на валідний довідник
$.dosage_instruction[*].dose_and_rate.type.coding[*].system == "eHealth/SNOMED/dose_and_rate"
$.dosage_instruction[*].dose_and_rate.type.coding[*].code це валідне місце в довіднику "eHealth/SNOMED/dose_and_rate"
в разі помилки повернути код 409 "Incorrect dose and rate type"
Перевірити based_on
Якщо вказано, перевірити, що поле є масивом з двома значеннями типу Reference: одна - це валідний ресурс плану лікування, інший - ресурс активності.
Перевірити План лікування:
Від повинен належати тій же персоні, що і набір в MRR
в разі помилки повернути код 422 з повідомленням ("Care plan not found")
Від повинен бути в статусі active
Перевірити вказану активність:
Вона відповідає Плану лікування.
в разі помилки повернути код 422 з повідомленням ("Activity not found")
Вона має activity.detail.kind=medication_request; activity.detail.product_reference=medication_id.
в разі помилки повернути код 422 з повідомленням ("Invalid activity kind")
Вона має статус scheduled, in_progress status
у випадку помилки повернути 422 з повідомленням ("Invalid activity status")
Якщо вона має quantity порахувати remaining quantity:
вибрати всі MRR в статусі NEW які створені на основі даної активності
вибрати всі MR в статусах ACTIVE, COMPLETED які створені на основі даної активності
порахувати зарезервовану на сьогодні кількість, як суму medication_qty у профільтрованому MRR та MR списку, включаючи medication_qty з поточного MRR
порахувати вказану кількість шляхом віднімання зарезервованої кількості з кількості активностей
Перевірити remaining quantity більше або дорівнює 0
в разі помилки повернути код 409 "The total amount of the prescribed medication quantity exceeds quantity in care plan activity"
перевірити, що medical_program_id дорівнює $.activity[].program
в разі помилки повернути код 422 з повідомленням ("Medical program from activity should be equal to medical program from request")
Перевірити started_at/ended_at для запиту рецепту:
Якщо активність плану лікування має detail.scheduled_timing.repeat.bounds_period - перевірити started_at/ended_at включаючи bounds_period
Якщо план активності має detail.scheduled_period - перевірити started_at/ended_at включаючи scheduled_period
в іншому випадку - перевірити started_at/ended_at включаючи care_plan.period
у випадку якщо started_at/ended_at не в межах care_plan.period повернути код 422 з повідомленням ("Invalid care plan period")
Перевірити медичну програму
Перевірити наявність medical_program_id
у разі помилки повернути код 422 (“required property medical_program_id was not present“)
Перевірити, що medical_program_id - medical_program_id існує
в разі помилки повернути код 422 ("Medical program not found")
Перевірити контекст на наявність взаємодії в запиті
в разі помилки повернути 422 ("Context with encounter is required as medical program is present in the request")
Перевірити, що діагнози взаємодії не є пустими в $.encounter.diagnosis
в разі помилки - повернути код 422 ('Encounter without diagnosis can not be referenced')
Перевірити параметри medical_programs.medical_program_setting
перевірити, що care_plan_required == true тоді запит повинен містити based_on на план лікування і активність, що містять ту ж програму
в разі помилки повернути код 422 з повідомленням ("Care plan and activity with the same medical program should be present in request")
Якщо вказано параметр CONDITIONS_ICD10_AM_ALLOWED, то:
Перевірити що первинні діагнози зі взаємодії в контексті має код з довідника eHealth/ICD10_AM/condition_codes
Перевірити, що код діагнозу з CONDITIONS_ICD10_AM_ALLOWED
в разі помилки - повернути 422 “Encounter in context has no primary diagnosis allowed for the medical program“
Якщо вказано параметр CONDITIONS_ICPC2_ALLOWED, то:
Перевірити що первинні діагнози зі взаємодії в контексті має код з довідника eHealth/ICPC2/condition_codes
Перевірити, що код діагнозу з CONDITIONS_ICPC2_ALLOWED
в разі помилки - повернути 422 “Encounter in context has no primary diagnosis allowed for the medical program“
якщо skip_medication_request_employee_declaration_verify = false або null/absent
потім: отримати $.declarations за Employee_id, person_id, status=ACTIVE
якщо не знайдено - повертає помилку 422 "Тільки лікарі з активною декларацією з пацієнтом можуть створювати запит на ліки!
інакше пропустити перевірку декларації на рівні співробітника (if true).
якщо skip_medication_request_legal_entity_declaration_verify = false або null/absent
потім: отримати $.declarations за legal_entity_id співробітника, person_id, status=ACTIVE
якщо не знайдено - повертає помилку 422 "Тільки юридична особа з активною декларацією з пацієнтом може створювати заявку на ліки!"
інакше пропустити перевірку декларації на рівні юридичної особи (якщо правда).
Якщо медична програма має funding_source = LOCAL, викличте перевірку, описану в PreQualify Medication request request | 11.-Check-provision-for-a-programs
Перевірити множинність та запит на рецепт дозволений учасникам
Ціль валідації: Запит кількості повинен містити множинність package_min_qty for пов'язаних препаратів. Результат (Mod або % знак) повинен = 0 .
Також, якщо вказана Medical_program - повинні міститися мед препарати, які `medication_request_allowed`== TRUE для учасників.
Якщо `$.medical_program_id` відображена у додатковому навантажені (non null) - Перевірити наявність (IF EXIST()) medication & participant
якщо не існують - повернути код помилки 404 (повідомлення: "Not found any medications allowed for create medication request for this medical program!")
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 == `DOSTUPNI LIKI` 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
Перевірити, що існує (IF EXIST()) медпрепарат & та отримати комбінацію виробніків
якщо не існує - повернути код помилки 404 (повідомлення: "Not found any active linked medication for this innm dosage!")
SELECT DISTINCT MED.package_min_qty 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 WHERE MI.id == $.medication_id AND MI.type == INNM_DOSAGE AND MI.is_active == TRUE
2. Перевірити множинність (Mod == 0) для всіх елементів в результаті (`$.medication_qty` Mod `MED.package_min_qty` == 0)
а.якщо всі результати для знаку Mod - NOT 0 - повернути код помилки 409 (повідомлення: "The amount of medications in medication request must be divisible to package minimum quantity")
Параметри, які застосовуються при опрацюванні запиту
Конфігураційні параметри
Доступ до методу визначається скоупом medication_request_request:write. Дозвіл на даний скоуп визначається адміністратором Системи шляхом конфігурування скоупів в контексті клієнтів і ролей.
Довідники
Немає даних
Обробка
Згенерувати номер та verification_code для рецепту
Згенерувати номер для рецепту (See specs)
Згенерувати verification_code для MPI.person_authentication_methods == OTP або OFFLINE
Згенерувати рецепт
Встановити:
dispense_valid_from = created_at
dispensed_valid_to = dispensed_valid_from + dispense_period
Заповнити структуру 'data' для відповіді & зберегти в IL.medication_request_requests
Згенерувати наповнення для відповіді
Згенерувати структуру даних відповіді для веб-сервісу
Встановити структуру для IL.medication_request_requests
якщо відповідь VALID доповнити відповідь urgent_data:
отримати authetification_method по person_id та повернути зашифрований номер (в будь-якому випадку)
Структура відповіді
Дивись на Apiary
Приклад:
Подальша обробка
Немає
HTTP статус коди
HTTP статус код | Повідомлення | Що викликало помилку |
---|---|---|
201 | Відповідь |
|
401 |
| Перевірку scope не пройдено |
409 |
| Помилка валідації |
422 |
| Помилка валідації |
Зворотна сумісність
Немає даних
ЕСОЗ - публічна документація