Table of Contents | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
Validate encounter id as a primary key
Validate that the date is within acceptable limits
$.encounter.date<= current_date
$.encounter.date>=current_date-encounter_max_days_passed
$.encounter.date>=episode.period.start where episode.id=$encounter.episode.identifier.value
in case of error return 422 "Encounter’s date must be equal to or greater than start date of episode"
Validate that the period is within acceptable limits
$.encounter.period.start<= current_date
in case of error return 422 "Date must be in past"
$.encounter.period.start>=current_date-encounter_max_days_passed
in case of error return 422 "Date must be greater than {{current_date-encounter_max_days_passed}}"
$.encounter.period.start>=episode.period.start where episode.id=$encounter.episode.identifier.value
in case of error return 422 "Encounter’s date must be equal to or greater than start date of episode"
$.encounter.period.end>= $.encounter.period.start
in case of error return 422 "End date must be greater than start date"
Validate "episode" is an active episode that belongs to the current patient
$.encounter.episode.identifier.value is one of ME.patinet{patient_id}.episodes{*}.id
in case of error return 422 "Episode with such ID is not found"
$.encounter.episode.identifier.value is an ID of an Episode that meets the requirements:
ME.patient{patinet_id}.episodes{episode_id}.status = 'active'
in case of error return 422 "Episode is not active"
ME.patient{patinet_id}.episodes{episode_id}.managing_organization==token.client_id
in case of error return 422 "Managing_organization in the episode does not correspond to user`s legal_entity"
Validate "visit" is a visit that belongs to the current patient
$.encounter.visit.identifier.value=$.visit.id OR ID of already existing Visit in ME.patient{patient_id}.visit.id
in case of error return 422 "Visit with such ID is not found"
Validate referrals
As a referral it can be referenced electronic (registered in the system) OR paper service request
Validate ($.encounter.incoming_referrals OR $.encounter.paper_referral) or none in request
Validate incoming referrals as References
Validate paper referral as Object (paper_referral)
Validate incoming referrals that corresponds to $.encounter.incoming_referrals[*].identifier.value have:
..used_by_legal_entity.identifier.value==token.client_id OR null
in case of error return 409 "Service request is used by another legal_entity"
..status==active or program_processing_status=in_progress (any status is valid in case program_processing_status= in_progress)
in case of error return 409 "Invalid service request status"
..if program is defined program_processing_status=new, in_queue or in_progress
check that service_request contains based_on parameter
in case based_on present in service_request
verify care_plan:
It should be in active status
Care plan's period end (if exist) should be greater than current date or equal.
verify activity:
It has activity.detail.kind=service_request; activity.detail.product_reference=service_id.
It has scheduled, in_progress status
in case based_on not present in request skip previous validations.
Check if service request quantity is not exhausted as described athttps://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17061216257/Submit+Encounter+Package#Related-service-request-validation
Validate performer
$.encounter.performer.identifier.value is an ID of existing employee in PRM.Employees
in case of error return "There is no Employee with such id"
$.encounter.performer.identifier.value == PRM.Employees.id where (PRM.Employees.status==`active`)
in case of error return "Employee is not active"
$.encounter.performer.identifier.value == PRM.Employees.id where (PRM.Employees.legal_entity== client_id)
"User can not create encounter for this legal_entity"
validate employee type according to encounter.class - use config file (employee_encounter_classes)
in case error return 422, "Employee.type $type is forbidden for your encounter class"
according to employee.type as stated in employee_encounter_types
in case error return 422, msg "Employee.type $type is forbidden for your encounter type"
division
$.encounter.division.identifier.value must meet the following requirements
PRM.division.status = "ACTIVE"
in case of error return 409 "Division is not active "
PRM.division.legal_entity= token.client_id
in case of error return 409 "User is not allowed to create encouners for this division"
Validate supporting_info as References
Validate encounter.class
according to legal_entity.type - use config file (legal_entity_episode_types)
in case error return 409, msg "Encounter.class $class is forbidden for your legal entity type"
according to episode.type - use config file (episode_type_encounter_classes)
in case error return 409, msg "Encounter.class $class is forbidden for your episode type"
according to employee.type as stated in encounter class validations
in case error return 409, msg "Encounter.class $class is forbidden for your employee type"
Validate encounter.type according to encounter.class - use config file encounter_class_encounter_types
in case error return 409, msg "Encounter.type $type is forbidden for your encounter class"
Validate actions
Validate actions presence according to encounter class validations
in case error return '422', msg 'TBC'
Defined in the system that corresponds to encounter class validations
in case error return '422', msg 'TBC'
Validate action_references
Note. For encounter.action_references pass only "service", and the "service_group" does not passValidate action_references presence according to encounter class validations
in case error return '422', msg 'At least one of action references, diagnostic reports or procedures should exist in encounter package'
Validate code as a Reference
Validate action_references is in prm.services, has status ACTIVE and is_active = true
in case error return '422', msg 'Service with such ID is not found'
in case error return '422', msg 'Service should be active'
Validate that action_references is service with service.category==”counselling” in case encounter.class=”AMB”
in case error return ‘422', msg 'Invalid service category for AMB encounter class'
Validate diagnoses
Validate conditions as References
Validate that encounter type= 'intervention'. If not, than:
Validate encounter has exactly one diagnosis where $.encounter.diagnoses[?(@.role.coding[0].code=="primary")]
in case of error return 422 "Encounter must have exactly one primary diagnosis"
Validate http://condition.id is in DB or in current Encounter package
Validate that each condition is active (verification_status != entered_in_error)
in case of error return 409 "Conditions in diagnoses must be active"
Validate that primary diagnosis defined in the system that corresponds to encounter class validations
in case of error "Primary diagnosis should be defined in {$.encounter.diagnoses[*].role.coding[*].system } system"
Validate that rank
Rank value should be integer and >= 1
in case of error return 422 "expected the value to be >= 1"
Rank value should be integer and <= 10
in case of error return 422 "expected the value to be <= 10"
Validate reasons
Validate reasons presence according to encounter class validations
in case error return 422, msg 'Validation failed. You can find validators description at our API Manifest: Nebo #15 API Manifest · Apiary .', description 'can't be blank.
Validate hospitalization
Validate hospitalization presence according to encounter class validations
in case error return 422, msg "Hospitalization block is forbidden for encounter.class = $encounter.class"
Validate all fields according to schemata
destination
discharge_disposition
pre_admission_identifier
admit_source
re_admission
discharge_department
If encounter.type.code = "discharge" than encounter.hospitalization.admit_source is required, encounter.hospitalization.discharge_disposition is required, encounter.hospitalization.discharge_department is required
in case error return 422, msg "<parameter> is required for encounter.type.code = "discharge"
Validate destination is a valid legal_entity in prm with status is ACTIVE and is_active = true
in case error return 422, "Legal entity is not active"
Validate patient_id for encounter.type == "patient_identity"
$patient_id should exist in mpi.prepersons.id, have status =='ACTIVE' and is_active = true
in case error return 'TBC', msg 'TBC'
If incoming referrals exists and incoming_referral (service request) category not in ('transfer_of_care', 'hospitalization') and encounter.class in ("AMB", "INPATIENT") and encounter.type <> "patient_identity" validate service for encounter.actions OR diagnostic_report.code OR procedure.code
If service_requests.code.identifier.value is service, validate $resourse.code.identifier.value = service_requests.code.identifier.value
in case error return 409, "Service in $resourse differ from service in service request"
if service_requests.code.identifier.value is service_group, validate $resourse.code.identifier.value in (SELECT service_id from service_inclusions where service_group_id='service_requests.code.identifier.value')
in case error return 409, "Service in $resourse differ from services in service request's service_group"
Validate $resourse.service.is_active = true
in case error return 409, "Service should be active"
Validate patient verification status:
If encounter has incoming referral with valid and active service request, then skip this validation.
Else check patient's verification_status is not equal to NOT_VERIFIED.
in case of error return 409, "Patient is not verified"
Validate priority
Validate priority presence according to eHealth/encounter_priority
in case error return 409, ""
If encounter.class.code = "INPATIENT", priority is required
in case error return 422, "Priority for encounter is required"
...
Validation | PHC | AMB | INPATIENT |
---|---|---|---|
employees.type | as stated in config file employee_encounter_types | as stated in config file employee_encounter_types | as stated in config file employee_encounter_types |
encounter.type | as stated in config file encounter_class_encounter_types | as stated in config file encounter_class_encounter_types | as stated in config file encounter_class_encounter_types |
actions |
| is absent in request | is absent in request |
diagnoses | diagnoses.primary is a condition with code in dictionary "eHealth/ICPC2/condition_codes" | diagnoses.primary is a condition with code in dictionary "eHealth/ICD10_AM/condition_codes" | diagnoses.primary is a condition with code in dictionary "eHealth/ICD10_AM/condition_codes" |
reasons |
|
|
|
hospitalisation | is absent in request | is absent in request | if encounter.type == "discharge" - this block is mandatory
For other encounter types
|
action_references | is absent in request | if encounter.type == "patient_identity"
For other encounter types
| if encounter.type == "patient_identity"
For other encounter types
|
division |
|
| Division must be filled |
...
Validate conditions ids as primary keys
Validate that context of conditions is a current encounter
$.conditions[*].context.identifier.value == $.encounter.id
in case of error return "Submitted context is not allowed for the condition"
Validate code depending on encounter class
if $.encounter.class = PHC - allowed both eHealth/ICPC2/condition_codes and eHealth/ICD10_AM/condition_codes
if $.encounter.class in (AMB, INPATIENT) - allowed only eHealth/ICD10_AM/condition_codes
Validate code.coding depending on the qty of codes
Maximum one code from one dictionary (eHealth/ICPC2/condition_codes and eHealth/ICD10_AM/condition_codes) is allowed
in case of error return 422 with msg "Only one code from one dictionary is allowed"
Validate that the date is within acceptable limits
$.conditions[*].onset_date <= current_date
in case of error "Onset date must be in past"
$.condition[*].onset_date>=current_date-condition_max_days_passed
in case of error "Onset date must be greater than {{current_date-condition_max_days_passed}}"
$.conditions[*].onset_date <= current_date
in case of error "Onset date must be in past"
$.conditions[*].asserted_date <= current_date
in case of error "Asserted date must be in past"
$.conditions[*].evidences[*].detail[*].identifier.value is an ID of existing observation in MedicalEvents.Observations or one of $.observations[*]
OR $.conditions[*].evidences[*].detail[*].identifier.value is an ID of existing condition in MedicalEvents.Conditionsin case of error 422 "<medical_event> with such id is not found
$.conditions[*].evidences[*].detail[*].identifier.value meet follownig conditions
MedicalEvents.Observation.Patient == patient_id (from url)
Error 409 "Evidence can not reference another patient"
MedicalEvents.Observation.Status != "entered_in_error"
Error 409 "Observation in "entered_in_error" status can not be used as an evidence"
Validate $.conditions[*].evidences[*].detail[*].identifier.value
for each $.conditions[*].evidences
check:MedicalEvents.<MedicalEvent>.Patient == patient_id (from url)
Error 422 "<medical_event> with such id is not found"
MedicalEvents.<MedicalEvent>.Status != "entered_in_error"
Error 422 "<medical_event> in "entered_in_error" status can not be used as an evidence"
in case if PSYCHIATRY_ICPC2_DIAGNOSES_EVIDENCE_CHECK chart parameter contains $.conditions[*].code.coding.code
check if at least one item from $.conditions[*].evidences meets requirements:check if $.conditions[*].evidences[*].detail[*].identifier.type.coding.code == "condition"
Error 422 "Condition must be entered as an evidence to set condition code <$.conditions[*].code.coding.code>"
MedicalEvents.Condition.Code.Coding array contains at least one of codes from PSYCHIATRY_ICD10_AM_CONDITION_EVIDENCE_ALLOWED chart parameter.
Error 422 "Condition can not be used as an evidence to set condition code <$.conditions[*].code.coding.code>"
Validate asserter.
$.conditions.asserter.identifier.value is an ID of one of users employee
in case of error return "Employee is not performer of encounter"
according to logic Submit Encounter Data Package#Performer(asserter)validation
check if asserter's employee_type == "ASSISTANT" then define allowed conditions from ASSISTANT_EMPLOYEE_CONDITIONS_ALLOWED
in case condition code is not allowed for the employee_type - return 409 error ('Asserter has no required employee type to set condition code <code>')
check if asserter's employee_type == "MED_COORDINATOR" then define allowed conditions from ICD10_AM_MED_COORDINATOR_EMPLOYEE_CONDITIONS_ALLOWED
in case condition code is not allowed for the employee_type - return 409 error ('Asserter has no required employee type to set condition code <code>')
Validate primary_source:
if primary_source = true and code has eHealth/ICD10_AM/condition_codes dictionary value:
define allowed specialities for ICD10_AM condition code using a set of chart variables ICD10_AM_<SPECIALITY_TYPE>_SPECIALITY_CONDITIONS_ALLOWED
check if asserter's speciality in allowed specialities defined on previous step
in case speciality not allowed for the condition code - return 409 error ('Asserter has no required speciality to set condition code <code>')
if primary_source = false - skip this check
Validate Observations
Several approaches are used for validating observations. This is driven by the natural growth of the system, which implies increased complexity and the different requirements for various groups, categories of observations and even the contexts in which they (observations) were created.
Currently, the following approaches are used:
Basic validations for all observations
Validation of observations for the encounter type "patient_identity".
A set of validations for rehabilitation observations based on ICF (International Classification of Functioning, Disability, and Health) dictionaries.
Validation of observations based on a configuration set defined for a specific observation code (new).
Basic validation and REHAB
...
code | 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 |
Validate observations using configuration set
This validations must be done on top of Basic validations and only in case there is defined configuration set for such observation
Search for active configuration set (is_active = true) using observation code (code + system) and perform additional validation. If there is no configuration for such code then this additional validations must be skipped
Category
Check that
observation.categories.coding.system
andobservation.categories.coding.code
matches with one of the options in CATEGORY configuration parameter
Components
Check that all components in
observation.components
are unique and not duplicated if COMPONENTS_UNIQUE is set to true. Otherwise skip this stepin case of error return 422 “Observation components must be unique“
Check that all required components are present in
observation.components
(declared in COMPONENTS_REQUIRED)values in COMPONENTS_REQUIRED.check means all required and observation components must include all of them
if COMPONENTS_REQUIRED is missing or is empty then skip this validation
in case of error return 422 “Not all required components provided for this observation code“
Check that there are no items in
observation.components
other than those allowed, which are defined by the COMPONENTS_OPTIONALvalues in COMPONENTS_OPTIONAL.check means all allowed (except COMPONENTS_REQUIRED) observation components that could be used for this observation code
if COMPONENTS_OPTIONAL is missing or is empty then no additional components are allowed
in case of error return 422 “Component code is not allowed for this observation code“
Check that component value type matches with COMPONENTS_TYPE configuration parameter
search for related configuration in COMPONENTS_TYPE.condition using
observation.component.code.coding.system
andobservation.component.code.coding.code
check that
observation.component.value[x]
type matches with the type declared in COMPONENTS_TYPE.checkif COMPONENTS_TYPE is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “type mismatch. Expected {COMPONENTS_TYPE.check} but got {entered type}“
Check that dictionary used to represent component with value type
codeable_concept
matches with declared in COMPONENTS_BINDING configuration parameterMust be done only in case when component value type is codeable_concept (
observation.component.value[x]
type is codeable_concept)search for related configuration in COMPONENTS_BINDING.condition using
observation.component.code.coding.system
andobservation.component.code.coding.code
check that
observation.component.value_codeable_concept.coding.system
matches with the system (dictionary) declared in COMPONENTS_BINDING.checkif COMPONENTS_BINDING is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “Incorrect dictionary. Expected {COMPONENTS_TYPE.check}“
Check that code system and value used to represent quantity in component are allowed according to COMPONENTS_QUANTITY_CODES configuration parameter
Must be done only in case when component value type is quantity (
observation.component.value[x]
type is quantity)search for related configuration in COMPONENTS_QUANTITY_CODES.condition using
observation.component.code.coding.system
andobservation.component.code.coding.code
check that
observation.component.value_quantity.coding.system
andobservation.component.value_quantity.coding.code
matches respectively with one of configurations in COMPONENTS_QUANTITY_CODES.checkif COMPONENTS_QUANTITY_CODES is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “Such quantity system and quantity code are not allowed in this component“
Check that component value is within the declared in COMPONENTS_QUANTITY_BOUNDARIES configuration parameter boundaries
Must be done only in case when component value type is quantity (
observation.component.value[x]
type is quantity)search for related configuration in COMPONENTS_QUANTITY_BOUNDARIES.condition using (
observation.component.code.coding.system
andobservation.component.code.coding.code
for COMPONENTS_QUANTITY_BOUNDARIES.condition.component_code) and (observation.component.value_quantity.system
andobservation.component.value_quantity.code
for COMPONENTS_QUANTITY_BOUNDARIES.condition.quantity_code)check that configuration.check.min <=
observation.component.value_quantity.value
>= configuration.check.maxif COMPONENTS_QUANTITY_BOUNDARIES is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “Incorrect value. Expected value to be in range {configuration.check.min} and {configuration.check.max}“
Check that only allowed extensions are used in components (declared in COMPONENTS_ALLOWED_EXTENSIONS)
values not declared in COMPONENTS_ALLOWED_EXTENSIONS.check is prohibited and is not allowed in
observation.components
check that
observation.component.value_codeable_concept.coding.extension
contains only extensions declared in COMPONENTS_ALLOWED_EXTENSIONS.checkin case of error return 422 “Extension {
observation.component.value_codeable_concept.coding.extension
} is not allowed“
check that there are no duplicated extensions in
observation.component.value_codeable_concept.coding.extension
in case of error return 422 “Duplicated extension“
check that extension is valid according to https://e-health-ua.atlassian.net/wiki/spaces/REHABILIT/pages/18431246564/UPD+Medical+Events+MongoDB+Data+Model#Predefined-extensions
in case of error return 422 “Invalid extension“
Check that extension value is correct according to COMPONENT_SCORE configuration parameter
Must be done only in case when component value type is codeable_concept (
observation.component.value[x]
type is codeable_concept)search for the score associated with provided value (declared in COMPONENT_SCORE configuration parameter) using component value (
observation.component.value_codeable_concept.coding.system
andobservation.component.value_codeable_concept.coding.code
) and component code (observation.component.code.coding.system
andobservation.component.code.coding.code
).check that extension value (
observation.component.value_codeable_concept.coding.extension(code = item_weight).value_decimal
) is equal value declared in COMPONENT_SCORE.check for such componentin case of error return 422 “Incorrect component score“
Value
Check that observation value type matches with RESULT_TYPE configuration parameter
check that
observation.value[x]
type matches with the type declared in RESULT_TYPE.checkif RESULT_TYPE is missing or is empty then skip this validation
in case of error return 422 “type mismatch. Expected {RESULT_TYPE.check} but got {entered type}“
Check that dictionary used to represent observation value matches with declared in RESULT_BINDING configuration parameter
Must be done only in case when observation value type is codeable_concept (
observation.value[x]
type is codeable_concept)check that
observation.value_codeable_concept.coding.system
matches with the system (dictionary) declared in RESULT_BINDING.checkif RESULT_BINDING is missing or is empty then skip this validation
in case of error return 422 “Incorrect dictionary. Expected {RESULT_BINDING.check}“
Check that code system and value used to represent quantity in observation are allowed according to RESULT_QUANTITY_CODES configuration parameter
Must be done only in case when component value type is quantity (
observation.value[x]
type is quantity)check that
observation.value_quantity.coding.system
andobservation.value_quantity.coding.code
matches respectively with one of configurations in RESULT_QUANTITY_CODES.checkif RESULT_QUANTITY_CODES is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “Such quantity system and quantity code are not allowed in observation result“
Check that observation value is within the declared in RESULT_BOUNDARIES configuration parameter boundaries
Must be done only in case when observation value type is quantity (
observation.value[x]
type is quantity)search for related configuration in RESULT_BOUNDARIES.condition using
observation.value_quantity.coding.system
andobservation.value_quantity.coding.code
check that configuration.check.min <=
observation.value_quantity.value
>= configuration.check.maxif RESULT_BOUNDARIES is missing or is empty or there is no matched configuration then skip this validation
in case of error return 422 “Incorrect value. Expected value to be in range {RESULT_BOUNDARIES.check.min} and {RESULT_BOUNDARIES.check.max}“
Check that observation value calculated correctly according to the method declared in RESULT_SCORE_CALCULATION configuration parameter
There are different supported methods to calculate and control result (“SUM”)
If `SUM` specified
go through all
observation.components
sum all scores provided in item_weight extension
observation.component.value_codeable_concept.coding.extension(code = item_weight).value_decimal
and all components where component value type is quantity and quantity system =eHealth/ucum/units
and quantity code =ScoreOf
ensure that this result is equal to
observation.component.value_quantity.value
if RESULT_SCORE_CALCULATION is missing or is empty then skip this validation
in case of error return 422 “Incorrect observation result“
Validate Immunizations
Validate immunizations ids as primary keys
Validate primary_source
in case primary_source == true
$..performer must be filled
in case of error return 422 with msg "performer must be present if primary_source is true"
$..report_origin must be absent
in case of error return 422 with msg "Only one of the parameters must be present"
check not_given parameter
in case not_given == false
$..explanation.reasons, $..manufacturer, $..lot_number, $..expiration_date, $..dose_quantity.value, $..dose_quantity.unit, $..dose_quantity.code, $..site, $..route, $..vaccination_protocols.dose_sequence, $..vaccination_protocols.authority, $..vaccination_protocols.series, $..vaccination_protocols.series_doses, $..vaccination_protocols.target_diseases must be filled (inclusive with those that are mandatory according to the apiary)
in case of error return 422 with msg "<reasons|manufacturer|lot_number|expiration_date|value|unit|code|site|route|dose_sequence|authority|series|series_doses|target_diseases> must be present if primary_source is true and not_given is false"
$..explanation.reasons_not_given must be absent
in case of error return 422 with msg "Only one of the parameters must be present"
in case not_given == true
$..explanation.reasons_not_given, $..vaccination_protocols.dose_sequence, $..vaccination_protocols.authority, $..vaccination_protocols.series, $..vaccination_protocols.series_doses, $..vaccination_protocols.target_diseases must be filled (inclusive with those that are mandatory according to the apiary)
in case of error return 422 with msg "<reasons_not_given|dose_sequence|authority|series|series_doses|target_diseases> must be present if primary_source and not_given is true"
$..explanation.reasons must be absent
in case of error return 422 with msg "Only one of the parameters must be present"
in case primary_source == false
$..report_origin must be filled
in case of error return 422 with msg "report_origin must be present if primary_source is false"
$..performer must be absent
in case of error return 422 with msg "Only one of the parameters must be present"
check not_given parameter
in case not_given == true return error 422 with msg "Only completed immunizations can be filled if primary_source is false and not_given is true"
in case not_given == false
$..explanation.reasons, $..dose_quantity.value, $..dose_quantity.unit, $..vaccination_protocols.authority, $..vaccination_protocols.target_diseases must be filled (inclusive with those that are mandatory according to the apiary)
in case of error return 422 with msg "<reasons|value|unit|authority|target_diseases> must be present if primary_source and not_given is false"
if vaccination_protocols.authority == MoH $..vaccination_protocols.dose_sequence, vaccination_protocols.series, vaccination_protocols.series_doses must be filled
in case of error return 422 with msg "<dose_sequence|series|series_doses> must be present if primary_source and not_given is false"
$..explanation.reasons_not_given must be absent
in case of error return 422 with msg "Only one of the parameters must be present"
$..manufacturer must be optional
Validate that context of immunizations is a current encounter
$.immunizations[*].context.identifier.value == $.encounter.id
in case of error "Submitted context is not allowed for the immunization"
Validate that the date is within acceptable limits
$.immunizations[*].date <= current_time
in case of error "Date must be in past"
$.immunizations[*].date>=current_date-immunization_max_days_passed
in case of error "Date must be greater than {{current_date-immunization_max_days_passed}}"
Validate performer according to the Rule
Validate that observation submitted as a detail of reaction is an existing observation that belongs to the current patient
$.immunizations[*].reactions[*].detail.identifier.value is an ID of existing observation in ME.observations where (ME.observations.patient_id==patient_id from url) OR one of $.observations[*].id
in case of error return 422 "There is no observation with such id"
...
Validate risk assessment id as a primary key
Validate that context of risk_assessments is a current encounter
$.risk_assessments[*].context.identifier.value == $.encounter.id
in case of error "Submitted context is not allowed for the risk_assessments"
Validate that asserted_date is within acceptable limits
$.risk_assessments [*].asserted_date<= current date_time
in case of error "Asserted date must be in past"
$.risk_assessments [*].asserted_date>=current_date-risk_assessment_max_days_passed
in case of error "Asserted date must be greater than {{current_date-risk_assessment_max_days_passed}}"
Validate performer according to the Rule
validate performer is an active doctor from current legal_entity
$..performer.identifier.value is an ID of existing employee in PRM.employee
in case of error "Employee with such id is not found"
$..performer.identifier.value == PRM.employees.id where (PRM.employees.status == "APPROVED" and PRM.employees.employee_type in ("DOCTOR", "SPECIALIST")
in case of error return 422 "Invalid employee type"
Validate only one of these fields are filled: reason_reference , reason_codeable_concept
Validate reason_reference as a Reference
Validate basis as a Reference
Validate when_period as a Period
Validate only one of the fields is filled: prediction.when_period or prediction.when_range
Validate only one of the fields is filled: prediction.probability_decimal or prediction.probability_range
...
Validate diagnostic reports ids as primary keys
Validate based_on as Reference
Validate that service_request, referenced as based_on, is
in status is
active
or program_processing_status=in_progress (any status is valid in case program_processing_status= in_progress)in case of error return 409 "Invalid service request status"
if program is defined than used_by_legal_entity==token.client_id OR null
in case of error return 409 "Service request is used by another legal_entity"
if program is defined than program_processing_status == new, in_queue or in_progress
check that service_request contains based_on parameter
in case based_on present in service_request
verify care_plan:
It should be in active status
Care plan's period end (if exist) should be greater than current date or equal.
verify activity:
It has activity.detail.kind=service_request; activity.detail.product_reference=service_id.
It has scheduled, in_progress status
in case based_on not present in request skip previous validations.
Check if service request quantity is not exhausted as described at related service request validation
category
Validate that one of diagnostic reports categories corresponds to service category, that is references as code in DR
$.diagnostic_report.category[?]=PRM.services.category where PRM.services.id=$.diagnostic_report.code.identifier.value
in case of error return 422 "None of the diagnostic report categories matches with the service category"
Validate $.diagnostic_report[*].categories
is an array with only one item
in case of error return 422 "Expected a maximum of 1 items but got <number of elements>"
Validate that $.diagnostic_report[*].category.coding.code is
eHealth/diagnostic_report_categories
dictionary, requiredin case of error return 422 "value is not allowed in enum"
Validate that diagnostic reports category corresponds to service category, that is references as code in DR
$.diagnostic_report[*].category=PRM.services.category where PRM.services.id=$.diagnostic_reportreport[*].code.identifier.value
in case of error return 422 "None of the diagnostic report categories matches Diagnostic report category does not match with the service category"
Validate code
Validate code as Reference
If service_requests.code.identifier.value is service, validate $diagnostic_report.code.identifier.value = service_requests.code.identifier.value
in case error return 409, "Service in diagnostic_report differ from service in service request"
if service_requests.code.identifier.value is service_group, validate $diagnostic_report.code.identifier.value in (SELECT service_id from service_inclusions where service_group_id='service_requests.code.identifier.value')
in case error return 409, "Service in diagnostic_report differ from services in service request's service_group"
Validate diagnostic_report.service.is_active = true
in case error return 409, "Service should be active"
Validate effective_period as a period
Validate that issued is within acceptable limits
$.diagnostic_reports[*].issued<= current date_time
in case of error 422 "Asserted date must be in past"
$.diagnostic_reports[*].issued>=current_date-diagnostic_report_max_days_passed
in case of error 422 "Issued must be greater than {{current_date-diagnostic_report_max_days_passed}}"
Validate conclusion_code:
$.diagnostic_reports[*].conclusion_code.coding[*].code validate that the code belongs to the dictionary system 'eHealth/ICD10_AM/condition_codes'
in case of error return "Value is not allowed in enum"
Check that there is only one code in conclusion_code.coding array
if more - return error "Only one code from one dictionary is allowed"
Validate recorded_by as Employee
Validate encounter
$.diagnostic_reports[*].encounter.identifier.value == $.encounter.id
in case of error 409 "Invalid reference"
Validate performer:
as Employee
according to logic Performer(asserter) validation
Validate managing_organization is a current legal_entity
$.managing_organization.identifier.value==token.client_id
in case of error 409 "Managing organization does not correspond to user's legal entity."
Validate result_interpreter.identifier as Employee
Validate result_interpreter.identifier is an employee with employee_type = DOCTOR or SPECIALIST
Validate only One of the fields is filled:
$.diagnostic_report[*].results_interpreter.reference OR $.diagnostic_report[*].results_interpreter.text
$.diagnostic_report[*].performer.reference OR $.diagnostic_report[*].performer.text
Validate primary_source
If primary_source==true, then
Managing organization MUST be filled
performer.reference MUST be filled
If primary_source==false, then
report_origin must be filled
performer.reference must NOT be filled
results_enterpreter.reference must NOT be filled
Validate patient verification status:
If diagnostic report has based_on with valid and active service request, then skip this validation.
Else check patient's verification_status is not equal to NOT_VERIFIED.
in case of error return 409, "Patient is not verified"
Validate specimens, if submitted:
Check field has array with elements of Reference type on specimen resource
in case of error return 422 “not allowed in enum”
For each specimen check:
Check it exists in DB or within current package, and belongs to the same patient:
in case of error return 422 "Specimen not found"
Check it is present in the only one diagnostic report within the package.
in case of error return 422 "Specimen is already used in another diagnostic report"
Check status:
is available if the specimen found in the DB
in case of error return 422 "Specimen created before the current package should be available"
is unavailable if the specimen not found in the DB, but in the packagepackage
Validate Procedures
Validate by json schema
Validate procedure id as primary key
Validate status
On create procedure status could be completed or not_done. `entered_in_error` could be set on update procedure.
error 422 by json schema
Validate code
Validate code as Reference
Validate procedure.service.is_active = true
in case error return 409, "Service is not active"
Validate encounter
$.procedure[*].encounter.identifier.value == $.encounter.id
in case error return 409, "Submitted encounter is not allowed for procedure"
Validate performed_date_time
Validate performed_period/performed_date_time:
if $.status == "not_done" check that performed_period/performed_date_time fields are not present in request
in case error return 422 entry: "$.performed_period" (or "$.performed_date_time"), rules[0].description: "Must not be present in procedure with status <$.status>"
else, if $.status == "completed":
Check that only one of this parameters present
in case error return 422 "Only one of the parameters must be present"
Validate performed_date_time
performed_date_time is real
in case error return 422, "Performed_date_time in invalid"
performed_date_time <= now
in case error return 422 "Procedure cannot be registered in future"
Validate performed_period
$.performed_period.start<= now
in case of error return 422 "Procedure cannot be registered in future"
$.performed_period.end>= $.performed_period.start
in case of error return 422 "End date must be greater than start date"
performed_period.end <= now
in case error return 422 "Procedure cannot be registered in future"
Validate $.performed_period as required field in case if procedure based on service request with quantity that has code=MINUTE (system=SERVICE_UNIT)
in case of error return 422 "can't be blank"
Validate recorded_by
Validate recorded_by as Reference
$..recorded_by.identifier.value is an ID of existing employee in PRM.employee
in case of error return 422, "Employee with such id is not found"
Validate recorded_by is employee with status='APPROVED' and is_active= true and end_date is null or more than today
in case error return 409, "This action is prohibited for current employee"
Validate employees.legal_entity_id=$managing_organization.identifier.value
in case error return 409, "Employee should be from current legal entity"
Validate asserter
Validate division
Validate division as Reference
$division is an ID in PRM.divisions
in case return 422, "Division with such id is not found"
division.status=ACTIVE and is_active=true
in case error return 409, "Division is not active"
division.legal_entity_id = $client_id or division.legal_entity_id=$managing_organization.identifier.value
in case error return 409, "Division is not in current legal_entity"
Validate managing_organization is a current active legal_entity with proper type
as Reference
$managing_organization is an ID in PRM.legal_entities
in case return 422, "Legal entity with such id is not found"
validate managing_organization status is 'ACTIVE' and is_active=true
in case error return 422 ('Legal entity is not active')
validate legal_entity type is in ('PRIMARY_CARE','MSP','MSP_PHARMACY','MSP_PHARMACY') (use `ME_ALLOWED_TRANSACTIONS_LE_TYPES` from charts)
in case error return 422, "Legal entity with type $legal_entity.type cannot perform procedures"
validate $managing_organization.identifier.value = $client_id
in case of error 409 "Managing organization does not correspond to user's legal entity."
Validate reason_references
Validate reason_reference as a Reference (Reference)
Validate reason_refernce.identifier.type.coding.[0].code is condition or observation
in case error return 422 "value is not allowed in enum"
Validate reason_refernce.identifier.value is condition or observation not in status ENTERED_IN_ERROR
in case error return 422, "Observation in "entered_in_error" status can not be referenced" if observation, else - "Condition is canceled"
Validate outcome
validate outcome as a Reference
validate outcome.coding.object.system is in dictionary eHealth/procedure_outcomes
in case error return 422, "outcome not in dictionary eHealth/procedure_outcomes"
Validate complication_details
validate complication_details as a Reference
validate complication_details.identifier.value refer to condition in the same encounter package
in case error return 422, "complication_details does not correspond to condition in this encounter package"
Validate category
according to the dictionary 'eHealth/procedure_categories' - by schemata
Validate that procedure category corresponds to service category, that is references as code in procedure
$.procedure.category=PRM.services.category where PRM.services.id=$.procedure.code.identifier.value
in case of error return 422 "Procedure category does not match with the service category"
Validate patient verification status:
If procedure has based_on with valid and active service request, then skip this validation.
Else check patient verification_status is not equal to NOT_VERIFIED.
in case of error return 409, "Patient is not verified"
Validate used_codes
Check that the $.used_codes[*].coding[*].code belongs to the dictionary in $.used_codes[*].coding[*].system
in case of error - return 422 "Value is not allowed in enum"
Validate 'used_codes.coding.code' is_active = true
in case error return 409, "Value is not active"
Validate Clinical impression
Validate by json schema
Validate clinical impression id as primary key (Primarykeyvalidation)
Validate status
Check that the code belongs to the dictionary system (eHealth/clinical_impression_statuses)
in case of error - return 422 ('value is not allowed in enum')
Check it has value = completed
in case of error - return 422 ('value is not allowed in enum')
Validate code
Check that the code belongs to the dictionary system (eHealth/clinical_impression_patient_categories)
in case of error - return 422 ('value is not allowed in enum')
Validate code.coding depending on the qty of codes. Maximum one code is allowed
in case of error - return 422 ('Only one code is allowed')
Check by code.coding[0].code and code.coding[0].system active rules in rule_engine_rules collection
in case any active rules present - check request only with following validations
in case rule present in collection - check request with following validations and with additional from rule engine rule
Validate description
Check that value with string type
in case of error - return 422 ('type mismatch. Expected string but got {entered type}')
Validate encounter
Check the value is valid reference on encounter resource
Check that value is an object with references of type encounter
in case of error - return 422 ('value is not allowed in enum')
Check the value is valid reference on encounter resource
Check that $.clinical_impressions[*].encounter.identifier.value == $.encounter.id
in case error - return 422 ('Invalid reference')
Validate effective_period and effective_date_time:
Validate that at least one of the parameters are present
in case of error - return 422 ('At least one of the parameters must be present')
Validate effective_period as a period (PeriodValidation)
Validate value in the field $.effective_period
Check that $.effective_period.start <= encounter.date
in case of error - return 422 ('Start date must be in the past')
Check that $.effective_period.end >= $.effective_period.start
in case of error - return 422 ('End date must be greater than or equal the start date')
Validate that $.effective_period.end is within acceptible limits
Check that $.effective_period.end <= current_time
in case of error - return 422 ('Date must be in past')
Check that $.effective_period.end >= current_date-clinical_impression_max_days_passed
in case of error - return 422 ('Date must be greater than {{current_date-clinical_impression_max_days_passed}}')
Validate effective_date_time
Check that field $.effective_date_time with string type
in case of error - return 422 ('type mismatch. Expected string but got {entered type}')
Check that field $.effective_date_time <= current_time
in case of error - return 422 ('Date must be in past')
Check that field $.effective_date_time >= current_date-clinical_impression_max_days_passed
in case of error - return 422 ('Date must be greater than {{current_date-clinical_impression_max_days_passed}}')
Validate assessor
Validate assessor as Reference (Referencevalidation)
$.assessor.identifier.value is an ID of existing employee in PRM.employee
in case of error - return 422 ('Employee with such id is not found')
Validate assessor is employee with status='APPROVED' and is_active= true and end_date is null or more than today
in case of error - return 422 ('Invalid employee status')
Validate previous
Check the value is valid reference on clinical impression resource
Check that value is an object with references of type clinical_impression
in case of error - return 422 ('value is not allowed in enum')
Check that clinical impression is active (status is not entered_in_error)
in case of error - return 422 ('Clinical impression in "entered_in_error" status can not be referenced')
Check that clinical impression belongs to patient ($.subject)
in case of error - return 422 ('Clinical impression with such id is not found')
Validate problems
Check that value is an array with references of type condition
in case of error - return 422 ('value is not allowed in enum')
Check that each condition is active (verification_status is not entered_in_error)
in case of error - return 422 ('Condition in "entered_in_error" status can not be referenced')
Check that condition belongs to the patient ($.subject)
in case of error - return 422 ('Condition with such id is not found')
Validate finding
Check that value is an array with objects
Validate item_reference
Check that value is an object with reference of resource condition, observation (further <Medical event resource>)
in case of error - return 422 ('value is not allowed in enum')
Check that <Medical event resource> is active (status is not entered_in_error)
in case of error - return 422 ('<Medical event resource> in "entered_in_error" status can not be referenced')
Check that each reference:
is valid ME of defined type above
belongs to the patient ($.subject)
in case of error - return 422 (<Medical event resource> with such ID is not found')
In case some resources present in active rule, check that they correspond to configured rule
Check that value is an object with reference of resource condition, observation (further <Medical event resource>)
in case of error - return 422 'entry': '$.clinical_impressions[0].code', 'entry_type': 'json_data_property', 'rules': [{'description': '<description_text of the failed rule>, rule: <number of failed rule>', …
Validate basis
Check that value with string type
in case of error - return 422 ('type mismatch. Expected string but got {entered type}')
Validate supporting_info
Check that value is an array with references of type episode_of_care, procedure, diagnostic report, encounter (further <Medical event resource>)
in case of error - return 422 ('value is not allowed in enum')
Check that <Medical event resource> is active (status is not entered_in_error)
in case of error - return 422 ('<Medical event resource> in "entered_in_error" status can not be referenced')
Check that each reference:
is valid ME of defined type above
belongs to the patient ($.subject)
in case of error - return 422 (<Medical event resource> with such ID is not found')
In case some resources present in active rule, check that they correspond to configured rule
in case of error - return 422 'entry': '$.clinical_impressions[0].code', 'entry_type': 'json_data_property', 'rules': [{'description': '<description_text of the failed rule>, rule: <number of failed rule>', …
Validate note
Check that value with string type
in case of error - return 422 ('type mismatch. Expected string but got {entered type}')
Validate patient
In case patient params present in active rule, get them through subject and check that they correspond to configured rule
in case of error - return 422 'entry': '$.clinical_impressions[0].code', 'entry_type': 'json_data_property', 'rules': [{'description': '<description_text of the failed rule>, rule: <number of failed rule>', …
In case medication dispense data presents in active rule, get medication dispense data in patient context (through subject) and check that it correspond to configured rule
in case of error - return 422 'entry': '$.clinical_impressions[0].code', 'entry_type': 'json_data_property', 'rules': [{'description': '<description_text of the failed rule>, rule: <number of failed rule>', …
Validate Specimen
Validate by json schema
Validate specimens ids as primary keys (Submit Encounter Data Package#Primarykeyvalidation)
Validate that context of specimen is a current encounter
$.specimens[*].context.identifier.value==$.encounter.id
in case of error return 422 "Submitted context is not allowed for the specimen"
Validate specimen's root attributes:
Validate requests, type, condition, registered_by, managing_organization as described at Create Specimen: Validate specimen
Validate parent as described at Create Specimen: Validate specimen, but also check it within current package
Validate status:
Check the value is available or unavailable, according to the
specimen_statuses
dictionaryin case of error return 422 "value is not allowed in enum"
Specimen is unavailable if there is at least one entity that references specimen (Observations where ($.observations[*].specimen.reference == specimen.id) or Diagnostic Reports where ($.diagnostic_reports[*].specimen.reference == specimen.id))
in case of error return 422 "Specimen that is not referenced in Observation or Diagnostic Report must be in 'available' status"
Validate collection attributes:
Validate collector, collected, quantity, duration, method, body_site, fasting status as described at Create Specimen: Validate collection
Validate procedure in the field $.collection.procedure, Reference type, optional
Check it references to procedure resource
in case of error - return 422 ('value is not allowed in enum')
Check that procedure exists in the DB and belongs to the patient, or it is within current package
in case of error - return 422 ('Procedure not found')
Validate that entity is not in status "entered_in_error"
in case of error - return 422 ("Entity in status "entered_in_error" can not be referenced")
Validate container attributes as described at Create specimen: Validate container
Validate received_time as described at Process Specimen: Validate received datetime
received_time must be empty if there are no other entities that reference specimen (NO Observations where ($.observations[*].specimen.reference == specimen.id) and NO Diagnostic Reports where ($.diagnostic_reports[*].specimen.reference == specimen.id))
in case of error return 422 "
Received time must not be set for available specimen
"
Validate status_reason:
is set to codeable concept with system = specimen_invalidate_reasons and code = used, if the specimen status is unavailable (i.e. at least one entity that references specimen).
in case of error return 422 ('value is not allowed in enum')
is empty, if the specimen status is available.
in case of error return 422 ('Status reason must not be set for available specimen')
Validate Device Dispense
Validate by json schema
Return 422 with list of validation errors in case validation fails
Validate device dispenses ids as primary keys (Submit Encounter Data Package#Primarykeyvalidationhttps://e-health-ua.atlassian.net/wiki/spaces/EH/pages/edit-v2/18492261105#Primary-key-validation )
Validate device dispenses's root attributes:
Validate performer, location as described at https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782015518#Validate/18493276353/RC_+UPD+Create+Device+dispense#Validate-dispense
Validate $.status isCOMPLETED or DECLIEND
else - return 422 ("value is not allowed in enum")
If based_on is present, validate:
Check it references to device_request resource
in case of error - return 422 ('value is not allowed in enum')
Check that device request exists and belongs to the same patient
in case of error - return 422 ('Device request not found')
Сheck that device request is in status 'active'
in case of error - return 409 error ('Device request is not active')
Check that intent specified in Device request is
order
in case of error - return 409 error ('Only device request with intent = 'order' can be dispensed')
Check that program in device request is empty (device_requests.program = null)
in case of error - return 409 ('Device request with program can not be referenced')
Verify care plan Activity as described in https://edenlabe-health-ua.atlassian.net/wiki/spaces/EH/pages/377176082718493276302/RC_+UPD+Qualify+Device+Request+by+request#ValidateID#Validate-related-Care-plan
validate when_handed_over
If based_on is present check that when_handed_over is equal or greater then device_request.authored_on
1. in case of error - return 409 error ('when_handed_over date can not be lesser then the authored_on date of the related Device request')
Validate encounter:
Validate encounter references the current encounter, submitted within the same package
$.device_dispenses[*].encounter.identifier.value==$.encounter.id
in case of error return 422 "Device dispense can only reference encounter from the same package"
Validate encounter period fully contains when_handed_over date
$.encounter.period.start<$.device_dispenses[*].when_handed_over and $.encounter.period.end_date>$.device_dispenses[*].when_handed_over
in case of error return 422 "Device dispense when_handed_over date doesn’t match with encounter period”
Validate part_of:
Check it references to procedure resource
in case of error - return 422 ('value is not allowed in enum')
Validate that procedure reference one of procedures, submitted within the same package
in case of error return 422 "Device dispense can only reference procedure from the same package"
Validate that procedure is not in status "entered_in_error" or “not_done”
in case of error - return 422 ("Procedure in status "entered_in_error" or “not_done” can not be referenced")
Validate supporting_info:
Check it references condition, observation, diagnostic_report, procedure, encounter, episode, device or device_association resource
in case of error - return 422 ('value is not allowed in enum')
Check that {resource} exists and belongs to the same patient, or it is within current package
in case of error - return 422 ('{resource} not found')
Validate that {resource} is not in status "entered_in_error"
in case of error - return 422 ("{resource} in status "entered_in_error" can not be referenced")
Validate $.details.device_code if present:
if based_on is present validate Dispense details as described at https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782015518#Validate/18493276353/RC_+UPD+Create+Device+dispense#Validate-device_code
Check system($.detailsif based_on is NOT present::Check system($.details.device_code.coding.system) = device_definition_classification_typein case of error - return 422 ('value is not allowed in enum')
Get device_code from the dictionarydevice_definition_classification_type
($.details.device_code.coding.code) and check parameter is_active = truein case of error - return 422 ('Device code not found')
Check that $.device_code.coding
.system) = device_definition_classification_type[] array contains only 1 element
in case of error - return 422 ('
Exceeded max count of elements in the array')
- Get
Check that $.device_code.coding[].code is an active value from the dictionary
device_definition_classification_type
($.detailsspecified in $.device_code.coding
.code) and check parameter is_active = true[].system
in case of error - return 422 ('
Value <code> not found in the dictionary <system>')
Validate $.details.device if presentIf reference on Device definition is present there:
if based_on is present: https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782015518#Validate/18493276353/RC_+UPD+Create+Device+dispense#Validate-device_code
if based_on is NOT present
Check code ($.details.device.identifier.type.coding.code) =
device_definition
in case of error - return 422 ('value is not allowed in enum')
Get device definition by id ($.details.device.identifier.value)
device_definition.is_active = true
in case of error - return 422 ('Device definition not found')
Check the remainder of the division ($.details.quantity.value/device_definition.packaging_count) is equal to 0
in case of error - return reject_reason = ���The quantity must be divisible to packaging_count of prescribed Device Definition”
Validate Device if present( $.details.device) If reference on Device is present there:
Check that device exists and belongs to the same patient, or it is within current package
in case of error - return 422 ('Device not found')
Validate that device status is not in status "activeentered_in_error"
in case of error - return 422 ("Only Devices in status "active" can be referenced")
Device in 'entered_in_error' status can not be referenced")
If based_on is present, validate:
if referenced Device request($.based_on) contains code (device_request.code)
Check that the type in the Device($.details.device) is equal to the code in the Device request($.based_on)
in case of error - return 422 ("
Dispensed device doesn’t match with prescribed device")
if referenced Device request($.based_on) contains code_reference (device_request.code_reference)
Check that the type definition in the Device($.details.device) is equal to the code in the Device request($.based_on)the code_reference in the Device request($.based_on)
in case of error - return 422 ("Dispensed device doesn’t match with prescribed device")
Validate quantity
if based_on is present validate quantity as described at https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/18493276353/RC_+UPD+Create+Device+dispense#Valdate-quantity ,but also include Device dispenses from the current package in remaining_quantity calculation
else validate quantity.value is an integer bigger than 0
Validate related Care plan
Verify care plan Activity as described in Qualify Device request | Validate related Care plan
Validate primary_source
if $.primary_source = true, then check $.report_origin is absent
in case of error - return 422 ("
Dispensed device doesn’t match with prescribed deviceReport_origin can not be submitted in case primary_source is true")
if
referenced Device request($.
based_on) contains code_reference (device_request.code_reference)Check that the definition in the Device($.details.device) is equal to the code_reference in the Device request($.based_on)primary_source = false, then check $.report_origin is present
in case of error - return 422 (“can't be blank”)
Validate report_origin
Check $.report_origin.coding[].system is
eHealth/report_origins
dictionaryin case of error - return
422422 ("
Dispensed device doesn’t match with prescribed devicevalue is not allowed in enum")
Validate quantity
if based_on is present validate quantity as described at https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782015518#Validate-quantity ,but also include Device dispenses from the current package in remaining_quantity calculation
else validate quantity.value is an integer bigger than 0Check that $.report_origin.coding[].code is an active value from the dictionary specified in code.coding[].system
in case of error - return 422 ('value is not allowed in enum')
Primary key validation
Validate that IDs of all submitted entities in the array are unique
validate that $.{collection}[*].id from the payload are all unique among themselves
in case of error return 409 "All primary keys must be unique"
validate there is no entity with such id in the corresponding Medical events collection
in case of error return 422 "{Entity} with such id already exists"
...
$...identifier.value exists in PRM.employees
in case of error 409 "Employee not found"
$...identifier.value == PRM.employees.id where (PRM.employees.status == "APPROVED" and PRM.employees.legal_entity==token.client_id)
in case of error 409 "Submitted employee is not an active employee from current legal entity"
Related service request validation
If service request referenced as based on in ME:
if it has quantity:
Check allowed quantity units for ME:
if ME is Procedure, then service_request.quantity.code can have values MINUTE or PIECE (system=SERVICE_UNIT)
if ME is Encounter or Diagnostic report, then service_request.quantity.code can have PIECE only
in case of error return error 409 ("<ME type> cannot be measured in <quantity.code's value>")
Check service_request remaining quantity parameter:
if quantity.code = PIECE:
count number of related MEs to the service request as used quantity.
calculate remaining quantity by subtracting used quantity and number of current MEs that are related to the service request from service request's quantity
Validate remaining quantity is greater then or equal to zero
in case of error return 409 "The total amount of medical events exceeds quantity in related service request with <id>"
if quantity.code = MINUTE:
select related Procedures to the service request.
for each selected Procedure calculate duration as performedPeriod.end - performedPeriod.start without considering seconds. Result should be in minutes.
calculate used quantity as sum of procedure durations
calculate remaining quantity by subtracting used quantity and durations of current Procedures that are related to the service request from service request's quantity
Validate remaining quantity is greater then or equal to zero
in case of error return 409 "The total amount of medical events exceeds quantity in related service request with <id>"
Related care plan validation
As for old care plan activities (has quantity w/o units) the amount of service request was no controlled, we should ensure that number of created medical events are not exceed its quantity:
Validate remaining_quantity in activities referenced by service requests in the EDP using the algorithm described for a quantity without units (code=null) in PreQualify Service Request#Validate-service-request . But also, add the reserved at the moment quantity, that includes the number of medical events in the EDP related to the activity, to the used_quantity.If entities (encounter.incoming_referral, procedure.based_on, diagnostic_report.based_on) has reference on service request and service_request[].activity.detail.quantity was set - check possibility to create EDP depending on service_request[].activity remaining quantity
calculate thequantity
of artifacts that are contained in the $.activity.outcome_reference by service_request.based_on[].activity[].
idcalculate the quantity of artifacts that are contained in the request and have a link to the service requestcompare quantity from outcome_reference with the artifact quantity
check that difference is greater then or equal to zero
Processing
API paragraph not found
...
Save signed_content to Media Storage
Save data to corresponding collections in DBs
Save link to the signed content to the encounter
Enrich encounter.diagnoses:
select condition.code from Medical Events DB(or from request body) where condition.id==diagnoses[@].condition.identifier.value
set diagnoses[@].code = select 1
Save diagnoses from encounter to episodes.current_diagnoses
ME.patients.episodes.diagnoses = $.encounter.diagnoses
Add a record to the ME.patient.episodes{episode_id}.diagnoses_hstr
date = current_date
evidence = reference to encounter ($.encounter.id)
diagnoses = $.encounter.diagnoses
Generate accession_identifier number:
Generate requisition number (see Human readable requisition number) based on the specimen id. Note: requisition number should be unique for each specimen and should not match with number of another entities. So, if generated number match to existing in DB - it should be regenerated
Encode and set it into $.accession_identifier attribute
Set display_value to employees for all submitted objects
Select PRM.parties.first_name, PRM.parties.second_name, PRM.parties.last_name from PRM.parties where (PRM.parties.id == (Select PRM.employees.party_id from PRM.employees where 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
ME.specimens{specimen_id}.registered_by.reference.display == Select 1
ME.specimens{specimen_id}.collector.reference.display == Select 1, if collector type is employee
In case there are reactions ($.observations[?].reaction_on) in the request, update corresponding immunizations with the reactions:
Set in ME.patient.immunization.reaction.detail $.observation.id as a reference
note: $.observations[?].reaction_on should not be saved in observation, only in corresponding immunization
Set display_value for legal_entities
ME.patients.diagnostic_reports{dr_id}.managing_organization.display
ME.specimens{specimen_id}.managing_organization.display_value
Set managing_organization for submitted 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
In case encounter.incoming_referral was filled, set episode_origin to encounter
Select episode where id== (select ME.encounter.episode.identifier.value where encounter.id==(select ME.service_requests.context.identifier.value where id==$.encounter.incoming_referral.identifier.value))
In case diagnostic_reports.based_on was filled, set episode_origin to diagnostic report
Select episode where id== (select ME.encounter.episode.identifier.value where encounter.id==(select ME.service_requests.context.identifier.value where id==$.diagnostic_reports.based_on.identifier.value))
in case service request has reference on care plan and encounter.incoming_referral was filled set $.encounter.id to related to $.service_request activity[].outcome_reference
in case service request has reference on care plan and procedures.based_on was filled set $.procedures.id to related to $.service_request $.activity[].outcome_reference
in case service request has reference on care plan and diagnostic_reports.based_on was filled set $.diagnostic_reports.id to related to $.service_request activity[].outcome_reference
in case reference on service request has reference on care plan update $ .activity.status to in_progress if previous activity status was scheduled
in case reference on service request has reference on care plan update $ .activity.remaining_quantity parameter by subtracting the quantity of artifacts that have a reference on service request that contains an $.based_on.[]activity
If there are at least one record for speciality where speciality_officio = true:
Enrich encounter data with performer speciality:
SELECT speciality -> 'speciality' FROM employees WHERE speciality ->> 'speciality_officio' = 'true' AND id = $.encounter.performer.identifier.value
Set encounter.performer_speciality as CodeableConcept type with system = SPECIALITY_TYPE
In case encounter.clinical_impression was filled set $.context_episode_id to clinical_impressions data model (encounters.context.[].episode.value=clinical_impression.context_episode_id)
If any available specimen, that has already stored in DB, is referenced in Observation or Diagnostic Report - change its (Specimen) status to unavailable in DB according to RC.__Specimen status model_EN . Also, set status_reason for a specimen: system = specimen_invalidate_reasons, code = used.
Set origin_episode (if $.based_on in request and $.based_on.service_request.context != null) for Diagnostic Report:
origin_episode is an object from the $.service_request.context.episode
Set origin_episode (if $.based_on in request and $.based_on.service_request.context != null) for Procedure:
origin_episode is an object from the $.service_request.context.episode d.
Set following fields for device dispense:
performer_legal_entity= client_id from token
details.quantity.unit = description according to quantity code and system
origin_episode_id= context_episode_id from device request referenced in based_on
context_episode_id = episode referenced by current encounter
If the Package contains Device Dispense in status completed, and related Device request has reference on an Activity as a device_request.based_on, then
add reference on the device dispense resource to the outcome_reference attribute of the activity
if Activity.status is
scheduled
change it toin_progress
If the Package contains Device Dispense with related Device request that has a quantity but no medical program:
calculate remaining quantity of the related Device request
(same as onhttps://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17782015159#Service-logic):Select all Device dispenses in status completed related to the Device request, including Device dispenses from the current package
Sum
quantity
in the filtered Device dispenses as dispensed_qtyCalculate remaining_quantity = requested_quantity- dispensed_quantity
If remaining_quantity is 0, change status of the related Device request($.based_on) to completed
HTTP status codes
HTTP status code | Message | What caused the error |
---|---|---|
202 | Response |
|
401 | Access denied | |
403 | Invalid scopes | |
404 | Patient not found | |
409 | Validation error | |
422 | Validation error |
...