ЕСОЗ - публічна документація

UA_Rules to validate patient data

Мета

На цій сторінці описано правила перевірки персональних даних (як звичайної особи, так і особи, яка має довірену особу) у рамках процесів реєстрації через інформаційну систему особи (PIS).

Звичайна персона

Ключові положення для набору даних звичайної персони:

  • Схема не дозволяє вказувати блок “confidant_person”

  • Присутня необхідність для перевірки віку персони, чи більше за конфігураційний параметр no_self_registration_age

  • Автентифікаційні методи персони мають містити тільки записи з типом type = 'OTP'

Цей набір правил перевірки зараз використовується наступними WS:

Перевірки

Перевірити схему

Перевірити дані персони у відповідності до схеми JSON:

{ "$schema": "http://json-schema.org/person_request/schema#", "definitions": { "phone": { "type": "object", "properties": { "type": { "type": "string", "description": "Dictionary: PHONE_TYPE" }, "number": { "type": "string", "pattern": "^\\+38[0-9]{10}$" } }, "required": [ "type", "number" ], "additionalProperties": false }, "name": { "type": "string", "pattern": "^(?!.*[ЫЪЭЁыъэё@%&$^#])[a-zA-ZА-ЯҐЇІЄа-яґїіє0-9№\\\"!\\^\\*)\\]\\[(._-].*$" }, "person_name": { "type": "string", "pattern": "^(?!.*[ЫЪЭЁыъэё@%&$^#])[А-ЯҐЇІЄа-яґїіє\\'\\-]+(\\s(?!.*[ЫЪЭЁыъэё@%&$^#])[А-ЯҐЇІЄа-яґїіє\\'\\-]+)*$", "minLength": 1, "maxLength": 255 }, "unzr": { "type": "string", "pattern": "^[0-9]{8}-[0-9]{5}$" }, "tax_id": { "type": "string", "pattern": "^[0-9]{10}$", "minLength": 10, "maxLength": 255 }, "no_tax_id": { "type": "boolean", "description": "Status person refused tax_id" }, "gender": { "type": "string", "description": "Dictionary: GENDER", "maxLength": 255 }, "address": { "type": "object", "properties": { "type": { "type": "string", "description": "Dictionary: ADDRESS_TYPE" }, "country": { "type": "string" }, "area": { "$ref": "#/definitions/name" }, "region": { "$ref": "#/definitions/name" }, "settlement": { "$ref": "#/definitions/name" }, "settlement_type": { "type": "string", "description": "settlement type Dictionary: SETTLEMENT_TYPE" }, "settlement_id": { "type": "string", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" }, "street_type": { "type": "string", "description": "street type Dictionary: STREET_TYPE" }, "street": { "$ref": "#/definitions/name" }, "building": { "type": "string", "pattern": "^[1-9]((?![ЫЪЭЁыъэё])()([А-ЯҐЇІЄа-яґїіє \\/\\'\\-0-9])){0,20}$" }, "apartment": { "type": "string" }, "zip": { "type": "string", "pattern": "^[0-9]{5}$" }, "inserted_by": { "type": "string" }, "updated_by": { "type": "string" }, "inserted_at": { "type": "string" }, "updated_at": { "type": "string" } }, "required": [ "type", "country", "area", "settlement", "settlement_type", "settlement_id", "inserted_by", "updated_by" ], "additionalProperties": false }, "series_number_document": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "PASSPORT", "COMPLEMENTARY_PROTECTION_CERTIFICATE", "REFUGEE_CERTIFICATE", "TEMPORARY_CERTIFICATE" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$" }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false }, "number_document": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "BIRTH_CERTIFICATE", "TEMPORARY_PASSPORT" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^(?![ЫЪЭЁыъэё@%&$^#`~:,.*|}{?!])[A-ZА-ЯҐЇІЄ0-9№\\/()-]+$", "minLength": 1, "maxLength": 255 }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false }, "id_card": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NATIONAL_ID" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^[0-9]{9}$" }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false }, "authentication_method": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "OTP" ], "description": "Dictionary: AUTHENTICATION_METHOD" }, "phone_number": { "type": "string", "pattern": "^\\+38[0-9]{10}$" }, "alias": { "type": "string", "minLength": 1, "maxLength": 255 } }, "required": [ "type" ], "additionalProperties": false } }, "type": "object", "properties": { "person": { "type": "object", "properties": { "first_name": { "type": "string" }, "last_name": { "type": "string" }, "second_name": { "type": "string" }, "birth_date": { "type": "string" }, "birth_country": { "type": "string" }, "birth_settlement": { "type": "string" }, "gender": { "enum": [ "MALE", "FEMALE" ] }, "email": { "type": "string" }, "no_tax_id": { "type": "boolean" }, "tax_id": { "type": "string" }, "secret": { "type": "string" }, "documents": { "type": "array" }, "addresses": { "type": "array" }, "phones": { "type": "array" }, "unzr": { "type": "string" }, "emergency_contact": { "type": "object", "properties": { "first_name": { "type": "string" }, "last_name": { "type": "string" }, "second_name": { "type": "string" }, "phones": { "type": "array" } }, "required": [ "first_name", "last_name", "phones" ] }, "preferred_way_communication": { "enum": [ "email", "phone" ] }, "authentication_methods": { "type": "array" } }, "required": [ "first_name", "last_name", "birth_date", "birth_country", "birth_settlement", "gender", "no_tax_id", "tax_id", "secret", "documents", "addresses", "emergency_contact", "authentication_methods" ] }, "patient_signed": { "type": "boolean" }, "process_disclosure_data_consent": { "type": "boolean" } }, "required": [ "person", "patient_signed", "process_disclosure_data_consent" ] }
  • якщо значення поля не відповідає схемі - повернути 422 з відповідною полю помилкою

  • якщо в запиті є додаткові поля - повернути 422 ('schema does not allow additional properties')

  • якщо необхідний параметр відсутній у запиті - повернути 422 ('required property %{property} was not present')

  • якщо в запиті немає необхідної кількості параметрів - повернути 422 ('expected a minimum of %{min} items but got %{actual}')

Перевірити персону

  • Перевірити tax_id у відповідності до валідацій, описаних тут: Create/Update person request | Validate "tax_id"

  • Перевірити no_tax_id у відповідності до валідацій, описаних тут: Create/Update person request | Check "no_tax_id" flag

  • Перевірити вік персони, що він більше конфігураційного параметру no_self_registration_age

    • в разі помилки - повернути 422 ('Incorrect person age for such an action')

Перевірити документи персони

  • Перевірити, що тип вказаних документів пацієнтів вказано в конфігураційному параметрі PIS_PERSON_REGISTRATION_DOCUMENT_TYPES, що містить значення з довідника DOCUMENT_TYPE

    • в разі помилки - повернути 422 ('Submitted document type is not allowed')

  • Перевірити документи, що підтверджують дієздатність особи

    • в разі, якщо вік персони більше значення глобального параметру no_self_registration_age, але менше ніж значення глобального параметру person_full_legal_capacity_age:

      • Перевірити, що вказаний хоча б один тип документів з конфігураційного параметру PIS_PERSON_REGISTRATION_DOCUMENT_TYPES що містить значення з довідника DOCUMENT_TYPE_EXTENDED

        • в разі помилки - повернути 422 ('Document that proves personal data must be submitted')

      • Перевірте, чи існує хоча б один із поданих типів документів про особу в конфігураційному параметрі PIS_PERSON_LEGAL_CAPACITY_DOCUMENT_TYPES, що містить значення з довідника DOCUMENT_TYPE_EXTENDED

        • в разі помилки - повернути 422 ('Document that proves legal capacity must be submitted')

    • Інакше перевірте, чи існує будь-який із надісланих типів документів особи в конфігураційному параметрі PIS_PERSON_REGISTRATION_DOCUMENT_TYPES

      • в разі помилки - повернути 422 ('<Document type> can not be submitted for this person')

  • Перевірте документи особи відповідно до поточних перевірок, описаних тут: Create/Update person request | Validate person documents

Перевірити адреси персони

  • Перевірте, що вказано запис адреси з type = 'RESIDENCE'

    • в разі помилки - повернути 422 ('one and only one residence address is required')

Перевірити методи автентифікації персони

  • Переконайтеся, що подані authentication_methods містять лише записи з type = 'OTP'

    • в разі помилки - повернути 422 ('Only OTP authentication method can be created for person')

  • Перевірте ліміт телефонних номерів відповідно до існуючої перевірки, описаної тут: Create/Update person request | Validate phone number limit

Пересона з довіреною особою

Існує кілька відмінностей між перевіркою звичайної особи та перевіркою особи з довіреною особою:

  • Схема дозволяє вказати “confidant_person”

  • Користувач може встановити лише одну довірену особу та лише один метод автентифікації

  • Не потрібно перевіряти вік персони, чи він більше значення конфігураційного параметру no_self_registration_age

  • Для перевірки поданих типів документів використовується інший параметр конфігураці (PIS_PERSON_WITH_CONFIDANT_REGISTRATION_DOCUMENT_TYPES)

  • Методи автентифікації особи повинні містити лише записи з type = 'THIRD_PERSON'

  • Довірена особа має бути перевірена

Цей набір правил перевірки зараз використовується наступними WS:

Перевірки

Перевірити схему

Перевірити дані персони у відповідності до схеми JSON:

{ "$schema": "http://json-schema.org/person_request/schema#", "definitions": { "phone": { "type": "object", "properties": { "type": { "type": "string", "description": "Dictionary: PHONE_TYPE" }, "number": { "type": "string", "pattern": "^\\+38[0-9]{10}$" } }, "required": [ "type", "number" ], "additionalProperties": false }, "name": { "type": "string", "pattern": "^(?!.*[ЫЪЭЁыъэё@%&$^#])[a-zA-ZА-ЯҐЇІЄа-яґїіє0-9№\\\"!\\^\\*)\\]\\[(._-].*$" }, "person_name": { "type": "string", "pattern": "^(?!.*[ЫЪЭЁыъэё@%&$^#])[А-ЯҐЇІЄа-яґїіє\\'\\-]+(\\s(?!.*[ЫЪЭЁыъэё@%&$^#])[А-ЯҐЇІЄа-яґїіє\\'\\-]+)*$", "minLength": 1, "maxLength": 255 }, "unzr": { "type": "string", "pattern": "^[0-9]{8}-[0-9]{5}$" }, "tax_id": { "type": "string", "pattern": "^[0-9]{10}$", "minLength": 10, "maxLength": 255 }, "no_tax_id": { "type": "boolean", "description": "Status person refused tax_id" }, "gender": { "type": "string", "description": "Dictionary: GENDER", "maxLength": 255 }, "address": { "type": "object", "properties": { "type": { "type": "string", "description": "Dictionary: ADDRESS_TYPE" }, "country": { "type": "string" }, "area": { "$ref": "#/definitions/name" }, "region": { "$ref": "#/definitions/name" }, "settlement": { "$ref": "#/definitions/name" }, "settlement_type": { "type": "string", "description": "settlement type Dictionary: SETTLEMENT_TYPE" }, "settlement_id": { "type": "string", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" }, "street_type": { "type": "string", "description": "street type Dictionary: STREET_TYPE" }, "street": { "$ref": "#/definitions/name" }, "building": { "type": "string", "pattern": "^[1-9]((?![ЫЪЭЁыъэё])()([А-ЯҐЇІЄа-яґїіє \\/\\'\\-0-9])){0,20}$" }, "apartment": { "type": "string" }, "zip": { "type": "string", "pattern": "^[0-9]{5}$" }, "inserted_by": { "type": "string" }, "updated_by": { "type": "string" }, "inserted_at": { "type": "string" }, "updated_at": { "type": "string" } }, "required": [ "type", "country", "area", "settlement", "settlement_type", "settlement_id", "inserted_by", "updated_by" ], "additionalProperties": false }, "series_number_document": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "PASSPORT", "COMPLEMENTARY_PROTECTION_CERTIFICATE", "REFUGEE_CERTIFICATE", "TEMPORARY_CERTIFICATE" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^((?![ЫЪЭЁ])([А-ЯҐЇІЄ])){2}[0-9]{6}$" }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false }, "number_document": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "BIRTH_CERTIFICATE", "TEMPORARY_PASSPORT" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^(?![ЫЪЭЁыъэё@%&$^#`~:,.*|}{?!])[A-ZА-ЯҐЇІЄ0-9№\\/()-]+$", "minLength": 1, "maxLength": 255 }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false }, "id_card": { "type": "object", "properties": { "type": { "type": "string", "enum": [ "NATIONAL_ID" ], "description": "Dictionary: DOCUMENT_TYPE" }, "number": { "type": "string", "pattern": "^[0-9]{9}$" }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false } }, "type": "object", "properties": { "person": { "type": "object", "properties": { "id": { "type": "string" }, "first_name": { "type": "string" }, "last_name": { "type": "string" }, "second_name": { "type": "string" }, "birth_date": { "type": "string" }, "birth_country": { "type": "string" }, "birth_settlement": { "type": "string" }, "gender": { "enum": [ "MALE", "FEMALE" ] }, "email": { "type": "string" }, "no_tax_id": { "type": "boolean" }, "tax_id": { "type": "string" }, "secret": { "type": "string" }, "documents": { "type": "array" }, "addresses": { "type": "array" }, "phones": { "type": "array" }, "unzr": { "type": "string" }, "emergency_contact": { "type": "object", "properties": { "first_name": { "type": "string" }, "last_name": { "type": "string" }, "second_name": { "type": "string" }, "phones": { "type": "array" } }, "required": [ "first_name", "last_name", "phones" ] }, "confidant_person": { "type": "object", "properties": { "person_id": { "type": "string" }, "documents_relationship": { "type": "array", "properties": { "type": { "type": "string", "description": "Dictionary: DOCUMENT_RELATIONSHIP_TYPE" }, "number": { "type": "string", "pattern": "^[0-9]{9}$" }, "issued_by": { "type": "string", "minLength": 1 }, "issued_at": { "type": "string", "format": "date" }, "active_to": { "type": "string", "format": "date" } }, "required": [ "type", "number" ], "additionalProperties": false } } }, "required": [ "person_id", "documents_relationship" ] }, "preferred_way_communication": { "enum": [ "email", "phone" ] } }, "required": [ "first_name", "last_name", "birth_date", "birth_country", "birth_settlement", "gender", "no_tax_id", "tax_id", "secret", "documents", "addresses", "emergency_contact" ] }, "patient_signed": { "type": "boolean" }, "process_disclosure_data_consent": { "type": "boolean" } }, "required": [ "person", "patient_signed", "process_disclosure_data_consent" ] }
  • в разі, якщо поле не відповідає схемі - повернути 422 з повідомленням у відповідності до поля

  • в разі, якщо в запиті вказані додаткові поля - повернути 422 ('schema does not allow additional properties')

  • якщо необхідний параметр відсутній у запиті - повернути 422 ('required property %{property} was not present')

  • якщо в запиті немає необхідної кількості параметрів - повернути 422 ('expected a minimum of %{min} items but got %{actual}')

Перевірити персону

Перевірити документи персони

  • Перевірити, що вказані типи документів персони вказані в конфігураційному параметрі PIS_PERSON_WITH_CONFIDANT_REGISTRATION_DOCUMENT_TYPES, що містить значння з довідника DOCUMENT_TYPE

    • в разі помилки - повернути 422 ('Submitted document type is not allowed')

  • Перевірити документи персони у відповідності до існуючих перевірок, описаних тут: Create/Update person request | Validate person documents

Перевірити адреси персони

Перевірити довірену особу

  • Перевірити, чи confidant_person.person_id відповідає до person_id користувача, яка ініціює реєстрацію пацієнта

    • в разі помилки - повернути 422 ('Person who initiates registration of patient must be submitted as confidant person')

  • Перевірити, що confidant_person.person_id вказано і таблиці персон (MPI DB)

    • в разі помилки - повернути 422 ('Confidant patient is not found')

  • Перевірити вік довіреної особи, що він >= no_self_registration_age конфігураційного параметру

    • в разі помилки - повернути 422 ('Incorrect person age for such an action')

  • Перевірити, чи немає статусу кумулятивної верифікації довіреної особи в конфігураційному параметріNOT_ALLOWED_CONFIDANT_PERSON_VERIFICATION_STATUSES

    • в разі помилки - повернути 422 ('Person with cumulative verification status <verification_status> can not be submitted as confidant')

  • Перевірити, чи має довірена особа метод автентифікації за допомогою type = OTP, де ended_at рівний або більше за сьогодні

    • в разі помилки - повернути 422 ('Confidant person must have active authentication method with type "OTP" where ended_at is equal to or greater than current date')

Перевірити методи автентифікації персони

  • Перевірити, що вказаний authentication_methods містить тільки один запис і цей запис має тип type = 'THIRD_PERSON'

    • в разі помилки - повернути 422 ('Only THIRD_PERSON authentication method can be created for person')

  • Перевірити, чи THIRD_PERSON та ж персона, яка ініціювала реєстрацію пацієнта та вказана як довірена (authentication_methods = x-person-id з токену)

    1. в разі помилки - повернути 422 ('person.authentication_methods.value must be equal to person.confidant_person.person_id')

ЕСОЗ - публічна документація