Versions Compared

Key

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

...

  1. Validate patient status

    1. db.patients.status for this patient must "active"

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

  2. Validate request according to JSON Schema

    1. Return 422 with list of validation errors in case validation fails 

  3. Validate Visit

    1. $.visit.id is unique

      1. in case of error return 422 - "Visit with such id already exists"

    2. $.visit.period.start <= current_dateTime

      1. in case of error return 422- "Start date must be in past"

    3. $.visit.period.end <= current_dateTime

      1. in case of error return 422- "End date must be in past"

    4. $.visit.period.end > visit.period.start

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

  4. Validate DS

    1. Validate that  DS belongs to the performer of encounter

      1. validate that drfo from DS and party.drfo of performer matches

    2. Validate that performer of encounter is a current user 

      1. validate that one of users employee is a performer of encouner

      2. validate that client_id from token == PRM.performer.legal_entity

  5. Validate encoded signed content according to JSON Schema

    1. Return 422 with list of validation errors in case validation fails

...

  1. Validate encounter id as a primary key

  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>= $.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

    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

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

      5. Check if service request quantity is not exhausted as described at https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/17348624385/RC+REHAB+Submit+Encounter+Package#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

  10. Validate encounter.class  

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

      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 encounter class validations

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

  11. Validate encounter.type 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

    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'

  14.  Validate diagnoses 

    1. Validate conditions as  References

    2. Validate that encounter type= 'intervention'. If not, than:

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

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

    6. Validate that rank

      1. Rank value should be integer and >= 1

        1. in case of error return 422 "expected the value to be >= 1"

      2. Rank value should be integer and <= 10

        1. in case of error return 422 "expected the value to be <= 10"

  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: Nebo #15 API Manifest · Apiary .', 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. Validate patient verification status:

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

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

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

  20. Validate priority

    1. Validate priority presence according to eHealth/encounter_priority

      1. in case error return 409, ""

    2. If encounter.class.code = "INPATIENT", priority is required

      1. in case error return 422, "Priority for encounter is required"

...

  1. Validate observations ids as  primary keys

  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. in case not present or doesn't correspond -  return 422 "Doesn't correspond to $.observations[i].components[i].code"

          • 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

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

    1. in case of error "Invalid reference"

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

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

  11. 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 is not allowed in enum"

    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.

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

Validate observations for encounter.type == "patient_identity" 

...

  1. Validate diagnostic reports ids as primary keys

  2. Validate based_on as Reference

  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

      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

    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

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

  9. Validate recorded_by as Employee

  10. Validate encounter

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

      1. in case of error 409 "Invalid reference"

  11. Validate performer.identifier as Employee

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

  13. Validate result_interpreter.identifier as Employee

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

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

  16. Validate primary_source

    1. If primary_source==true, then

      1. Managing organization MUST be filled

    2. If primary_source==false, then

      1. report_origin OR performer.text must be filled

      2. performer.reference must NOT be filled

      3. results_enterpreter.reference must NOT be filled

  17. Validate patient verification status:

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

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

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

...

  1. Validate by json schema

  2. Validate procedure id as primary key

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

      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

  4. Validate code

    1. Validate code as Reference

    2. Validate procedure.service.is_active = true

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

  5. Validate encounter

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

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

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

  7. 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. 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 "Period is required"

  8. Validate recorded_by

    1. Validate recorded_by as Reference

    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

    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

    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 (Reference)

    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, "Observation in "entered_in_error" status can not be referenced" if observation, else - "Condition is canceled"

  13. Validate outcome

    1. validate outcome as a Reference 

    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 

    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. Validate patient verification status:

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

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

      1. in case of error return 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"

Validate Clinical impression

...

  1.  $...identifier.value exists in PRM.employees

    1. in case of error 409 "Employee not found"

  2. $...identifier.value == PRM.employees.id where (PRM.employees.status == "APPROVED" and PRM.employees.legal_entity==token.client_id)

    1. in case of error 409 "Submitted employee is not an active employee from current legal entity"

Related service request validation

  1. If service request referenced as based_on in ME:

    1. if it has quantity:

      1. Check allowed quantity units for ME:

        1. if ME is Procedure, then service_request.quantity.code can have values MINUTE or PIECE (system=SERVICE_UNIT)

        2. if ME is Encounter or Diagnostic report, then service_request.quantity.code can have PIECE only

          1. in case of error return error 409 ("<ME type> cannot be measured in <quantity.code's value>")

      2. Check service_request remaining quantity parameter:

        1. if quantity.code = PIECE:

          1. count number of related MEs to the service request as used quantity.

          2. calculate remaining quantity by subtracting used quantity and number of current MEs that are related to service request from service request's quantity

          3. Validate remaining quantity is greater then or equal to zero

            1. in case of error return 409 "The total amount of medical events exceeds quantity in related service request"

        2. if quantity.code = MINUTE:

          1. select related Procedures to the service request.

          2. for each selected Procedure calculate duration as performedPeriod.end - performedPeriod.start without considering seconds. Result should be in minutes.

          3. calculate used quantity as sum of procedure durations

          4. calculate remaining quantity by subtracting used quantity and durations of current Procedures that are related to service request from service request's quantity

          5. Validate remaining quantity is greater then or equal to zero

            1. in case of error return 409 "The total amount of medical events exceeds quantity in related service request"

        3. if qantity is absent:

          1. Consider that quantity.code = PIECE and quantity.value = 1. Thus, check the service request has not associated with another ME yet

            1. in case it has - return 409 "The total amount of medical events exceeds quantity in related service request"

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:

  1. Validate remaining_quantity in activities referenced by service requests in the EDP using the algorithm described for PIECE units in PreQualify Service Request#Validate-service-request . But the reserved at the moment quantity includes the number of medical events in the EDP related to the activity.

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

    1. calculate the quantity of artifacts that are contained in the $.activity.outcome_reference by service_request.based_on[].activity[].id

    2. calculate the quantity of artifacts that are contained in the request and have a link to the service request

    3. compare quantity from outcome_reference with the artifact quantity

    4. check that difference is greater then or equal to zero

      1. in case of error return 409 "The total amount of the prescribed service quantity exceeds quantity in care plan activity"

Processing

API paragraph not found

...

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

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

19. If there are at least one record for speciality where speciality_officio = true:
Enrich encounter data with performer speciality:

...