Table of Contents |
---|
...
Вхідні дані - це підписані дані у форматі PKCS7. Дані повинні бути розпаковані та перевірені за допомогою схеми (Capitation Contract_request) або схеми JSON (Reimbursement Contract_request) Для того, щоб змінити підписаний контракт, слід надіслати номер_договору. У цьому випадку start_date та end_date взяті з існуючого контракту і не повинні бути присутніми в payload (за винятком випадків пролонгації контракту. Для цих випадків перевірки описані нижче). Якщо цей запит на контракт змінюється на інший, ідентифікатор попереднього запиту на контракт (Створити запит на контракт # попередній_запит) повинен бути надісланий як payload.
Авторизація
Перевірити валідність доступу токену:
в разі помилки 401 ('Invalid access token')
Перевірити набір даних contract_request:create перед виконанням дії
в разі помилки 401 у відповіді ('Invalid access token')
Цифровий підпис
Розшифруйте вміст, зашифрований електронним цифровим підписом. Використовуйте цифровий підпис WS. Метод перевіряє цифровий підпис і повертає результат.
...
Нам потрібно перевірити ЦП базуючись на формі власності юридичної особи. ЦП може належати фізичній особі-підприємцю або юридичній особі. Як і попередня версія ЦП, він може містити tax_id у полі EDRPOU, а не в DRFO, перевірка повинна виконуватися, як описано нижче:
Взяти client_id з token
Знайти prm.legal_entities по client_id
Перевірити EDRPOU або DRFO співпадіння prm.legal_entities.EDRPOU
Перевірити, що EDRPOU в деталях Certificate не пусто
Перевірити, що Certificate_details.EDRPOU=prm.legal_entities.EDRPOU
в разі, якщо валідація a. не проходить - Перевірити, що DRFO в деталях Certificate не пусто
Поміняти DRFO та prm.legal_entities.EDRPOU на великі літери
Перевірити та поміняти DRFO та prm.legal_entities.EDRPOU на Кирилицю
Перевірити та поміняти DRFO та Cyrillic на Кирилицю
Перевірити, що Certificate_details.DRFO=prm.legal_entities.EDRPOU
в разі, якщо валідація не проходить - згенерувати помилку 422
Перевірити, що SURNAME в деталях Certificate дорівнює LAST_NAME в Party
Взяти user_id → user_parties.party_id → parties.last_name та порівняти з прізвищем з ЦП
Поміняти prm.parties.LAST_NAME та Certificate details.SURNAME на великі літери
Перевірити та поміняти prm.parties.LAST_NAME та Certificate details.SURNAME на Кирилицю
в разі, якщо валідація не проходить - згенерувати помилку 422
Валідація DRFO
Взяти parties.tax_id використовуючи party_users.party_id від user_id.
Порівняти DRFO в Certificate з party.tax_id
Поміняти DRFO та TAX_ID на великі літери
Перевірити та поміняти DRFO та TAX_ID на Кирилицю
Перевірити та поміняти DRFO на Кирилицю
в разі, якщо валідація не проходить - згенерувати помилку 422
Перевірка ролей
Завантажити з token:
Перевірити client_id (is_blocked=false)
в разі помилки згенерувати код 403 ('Client is blocked')
Перевірити контрагента в договорі contractor_legal_entity активний чи призупинений
в разі помилки згенерувати код 403 - ('Client is not active')
Валідація запиту
Валідація contract_type:
юридична особа з типом в (MSP,PRIMARY_CARE) може створити тілько договір капітації, юридична особа з типом в (PHARMACY) може створити тілько договір реімбурсації
в разі помилки 409 - "Contract type "{contract_type}" is not allowed for legal_entity with type "{legal_entity_type}" "
Валідація previous_request_id
вибрати id from contract_request де id=$.previous_request_id
якщо дані не знайдено згенерувати помилку 422 ("previous_request does not exist")
Перевірити previous_request status не рівно ('SIGNED')
в разі помилки згенерувати код 422 ('In case contract exists new contract request should be created')
Перевір contractor_legal_entity_id попереднього запиту рівний до contractor_legal_entity_id поточного запиту
в разі помилки згенерувати код 422 ('Previous request doesn't belong to legal entity')
Для договоду реімбурсації: Перевірити що id_form з $.previous_request_id рівний до id_form для запиту
в разі помилки згенерувати код 422 ('Id_form from previous request is not equal to id_form from request')
Валідація contractor_divisions
Превірити, що підрозділ належить до legal_entity та divisions.status='active'
в разі помилки згенерувати код 422 переглянути $divisions ('Division must be active and within current legal_entity')
Перевірити, що підрозділ в масиві зустрічається тілько один раз
в разі помилки згенерувати код 422 переглянути $divisions ('Division duplicates')
Валідація start_date
перевірити формат start_date (^(\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))?)?$)
в разі помилки згенерувати код 422 error $start_date ('"expected \"<start_date>" to be a valid ISO 8601 date"')
рік в start_date повинен співпадати з поточним або наступним роком (current+1).
в разі помилки згенерувати код 422 error $start_date ('Start date must be within this or next year')
Валідація end_date (Примітка. Дані валідації дійсні для випадків, коли contract_number не проходить перевірки в запиті. Якщо contract_number перевірено, проводяться валідації з 10.п)
перевірити формат end_date (^(\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))?)?$)
в разі помилки згенерувати код 422 error $end_date ('"expected \"<end_date>" to be a valid ISO 8601 date"')
рік повинен $end_date може бути наступним роком після 'start_date' якщо повний період договору не перевищує 1 року.
$end_date повинна бути більше або рівнятися $start_date
в разі помилки згенерувати код 422 ('The end_date should be greater or equal than the start_date')
різниця між $end_date та $start_date повинна бути не більше ніж 1 рік (365 або 366 днів)
в разі помилки згенерувати код 422 ('The difference between end_date and start_date is more than one year')
Валідація contractor_owner_id
Перевірити employees.employee_id=contractor_owner_id та client_id=employee.legal_entity_id та employee_type в ('OWNER', 'ADMIN') та status='APPROVED' та is_active=true
в разі помилки згенерувати код 422 Error ('Contractor owner must be an active OWNER or ADMIN and within current legal entity in contract request')
Якщо в напиті було надіслано contract_number:
перевірити структуру номеру договору XXXX-1234-5678-C , де:
XXXX - порядок: номер + літери з переліку (A, E, H, K, M, P, T, X)
1234-5678 - рандомного згенерований номер та літери A, E, H, K, M, P, T, X.
перевірити, що договір з даним contract_number
в разі помилки згенерувати код 422 ('Contract with such contract number does not exist')
перевірити, що договір не в статусі 'TERMINATED'
в разі помилки згенерувати код 409 ('Can not update terminated contract')
employee_divisions, start_date, end_date не можуть бути оновлені. Якщо є активний договіп з таким contract_number зкопіювати start_date, end_date та contractor_legal_entity_id з уже діючого договору. Це не можливо зробити через запит.
в разі помилки згенерувати код 422
перевірити підтверджений contract_type такий же, що і в діючому договорі з номером =contract_number
в разі помилки згенерувати код 409 ('Submitted contract_type does not correspond to previously created content`)
для запитів для договорів капітації та реімбурсації:
якщо $contract_number та $end_date проходять перевірки в запиті:
$end_date повинна бути більше або рівна $start_date
в разі помилки згенерувати код 422 ('The year of end_date should be one year greater or equal to start_date')
$end_date повинна бути меньше $end_date попереднього договору та меньше або дорівнювати даті плюс 3 місяці
в разі помилки згенерувати код 422 ('The end_date should be greater than of the previous contract and less than or equal to three months')
якщо $contract_number w/o $end_date проходять перевірки в запиті:
$end_date береться з попереднього договору.
для договору реімбурсації:
перевірити id_form такий же
в разі помилки повернути 409 ('Submitted id_form does not correspond to previously created content`)
якщо medical_programs відповідає - перевірити згідно опису в п.13 нижче
Валідація contractor_payment_details:
якщо payer_account не дорівнює ^UA[0-9]{22}$ або ^UA[0-9]{27}$ -> MFO повинен запитуваись
Валідація id_from з довідника CONTRACT_TYPE (для договору капітації) та REIMBURSEMENT_CONTRACT_TYPE (для договору реімбурсації) :
в разі помилки згенерувати код 422 ('value is not allowed in enum')
Валідація - відсутні інші активні (VERIFIED) договори, створені даним legal_entity_id за даний period(contract_request.start_date <= contract.end_date and contract_request.end_date => contract.start_date) тим самим contract_type та id_form (для договору реімбурсації)
в разі помилки згенерувати код 422 ('Active contract is found. Contract number must be sent in request')
Для договору капітації: Валідація external_contractors
Перевірити external_contractors.divisions.id наявна для contractor_divisions.id
в разі помилки згенерувати код 422 $divisions ('The division is not belong to contractor_divisions')
Перевірити external_contractors.contract.expires_at>start_date
в разі помилки згенерувати код 422 $contract.expires_at ('Expires date must be greater than contract start_date')
Встановити external_contractors.legal_entity_id='client_id'
division_id з external_contractors блоку повинна бути належна до юридичної особи яка включається до договору капітації. В external_contractors.legal_entity_id необхідно вказати юридичну особу counter-party для даного division_id.
Для договору капітації: Валідація external_contractor_flag:
якщо external_contractors не null тоді external_contractor_flag повинен бути
true
якщо external_contractors не null тоді external_contractor_flag повинен бути false
в разі помилки згенерувати код 422 $external_contractor_flag ('Invalid external_contractor_flag')
якщо external_contractors не був відправлений в запиті тоді встановити external_contractor_flag до false.
Для договору реімбурсації: Валідація medical_programs:
Перевірити, що всі medical_programs з submitted ids існують
в разі помилки згенерувати код 422 переглянути $medical_programs[...] ('Reimbursement program with such id does not exist')
Перевірити, що medical_programs з підтвердженим id це активна програма
в разі помилки згенерувати код 422 переглянути $medical_programs[...] ('Reimbursement program is not active')
Перевірити, що всі медичні програми з вказаним MEDICATION type:
в разі помилки згенерувати код 422 переглянути $medical_programs[...] (‘Program with such id is not a reimbursement program')
Перевірити, що medical_programs з підтвердженим id відповідає до id_form згідно наведеного переліку:
в разі помилки повернути код помилки 422 $medical_programs[...] ('Medical program is not allowed for this action')
Примітка. Для id_form=INSULIN_1 та PSYCHIATRY дві програми повинні бути вказані.в разі помилки повернути код 409 $medical_programs ('The composition of medical programs does not correspond to the allowed composition')
Перевірити список медичних програм в масиві на відсутність дублів id:
в разі помилки повернути код 409 $medical_programs (‘The list of medical programs contains duplicates')
id_form | medical_programs |
---|---|
PMD_1 | REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_ID_DOSTUPNI_LIKY |
INSULIN_1 | REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_ID_INSULIN_Z_DOPLATOYU REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_ID_INSULIN_BEZ_DOPLATY |
ND_1 | REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_ID_NETSUKROVYY_DIABET |
PSYCHIATRY | REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_IDS_PSYCHIATRY |
GENERAL | REIMBURSEMENT_CONTRACT_REQUEST_MEDICAL_PROGRAM_IDS_GENERAL |
Примітка. Для GENERAL id_form користувач може вказати будь-яку кількість програм (але хоча б одну) зі списку в конфігурації. Також користувач може оновити список медичних програм, використовуючи логіку з розділ.7
Визначити первісний договір (опціонально)
В разі, якщо запит містить параметри '$.contract_number':
знайти договір, що відповідає '$contract_number', передається:
якщо відстній договір з зазначеним номером договору, згенерувати помилку 422 ('Contract with such contract number does not exist')
якщо договір в статусі 'Terminated', згенерувати код 409 ('Can not update terminated contract')
встановити parent_contract_id значення як contract.id
Словники
CONTRACT_PAYMENT_METHOD
CONTRACT_TYPE
REIMBURSEMENT_CONTRACT_TYPE
ADDRESS_TYPE
COUNTRY
SETTLEMENT_TYPE
STREET_TYPE
PHONE_TYPE
SPECIALITY_TYPE
SPECIALITY_LEVEL
SPEC_QUALIFICATION_TYPE
Пошук запитів, що очікують на розгляд
Перевірити, що є в наявності
для того ж contractor_legal_entity_id
для того ж періоду [start_date, end_date]
статус в ('NEW', 'IN_PROCESS','APPROVED', 'NHS_SIGNED', 'PENGIND_NHS_SIGN')
id_form
...
Зберегти підписаний договір до сховища
Отримати url для завантаженого договору.
Parameter | Source |
---|---|
timestamp | :TIMESTAMP |
resource_name | :INITIAL_CONTRACT_REQUEST |
resource_id | :CONTRACT_REQUEST_ID |
action | 'GET' |
bucket | 'CONTRACT_REQUEST' |
Завантажити підписаний договір до сховища.