
Документація
Загальний опис
Метою розробки є інтеграція з ЄДР для автоматизації та централізації отримання даних про КБВ (кінцевого бенефеціарного власника) для учасників що є юридичними особами. Дана інформація може бути як обовʼязковою так і не обовʼязковою для певних процедур.
Для реалізації цієї інтеграції необхідно виконати дії:
- Додати до базової моделі award необовʼязкову до заповнення поле beneficiaries моделю даних beneficiariesGeneralInfo (модель даних наведено нижче)
- Налаштувати інтеграцію з ЄДР де після відправки запиту заповнюється модель beneficiariesGeneralInfo
- При внесенні інформації змінюємо award.dateModified, dateModified (procedure) та systemDateModified
- Майданчики відображають дану інформацію організатору в його кабінеті. Відображення в інших місцях не є обовʼязковою (портал, кабінети учасників)
Business flow
Майданчик, залучає користувача до участі в аукціоні де звіт з інформацією про КБВ
- Учасник є юридичною особою
- Учасник подає заявку на участь
- Майданчик активує заявку на участь
- Заявка на участь перейшла в кваліфікацію
- Під час створення award ЦБД направляє асинхроний запит в ЄДР зі статичним API Token і даними для пошуку де виконуються умови:
- Для award в статусах: pending_waiting, pending_admission, pending
- Для award..identifier.UA-EDR
- Для процедур з переліку процедур
- LLE, LLD, LLP - Оренда за законом
- LRE - Земельні торги - оренда
- LSE + LSP - Земельні торги - продаж/продаж з переважним правом
- REM - Процедури розподілу квот
- SSW - Продаж майна приватних компаній (Закриті пропозиції)
- SPE + SPD - Мала приватизація
- LPE - Велика приватизація
- LAE + LAP + LAW - Продаж арештованої землі
- APE + APD - Арештовані активи АРМА
- SAE + SAD - Санкційне майно
- SUE+SUD - Спеціальні дозволи на користування надрами
- Процедури, яких немає в переліку не використовують даний функціонал - РО попереджено що додавання нових напрямків йде через розробку
- ЦБД отримує дані з ЄДР
- Перевіряє отримані дані:
- Якщо в отриманій відповіді містяться дані, які не можна внести в award → ЦБД не вносить дані в award
- Якщо в отриманій відповіді містяться дані, які можна внести в award → ЦБД вносить дані в award
- При внесенні даних змінюється:
- award.dateModified
- dateModified (procedure)
- systemDateModified
Як працює сервіс ЄДР
Аутентифікація до API ЄДР здійснюється за допомогою статичного API токена.
Токен передається у заголовку: Authorization: Token {API_TOKEN}
Обмін даними здійснюється по протоколу HTTPS, що забезпечує захищене передавання токена.
Формат відповіді визначається заголовком: Accept: application/json
Дія тестового ключа 6 місяців
Доступні ендпоінти (Потребує перевірки та доповнення після отримання тестових ключей)
Аутентифікація за API Token
- Передача API Token у заголовку Authorization
Метод отримання унікального ідентифікатора
Метод: POST
Ендпоінт: https://targetServer/1.0/subjects?code=ХХХХХХХХ, де code - код ЄДРПОУ учасника
Приймає на вхід:
- Обовʼязковий query-параметр: code
Приклад запиту:
Приклади відповіді:
Якщо code знайдено, а також токен авторизації є валідним:
Якщо code не знайдено:
Якщо сплив термін дії токена авторизації:
Якщо сервіс наразі недоступний:
Також можливий кейс, що АРІ поверне 403 помилку, якщо, наприклад, ЄДР змінить права доступу нашого акаунту.
Помилки
Коди помилок та відповідей:
Коди відповідей HTTP
Код | Текст | Пояснення |
|---|
200 | OK | Запит успішно оброблено і повернуто результат |
400 | Bad Request | Запит має помилку або не може бути оброблений. Відповідне повідомлення з поясненнями додане до відповіді. |
401 | Unauthorized | Параметри авторизації не правильні, або не вказані взагалі. |
402 | PaymentRequired | Для виконання запиту необхідна оплата. |
403 | Forbidden | Запит вірний але в обробці відмовлено. Відповідне повідомлення з поясненнями додано до відповіді. |
404 | Not Found | Адреса не правильна або ресурс до якого йде запит не існує. |
406 | Not Acceptable | Дані передані в запиті мають не зрозумілий формат. |
429 | Many Requests | API повертає таку відповідь коли вичерпано обмеження запитів до ресурсу. |
500 | Internal Server Error | Щось зламалось. |
502 | Bad Gateway | Сервіс вимкнено або проходить оновлення. |
Повідомлення з інформацією про помилку.
У разі помилки API повертає відповідь з поясненням, формат - JSON, наприклад:
{"errors":[{"message":"Invalid or expired token","code":2}]}
Перелік кодів помилок
У відповіді, окрім повідомлення з поясненням, додатково надається код помилки, який можна використовувати для автоматизованої обробки. Протягом часу, текстове повідомлення може модифікуватись, але код залишається незмінним.
Код | Текст | Пояснення |
1 | Could not authenticate you або Authentication credentials were not provided | Помилка аутентифікації. |
2 | Invalid or expired token | Недіючий або некоректний токен. |
3 | Your account is not permitted to access this resource | Відповідь надається разом із HTTP статусом 403. Користувач, з використанням токену якого було виконано аутентифікацію, не має достатніх прав для виконання запиту. |
4 | Sorry, that page does not exist | Відповідь надається разом із HTTP статусом 404. Сторінка до якої виконується запит не знайдена. |
5 | Paiment required | Відповідь надається разом із HTTP статусом 402. Недостатньо коштів для виконання платного запиту. |
6 | Parse Error або `search_date` has wrong format | Відповідь надається разом із HTTP статусом 400. Не правильний формат одного або декількох параметрів запиту. |
9 | Rate limit exceeded | Відповідь надається разом із HTTP статусом 429. Вичерпано кількість запитів, дозволених виконати протягом проміжку часу. |
10 | `code` or `passport` parameter must be provided. | У запиті не надано параметрів необхідних для виконання пошуку. |
11 | `passport` parameter has wrong value. | Один або більше параметрів запиту має невірний формат. |
20 | Internal error | Відповідь надається разом із HTTP статусом 500. |
Технічні вимоги до автоматичного збагачення award даними КБВ з ЄДР
| Технічна назва | Бізнес назва (x-legalName) | Тип | Read only | Обовʼязковість (потребує уточнень) | Коментар |
|---|
| uk_UA | en_US |
|---|
beneficiaries
| Інформація про кінцевого бенефеціарного влсника | Information about the ultimate beneficial owner
| list of objects | true | false |
| | | fallback | | | object | true | false | Може бути тільки один в разі відсутності даних про КБВ | | |
| systemReason | Системна причина відсутності даних | Systemic reason for missing data | string | true | false |
| | | excluded | Ознака виключення відомостей про КБВ за вказівкою Міністерства юстиції України | | | true | false |
| | | isMissing | Ознака відсутності КБВ юридичної особи | |
| true | false |
| | | reason | Причина відсутності КБВ юридичної особи | | string (multilang) | true | false |
| | | informationDate | Дата отримання даних | Date of information | string ($dateTime) | true | true |
| | | beneficiariesGeneralInfo | | | object | true | false | Може бути декілька. Якщо хоча б один КБВ невалідний → НЕ записується жоден |
|
| beneficialName | ПІБ кінцевого бенефеціарного власника | Full name of the ultimate beneficial owner | string (multilang) | true | true | В запиті Прізвище це відповідь на один запит, Імʼя та По батькові - відповідь на інший запит |
|
| address | Адреса | Address | model | true | true |
|
|
| beneficiariesType | Тип бенефіціарного володіння | Type of beneficiaries | string (multilang) | true | true |
|
|
| role | Роль КБВ по відношенню до пов’язаного суб’єкта |
| string | true | true | Відповідь на запит текстове відображення ролі (roleText) |
|
| interest | Відсоток частки статутного капіталу або відсоток права голосу |
| float | true | true |
|
|
| indirectInterest | Відсоток частки статутного капіталу або відсоток права голосу у разі непрямого впливу |
| float | true | true |
|
|
| otherImpact | Інший характер та міру впливу |
| |
|
|
|
|
| beneficiaryFalse | Ознака можливої недостовірності інформації про КБВ |
| |
|
|
|
|
Ключові правила
- Інтеграція тригериться тільки при створенні award в модель даних beneficiariesGeneralInfo
- Запит асинхронний
- Дані записуються тільки якщо валідні
- Запис — атомарний (все або нічого):
- або записуються всі КБВ (якщо хоча б один КБД не валідний - не записується жоден)
- або записується один fallback - обʼєкт
- Основний сценарій:
- Створюється award
- Перевіряються умови
- Виконується аутентифікація в ЄДР
- Виконується запит до ЄДР
- Отримується відповідь
- Відбувається валідація
- Якщо валідно:
- запис у
award.beneficiaries[] - оновлення:
- award.dateModified
- procedure.dateModified
- systemDateModified
- Retry (до 3 разів) тільки для: 500, 502
- retry з exponential backoff
- після 3 спроб → fallback де beneficiaries.fallback.systemReason = "Не вдалось отримати інформацію з сервісу"
- API_TOKEN зберігається:
- у захищеному конфігураційному середовищі
- не логуються
- не передається у відкритому вигляді
Обмеження
- Система не повинна виконувати безкінечні повторні запити.
- Інтеграція не виконується без умов
- Частковий запис даних заборонений
Статуси інтеграції
| Статус | Опис |
|---|
active | Запити до ЄДР виконуються |
payment_required | Отримано 402, запити зупинено |
rate_limit_exceeded | Отримано 429, запити зупинено |
suspended | Загальний статус призупинення |
| auth_error | Проблема з токеном |
| access_denied | 403 |
| invalid_request | 400/406 |
Обробка помилок
Класифікація помилок
| Тип | Коди |
|---|
| Tech | 500, 502 |
| Auth | 401 |
| Business | 402, 429 |
| Access | 403 |
| Data | 400, 404, 406 |
Таблиця зведених правил обробки помилок
| HTTP code | Retry | Зупинка інтеграції | Slack | Дія |
|---|
| 400 | Ні | Ні (можливо) | Так | помилка запиту |
| 401 | Ні | Так / auth_error | Так | невалідний або відкликаний API Token |
| 402 | Ні | Так | Так | очікування оплати |
| 403 | Ні | Ні (можливо) | Так | перевірка доступу |
| 404 | Ні | Ні | Ні | суб'єкт відсутній |
| 406 | Ні | Ні (можливо) | Так | помилка формату |
| 429 | НІ | Так | Так | перевищено ліміт |
| 500 | Так (3 рази) | Ні | Ні | тимчасова помилка |
| 502 | Так (3 рази) | Ні | Ні | сервіс недоступний |
Правила додаткової обробки помилок
Обробка 401
означає невалідний або відкликаний токен
retry НЕ виконується
надсилається Slack alert
статус інтеграції → auth_error
Обробка 404
- Отримано 404
- запис в поле beneficiaries.fallback.systemReason = "Суб'єкт не знайдено в ЄДР"
Slack повідомлення
Відправляються для:
- 400
- 402
- 403
- 406
- 429
- auth_error
Зупинка інтеграції
Тригер
Інтеграція зупиняється при:
Поведінка
- всі нові запити НЕ виконуються
- статус інтеграції змінюється
Відновлення інтеграції
Після 402
внесення коштів
ручне відновлення
статус → active
Після 429
відновлення ліміту
- ручне відновлення
- статус → active
awards НЕ обробляються повторно після відновлення інтеграції - для POC Для етапу розробки адмінки треба передбачити - Ручна зупинка інтеграції
- Ручне відновлення інтеграції
- Ручний запуск інтеграції по конкретному аварду, або переліку авардів (множинний вибір)
|
Логування
Обовʼязково логувати:
- correlationId
- request/response
- error code
- retry count
Timeout
- timeout = 5-10 секунд
- retry = ексоненційна затримка
Сценарії роботи інтеграції з
User Story 1. Автоматичне отримання КБВ
| Як | ЦБД Prozorro.Sale |
| я хочу | автоматично отримувати та зберігати інформацію про кінцевих бенефіціарних власників (КБВ) з ЄДР при створенні award |
| щоб | забезпечити актуальність, централізацію та зменшити залежність від ручного введення даних |
USE CASE 1 — Успішне отримання та збереження КБВ
Назва | Отримання та запис КБВ з ЄДР в award |
| Актори | - ЦБД (primary)
- ЄДР API (external)
|
| Передумови | - Процедура входить в перелік дозволених (LLE, LLD, …, SUD)
- Учасник є юридичною особою
- award.buyers.identifier.scheme = UA-EDR
- award.status ∈ {pending_waiting, pending_admission, pending}
- інтеграція має статус active
|
| Основний сценарій | Дані невалідні → UC2 Помилка API → UC3/UC11-15 - Учасник подає заявку
- Майданчик активує заявку
- Заявка переходить у кваліфікацію
- ЦБД створює
award - ЦБД перевіряє умови запуску інтеграції
- ЦБД формує запит до ЄДР із заголовками:
- Authorization: Token {API_TOKEN}
- Accept: application/json
- ЦБД відправляє запит до ЄДР з
code = ЄДРПОУ - ЄДР повертає дані КБВ (може бути список)
- ЦБД валідовує відповідь
- Дані відповідають моделі
beneficiariesGeneralInfo - ЦБД записує дані в
award.beneficiaries - Оновлює:
award.dateModifiedprocedure.dateModifiedsystemDateModified
|
| Результат | award містить список валідних КБВ (може бути декілька) |
Acceptance Criteria
1 | Given | Всі умови виконані |
When | Створюється award |
Then | Відправляється запит до ЄДР |
2
| Given | ЄДР повернув валідні дані |
When | Дані проходять валідацію |
Then | Дані про КБВ записуються в award.beneficiaries |
3 | Given | Дані записані |
Then | оновлюються всі dateModified: award.dateModifieddateModified (procedure)systemDateModified
|
USE CASE 2 — Дані не можуть бути внесені
Назва | Відмова у записі КБВ |
| Актори | - ЦБД (primary)
- ЄДР API (external)
|
| Передумови | Отримано відповідь ЄДР |
| Основний сценарій | - ЦБД отримує дані
- Перевіряє дані на відповідність моделі даних
- Якщо дані:
- неповні / некоректні / не мапляться
- ЦБД НЕ записує дані
|
| Альтернативний сценарій | Всі КБВ валідні → UC1 |
| Результат | award без змін |
Acceptance Criteria
1 | Given | Дані не відповідають моделі |
When | Виконується валідація |
Then | Дані не записуються |
USE CASE 3 — Retry при помилках 500 / 502
Назва | Повторна спроба отримання даних |
| Актори | - ЦБД (primary)
- ЄДР API (external)
|
| Передумови | Отримано HTTP код: 500, 502 |
| Основний сценарій | - ЦБД відправляє запит
- Отримує 500 або 502
- Виконує retry
- Повторює до 3 разів
- Якщо успіх → UC1
|
| Альтернативний сценарій | Всі retry невдалі → UC4 |
| Результат | |
Acceptance Criteria
1 | Given | Отримано 500/502 |
When | Виконується retry |
Then | Система повторює запит до 3 разів |
2 | Given | Всі retry невдалі |
Then | Записується повідомлення в поле beneficiaries.fallback.systemReason: "Не вдалось отримати інформацію з сервісу" |
USE CASE 4 — Fallback
Назва | Внесення системної помилки |
| Актори | ЦБД (primary) |
| Передумови | retry завершився невдачею |
| Основний сценарій | - Формується fallback-об’єкт
- Записується в beneficiaries.fallback.systemReason
|
| Результат | award містить fallback |
Acceptance Criteria
1 | Given | Дані не отримані після retry |
Then | Записується fallback |
AND | Відправляється повідомлення в Slack |
USE CASE 5 — Інтеграція не запускається
Назва | Неініціювання запиту до ЄДР |
| Актори | ЦБД (primary) |
| Передумови | Будь-яка з умов НЕ виконується: - процедура не з визначеного переліку
- відсутній
x_ultimateBeneficiaryInfo - не юрособа
- award.buyers.identifier.scheme ≠ UA-EDR
- статус award не підходить
|
| Основний сценарій | - Створюється award
- ЦБД перевіряє умови
- Інтеграція НЕ запускається
|
| Результат | Жодних запитів до ЄДР |
Acceptance Criteria
1 | Given | Умови не виконані |
When | Створюється award |
Then | запит до ЄДР не виконується |
USE CASE 6 — Обробка множинних КБВ
Назва | Запис кількох бенефіціарів |
| Актори | - ЦБД (primary)
- ЄДР API (external)
|
| Передумови | - Виконується UC1
- ЄДР повертає список КБВ
|
| Основний сценарій | - ЦБД мапить запис (кожен КБВ проходить однаковий mapping)
- Формує list of objects
- Записує в
award.beneficiaries[] - усі КБВ з відповіді ЄДР зберігаються, а не тільки перший;
- порядок не змінюється
|
| Альтернативний сценарій | хоча б один невалідний КБВ → UC2 |
| Результат | Збережено всі КБВ |
Acceptance Criteria
1 | Given | ЄДР повертає кілька КБВ |
When | Відбувається запис |
Then | Всі КБВ зберігаються в масиві |
User Story 2. Зупинка запитів в разі отримання помилок 402 або 429
| Як | ЦБД Prozorro.Sale |
| я хочу | зупиняти направлення запитів до ЄДР після першого отримання помилки 402 або 429 |
| щоб | не створювати зайве навантаження на сервіс, не витрачати ліміти та уникати повторних неуспішних запитів до моменту відновлення доступу/поповнення коштів. |
| додатково | Після внесення коштів або відновлення ліміту система має відновити направлення запитів до ЄДР. |
USE CASE 7 — Зупинка запитів після отримання 402
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 402 Payment Required |
| Актори | - ЦБД
- ЄДР
- Адміністратор/відповідальна команда
- Slack канал
|
| Передумови | - Інтеграція з ЄДР активна
- ЄДР повертає HTTP
402
|
| Основний сценарій | - ЦБД направляє запит до ЄДР.
- ЄДР повертає відповідь
402 Payment Required. - ЦБД фіксує помилку
- ЦБД змінює внутрішній статус інтеграції з ЄДР на →
payment_required - ЦБД припиняє направлення нових запитів до ЄДР.
- ЦБД відправляє повідомлення в Slack канал.
- Для нових awards, які підпадають під умови інтеграції, запит до ЄДР не виконується.
|
| Результат | - Інтеграція зупинена
- Нові запити до ЄДР не направляються.
- Команда отримала повідомлення про необхідність внесення коштів.
- Дані КБВ для нових awards тимчасово не збагачуються.
|
Acceptance Criteria
1 | Given | ЦБД отримала від ЄДР відповідь 402 |
When | Система обробляє відповідь |
Then | Інтеграція з ЄДР переходить у статус призупинення. |
2
| Given | Інтеграція має статус призупинення через 402 |
When | Створюється новий award, який відповідає умовам інтеграції |
Then | ЦБД не направляє запит до ЄДР. |
3 | Given | Отримано 402 |
| When | Система фіксує помилку |
Then | Повідомлення надсилається в Slack канал. |
USE CASE 8 — Зупинка запитів після отримання 429
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 429 Many Requests |
| Актори | - ЦБД
- ЄДР
- Slack канал
- Адміністратор/відповідальна команда
|
| Передумови | - Інтеграція з ЄДР активна
- ЄДР повертає HTTP
429 (означає, що вичерпано обмеження запитів до ресурсу)
|
| Основний сценарій | - ЦБД направляє запит до ЄДР.
- ЄДР повертає відповідь
429 Many Requests. - ЦБД фіксує помилку.
- ЦБД змінює внутрішній статус інтеграції з ЄДР на → rate_limit_exceeded
- ЦБД призупиняє направлення нових запитів до ЄДР.
- ЦБД відправляє повідомлення в Slack канал. (
Перевищено ліміт запитів до ЄДР) - Нові awards, які підпадають під інтеграцію, не ініціюють запит до ЄДР.
|
| Результат | - Інтеграція тимчасово зупинена.
- Нові запити до ЄДР не виконуються.
- Команда повідомлена про перевищення ліміту.
- Дані КБВ для нових awards тимчасово не збагачуються.
|
Acceptance Criteria
1 | Given | ЦБД отримала відповідь 429 |
When | Система обробляє відповідь |
Then | Направлення нових запитів до ЄДР зупиняється. |
2
| Given | Інтеграція призупинена через 429 |
When | Створюється новий award |
Then | ЦБД не направляє запит до ЄДР |
3 | Given | Отримано 429 |
| When | Система обробляє помилку |
Then | Повідомлення надсилається в Slack канал. |
USE CASE 9 — Відновлення запитів після внесення коштів
Назва | Ручне або автоматичне відновлення інтеграції з ЄДР після внесення коштів |
| Актори | - Адміністратор/відповідальна команда
- ЦБД
- ЄДР
|
| Передумови | - Інтеграція з ЄДР була призупинена через
402 - Статус інтеграці = payment_required
- Кошти внесено / доступ до сервісу відновлено
|
| Основний сценарій | - Відповідальна команда вносить кошти.
- Адміністратор ініціює відновлення інтеграції.
- ЦБД змінює статус інтеграції з payment_required на active
- ЦБД відновлює направлення запитів до ЄДР.
- При створенні наступного award ЦБД знову виконує стандартну логіку запиту до ЄДР.
- Якщо ЄДР повертає
200, дані КБВ обробляються та записуються в award.
|
| Результат | - Інтеграція з ЄДР активна.
- Запити до ЄДР відновлені.
- Система продовжує автоматичне збагачення awards даними КБВ.
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 402 |
| And | Кошти внесено |
When | Адміністратор активує інтеграцію |
Then | Статус інтеграції змінюється на active. |
2
| Given | Інтеграція активна після відновлення |
When | Створюється новий award |
Then | ЦБД направляє запит до ЄДР |
3 | Given | ЄДР після відновлення повертає 200 |
| When | ЦБД отримує валідні дані |
Then | Дані записуються в award.beneficiaries |
USE CASE 10 — Відновлення після вичерпання ліміту запитів
Назва | Відновлення інтеграції після помилки 429 |
| Актори | - Адміністратор/відповідальна команда
- ЦБД
- ЄДР
|
| Передумови | - Інтеграція була призупинена через
429 - Статус інтеграці = rate_limit_exceeded
- Ліміт запитів поновлено або відповідальна команда підтвердила можливість повторного використання сервісу
|
| Основний сценарій | - Відповідальна команда перевіряє, що ліміт запитів відновлено.
- Адміністратор активує інтеграцію.
- ЦБД змінює статус інтеграції з rate_limit_exceeded на active
- Наступні awards знову запускають запит до ЄДР.
- Якщо ЄДР повертає успішну відповідь — дані обробляються за стандартним сценарієм.
|
| Результат | - Інтеграція з ЄДР активна.
- Запити до ЄДР відновлені.
- Система продовжує автоматичне збагачення awards даними КБВ.
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 429 |
When | Ліміт запитів відновлено |
And | Адміністратор активує інтеграцію |
Then | ЦБД знову направляє запити до ЄДР |
2
| Given | Інтеграція активована після 429 |
When | Створюється award |
Then | Запит до ЄДР виконується |
User Story 3. Обробка помилок інтеграції з ЄДР та забезпечення стабільності системи
| Як | ЦБД Prozorro.Sale |
| я хочу | коректно обробляти всі типи помилок від ЄДР (400, 401, 403, 404, 406, 500, 502) |
| щоб | забезпечити стабільну роботу системи, не втрачати дані та мати можливість відновлення інтеграції |
USE CASE 11 — Обробка 401 Unauthorized при невалідному API Token
Назва | Автоматичне оновлення токена при помилці 401 |
| Актори | |
| Передумови | - Запит до ЄДР виконано
- Отримано
401 Unauthorized
|
| Основний сценарій | - ЦБД отримує 401
- Визначає, що токен невалідний
- НЕ виконує retry
- Надсилає Slack alert
- Статус інтеграції →
auth_error
|
| Результат | - Інтеграція відновлюється без втручання людини
- або помилка auth
|
Acceptance Criteria
1 | Given | Отримано 401 |
When | Система обробляє відповідь |
Then | Retry не виконується |
2
| Given | Отримано 401 |
When | Система фіксує помилку |
Then | Статус інтеграції змінюється на auth_error |
3 | Given | Отримано 401 |
When | Система фіксує помилку |
Then | Повідомлення надсилається в Slack канал |
4
| Given | Статус інтеграції = auth_error |
When | Створюється новий award, який відповідає умовам інтеграції |
Then | Запит до ЄДР не виконується до заміни/актуалізації API Token |
USE CASE 12 — Помилка 400 (Bad Request)
Назва | Обробка некоректного запиту до ЄДР |
| Актори | |
| Передумови | - Запит до ЄДР виконано
- Отримано
400
|
| Основний сценарій | - ЦБД отримує
400 - Аналізує помилку
- Визначає:
- помилка у формуванні запиту
- НЕ виконує retry
- Логує помилку
- Надсилає повідомлення в Slack
- Переводить інтеграцію в статус invalid_request
|
| Рішення | Виправлення формату запиту (dev fix) |
| Результат | - запит не повторюється
- потрібне втручання розробника
|
Acceptance Criteria
1
| Given | Отримано 400 |
When | Обробляється помилка |
Then | Retry не виконується |
And | Slack отримує повідомлення |
USE CASE 13 — Помилка 403 (Forbidden)
Назва | Обробка відсутності прав доступу |
| Актори | |
| Передумови | - Запит до ЄДР виконано
- Отримано
403- змінились права доступу до API
- акаунт не має доступу
|
| Основний сценарій | - ЦБД отримує
403 - Аналізує помилку
- НЕ виконує retry
- Відправляє повідомлення в Slack
- Переводить інтеграцію в статус
access_denied
|
| Рішення | - перевірка прав доступу
- перевидача ключів / ролей
|
| Результат | Інтеграція не працює до виправлення |
Acceptance Criteria
1
| Given | Отримано 403 |
Then | Retry не виконується |
And | Slack отримує повідомлення |
USE CASE 14 — Помилка 404 (Not Found)
Назва | Обробка відсутності суб’єкта в ЄДР |
| Актори | |
| Передумови | - Запит до ЄДР виконано
- Отримано
404
|
| Основний сценарій | - ЦБД отримує
404 - Аналізує помилку
- Визначає, що суб'єкт відсутній
- НЕ виконує retry
- Записує beneficiaries тільки fallback в поле beneficiaries.fallback.systemReason:
- "Суб'єкт не знайдено в ЄДР"
|
| Результат | - award без КБВ
- award містить beneficiaries.fallback.systemReason
|
Acceptance Criteria
1
| Given | Отримано 404 |
Then | Retry не виконується |
And | Записує beneficiaries тільки поле beneficiaries.fallback.systemReason: - "Суб'єкт не знайдено в ЄДР"
|
USE CASE 15 — Помилка 406 (Not Acceptable)
Назва | Обробка помилки формату даних |
| Актори | |
| Передумови | - Запит до ЄДР виконано
- Отримано
406
|
| Основний сценарій | - ЦБД отримує
406 - Аналізує помилку
- НЕ виконує retry
- Відправляє alert в Slack
- Переводить інтеграцію в статус invalid_request
|
| Рішення | - перевірка контракту API
- виправлення формату
|
| Результат | - інтеграція не виконується для цього запиту
|
Acceptance Criteria
1
| Given | Отримано 406 |
Then | Retry не виконується |
And | Slack отримує повідомлення |
User Story 4. Обробка випадків, коли дані не знайдені або недоступні
| Як | ЦБД Prozorro.Sale |
| я хочу | оректно обробляти випадки, коли ЄДР не повертає дані або повертає пустий результат |
| щоб | забезпечити прозору причину відсутності КБВ у системі |
USE CASE 16 — Порожній результат (200, але без даних)
Назва | Суб’єкт не знайдений за кодом ЄДРПОУ (порожній результат) |
| Актори | |
| Передумови | - Інтеграція з ЄДР активна
- Запит до ЄДР виконано
- ЄДР повертає HTTP 200
- Список
beneficiaries порожній
|
| Основний сценарій | - ЦБД отримує відповідь 200
- Перевіряє тіло відповіді
- Визначає, що список результатів порожній
- Не виконує заповнення КБВ
- Записує fallback з причиною
|
| Результат | - Інтеграція зупинена
- Нові запити до ЄДР не направляються.
- Команда отримала повідомлення про необхідність внесення коштів.
- Дані КБВ для нових awards тимчасово не збагачуються.
|
Acceptance Criteria
1 | Given | ЦБД отримала від ЄДР відповідь 200 |
And | Список результатів порожній |
When | Система обробляє відповідь |
Then | КБВ не заповнюються |
2
| Given | Пустий результат |
Then | записується systemReason = "Суб’єкт не знайдений за кодом ЄДРПОУ" |
User Story 5. Узгодженість даних при зміні статусу award
| Як | ЦБД Prozorro.Sale |
| я хочу | завершувати обробку запиту до ЄДР навіть якщо статус award змінився |
| щоб | уникнути втрати даних через асинхронність |
USE CASE 17 — Award змінив статус під час запиту
Назва | Обробка відповіді ЄДР після зміни статусу award |
| Актори | |
| Передумови | - Запит до ЄДР вже відправлений
- Award змінив статус (наприклад:
- дискваліфіковано
- cancelled
- unsuccessful)
|
| Основний сценарій | - ЦБД відправляє запит
- Award змінює статус
- ЦБД отримує відповідь від ЄДР
- НЕ перевіряє актуальний статус award
- Обробляє відповідь за стандартною логікою:
- або запис КБВ
- або fallback
|
| Результат | - Дані КБВ (або fallback) збережені незалежно від статусу award
|
Acceptance Criteria
1 | Given | Запит до ЄДР відправлено |
And | Award змінив статус |
When | Отримано відповідь |
Then | Відповідь обробляється |
2
| Given | Пустий результат |
Then | записується systemReason = "Суб’єкт не знайдений за кодом ЄДРПОУ" |