Документація
Загальний опис
Метою розробки є інтеграція з ЄДР для автоматизації та централізації отримання даних про КБВ (кінцевого бенефеціарного власника) для учасників що є юридичними особами. Даний інформація може бути обовʼязковим/не обовʼязковим для певних процедур (наразі розробка інтеграції відбувається тільки для процедур де є документ з типом x_ultimateBeneficiaryInfo).
Для реалізації цієї інтеграції необхідно виконати дії:
- Додати до базової моделі award необовʼязкову до заповнення модель даних beneficiaryInfo (модель даних наведено нижче)
- Налаштувати інтеграцію з ЄДР де:
- В момент створення award в процедурі для статусів: pending_waiting, pending_admission pending та тим моделі award.bidders.identifier.UA-EDR
- Направляється асинхронний запит на сервіс ЄДР
- Отримується відповідь на запит
- Відповідь містить дані → Отримані дані вносяться в створену модель даних
- Відповідь не містить даних → Поля залишаються пустими
- При внесенні інформації змінюємо award.dateModified
- Майданчики відображають дану інформацію організатору в його кабінеті. Відображення в інших місцях не є обовʼязковою (портал, кабінети учасників)
- Відповідь може містити 1 і більше відповідей
- Модель даних beneficiaryInfo
dateTime name multilang % float
Бізнес логіка
- Майданчик, залучає користувача до участі в аукціоні де звіт з інформацією про КБВ (x_ultimateBeneficiaryInfo) визначений як тип документу
- Учасник є юридичною особою
- Учасник подає заявку на участь
- Майданчик активує заявку на участь
- Учасник кваліфікується в аукціоні
- Варіант 1.
- ЦБД направляє запит в ЄДР з авторизаційним ключем і даними для пошуку
- ЦБД отримує дані з ЄДР
- ЦБД вносить дані в award учасника
- Якщо в отриманій відповіді містяться дані, які можна внести в award → ЦБД додає їх
- Якщо в отриманій відповіді містяться дані, які можна внести в award → ЦБД додає їх
- Варіант 2.
- Організатор активує елемент "Отримати КБВ з ЄДР"
- Майданчик надсилає запит на ЦБД
- ЦБД надсилає запит в ЄДР з авторизаційним ключем і даними для пошуку
- ЦБД отримує відповідь
- ЦБД пересилає відповідь майданчику
- Майданчик заповнює поля і передає їх в ЦБД
- Майданчик обовʼязково відображає поля організатору в його кабінеті
- Майданчик може відображати дані на порталі та в кабінетах учасників
- ЦБД перевіряє чи є документ з типом в заявці якщо витяг ЄДР - x_tenderersRegisterExtract, якщо заява в довільній формі - x_ultimateBeneficiaryInfo - наразі цих типів документів немає в SUE/SUD
- Якщо в bid немає документа з визначеним типом:
- ЦБД надсилає івент до системи з технічним id користувача та кодом ЄДРПОУ користувача та owner
- Система фіксує івент і фіксує отримані дані
- Перевіряє чи документ з типом в
- Система надсилає запит до ЄДР з авторизаційним ключем і даними для пошуку
- ЄДР повертає відповідь на запит:
- в форматі переліку полів для формування звіту
- Система опрацьовую отриману інформацію
- Система формує звіт
- в форматі звіту
- помилка (перелік можливих зазначено нижче)
- в форматі переліку полів для формування звіту
- Система додає сформований звіт до документ сервісу з привʼязкою до технічного id учасника
- Варіанти наступних дій:
- 1.Варіант
- Система додає інформацію в transfer блок bid
- Майданчик отримує токен до документа і надає користувачу відповідно до технічного id bid виконувати дії над документом
- Учасник бачить звіт в своєму кабінеті
- 2.Варіант Система підвантажує дані в bid самостійно - не виглядає як релевантний кейс
- Майданчик забирає в разі потреби викачує документ
- 1.Варіант
- Якщо в bid наявний документ з визначеним типом:
- ЦБД не надсилає івент до системи
- Якщо в bid немає документа з визначеним типом:
Проблемні питання:
- Використання існуючого документ сервісу. Відповідно до загальної логіки роботи з документ сервісом і документів які завантажені в procedure/bid/award/contract зі сторони Адміністратора ми не зможемо завантажувати документи від учасника тощо, відповідно вони не зможуть з ним працювати якщо не скачають і заново не завантажать в біда а тоді буде дублювання інформації.
- Для процедур де цей документ є обовʼязковим, учасники не зможуть активувати біда без наявності цих документів, відповідно логіка повинна відпрацювати на етапі створення bid учасника в статусі draft.
- Питання юридичної можливості вносити зміни в bid якщо ми будемо вносити зміни в учасника а не через схему майданчик надсилає нам запит і у відповідь отримує звіт ?
- Питання відповідно до того що нам треба закрити можливість створювати декілька запитів від одного учасника
- Технічне рішення яке може закрити дану можливість
- Фіксація технічного id учасника та owner, яке використовувалось для надсилання запиту
- Аналіз кількості запитів та/або блокування наступних запитів на формування звітів (order = 1 )
- Технічне рішення яке може закрити дану можливість
- Питання який саме звіт/документ хочемо отримувати ? (Наразі є варіанти:
- Відомості (витяг) з Єдиного державного реєстру юридичних осіб, фізичних осіб-підприємців та громадських формувань з підписом технічного адміністратора - Підходить для ЮО та ФОП (але для ФОП немає сенсу якщо потрібна інформація про КБВ)
- Відомості (витяг) з Єдиного державного реєстру юридичних осіб, фізичних осіб-підприємців та громадських формувань без підписа технічного адміністратора- Підходить для ЮО та ФОП (але для ФОП немає сенсу якщо потрібна інформація про КБВ)
- Інформація про кінцевого бенефіціарного власника юридичної особи - документ сформований учасником на імʼя директора ЕТМ
- Структура власності майданчика - документ сформований учасником
Як працює сервіс ЄДР
Сервіс ЄДР реалізований як API для автоматичного отримання даних для формування звіту/документу звіту про КБВ учасника торгів. Взаємодія працює по протоколу HTTP з використанням авторизації через JWT. Загальна логіка процесу: спочатку через метод авторизації отримуємо access та refresh токени, а потім використовуємо їх для виклику ендпоінту отримання даних для формування звіту/документу звіту за кодом ЄДРПОУ. - Детальніше буде додано після отримання тестового ключа
Дія тестового ключа 6 місяців
Доступні ендпоінти
Авторизація (отримання токенів)
Оновлення access_token
Метод отримання унікального ідентифікатора
Метод: POST
Ендпоінт: https://targetServer/1.0/subjects?code=ХХХХХХХХ, де code - код ЄДРПОУ учасника
Приймає на вхід:
- Обовʼязковий query-параметр: code
Приклад запиту:
Приклади відповіді:
Якщо code знайдено, а також токен авторизації є валідним:
Якщо code не знайдено:
Якщо сплив термін дії токена авторизації:
Якщо сервіс наразі недоступний:
Метод отримання звіту
Метод: POST
Ендпоінт: https://targetServer/2.0/get-documents/ID, де ID - унікальний ідентифікатор
Приймає на вхід:
Обовʼязковий query-параметр: ID
Приклад запиту:
Приклади відповіді:
Якщо ID знайдено, а також токен авторизації є валідним:
Якщо ID не знайдено:
Якщо сплив термін дії токена авторизації:
Якщо сервіс наразі недоступний:
- Метод отримання даних для формування звіту
- Метод: 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. |