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

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

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні


SEO title: Технічне завдання: Передача документів для звітності в податкову через Приват24 для Python SEO description: Технічне завдання на реалізацію Python-сервісу для передачі документів податкової звітності через Приват24 для бізнесу. SEO keywords: Python, Приват24, Приват24 для бізнесу, ПриватБанк, податкова звітність, API, XML, КЕП, ДПС, електронна звітність, технічне завдання Alternative to:


Головна ідея: розробити Python-сервіс, який формує, перевіряє, передає та контролює документи податкової звітності через інтеграцію з Приват24 для бізнесу / сервісами ПриватБанку.

Важливо: публічна інформація підтверджує наявність електронної звітності в Приват24 для бізнесу та інтеграційних сервісів для бухгалтерських програм, але фінальні API endpoint-и для автоматичної передачі звітності потрібно отримати від ПриватБанку.

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

1. Мета

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

Сервіс повинен забезпечити:

  • прийом даних звітності з ERP / облікової системи;
  • формування або прийом готового XML-документа;
  • перевірку документа перед передачею;
  • передачу документа через інтеграційний канал Приват24 / ПриватБанку;
  • отримання зовнішнього ID документа;
  • синхронізацію статусів;
  • отримання квитанцій або результатів обробки;
  • збереження історії передачі;
  • обробку помилок;
  • повторну відправку;
  • журналювання всіх технічних і бізнес-подій.

2. Область застосування

Функціонал використовується для автоматизації передачі документів податкової звітності з ERP або облікової системи до Приват24 для бізнесу з подальшим поданням до податкової.

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

  • створення Python API для прийому документів;
  • створення клієнта інтеграції з Приват24 / ПриватБанком;
  • формування XML або прийом готового XML;
  • збереження документа;
  • перевірка обов'язкових реквізитів;
  • передача документа в Приват24;
  • отримання статусів;
  • отримання квитанцій;
  • журнал подій;
  • retry-механізм;
  • захист API-ключів;
  • інтеграція з ERP.

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

  • повна заміна інтерфейсу Приват24 для бізнесу;
  • власна реалізація КЕП, якщо підписання виконується на стороні Приват24;
  • інтеграція напряму з API ДПС;
  • автоматичне оновлення всіх XSD-схем;
  • повноцінний UI для бухгалтера;
  • автоматична бухгалтерська перевірка сум;
  • підтримка всіх типів податкової та статистичної звітності.

3. Джерела інтеграції

Компонент Призначення Коментар
Приват24 для бізнесу Електронна звітність, подання звітів, робота з податковими сервісами. Основний бізнес-канал для користувача.
Інтеграційний модуль Приват24 Обмін із бухгалтерськими програмами. Потрібна технічна специфікація від ПриватБанку.
Paperless / ЕДО ПриватБанку Обмін електронними документами. Може використовуватися для суміжних документів.
Python-сервіс Інтеграційний шар між ERP та Приват24. Реалізується в межах цього ТЗ.
ERP / облікова система Джерело даних для звітності. Наприклад K2 ERP або інша система.

4. Передумови

Для реалізації задачі необхідно отримати від ПриватБанку або адміністратора Приват24:

  • доступ до Приват24 для бізнесу;
  • дані клієнта / компанії / ФОП;
  • API key або інший механізм авторизації;
  • базовий URL API;
  • технічну документацію endpoint-ів;
  • перелік доступних типів звітності;
  • формат передачі файлів;
  • формат метаданих документа;
  • правила підписання документа;
  • правила отримання статусів;
  • правила отримання квитанцій;
  • тестове середовище, якщо доступне;
  • обмеження за розміром файлів;
  • правила повторної відправки;
  • технічний контакт з боку ПриватБанку.

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

Термін Опис
Python-сервіс Окремий backend-сервіс або модуль, який виконує інтеграцію з Приват24.
Приват24 для бізнесу Інтернет-банк ПриватБанку для ФОП та юридичних осіб.
ПриватБанк Банк, через сервіси якого виконується передача документів.
ДПС Державна податкова служба України.
XML Формат електронного документа звітності.
XSD Схема перевірки XML-документа.
КЕП Кваліфікований електронний підпис.
API Програмний інтерфейс інтеграції.
Webhook Механізм отримання подій від зовнішньої системи.
Polling Періодичне опитування зовнішнього API.
Квитанція Підтвердження прийняття, відхилення або обробки звіту.

6. Архітектура рішення

6.1. Загальна схема

ERP / Accounting System
        |
        | 1. Дані для звітності або готовий XML
        v
Python Tax Reporting Service
        |
        | 2. Валідація та збереження документа
        v
Privat24 Integration Adapter
        |
        | 3. Передача документа через API / інтеграційний канал
        v
Приват24 для бізнесу
        |
        | 4. Підписання / подання / обробка
        v
ДПС
        |
        | 5. Квитанції / статуси
        v
Приват24 для бізнесу
        |
        | 6. Синхронізація статусів
        v
Python Tax Reporting Service
        |
        | 7. Оновлення статусу в ERP
        v
ERP / Accounting System

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

Компонент Опис
API Layer REST API для прийому документів від ERP.
Document Builder Формує XML або приймає готовий файл.
Validation Layer Перевіряє реквізити, структуру та статус документа.
Privat24 Client Python-клієнт для роботи з API / інтеграційним каналом ПриватБанку.
Status Sync Worker Фоновий процес для оновлення статусів.
Receipt Loader Завантажує квитанції та результати обробки.
Storage Layer Зберігає документи, квитанції, статуси та логи.
Audit Logger Фіксує всі дії користувачів і системи.

7. User Story

7.1. Передача документа в Приват24

Як користувач ERP, я хочу передати документ звітності в Приват24 без ручного завантаження, щоб скоротити час підготовки та подання звітності.

7.2. Отримання статусу

Як бухгалтер, я хочу бачити статус документа в ERP, щоб розуміти, чи документ передано, очікує підпису, поданий у податкову, прийнятий або відхилений.

7.3. Отримання квитанцій

Як бухгалтер, я хочу отримати квитанції в ERP, щоб мати підтвердження результату подання звітності.

7.4. Повторна відправка

Як користувач, я хочу повторно відправити документ після технічної помилки, щоб не створювати документ заново.

7.5. Технічний аудит

Як адміністратор, я хочу бачити журнал API-запитів і відповідей, щоб швидко знаходити причину помилок інтеграції.

8. Функціональні вимоги

8.1. Створення документа

Python-сервіс повинен приймати документ від ERP.

Мінімальний набір вхідних даних:

Поле Тип Обов'язковість Опис
taxpayer_id string Так РНОКПП або ЄДРПОУ платника.
taxpayer_name string Так Назва компанії або ПІБ ФОП.
report_type string Так Тип звіту або документа.
period string Так Звітний період.
document_number string Так Номер документа.
document_date date Так Дата документа.
file_format string Так XML, PDF, ZIP або інший підтримуваний формат.
file_content_base64 string Так Вміст документа у Base64.
metadata object Ні Додаткові реквізити для Приват24.

8.2. Валідація документа

Перед передачею система повинна перевірити:

  • наявність обов'язкових полів;
  • коректність РНОКПП або ЄДРПОУ;
  • коректність звітного періоду;
  • наявність файлу;
  • допустимий формат файлу;
  • розмір файлу;
  • коректність імені файлу;
  • відповідність XML-структурі;
  • відповідність XSD, якщо схема доступна;
  • відсутність дубля документа;
  • наявність налаштувань інтеграції з Приват24.

8.3. Передача документа в Приват24

Python-сервіс повинен мати метод для передачі документа в Приват24.

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

POST /api/v1/tax-reports/{report_id}/send-to-privat24

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

  1. Отримати документ із локальної БД.
  2. Перевірити статус документа.
  3. Отримати файл зі сховища.
  4. Підготувати метадані.
  5. Викликати Privat24 Integration Adapter.
  6. Отримати зовнішній ID документа.
  7. Зберегти зовнішній ID у БД.
  8. Оновити статус документа.
  9. Записати подію в журнал.

8.4. Отримання статусів

Система повинна підтримувати два способи оновлення статусів:

Спосіб Опис Пріоритет
Polling Періодичне опитування API Приват24. Обов'язково для MVP.
Webhook Отримання подій від Приват24, якщо підтримується. Опційно.

8.5. Отримання квитанцій

Система повинна завантажувати та зберігати:

  • квитанцію про отримання;
  • квитанцію про прийняття;
  • квитанцію про відхилення;
  • підписаний документ;
  • PDF-візуалізацію;
  • технічний протокол обробки, якщо доступний;
  • raw-відповідь Приват24.

8.6. Повторна відправка

Повторна відправка дозволена тільки для документів у статусах:

  • ValidationError;
  • Failed;
  • Rejected;
  • DeliveryError;
  • NeedResend.

Повторна відправка не дозволена для статусів:

  • Accepted;
  • SentToTax;
  • WaitingForTaxReceipt;
  • SentToPrivat24;
  • WaitingForSignature.

9. Статуси документа

Внутрішній статус Опис
Draft Документ створено, але ще не готовий до передачі.
Generated Файл документа сформовано.
ValidationError Документ не пройшов перевірку.
ReadyToSend Документ готовий до передачі.
Sending Документ передається в Приват24.
SentToPrivat24 Документ успішно передано в Приват24.
WaitingForSignature Документ очікує підписання.
Signed Документ підписано.
SentToTax Документ передано до податкової.
WaitingForTaxReceipt Очікується квитанція або результат обробки.
Accepted Документ прийнято.
Rejected Документ відхилено.
DeliveryError Помилка доставки.
Failed Технічна помилка.
Cancelled Документ скасовано.

10. Мапінг статусів Приват24

Фінальний мапінг статусів потрібно побудувати після отримання офіційного довідника статусів ПриватБанку.

Попередній логічний мапінг:

Статус Приват24 Внутрішній статус Опис
uploaded SentToPrivat24 Документ завантажено в Приват24.
waiting_signature WaitingForSignature Очікується підпис.
signed Signed Документ підписано.
sent_to_tax SentToTax Документ передано до ДПС.
waiting_receipt WaitingForTaxReceipt Очікується квитанція.
accepted Accepted Документ прийнято.
rejected Rejected Документ відхилено.
error Failed Помилка обробки.

Уточнення: значення статусів є попередніми. Реальні коди статусів потрібно взяти з API-документації ПриватБанку.

11. API Python-сервісу

11.1. Створення документа

POST /api/v1/tax-reports

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

{
  "taxpayer_id": "1234567890",
  "taxpayer_name": "ФОП Іваненко Іван Іванович",
  "report_type": "single_tax_declaration",
  "period": "2026-Q1",
  "document_number": "DECL-2026-0001",
  "document_date": "2026-04-15",
  "file_format": "xml",
  "file_content_base64": "BASE64_XML_CONTENT",
  "metadata": {
    "source_system": "K2 ERP",
    "created_by": "user@example.com"
  }
}

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

{
  "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
  "status": "Generated",
  "message": "Document created"
}

11.2. Перевірка документа

POST /api/v1/tax-reports/{report_id}/validate

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

{
  "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
  "status": "ReadyToSend",
  "errors": []
}

11.3. Передача в Приват24

POST /api/v1/tax-reports/{report_id}/send-to-privat24

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

{
  "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
  "status": "SentToPrivat24",
  "privat24_document_id": "external-document-id",
  "message": "Document sent to Privat24"
}

11.4. Оновлення статусу

POST /api/v1/tax-reports/{report_id}/sync-status

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

{
  "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
  "old_status": "SentToPrivat24",
  "new_status": "WaitingForSignature",
  "privat24_status": "waiting_signature"
}

11.5. Отримання документа

GET /api/v1/tax-reports/{report_id}

11.6. Отримання журналу

GET /api/v1/tax-reports/{report_id}/events

11.7. Завантаження квитанцій

POST /api/v1/tax-reports/{report_id}/download-receipts

11.8. Повторна відправка

POST /api/v1/tax-reports/{report_id}/resend

12. Privat24 Integration Client

12.1. Призначення

Privat24 Integration Client — це Python-клас або пакет, який інкапсулює роботу з API / інтеграційним каналом Приват24 для бізнесу.

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

class Privat24Client:
    def upload_tax_report(self, document: "DocumentPayload") -> "Privat24DocumentResponse":
        pass

    def get_document(self, document_id: str) -> "Privat24DocumentResponse":
        pass

    def get_document_status(self, document_id: str) -> "Privat24StatusResponse":
        pass

    def download_original(self, document_id: str) -> bytes:
        pass

    def download_signed_document(self, document_id: str) -> bytes:
        pass

    def download_receipts(self, document_id: str) -> list[bytes]:
        pass

    def cancel_document(self, document_id: str, reason: str) -> "Privat24DocumentResponse":
        pass

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

from pydantic_settings import BaseSettings


class Privat24Settings(BaseSettings):
    base_url: str
    api_key: str
    merchant_id: str | None = None
    client_id: str | None = None
    timeout_seconds: int = 30
    retry_count: int = 3
    retry_backoff_seconds: int = 5
    verify_ssl: bool = True

Приклад змінних середовища:

PRIVAT24_BASE_URL=https://api.privatbank.ua/...
PRIVAT24_API_KEY=********
PRIVAT24_CLIENT_ID=********
PRIVAT24_TIMEOUT_SECONDS=30
PRIVAT24_RETRY_COUNT=3
PRIVAT24_RETRY_BACKOFF_SECONDS=5

Заборонено: зберігати API key, client secret, токени або паролі КЕП у коді, Git-репозиторії чи відкритих логах.

13. Передача документа в Приват24

13.1. Логічний процес

1. Отримати документ з БД.
2. Перевірити, що документ має статус ReadyToSend.
3. Отримати файл зі сховища.
4. Підготувати метадані.
5. Викликати Privat24Client.upload_tax_report().
6. Отримати ID документа в Приват24.
7. Зберегти ID у локальній БД.
8. Оновити статус на SentToPrivat24.
9. Записати подію в журнал.

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

from uuid import UUID
from datetime import datetime, timezone


def send_report_to_privat24(report_id: UUID, db: "Session") -> "TaxReport":
    report = tax_report_repository.get_by_id(db, report_id)

    if report.status != TaxReportStatus.READY_TO_SEND:
        raise InvalidStatusError(
            f"Report {report_id} cannot be sent from status {report.status}"
        )

    file_bytes = file_storage.read(report.file_path)

    payload = DocumentPayload(
        title=report.title,
        number=report.document_number,
        date=report.document_date,
        file_name=report.file_name,
        file_content=file_bytes,
        file_format=report.file_format,
        metadata={
            "taxpayer_id": report.taxpayer_id,
            "taxpayer_name": report.taxpayer_name,
            "report_type": report.report_type,
            "period": report.period,
            "source_system": report.source_system,
        },
    )

    response = privat24_client.upload_tax_report(payload)

    report.privat24_document_id = response.id
    report.status = TaxReportStatus.SENT_TO_PRIVAT24
    report.sent_at = datetime.now(timezone.utc)

    audit_logger.log(
        entity_id=report.id,
        event_type="SENT_TO_PRIVAT24",
        details={
            "privat24_document_id": response.id,
            "raw_status": response.status,
        },
    )

    db.commit()
    return report

14. Робота зі статусами

14.1. Фонове оновлення

Система повинна мати background worker, який періодично оновлює статуси документів.

Рекомендована періодичність:

Статус документа Інтервал перевірки
SentToPrivat24 кожні 5 хвилин
WaitingForSignature кожні 15 хвилин
SentToTax кожні 10 хвилин
WaitingForTaxReceipt кожні 10 хвилин
Accepted / Rejected не перевіряти

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

def sync_pending_reports() -> None:
    reports = tax_report_repository.get_reports_for_sync()

    for report in reports:
        try:
            privat24_status = privat24_client.get_document_status(
                report.privat24_document_id
            )

            new_status = status_mapper.map_privat24_status(privat24_status)

            if new_status != report.status:
                old_status = report.status

                tax_report_repository.update_status(
                    report_id=report.id,
                    new_status=new_status,
                    raw_status=privat24_status.raw_status,
                )

                audit_logger.log(
                    entity_id=report.id,
                    event_type="STATUS_CHANGED",
                    details={
                        "old_status": old_status,
                        "new_status": new_status,
                        "privat24_status": privat24_status.raw_status,
                    },
                )

        except Exception as exc:
            audit_logger.log(
                entity_id=report.id,
                event_type="STATUS_SYNC_FAILED",
                details={"error": str(exc)},
            )

15. Модель даних

15.1. tax_reports

Поле Тип Опис
id uuid Внутрішній ID документа.
taxpayer_id varchar РНОКПП або ЄДРПОУ.
taxpayer_name varchar Назва платника.
report_type varchar Тип звіту.
period varchar Звітний період.
document_number varchar Номер документа.
document_date date Дата документа.
title varchar Назва документа.
file_name varchar Назва файлу.
file_path varchar Шлях до файлу у сховищі.
file_format varchar XML, PDF, ZIP тощо.
status varchar Внутрішній статус.
privat24_document_id varchar ID документа у Приват24.
privat24_raw_status varchar Останній raw-статус Приват24.
last_sync_at timestamp Дата останньої синхронізації.
sent_at timestamp Дата передачі у Приват24.
accepted_at timestamp Дата прийняття.
rejected_at timestamp Дата відхилення.
error_message text Остання помилка.
source_system varchar ERP або інша система-джерело.
created_at timestamp Дата створення.
updated_at timestamp Дата оновлення.

15.2. tax_report_events

Поле Тип Опис
id uuid ID події.
report_id uuid ID документа.
event_type varchar Тип події.
old_status varchar Попередній статус.
new_status varchar Новий статус.
payload jsonb Технічні дані події.
created_by varchar Користувач або system.
created_at timestamp Дата події.

15.3. tax_report_files

Поле Тип Опис
id uuid ID файлу.
report_id uuid ID документа.
file_type varchar original, signed, pdf, receipt, error_protocol.
file_name varchar Назва файлу.
file_path varchar Шлях до файлу.
content_type varchar MIME-тип.
size_bytes integer Розмір файлу.
created_at timestamp Дата створення.

16. Обробка помилок

16.1. Типи помилок

Тип помилки Опис Дія системи
ValidationError Некоректні дані документа. Не відправляти документ, показати список помилок.
Privat24AuthError Помилка авторизації у Приват24. Зупинити відправку, повідомити адміністратора.
Privat24ApiError API повернув помилку. Записати відповідь API, дозволити повтор.
Privat24TimeoutError Перевищено час очікування. Виконати retry.
DuplicateDocumentError Документ вже був переданий. Заборонити повтор без підтвердження.
FileStorageError Неможливо прочитати або записати файл. Зафіксувати помилку, повідомити адміністратора.
StatusMappingError Невідомий статус від Приват24. Зберегти raw-статус, створити подію UnknownStatus.

16.2. Retry-логіка

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

  • timeout;
  • тимчасової недоступності API;
  • HTTP 429;
  • HTTP 500;
  • HTTP 502;
  • HTTP 503;
  • HTTP 504.

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

  • помилок валідації;
  • неправильного API key;
  • відсутності прав доступу;
  • відхилення документа податковою;
  • дублювання документа;
  • некоректного формату файлу.

17. Безпека

Система повинна забезпечити:

  • зберігання API key тільки у змінних середовища або secret storage;
  • заборону логування API key;
  • заборону зберігання паролів КЕП у відкритому вигляді;
  • маскування персональних даних у технічних логах;
  • контроль доступу до документів;
  • контроль доступу до квитанцій;
  • журналювання всіх операцій;
  • HTTPS для всіх API-запитів;
  • перевірку SSL-сертифіката;
  • обмеження доступу до адміністративних endpoint-ів;
  • резервне копіювання документів і квитанцій.

18. Налаштування

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

APP_ENV=production
DATABASE_URL=postgresql+psycopg://user:password@db:5432/reports
FILE_STORAGE_PATH=/data/tax-reports

PRIVAT24_BASE_URL=https://api.privatbank.ua/...
PRIVAT24_API_KEY=********
PRIVAT24_CLIENT_ID=********
PRIVAT24_TIMEOUT_SECONDS=30
PRIVAT24_RETRY_COUNT=3
PRIVAT24_RETRY_BACKOFF_SECONDS=5

STATUS_SYNC_ENABLED=true
STATUS_SYNC_INTERVAL_SECONDS=300
RECEIPT_DOWNLOAD_ENABLED=true

18.2. Конфігурація типів документів

document_types:
  single_tax_declaration:
    title: "Декларація платника єдиного податку"
    allowed_formats:
      - xml
      - pdf
    requires_signature: true
    requires_receipt: true

  tax_request:
    title: "Запит до податкової"
    allowed_formats:
      - xml
      - pdf
    requires_signature: true
    requires_receipt: true

  unified_report:
    title: "Об'єднана звітність"
    allowed_formats:
      - xml
      - zip
    requires_signature: true
    requires_receipt: true

19. Логування та аудит

Система повинна логувати:

Подія Що зберігати
Створення документа ID, користувач, дата, тип документа.
Валідація Результат, список помилок.
Передача у Приват24 Endpoint, час, статус відповіді, зовнішній ID.
Помилка API HTTP-код, тіло відповіді, correlation ID.
Оновлення статусу Старий статус, новий статус, raw-статус Приват24.
Завантаження квитанції Тип файлу, назва, дата.
Повторна відправка Причина, користувач, дата.
Скасування документа Причина, користувач, дата.

20. Acceptance Criteria

20.1. Створення документа

Критерій Очікуваний результат
AC-1 ERP передає дані документа у Python-сервіс. У системі створюється запис tax_reports.
AC-2 Передано файл документа. Файл зберігається у файловому сховищі.
AC-3 Передано некоректні дані. Система повертає список помилок валідації.

20.2. Передача у Приват24

Критерій Очікуваний результат
AC-4 Документ має статус ReadyToSend. Система дозволяє передачу у Приват24.
AC-5 API / інтеграційний канал Приват24 повертає успішну відповідь. У документі зберігається privat24_document_id.
AC-6 Приват24 повертає помилку. Система зберігає помилку та не втрачає документ.
AC-7 Документ вже був переданий. Система не створює дубль без окремого підтвердження.

20.3. Статуси

Критерій Очікуваний результат
AC-8 Worker запускає синхронізацію. Статуси документів оновлюються автоматично.
AC-9 Приват24 повертає новий статус. Внутрішній статус документа змінюється.
AC-10 Приват24 повертає невідомий статус. Raw-статус зберігається, створюється подія UnknownStatus.

20.4. Квитанції та файли

Критерій Очікуваний результат
AC-11 Документ прийнято. Система завантажує квитанцію або результат обробки.
AC-12 Документ відхилено. Система зберігає причину відхилення.
AC-13 Користувач відкриває картку документа. Він бачить всі пов'язані файли та статуси.

21. MVP

До MVP входить:

  • REST API для створення документа;
  • збереження документа;
  • базова валідація;
  • Privat24 Integration Client;
  • передача документа у Приват24;
  • збереження зовнішнього ID;
  • ручний запуск синхронізації статусу;
  • журнал подій;
  • базова обробка помилок.

До MVP не входить:

  • webhook-інтеграція;
  • інтеграція напряму з ДПС;
  • власний модуль КЕП;
  • складний UI;
  • автоматичне оновлення XSD;
  • підтримка всіх типів звітності;
  • автоматичне створення декларації з банківських виписок.

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

Етап 1. Базова структура Python-сервісу

  • створити FastAPI-проєкт;
  • налаштувати PostgreSQL;
  • створити моделі tax_reports, tax_report_events, tax_report_files;
  • реалізувати конфігурацію через environment variables;
  • реалізувати healthcheck endpoint.

Етап 2. Робота з документами

  • реалізувати створення документа;
  • реалізувати збереження файлу;
  • реалізувати валідацію;
  • реалізувати статуси;
  • реалізувати журнал подій.

Етап 3. Privat24 Integration Client

  • реалізувати авторизацію;
  • реалізувати upload_tax_report;
  • реалізувати get_document_status;
  • реалізувати download_document;
  • реалізувати download_receipts;
  • реалізувати обробку помилок;
  • реалізувати retry.

Етап 4. Передача документів

  • реалізувати endpoint send-to-privat24;
  • зберігати privat24_document_id;
  • оновлювати статуси;
  • логувати API-взаємодію.

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

  • реалізувати background worker;
  • реалізувати періодичне оновлення статусів;
  • реалізувати мапінг статусів;
  • реалізувати обробку невідомих статусів.

Етап 6. Квитанції та результати обробки

  • реалізувати завантаження квитанцій;
  • реалізувати збереження PDF/XML/receipt-файлів;
  • реалізувати прив'язку файлів до документа;
  • реалізувати перегляд історії.

Етап 7. Production hardening

  • додати Dockerfile;
  • додати docker-compose;
  • додати structured logging;
  • додати metrics;
  • додати alerting;
  • додати rate limiting;
  • додати security review.

23. Ризики

Ризик Опис Як зменшити
Немає відкритої API-документації для податкової звітності через Приват24 Публічні сторінки описують сервіс, але не повну API-специфікацію. Отримати офіційну технічну документацію від ПриватБанку.
Зміна API Endpoint-и або формати відповіді можуть змінюватися. Інкапсулювати API в окремому Privat24Client.
Невідомі статуси Приват24 може повертати статуси, яких немає в системі. Зберігати raw-статус та мати UnknownStatus.
Дублювання документів Повторна відправка може створити дубль. Перевіряти privat24_document_id перед відправкою.
Помилки авторизації API key може бути неправильним або простроченим. Додати healthcheck інтеграції та повідомлення адміністратору.
Недоступність сервісу Приват24 або мережа можуть бути тимчасово недоступні. Використовувати retry та чергу задач.
Персональні дані Документи можуть містити РНОКПП, ЄДРПОУ, фінансові дані. Маскувати логи та обмежити доступ.

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

  1. Чи надає ПриватБанк API саме для подання податкової звітності через Приват24 для бізнесу?
  2. Який механізм авторизації використовується: API key, OAuth, client certificate або інший варіант?
  3. Який базовий URL API?
  4. Які endpoint-и використовуються для завантаження документа?
  5. Які endpoint-и використовуються для отримання статусів?
  6. Які endpoint-и використовуються для отримання квитанцій?
  7. Який формат документа підтримується: XML, PDF, ZIP, JSON?
  8. Чи Python-сервіс має сам формувати XML, чи отримує готовий XML з ERP?
  9. Де виконується КЕП: у Python-сервісі, у Приват24 або користувачем у веб-інтерфейсі?
  10. Чи потрібна підтримка ФОП, юридичних осіб або обох варіантів?
  11. Які типи звітів підтримуються першими?
  12. Чи є тестове середовище?
  13. Чи підтримуються webhook-и?
  14. Який SLA по оновленню статусів?
  15. Де зберігати файли: локально, S3, MinIO, DMS?
  16. Хто має доступ до API key?
  17. Чи потрібно робити UI, чи тільки backend API?

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

tax_reporting_privat24_service/
  app/
    main.py
    config.py
    api/
      routes/
        tax_reports.py
        health.py
    core/
      security.py
      logging.py
      exceptions.py
    db/
      session.py
      models.py
      migrations/
    services/
      tax_report_service.py
      validation_service.py
      status_sync_service.py
      receipt_service.py
    integrations/
      privat24/
        client.py
        schemas.py
        status_mapper.py
        exceptions.py
    repositories/
      tax_report_repository.py
      event_repository.py
      file_repository.py
    workers/
      sync_statuses.py
      download_receipts.py
    storage/
      file_storage.py
  tests/
    unit/
    integration/
  Dockerfile
  docker-compose.yml
  pyproject.toml
  README.md

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

Компонент Рекомендація
Python 3.11 або вище.
Web framework FastAPI.
HTTP client httpx.
Validation Pydantic.
ORM SQLAlchemy.
DB PostgreSQL.
Migrations Alembic.
Background jobs Celery, RQ або APScheduler.
Tests pytest.
Containers Docker.
Logging structlog або стандартний logging у JSON-форматі.

27. Definition of Done

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

  • Python-сервіс розгортається через Docker;
  • API створення документа працює;
  • документ зберігається у БД та файловому сховищі;
  • документ проходить валідацію;
  • документ передається у Приват24;
  • зовнішній ID документа зберігається;
  • статус документа оновлюється;
  • помилки API обробляються;
  • retry-механізм працює;
  • журнал подій заповнюється;
  • написані unit-тести для ключових сервісів;
  • написані інтеграційні тести для Privat24Client з mock API;
  • документація для запуску додана в README;
  • фінальні endpoint-и ПриватБанку винесені в конфігурацію.

28. Джерела

29. Див. також