Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
stylenone

...

  1. Validate encounter id as a primary key (Submit Encounter Data Package | Primary key validation )

  2. Validate that the date is within acceptable limits

    1. $.encounter.date<= current_date

    2. $.encounter.date>=current_date-encounter_max_days_passed

    3. $.encounter.date>=episode.period.start where episode.id=$encounter.episode.identifier.value

      1. in case of error return 422 "Encounter’s date must be equal to or greater than start date of episode"

  3. Validate that the period is within acceptable limits

    1. $.encounter.period.start<= current_date

      1. in case of error return 422 "Date must be in past"

    2. $.encounter.period.start>=current_date-encounter_max_days_passed

      1. in case of error return 422 "Date must be greater than {{current_date-encounter_max_days_passed}}"

    3. $.encounter.period.start>=episode.period.start where episode.id=$encounter.episode.identifier.value

      1. in case of error return 422 "Encounter’s date must be equal to or greater than start date of episode"

    4. $.encounter.period.end <= current_date

      1. in case of error return 422 "End date must be equal to or less than current date"

    5. $.encounter.period.end>= $.encounter.period.start

      1. in case of error return 422 "End date must be greater than start date"

  4. Validate "episode" is an active episode that belongs to the current patient

    1. $.encounter.episode.identifier.value is one of  ME.patinet{patient_id}.episodes{*}.id

      1. in case of error return 422 "Episode with such ID is not found"

    2. $.encounter.episode.identifier.value is an ID of an Episode that meets the requirements:

      1. ME.patient{patinet_id}.episodes{episode_id}.status = 'active'

        1. in case of error return 422 "Episode is not active"

      2. ME.patient{patinet_id}.episodes{episode_id}.managing_organization==token.client_id

        1. in case of error return 422 "Managing_organization in the episode does not correspond to user`s legal_entity"

  5. Validate "visit" is a visit that belongs to the current patient

    1. $.encounter.visit.identifier.value=$.visit.id  OR  ID of already existing Visit in ME.patient{patient_id}.visit.id

      1. in case of error return 422 "Visit with such ID is not found"

  6. Validate referrals

    1. As a referral it can be referenced electronic (registered in the system) OR paper service request

    2. Validate ($.encounter.incoming_referrals OR $.encounter.paper_referral) or none in request

    3. Validate incoming referrals as  References (Submit Encounter Data Package#Referencevalidation)

    4. Validate paper referral as Object (paper_referral)

    5. Validate incoming referrals that corresponds to $.encounter.incoming_referrals[*].identifier.value have:

      1. ..used_by_legal_entity.identifier.value==token.client_id OR null

        1. in case of error return 409 "Service request is used by another legal_entity"

      2. ..status==active or program_processing_status=in_progress (any status is valid in case program_processing_status= in_progress)

        1. in case of error return 409 "Invalid service request status"

      3. ..if program is defined program_processing_status=new, in_queue or in_progress

      4. check that service_request contains based_on parameter

        1. in case based_on present in service_request

          1. verify care_plan:

            1. It should be in active status

            2. Care plan's period end (if exist) should be greater than current date or equal.

          2. verify activity:

            1. It has activity.detail.kind=service_request; activity.detail.product_reference=service_id. 

            2. It has scheduled, in_progress status

            3. For an old activities (has no units in quantity) validate remaining_quantity as described at Submit Encounter Data Package#Relatedcareplanvalidation

        2. in case based_on not present in request skip previous validations.

      5. Check if service request quantity is not exhausted as described at related service request validation

  7. Validate performer

    1. $.encounter.performer.identifier.value is an ID of existing employee in PRM.Employees

      1. in case of error return "There is no Employee with such id"

    2. $.encounter.performer.identifier.value  == PRM.Employees.id where (PRM.Employees.status==`active`)

      1. in case of error return "Employee is not active"

    3. $.encounter.performer.identifier.value  == PRM.Employees.id where (PRM.Employees.legal_entity== client_id)

      1. "User can not create encounter for this legal_entity"

    4. validate employee type according to encounter.class - use config file (employee_encounter_classes)

      1. in case error return 422, "Employee.type $type is forbidden for your encounter class"

    5. according to employee.type as stated in employee_encounter_types

      1. in case error return 422, msg "Employee.type $type is forbidden for your encounter type"

  8. division

    1. $.encounter.division.identifier.value must meet the following requirements

      1. PRM.division.status = "ACTIVE"

        1. in case of error return 409 "Division is not active " 

      2. PRM.division.legal_entity= token.client_id

        1. in case of error return 409 "User is not allowed to create encouners for this division"

  9. Validate supporting_info as References (Submit Encounter Data Package#Referencevalidation)

  10. Validate encounter.class  

    1. according to legal_entity.type - use config file (legal_entity_encounter_classes)

      1. in case error return 409, msg "Encounter.class $class is forbidden for your legal entity type"

    2. according to episode.type - use config file (episode_type_encounter_classes)

      1. in case error return 409, msg "Encounter.class $class is forbidden for your episode type"

    3. according to employee.type as stated in (employee_encounter_classes)

      1. in case error return 409, msg "Encounter.class $class is forbidden for your employee type"

  11. Validate encounter.type 

    1. according to encounter.class - use config file (encounter_class_encounter_types)

      1. in case error return 409, msg "Encounter.type $type is forbidden for your encounter class"

  12. Validate actions 

    1. Validate actions presence according to  encounter class validations

      1. in case error return '422', msg 'TBC'

    2. Defined in the system that corresponds to  encounter class validations

      1. in case error return '422', msg 'TBC'

  13. Validate action_references 
    Note. For encounter.action_references pass only "service", and the "service_group" does not pass

    1. Validate action_references presence according to  encounter class validations

      1. in case error return '422', msg 'At least one of action references, diagnostic reports or procedures should exist in encounter package'

    2. Validate code as a Reference(Submit Encounter Data Package#Referencevalidation)

    3. Validate action_references is in prm.services, has status ACTIVE and is_active = true

      1. in case error return '422', msg 'Service with such ID is not found'

      2. in case error return '422', msg 'Service should be active'

    4. Validate that action_references is service with service.category==”counselling” in case encounter.class=”AMB”

      1. in case error return ‘422', msg 'Invalid service category for AMB encounter class'

  14.  Validate diagnoses 

    1. Validate conditions as  References (Submit Encounter Data Package#Referencevalidation)

    2. Validate encounter has exactly one diagnosis where $.encounter.diagnoses[?(@.role.coding[0].code=="primary")]

      1. in case of error return 422 "Encounter must have exactly one primary diagnosis"

    3. Validate condition.id is in DB or in current Encounter package 

    4. Validate that each condition is active (verification_status != entered_in_error)

      1. in case of error return 409 "Conditions in diagnoses must be active"

    5. Validate that primary diagnosis defined in the system that corresponds to  encounter class validations

      1. in case of error "Primary diagnosis should be defined in {$.encounter.diagnoses[*].role.coding[*].system } system"

  15. Validate reasons

    1. Validate reasons presence according to encounter class validations

      1. in case error return '422', msg 'Validation failed. You can find validators description at our API Manifest: http://docs.apimanifest.apiary.io/#introduction/interacting-with-api/errors.', description 'can't be blank.

  16. Validate hospitalization 

    1. Validate hospitalization presence according to  encounter class validations

      1. in case error return 422, msg "Hospitalization block is forbidden for encounter.class = $encounter.class" 

    2. Validate all fields according to schemata

      1. destination

      2. discharge_disposition

      3. pre_admission_identifier

      4. admit_source

      5. re_admission

      6. discharge_department

    3. If encounter.type.code = "discharge" than encounter.hospitalization.admit_source is required, encounter.hospitalization.discharge_disposition is required, encounter.hospitalization.discharge_department is required

      1. in case error return 422, msg "<parameter> is required for encounter.type.code = "discharge"

    4. Validate destination is a valid legal_entity in prm with status is ACTIVE and is_active = true

      1. in case error return 422, "Legal entity is not active"

  17.  Validate patient_id for encounter.type == "patient_identity"

    1. $patient_id should exist in mpi.prepersons.id, have status =='ACTIVE' and is_active = true

      1. in case error return 'TBC', msg 'TBC'

  18. 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

    1. If service_requests.code.identifier.value is service, validate $resourse.code.identifier.value = service_requests.code.identifier.value

      1. in case error return 409, "Service in $resourse differ from service in service request"

    2. 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')

      1. in case error return 409, "Service in $resourse differ from services in service request's service_group"

    3. Validate $resourse.service.is_active = true

      1. in case error return 409, "Service should be active"

  19. If patient is person - validate verification status:

    1. If encounter has incoming referral with service request, then skip this validation.

    2. Else check patient's verification_status is not equal to NOT_VERIFIED.

      1. in case NOT_VERIFIED - return error 409, "Patient is not verified"

...

  1. Validate observations ids as  primary keys (Submit Encounter Data Package | Primary key validation )

  2. Validate that context of observation is a current encounter

    1. $.observations[*].context.identifier.value==$.encounter.id

      1. in case of error return "Submitted context is not allowed for the observation"

  3. Validate that the date is within acceptable limits

    1. $.observations[*].issued <= current_time

      1. in case of error return "Issued date must be in past"

    2. $.observations[*].issued>=current_date-observation_max_days_passed

      1. in case of error "Issued must be greater than  {{current_date-observation_max_days_passed}}"

  4. Validate performer(asserter)

  5. Validate $.observations[*].components

    1.  if $.observations[*].code.coding[*].system is "eHealth/ICF/classifiers":

      1. Check number of component items with $.observations[*].components[*].code.coding[*].system = "eHealth/ICF/qualifiers": 

        1. if $.observations[*].code.coding[*].code starts from "b" letter, then components must contain exact 1 item with:

          1. $.observations[*].components[*].code.coding[*].code = "extent_or_magnitude_of_impairment" 

            1. in case of missing qualifier - return 422 "Missing components with qualifiers <list of missing qualifiers>"

            2. in case of incorrect number of qualifiers - return 422 "Required 1 component, but got <number of items>"

            3. in case value is not active in dictionary - return 422 "Value is not active"

        2. if $.observations[*].code.coding[*].code starts from "s" letter, then components must contain exact 3 items with:

          1. $.observations[*].components[*].code.coding[*].code = "extent_or_magnitude_of_impairment"

          2. $.observations[*].components[*].code.coding[*].code = "nature_of_change_in_body_structure"

          3. $.observations[*].components[*].code.coding[*].code = "anatomical_localization"

            1. in case of missing qualifier - return 422 "Missing components with qualifiers <list of missing qualifiers>"

            2. in case of incorrect number of qualifiers - return 422 "Required 3 components, but got <number of items>"

            3. in case value is not active in dictionary - return 422 "Value is not active"

        3. if $.observations[*].code.coding[*].code starts from "d" letter, then components must contain exact 2 items with:

          1. $.observations[*].components[*].code.coding[*].code = "performance"

          2. $.observations[*].components[*].code.coding[*].code = "capacity"

            1. in case of missing qualifier - return 422 "Missing components with qualifiers <list of missing qualifiers>"

            2. in case of incorrect number of qualifiers - return 422 "Required 2 components, but got <number of items>"

            3. in case value is not active in dictionary - return 422 "Value is not active"

        4. if $.observations[*].code.coding[*].code starts from "e" letter, then components must contain exact 1 item with:

          1. $.observations[*].components[*].code.coding[*].code = "barrier_or_facilitator"

            1. in case of missing qualifier - return 422 "Missing components with qualifiers <list of missing qualifiers>"

            2. in case of incorrect number of qualifiers - return 422 "Required 1 component, but got <number of items>"

            3. in case value is not active in dictionary - return 422 "Value is not active"

      2. Check $.observations[*].components[*].value_codeable_concept is present in each item with $.observations[*].components[*].code.coding[*].system = "eHealth/ICF/qualifiers" and  $.observations[*].components[*].value_codeable_concept.coding[*].system corresponds to $.observations[*].components[*].code.coding[*].code

        1.  

          1. in case not present or doesn't correspond -  return 422 "Doesn't correspond to $.observations[i].components[i].code"

          2. in case code value is not active in dictionary - return 422 "Value is not active"

  6. if observations[*].categories[0].coding[0].system == "eHealth/ICF/observation_categories" - skip validation of observations[*].value and make this fields optional

    1. else - check that one off this fields present:

      1. Validate$.observations[*].components[*].value_period as a Period

      2. Validate $.observations[*].value_quantity

        1. $.observations[*].value must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        2. $.observations[*].comparator can take the following values : [">", ">=", "=", "<=", "<"]

          1. in case of error return "value is not allowed in enum"

        3. $.observations[*].unit can take values from dictionary eHealth/ucum/units 

          1. in case of error return "value is not allowed in enum"

      3. Validate $.observations[*].value_codeable_concept

        1. $.observations[*].code validate that the code belongs to the dictionary system

          1. in case of error return "Value is not allowed in enum"

      4. Validate $.observations[*].value_boolean

        1. $.observations[*].value_boolean must be boolean type

          1. in case of error return "type mismatch. Expected boolean but got {entered type}"

      5. Validate $.observations[*].value_string

        1. $.observations[*].value_string must be string type

          1. in case of error return "type mismatch. Expected string but got {entered type}"

      6. Validate $.observations[*].value_sampled_data

        1. $.observations[*].data must be string type

          1. in case of error return "type mismatch. Expected string but got {entered type}"

        2. $.observations[*].origin must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        3. $.observations[*].period must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        4. $.observations[*].factor must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        5. $.observations[*].lower_limit must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        6. $.observations[*].upper_limit must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

        7. $.observations[*].dimensions must be with number type

          1. in case of error return "type mismatch. Expected number but got {entered type}"

      7. Validate $.observations[*].value_range

        1. $.observations[*].low must be with object type

          1. in case of error return "type mismatch. Expected object but got {entered type}"

        2. $.observations[*].high must be with object type

          1. in case of error return "type mismatch. Expected object but got {entered type}"

      8. Validate $.observations[*].value_ratio

        1. $.observations[*].numerator must be with object type

          1. in case of error return "type mismatch. Expected object but got {entered type}"

        2. $.observations[*].denominator must be with object type

          1. in case of error return "type mismatch. Expected object but got {entered type}"

      9. Validate $.observations[*].value_time

        1. $.observations[*].value_time must be with string type

          1. in case of error return "type mismatch. Expected string but got {entered type}"

      10. Validate $.observations[*].value_date_time

        1. $.observations[*].value_date_time must be with string type

          1. in case of error return "type mismatch. Expected string but got {entered type}"

  7. Validate diagnostic report is one of reports in the current package

    1. $.observations[*].diagnostic_report.identifier.value == one of $.diagnostic_report[*].identifier.value

      1. in case of error "Invalid reference"

  8. Validate $.observations[*].reaction_on

    1. check that the appropriate immunizations.status != "entered_in_error"

      1. in case of error return 409 "Immunization with status ‘entered_in_error’ can not be use"

  9. Validate $.observations[*].code

    1. if $.observations.code.coding[*].code value is included in chart variables 'OBSERVATION_CODES_WITH_<VALUE_TYPE>_REQUIRED', <value_type> field is mandatory

      1.  in case of error return 422 “This field is required for code = <code>“

    2. if observations[*].code.coding[*].system is "eHealth/ICF/classifiers", then:

      1. Check observations[*].categories[*].coding[*].system should contain "eHealth/ICF/observation_categories"

        1. in case of error return 422 “Code doesn't match observation category“

      2. Check observations[*].components are presented

        1. in case of error return 422 “Components required“

    3. Validate $.observations.code.coding[*].code is active in corresponding dictionary

      1. in case of error return 409, “Value is not active”

  10. Validate $.observations[*].categories

    1. is an array with only one item

      1. in case of error return 422 "Expected a maximum of 1 items but got <number of elements>"

    2. $.observations[*].categories[*].coding[*].system is "eHealth/observation_categories" or "eHealth/ICF/observation_categories" 

      1. in case of error return 422 "Value is not allowed in enum"

    3. $.observations[*].categories[*].coding[*].code corresponds to the system

      1. in case of error return 422 "Value <code> not found in the dictionary <$.observations[*].categories[*].coding[*].system>"

    4. Validate $.observations.categories[*].coding[*].code is active in corresponding dictionary

      1. in case of error return 409, “Value is not active”

    5. If $.observations[*].categories[*].coding[*].system = "eHealth/ICF/observation_categories", then $.observations[*].code should be filled from "eHealth/ICF/classifiers" dictionary. Also, check $.observations[*].categories[*].coding[*].code value match following $.observations[*].code.coding[*].code value:

      1. if category code is functions, then code value should start with "b" letter

      2. if category code is structures, then code value should start with "s" letter

      3. if category code is activities, then code value should start with "d" letter

      4. if category code is environmental, then code value should start with "e" letter 

        1. in case of error return 422 “Code doesn't match observation category“

  11. Validate specimen, if submitted:

    1. Check the field is a Reference on a specimen resource

      1. in case of error return 422 “not allowed in enum”

    2. Check it exists in DB or within current package, and belongs to the same patient:

      1. in case of error return 422 "Specimen not found"

    3. Check status:

      1. is available if the specimen was found in the DB

        1. in case of error return 422 "Specimen created before the current package should be available"

      2. is unavailable if the specimen not found in the DB, but in the package

        1. in case of error return 422 "Specimen created in the current package should be unavailable"

  12. Validate device:

    1. Check the field is a Reference on a equipment resource

      1. in case of error return 422 “not allowed in enum”

    2. Validate status is 'ACTIVE' and is_active=true

      1. in case error return 422 “Equipment is not active“

    3. Validate availability_status is 'Available' 

      1. in case error return 422 ('Equipment is not available')

    4. Validate  is legal_entity_id is Legal entity for performer in Encounter

      1. in case error return 422 ('Equipment does not belong to Legal entity')

    5. If Equipment and Encounter has a division, then validate it is the same Division

      1. in case error return 422 ('Equipment does not belong to division from the encounter')

Validate observations for encounter.type == "patient_identity" 

...

  1. Validate diagnostic reports ids as primary keys (Submit Encounter Data Package | Primary key validation )

  2. Validate based_on as Reference(Submit Encounter Data Package#Referencevalidation)

  3. Validate that service_request, referenced as based_on, is

    1. in status is active or program_processing_status=in_progress (any status is valid in case program_processing_status= in_progress)

      1. in case of error return 409 "Invalid service request status"

    2. if program is defined than used_by_legal_entity==token.client_id OR null

      1. in case of error return 409 "Service request is used by another legal_entity"

    3. if program is defined than program_processing_status == new, in_queue or in_progress

    4. check that service_request contains based_on parameter

      1. in case based_on present in service_request

        1. verify care_plan:

          1. It should be in active status

          2. Care plan's period end (if exist) should be greater than current date or equal.

        2. verify activity:

          1. It has activity.detail.kind=service_request; activity.detail.product_reference=service_id. 

          2. It has scheduled, in_progress status

          3. For an old activities (has no units in quantity) validate remaining_quantity as described at Submit Encounter Data Package#Relatedcareplanvalidation

      2. in case based_on not present in request skip previous validations.

    5. Check if service request quantity is not exhausted as described at related service request validation

  4. category

    1. Validate that one of diagnostic reports categories corresponds to service category, that is references as code in DR

      1. $.diagnostic_report.category[?]=PRM.services.category where PRM.services.id=$.diagnostic_report.code.identifier.value

        1. in case of error return 422 "None of the diagnostic report categories matches with the service category"

  5. Validate code

    1. Validate code as Reference(Submit Encounter Data Package#Referencevalidation)

    2. If service_requests.code.identifier.value is service, validate $diagnostic_report.code.identifier.value = service_requests.code.identifier.value

      1. in case error return 409, "Service in diagnostic_report differ from service in service request"

    3. 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')

      1. in case error return 409, "Service in diagnostic_report differ from services in service request's service_group"

    4. Validate diagnostic_report.service.is_active = true

      1. in case error return 409, "Service should be active"

  6. Validate effective_period as a period (Submit Encounter Data Package#period_validationPeriodValidation)

  7. Validate that issued is within acceptable limits

    1. $.diagnostic_reports[*].issued<= current date_time

      1. in case of error 422 "Asserted date  must be in past"

    2. $.diagnostic_reports[*].issued>=current_date-diagnostic_report_max_days_passed

      1. in case of error 422 "Issued must be greater than  {{current_date-diagnostic_report_max_days_passed}}" 

  8. Validate recorded_by as Employee (Submit Encounter Data Package#Employeevalidation)

  9. Validate encounter

    1. $.diagnostic_reports[*].encounter.identifier.value == $.encounter.id

      1. in case of error 409 "Invalid reference"

  10. Validate performer

    1.  as Employee Submit Encounter Data Package#Employeevalidation

    2. according to logic Submit Encounter Data Package#Performer(asserter)validation

  11. Validate managing_organization is a current legal_entity

    1. $.managing_organization.identifier.value==token.client_id

      1. in case of error 409 "Managing organization does not correspond to user's legal entity."

  12. Validate result_interpreter.identifier as Employee (Submit Encounter Data Package#Employeevalidation)

  13. Validate result_interpreter.identifier is an employee with employee_type = DOCTOR or SPECIALIST

  14. Validate only One of the fields is filled:

    1. $.diagnostic_report[*].results_interpreter.reference OR $.diagnostic_report[*].results_interpreter.text

    2. $.diagnostic_report[*].performer.reference OR $.diagnostic_report[*].performer.text

  15. Validate primary_source

    1. If primary_source==true, then

      1. Managing organization MUST be filled

      2. performer.reference MUST be filled

    2. If primary_source==false, then

      1. report_origin must be filled

      2. performer.text may be filled 

      3. performer.reference must NOT be filled

      4. results_enterpreter.reference must NOT be filled

  16. If patient is person - validate verification status:

    1. If diagnostic report has based_on with service request, then skip this validation.

    2. Else check patient's verification_status is not equal to NOT_VERIFIED.

      1. in case NOT_VERIFIED - return error 409, "Patient is not verified"

  17. Validate specimens, if submitted:

    1. Check field has array with elements of Reference type on specimen resource

      1. in case of error return 422 “not allowed in enum”

    2. For each specimen check:

      1. Check it exists in DB or within current package, and belongs to the same patient:

        1. in case of error return 422 "Specimen not found"

      2. Check it is present in the only one diagnostic report within the package.

        1. in case of error return 422 "Specimen is already used in another diagnostic report"

      3. Check status:

        1. is available if the specimen found in the DB

          1. in case of error return 422 "Specimen created before the current package should be available"

        2. is unavailable if the specimen not found in the DB, but in the package

          1. in case of error return 422 "Specimen created in the current package should be unavailable"

  18. Validate used_references

    1. Validate used_reference.identifier.type.coding.[0].code is 'equipment'

      1. in case error return 422 "value is not allowed in enum"

    2. Validate used_reference.identifier.type.coding.[0].code is status is 'ACTIVE' and is_active=true

      1. in case error return 422 ('Equipment is not active')

    3. Validate used_reference.identifier.type.coding.[0].code is availability_status is 'Available' 

      1. in case error return 422 ('Equipment is not available')

    4. Validate used_reference.identifier.type.coding.[0].code is legal_entity_id is Legal entity for performer in Encounter

      1. in case error return 422 ('Equipment does not belong to Legal entity')

    5. If Equipment and Diagnostic report has a division, then validate it is the same Division

      1. in case error return 422 ('Equipment does not belong to division from diagnostic report')

Validate Procedures

  1. Validate by json schema

  2. Validate procedure id as primary key (Submit Encounter Data Package | Primary key validation )

  3. Validate status

    1. On create procedure status could be completed or not_done. `entered_in_error` could be set on update procedure.

      1. error 422 by json schema

  4. Validate code

    1. Validate code as Reference(Submit Encounter Data Package#Referencevalidation)

    2. Validate procedure.service.is_active = true

      1. in case error return 409, "Service is not active"

  5. Validate that service_request, referenced as based_on, is

    1. check that service_request contains based_on parameter

      1. in case based_on present in service_request

        1. verify care_plan:

          1. It should be in active status

          2. Care plan's period end (if exist) should be greater than current date or equal.

        2. verify activity:

          1. It has activity.detail.kind=service_request; activity.detail.product_reference=service_id. 

          2. It has scheduled, in_progress status

          3. For an old activities (has no units in quantity) validate remaining_quantity as described at Submit Encounter Data Package#Relatedcareplanvalidation

      2. in case based_on not present in request skip previous validations.

    2. Check if service request quantity is not exhausted as described at related service request validation

  6. Validate encounter

    1. $.procedure[*].encounter.identifier.value == $.encounter.id

      1. in case error return 409, "Submitted encounter is not allowed for procedure"

  7. Validate performed_period/performed_date_time:

    1. if $.status == "not_done" check that  performed_period/performed_date_time fields are not present in request

      1. in case error return 422 entry: "$.performed_period" (or "$.performed_date_time"), rules[0].description: "Must not be present in procedure with status <$.status>"

    2. else, if $.status == "completed":

      1. Check that only one of this parameters present

        1. in case error return 422 "Only one of the parameters must be present"

      2. Validate performed_date_time

        1.  performed_date_time is real

          1. in case error return 422, "Performed_date_time in invalid"

        2. performed_date_time <= now

          1. in case error return 422 "Procedure cannot be registered in future"

      3. Validate performed_period

        1. $.performed_period.start<= now

          1. in case of error return 422 "Procedure cannot be registered in future"

        2. $.performed_period.end>= $.performed_period.start

          1. in case of error return 422 "End date must be greater than start date"

        3. performed_period.end <= now

          1. in case error return 422 "Procedure cannot be registered in future"

        4. Validate $.performed_period as required field in case if procedure based on service request with quantity that has code=MINUTE (system=SERVICE_UNIT)

          1. in case of error return 422 "can't be blank"

  8. Validate recorded_by

    1. Validate recorded_by as Reference(Submit Encounter Data Package#Referencevalidation)

    2. $..recorded_by.identifier.value is an ID of existing employee in PRM.employee

      1. in case of error  return 422, "Employee with such id is not found"

    3. Validate recorded_by is employee with status='APPROVED' and is_active= true and end_date is null or more than today

      1. in case error return 409, "This action is prohibited for current employee" 

    4. Validate employees.legal_entity_id=$managing_organization.identifier.value

      1. in case error return 409, "Employee should be from current legal entity"

  9. Validate asserter

  10. Validate division

    1. Validate division as Reference (Submit Encounter Data Package#Referencevalidation)

    2. $division is an ID in PRM.divisions

      1. in case return 422, "Division with such id is not found"

    3. division.status=ACTIVE and is_active=true

      1. in case error return 409, "Division is not active"

    4. division.legal_entity_id = $client_id or division.legal_entity_id=$managing_organization.identifier.value

      1. in case error return 409, "Division is not in current legal_entity"

  11. Validate managing_organization is a current active legal_entity with proper type

    1.  as Reference (Submit Encounter Data Package#Referencevalidation)

    2. $managing_organization is an ID in PRM.legal_entities

      1. in case return 422, "Legal entity with such id is not found"

    3. validate managing_organization status is 'ACTIVE' and is_active=true

      1. in case error return 422 ('Legal entity is not active')

    4. validate legal_entity type is in ('PRIMARY_CARE','MSP','MSP_PHARMACY','MSP_PHARMACY') (use `ME_ALLOWED_TRANSACTIONS_LE_TYPES` from charts)

      1. in case error return 422, "Legal entity with type $legal_entity.type cannot perform procedures"

    5. validate $managing_organization.identifier.value = $client_id

      1. in case of error 409 "Managing organization does not correspond to user's legal entity."

  12. Validate reason_references

    1. Validate reason_reference as a Reference (Submit Encounter Data Package#Referencevalidation)

    2. Validate reason_refernce.identifier.type.coding.[0].code is 'condition' or 'observation'

      1. in case error return 422 "value is not allowed in enum"

    3. Validate reason_refernce.identifier.value is condition or observation not in status ENTERED_IN_ERROR

      1. in case error return 422, "<Medical event resource> in "entered_in_error" status can not be referenced"

  13. Validate outcome

    1. validate outcome as a Reference (Submit Encounter Data Package#Referencevalidation)

    2. validate outcome.coding.object.system is in dictionary eHealth/procedure_outcomes

      1. in case error return 422, "outcome not in dictionary eHealth/procedure_outcomes"

  14. Validate complication_details

    1. validate complication_details as a Reference (Submit Encounter Data Package#Referencevalidation)

    2. validate complication_details.identifier.value refer to condition in the same encounter package

      1. in case error return 422, "complication_details does not correspond to condition in this encounter package"

  15. Validate category

    1. according to the dictionary 'eHealth/procedure_categories' - by schemata

    2. Validate that procedure category corresponds to service category, that is references as code in procedure

      1. $.procedure.category=PRM.services.category where PRM.services.id=$.procedure.code.identifier.value

        1. in case of error return 422 "Procedure category does not match with the service category"

  16. If patient is person - validate verification status:

    1. If procedure has based_on with service request, then skip this validation.

    2. Else check patient verification_status is not equal to NOT_VERIFIED.

      1. in case NOT_VERIFIED - return error 409, "Patient is not verified"

  17. Validate used_codes

    1. Check that the $.used_codes[*].coding[*].code belongs to the dictionary in $.used_codes[*].coding[*].system

      1. in case of error - return 422 "Value is not allowed in enum"

    2. Validate 'used_codes.coding.code'  is_active = true

      1. in case error return 409, "Value is not active"

  18. Validate used_references

    1. Validate used_reference.identifier.type.coding.[0].code is 'equipment'

      1. in case error return 422 "value is not allowed in enum"

    2. Validate used_reference.identifier.type.coding.[0].code is status is 'ACTIVE' and is_active=true

      1. in case error return 422 ('Equipment is not active')

    3. Validate used_reference.identifier.type.coding.[0].code is availability_status is 'Available' 

      1. in case error return 422 ('Equipment is not available')

    4. Validate used_reference.identifier.type.coding.[0].code is legal_entity_id is Legal entity for performer in Encounter

      1. in case error return 422 ('Equipment does not belong to Legal entity')

    5. If Equipment and Procedure has a division, then validate it is the same Divisioin

      1. in case error return 422 ('Equipment does not belong to division from procedure')

  19. Validate focal_device is an array of objects with action and manipulated attributes, optional. For each element:

    1. Check that $.action is of CodeableConcept type, optional:

      1. Check that $.action.system is procedure_focal_device_actions dictionary, required

        1. in case of error - return 422 ('value is not allowed in enum')

      2. Check that $.action.code comply with $.action.system, required

        1. in case of error - return 422 ('value is not allowed in enum')

    2. Check that $.manipulated is a Reference on Device resource, required

      1. Check that Device exists in the current package or in the DB and belongs to the patient ($.subject)

        1. in case of error - return 422 ('Device not found')

      2. Check that Device has status = active

        1. in case of error - return 422 ('Device is not active')

Validate Clinical impression

...

  1. Validate by json schema

  2. Validate device dispenses ids as  primary keys (Submit Encounter Data Package | Primary key validation )

  3. Validate device dispenses's root attributes:

    1. Validate performer, location as described at Create Device dispense | Validate dispense

    2. Validate $.status isCOMPLETED or DECLIEND

      1. else - return 422 ("value is not allowed in enum")

    3. If based_on is present, validate:

      1. Check it references to device_request resource

        • in case of error - return 422 ('value is not allowed in enum')

      2. Check that device request exists and belongs to the same patient

        • in case of error - return 422 ('Device request not found')

      3. Сheck that device request is in status 'active'

        1. in case of error - return 409 error ('Device request is not active')

      4. 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')

      5. Verify care plan Activity as described in Qualify Device request | Validate related Care plan

      6. 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')

      7. Verify care plan Activity as described in Qualify Device request | Validate related Care plan

    4. validate when_handed_over

      1. 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')

    5. Validate encounter :

      1. Validate encounter references the current encounter, submitted within the same package

        1. $.device_dispenses[*].encounter.identifier.value==$.encounter.id

          1. in case of error return 422 "Device dispense can only reference encounter from the same package"

      2. Validate encounter period fully contains when_handed_over date

        1. $.encounter.period.start<$.device_dispenses[*].when_handed_over and $.encounter.period.end_date>$.device_dispenses[*].when_handed_over

          1. in case of error return 422 "Device dispense when_handed_over date doesn’t match with encounter period”

    6. Validate part_of:

      1. Check it references to procedure resource

        • in case of error - return 422 ('value is not allowed in enum')

      2. 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"

      3. Validate that procedure is not in status "entered_in_error" or “not_done”

        • in case of error - return 422 ("Procedure in <status> status can not be referenced")

    7. Validate supporting_info:

      1. 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')

      2. 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')

      3. 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")

    8. Validate $.details.device_code if present:

      1. if based_on is present validate Dispense details as described at Create Device dispense | Validate device

      2. if based_on is NOT present:

        1. Check system($.details.device_code.coding.system) = device_definition_classification_type

          1. in case of error - return 422 ('value is not allowed in enum')

        2. Get device_code from the dictionary device_definition_classification_type($.details.device_code.coding.code) and check parameter is_active = true

          1. in case of error - return 422 ('Device code not foundvalue is not allowed in enum')

    9. If reference on Device definition is present in $.details.device:

      1. if based_on is present: Create Device dispense | Validate device_code

      2. if based_on is NOT present

        1. Check code ($.details.device.identifier.type.coding.code) = device_definition

          1. in case of error - return 422 ('value is not allowed in enum')

        2. Get device definition by id ($.details.device.identifier.value)

          1. device_definition.is_active = true

            1. in case of error - return 422 ('Device definition not found')

      3. 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”

    10. If reference on Device is present in $.details.device:

      1. 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')

      2. Validate that device status is in status "active"

        • in case of error - return 422 ("Only Devices in status "active" can be referenced")

      3. Validate that device.availability_status is “available”

        1. in case of error - return 422 ("Only Devices in availability_status"available" can be referenced")

      4. If based_on is present, validate:

        1. if referenced Device request($.based_on) contains code (device_request.code)

          1. Check that the type in the Device($.details.device) is equal to the code in the Device request($.based_on)

            1. in case of error - return 422 ("Dispensed device doesn’t match with prescribed device")

        2. if referenced Device request($.based_on) contains code_reference (device_request.code_reference)

          1. Check that the definition in the Device($.details.device) is equal to the code_reference in the Device request($.based_on)

            1. in case of error - return 422 ("Dispensed device doesn’t match with prescribed device")

  4. Validate quantity

    1. if based_on is present validate quantity as described at Create Device dispense | Valdate quantity , but also include Device dispenses from the current package in remaining_quantity calculation

    2. else validate quantity.value is an integer bigger than 0

  5. Validate related Care plan

    1. Verify care plan Activity as described in Qualify Device request | Validate related Care plan

Validate Devices

  1. Validate by json schema

  2. Validate device id as a primary key (Submit Encounter Data Package | Primary key validation )

  3. Validate that context of Devices is a current encounter

    1. Check that $.devices[*].context.identifier.value == $.encounter.id

      1. in case of error - return 422 ('Submitted context is not allowed for the device')

  4. Validate identifier is of Identifier type, optional

    1. Check $.identifier.type is of CodeableConcept type, required:

      1. Check that $.type.system is external_systemdictionary, required

        1. in case of error - return 422 ('value is not allowed in enum')

      2. Check that $.type.code comply with $.type.system, required

        1. in case of error - return 422 ('value is not allowed in enum')

    2. Check $.identifier.value is of String type, required

  5. Validate definition is a Reference on Device Definition resource, optional

    1. Check that Device Definition exists

      1. in case of error - return 422 ('Device definition not found')

    2. Check that Device Definition is_active

      1. in case of error - return 422 ('Device definition is not active')

    3. Check that classification_type of the Device Definition matches to the $.type

      1. in case of error - return 422 ('Device definition type doesn't match device type')

  6. Validate status is of String type, required

    1. Check it is active , according to eHealth/device_statuses dictionary

      • in case of error - return 422 ('value is not allowed in enum')

  7. Validate name is an array of objects with type and value attributes, required

    1. Check array contains at least one element

      1. in case of error - return 422 ('expected a minimum of <min> items but got <actual>')

    2. For each element:

      1. Check that $.type is device_name_typedictionary, required

        1. in case of error - return 422 ('value is not allowed in enum')

      2. Check that $.value comply with $.type, required

        1. in case of error - return 422 ('value is not allowed in enum')

    3. Check that there are no duplicated name types within names ($.name.type must be unique within $.name array)

      1. in case of error - return 422 ('Values are not unique by 'type')

  8. Validate type is of CodeableConcept type, required:

    1. Check that $.type.system is device_definition_classification_typedictionary, required

      1. in case of error - return 422 ('value is not allowed in enum')

    2. Check that $.type.code comply with $.type.system, requiredcomply with $.type.system, required

      1. in case of error - return 422 ('value is not allowed in enum')

    3. Check that $.type.coding.code is in allowed active values from device_definition_classification_type dictionary.

      1. in case of error - return 422 ('value is not allowed in enum')

  9. Validate property is an array of objects with code and value_[x] attributes, optional. For each element in the array:

    1. Check that value from $.property.code is in allowed active values from device_properties dictionary.

      1. in case of error - return 422 ('value is not allowed in enum')

    2. Check $.property.value_[x] is one of the following: value_codeable_concept, value_quantity, value_boolean, value_range, value_integer, value_string

      1. in case of value_[x] is missing - return 422 ('At least one of the properties must be present')

      2. in case of more than one value_[x] provided - return 422 ('Only one of the properties must be present')

      3. in case of value_[x] is provided with incorrect type - return 422 ('type mismatch. Expected [x] but got <type>')

  10. Validate parent is a Reference on Device resource, optional. Validate it according to Submit Encounter Data Package#Referencevalidation

  11. Validate recorder is a Reference on Employee resource, required

    1. Check that $.recorder.identifier.value is an id of existing employee in DB (PRM.employees)

      1. in case of error - return 422 ('Employee with such id is not found')

    2. Check that employee has status='APPROVED' and is_active= true and end_date is null or more than today

      1. in case error - return 422 ('This action is prohibited for current employee')

    3. Extract user_id from token. Check that recorder belongs to one of the user’s employee.

      1. in case of error - return 422 ('User is not allowed to register the device for the employee')

  12. Validate manufacture_date is a timestamp, optional

    1. Check it is less than current date

      1. in case of error - return 422 ('Manufacture date must be in the past')

  13. Check if there is at least one related Device Association in the current package, that has status implanted or attached

    1. in case of error - return 422 ('No device association with status implanted or attached found for the device within current package')

Validate Device Association

  1. Validate by json schema

  2. Validate device id as a primary key (Submit Encounter Data Package | Primary key validation )

  3. Validate that context of Device Associations is a current encounter

    1. Check that $.device_associations[*].context.identifier.value == $.encounter.id

      1. in case of error - return 422 ('Submitted context is not allowed for the device association')

  4. Validate device is a Reference on Device resource, required

    1. Check that Device exists in the current package or in the DB and belongs to the patient ($.subject)

      1. in case of error - return 422 ('Device not found')

    2. Check Device has a status that is not entered_in_error

      1. in case of error - return 422 ('Device in 'entered_in_error' status can not be referenced')

  5. Validate status is of String type, required

    1. Check it is implanted , explanted, attached or unattached according to device_association_statuses dictionary

      • in case of error - return 422 ('value is not allowed in enum')

    2. If $.device in the current package:

      1. Check if current Device Association is the one of two allowed in the package for the Device ($.device).

        1. in case of more then one found - return 422 ('Maximum 2 device associations allowed in the package for the registered device')

      2. Validate found in the package another Device Association in relation to the current Device Association status:

        1. if status is implanted , then there is no another Device Associations OR exists only one with status=explanted and its recorded datetime is greater then $.recorded datetime of the current association

          1. in case another association has invalid status - return 422 ('Another device association should be in corresponding status to implanted')

          2. in case explanted has recorded before the implanted - return 422 ('Device association with implanted status should have $.recorded before association with status explanted')

        2. if status is explanted , then there exists Device Association in status=implanted for the $.device

          1. in case of error - return 422 ('Device association with implanted status should exist before submitting association with status explanted')

        3. if status is attached , then there is no another Device Associations OR exists only one with status=unatached and its recorded datetime is greater then $.recorded datetime of the current association

          1. in case another association has invalid status - return 422 ('Another device association should be in corresponding status to attached')

          2. in case unattached has recorded before the attached - return 422 ('Device association with attached status should have $.recorded before association with status unattached')

        4. if status is unattached , then there exists Device Association in status=attached for the $.device

          1. in case of error - return 422 ('Device association with attached status should exist before submitting association with status unattached')

    3. If $.device is already existing in the DB:

      1. Check there is no another Device Associations for the Device ($.device) in the current package

        1. in case of error - return 422 ('Maximum 1 device association allowed in the package for the existing device')

      2. Check current Device Association is not in implanted status

        1. in case of error - return 422 ('Device can not be implanted')

      3. Find the last Device Association of the Device ($.device) that is not in eneterd_in_error status using descending ordering by “recorded” field

        1. in case not found - return 422 ('The last device association not found')

      4. Validate the last that is not in eneterd_in_error status Device Association in relation to the current Device Association status:

        1. if status is explanted , then the last one has implanted status

          1. in case of error - return 422 ('The last device association must be in implanted status')

        2. if status is attached , then the last one has unattached status

          1. in case of error - return 422 ('The last device association must be in unattached status')

        3. if status is unattached , then the last one has attached status

          1. in case of error - return 422 ('The last device association must be in attached status')

  6. Validate body_site is of CodeableConcept type, optional

    1. Check that $.system is eHealth/body_sitesdictionary, required

      1. in case of error - return 422 ('value is not allowed in enum')

    2. Check that $.code comply with $.system, required

      1. in case of error - return 422 ('value is not allowed in enum')

  7. Validate recorder is a Reference on Employee resource, required

    1. Check that $.recorder.identifier.value is an id of existing employee in DB (PRM.employees)

      1. in case of error - return 422 ('Employee with such id is not found')

    2. Check that employee has status='APPROVED' and is_active= true and end_date is null or more than today

      1. in case error - return 422 ('This action is prohibited for current employee')

    3. Extract user_id from token. Check that recorder belongs to one of the user’s employee.

      1. in case of error - return 422 ('User is not allowed to register the device for the employee')

  8. Validate association_date is of Date type, optional

    1. Check it is less than or equal to current date

      1. in case of error - return 422 ('Association date must be less than or equal to current date')

  9. Validate recorded is of DateTime type, required

    1. Check it greater then the recorded datetime of the last existing Device Association (if such exists), that is not entered_in_error. Find the last Device Association of the Device ($.device) that is not in 'entered_in_error' status, using descending ordering by the 'recorded' field.

      1. in case of error - return 422 ('Must be greater than recorded datetime of the last device association')

    2. Check it less then or equal to current datetime.

      1. in case of error - return 422 ('Recorded must be less than or equal to current datetime')

Validate Detected Issues

  1. Validate by json schema

  2. Validate Detected Issue's id as a primary key (Submit Encounter Data Package | Primary key validation )

  3. Validate that encounter of Detected Issues is a current encounter

    1. Check that $.detected_issues[*].encounter.identifier.value == $.encounter.id

      1. in case of error - return 422 ('Submitted encounter is not allowed for the detected issue')

  4. Validate status is of String type, required

    1. Check it is preliminary or mitigated, according to detected_issue_statusesdictionary

      • in case of error - return 422 ('value is not allowed in enum')

  5. Validate code is of CodeableConcept type, optional

    1. Check that $.system is detected_issue_codes dictionary, required

      1. in case of error - return 422 ('value is not allowed in enum')

    2. Check that $.code comply with $.system, required

      1. in case of error - return 422 ('value is not allowed in enum')

  6. Validate author is a Reference type, required.

    • Check it references to employee or patient resource

      • in case of error - return 422 ('value is not allowed in enum')

    • If author is an employee:

      • Check it exists in the DB

        • in case of error - return 422 ('Employee not found')

      • Check it is active and approved

        • in case of error - return 422 ('Invalid employee status')

    • If author is a patient:

      • Check it is current patient ($.subjectpatient_id is a hashed person_id from URL)

        • in case of error - return 422 ('In case author is patient it must be the current patient')

  7. Validate implicated is a Reference on Device resource, optional

    1. Check that Device exists in the current package or in the DB and belongs to the patient ($.subjectpatient_id is a hashed person_id from URL)

      1. in case of error - return 422 ('Device not found')

    2. Check Device has a status that is not entered_in_error

      1. in case of error - return 422 ('Device in 'entered_in_error' status can not be referenced')

  8. Validate recorder is a Reference on Employee resource, required

    1. Check that $.recorder.identifier.value is an id of existing employee in DB (PRM.employees)

      1. in case of error - return 422 ('Employee with such id is not found')

    2. Check that employee has status='APPROVED' and is_active= true and end_date is null or more than today

      1. in case error - return 422 ('This action is prohibited for current employee')

    3. Extract user_id from token. Check that recorder belongs to one of the user’s employee.

      1. in case of error - return 422 ('User is not allowed to register the device for the employee')

  9. Validate subject is a Reference on Device resource, required

    1. Check that Device exists in the current package or in the DB and belongs to the patient ($.subjectpatient_id is a hashed person_id from URL)

      1. in case of error - return 422 ('Device not found')

    2. Check Device has a status that is not entered_in_error

      1. in case of error - return 422 ('Device in 'entered_in_error' status can not be referenced')

  10. Validate based_on is a Reference on Detected Issue resource, optional

    1. Check that Detected Issue exists in the current package or in the DB and belongs to the patient ($.patient_id is a hashed person_id from URL)

      1. in case of error - return 422 ('Detected Issue not found')

    2. Check that referenced Detected Issue has the same $.subject

      1. in case of error - return 422 ('Detected Issue has different subject')

    3. Check that referenced Detected Issue is not in entered_in_error status

      1. in case of error - return 422 ('Detected Issue in 'entered_in_error' status can not be referenced')

Primary key validation

  1. Validate that IDs of all submitted entities in the array are unique

    1. validate that $.{collection}[*].id from the payload are all unique among themselves

      1. in case of error return 409 "All primary keys must be unique"  

    2. validate there is no entity with such id in the corresponding Medical events collection

      1. in case of error return 422 "{Entity} with such id already exists"

...

  1. Save signed_content to Media Storage

  2. Generate accession_identifier number for each specimen if submitted:

    1. 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

    2. Encode and set it into $.accession_identifier attribute

  3. Save data to corresponding collections in DBs

  4. Save link to the signed content to the encounter

  5. Enrich encounter.diagnoses:

    1. select condition.code from Medical Events DB(or from request body)  where condition.id==diagnoses[@].condition.identifier.value 

    2. set diagnoses[@].code = select 1

  6. Save diagnoses from encounter to episodes.current_diagnoses

    1. ME.patients.episodes.diagnoses = $.encounter.diagnoses 

  7. Add a record to the ME.patient.episodes{episode_id}.diagnoses_hstr

    1. date = current_date

    2. evidence = reference to encounter  ($.encounter.id)

    3. diagnoses = $.encounter.diagnoses 

  8. Set display_value to employees for all submitted objects

    1. 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)) as “Select 1“

    2. ME.patients.encounters{encounter_id}.performer.display== Select 1

    3. ME.conditions{condition_id}.asserter.display == Select 1

    4. ME.observations{observation_id}.performer.display == Select 1

    5. ME.patients.immunizations{immunization_id}.performer.display == Select 1

    6. ME.patients.allergy_intolerance{ai_id}.asserter.display == Select 1

    7. ME.patients.medication_statements{ms_id}.asserter.display == Select 1

    8. ME.patients.risk_assessment{rs_id}.asserter.display == Select 1

    9. ME.patients.diagnostic_reports{dr_id}.performer.reference.display == Select 1

    10. ME.patients.diagnostic_reports{dr_id}.recorded_by.reference.display == Select 1

    11. ME.patients.diagnostic_reports{dr_id}.results_interpreter.reference.display == Select 1

    12. ME.clinical_impressions{clinical_impression_id}.assessor.display == Select 1

    13. ME.specimens{specimen_id}.registered_by.reference.display == Select 1

    14. ME.specimens{specimen_id}.collector.reference.display == Select 1, if collector’s type is employee 

    15. ME.devices{device_id}.recorder.reference.display == Select 1

    16. ME.device_associations{device_accociation_id}.recorder.reference.display == Select 1

    17. ME.device_issues{device_issue_id}.recorder.reference.display == Select 1

    18. ME.device_issues{device_issue_id}.author.reference.display == Select 1, if author’s type is employee 

  9. In case there are reactions ($.observations[?].reaction_on) in the request, update corresponding immunizations with the reactions:

    1. 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

  10. Set display_value for legal_entities

    1. ME.patients.diagnostic_reports{dr_id}.managing_organization.display_value

    2. ME.specimens{specimen_id}.managing_organization.display_value

    3. ME.devices{device_id}.recorder_legal_entity.reference.display_value

    4. ME.device_associations{device_association_id}.recorder_legal_entity.reference.display_value

    5. ME.device_issues{device_issue_id}.recorder_legal_entity.reference.display_value

  11. Set managing_organization for submitted observations, conditions, encounter

    1. ME.conditions{cond_id}.managing_organization=token.client_id

    2. ME.observations{observ_id}.managing_organization=token.client_id

    3. ME.encounters{encounter_id}.managing_organization=token.client_id

  12. In case encounter.incoming_referral was filled, set episode_origin to encounter

    1. 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))

  13. In case diagnostic_reports.based_on was filled, set episode_origin to diagnostic report

    1. 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))

  14. In case encounter.incoming_referral was filled set $.encounter.id to related to $.service_request activity[].outcome_reference

  15. In case procedures.based_on was filled set $.procedures.id to related to $.service_request $.activity[].outcome_reference

  16. In case diagnostic_reports.based_on was filled set $.diagnostic_reports.id to related to $.service_request activity[].outcome_reference

  17. Update $ .activity.status to in_progress if previous activity status was scheduled

  18. Update the $ .activity.remaining_quantity parameter by the value achieved at Submit Encounter Data Package#Relatedcareplanvalidation above (for an old activities only that has no quantity units)

  19. Update remaining_quantity in the service request with a value that was calculated in the Related service request section above

  20. If there are at least one record for speciality where speciality_officio = true:

    1. Enrich encounter data with performer speciality:

      1. SELECT speciality -> 'speciality' FROM employees WHERE speciality ->> 'speciality_officio' = 'true' AND id = $.encounter.performer.identifier.value

      2.  Set encounter.performer_speciality as CodeableConcept type with system = SPECIALITY_TYPE

  21. 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)

  22. 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 Specimen status model . Also, set status_reason for a specimen: system = specimen_invalidate_reasons, code = used.

  23. 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 )

  24. 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

    1. add reference on the device dispense resource to the outcome_reference attribute of the activity

    2. if Activity.status is scheduled change it to in_progress

  25. If the Package contains Device Dispense with related Device request that has a quantity but no medical program:

    1. calculate remaining quantity of the related Device request (same as on [UPD] Get Device request details | Service logic):

      1. Select all Device dispenses with following parameters( including Device dispenses from the current package):

        • based_on is current Device request

        • status = completed

      2. Sum quantity in the filtered Device dispenses as dispensed_qty

      3. Calculate remaining_quantity = requested_quantity- dispensed_quantity

    2. If remaining_quantity is 0, change status of the related Device request($.based_on) to completed

  26. Set following fields for Devices, Device Associations:

    1. subject is a hashed person_id (from URL)

    2. context_episode_id is an episode identifier from the $.encounter.episode

    3. recorder_legal_entity is a client_id from token

  27. Set following fields for Detected Issues:

    1. patient_id is a hashed person_id (from URL)

    2. context_episode_id is an episode identifier from the $.encounter.episode

    3. recorder_legal_entity is a client_id from token