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

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Мета

Даний веб-сервіс (WS) для початку створення запиту на персону для оновлення даних персони, у відповідності до його id, який перед цим був знайдений з токену доступу по person_id.

Специфікація

Apiary

Основні положення

  1. Даний веб-сервіс (WS) має використовуватись тільки для оновлення існуючої персони в системі.

  2. Автентифікаційний метод персони та довіреної особи не мають передаватись в запиті для оновлення персони.

Авторизація

  • Перевірити валідність токену доступу

    • Повернути (401, 'Invalid access token') в разі неуспішних перевірок

  • Перевірити, що токен дійсний

    • в разі помилки - повернути (401, 'Invalid access token')

  • Перевірити скоупи користувача на можливість виконання даної дії (scope = 'person_request:write_pis')

    • Повернути (403, 'Your scope does not allow to access this resource. Missing allowances: person_request:write_pis') в разі невалідних скоупів

  • Перевірити, що токен містисть person_id

    • в разі помилки - повернути (401, 'Invalid access token')

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

  • Отримати person_id з токену (x-person-id хедер)

  • Перевірити статус персони, що він активний (status = ‘active' & is_active = 'true’)

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

  • Перевірити, що об'єм змін даних по персоні в запиті допустимий (персона не оновлюється забагато), у відповідності до існуючої перевірки, описаної тут https://e-health-ua.atlassian.net/wiki/spaces/EH/pages/589266986/Create+Update+person+request#Update-person-request. Порівняти отриманий скор з конфігураційним параметром PERSON_ONLINE_DEDUPLICATION_UPDATE_SCORE_PIS.

Перевірити довірену особу та взаємозв'язок

Якщо персона юридично не дієздатна - система має переконатись, що її дані оновлюються довіреною особою та є зареєстрований та верифікований взаємозв'язок.

Отримати applicant_person_id з токену, порівняти цого до person_id з токену:

  • якщо рівний - перевірити, що персона має бути не авторизована як довірена особа, що вона не відповідає наступним правилам:

    • вік персони < no_self_registration_age глобальному параметру;

    • що вік персони між значенням no_self_registration_age та person_full_legal_capacity_age глобальних параметрів та персона не має документу з типом з конфігураційного параметру PIS_PERSON_LEGAL_CAPACITY_DOCUMENT_TYPES;

    • вік персони > person_full_legal_capacity_age глобального параметру та існує хоча б один взаємозв'язок активний та погоджений з довіреною особою з персоною (викорисовуючи наступний процес Check confidant person relationship з person_id = person з запиту - очікується відповідь :ok, :approved)

      • в разі помилки - повернути 409 (‘Request must be authorized by confidant person’)

  • Якщо не рівний - перевірити взаємозв'язок по наступним крокам:

    • Перевірити, що зареєстрований взаємозв'язок між person_id та applicant_person_id(MPI.confidant_person_relationships)

    • Перевірити, що взаємозв'язок є VERIFIED

      • в разі помилки - повернути 409 (‘Can’t confirm relationship’)

    • Перевірити, що існує applicant_person_id (status = 'active' & is_active = 'true') та має будь-який verification_status але не NOT_VERIFIED

      • в разі помилки - повернути 409 (‘Confidant person not found or is not verified’)

Перевірити запит

Перевірити запит, використовуючи JSON схему (у відповідності до Вимоги до набору даних персони )

 Click here to expand...
{
  "$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": {
        "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"
          ]
        }
      },
      "required": [
        "first_name",
        "last_name",
        "birth_date",
        "birth_country",
        "birth_settlement",
        "gender",
        "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}')

Перевірити tax_id

Перевірити признак no_tax_id

Перевірити признак patient_signed

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

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

Сервісна логіка

Згенерувати URL завантаження

В залежності від пейлоад (набору даних) система генерує перелік signed urls для завантаження скан-копій документів.

Підписані URLs дійсні тільки протягом виділеного періоду часу (у відповідності до конфігураційного параметру SECRETS_TTL). Якщо період вийшов - новий запит на персону має бути створено.

Кожен лінк генерується для одного документу на одну сторінку в форматі jpeg. Документ має бути не більше 10MB.

Для кожного типу документу, якщо спрацьовують пару правил - генерується тільки один лінк.

  1. Перевірити блок документів персони. Якщо одни з документів має document.type = BIRTH_CERTIFICATE_FOREIGN та вік персони < no_self_auth_age глобального параметру, то

    1. Згенерувати URL з типом person.BIRTH_CERTIFICATE_FOREIGN

  2. Перевірити блок документів персони. Якщо одни з документів має document.type = PERMANENT_RESIDENCE_PERMIT та вік персони >= no_self_auth_age глобального параметру то

    1. Згенерувати URL з типом person.PERMANENT_RESIDENCE_PERMIT

  3. Перевірити блок документів персони. Якщо одни з документів має document.type з PIS_PERSON_LEGAL_CAPACITY_DOCUMENT_TYPES то

    1. Згенерувати URL з типом person.<<document_type>> де document_type - тип документа з конфігураційного параметру, для кожного знайти тип документу

  4. Перевірити unzr персони. Якщо $.person.unzr не пусто та перші 8 цифр для $.person.unzr != $.person.birth_date

    1. Згенерувати URL з типом person.unzr

Викликати Media Content Storage для генерації URL завантаження для кожного документу отримані шляхом виконання логіки вище та зберіганням документів до DB.

Згенерувати друковану форму

Підготувати дані для друкованої форми по запиту на персону

  1. Визначити шаблон друкованої форми на основі поля applicant_person_id з токену та перевірки взаємозв'язку з довіреною особою:

    1. Якщо applicant_person_id не рівна person_id з токену - вибрати друковану форму для довіреної особи (зберігається в конфігураційному параметрі PIS_PERSON_REQUEST_PRINTOUT_FORM_INCAPACITY_TEMPLATE_ID)

    2. Якщо applicant_person_id рівна person_id з токену - обрати друковану форму без довіреної особи (зберігається в конфігураційному параметрі PIS_PERSON_REQUEST_PRINTOUT_FORM_TEMPLATE_ID)

  2. Викликати сервіс MAN для відображення друкованої форми

  3. Підготувати контент друкованої форми на основі даних запиту на персону

    1. для друкованої форми з довіреною особою - додатково завантажити дані довіреної особи на основі applicant_person_id з токену

      1. отримати дані довіреної особи з таблиці personspersons.id = applicant_person_id)

      2. отримати документи довіреної особи з таблиці person_documentsperson_documents.person_id = applicant_person_id)

      3. отримати документи по взаємозв'язку з таблиці confidant_person_relationship_documentsconfidant_person_relationship_id = id для взаємозв'язку між персоною та довіреною особою)

  4. Відобразити друковану форму та зберегти до запиту на персону

Знайти запити на персону в статусі pending

Знайти запити на персону в статусі pending в IL.person_requests для уникнення дублів запитів:

  • person_data_id = person_id з токену

  • status = NEW або APPROVED

Відмінити запити на персону

Змінити статуси всіх знайдених запитів на персону:

  • встановити статус = CANCELLED

  • встановити updated_at = now()

  • встановити updated_by = user_id з токену

Знайти запит на персону

Додати запис до IL.person_requests, встановити значення:

  • id = автогенерований uuid

  • person_data = $.person з запиту в форматі json

    • person_data.person.id = person_id з токену

  • status = NEW

  • authentication_method_current = null

  • channel = PIS

  • legal_entity_id = null

  • tax_id = $.person.tax_id з запиту (якщо не null)

  • last_name = $.person.last_name з запиту

  • first_name = $.person.first_name з запиту

  • birth_date = $.person.birth_date з запиту

  • printout_form = відобразити друковану форму

  • documents = згенеровані лінки для завантаження документів (якщо потрібно)

  • person_documents = $.person.documents з запиту в форматі json

  • inserted_by = user_id з токену

  • updated_by = user_id з токену

  • inserted_at = now()

  • updated_at = now()

  • patient_signed = $.patient_signed з запиту

  • process_disclosure_data_consent = $.process_disclosure_data_consent з запиту

  • person_data_id = $.person.id з запиту

  • authorize_with = null

Відобразити відповідь

Відобразити відповідь у відповідності до специфікації.

  • No labels