Операції отримують статус 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,
|-
| Поточний день
| кожні 15–30 хвилин
| Отримання нових операцій за поточний день. |-
| Автоклієнт
| Інтеграційний сервіс Приват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/...
- Унікальний 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">
|
|
|
|
|
|