...
Метою розробки є інтеграція з ЄДР для автоматизації та централізації отримання даних про КБВ (кінцевого бенефеціарного власника) для учасників що є юридичними особами. Даний Дана інформація може бути обовʼязковим/не обовʼязковим як обовʼязковою так і не обовʼязковою для певних процедур (наразі розробка інтеграції відбувається тільки для процедур де є документ з типом x_ultimateBeneficiaryInfo).
Для реалізації цієї інтеграції необхідно виконати дії:
- Додати до базової моделі award необовʼязкову до заповнення поле beneficiaries моделю даних beneficiariesGeneralInfo (модель даних наведено нижче)
- Налаштувати інтеграцію з ЄДР де після відпраки відправки запиту заповнюється модель beneficiariesGeneralInfo
- При внесенні інформації змінюємо award.dateModified, dateModified (procedure) та systemDateModifiedsystemDateModified
- Майданчики відображають дану інформацію організатору в його кабінеті. Відображення в інших місцях не є обовʼязковою (портал, кабінети учасників)Модель даних beneficiariesGeneralInfo
Технічна назва Бізнес назва (x-legalName) Тип Read only Обовʼязковість (потребує уточнень) Коментар uk_UA en_US beneficiaries Інформація про кінцевого бенефеціарного влсника Information about the ultimate beneficial owner list of objects true false reason
string (multilang) true false 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
Ознака можливої недостовірності інформації про КБВ excluded
Ознака виключення відомостей про КБВ за вказівкою Міністерства юстиції України isMissing
Ознака відсутності КБВ юридичної особи reason
Причина відсутності КБВ юридичної особи informationDate Дата отримання даних Date of information string ($dateTime) true true
Технічні вимоги до автоматичного збагачення award даними КБВ з ЄДР
- Майданчик, залучає користувача до участі в аукціоні де звіт з інформацією про КБВ (x_ultimateBeneficiaryInfo) визначений як тип документу
- Учасник є юридичною особою
- Учасник подає заявку на участь
- Майданчик активує заявку на участь
- Заявка на участь перейшла в кваліфікацію
- Під час створення award (асинхронний запит)ЦБД направляє запит в ЄДР з авторизаційним ключем і даними для пошуку де виконуються умови:
- Для award в статусах: pending_waiting, pending_admission, pending
- Для award.bidders.identifier.UA-EDR
- Для процедур де x_ultimateBeneficiaryInfo є типом документу. Перелік процедур
- 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
- При внесенні даних змінюється:
- Перевіряє отримані дані:
Ключові бізнес-правила
- Інтеграція тригериться тільки при створенні award
- Запит асинхронний
- Дані записуються тільки якщо валідні
- Запис — атомарний (все або нічого)
- Можливі декілька КБВ
- Retry (3 рази) тільки для:
- 500
- 502
- Slack alert тільки для:
- 4xx + 429
- Fallback текст при недоступності ЄДР
- У разі отримання першої відповіді від ЄДР з HTTP статусом 402 або 429 ЦБД має призупинити направлення всіх наступних запитів до сервісу ЄДР до моменту ручного або автоматичного відновлення інтеграції після внесення коштів / відновлення ліміту.
- Система повинна диференційовано обробляти помилки ЄДР:
- технічні помилки (500, 502) → retry (Якщо не вдається отримати відповідь виводимо в поле reason текст "Не вдалось отримати інформацію з сервісу")
- авторизаційні (401) → refresh token
- бізнес/доступ (402, 403, 406, 429) → зупинка або alert
- помилки даних (400) → без retry, з логуванням
- помилки даних (404) → без retry (Якщо не вдається отримати відповідь виводимо в поле reason текст "Суб'єкт не знайдено в ЄДР")
Система не повинна виконувати безкінечні повторні запити.
Статуси інтеграції (В разі якщо будемо виносити в Адмінку та або будемо в принципі зупиняти запити в разі отримання помилок)
| Статус | Опис |
|---|---|
active | Запити до ЄДР виконуються |
payment_required | Отримано 402, запити зупинено |
rate_limit_exceeded | Отримано 429, запити зупинено |
suspended | Загальний статус призупинення |
Як працює сервіс ЄДР
Сервіс ЄДР реалізований як API для автоматичного отримання даних для внесення інформації про КБВ учасника торгів що кваліфікується. Взаємодія працює по протоколу HTTP з використанням авторизації через JWT. Загальна логіка процесу: спочатку через метод авторизації отримуємо access та refresh токени, а потім використовуємо їх для виклику ендпоінту отримання даних для заповнення інформації про КБВ за кодом ЄДРПОУ юридичною особи. - Детальніше буде додано після отримання тестового ключа
Дія тестового ключа 6 місяців
Доступні ендпоінти (Потребує перевірки та доповнення після отримання тестових ключей)
Авторизація (отримання токенів)
Оновлення access_token
Метод отримання унікального ідентифікатора
Метод: 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. |
Правила обробки помилок
...
Сценарії роботи інтеграції з ЄДР
User Story 1
...
USE CASE 1 — Успішне отримання та збереження КБВ
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
- Процедура входить в перелік дозволених (LLE, LLD, …, SUD)
- В процедурі використовується документ
x_ultimateBeneficiaryInfo - Учасник є юридичною особою
award.bidders.identifier.scheme = UA-EDRaward.status ∈ {pending_waiting, pending_admission, pending}
...
- Учасник подає заявку
- Майданчик активує заявку
- Заявка переходить у кваліфікацію
- ЦБД створює
award - ЦБД перевіряє умови запуску інтеграції
- ЦБД виконує авторизацію в ЄДР (отримує JWT токен)
- ЦБД відправляє запит до ЄДР з
code = ЄДРПОУ - ЄДР повертає дані КБВ (може бути список)
- ЦБД валідовує відповідь
- Дані відповідають моделі
beneficiariesGeneralInfo - ЦБД записує дані в
award.beneficiaries - Оновлює:
award.dateModifiedprocedure.dateModifiedsystemDateModified
...
award містить список КБВ (може бути декілька)
Acceptance Criteria
...
1
...
When
...
Then
...
2
...
ЄДР повернув валідні дані
...
When
...
Then
...
3
...
Then
...
оновлюються всі dateModified:
award.dateModifieddateModified (procedure)systemDateModified
USE CASE 2 — Дані не можуть бути внесені
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
Отримано HTTP код:
400, 401, 402, 403, 404, 406, 429
...
- ЦБД отримує відповідь від ЄДР
- Перевіряє структуру
- Дані:
- неповні / некоректні / не мапляться
- ЦБД НЕ записує дані
...
award без змін
Acceptance Criteria
...
1
...
When
...
Then
...
USE CASE 3 — Retry при помилках 500 / 502
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
Отримано HTTP код:
500, 502
...
- ЦБД відправляє запит
- Отримує 500 або 502
- Виконує retry
- Повторює до 3 разів
...
після 3 невдалих спроб → fallback
...
- якщо успіх → UC1
- якщо ні → запис тексту помилки
Acceptance Criteria
...
1
...
When
...
Then
...
Система повторює запит до 3 разів
...
2
...
Then
...
Записується повідомлення:
"Не вдалось отримати інформацію з сервісу"
USE CASE 4 — Логування помилок в Slack
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
- Отримано HTTP код:
400, 401, 402, 403, 404, 406, 429
...
- ЦБД отримує помилку
- Формує повідомлення
- Відправляє в Slack канал
...
- команда отримує alert
Acceptance Criteria
...
1
...
When
...
Then
...
Відправляється повідомлення в Slack
USE CASE 5 — Інтеграція не запускається
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
Будь-яка з умов НЕ виконується:
- процедура не з переліку
- відсутній
x_ultimateBeneficiaryInfo - не юрособа
- не UA-EDR
- статус award не підходить
...
- Створюється award
- ЦБД перевіряє умови
- Інтеграція НЕ запускається
...
Жодних запитів до ЄДР
Acceptance Criteria
...
1
...
When
...
Then
...
запит до ЄДР не виконується
USE CASE 6 — Обробка множинних КБВ
...
Назва
...
- ЦБД (primary)
- ЄДР API (external)
...
- Процедура входить в перелік дозволених (LLE, LLD, …, SUD)
- В процедурі використовується документ
x_ultimateBeneficiaryInfo - Учасник є юридичною особою
award.bidders.identifier.scheme = UA-EDRaward.status ∈ {pending_waiting, pending_admission, pending}
...
- ЄДР повертає список КБВ
- ЦБД мапить кожен запис
- Формує list of objects
- Записує в
award.beneficiaries[]
...
Збережено всі КБВ
Acceptance Criteria
...
1
...
When
...
Then
...
User Story 2. Зупинка запитів в разі отримання помилок 402 або 429
...
USE CASE 7 — Зупинка запитів після отримання 402
...
Назва
...
- ЦБД
- ЄДР
- Адміністратор/відповідальна команда
- Slack канал
...
- Інтеграція з ЄДР активна
- ЦБД направляє запит до ЄДР для отримання даних КБВ
- ЄДР повертає HTTP
402 - У вимогах уже передбачено фіксацію таких помилок у Slack.
...
- ЦБД направляє запит до ЄДР.
- ЄДР повертає відповідь
402 Payment Required. - ЦБД фіксує факт отримання помилки.
- ЦБД змінює внутрішній статус інтеграції з ЄДР на умовний:
suspended;- або
payment_required; - або
temporarily_disabled.
- ЦБД припиняє направлення нових запитів до ЄДР.
- ЦБД відправляє повідомлення в Slack канал.
- Для нових awards, які підпадають під умови інтеграції, запит до ЄДР не виконується.
- У відповідному полі/технічному статусі фіксується причина:
Запити до ЄДР тимчасово призупинено через необхідність оплати.
...
- Нові запити до ЄДР не направляються.
- Команда отримала повідомлення про необхідність внесення коштів.
- Дані КБВ для нових awards тимчасово не збагачуються.
Business flow
Майданчик, залучає користувача до участі в аукціоні де звіт з інформацією про КБВ
- Учасник є юридичною особою
- Учасник подає заявку на участь
- Майданчик активує заявку на участь
- Заявка на участь перейшла в кваліфікацію
- Під час створення award ЦБД направляє асинхроний запит в ЄДР зі статичним API Token і даними для пошуку де виконуються умови:
- Для award в статусах: pending_waiting, pending_admission, pending
- Для award.buyers.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 даними КБВ з ЄДР
Модель даних beneficiaries
Поле в award
beneficiaries: [beneficiariesGeneralInfo ]
Правила
- тип: list of objects
- може містити: кілька КБВ або визначення причини відсутності даних (excluded, isMissing,reason) або status має значення error .
| Expand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ключові правила
- Інтеграція тригериться тільки при створенні award в модель даних beneficiariesGeneralInfo
- Запит асинхронний
- Дані записуються тільки якщо валідні
- Запис — атомарний (все або нічого):
- або записуються всі КБВ (якщо хоча б один КБД не валідний - не записується жоден)
- або записується один fallback - обʼєкт
- Основний сценарій:
- Створюється award
- Перевіряються умови
- Виконується аутентифікація в ЄДР
- Виконується запит до ЄДР
- Отримується відповідь
- Відбувається валідація
- Якщо валідно:
- запис у
award.beneficiaries[] - оновлення:
- award.dateModified
- procedure.dateModified
- systemDateModified
- запис у
- Retry (до 3 разів) тільки для: 500, 502
- retry з exponential backoff
- після 3 спроб → beneficiaries.status = error
- API_TOKEN зберігається:
- у захищеному конфігураційному середовищі
- не логуються
- не передається у відкритому вигляді - Порожній результат (200 без даних) НЕ є помилкою API, але вимагає fallback
- Асинхронність має пріоритет над статусом award — відповідь завжди обробляється
- Timeout прирівнюється до технічної помилки (500/502)
Обмеження
- Система не повинна виконувати безкінечні повторні запити.
- Інтеграція не виконується без умов
- Частковий запис даних заборонений
- У межах POC система не виконує:
- Автоматичну ретро-обробку awards, створених під час зупинки інтеграції.
- Масовий ручний запуск має мати обмеження на кількість awards за одну операцію.
- Ручний запуск має бути доступний тільки користувачам з відповідними адміністративними правами.
- Ручний запуск має пріоритет над статусом інтеграції
- Ручний запуск НЕ залежить від моменту створення award
- Масовий запуск має виконуватись асинхронно
- Повторний запуск перезаписує beneficiaries
- Обмеження на масовий запуск (наприклад, ≤100 awards)
Статуси обробки даних
| Статус | Опис |
|---|---|
| processing | Триває обробка даних |
| complete | Дані внесено |
| error | Не вдалось отримати інформацію з сервісу |
Послідовність зміни статусів
- При створенні відправці даних для отримання даних з ЄДР про КБВ beneficiaries.status змінюється на processing
- При правильному отриманні відповіді 200 з даними beneficiaries.status змінюється з processing на complete
- При отриманні помилки beneficiaries.status змінюється з processing на error і в залежності від типу помилки відправляється повідомлення РО
Статуси інтеграції
| Статус | Опис |
|---|---|
active | Запити до ЄДР виконуються |
payment_required | Отримано 402, запити зупинено |
rate_limit_exceeded | Отримано 429, запити зупинено |
suspended | Інтеграцію вручну зупинено адміністратором |
| auth_error | Проблема з токеном |
| access_denied | 403 |
| invalid_request | 400/406 |
Статус suspended_manual має пріоритет над автоматичними статусами.
Обробка помилок
Класифікація помилок
| Тип | Коди |
|---|---|
| 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.status з processing на error
Slack повідомлення
Відправляються для:
- 400
- 402
- 403
- 406
- 429
- auth_error
Зупинка інтеграції
Тригер
Інтеграція зупиняється при:
- першому
402 - першому
429
Поведінка
- всі нові запити НЕ виконуються
- статус інтеграції змінюється
Відновлення інтеграції
Після 402
внесення коштів
ручне відновлення
статус → active
Після 429
відновлення ліміту
- ручне відновлення
- статус → active
Поведінка після відновлення інтеграції
- Після відновлення інтеграції система обробляє тільки нові awards, створені після зміни статусу інтеграції на active.
- Awards, створені під час зупинки інтеграції, автоматично не обробляються повторно в межах POC.
- За потреби такі awards можуть бути оброблені через ручний запуск з адмінки.
| Info | ||
|---|---|---|
| ||
Старі awards НЕ обробляються повторно після відновлення інтеграції - для POC
|
Адміністративне керування інтеграцією - Покращення
Адміністратор має можливість:
- Вручну зупинити інтеграцію;
- Вручну відновити інтеграцію;
- Запустити інтеграцію для конкретного award;
- Запустити інтеграцію для переліку awards через множинний вибір.
Ручний запуск інтеграції по award виконує стандартну логіку запиту до ЄДР та обробки відповіді.
Ручний запуск не залежить від тригера створення award.
Для масового запуску обробка має виконуватись асинхронно через чергу.
Логування
Обовʼязково логувати:
- correlationId
- request/response
- error code
- retry count
Timeout
- timeout = 5-10 секунд
- retry = ексоненційна затримка
Сценарії роботи інтеграції з ЄДР
User Story 1. Автоматичне отримання КБВ
| Як | ЦБД Prozorro.Sale |
| я хочу | автоматично отримувати та зберігати інформацію про кінцевих бенефіціарних власників (КБВ) з ЄДР при створенні award |
| щоб | забезпечити актуальність, централізацію та зменшити залежність від ручного введення даних |
USE CASE 1 — Успішне отримання та збереження КБВ
Назва | Отримання та запис КБВ з ЄДР в award |
| Актори |
|
| Передумови |
|
| Основний сценарій | Дані невалідні → UC2 Помилка API → UC3/UC11-15
|
| Результат | award містить список валідних КБВ (може бути декілька) |
Acceptance Criteria
1 | Given | Всі умови виконані |
When | Створюється award | |
Then | Відправляється запит до ЄДР | |
2 | Given | ЄДР повернув валідні дані |
When | Дані проходять валідацію | |
Then | Дані про КБВ записуються в award.beneficiaries | |
3 | Given | Дані записані |
Then | оновлюються всі dateModified:
|
...
USE CASE 2 — Дані не можуть бути внесені
Назва | Відмова у записі КБВ |
| Актори |
|
| Передумови | Отримано відповідь ЄДР |
| Основний сценарій |
|
| Альтернативний сценарій | Всі КБВ валідні → UC1 |
| Результат | award без змін |
Acceptance Criteria
1 | Given | Дані не відповідають моделі |
When | Виконується валідація | |
Then | Дані не записуються |
...
USE CASE 3 — Retry при помилках 500 / 502
Назва | Повторна спроба отримання даних |
| Актори |
|
| Передумови | Отримано HTTP код: |
| Основний сценарій |
|
| Альтернативний сценарій | Всі retry невдалі → beneficiaries.status змінюється з processing на error |
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 500/502 |
When | Виконується retry | |
Then | Система повторює запит до 3 разів | |
2 | Given | Всі retry невдалі |
Then | beneficiaries.status змінюється з processing на error |
...
USE CASE 4 — Інтеграція не запускається
Назва | Неініціювання запиту до ЄДР |
| Актори | ЦБД (primary) |
| Передумови | Будь-яка з умов НЕ виконується:
|
| Основний сценарій |
|
| Результат | Жодних запитів до ЄДР |
Acceptance Criteria
1 | Given | Умови не виконані |
When | Створюється award | |
Then | запит до ЄДР не виконується |
...
USE CASE 5 — Обробка множинних КБВ
Назва | Запис кількох бенефіціарів |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Альтернативний сценарій | хоча б один невалідний КБВ → UC2 |
| Результат | Збережено всі КБВ |
Acceptance Criteria
1 | Given | ЄДР повертає кілька КБВ |
When | Відбувається запис | |
Then | Всі КБВ зберігаються в масиві |
User Story 2. Зупинка запитів в разі отримання помилок 402 або 429
| Як | ЦБД Prozorro.Sale |
| я хочу | зупиняти направлення запитів до ЄДР після першого отримання помилки 402 або 429 |
| щоб | не створювати зайве навантаження на сервіс, не витрачати ліміти та уникати повторних неуспішних запитів до моменту відновлення доступу/поповнення коштів. |
| додатково | Після внесення коштів або відновлення ліміту система має відновити направлення запитів до ЄДР. |
USE CASE 6 — Зупинка запитів після отримання 402
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 402 Payment Required |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | ЦБД отримала від ЄДР відповідь 402 |
When | Система обробляє відповідь | |
Then | Інтеграція з ЄДР переходить у статус призупинення. | |
2 | Given | Інтеграція має статус призупинення через |
When | Створюється новий award, який відповідає умовам інтеграції | |
Then | ЦБД не направляє запит до ЄДР. | |
3 | Given | Отримано 402 |
| When | Система фіксує помилку | |
Then | Повідомлення надсилається в Slack канал. |
...
USE CASE 7 — Зупинка запитів після отримання 429
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 429 Many Requests |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | ЦБД отримала відповідь 429 |
When | Система обробляє відповідь | |
Then | Направлення нових запитів до ЄДР зупиняється. | |
2 | Given | Інтеграція призупинена через |
When | Створюється новий award | |
Then | ЦБД не направляє запит до ЄДР | |
3 | Given | Отримано 429 |
| When | Система обробляє помилку | |
Then | Повідомлення надсилається в Slack канал. |
...
USE CASE 8 — Відновлення запитів після внесення коштів
Назва | Ручне або автоматичне відновлення інтеграції з ЄДР після внесення коштів |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 402 |
| And | Кошти внесено | |
When | Адміністратор активує інтеграцію | |
Then | Статус інтеграції змінюється на active. | |
2 | Given | Інтеграція активна після відновлення |
When | Створюється новий award | |
Then | ЦБД направляє запит до ЄДР | |
3 | Given | ЄДР після відновлення повертає 200 |
| When | ЦБД отримує валідні дані | |
Then | Дані записуються в |
...
USE CASE 9 — Відновлення після вичерпання ліміту запитів
Назва | Відновлення інтеграції після помилки 429 |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 429 |
When | Ліміт запитів відновлено | |
And | Адміністратор активує інтеграцію | |
Then | ЦБД знову направляє запити до ЄДР | |
2 | Given | Інтеграція активована після |
When | Створюється award | |
Then | Запит до ЄДР виконується |
User Story 3. Обробка помилок інтеграції з ЄДР та забезпечення стабільності системи
| Як | ЦБД Prozorro.Sale |
| я хочу | коректно обробляти всі типи помилок від ЄДР (400, 401, 403, 404, 406, 500, 502) |
| щоб | забезпечити стабільну роботу системи, не втрачати дані та мати можливість відновлення інтеграції |
USE CASE 10 — Обробка 401 Unauthorized при невалідному API Token
Назва | Автоматичне оновлення токена при помилці 401 |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
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 11 — Помилка 400 (Bad Request)
Назва | Обробка некоректного запиту до ЄДР |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Рішення | Виправлення формату запиту (dev fix) |
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 400 |
When | Обробляється помилка | |
Then | Retry не виконується | |
And | Slack отримує повідомлення |
...
USE CASE 12 — Помилка 403 (Forbidden)
Назва | Обробка відсутності прав доступу |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Рішення |
|
| Результат | Інтеграція не працює до виправлення |
Acceptance Criteria
1 | Given | Отримано 403 |
Then | Retry не виконується | |
And | Slack отримує повідомлення |
...
USE CASE 13 — Помилка 404 (Not Found)
Назва | Обробка відсутності суб’єкта в ЄДР |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 404 |
Then | Retry не виконується | |
And | Змінює beneficiaries status з processing на error |
...
USE CASE 14 — Помилка 406 (Not Acceptable)
Назва | Обробка помилки формату даних |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Рішення |
|
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 406 |
Then | Retry не виконується | |
And | Slack отримує повідомлення |
User Story 4. Обробка випадків, коли дані не знайдені або недоступні
| Як | ЦБД Prozorro.Sale |
| я хочу | оректно обробляти випадки, коли ЄДР не повертає дані або повертає пустий результат |
| щоб | забезпечити прозору причину відсутності КБВ у системі |
USE CASE 15 — Порожній результат (200, але без даних)
Назва | Суб’єкт не знайдений за кодом ЄДРПОУ (порожній результат) |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
...
1
...
When
...
Then
...
2
...
Інтеграція має статус призупинення через 402
...
When
...
Then
...
3
...
Then
...
Повідомлення надсилається в Slack канал.
USE CASE 8 — Зупинка запитів після отримання 429
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 429 Many Requests |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | ЦБД отримала відповідь 429від ЄДР відповідь 200 |
And | Список результатів порожній | |
When | Система обробляє відповідь | |
Then Направлення нових запитів до ЄДР зупиняється. | КБВ не заповнюються | |
2 | Given | Інтеграція призупинена через |
When | Створюється новий award | |
Then | ЦБД не направляє запит до ЄДР | |
3 | Given | Отримано 429 |
| When | Система обробляє помилку | |
Then | Повідомлення надсилається в Slack канал. |
USE CASE 9 — Відновлення запитів після внесення коштів
Пустий результат | |
Then | Змінює в beneficiaries status з processing на error |
...
User Story 5. Узгодженість даних при зміні статусу award
| Як | ЦБД Prozorro.Sale |
| я хочу | завершувати обробку запиту до ЄДР навіть якщо статус award змінився |
| щоб | уникнути втрати даних через асинхронність |
USE CASE 16 — Award змінив статус під час запиту
Назва | Обробка відповіді ЄДР після зміни статусу award | ||
| Актори | |||
Назва | Ручне або автоматичне відновлення інтеграції з ЄДР після внесення коштів | ||
| Актори |
| ||
| Передумови |
| ||
| Основний сценарій |
| ||
| |||
| Основний сценарій |
| ||
| Результат |
| Результат |
|
Acceptance Criteria
1 | GivenІнтеграція призупинена через 402 | Запит до ЄДР відправлено | |
And | |||
| Award змінив статус | |||
When Адміністратор | активує інтеграціюОтримано відповідь | ||
Then | Статус інтеграції змінюється на active. | Given | Інтеграція активна після відновлення |
When | Створюється новий award | ||
Then | ЦБД направляє запит до ЄДР | ||
3 | Given | ЄДР після відновлення повертає 200 | |
| When | ЦБД отримує валідні дані | ||
Then | Дані записуються в |
USE CASE 10 — Відновлення після вичерпання ліміту запитів
| Відповідь обробляється | |
And | Дані записуються незалежно від поточного статусу award |
...
User Story 6. Обробка timeout
| Як | ЦБД Prozorro.Sale |
| я хочу | коректно обробляти timeout від ЄДР |
| щоб | забезпечити стабільність інтеграції |
USE CASE 17 — Timeout від ЄДР
Назва | Обробка перевищення часу очікування відповіді |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Альтернативний сценарій |
|
| Результат |
|
Назва | Відновлення інтеграції після помилки 429 |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | GivenІнтеграція | призупинена через 429Перевищено timeout |
When | Ліміт запитів відновлено | |
And | Адміністратор активує інтеграцію | |
Then | ЦБД знову направляє запити до ЄДР | Given | Інтеграція активована після |
When | Створюється award | |
Then | Запит до ЄДР виконується |
...
| Система обробляє запит | ||
Then | Виконується retry | |
2 | Given | Retry неуспішний |
Then | Записується fallback |
...
User Story 7. Відсутність автоматичної ретро-обробки
| Як | ЦБД Prozorro.Sale |
| я хочу | коректно обробляти всі типи помилок від ЄДР (400, 401, 403, 404, 406, 500, 502) |
| щоб | забезпечити стабільну роботу системи, не втрачати дані та мати можливість відновлення інтеграції |
USE CASE 11 — Обробка 401 (Unauthorized)
| Не обробляти старі awards після відновлення інтеграції | |
| щоб | Уникнути неочікуваного навантаження та складної логіки в межах POC |
USE CASE 18 — Відсутність ретро-обробки
Назва | Обробка перевищення часу очікування відповіді |
Назва
| Актори |
|
|
| Передумови |
- Запит до ЄДР виконано
- Отримано
401 Unauthorized
| |
| Основний сценарій |
|
| Альтернативний сценарій |
|
| Результат |
|
- ЦБД отримує
401 - Визначає, що токен невалідний / протермінований
- Виконує запит на оновлення
access_tokenчерезrefresh_token - Отримує новий токен
- Повторює запит до ЄДР (1 раз)
- Якщо успішно → стандартний сценарій (запис даних)
Refresh token невалідний → перейти до помилки критичного рівня
Acceptance Criteria
1 | GivenОтримано 401 | Інтеграція була зупинена |
And | Існують awards без КБВ | |
When Токен | протермінованийІнтеграція відновлена | |
Then Система виконує refresh token | Обробляються тільки нові awards | |
2 | GivenТокен оновлено | Існують старі awards |
Then | Запит повторюється 1 раз | |
3 | Given | повторний запит успішний |
Then | дані записуються в award |
USE CASE 12 — Помилка 400 (Bad Request)
| Вони НЕ обробляються автоматично |
...
User Story 8. Ручне керування інтеграцією
| Як | Адміністратор ЦБД Prozorro.Sale |
| я хочу | Мати можливість вручну керувати інтеграцією |
| щоб | Контролювати її роботу незалежно від автоматичних сценаріїв |
USE CASE 19 — Ручна зупинка інтеграції
Назва | Зупинка інтеграції через Адміністративну панель |
Назва
| Актори |
|
|
| Передумови |
- неправильний формат параметрів
- неправильний code
- ЦБД отримує
400 - Аналізує помилку
- Визначає:
- помилка у формуванні запиту
- НЕ виконує retry
- Логує помилку
- Надсилає повідомлення в Slack
Виправлення формату запиту (dev fix)
- запит не повторюється
- потрібне втручання розробника
Acceptance Criteria
1
...
When
...
Then
...
And
...
USE CASE 13 — Помилка 403 (Forbidden)
...
Назва
...
- ЦБД
- ЄДР
- Slack
...
- змінились права доступу до API
- акаунт не має доступу
...
- ЦБД отримує
403 - Фіксує помилку
- НЕ виконує retry
- Відправляє alert в Slack
- (опційно) переводить інтеграцію в статус
restricted
...
- перевірка прав доступу
- перевидача ключів / ролей
...
Інтеграція не працює до виправлення
Acceptance Criteria
1
...
Then
...
And
...
USE CASE 14 — Помилка 404 (Not Found)
...
Назва
...
- ЦБД
- ЄДР
- Slack
...
ЄДРПОУ не знайдено
...
- ЦБД отримує
404 - Визначає, що суб'єкт відсутній
- НЕ виконує retry
- Записує beneficiaries тільки поле reason:
- "Суб'єкт не знайдено в ЄДР"
...
- award без КБВ
| |
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція активна |
When | Адміністратор її зупиняє | |
Then | Статус = suspended | |
And | Запити до ЄДР не виконуються |
...
USE CASE 20 — Ручне відновлення інтеграції
Назва | Відновлення інтеграції через Адміністративну панель |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція зупинена |
When | Адміністратор її відновлює | |
Then | Статус = active |
...
User Story 9. Ручний запуск інтеграції для awards
| Як | Адміністратор ЦБД Prozorro.Sale |
| я хочу | Запускати інтеграцію для конкретних awards |
| щоб | Обробляти пропущені або проблемні записи |
USE CASE 21 — Ручний запуск для одного award
Назва | Зупинка інтеграції через Адміністративну панель |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Альтернативний сценарій | Інтеграція глобально зупинена → ручний запуск дозволений |
| Результат | beneficiaries оновлено |
Acceptance Criteria
1 | Given | Обрано award |
When | Адміністратор запускає інтеграцію | |
Then | Виконується запит до ЄДР | |
And | beneficiaries перезаписуються |
...
USE CASE 22 — Масовий запуск інтеграції
Назва | Зупинка інтеграції через Адміністративну панель |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Альтернативний сценарій | перевищено ліміт → операція блокується |
| Результат | всі awards оброблені асинхронно |
Acceptance Criteria
1 | Given | Обрано список awards |
When | Запускається обробка | |
Then | Кожен award обробляється незалежно | |
2 | Given | Масовий запуск |
| Then | Обробка виконується через чергу |
Acceptance Criteria
1
...
Then
...
And
...
Записує beneficiaries тільки поле reason:
- "Суб'єкт не знайдено в ЄДР"
USE CASE 15 — Помилка 406 (Not Acceptable)
...
Назва
...
- ЦБД
- ЄДР
- Slack
...
Некоректний формат request/response
...
- ЦБД отримує
406 - Фіксує помилку
- НЕ виконує retry
- Відправляє alert в Slack
...
- перевірка контракту API
- виправлення формату
...
- інтеграція потребує доопрацювання
Acceptance Criteria
| Given | Отримано 406 |
Then | Retry не виконується | And | Slack отримує повідомлення
...