Перейти до вмісту

Технічне завдання: отримання банківських виписок з Приват24 для Python

Матеріал з K2 ERP Wiki

except Exception as exc:

19.4. Автоматична синхронізація

19.3. Отримання виписки

db/

! |- | exported_to_erp_at | timestamp | Дата передачі в ERP. |- | Попередній день | 1 раз на день | Контрольна синхронізація для операцій, які могли з'явитися із затримкою. |- | integration_id | uuid | ID інтеграції. Тип

imported += 1
v
)
retry_count: int = 3

17.2. Конфігурація синхронізації

платформа повинна забезпечити:

</syntaxhighlight>

платформа повинна логувати: {

pass

GET /api/v1/bank-accounts/{account_id}/transactions?date_from=2026-05-01&date_to=2026-05-07 ! Тип

27. Джерела

pass
"provider": "privat24_business",

8.1. конфігурація інтеграції

config.py

14.4. bank_sync_events

health.py
Операції отримують статус ExportedToERP. README.md
db=session_factory(),

}

 "integration_name": "Privat24 Main Company",
 client_id: str | None = None
 continue
{| class="wikitable"
 )
<pre>
{| class="wikitable"
! bank_integrations.py

 imported=imported,

Retry не застосовується для:

 account_id=account.id,
 mode: push
=== 10.4. Синхронізація виписки ===
 def get_transaction_details(
 "errors": 0
|-
| integration_name
| string
| Так
| Назва інтеграції. |-
| document_number
| varchar
| Номер документа. sha256(account_number + operation_date + amount + currency + document_number + payment_purpose)

* реалізувати background worker;
* реалізувати періодичне оновлення версій виписок;
* реалізувати контроль останньої успішної синхронізації;
* реалізувати повторну синхронізацію після помилки. |-
| amount
| numeric
| Сума операції. SEO-опис
|-
| transaction_id
| string
| Унікальний ID операції з банку або сформований hash. Отримання raw-виписки
5. | здатна використовуватись як альтернативний або додатковий сценарій. Збереження в БД
== 10. API Python-сервісу ==
{| class="wikitable"
 |
 | 5. {| class="wikitable"
|-
| Python
| 3.11 або вище. # Чи потрібен UI, чи тільки backend API? Очікуваний результат
Privat24 Integration Client
 sync_event_repository.create(
функції ERP застосовують, коли потрібно для автоматизації імпорту банківських операцій з Приват24 для бізнесу в ERP або бухгалтерську систему. Тип синхронізації
 export_to_erp:
 account.last_successful_sync_at = datetime.utcnow()
|-
| AC-13
| Увімкнено ERP export. |-
| currency
| varchar
| Валюта рахунку. Записати результат у журнал. Статус
</pre>
 migrations/
! |-
| operation_date
| date
| Дата операції. ! | Оновлюється last_successful_sync_at. |}

Мінімальний набір полів операції:

# Який саме канал застосовується для: Автоклієнт, Відкрита виписка або інший API ПриватБанку? SEO-опис

! |-
| Privat24ApiError
| API повернув помилку. |-
| Containers
| Docker. |-
| raw_payload
| jsonb
| Оригінальна відповідь банку. 

PRIVAT24_RETRY_BACKOFF_SECONDS=5
<pre>
== 17. конфігурація ==
2. Критерій

=== 8.3. Отримання виписки за період ===
</pre>
if transaction_repository.exists_by_unique_key(

Очікувана дія:

 account = bank_account_repository.get_by_id(db, account_id)

</pre>
 api_key: str
== 13. Автоматична синхронізація ==
!<div style="border-left: 6px solid #2e7d32; background: #e8f5e9; padding: 12px 16px; margin: 16px 0;">

== 5. Терміни та скорочення ==

[[Категорія:K2 ERP]]

1. 
 logging.py
я хочу бачити журнал помилок інтеграції з Приват24, 
GET /api/v1/bank-integrations/{integration_id}/sync-events
|-
| AC-10
| Worker запущено. ! |-
| payment_purpose
| text
| Призначення платежу. | платформа зберігає нові операції в bank_transactions. | платформа не створює дублікати. 
bank_statement_sync:

 client.py

{| class="wikitable"
! |-
| ExportedToERP
| Операцію передано в ERP. |}

PRIVAT24_API_KEY=********

 models.py

<pre>
 "date_from": "2026-05-01",
 |
 | 1. |-
| Перевірка підключення
| Результат, дата, технічний статус. |-
| Зміна API
| Формат відповіді або endpoint-и можуть змінюватися. |-
| currency
| varchar
| Валюта. | Щодня повторно синхронізувати попередній день. app/

* додати Dockerfile;
* додати docker-compose;
* додати structured logging;
* додати metrics;
* додати alerting;
* додати rate limiting;
* додати security review. |-
| document_number
| string
| Номер платіжного документа. # Який базовий URL API для конкретного клієнта? | Записати відповідь API, дозволити повтор. |-
| account_id
| uuid
| ID рахунку. Записати результат у журнал. |-
| account_id
| uuid
| ID рахунку. | Зберегти raw-відповідь і помилку. | Зупинити синхронізацію, повідомити адміністратора. Передача в ERP
Мінімальний набір параметрів:
щоб не завантажувати виписки вручну з Приват24. |}

 exceptions.py

[[Категорія:Банківські виписки]]

* timeout;
* тимчасової недоступності API;
* HTTP 429;
* HTTP 500;
* HTTP 502;
* HTTP 503;
* HTTP 504;
* тимчасових мережевих помилок. | платформа показує AuthError і не запускає синхронізацію. Поле
 pass
<pre>

</pre>

</pre>

 raise IntegrationDisabledError("Privat24 integration is disabled")

=== 15.2. Retry-логіка ===
== 22. Ризики ==
 integrations/
 transaction_id: str,
|-
| Поточний день
| кожні 1530 хвилин
| Отримання нових операцій за поточний день. |-
| Автоклієнт
| Інтеграційний сервіс Приват24 для бізнесу для роботи з виписками та платежами. # Комбінація: рахунок + дата + сума + номер документа + призначення платежу. SEO-опис
 duplicates = 0
Очікувана відповідь:

<syntaxhighlight lang="json">

Приклад тіла запиту:
POST /api/v1/bank-integrations
 db=db,

! |-
| Account Sync Service
| Отримує та оновлює список рахунків. |-
| duplicate_count
| integer
| Кількість дублів.
v

Технічний стек: Python 3.11+, FastAPI, PostgreSQL, SQLAlchemy, Alembic, httpx, Pydantic, Celery/RQ/APScheduler, Docker. |-

Синхронізація рахунків - SyncFailed Синхронізацію завершено з помилкою. Призначення
  • реалізувати авторизацію;
  • реалізувати get_accounts;
  • реалізувати get_statement;
  • реалізувати обробку помилок;
  • реалізувати retry;
  • написати mock-тести. |-
direction varchar Реалізувати кілька рівнів дедублікації. SEO-опис
transaction_repository.create(db, operation)
self,
retry_backoff_seconds: int = 5
integration/

19. Acceptance Criteria

Validation & Deduplication Layer 5. |-

company_id varchar - provider varchar - bank_transaction_id varchar - Ignored - Web framework FastAPI. SEO-опис
services/
account=account,

{

timeout_seconds: int = 30
integration_id=integration.id,

PRIVAT24_API_KEY=******** До області задачі входить:

integration = bank_integration_repository.get_by_id(
- AC-15 ERP повертає помилку. До MVP не входить:
provider: privat24_business
)
repositories/

{

errors=0,
duplicates=duplicates,

Логічний endpoint Python-сервісу:

"integration_id": "f4d2758e-9a97-4e64-80fb-443b9b864b01",
def check_connection(self) -> "Privat24ConnectionResponse":

До MVP входить: } Як користувач системи ERP, я хочу бачити отримані банківські операції в ERP,

10.5. Отримання списку операцій

}
 "message": "Integration created"
 erp_export_service.py
6. Нормалізація операцій
 deduplication:
! bank_account_repository.py
== 26. Definition of Done ==
{| class="wikitable"
|-
| AC-4
| Запущено sync-accounts. |-
| DB
| PostgreSQL. Поле
! |-
| SyncSuccess
| Синхронізацію завершено успішно. |-
| Background Worker
| Виконує регулярну синхронізацію за розкладом. FILE_STORAGE_PATH=/data/bank-statements
</pre>
== 4. Передумови ==
|-
| id
| uuid
| ID події. |-
| account_id
| uuid
| Внутрішній ID рахунку. Коментар
Фінальні endpoint-и, формат авторизації та доступні поля виписки потрібно підтвердити в API-налаштуваннях конкретного клієнта ПриватБанку. Нормалізувати операції. |}

 if account.last_successful_sync_at else date_to

платформа повинна мати background worker для автоматичного отримання нових операцій. |-
| Дедублікація
| Кількість пропущених операцій. |-
| Polling
| Періодичне опитування API для отримання нових операцій. |}

=== 8.7. Передача операцій в ERP ===

 "company_id": "company-001",

 unit/
 api/
{| class="wikitable"
<syntaxhighlight lang="python">
|-
| AC-1
| Адміністратор створює інтеграцію з Приват24. |-
| ExportFailed
| Помилка передачі в ERP. | платформа повертає успішний або помилковий результат. |-
| account_number
| string
| IBAN або номер рахунку. API виписок
Як бухгалтер, 
9. |-
| ErpExportError
| Помилка передачі в ERP. |-
| Дублювання операцій
| Повторна синхронізація здатна створити дублікати. SEO-опис

! Ризик

# Виконати запит до API Приват24. response = privat24_client.get_statement(

 date_to=date_to,

 schemas.py
 raw_statement_storage.py
 date_to: date,
! # Отримати список доступних рахунків. ! |-
| status
| varchar
| Статус операції. |-
| Secrets
| Vault, Doppler, AWS Secrets Manager або аналог. # Як часто потрібно оновлювати виписки? # Зберегти raw-відповідь. SEO-опис
Python Bank Statement Service
{
self,
- error_count integer - Posted - Deduplication Service - base_url string Так - ORM Отримати credentials і технічні конфігурація в кабінеті клієнта. Критерій

я хочу, щоб платформа автоматизовано отримувала нові банківські операції,

exceptions.py
base_url: str

20. MVP

"force": false
) -> "Privat24TransactionResponse":
"duplicates": duplicates,
"status": "Active",

25. Технічні вимоги до Python

4. # Записати результат у журнал. |-

AC-3 API key неправильний. SEO-опис Privat24 Integration Client — це Python-клас або пакет, який інкапсулює роботу з API Приват24 / Автоклієнта. Приклад hash-ключа:
"date_from": str(date_from),
Неповна API-документація - AC-14 ERP повертає успіх.

Етап 5. Синхронізація виписок

платформа повинна мати можливість отримати або зберегти перелік рахунків, за якими імпортується виписка. |-

AC-7 платформа отримує та зберігає рахунки. |- Statement Sync Service Операції отримують статус ExportFailed. # Нормалізувати рахунки. # Зберегти або оновити рахунки в локальній БД.=== 10.2. Перевірка підключення ===
"force": false
if not integration.is_active: "imported": 42,

13.1. Рекомендований режим

PRIVAT24_RETRY_COUNT=3

},

Логічний endpoint Python-сервісу:

- api_key_encrypted text - updated_at timestamp - account_name varchar Назва рахунку. Знайти всі активні інтеграції. Поле
{| class="wikitable"

{| class="wikitable"

! # Чи потрібно реалізувати ручний експорт CSV / JSON? |-
| AC-2
| Адміністратор перевіряє підключення. Критерій

* створити FastAPI-проєкт;
* налаштувати PostgreSQL;
* створити моделі bank_integrations, bank_accounts, bank_transactions, bank_sync_events;
* реалізувати конфігурацію через environment variables;
* реалізувати healthcheck endpoint. |-
| Python-сервіс
| Інтеграційний шар між Приват24 та ERP. |-
| sync_interval_minutes
| integer
| Так
| Інтервал автоматичної синхронізації. # Чи потрібна технічна підтримка валютних рахунків? Тип

{

# Перевірити доступ до рахунку. |-
| privat24_client_id
| string
| Ні
| Ідентифікатор клієнта, якщо застосовується для. payload=response.raw_payload,

PRIVAT24_RETRY_BACKOFF_SECONDS=5

* зберігання API key тільки у змінних середовища або secret storage;
* шифрування API key у БД;
* заборону логування API key;
* маскування номерів рахунків у технічних логах за потреби;
* маскування персональних даних контрагентів у логах;
* контроль доступу до виписок;
* журналювання всіх операцій синхронізації;
* HTTPS для всіх API-запитів;
* перевірку SSL-сертифіката;
* обмеження доступу до адміністративних endpoint-ів;
* резервне копіювання виписок і журналів. |-
| Відкрита виписка
| Сервіс доступу до виписок за вибраними рахунками. |-
| AC-9
| API Приват24 повертає помилку. routes/

* реалізувати створення інтеграції;
* реалізувати зберігання credentials;
* реалізувати шифрування API key;
* реалізувати check-connection;
* реалізувати журнал налаштувань. |-
| balance_after
| decimal
| Залишок після операції, якщо доступний. Поле

{| class="wikitable"
! |-
| value_date
| date
| Дата валютування, якщо доступна. |-
| integration_id
| uuid
| ID інтеграції. |-
| Експорт в ERP
| Кількість переданих операцій, результат. "account_id": "a5f0e82b-efb6-4f3a-8e08-4abefbb58c45",

* https://privatbank.ua/business/intehratsiya
* https://privatbank.ua/business/openstatement
* https://api.privatbank.ua/
* https://privatbank.ua/business/app-pryvat24
* https://privatbank.ua/business/vse-servisy-ucheta-i-otchetnosti

! |-
| integration_name
| varchar
| Назва інтеграції. | Збільшити інтервал повтору. | У системі створюється запис bank_integrations. |-
| Background jobs
| Celery, RQ або APScheduler. Очікуваний результат
 |
 | 4.=== Етап 8. Production hardening ===

* реалізувати sync-accounts;
* зберігати рахунки;
* оновлювати існуючі рахунки;
* дозволити активувати / деактивувати рахунки. |-
| imported_count
| integer
| Кількість імпортованих операцій. Дія системи
 "is_active": true
=== Етап 6. Автоматична синхронізація ===
 main.py
=== Етап 2. конфігурація інтеграції ===
 account_number: str,

=== 15.1. Типи помилок ===

<pre>
 sync_current_day: true
 def get_accounts(self) -> list ["Privat24Account"]:
 date_from=date_from,
 db: "Session",
}
}
 account_id=account.id,
=== 8.6. Дедублікація ===

PRIVAT24_CLIENT_ID=********
3. Поле
== 12. Отримання виписки ==
POST /api/v1/bank-accounts/{account_id}/sync-statement

 "date_from": "2026-05-01",
=== Етап 1. Базова структура Python-сервісу ===
<pre>

 date_from = account.last_successful_sync_at.date() \

 "imported": imported,

PRIVAT24_TIMEOUT_SECONDS=30

 def get_statement(

* підключення до API Приват24 / Автоклієнта;
* отримання списку доступних рахунків;
* отримання банківських операцій за рахунками;
* отримання виписки за період;
* регулярну синхронізацію виписок;
* збереження операцій у локальній БД;
* дедублікацію банківських транзакцій;
* обробку помилок API;
* ведення журналу синхронізації;
* передачу виписок в ERP / бухгалтерську систему.=== 10.3. Синхронізація рахунків ===

== 15. Обробка помилок ==
 - amount
 ) -> "Privat24StatementResponse":
<syntaxhighlight lang="json">
<div style="border-left: 6px solid #1565c0; background: #e3f2fd; padding: 12px 16px; margin: 16px 0;">
<syntaxhighlight lang="json">
! |-
| Помилка експорту
| Текст помилки, ID операції, дата.<pre>

== 1. Мета ==
10. |}

=== 7.2. Автоматична синхронізація ===

PRIVAT24_CLIENT_ID=********
 workers/
 imported = 0
=== 10.6. Експорт операцій в ERP ===
|-
| id
| uuid
| Внутрішній ID операції. Запитати виписку з останньої дати до поточної дати. |-
| raw_payload
| jsonb
| Raw-відповідь банку. 
PostgreSQL / File Storage

== 8. Функціональні вимоги ==
 duplicates += 1
 privat24/
POST /api/v1/bank-integrations/{integration_id}/sync-accounts
 "date_from": "2026-05-01",
Режими передачі:

 db=db,
<pre>

Як бухгалтер, 

! # Які поля операції обов'язкові для ERP? |-
| Затримка операцій
| Деякі операції можуть з'являтися у виписці із затримкою. ! |-
| Pull
| ERP самостійно забирає операції через API Python-сервісу. |-
| company_id
| varchar
| ID компанії в ERP. |-
| sync_interval_minutes
| integer
| Інтервал синхронізації. |-
| Персональні інформаційні дані
| Виписки містять фінансові та персональні інформаційні дані. Компонент
 sync_previous_day_daily: true
8. |-
| bank_mfo
| varchar
| МФО банку. Отримати рахунок з БД. SEO-опис
POST /api/v1/bank-integrations/{integration_id}/sync-accounts
</pre>
Рекомендований алгоритм:
Raw-операція Приват24 повинна бути перетворена у внутрішню модель. - currency

* доступ до Приват24 для бізнесу;
* доступ до потрібної компанії / ФОП;
* підключений сервіс «інтеграційні функції ERP / Автоклієнт»;
* API credentials для Автоклієнта;
* перелік рахунків, за якими потрібно отримувати виписки;
* валюту рахунків;
* правила доступу користувачів;
* базовий URL API;
* формат авторизації;
* формат відповіді API;
* правила обмеження запитів;
* тестовий доступ або тестовий рахунок, якщо доступний.=== 6.1. Загальна схема ===

платформа повинна не допускати дублювання операцій. |-
| Transaction Normalizer
| Перетворює raw-операції банку у внутрішній формат. |-
| Migrations
| Alembic. {| class="wikitable"
</div>
) -> "StatementSyncResult":
 - payment_purpose
== 9. Статуси інтеграції та операцій ==
 integration_id=account.integration_id,
{| class="wikitable"

6. | Вимкнути рахунок або повідомити адміністратора. |-
| Disabled
| інтеграційні функції ERP вимкнена. Компонент
event_type="STATEMENT_SYNC_FAILED",

} бізнесу забезпечується через Головна ідея: розробити Python-сервіс, який автоматизовано отримує банківські виписки з Приват24; так само реалізовано зберігає операції, виконує дедублікацію та передає інформаційні дані в ERP / бухгалтерську систему. verify_ssl: bool = True

from pydantic_settings import BaseSettings

date_from=date_from,

16. Безпека


 payload={
[[Категорія:Технічні завдання]]
 account_id: UUID,

! | платформа зберігає помилку в журналі. POST /api/v1/bank-accounts/{account_id}/sync-statement
 date_to=date_to,
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
[[Категорія:API]]

Як бухгалтер, 
Приклад тіла запиту:

платформа повинна дозволяти отримати виписку за конкретним рахунком та періодом. # Який алгоритм дедублікації вважати основним? | Додати check-connection і сповіщення адміністратора. |-
| created_at
| timestamp
| Дата події. |-
| counterparty_code
| varchar
| ЄДРПОУ / РНОКПП контрагента. |}

 "date_to": "2026-05-07",

11. |-
| date_from
| date
| Початок періоду. |-
| Успішна синхронізація
| Кількість імпортованих операцій і дублів. |-
| AC-11
| Синхронізація успішна. |-
| DuplicateTransactionError
| операційна дія вже існує. |-
| base_url
| varchar
| Базова адреса API. |-
| operation_date
| date
| Дата операції. |-
| HTTP client
| httpx. |-
| AuthError
| Помилка авторизації. |-
| unique_key
| varchar
| Унікальний ключ для дедублікації. |-
| StatementParseError
| Неможливо розібрати відповідь банку. | Додати backoff і контроль інтервалів. Як зменшити

<syntaxhighlight lang="yaml">

=== 14.3. bank_transactions ===

щоб виконувати звірку оплат і формувати проводки.=== 19.2. Отримання рахунків ===
<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
 raw_statement_repository.save(
! |-
| is_active
| boolean
| Так
| Ознака активності інтеграції. Виконати дедублікацію. SEO-опис
! |-
| Manual export
| користувач системи експортує виписку у CSV / JSON / XML. |}

 date_to = date.today()

 date_from=date_from,

* REST API для створення інтеграції;
* збереження API credentials;
* перевірка підключення;
* отримання списку рахунків;
* отримання виписки за період;
* збереження raw-відповіді;
* нормалізація операцій;
* дедублікація;
* збереження операцій у PostgreSQL;
* ручний запуск синхронізації;
* журнал подій;
* базова обробка помилок. |-
| Logging
| structlog або стандартний logging у JSON-форматі. |-
| ERP
| платформа, у яку передаються банківські операції. |}

Пріоритетні ключі дедублікації:

 operation = transaction_normalizer.normalize(

* Python-сервіс розгортається через Docker;
* API створення інтеграції функціонує;
* API key зберігається безпечно;
* check-connection функціонує;
* список рахунків отримується або зберігається вручну;
* виписка за період отримується;
* raw-відповідь зберігається;
* операції нормалізуються;
* дедублікація функціонує;
* операції зберігаються в БД;
* автоматична синхронізація функціонує;
* помилки API обробляються;
* retry-механізм функціонує;
* журнал подій заповнюється;
* написані unit-тести для ключових сервісів;
* написані інтеграційні тести для Privat24Client з mock API;
* документація для запуску додана в README;
* фінальні endpoint-и Приват24 винесені в конфігурацію. |-
| Privat24RateLimitError
| Перевищено ліміт запитів. Тип
PRIVAT24_RETRY_COUNT=3
def sync_all_active_accounts() -> None:
 docker-compose.yml
! |}

щоб оперативно знаходити та виправляти проблеми. |}

 strategy: bank_id_or_hash

=== 14.1. bank_integrations ===
PRIVAT24_COMPANY_ID=company-001
</syntaxhighlight>
|-
| Imported
| Операцію імпортовано з банку. | Маскувати логи, шифрувати secrets, обмежити доступ. |-
| is_active
| boolean
| Чи синхронізується рахунок. ! "base_url": "https://api.privatbank.ua/...",
from uuid import UUID
|-
| Python-сервіс
| Окремий backend-сервіс або компонент для отримання виписок з Приват24. | Реалізується в межах цього ТЗ. |-
| Помилки авторизації
| API key здатна бути неправильним або зміненим. payload={"error": str(exc)},
! |
 | 2. Інтервал

 "integration_id": "f4d2758e-9a97-4e64-80fb-443b9b864b01",
 statement_sync_service.py
<pre>


=== Етап 3. Privat24 Integration Client ===
 - operation_date
=== 10.7. Отримання журналу синхронізації ===
 "accounts_created": 2,
 pass
=== Етап 7. Передача в ERP ===
 - document_number
from datetime import date, timedelta
=== 19.1. конфігурація інтеграції ===
! |-
| imported_at
| timestamp
| Дата імпорту. deduplication_service.py

4. # Чи потрібно передавати операції в ERP автоматизовано? Обов'язковість
<pre>
class Privat24Settings(BaseSettings):

ERP / Accounting System

23. Відкриті питання


 )

 bank_accounts.py
<pre>
 - account_number

=== 7.1. Отримання виписки вручну ===

=== 7.3. Дедублікація операцій ===
PRIVAT24_COMPANY_ID=company-001
}

7.{{SEO
|title=Технічне завдання: Отримання банківських виписок з Приват24 для Python
|description=Технічне завдання на реалізацію Python-сервісу для автоматичного отримання банківських виписок з Приват24 для бізнесу через інтеграцію Автоклієнт / API ПриватБанку.
|keywords=Python, Приват24, Приват24 для бізнесу, ПриватБанк, банківська виписка, Автоклієнт, API, інтеграція, FastAPI, технічне завдання
}}
== 18. Логування та аудит ==
 date_from: date,
 bank_transaction_repository.py
! |-
| counterparty_account
| varchar
| Рахунок контрагента. |-
| is_active
| boolean
| Ознака активності. |-
| counterparty_name
| string
| Назва контрагента. STATEMENT_SYNC_INTERVAL_SECONDS=1800
 "sync_interval_minutes": 30,
def sync_statement(
<pre>

! Режим
POST /api/v1/bank-integrations/{integration_id}/check-connection

! # Виконати дедублікацію. Тип
 ):

== 14. Модель даних ==

 "date_to": "2026-05-07",

 tests/
 "date_to": str(date_to),
=== Етап 4. Синхронізація рахунків ===
|-
| Створення інтеграції
| ID, користувач системи, дата, provider. |-
| balance_after
| numeric
| Залишок після операції. |-
| currency
| string
| Валюта операції. |-
| counterparty_code
| string
| ЄДРПОУ / РНОКПП контрагента, якщо доступно. |}

Для реалізації задачі необхідно отримати:

 hash_fields:

== Див. 28. так само ==
!== 2. Область сценарії використання ==

* неправильного API key;
* відсутності доступу до рахунку;
* некоректного періоду;
* помилок валідації налаштувань;
* операцій, які вже імпортовані. |-
| counterparty_account
| string
| Рахунок контрагента. | Інкапсулювати API в окремому Privat24Client. | платформа автоматизовано синхронізує активні рахунки. |-
| created_at
| timestamp
| Дата створення. |-
| created_at
| timestamp
| Дата створення. bank_transactions.py

'''Заборонено:''' зберігати API key, client secret, токени або банківські credentials у коді, Git-репозиторії чи відкритих логах. SEO-опис

* створення платежів;
* підписання платіжних доручень;
* відправка платежів у банк;
* валютний контроль;
* бухгалтерське проведення операцій;
* автоматичне рознесення оплат по рахунках;
* UI для повного банківського клієнта;
* інтеграційні функції ERP з картками фізичних осіб, якщо задача стосується лише бізнес-рахунків. |-
| Rate limit
| API здатна обмежувати частоту запитів. |}

</syntaxhighlight>

event_type="STATEMENT_SYNC_SUCCESS",


19.5. Передача в ERP

щоб оперативно імпортувати банківські операції в ERP. Критерій { Приват24 для бізнесу / Автоклієнт

storage/

я хочу запустити отримання виписки за вибраним рахунком і періодом,

v
db,

17.1. Змінні середовища

Push - Tests - Помилка API - updated_at timestamp - AC-5 Рахунок уже існує. # Отримати raw-виписку. Термін
transaction_normalizer.py

}

API Layer Позначити як Duplicate або пропустити. ! |- api_key secret Так - Active інтеграційні функції ERP активна.</syntaxhighlight>
)
id uuid Внутрішній ID інтеграції. # Raw reference / bank reference, якщо доступний. Оновити дату останньої синхронізації. Поле

3. Компонент 1. |}

security.py
- Запит виписки }

</syntaxhighlight>

- Privat24 Client - company_id string Так - Syncing - payload jsonb Технічні інформаційні дані події. SEO-опис

платформа повинна дозволяти зберігати конфігурація підключення до Приват24. | платформа отримує виписку з Приват24. Критерій Очікувана відповідь:

sync_event_repository.py

8.4. Автоматична синхронізація

return StatementSyncResult(
Подія
enabled: true

9.2. Статуси банківських операцій

db=session_factory(),
v
}

6. технічна архітектура рішення для бізнесу

платформа повинна підтримувати передачу операцій в ERP. ! |}

account_id=account.id,

{

default_period_days: 3

8.5. Нормалізація операцій

11.2. Основні методи

privat24_statement_service/

Privat24AuthError class="wikitable" 3.
  • реалізувати export-to-erp;
  • реалізувати статуси експорту;
  • обробити помилки ERP;
  • додати повторний експорт. |-
last_successful_sync_at timestamp - Архівний період вручну У ньому підключається сервіс інтеграції. |- account_number varchar платформа оновлює його інформаційні дані, а не створює дубль. |- Validation }
for raw_operation in response.operations:

STATEMENT_SYNC_ENABLED=true

db,
- counterparty_name varchar як приклад K2 ERP або інша облікова платформа. |- ERP Export Service - AC-12 - payment_purpose text - Duplicate }
accounts = bank_account_repository.get_active_accounts()
Для бізнес-рахунків рекомендовано виконувати синхронізацію: Dockerfile

12.1. Логічний бізнес-процес

Очікувана відповідь: for account in accounts:

я хочу, щоб повторна синхронізація не створювала дублікати операцій,

- Приват24 для бізнесу - Matched - Audit Logger Фіксує всі запити, відповіді, помилки та результати синхронізації. account_sync_service.py

До першої версії не входить:

Очікувана дія:

  • створення Python API для керування інтеграцією;
  • створення клієнта інтеграції з Приват24 / Автоклієнтом;
  • отримання виписок за рахунками;
  • отримання виписок за період;
  • збереження raw-відповідей банку;
  • нормалізація операцій;
  • дедублікація операцій;
  • фонове оновлення версій виписок;
  • журнал синхронізації;
  • retry-механізм;
  • експорт даних у ERP. # Виконати запит до API Приват24. |-
direction string - event_type varchar Тип події. from datetime import date
  • створення платежів;
  • підписання платежів;
  • webhook-інтеграція;
  • складний UI;
  • автоматичне рознесення оплат;
  • технічна підтримка всіх банків;
  • валютний контроль;
  • прогнозування платежів. |-
AC-8 - Виписка Зберегти операцію та дозволити повторний експорт. Рекомендація - ERP / бухгалтерська платформа Система-отримувач банківських операцій.=== 11.1. Призначення ===
AC-6 }

DATABASE_URL=postgresql+psycopg://user:password@db:5432/bank_statements

)

9.1. Статуси синхронізації

v

</syntaxhighlight>

NotConfigured - status varchar None = None
account_number=account.account_number,

class Privat24Client:

ERP_EXPORT_ENABLED=true

8.2. Отримання списку рахунків

PRIVAT24_TIMEOUT_SECONDS=30

date_to=date_to,
# Чи потрібна технічна підтримка ФОП, юридичних осіб або обох варіантів? Для кожної інтеграції знайти активні рахунки. # Нормалізувати операції. Очікуваний результат
Приват24 для бізнесу - last_successful_sync_at timestamp базовий рекомендований сценарій для бізнес-рахунків. Оновити last_successful_sync_at. # Які рахунки потрібно синхронізувати? |- Дедублікація - value_date date - last_check_at timestamp }

Задача вважається завершеною, якщо:

Як адміністратор,

PRIVAT24_BASE_URL=https://api.privatbank.ua/...

  1. Унікальний ID операції від банку. SEO-опис

Очікувана відповідь:

)

APP_ENV=production 2. Для кожного рахунку визначити дату останньої успішної синхронізації. |-

Privat24TimeoutError Перевищено час очікування. Тип помилки

6.2. Основні компоненти Python-сервісу

sync_event_repository.create(
SEO-опис
db.commit()
core/
Сервіс повинен забезпечити:
<syntaxhighlight lang="python">
Приклад змінних середовища:
 "message": "Connection successful"
<pre>
! |-
| інтеграційні функції ERP / Автоклієнт
| API-канал для автоматизації отримання виписки та надсилання платежів. |-
| client_id
| varchar
| ID клієнта, якщо застосовується для. | Виконати retry. |-
| default_date_from
| date
| Ні
| Дата початку первинного імпорту. | Помилка записується в bank_sync_events. "date_to": "2026-05-07",

 date_to: date,

{| class="wikitable"

 date_from: date,
 account.integration_id,
7. session.py
 "accounts_updated": 1
=== 14.2. bank_accounts ===
! | Нові операції передаються в ERP. Перевірити, що інтеграційні функції ERP активна. Очікуваний результат
щоб бухгалтерський обліковий облік залишався коректним. {| class="wikitable"
 "duplicates": 3,

PRIVAT24_BASE_URL=https://api.privatbank.ua/...
POST /api/v1/bank-accounts/{account_id}/export-to-erp
=== 10.1. Створення інтеграції ===
 "id": "f4d2758e-9a97-4e64-80fb-443b9b864b01",

- Webhook Механізм отримання подій від зовнішньої системи, якщо підтримується. try:
"api_key": "SECRET_VALUE",

11.3. Конфігурація клієнта

"status": "Active",
account_id=account.id,

7.5. Передача в ERP

13.2. Приклад worker-а

bank_integration_repository.py
operation.unique_key,
sync_statements.py

7.4. Контроль помилок

Приклад тіла запиту:

- amount decimal - AccountAccessError Немає доступу до рахунку. Зберегти нові операції.== 3. Джерела інтеграції ==

Retry застосовується для:

Очікуваний результат

7. User Story

11. Privat24 Integration Client

Метою задачі виступає як створення Python-сервісу для автоматичного отримання банківських виписок з Приват24 для бізнесу. №

21. Етапи реалізації

id uuid - Транзакція Окрема банківська операційна дія у виписці. Статус
  • реалізувати sync-statement;
  • зберігати raw-відповіді;
  • нормалізувати операції;
  • реалізувати дедублікацію;
  • зберігати операції. |-
date_to date Кінець періоду. Тип
)
# Зберегти нові операції. Що зберігати


sync_statement(

</syntaxhighlight>

24. Приклад структури Python-проєкту

pyproject.toml

12.2. Приклад Python-логіки

raw_operation=raw_operation,
<syntaxhighlight lang="python">