Вступ
Веб-сервіс "Submit Encounter Package" дозволяє передавати всі дані, зібрані під час взаємодії до бази даних eHealth використовуючи тільки одина даний сервіс. Тобто такі дані, як медичний стан, обстеження, алергія мають бути об'єднані в один масив даних для того, щоб можна було зареєструвати в eHealth.
Специфікація
Валідації
Authorization
Перевірити валідність токену доступу
В разі помилки повернути 401 ('Access denied')
Перевірити скоупи користувачів encounter:write на можливість виконання даної дії
В разі помилки згенерувати відповідь 403 ('Invalid scopes')
Перевірка запиту
Примітка: Недозволено оновлені операції. Всі ID, вказані як PK, повинні бути унікальні для eHealth.
Перевірити статус пацієнта
db.patients.status для пацієнта повинен бути "active"
в разі помилки повернути 409 - "Patient is not active"
Перевірити запит на відповідність схемі JSON
Повернути 422 зі списком помилок валідації в разі їх неуспішності
Перевірити Visit
$.visit.id унікальний
в разі помилки повернути 422 - "Visit with such id already exists"
$.visit.end заповнено
в разі помилки повернути - "End date of visit must be filled"
Перевірити цифровий підпис
Перевірити, що цифровий підпис належить виконавцю взаємодії
перевірити, що ІПН з цифрового підпису та party.drfo виконавця відповідають
Перевірити, що виконавець взаємодії є поточним користувачем
перевірити, що один зі співробітників користувача є виконавцем взаємодії
перевірити, що client_id з токену == PRM.performer.legal_entity
Перевірити розкодований підписний контент на відповідність схемі JSON
Повернути 422 з переліком помилок валідації в разі їх неуспішності
Перевірити тип юридичної особи
Перевірити юридичну особу з токену: legal_entities.type повинен бути me_allowed_transactions_le_types та legal_entities.status =='active'
Перевірити взаємодію
Загальні перевірки
Перевірити, що encounter id це первинний ключ (Primary Key Validation)
Перевірити, що date в рамках допустимих лімітів
$.encounter.date<= current_date
$.encounter.date>=current_date-encounter_max_days_passed
Перевірити, що "episode" це активна взаємодія, яка належить поточному пацієнту
$.encounter.episode.identifier.value є одним з ME.patinet{patient_id}.episodes{*}.id
в разі помилки повернути 422 "Episode with such ID is not found"
$.encounter.episode.identifier.value це ID взаємодії, яка відповідає вимогам:
ME.patient{patinet_id}.episodes{episode_id}.status = 'active'
в разі помилки повернути 422 "Episode is not active"
ME.patient{patinet_id}.episodes{episode_id}.managing_organization==token.client_id
в разі помилки повернути 422 "Managing_organization in the episode does not correspond to user`s legal_entity"
Перевірити "visit" це візит, який належить поточному пацієнту
Перевірити направлення
Як направлення, воно може бути сформовано в електронному варіанті (зареєстроване в системі) АБО паперове направлення на сервіс
Перевірити ($.encounter.incoming_referrals АБО $.encounter.paper_referral) або відсутній у запиті
Перевірити incoming referrals як направлення (Submit Encounter Data Package#Referencevalidation)
Перевірити paper referral як об'єкт (paper_referral)
Перевірити incoming referrals, що посилається на $.encounter.incoming_referrals[*].identifier.value та має:
..used_by_legal_entity.identifier.value==token.client_id АБО null
в разі помилки повернути 409 "Service request is used by another legal_entity"
..status==active or program_processing_status=in_progress (будь-який статус валідний в разі program_processing_status= in_progress)
в разі помилки повернути 409 "Invalid service request status"
..якщо програма визначена, як program_processing_status=new, in_queue or in_progress
перевірити, що service_request містить параметр based_on
в разі based_on наявний в service_request
перевірити care_plan:
Він має бути в статусі active
Дата періоду плану лікування end (якщо існує) повинна бути більше поточної дати.
перевірити activity:
Якщо має activity.detail.kind=service_request; activity.detail.product_reference=service_id.
Якщо має статус scheduled, in_progress
в разі based_on не присутня в запиті, пропустити попередні перевірки.
Перевірити performer
$.encounter.performer.identifier.value це ID існуючого співробітника в PRM.Employees
в разі помилки повернути "There is no Employee with such id"
$.encounter.performer.identifier.value == PRM.Employees.id де (PRM.Employees.status==`active`)
в разі помилки повернути "Employee is not active"
$.encounter.performer.identifier.value == PRM.Employees.id де (PRM.Employees.legal_entity== client_id)
"User can not create encounter for this legal_entity"
перевірити тип співробітника відповідно до encounter.class
в разі помилки повернути 409, "invalid employee type"
division
$.encounter.division.identifier.value повинна відповідати наступним вимогам
PRM.division.status = "ACTIVE"
в разі помилки повернути 409 "Division is not active "
PRM.division.legal_entity= token.client_id
в разі помилки повернути 409 "User is not allowed to create encouners for this division"
Перевірити supporting_info як посилання (Reference validation)
Перевірити encounter.class
відповідно до legal_entity.type - використовуй конфігураційний файл (legal_entity_episode_types)
в разі помилки повернути 409, повідомлення "Encounter.class $class is forbidden for your legal entity type"
відповідно до episode.type - використовуй конфігураційний файл (episode_type_encounter_classes)
в разі помилки повернути 409, повідомлення "Encounter.class $class is forbidden for your episode type"
відповідно до employee.type як вказано в класі валідацій для взаємодії
в разі помилки повернути 409, повідомлення "Encounter.class $class is forbidden for your employee type"
Перевірити encounter.type відповідно до encounter.class - використовуй конфігураційний файл encounter_class_encounter_types
в разі помилки повернути 409, повідомлення "Encounter.type $type is forbidden for your encounter class"
Перевірити actions
Перевірити наявність дій у відповідності до класу валідацій взаємодії
в разі помилки повернути '422', повідомлення 'TBC'
Defined in the system that corresponds to encounter class validations
в разі помилки повернути '422', повідомлення 'TBC'
Перевірити action_references
Примітка. Для encounter.action_references проходять тільки "service", та не проходять "service_group"Перевірити наявність action_references у відповідності до класу валідацій взаємодії
в разі помилки повернути '422', повідомлення 'At least one of action references, diagnostic reports or procedures should exist in encounter package'
Перевірити код посилання (Reference validation)
Перевірити action_references наявна в prm.services, має статус ACTIVE та is_active = true
в разі помилки повернути '422', повідомлення 'Service with such ID is not found'
в разі помилки повернути '422', повідомлення 'Service should be active'
Перевірити diagnoses
Перевірити медичний стан як повилання (Submit Encounter Data Package#Referencevalidation)
Перевірити, що взаємодія має саме один діагноз, де $.encounter.diagnoses[?(@.role.coding[0].code=="primary")]
в разі помилки повернути 422 "Encounter must have exactly one primary diagnosis"
Перевірити condition.id наявна в базі даних або в поточному пакеті взаємодії
Перевірити, що кожний стан активний (verification_status != entered_in_error)
в разі помилки повернути 409 "Conditions in diagnoses must be active"
Перевірити, що первинний діагноз, вказаний в системі, та який посилається на клас валідацій по взаємодії
в разі помилки повернути "Primary diagnosis should be defined in {$.encounter.diagnoses[*].role.coding[*].system } system"
Перевірити reasons
Перевірити посилання на причина, відповілно до класу валідацій по взаємодії
в разі помилки повернути '422', повідомлення 'Validation failed. You can find validators description at our API Manifest: http://docs.apimanifest.apiary.io/#introduction/interacting-with-api/errors .', description 'опис не може бути шаблонним.
Перевірити hospitalization
Пеервірити наявність госпіталізації відповідно до класу валідацій по взаємодії
в разі помилки повернути 422, повідомлення "Hospitalization block is forbidden for encounter.class = $encounter.class"
Перевірити всі поля відповідно до схеми
destination
discharge_disposition
pre_admission_identifier
admit_source
re_admission
discharge_department
Перевірити, що місце госпіталізації валідне з legal_entity в prm зі статусом ACTIVE та is_active = true
в разі помилки повернути 422, "Legal entity is not active"
Перевірити patient_id для encounter.type == "patient_identity"
$patient_id має існувати в mpi.prepersons.id, мати статус =='ACTIVE' та is_active = true
в разі помилки повернути 'TBC', msg 'TBC'
Якщо incoming referrals існує та категорія incoming_referral (service request) не в ('transfer_of_care', 'hospitalization') та encounter.class в ("AMB", "INPATIENT") та encounter.type <> "patient_identity" перевірити сервіс на encounter.actions АБО diagnostic_report.code АБО procedure.code
Якщо service_requests.code.identifier.value це сервіс, перевірити $resourse.code.identifier.value = service_requests.code.identifier.value
в разі помилки повернути 409, "Service in $resourse differ from service in service request"
Якщо service_requests.code.identifier.value це service_group, перевірити $resourse.code.identifier.value в (SELECT service_id from service_inclusions where service_group_id='service_requests.code.identifier.value')
в разі помилки повернути 409, "Service in $resourse differ from services in service request's service_group"
Перевірити $resourse.service.is_active = true
в разі помилки повернути 409, "Service should be active"
18. Якщо пацієнт це person - перевірити статус verification:
Якщо для взаємодії вказано incoming referral з направленням, пропустити дану валідацію.
В іншому випадку перевірити, що verification_status не дорівнює NOT_VERIFIED.
в разі NOT_VERIFIED - повернути помилку 409, "Patient is not verified"
Валідації для класу взаємодії
Важливо
Дані перевірки можуть бути використані для всіх типів взаємодій окрім covid.
Валідація | Первинна медична допомога | Амбулаторія | Стаціонар |
---|---|---|---|
employees.type | 'DOCTOR' | 'SPECIALIST' | 'SPECIALIST' |
encounter.type | як вказано в файлі конфігурації encounter_class_encounter_types | як вказано в файлі конфігурації encounter_class_encounter_types | як вказано в файлі конфігурації encounter_class_encounter_types |
actions |
| відсутній в запиті | відсутній в запиті |
diagnoses | diagnoses.primary є станом з кодом з довідника "eHealth/ICPC2/condition_codes" | diagnoses.primary є станом з кодом з довідника "eHealth/ICD10_AM/condition_codes" | diagnoses.primary є станом з кодом з довідника "eHealth/ICD10_AM/condition_codes" |
reasons |
|
|
|
hospitalisation | відсутній в запиті | відсутній в запиті | if encounter.type == "discharge" - даний блок є обов'язковим
Для інших типів взаємодій
|
action_references | відсутній в запиті | if encounter.type == "patient_identity"
Для інших типів взаємодій
| if encounter.type == "patient_identity"
Для інших типів взаємодій
|
division | Відділення повинне бути заповнене |
Перевірити стани
Перевірити id станів як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст станів це поточна взаємодія
$.conditions[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the condition"
Перевірити залежність коду на клас взаємодії
якщо $.encounter.class = PHC - дозволяються обидва eHealth/ICPC2/condition_codes та eHealth/ICD10_AM/condition_codes
якщо $.encounter.class в (AMB, INPATIENT) - дозволено тільки eHealth/ICD10_AM/condition_codes
Перевірити, що code.coding відповідає кількості кодів
Максимум один код з довідника дозволено (eHealth/ICPC2/condition_codes та eHealth/ICD10_AM/condition_codes)
в разі помилки повернути 422 з повідомленням "Only one code from one dictionary is allowed"
Перевірити, що дата в допустимих лімітах
$.conditions[*].onset_date <= current_date
в разі помилки "Onset date must be in past"
$.condition[*].onset_date>=current_date-condition_max_days_passed
в разі помилки "Onset date must be greater than {{current_date-condition_max_days_passed}}"
$.conditions[*].onset_date <= current_date
в разі помилки "Onset date must be in past"
$.conditions[*].asserted_date <= current_date
в разі помилки "Asserted date must be in past"
$.conditions[*].evidences[*].detail[*].identifier.value це ID існуючого обстеження в MedicalEvents.Observations або один з $.observations[*]
в разі помилки 409 "Observation with such id is not found"
$.conditions[*].evidences[*].detail[*].identifier.value meet follownig conditions
MedicalEvents.Observation.Patient == patient_id (from url)
Помилка 409 "Evidence can not reference another patient"
MedicalEvents.Observation.Status != "entered_in_error"
Помилка 409 "Observation in "entered_in_error" status can not be used as an evidence"
перевірити asserter. Та додаткова перевірка:
якщо primary_source = true та code має значення довідника eHealth/ICD10_AM/condition_codes:
визначити дозволені спеціалізація для кодів станів ICD10_AM набір перемінних чартів ICD10_AM_<SPECIALITY_TYPE>_SPECIALITY_CONDITIONS_ALLOWED
перевірити, що спецільність asserter дозволена спеціальність, визначена на попередньому кроці
в разі, якщо спеціальність не дозволена для коду станів - повернути помилку 409 ('Asserter has no required speciality to set condition code <ICD10_AM code>')
Перевірити обстеження
Перевірити id обстежень, як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст обстежень - це поточна взаємодія
$.observations[*].context.identifier.value==$.encounter.id
в разі помилки повернути "Submitted context is not allowed for the observation"
Перевірити, що дата в допустимих лімітах
$.observations[*].issued <= current_time
в разі помилки повернути "Issued date must be in past"
$.observations[*].issued>=current_date-observation_max_days_passed
в разі помилки повернути "Issued must be greater than {{current_date-observation_max_days_passed}}"
Перевірити performer(asserter)
Перевірити $.observations[*].components[*].value_period відповідає Period
Перевірити $.observations[*].value_quantity
$.observations[*].value має бути з типом номеру
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].comparator може мати наступні значення: [">", ">=", "=", "<=", "<"]
в разі помилки повернути "value is not allowed in enum"
$.observations[*].unit може мати значення з довідника eHealth/ucum/units
в разі помилки повернути "value is not allowed in enum"
Перевірити $.observations[*].value_codeable_concept
$.observations[*].code перевірити, що коди відповідають значенням довідника системи
в разі помилки повернути "Value is not allowed in enum"
Перевірити $.observations[*].value_boolean
$.observations[*].value_boolean має бути типу логічний
в разі помилки повернути "type mismatch. Expected boolean but got {entered type}"
Перевірити $.observations[*].value_string
$.observations[*].value_string має бути типу рядок
в разі помилки повернути "type mismatch. Expected string but got {entered type}"
Перевірити $.observations[*].value_sampled_data
$.observations[*].data має бути типу рядок
в разі помилки повернути "type mismatch. Expected string but got {entered type}"
$.observations[*].origin має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].period має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].factor має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].lower_limit має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].upper_limit має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
$.observations[*].dimensions має бути типу число
в разі помилки повернути "type mismatch. Expected number but got {entered type}"
Перевірити $.observations[*].value_range
$.observations[*].low має бути типу об'єкт
в разі помилки повернути "type mismatch. Expected object but got {entered type}"
$.observations[*].high має бути типу об'єкт
в разі помилки повернути "type mismatch. Expected object but got {entered type}"
Перевірити $.observations[*].value_ratio
$.observations[*].numerator має бути типу об'єкт
в разі помилки повернути "type mismatch. Expected object but got {entered type}"
$.observations[*].denominator має бути типу об'єкт
в разі помилки повернути "type mismatch. Expected object but got {entered type}"
Перевірити $.observations[*].value_time
$.observations[*].value_time має бути типу рядок
в разі помилки повернути "type mismatch. Expected string but got {entered type}"
Перевірити $.observations[*].value_date_time
$.observations[*].value_date_time має бути типу рядок
в разі помилки повернути "type mismatch. Expected string but got {entered type}"
Перевірити, що діагностичний звіт це один зі звітів поточного пакету
$.observations[*].diagnostic_report.identifier.value == one of $.diagnostic_report[*].identifier.value
в разі помилки повернути "Invalid reference"
Перевірити $.observations[*].reaction_on
перевірити, що відповідний immunizations.status != "entered_in_error"
в разі помилки повернути 409 "Immunization with status ‘entered_in_error’ can not be use"
Перевірити $.observations.code
Якщо observations.code.coding[*].code значення включено в чарт параметри ‘OBSERVATION_CODES_WITH_<VALUE_TYPE>_REQUIRED', <value_type> поле обов’язкове
в разі помилки повернути 422 “This field is required for code = <code>“
Перевірити обстеження для encounter.type == "patient_identity"
EDP з типом == "patient_identity" має містити список спеціальних обстежень.
Такий список может містити обмеженний набір кодів, деякі з них обов'язкові
Код | M/O |
---|---|
height | M |
weight | M |
sex | M |
stature | O |
eye_colour | O |
hair_ color | O |
hair_length | O |
beard | O |
mustache | O |
clothes | O |
peculiarity | O |
Перевірити щеплення
Перевірити id щеплень як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст щеплень в поточній взаємодії
$.immunizations[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the immunization"
Перевірити, що дати в допустимих лімітах
$.immunizations[*].date <= current_time
в разі помилки повернути "Date must be in past"
$.immunizations[*].date>=current_date-immunization_max_days_passed
в разі помилки повернути "Date must be greater than {{current_date-immunization_max_days_passed}}"
Перевірити виконавця відповідно до Rule
Перевірити, що обстеження вказані, як деталі реакції, для обстеження по поточному пацієнту
$.immunizations[*].reactions[*].detail.identifier.value є ID існуючого обстеження в ME.observations де (ME.observations.patient_id==patient_id з url) АБО один з $.observations[*].id
в разі помилки повернути 422 "There is no observation with such id"
Перевірити алергії
Перевірити id алергій як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст allergy_intolerances є для поточної взаємодії
$.allergy_intolerances[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the allergy_intolerances"
Перевірити виконавця відповідно до Rule
Перевірити, що дати в допустимих лімітах
$.allergy_intolerances[*].onset_date_time<= current date_time
в разі помилки повернути "Onset date time must be in past"
$.allergy_intolerances[*].onset_date_time>=current_date-allergy_intolerance_max_days_passed
в разі помилки повернути "Onset date time must be greater than {{current_date-allergy_intolerance_max_days_passed}}"
Перевірити, що дата запису asserted_date в минулому
$.allergy_intolerances[*].asserted_date<= current date_time
в разі помилки повернути "Asserted date must be in past"
Перевірити, що last_occurrence в минулому
$.allergy_intolerances[*].last_occurrence<= current date_time
в разі помилки повернути "Last occurrence must be in past"
Перевірити оцінку ризику
Перевірити id оцінки ризику як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст risk_assessments по поточній взаємодії
$.risk_assessments[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the risk_assessments"
Перевірити, що asserted_date в допустимих лімітах
$.risk_assessments [*].asserted_date<= current date_time
в разі помилки повернути "Asserted date must be in past"
$.risk_assessments [*].asserted_date>=current_date-risk_assessment_max_days_passed
в разі помилки повернути "Asserted date must be greater than {{current_date-risk_assessment_max_days_passed}}"
Перевірити виконавця відповідно до Rule
перевірити, що виконавець це лікар з поточного legal_entity
$..performer.identifier.value is an ID of existing employee in PRM.employee
в разі помилки повернути "Employee with such id is not found"
$..performer.identifier.value == PRM.employees.id where (PRM.employees.status == "APPROVED" та PRM.employees.employee_type=="DOCTOR")
"Employee is not an active doctor"
Перевірити, що тільки одне з полів заповнене: reason_reference , reason_codeable_concept
Перевірити, що reason_reference це посилання(Submit Encounter Data Package#Referencevalidation)
Перевірити базис - це посилання(Submit Encounter Data Package#Referencevalidation)
Перевірити when_period як період (Submit Encounter Data Package#period_validationPeriodValidation)
Перевірити, що тільки одне з полів заповнене: prediction.when_period or prediction.when_range
Перевірити, що тільки одне з полів заповнене: prediction.probability_decimal or prediction.probability_range
Перевірити обладнання
Перевірити id обладнання як первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст обладнання по поточній взаємодії
$.devices[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the device"
Перевірити, що asserted_date в допустимих лімітах
$.devices[*].asserted_date<= current date_time
в разі помилки повернути "Asserted date must be in past"
$.devices[*].asserted_date>=current_date-device_max_days_passed
в разі помилки повернути "Asserted date must be greater than {{current_date-device_max_days_passed}}"
Перевірити виконавця відповідно до Rule
Перевірити usage_period як період (Submit Encounter Data Package#period_validationPeriodValidation)
Перевірити прийом лікарських засобів
Перевірити, що id прийому ЛЗ це первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити, що контекст прийому ЛЗ це поточна взаємодія
$.medication_statements[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the medication statement"
Перевірити, що asserted_date в допустимих лімітах
$.medication statements[*].asserted_date<= current date_time
в разі помилки повернути "Asserted date must be in past"
$.medication statements[*].asserted_date>=current_date-medication statement_max_days_passed
в разі помилки повернути "Asserted date must be greater than {{current_date-medication statement_max_days_passed}}"
Перевірити виконавця відповідно до Rule
Перевірити based_on є посиланням (Submit Encounter Data Package#Referencevalidation) на OPS.medication_request
Перевірити управління лікарськими засобами
Перевірити, що id адміністрування ЛЗ це первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити part_of
перевірити, що процедура або medication_administration відносяться до одного і того ж пацієнта
procedure.patient_id=@person_id
medication_administration.patient_id=@person_id
в разі помилки повернути 409 "Procedure/Medication administration was made for another person"
перевірити, що процедура або medication_administration не в статусі `entered_in_error`
в разі помилки повернути 409, "Procedure/Medication administration is not active"
якщо part_of.identifier.value є валідацією процедури та це процедура з бази даних або в бєклозі
в разі помилки повернути 422, "Procedure with such id is not found"
Перевірити ЛЗ
перевірити, що ЛЗ з типом 'BRAND'
в разі помилки повернути 422, "Medication should be of type brand"
ЛЗ посилається на INNM_DOSAGE ЛЗ з request.medication
"select count(*) from ingredients where parent_id=‘medication_administration.medication.id’ and medication_child_id = ‘medication_request.medication_id’ " >=1
в разі помилки повернути 422, "Medication should correspond to the one in request"
Перевірити, що контекст адміністрування ЛЗ в поточній взаємодії
$.medication_administration[*].context.identifier.value == $.encounter.id
в разі помилки повернути "Submitted context is not allowed for the medication administration"
Перевірити performed_date_time <= now()
в разі помилки повернути 422, "performed_date_time should be in the past"
Перевірити виконавця відповідно до Rule
перевірити, що виконавець це активний лікар з поточного legal_entity
$..performer.identifier.value це ID існуючого співробітника з PRM.employee
в разі помилки повернути "Employee with such id is not found"
$..performer.identifier.value == PRM.employees.id where (PRM.employees.status == "APPROVED" та PRM.employees.employee_type в ("DOCTOR","SPECIALIST"))
"Employee is not an active doctor"
перевірити reason_references
перевірити Condition|Observation|DiagnosticReport як посилання
перевірити Condition|Observation|DiagnosticReportне в статусі "entered_in_error"
в разі помилки повернути 409, "Reason reference should be active"
перевірити Condition|Observation|DiagnosticReport виконані для того ж пацієнта
в разі помилки повернути 409, "Reason reference was made for another person"
перевірити Condition|Observation|DiagnosticReport існує в базі даних або в беклог
в разі помилки повернути 422, "Condition|Observation|DiagnosticReport with such id is not found"
Перевірити request
перевірити medication_request як посилання
перевірити medication_request в активному статусі medication_request.status='ACTIVE' та is_active=true
в разі помилки повернути 409, "medication request is not active"
перевірити medication request is made for the same person
в разі помилки повернути 409, "medication request was made for another person"
перевірити medication_request.started_at < now()
в разі помилки повернути 409, "Medication request started at should be in the past"
Перевірити дозування
Перевірити діагностичний звіт
Перевірити, що id діагностичного звіту це первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити based_on як посилання (Submit Encounter Data Package#Referencevalidation)
Перевірити, що service_request, посилається на based_on, та є
в статусі
active
або program_processing_status=in_progress (будь-який статус валідний в разі program_processing_status= in_progress)в разі помилки повернути 409 "Invalid service request status"
якщо програма вказана, то used_by_legal_entity==token.client_id АБО null
в разі помилки повернути 409 "Service request is used by another legal_entity"
якщо програма вказана, то program_processing_status == new, in_queue або in_progress
перевірити, що service_request містить параметр based_on
в разі наявності based_on в service_request
перевірити care_plan:
він має бути в статусі active
Період плану лікування end (якщо вказано) повинен бути більше поточної дати або дорівнювати.
перевірити activity:
що має activity.detail.kind=service_request; activity.detail.product_reference=service_id.
що має статус scheduled, in_progress
в разі based_on не вказано в запиті - пропустити попередні перевірки.
category
Перевірити, що один з діагностичних звітів посилається на категорії сервісів, що вказані в коді в діагностичному звіті
$.diagnostic_report.category[?]=PRM.services.category де PRM.services.id=$.diagnostic_report.code.identifier.value
в разі помилки повернути 422 "None of the diagnostic report categories matches with the service category"
Перевірити code
Перевірити код як посилання (Referencevalidation)
Якщо service_requests.code.identifier.value це сервіс, перевірити $diagnostic_report.code.identifier.value = service_requests.code.identifier.value
в разі помилки повернути 409, "Service in diagnostic_report differ from service in service request"
Якщо service_requests.code.identifier.value це service_group, перевірити $diagnostic_report.code.identifier.value в (SELECT service_id from service_inclusions where service_group_id='service_requests.code.identifier.value')
в разі помилки повернути 409, "Service in diagnostic_report differ from services in service request's service_group"
Перевірити diagnostic_report.service.is_active = true
in case error return 409, "Service should be active"
Перевірити effective_period як період (Submit Encounter Data Package#period_validationPeriodValidation)
Перевірити, що issued в допустимих лімітах
$.diagnostic_reports[*].issued<= current date_time
в разі помилки повернути 422 "Asserted date must be in past"
$.diagnostic_reports[*].issued>=current_date-diagnostic_report_max_days_passed
в разі помилки повернути 422 "Issued must be greater than {{current_date-diagnostic_report_max_days_passed}}"
conclusion_code
Перевірити recorded_by це співробітник (Submit Encounter Data Package#Employeevalidation)
Перевірити encounter
$.diagnostic_reports[*].encounter.identifier.value == $.encounter.id
в разі помилки повернути 409 "Invalid reference"
Перевірити performer.identifier це співробітник (Submit Encounter Data Package#Employeevalidation)
Перевірити managing_organization це поточний legal_entity
$.managing_organization.identifier.value==token.client_id
в разі помилки повернути 409 "Managing organization does not correspond to user's legal entity."
Перевірити result_interpreter.identifier це співробітник (Submit Encounter Data Package#Employeevalidation)
Перевірити result_interpreter.identifier це співробітник з employee_type = DOCTOR або SPECIALIST
Перевірити6 що тільки одне з полів заповнене:
$.diagnostic_report[*].results_interpreter.reference АБО $.diagnostic_report[*].results_interpreter.text
$.diagnostic_report[*].performer.reference АБО $.diagnostic_report[*].performer.text
Перевірити primary_source
Якщо primary_source==true, то
Managing organization ПОВИННА бути заповнена
Якщо primary_source==false, то
report_origin АБО performer.text повинен бути заповнений
performer.reference НЕ повинен бути заповнений
results_enterpreter.reference НЕ повинен бути заповнений
Перевірити процедуру
Перевірити за json schema
Перевірити, що id процедури це первинний ключ (Submit Encounter Data Package#Primarykeyvalidation)
Перевірити code
Перевірити код, як посилання (Referencevalidation)
Перевірити, що procedure.service.is_active = true
в разі помилки повернути 409, "Service is not active"
Перевірити, що service_request, має посилання з based_on, та
перевірити, що service_request містить параметр based_on
в разі based_on наявний в service_request
перевірити care_plan:
він має бути в статусі active
Період плану лікування end (якщо вказано) повинен бути більше поточної дати або дорівнювати.
перевірити activity:
Вона має activity.detail.kind=service_request; activity.detail.product_reference=service_id.
Вона має статус scheduled, in_progress
в разі based_on не вказана в запиті - пропустити попередні валідації.
Перевірити encounter
$.procedure[*].encounter.identifier.value == $.encounter.id
в разі помилки повернути 409, "Submitted encounter is not allowed for procedure"
Перевірити performed_date_time
performed_date_time дійсний
в разі помилки повернути 422, "Performed_date_time in invalid"
performed_date_time <= now
в разі помилки повернути 422 "Procedure cannot be registered in future"
Перевірити recorded_by
Перевірити recorded_by як посилання (Referencevalidation)
$..recorded_by.identifier.value є ID існуючого співробітника в PRM.employee
в разі помилки повернути 422, "Employee with such id is not found"
Перевірити recorded_by це співробітник зі status='APPROVED' та is_active= true та end_date є null або більше поточної дати
в разі помилки повернути 409, "This action is prohibited for current employee"
Перевірити employees.legal_entity_id=$managing_organization.identifier.value
в разі помилки повернути 409, "Employee should be from current legal entity"
Перевірити asserter
Перевірити division
Перевірити відділення як посилання (Referencevalidation)
$division є ID в PRM.divisions
в разі помилки повернути 422, "Division with such id is not found"
division.status=ACTIVE та is_active=true
в разі помилки повернути 409, "Division is not active"
division.legal_entity_id = $client_id або division.legal_entity_id=$managing_organization.identifier.value
в разі помилки повернути 409, "Division is not in current legal_entity"
Перевірити managing_organization це поточний legal_entity з відповідним типом
як посилання (Referencevalidation)
$managing_organization є ID в PRM.legal_entities
в разі помилки повернути 422, "Legal entity with such id is not found"
перевірити для managing_organization статус є 'ACTIVE' та is_active=true
в разі помилки повернути 422 ('Legal entity is not active')
перевірити тип legal_entity є в ('PRIMARY_CARE','MSP','MSP_PHARMACY','MSP_PHARMACY') (використати `ME_ALLOWED_TRANSACTIONS_LE_TYPES` з чартів)
в разі помилки повернути 422, "Legal entity with type $legal_entity.type cannot perform procedures"
перевірити $managing_organization.identifier.value = $client_id
в разі помилки повернути 409 "Managing organization does not correspond to user's legal entity."
Перевірити reason_references
Перевірити reason_reference як посилання (Referencevalidation)
Перевірити reason_refernce.identifier.value є станом не в статусі`entered_in_error`
в разі помилки повернути 422, "Condition is canceled"
Перевірити outcome
перевірити висновок як посилання (Referencevalidation)
перевірити outcome.coding.object.system є в довіднику eHealth/procedure_outcomes
в разі помилки повернути 422, "outcome not in dictionary eHealth/procedure_outcomes"
Перевірити complication_details
перевірити complication_details як посилання (Referencevalidation)
перевірити complication_details.identifier.value посилається на стан в тому ж пакеті взаємодії
в разі помилки повернути 422, "complication_details does not correspond to condition in this encounter package"
Перевірити category
відповідно до довідника 'eHealth/procedure_categories' - по схемі
Перевірити, що категорія процедури відноситься до категорії сервісу, що вказана як код процедури
$.procedure.category=PRM.services.category де PRM.services.id=$.procedure.code.identifier.value
в разі помилки повернути 422 "Procedure category does not match with the service category"
Якщо пацієнт це person - перевірити статус verification:
Якщо процедура включає based_on з направленням, то пропустити валідації.
В іншому випадку перевірити, що verification_status не дорівнює NOT_VERIFIED.
в разі NOT_VERIFIED - повернути помилку 409, "Patient is not verified"
Перевірити клінічну оцінку
Перевірити згідно json schema
Перевірити, що клінічна оцінка це первинний ключ (Primarykeyvalidation)
Перевірити status
Перевірити, що код відповідає значенням словника (eHealth/clinical_impression_statuses)
в разі помлки - повернути 422 ('value is not allowed in enum')
Перевірити, що значення = completed
в разі помлки - повернути 422 ('value is not allowed in enum')
Перевірити code
Перевірити, що код відповідає значенням словника (eHealth/clinical_impression_patient_categories)
в разі помлки - повернути 422 ('value is not allowed in enum')
Перевірити code.coding в залежності від кількості кодів. Максимум один код дозволено
в разі помлки - повернути 422 ('Only one code is allowed')
Перевірити по code.coding[0].code та code.coding[0].system активні правила в rule_engine_rules collection
в разі наявності хочі б одного активного коду - перевірити тільки запит по наступним валідаціям
в разі наявності коду в колекції - перевірити запит з наступними валідаціями та додатковими з налаштувань бізнес-правил
Перевірити description
Перевірити, що тип значення строковий
в разі помилки - повернути 422 ('type mismatch. Expected string but got {entered type}')
Перевірити encounter
Перевірити, що значення є валідним посиланням на ресурс взаємодії
Перевірити, що значення це об'єкт з посиланнями типів взаємодій
в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що значення є валідним посиланням на ресурс взаємодії
Перевірити, що $.clinical_impressions[*].encounter.identifier.value == $.encounter.id
в разі помилки - повернути 422 ('Invalid reference')
Перевірити, що effective_period це період (PeriodValidation)
Перевірити значення в полі $.effective_period
Перевірити, що $.effective_period.start <= encounter.date
в разі помилки - повернути 422 ('Start date must be in the past')
Перевірити, що $.effective_period.end >= $.effective_period.start
в разі помилки - повернути 422 ('End date must be greater than or equal the start date')
Перевірити, шо $.effective_period.end в допустимих лімітах
Перевірити, що $.effective_period.end <= current_time
в разі помилки - повернути 422 ('Date must be in past')
Перевірити, що $.effective_period.end >= current_date-clinical_impression_max_days_passed
в разі помилки - повернути 422 ('Date must be greater than {{current_date-clinical_impression_max_days_passed}}')
Перевірити effective_date_time
Перевірити, що field $.effective_date_time типу строковий
в разі помилки - повернути 422 ('type mismatch. Expected string but got {entered type}')
Перевірити, що поле $.effective_date_time <= current_time
в разі помилки - повернути 422 ('Date must be in past')
Перевірити, що поле $.effective_date_time >= current_date-clinical_impression_max_days_passed
в разі помилки - повернути 422 ('Date must be greater than {{current_date-clinical_impression_max_days_passed}}')
Перевірити assessor
Перевірити, що автор це посилання (Referencevalidation)
$.assessor.identifier.value це ID існуючого співробітника в PRM.employee
в разі помилки - повернути 422 ('Employee with such id is not found')
Перевірити, що це співробітник зі статусом status='APPROVED' та is_active= true та end_date нуль або більше ніж сьогодні
в разі помилки - повернути 422 ('Invalid employee status')
Перевірити previous
Перевірити, що значенням є валідне посилання на ресурс клінічної оцінки
Перевірити, що значення це об'єкт з посиланням на тип clinical_impression
в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що клінічна оцінка активна (status не є entered_in_error)
в разі помилки - повернути 422 ('Clinical impression in "entered_in_error" status can not be referenced')
Перевірити, що клінічна оцінка належить пацієнту ($.subject)
в разі помилки - повернути 422 ('Clinical impression with such id is not found')
Перевірити problems
Перевірити, що значення це масив з посиланнями на тип стану
в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що кожний стан є активним (verification_status не є entered_in_error)
в разі помилки - повернути 422 ('Condition in "entered_in_error" status can not be referenced')
Перевірити, що стан належить пацієнту ($.subject)
в разі помилки - повернути 422 ('Condition with such id is not found')
Перевірити finding
Перевірити, що значення є масив об'єктів
Перевірити item_reference
Перевірити, що значення це об'єкт з посиланнями на ресурси станів, аналізів (далі <Medical event resource>)
в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що <Medical event resource> активний (статус не entered_in_error)
в разі помилки - повернути 422 ('<Medical event resource> in "entered_in_error" status can not be referenced')
Перевірити, що кожне посилання:
валідний ME для визначеного типу вище
належать пацієнту ($.subject)
в разі помилки - повернути 422 (<Medical event resource> with such ID is not found')
Якщо декілька ресурси наявні в активному правилу, перевірити, що вони відповідають зконфігурованим парвилам
в разі помилки - повернути 409 ('Submitted patient category does not correspond to rule engine rule')
Перевірити basis
Перевірити, що значення типу строковий
в разі помилки - повернути 422 ('type mismatch. Expected string but got {entered type}')
Перевірити supporting_info
Перевірити, що знаення це масив посилань типу episode_of_care, procedure, diagnostic report, encounter (further <Medical event resource>)
в разі помилки - повернути 422 ('value is not allowed in enum')
Перевірити, що <Medical event resource> активний (статус не entered_in_error)
в разі помилки - повернути 422 ('<Medical event resource> in "entered_in_error" status can not be referenced')
Перевірити, що кожне посилання:
це валідний ME визначених типів вище
належить пацієнту ($.subject)
в разі помилки - повернути 422 (<Medical event resource> with such ID is not found')
В разі, якщо деякі ресурси наявні в активному правилі, перевірити, що вони відповідають конфігурації по правилу
в разі помилки - повернути 409 ('Submitted patient category does not correspond to rule engine rule')
Перевірити note
Перевірити, що значення типу строковий
в разі помилки - повернути 422 ('type mismatch. Expected string but got {entered type}')
Перевірити patient
В разі, параметри по пацієнту наявні в активному правилі, отримати дані згідно предмету та перевірити, що вони відповідають конфігурації правил
в разі помилки - повернути 409 ('Submitted patient category does not correspond to rule engine rule')
В разі наявності даних по погашенню рецепту в активному правилі, отримати дані погашення рецепту в контексті пацієнта (згідно предмету) та перевірити, що вони відповідають конфігураційним параметрам
в разі помилки - повернути 409 ('Submitted patient category does not correspond to rule engine rule')
Перевірка первинного ключа
Перевірити, що ID всіх вказаних сутностей в масиві унікальні
перевірити, що $.{collection}[*].id з беклогу є всі унікальні серед вказаних
в разі помилки повернути 409 "All primary keys must be unique"
перевірити, що відсутні сутності з таким id у відповідній колекції медичних подій
в разі помилки повернути 422 "{Entity} with such id already exists"
Перевірка посилань
Дана валадція використовується для перевірки посилання на дані медичних подій з колекції пацієнта.
Перевірити, що $..identifier.value це існуюче значення з $..identifier.type.coding[0].code в колекції базі даних та він належить пацієнту АБО це значення з відповідної колекції в поточному запиті
в разі помилки повернути 422 "There is no {$..identifier.type.coding[0].code} with such id"
Перевірити, що дана сутність не в статусі entered_in error
в разі помилки повернути 422 "Could not reference entity in status entered_in_error"
Приклад:
"identifier": { "type": { "coding": [ { "system": "eHealth/resources", "code": "observation" } ] }, "value": "9183a36b-4d45-4244-9339-63d81cd08d9c" } }
В даному разі перевірити, що "9183a36b-4d45-4244-9339-63d81cd08d9c" це існуюче обстеження з колекції пацієнтів та він не в статусі entered_in_error.
Перевірка виконавця
випадок $..primary_source==true
$..performer(or $..asserter) must be filled
в разі помилки повернути "Performer (asserter) must be filled"
$..report_origin must be absent
в разі помилки повернути "Report_origin can not be submitted in case primary_source is true"
перевріти, що виконавець це валдіне значення з відповідного довідника
$..performer.identifier.type.coding[*].system == "eHealth/resources"
в разі помилки повернути "Submitted system is not allowed for this field"
$..performer.identifier.type.coding[*].code=="employee"
в разі помилки повернути "Submitted code is not allowed for this field"
перевірити, що виконавець є активний лікар з поточного legal_entity
$..performer.identifier.value є ID існуючий співробітник в PRM.employee
в разі помилки повернути "Employee with such id is not found"
$..performer.identifier.value == PRM.employees.id де (PRM.employees.status == "APPROVED" та PRM.employees.employee_type=="DOCTOR" або "SPECIALIST") (в разі обстеження також ASSISTANT)
випадок primary_source==false
$..report_origin повинен бути заповнений
в разі помилки повернути "Report_origin must be filled"
якщо $..primary_source==false то $..performer(asserter) повинен бути відсутній
в разі помилки повернути "Performer(asserter) can not be submitted in case primary_source is false"
перевірити report_origin
$..report_origin.coding[*].system == "eHealth/report_origins"
в разі помилки повернути "Submitted system is not allowed for this field"
Перевірка періоду
$..period.start <= current_dateTime
в разі помилки повернути 422- "Start date must be in past"
якщо $..period.end заповнено:
$..period.end > visit.period.start
в разі помилки повернути 422 - "End date must be greater than the start date"
Перевірка співробітника
Користувачі не повинні посилатися на співробтіників з різних юридичних осіб. Співробітники не в статусі `approved` також не можуть бути вказані.
$...identifier.value існує в PRM.employees
в разі помилки 409 "Employee not found"
$...identifier.value == PRM.employees.id де (PRM.employees.status == "APPROVED" та PRM.employees.legal_entity==token.client_id)
в разі помилки 409 "Submitted employee is not an active employee from current legal entity"
Перевірки пов'язаного плану лікування
Якщо сутності (encounter.incoming_referral, procedure.based_on, diagnostic_report.based_on) має посилання на направлення перевірити можливість створення EDP в залежності від service_request[].activity з вказаною кількістю
розрахувати кільксть артефактів, які містяться в $.activity.outcome_reference по service_request.based_on[].activity[].id
розрахувати кільксть артефактів, які містяться в запиті та мають посилання на направлення
порівняти кількість з outcome_reference з кількістю артефактів
перевірити, що різниця більше або дорівнює нулю
в разі помилки повернути 409 "The total amount of the prescribed service quantity exceeds quantity in care plan activity"
Постобробка
Зберегти signed_content до сховища даних
Зберегти дані до відповідної колекції в базі даних
Зберегти посилання на підписний контент до взаємодії
Доповнити encounter.diagnoses:
вибрати condition.code з бази даних по медичим подіям (або з тіла запиту) де condition.id==diagnoses[@].condition.identifier.value
встановити diagnoses[@].code = select 1
Зберегти дагнози зі взаємодії до episodes.current_diagnoses
ME.patients.episodes.diagnoses = $.encounter.diagnoses
Додати запис до ME.patient.episodes{episode_id}.diagnoses_hstr
date = current_date
evidence = reference to encounter ($.encounter.id)
diagnoses = $.encounter.diagnoses
Встановити display_value для співробітників для всіх вказаних об'єктів
Вибрати PRM.parties.first_name, PRM.parties.second_name, PRM.parties.last_name з PRM.parties де (PRM.parties.id == (Select PRM.employees.party_id з PRM.employees де PRM.employees.id== $.care_manager.identifier.value))
ME.patients.encounters{encounter_id}.performer.display== Select 1
ME.conditions{condition_id}.asserter.display == Select 1
ME.observations{observation_id}.performer.display == Select 1
ME.patients.immunizations{immunization_id}.performer.display == Select 1
ME.patients.allergy_intolerance{ai_id}.asserter.display == Select 1
ME.patients.devices{device_id}.asserter.display == Select 1
ME.patients.medication_statements{ms_id}.asserter.display == Select 1
ME.patients.risk_assessment{rs_id}.asserter.display == Select 1
ME.patients.diagnostic_reports{dr_id}.performer.reference.display == Select 1
ME.patients.diagnostic_reports{dr_id}.recorded_by.reference.display == Select 1
ME.patients.diagnostic_reports{dr_id}.results_interpreter.reference.display == Select 1
В разі наявності реакції ($.observations[?].reaction_on) в запиті, оновити вказані щеплення з реакцією:
Встановити в ME.patient.immunization.reaction.detail $.observation.id як посилання
примітка: $.observations[?].reaction_on should not be saved in observation, only in corresponding immunization
Встановити display_value для legal_entities
ME.patients.diagnostic_reports{dr_id}.managing_organization.display
Встановити managing_organization для вказаних observations, conditions, encounter
ME.conditions{cond_id}.managing_organization=token.client_id
ME.observations{observ_id}.managing_organization=token.client_id
ME.encounters{encounter_id}.managing_organization=token.client_id
В разі encounter.incoming_referral було заповнено, встановити episode_origin до взаємодії
Вибрати візит де id== (вибрати ME.encounter.episode.identifier.value де encounter.id==(вибрати ME.service_requests.context.identifier.value де id==$.encounter.incoming_referral.identifier.value))
В разі diagnostic_reports.based_on було заповнено, встановити episode_origin до дігностичного звіту
Вибрати візит де id== (вибрати ME.encounter.episode.identifier.value де encounter.id==(вибрати ME.service_requests.context.identifier.value де id==$.diagnostic_reports.based_on.identifier.value))
В разі encounter.incoming_referral було заповнено, встановити $.encounter.id та зв'язати $.service_request activity[].outcome_reference
В разі procedures.based_on було заповнено, встановити $.procedures.id та зв'язати $.service_request $.activity[].outcome_reference
В разі diagnostic_reports.based_on було заповнено, встановити $.diagnostic_reports.id та зв'язати $.service_request activity[].outcome_reference
Оновити $ .activity.status до in_progress якщо попередній активний статус було заплановано
Оновити параметр $ .activity.remaining_quantity шляхом віднімання кількості артефактів, які мають посилання на сервіс, що містять $.based_on.[]activity
Збагатити дані взаємодії даними performer speciality:
SELECT speciality -> 'speciality' FROM employees WHERE speciality ->> 'speciality_officio' = 'true' AND id = $.encounter.performer.identifier.value
Встановити encounter.performer_speciality як тип CodeableConcept системи = SPECIALITY_TYPE
В разі encounter.clinical_impression наповнити даними з $.context_episode_id в моделі даних clinical_impressions (encounters.context.[].episode.value=clinical_impression.context_episode_id)