Versions Compared

Key

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

...

Expand
titleDummy Submit Composition ADOPTER
Code Block
{
    "id": "b8f94c85-1455-4e0e-92e6-0d35da6507df",
    "title": "1011-TTBK-HHPA-7BET",
    "status": "FINAL",
    "type": {
        "coding": [
            {
                "system": "COMPOSITION_TYPES",
                "code": "ADOPTION"
            }
        ]
    },
    "category": {
        "coding": [
            {
                "system": "COMPOSITION_CATEGORIES",
                "code": "ADOPTER"
            }
        ]
    },
    "date": "2024-09-19T09:31:32.138Z",
    "custodian": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "legal_entity"
                    }
                ],
                "text": "string"
            },
            "value": "0dccb76f-3ed0-40f4-8f73-e95e2f91ea29"
        }
    },
    "encounter": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "encounter"
                    }
                ],
                "text": "string"
            },
            "value": "a27fd073-472b-4dee-be8a-fdfac919e9f8"
        }
    },
    "author": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "employee"
                    }
                ],
                "text": "string"
            },
            "value": "1ab4378e-84e9-4b90-8c88-90b2c9b6b435"
        }
    },
    "attester": [
        {
            "mode": {
                "coding": [
                    {
                        "system": "eHealth/composition_attester_modes",
                        "code": "LEGAL"
                    }
                ]
            },
            "party": {
                "identifier": {
                    "type": {
                        "coding": [
                            {
                                "system": "eHealth/resources",
                                "code": "employee"
                            }
                        ],
                        "text": "string"
                    },
                    "value": "1ab4378e-84e9-4b90-8c88-90b2c9b6b435"
                }
            }
        }
    ],
    "event": [
        {
            "code": {
                "coding": [
                    {
                        "system": "COMPOSITION_EVENTS",
                        "code": "ADOPTION_ADOPTER_ELIGIBLE"
                    }
                ]
            },
            "period": {
                "start": "2024-09-19T09:31:32.138Z",
				"end": "2024-10-22T06:19:42.065Z"
            }
        }
    ],
    "section": [
        {
            "title": "Тест123",
            "code": {
                "coding": [
                    {
                        "system": "eHealth/composition_section_codes",
                        "code": "ADOPTION_ADOPTER_FREE_SECTION"
                    }
                ]
            },
            "author": [
                {
                    "identifier": {
                        "type": {
                            "coding": [
                                {
                                    "system": "eHealth/resources",
                                    "code": "employee"
                                }
                            ],
                            "text": "string"
                        },
                        "value": "1ab4378e-84e9-4b90-8c88-90b2c9b6b435"
                    }
                }
            ],
            "entry": [
                {
                    "identifier": {
                        "type": {
                            "coding": [
                                {
                                    "system": "eHealth/resources",
                                    "code": "condition"
                                }
                            ],
                            "text": "string"
                        },
                        "value": "1cff2d77-a6a5-4d05-9022-9cdeabe19f21"
                    }
                }
            ]
        }
    ]
}

...

Expand
titleDummy Submit Composition ADOPTER_RELATIVE
Code Block
{
    "id": "32d45e80-db55-46ea-b957-175b312bb53b",
    "title": "1011-MPKT-ETHK-798M",
    "status": "FINAL",
    "type": {
        "coding": [
            {
                "system": "COMPOSITION_TYPES",
                "code": "ADOPTION"
            }
        ]
    },
    "category": {
        "coding": [
            {
                "system": "COMPOSITION_CATEGORIES",
                "code": "ADOPTER_RELATIVE"
            }
        ]
    },
    "date": "2024-10-04T09:31:32.138Z",
    "custodian": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "legal_entity"
                    }
                ],
                "text": "string"
            },
            "value": "26fc5dfe-1bea-440f-a290-48df6f0546ab"
        }
    },
    "encounter": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "encounter"
                    }
                ],
                "text": "string"
            },
            "value": "a17efd02-f726-4f77-90b4-21af1fbf2555"
        }
    },
    "author": {
        "identifier": {
            "type": {
                "coding": [
                    {
                        "system": "eHealth/resources",
                        "code": "employee"
                    }
                ],
                "text": "string"
            },
            "value": "92bb524b-3994-43b4-9dd6-43c675a16ec3"
        }
    },
    "attester": [
        {
            "mode": {
                "coding": [
                    {
                        "system": "eHealth/composition_attester_modes",
                        "code": "LEGAL"
                    }
                ]
            },
            "party": {
                "identifier": {
                    "type": {
                        "coding": [
                            {
                                "system": "eHealth/resources",
                                "code": "employee"
                            }
                        ],
                        "text": "string"
                    },
                    "value": "92bb524b-3994-43b4-9dd6-43c675a16ec3"
                }
            }
        }
    ],
    "event": [
        {
            "code": {
                "coding": [
                    {
                        "system": "COMPOSITION_EVENTS",
                        "code": "ADOPTION_ADOPTER_RELATIVE_ELIGIBLE"
                    }
                ]
            },
            "period": {
                "start": "2024-10-07T17:31:32.138Z",
				"end": "2024-12-22T06:19:42.065Z"
            }
        }
    ],
    "section": [
        {
            "title": "ADOPTION_ADOPTER_RELATIVE_FREE_SECTION",
            "code": {
                "coding": [
                    {
                        "system": "eHealth/composition_section_codes",
                        "code": "ADOPTION_ADOPTER_RELATIVE_FREE_SECTION"
                    }
                ]
            },
            "author": [
                {
                    "identifier": {
                        "type": {
                            "coding": [
                                {
                                    "system": "eHealth/resources",
                                    "code": "employee"
                                }
                            ],
                            "text": "string"
                        },
                        "value": "92bb524b-3994-43b4-9dd6-43c675a16ec3"
                    }
                }
            ],
            "entry": [
                {
                    "identifier": {
                        "type": {
                            "coding": [
                                {
                                    "system": "eHealth/resources",
                                    "code": "condition"
                                }
                            ],
                            "text": "string"
                        },
                        "value": "fd8554b7-eaaa-4ce1-bd08-bdd728dfa04c"
                    }
                }
            ]
        }
    ]
}

...

a. get config by type and category (of composition) from [prm].composition

а.1 in case there is no record in PRM.configurations with requested combination of type and category return 422 - (“Category {{Composition.category}} is not allowed for type {{Composition.type}}”)
b. get setting and compare config.condition data to composition data to find the desired setting (in case when some values isn’t exist - skip validation)
c. compare data from config.check with data from composition

...

  1. Check (7) possibility to create composition for PREperson - COMPOSITION_PREPERSON_ALLOW.

    • Return 422 ("Forbidden to create composition with such category for preperson") in case of error

  2. Validate (10) person age between min and max values in config - COMPOSITION_PERSON_AGE.

Skip this validation in case the patient is preperson with an empty age parameter

Calculating logic of person age:

...

Check employee data who sign composition. Get employee data from Composition.attester and execute next validations:

  1. Check composition.Attester.mode.coding.system = "eHealth/composition_attester_modes"
    & composition.attester.mode.coding.code is a value from dictionary eHealth/composition_attester_modes

  2. Check (18) that attester of composition work in same LE as custodian parameter: сomposition.attester legal_entity_id = composition.custodian

    • Return 422 ("Attester of composition must work in same LE as custodian") in case of error

  3. Check (19) that attester employee is in active status

    • Return 422 ('Attester is not active') in case of error

  4. Check (19.1) that composition.attester array has only one item

    • Return 422 ("Only one attester for composition must be submitted") in case of error

  5. Extract (21) user_id from token. Check that attester belongs to the employee user who sign composition.

    • Return 422 ('Attester id doesn’t belongs to employee id from token') in case of error

...

  1. When (39) composition type = “DRIVERS“ and composition.event.code = "DRIVERS_GROUP1_ADMIT" or "DRIVERS_GROUP2_ADMIT" - composition.event.period.start and composition.event.period.end is required

    • Return 422 ("Event period start and period end is required") in case of error

  2. When (40) composition type = “DRIVERS“ and composition.event.code = "DRIVERS_GROUP1_DENY" or "DRIVERS_GROUP2_DENY" - composition.event.period.start is required and composition.event.period.end must be empty

    • Return 422 ("Event period start is required and event period end must be empty") in case of error

  3. When (40.1) composition type = “ADOPTION“ and composition.event.code = "ADOPTION_ADOPTER_INELIGIBLE" or "ADOPTION_ADOPTER_RELATIVE_INELIGIBLE" - composition.event.period.start is required and composition.event.period.end must be empty

    Return 422 ("Event period start is required and event period end must be empty") in case of error

  4. Check (38.1) all event.code must be unique. In case when composition has more than one event

    • Return 422 ("Event codes must be unique") in case of error

  5. Check (37.1) that composition.event.code corresponds to appropriate dictionary - COMPOSITION_EVENTS

    • Return 422 ('value is not allowed in enum") in case of error

...

  1. When (25) composition type = “DRIVERS“ check that event.period (event.period.end - event.period.start) less than duration (depending on person age and composition event.code). Base on config - COMPOSITION_EVENT_PERIOD_DURATION
    Calculating logic:
    composition.event.period.end - composition.event.period.start < config.check value

    • Return 422 ("Composition event period duration must be less than <check.value> <check.units>") in case of error

  2. Check (38) all composition.event.code in composition - it must corresponds to appropriate config and match with at least one combination of statuses - COMPOSITION_EVENT_CODE
    examples:
    if composition category = “DRIVERS_GROUP1“ check what composition.event.code must be:
    "DRIVERS_GROUP1_ADMIT"
    OR
    "DRIVERS_GROUP1_DENY" and “DRIVERS_GROUP2_DENY“

    if composition category = “DRIVERS_GROUP2“ check that composition.event.code match with one of combination:
    “DRIVERS_GROUP1_ADMIT“ and “DRIVERS_GROUP2_DENY“
    OR
    “DRIVERS_GROUP1_ADMIT“ and “DRIVERS_GROUP2_ADMIT“
    OR
    “DRIVERS_GROUP1_DENY“ and “DRIVERS_GROUP2_DENY“

    if composition category = “ADOPTERS“ check that composition.event.code match with one of combination:
    ”ELIGIBLE”
    OR
    ”INELIGIBLE”

    • Return 422 ("Invalid event code for current composition category") in case of error

  3. Check (28.1) that composition.event.period.start < composition.event.period.end

    • Return 422 ("Period end of event must be later than event start period") in case of error

13. АuthorizeInform with

Validate value in the field $.authorize_withinform_with, string, optional.

  • Check that authentication method with type = 'THIRD_PERSON' is submitted in $.authorize_with for person (in composition.subject) that must be authorized by confidant person using following logic:

    1. persons age < no_self_registration_age global parameter;

    2. persons age between no_self_registration_age and person_full_legal_capacity_age global parameters and person does not have document with type from PERSON_LEGAL_CAPACITY_DOCUMENT_TYPES config parameter;

    3. persons age > person_full_legal_capacity_age global parameter and exists at least one active and approved confidant person relationship for person (using following process Check confidant person relationship with person_id = person_id from request - expected :ok, :approved response)

      1. in case of error - return 422 ('Authentication method with type THIRD_PERSON must be submitted for this person')

  • Check that $.authorize_withinform_with is a valid uuid

    • in case error - return 422 ('string does not match pattern') with uuid regexp

  • Check that authentication method exists in MPI database, person_authentication_methods table (with is_active = true), belongs to the same patient as set in the create composition request, is active (ended_at > now() or ended_at is null) and type != NA

    • in case error - return 422 ('Authentication method doesn't exist, is inactive or does not belong to this person')

  • Get value of THIRD_PERSON_CONFIDANT_PERSON_RELATIONSHIP_CHECK config parameter, if it is set to true - for authentication method with type = ‘THIRD_PERSON’ check that person from value is an approved confidant for a patient from create composition request – exists active and approved confidant person relationship between person from request and person_id from authentication method value (using following logic: Check confidant person relationship with person_id = person_id from request and confidant_person_id = value from auth method - expected :ok, :approved response)

    1. in case of error - return 422 ('Authentication method doesn't exist, is inactive or does not belong to this person''Auth method is not active or confidant person relationship is invalid')

14. Title

  1. Get count of records in ME.requisition_number where requisition_number is equal to Composition.title and entity is equal to “composition” and type is equal to Composition.type.coding[0].code and patient_id = patient_id from the request

    1. if count = 0 Return 422 ("Composition title is invalid or expired") in case of error

  2. Check there is no Composition with the same title in the DB

    • in case of error return 422 “Composition with title <title> already exists“

...

  1. Check (43) count of medical records in composition.section.entry <= then value from config - COMPOSITION_SECTION_ENTRY_LIMIT.

    • Return 422 ("Limit of medical records for this composition type and category must be less or equal <RECORDS_LIMIT>") in case of error

  2. Check (41) codes for all records from composition.section.entry where resource.type = "observation" on prohibited values for composition (all records not include prohibited codes), depends on event codes which included in config - COMPOSITION_SECTION_ENTRY_PROHIBITED_CODES where config.resource_type = "observation"

    • Return 422 ("Prohibited observation code - <code> in section.entry for current composition") in case of error

  3. Check (41.1) codes for all records from composition.section.entry where resource.type = "condition" on prohibited values for composition (all records not include prohibited codes), depends on event codes which included in config - COMPOSITION_SECTION_ENTRY_PROHIBITED_CODES where config.resource_type = "condition"

    • Return 422 ("Prohibited condition code - <code> in section.entry for current composition") in case of error

  4. Check (42) codes for all records from composition.section.entry where resource.type = "observation" on required values for composition (at least one record composition entry must contain) which depends on section.code wich included in config - COMPOSITION_SECTION_ENTRY_REQUIRED_CODES where config.resource_type = "observation"

    • Return 422 ("Empty required codes in section.entry for current composition") in case of error

  5. Check (42.1) codes for all records from composition.section.entrywhere resource.type = "condition" on required values for composition (at least one record composition entry must contain) which depends on section.code wich included in config - COMPOSITION_SECTION_ENTRY_REQUIRED_CODES where config.resource_type = "condition"

    • Return 422 ("Empty required codes in section entry for current composition") in case of error

  6. Check (44 + 45) existing in composition required and optional sections codes which depends on section.code - COMPOSITION_SECTION_CONFIG
    Logic description:
    Find all config.code where parameter config.mandatory = true and compare all codes to composition.section.[n].code. In case when config has nested sections but parameter mandatory = false - don't compare codes to nested sections.
    Logic description:

    • in case when object from config or config.sections.[n] have mandatory = true but composition.section.code or composition.section.section.[n].code hasn’t same value in config.code or config.sections.[n].code - return error

    • in case when composition.section.code has code wich hasn’t config.code - return error

    • Return 422 ("Invalid section content. Mandatory section {{code}} is missed") in case of error with empty required fields

  7. Check (45.1) section codes for nested sections hierarchy from config which depends on config - COMPOSITION_SECTION_CONFIG
    Logic description:
    Check that all values from composition.section.code equal to config.code from config.sections on the same nested level where config.sectionAllowed = true

    • in case when value from composition.section.code hasn’t same values with nested config.code (from config.sections) or composition.section.code has codes wich doesn’t exist in config.code (from config.sections) - return error Return 422 ("Invalid section hierarchy for nested section") in case of error with empty required fields

    examples
    success case:
    Composition - composition.section.code = MAIN, nested section - composition.section.section.code = PEDIATRIST
    Config - config.sectionAllowed = true, config.code = MAIN, config.section.code = PEDIATRIST
    error case 1:
    Composition - composition.section.code = MAIN, nested section - composition.section.section.code = NURSING
    Config - config.sectionAllowed = true, config.code = MAIN, config.section.code = PEDIATRIST
    error case 2:
    Composition - composition.section.code = MAIN, nested section - composition.section.section.code = PEDIATRIST
    Config - config.sectionAllowed = true, config.code = MAIN, config.section.code = PEDIATRIST + config.section.code = MAIN

  8. Check (45.2) section content for all sections which depends on section code - COMPOSITION_SECTION_CONFIG

    1. Configuration parameters description:

      • if sectionAllowed = true current section can contain nested sections

      • if isEmpty = true current section can contain emptyReason parameter instead of entry array

      • if containsResources = true current section can contain entry and orderBy parameters

    2. Validate section content:

      1. Check that current section contains just one of:

        1. nested section parameter

        2. emptyReason parameter

        3. entry parameter

        4. in case of error an error return 422 ("Section {{section_code}} must contain one AND only one of: nested section, emptyReason or entry")

      2. In case section contains entry parameter check that containsResources = true

        1. in case containsResources = false return 422 ("Section {{section_code}} can not contain entry")

      3. In case section contains emptyReason check that isEmpty = true

        1. in case isEmpty = false return 422 ("Section {{section_code}} can not contain emptyReason")

      4. In case section contains nested section check that sectionAllowed = true

        1. in case sectionAllowed = false return 422 ("Section {{section_code}} can not contain nested section")

  9. Check (46) nesting level of sections <= the allowed limit - COMPOSITION_SECTION_NESTING_LEVEL

    • Return 422 ("Prohibited nested level for composition section") in case of error

  10. Check (47) count of section <= than value from - COMPOSITION_SECTION_COUNT_LIMIT

    • Return 422 ("Prohibited amount of composition section") in case of error

...

  1. Check (48) composition.section.title

    1. Check that composition.section.title is not empty.

    2. Also check value from COMPOSITION_SECTION_TITLE_MANUAL_FILL config (depends on composition.section.code)

      1. if config.value = "true" (or section with same code doesn't exist) - don’t validate composition.section.title

      2. else if value = "false"

        1. get display value from COMPOSITION_SECTION_CODES dictionary where key=composition.section.code

        2. check composition.section.title = display

    3. Return 422 ("Invalid title for composition.section") in case of error

  2. Check (48.1) that section code (composition.section.code) corresponds to appropriate dictionary - COMPOSITION_SECTION_CODES

    • Return 422 ("Section code value is not allowed in enum") in case of error

  3. Check (48.2) that section order by parameter (composition.section.orderby) corresponds to appropriate dictionary - COMPOSITION_SECTION_ORDERBY

    • Return 422 ("Section order by value is not allowed in enum") in case of error

  4. Check (48.3) that empty reason (composition.section.emptyreason) corresponds to appropriate config - COMPOSITION_SECTION_EMPTY_REASON. In case when composition.section.emptyreason is not empty

    • Return 422 ("Empty reason value is not allowed in enum") in case of error

  5. Check (50) that person from all records in composition.section.entry the same as composition.subject (or merged person in mpi.merged_person)

    • Return 422 ("Person from section.entry must be the same as composition.subject or composition.section.focus") in case of error

  6. Check (54) that author position from section.author based on config - COMPOSITION_SECTION_AUTHOR_POSITION for selected section.code

    • Return 422 ("Section author position does not allow") in case of error

  7. Check (55) that author speciality from section.author based on config - COMPOSITION_SECTION_AUTHOR_SPECIALITY for selected section.code

    • Return 422 ("Section author speciality does not allow to create such composition") in case of error

  8. Check (55.1) that author main speciality (employee.accreditation.speciality_officio = true ) from section.authorbased on based on config - COMPOSITION_SECTION_AUTHOR_MAIN_SPECIALITY

    • Return 422 ("Section author main speciality does not allow to create such composition") in case of error

  9. Check (56) count of resources from composition.section.entry selected section.code - COMPOSITION_SECTION_SECTION_ENTRY_LIMIT

    • Return 422 ("Max count of resources in section.entry - <count>") in case of error

  10. Check (56.1) that the resource type of the resource in composition.section.entry is allowed by config COMPOSITION_SECTION_SECTION_ENTRY_RESOURCESfor this section.code and event.code

    • Return 422 ("Resource type is not allowed in this section for this event code") in case of error

...