Специфікація
Ціль
Даний веб-сервіс розроблений для створення запиту на рецепт
Є два види запиту на рецепт:
plan - Запит відображає намір на формування мед. препаратів без необхідності підтвердження дії. Запит на рецепт з типом план не може бути відпущений та тільки надає інструкцію для адміністрування мед препаратів.
order - Запит відображає намір запиту/вимоги авторизації на дію. Запит на рецепт з типом запит може бути відпущений
Авторизація
Перевірити валідність токену доступу
Перевірити скоупи користувача (scope = 'medication_request_request:write') на можливість виконання даної дії
в разі помилки - надіслати у відповіді код 401
Перевірити запит (JSON schema)
Перевірити запит використовуючи схему JSON.
в разі помилки повернути код 422 з повідомленням ("required property %{property} was not present")
Перевірити співробітника
Ціль валідації: Перевірити співробітника на можливість створення запиту на рецепт.
Забрати 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 = <XXX>
в разі помилки повернути код 422 з повідомленням ("Employee type can't create medication request with medical program from request")
якщо 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)
перевірити запит на відповідність: /wiki/spaces/MRIN/pages/2041217051
в разі 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 (або відсутня)
перевірити запит у відповідності до логіки: /wiki/spaces/MRIN/pages/2041217051
в разі 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
Якщо вона має 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")
Перевірити параметри 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“
Перевірити множинність та запит на рецепт дозволений учасникам
Ціль валідації: Запит кількості повинен містити множинність 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")
Згенерувати номер та verification_code для рецепту
Згенерувати номер для рецепту (See specs)
Structure number XXXX-1234-5678-9012-345-C , where: - XXXX - series: numbers + only some letters (A, E, H, K, M, P, T, X) - 1234-5678-9012-345 - randomly generated numbers - C - checksum: Should be calculated using the Damn algorithm or Verhoeff algorithm After new Request number was generated we should check that it is unique in the DB (entity: medication_request + medication_request_request
Згенерувати verification_code для MPI.person_authentication_methods == OTP або OFFLINE
Structure code 1234, where: - 1234 - randomly generated numbers
Згенерувати рецепт
Встановити:
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 та повернути зашифрований номер (в будь-якому випадку)
"urgent": { "authentication_method_current": { "type": "OTP", "number": "+38093*****85" } } |