| AC-9
|
-
|
taxpayer_name
|
varchar
|
Назва платника. Компонент
PTAH_CLIENT_SECRET=********
- створення Python API для прийому документів;
- створення клієнта інтеграції з API.ПТАХ;
- формування XML або прийом готового XML;
- збереження документа;
- перевірка обов'язкових реквізитів;
- передача документа в ПТАХ;
- запуск підписання / відправки через ПТАХ, якщо підтримується API;
- отримання статусів;
- отримання квитанцій або результатів обробки;
- журнал подій;
- retry-механізм;
- захист API-ключів і службових доступів;
- інтеграційні функції ERP з ERP. |-
|
sent_to_receiver_at
|
timestamp
|
Зафіксувати помилку, повідомити адміністратора. | платформа не створює дубль без окремого підтвердження. Отримати ID документа в ПТАХ. |-
|
ДПС
|
-
|
DeliveryError
|
-
|
КЕП
|
Кваліфікований електронний підпис. Валідація та збереження документа
Рекомендована періодичність:
7.6. Технічний аудит
|
|
-
|
Зміна API
|
-
|
API.ПТАХ
|
Інтеграційний API для роботи з документами. Синхронізація статусів
entity_id=report.id,
|
|
Зупинити відправку, повідомити адміністратора. |-
|
last_sync_at
|
timestamp
|
як приклад K2 ERP або інша платформа. allowed_formats:
unit/
21.4. Статуси
</syntaxhighlight>
1. }
app/
21.3. Підписання та відправка
"period": "2026-Q1",
def sign_and_send_report(report_id: UUID, db: "Session") -> "TaxReport":
Для реалізації задачі необхідно отримати:
def sync_pending_reports() -> None:
9. Підписання / відправка / обробка
2. |-
| Передача в ПТАХ
|
Endpoint, час, статус відповіді, зовнішній ID. SEO-опис
28. Definition of Done
"file_content_base64": "BASE64_XML_CONTENT",
я хочу повторно відправити документ після технічної помилки,
"old_status": "SentToPtah",
|
Компонент
"ptah_document_id": response.id,
=== 8.4. Підписання документа ===
== 10. Мапінг статусів ПТАХ ==
До MVP не входить:
</pre>
payload = DocumentPayload(
== 11. API Python-сервісу ==
! |-
| оновлення версій статусу
| Старий статус, новий статус, raw-статус ПТАХ. # Чи підтримуються webhook-и? | Статус документа змінюється на Signed. sync_statuses.py
PTAH_CLIENT_SECRET=********
== 4. Передумови ==
pass
! |-
| period
| string
| Так
| Звітний період. |-
| accepted
| Accepted
| Документ прийнято. |-
| report_id
| uuid
| ID документа. Записати подію в журнал. До MVP входить:
f"Report {report_id} cannot be signed from status {report.status}"
"id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
core/
=== 14.3. Приклад Python-логіки ===
<pre>
! платформа повинна забезпечити:
tax_reports.py
== 14. Підписання та відправка через ПТАХ ==
v
! |-
| Web framework
| FastAPI. |-
| Validation
| Pydantic. # Які endpoint-и використовуються для отримання статусів? Як адміністратор,
TaxReportStatus.CREATED_IN_PTAH,
GET /api/v1/tax-reports/{report_id}
PTAH_BASE_URL=https://api.ptah.example
я хочу бачити статус документа в ERP,
)
try:
== 8. Функціональні вимоги ==
"source_system": report.source_system,
== 2. Область сценарії використання ==
POST /api/v1/tax-reports/{report_id}/send-to-ptah
! |-
| Generated
| Файл документа сформовано. Коментар
* Accepted;
* Sent;
* WaitingForReceipt;
* SentToPtah;
* WaitingForSignature. |-
| AC-5
| API.ПТАХ повертає успішну відповідь. |-
| Webhook
| Механізм отримання подій від зовнішньої системи. | Опційно. |-
| created_at
| timestamp
| Дата події. |}
tax_report_repository.py
<pre>
file_name=report.file_name,
|-
| AC-4
| Документ має статус ReadyToSend. |-
| Rejected
| Документ відхилено. Подія
client_id: str | None = None
"id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
! |-
| file_name
| varchar
| Назва файлу. |-
| Receipt Loader
| Завантажує квитанції та результати обробки. |-
| updated_at
| timestamp
| Дата оновлення версій. |-
| Ручне підписання
| користувач системи підписує документ у веб-інтерфейсі або клієнті ПТАХ. # Які типи звітів підтримуються першими? |-
| FileStorageError
| Неможливо прочитати або записати файл. |-
| DB
| PostgreSQL. | Файл зберігається у файловому сховищі. |-
| Sending
| Документ передається в ПТАХ. |-
| content_type
| varchar
| MIME-тип. | Внутрішній статус документа змінюється. |-
| Помилки КЕП
| Можливі проблеми з ключами, паролями або сертифікатами. №
5. Підготувати метадані. document_types:
я хочу бачити журнал API-запитів і відповідей,
title: "Об'єднана формування звітів"
6. Тип помилки
PTAH_COMPANY_CODE=12345678
"message": "Document sent to Ptah"
</syntaxhighlight>
Retry застосовується для:
|-
| SentToPtah
| кожні 5 хвилин
|-
| CreatedInPtah
| кожні 5 хвилин
|-
| WaitingForSignature
| кожні 15 хвилин
|-
| Sent
| кожні 10 хвилин
|-
| SentToTax
| кожні 10 хвилин
|-
| WaitingForReceipt
| кожні 10 хвилин
|-
| ReceiptReceived
| кожні 30 хвилин або не перевіряти
|-
| Accepted / Rejected
| не перевіряти
|}
== 16. Модель даних ==
if not report.ptah_document_id:
=== 7.3. Отримання статусу ===
{| class="wikitable"
requires_signature: true
entity_id=report.id,
! |-
| Failed
| Технічна помилка. Поле
POST /api/v1/tax-reports
pass
! |-
| status
| varchar
| Внутрішній статус.=== 21.5. Квитанції та файли ===
Перед передачею платформа повинна перевірити:
send_response = ptah_client.send_document(report.ptah_document_id)
{
report.status = TaxReportStatus.SIGNED
<pre>
raise InvalidStatusError("Report is not created in Ptah")
tax_reporting_ptah_service/
main.py
|-
| taxpayer_id
| string
| Так
| РНОКПП або ЄДРПОУ платника. Перевірити, що документ не був відправлений раніше. |-
| source_system
| varchar
| ERP або інша система-джерело. 4. |-
| Audit Logger
| Фіксує всі дії користувачів і системи. |-
| Неповна або закрита API-документація
| Частина методів здатна бути доступна лише за договором або в окремому тарифі. # Хто має доступ до API key? # Які endpoint-и використовуються для створення документа? |-
| report_type
| string
| Так
| Тип звіту або документа. SEO-опис
DATABASE_URL=postgresql+psycopg://user:password@db:5432/reports
from pydantic_settings import BaseSettings
|-
| Python
| 3.11 або вище. "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
== 1. Мета ==
def cancel_document(self, document_id: str, reason: str) -> "PtahDocumentResponse":
щоб не виконувати ці дії вручну, якщо це підтримується API. |-
|
SentToPtah
|
Документ успішно передано в ПТАХ. №
}
details={"error": str(exc)},
|
-
|
file_content_base64
|
string
|
Так
|
-
|
file_format
|
varchar
|
XML, PDF, ZIP тощо. Отримати файл зі сховища. "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
19.1. Змінні середовища
Приклад тіла запиту:
report.sent_to_receiver_at = datetime.now(timezone.utc)
sign_response = ptah_client.sign_document(report.ptah_document_id)
event_type="SENT_TO_PTAH",
"raw_status": response.status,
signing_service.py
|
-
|
file_format
|
string
|
Так
|
XML, PDF, ZIP або інший підтримуваний формат. Квитанції / статуси
Очікувана дія:
|
|
Інкапсулювати API в окремому PtahClient. |}
</syntaxhighlight>
PTAH_BASE_URL=https://api.ptah.example
v
|
| AC-12
|
Worker запускає синхронізацію.== 24. Ризики ==
|
}
16.3. tax_report_files
PTAH_COMPANY_CODE=12345678
- timeout;
- тимчасової недоступності API.ПТАХ;
- HTTP 429;
- HTTP 500;
- HTTP 502;
- HTTP 503;
- HTTP 504;
- тимчасових мережевих помилок. # Чи виступає як тестове середовище? # Перевірити статус документа. Призначення
return report
- прийом даних звітності з ERP / облікової системи;
- формування або прийом готового XML-документа;
- перевірку документа перед передачею;
- передачу документа в ПТАХ;
- запуск підписання документа, якщо це підтримується API;
- запуск відправки документа, якщо це підтримується API;
- отримання зовнішнього ID документа;
- синхронізацію статусів;
- отримання квитанцій або результатів обробки;
- збереження історії передачі;
- обробку помилок;
- повторну відправку;
- журналювання всіх технічних і бізнес-подій. |-
|
new_status
|
varchar
|
базовий режим, якщо підтримується API. | Використовувати retry та чергу задач. |-
|
size_bytes
|
integer
|
Розмір файлу. SEO-опис
Технічний стек: Python 3.11+, FastAPI, PostgreSQL, SQLAlchemy, Alembic, httpx, Pydantic, Celery/RQ/APScheduler, Docker. | Отримати офіційну API-документацію та підтвердження від постачальника.== 19. конфігурація ==
pass
number=report.document_number,
raise InvalidStatusError(
"taxpayer_name": report.taxpayer_name,
=== 12.1. Призначення ===
3. |-
| Validation Layer
| Перевіряє реквізити, структуру та статус документа. |-
| Tests
| pytest. Перевірити, що документ має статус ReadyToSend.</pre>
! |-
| report_type
| varchar
| Тип звіту. "errors": []
* webhook-інтеграція;
* інтеграційні функції ERP напряму з ДПС;
* власний компонент КЕП;
* складний UI;
* автоматичне оновлення версій XSD;
* технічна підтримка всіх типів звітності;
* автоматичне створення декларацій з бухгалтерських даних. |-
| AC-7
| Документ вже був переданий. Запустити очікування квитанцій. | Потрібна офіційна API-документація та доступ.</pre>
db.commit()
=== Етап 8. Production hardening ===
{| class="wikitable"
requires_receipt: true
Очікувана відповідь:
)
! # Записати подію в журнал. }
report.ptah_document_id = response.id
<syntaxhighlight lang="json">
security.py
{| class="wikitable"
|-
| Непідтверджений сценарій подання звітності до ДПС
| Публічно API.ПТАХ описаний як API для ЕДО, але сценарій податкової звітності потрібно підтвердити. оновлення версій статусу в ERP
<syntaxhighlight lang="json">
== 3. Джерела інтеграції ==
=== 8.7. Отримання квитанцій ===
! # Оновити статус документа. * помилок валідації;
* неправильного API key;
* відсутності прав доступу;
* відхилення документа отримувачем;
* дублювання документа;
* некоректного формату файлу;
* помилки КЕП через неправильний пароль. # Де виконується КЕП: у Python-сервісі, у ПТАХ або користувачем у веб-інтерфейсі? |-
| Logging
| structlog або стандартний logging у JSON-форматі. |-
| Підписання в Python-сервісі
| Python-сервіс підписує документ до передачі в ПТАХ. |-
| document_number
| varchar
| Номер документа. |-
| Status Sync Worker
| Фоновий бізнес-процес для оновлення версій статусів. | платформа дає можливість ініціювати підписання, якщо це підтримується API. | Зберегти raw-статус, створити подію UnknownStatus. |-
| file_name
| varchar
| Назва файлу. |-
| period
| varchar
| Звітний період. |-
| ValidationError
| Некоректні інформаційні дані документа. |-
| Ptah Client
| Python-клієнт для роботи з API.ПТАХ. ! Поле
=== 15.2. Приклад worker-а ===
щоб не створювати документ заново. )
* реалізувати завантаження квитанцій;
* реалізувати збереження PDF/XML/receipt-файлів;
* реалізувати прив'язку файлів до документа;
* реалізувати перегляд історії. {
pass
vat_declaration:
== 27. Технічні вимоги до Python ==
=== 11.2. Перевірка документа ===
=== 12.2. Основні методи ===
|-
| Polling
| Періодичне опитування API.ПТАХ. |-
| document_number
| string
| Так
| Номер документа. SEO-опис
report = tax_report_repository.get_by_id(db, report_id)
!=== 11.3. Передача в ПТАХ ===
new_status = status_mapper.map_ptah_status(ptah_status)
|
Тип
ПТАХ
|
-
|
StatusMappingError
|
-
|
ДПС
|
}
requires_signature: true
integration/
- Python-сервіс розгортається через Docker;
- API створення документа функціонує;
- документ зберігається у БД та файловому сховищі;
- документ проходить валідацію;
- документ передається в ПТАХ;
- зовнішній ID документа зберігається;
- статус документа оновлюється;
- помилки API обробляються;
- retry-механізм функціонує;
- журнал подій заповнюється;
- написані unit-тести для ключових сервісів;
- написані інтеграційні тести для PtahClient з mock API;
- документація для запуску додана в README;
- фінальні endpoint-и ПТАХ винесені в конфігурацію;
- отримано підтвердження сценарію подання звітності до ДПС через ПТАХ або зафіксовано альтернативний сценарій. |-
|
Storage Layer
|
Зберігає документи, квитанції, статуси та логи. Записати подію в журнал. інформаційні дані для звітності або готовий XML
event_repository.py
STATUS_SYNC_INTERVAL_SECONDS=300
|
|
2. SEO-опис
base_url: str
6.1. Загальна схема
audit_logger.log(
"created_by": "user@example.com"
pass
title=report.title,
|
pass
Етап 3. Ptah Integration Client
pass
)
|
| Draft
|
-
|
receipt_received
|
ReceiptReceived
|
}
}:
v
- квитанцію про отримання;
- квитанцію про прийняття;
- квитанцію про відхилення;
- підписаний документ;
- PDF-візуалізацію, якщо доступна;
- технічний протокол обробки, якщо доступний;
- raw-відповідь ПТАХ. Передача документа через API.ПТАХ
Етап 4. Передача документів
Очікувана відповідь:
|
|
У документі зберігається ptah_document_id. |-
|
Дублювання документів
|
-
|
Скасування документа
|
-
|
metadata
|
object
|
Ні
|
-
|
Accepted
|
-
|
document_date
|
date
|
Так
|
Дата документа. ERP / Accounting System
tax_request:
2. |-
|
Помилка API
|
-
|
HTTP client
|
Заборонити повтор без підтвердження. Отримати результат підписання. Як бухгалтер,
- реалізувати endpoint send-to-ptah;
- зберігати ptah_document_id;
- оновлювати статуси;
- логувати API-взаємодію. |-
|
DuplicateDocumentError
|
-
|
Завантаження квитанції
|
-
|
ReceiptReceived
|
-
|
AC-17
|
-
|
AC-3
|
Передано некоректні інформаційні дані. Режим
tests/
raise InvalidStatusError(
ERP / Accounting System
v
from datetime import datetime, timezone
23. Етапи реалізації
|
"source_system": "K2 ERP",
single_tax_declaration:
щоб скоротити час підготовки та подання документів. |-
|
waiting_signature
|
WaitingForSignature
|
-
|
SentToTax
|
}
<div style="border-left: 6px solid #2e7d32; background: #e8f5e9; padding: 12px 16px; margin: 16px 0;">
* REST API для створення документа;
* збереження документа;
* базова валідація;
* Ptah Integration Client;
* передача документа в ПТАХ;
* збереження зовнішнього ID;
* ручний запуск синхронізації статусу;
* журнал подій;
* базова обробка помилок. | Виконати retry. | Відображати зрозумілу помилку та дозволяти повторне підписання. Статус ПТАХ
! платформа повинна підтримувати один із режимів:
=== 11.6. оновлення версій статусу ===
validation_service.py
POST /api/v1/tax-reports/{report_id}/send
def download_receipts(self, document_id: str) -> list [bytes]:
TaxReportStatus.WAITING_FOR_SIGNATURE,
f"Report {report_id} cannot be sent from status {report.status}"
4. ! Очікуваний результат
=== 8.5. Відправка документа ===
2. | Основна платформа для передачі документів. Інтервал перевірки
=== 17.2. Retry-логіка ===
- xml
! # Чи потрібно робити UI, чи тільки backend API? |}
<syntaxhighlight lang="json">
Python Tax Reporting Service
{| class="wikitable"
"ptah_document_id": "external-document-id",
=== Етап 1. Базова структура Python-сервісу ===
|-
| AC-8
| Документ створено в ПТАХ. |-
| Підписання
| Результат, дата, raw-відповідь ПТАХ. # Який базовий URL API? |-
| PtahTimeoutError
| Перевищено час очікування. |}
- xml
PTAH_API_KEY=********
requires_receipt: true
def sign_document(self, document_id: str) -> "PtahDocumentResponse":
</syntaxhighlight>
|-
| AC-15
| Документ прийнято. Поле
)
<syntaxhighlight lang="python">
)
if new_status != report.status:
Повторна відправка не дозволена для статусів:
<pre>
<pre>
download_receipts.py
v
Повторна відправка дозволена тільки для документів у статусах:
POST /api/v1/tax-reports/{report_id}/resend
== Див. 30. так само ==
GET /api/v1/tax-reports/{report_id}/events
=== 6.2. Основні компоненти Python-сервісу ===
def download_original(self, document_id: str) -> bytes:
[[Категорія:Податкова звітність]]
я хочу передати документ звітності в ПТАХ без ручного імпорту,
"status": "ReadyToSend",
},
== 7. User Story ==
"old_status": old_status,
api_key: str | None = None
! # Які endpoint-и використовуються для отримання квитанцій? |-
| created_at
| timestamp
| Дата створення. |-
| old_status
| varchar
| Попередній статус. # Чи потрібна технічна підтримка ФОП, юридичних осіб або обох варіантів? # Отримати зовнішній ID документа в ПТАХ. | платформа дає можливість передачу в ПТАХ. |-
| ПТАХ
| Платформа електронного документообігу. # Який формат документа підтримується: XML, PDF, ZIP, JSON? )
* реалізувати background worker;
* реалізувати періодичне оновлення версій статусів;
* реалізувати мапінг статусів;
* реалізувати обробку невідомих статусів. POST /api/v1/tax-reports/{report_id}/send-to-ptah
[[Категорія:API]]
file_content=file_bytes,
except Exception as exc:
unified_report:
</syntaxhighlight>
</div>
"period": report.period,
<pre>
STATUS_SYNC_ENABLED=true
! | платформа зберігає помилку та не втрачає документ. До першої версії не входить:
* реалізувати створення документа;
* реалізувати збереження файлу;
* реалізувати валідацію;
* реалізувати статуси;
* реалізувати журнал подій.
details={"raw_status": sign_response.status},
"status": "Sent",
'''Головна ідея:''' розробити Python-сервіс, який формує, перевіряє, передає та контролює документи звітності через інтеграцію з платформою ПТАХ / API.ПТАХ.<syntaxhighlight lang="json">
* реалізувати авторизацію;
* реалізувати upload_tax_report;
* реалізувати create_document;
* реалізувати get_document_status;
* реалізувати download_document;
* реалізувати download_receipts;
* реалізувати обробку помилок;
* реалізувати retry. Оновити статус на SentToPtah. |-
| Polling
| Періодичне опитування зовнішнього API. |}
=== 14.1. Логічний бізнес-процес підписання ===
! Реальні коди статусів потрібно взяти з API-документації ПТАХ. |-
| signed
| Signed
| Документ підписано. Критерій
</div>
=== 8.2. Валідація документа ===
models.py
7. tax_report_repository.update_status(
__TOC__
class PtahClient:
=== 11.9. Завантаження квитанцій ===
"file_format": "xml",
|-
| ПТАХ
| Платформа електронного документообігу та обміну юридично значущими документами. report.status = TaxReportStatus.SENT
tax_report_service.py
<syntaxhighlight lang="json">
retry_count: int = 3
! SEO-опис
{| class="wikitable"
if report.status != TaxReportStatus.READY_TO_SEND:
це Python-клас або пакет, який інкапсулює роботу з API виступає ключовою рисою Ptah Integration Client.ПТАХ. | У системі створюється запис tax_reports. "status": "SentToPtah",
def get_document(self, document_id: str) -> "PtahDocumentResponse":
! PTAH_RETRY_BACKOFF_SECONDS=5
- xml
* створити FastAPI-проєкт;
* налаштувати PostgreSQL;
* створити моделі tax_reports, tax_report_events, tax_report_files;
* реалізувати конфігурацію через environment variables;
* реалізувати healthcheck endpoint. | Статус документа змінюється на Sent. # Отримати файл зі сховища. |-
| rejected_at
| timestamp
| Дата відхилення. |-
| AC-13
| ПТАХ повертає новий статус. До області задачі входить:
* додати Dockerfile;
* додати docker-compose;
* додати structured logging;
* додати metrics;
* додати alerting;
* додати rate limiting;
* додати security review. |-
| API
| Програмний інтерфейс інтеграції. |}
class PtahSettings(BaseSettings):
file_format=report.file_format,
Попередній логічний мапінг:
"message": "Document signed via Ptah"
|
| 1. Очікуваний результат
"id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
Очікувана відповідь:
PTAH_TIMEOUT_SECONDS=30
report.status = TaxReportStatus.SENT_TO_PTAH
"report_type": "single_tax_declaration",
{
receipt_service.py
ptah_status = ptah_client.get_document_status(
{| class="wikitable"
=== Етап 7. Квитанції та результати обробки ===
{| class="wikitable"
PTAH_RETRY_COUNT=3
=== 7.2. Підписання та відправка ===
allowed_formats:
audit_logger.log(
event_type="STATUS_SYNC_FAILED",
4. |-
| Помилки авторизації
| Доступ до API здатна бути неправильним або простроченим. Дія системи
{| class="wikitable"
платформа повинна підтримувати два способи оновлення версій статусів:
== 12. Ptah Integration Client ==
<syntaxhighlight lang="python">
details={
}
{
== 13. Передача документа в ПТАХ ==
README.md
event_type="STATUS_CHANGED",
! Оновити статус на Signed або Failed. електронного документообігу: створення забезпечується через '''критично:''' API.ПТАХ публічно описується як API; так само реалізовано підписання, відправка та отримання документів. |-
| PtahApiError
| API повернув помилку. return report
POST /api/v1/tax-reports/{report_id}/download-receipts
[[Категорія:Інтеграції]]
v
=== 7.4. Отримання квитанцій ===
repositories/
Очікувана дія:
|-
| Створення документа
| ID, користувач системи, дата, тип документа. №
! |-
| ValidationError
| Документ не пройшов перевірку. "message": "Document created"
POST /api/v1/tax-reports/{report_id}/send
)
{| class="wikitable"
Ptah Integration Adapter
"status": "Generated",
== 9. Статуси документа ==
ПТАХ
== 5. Терміни та скорочення ==
! # Записати подію в журнал. |-
| WaitingForSignature
| Документ очікує підписання.=== 7.1. Передача документа в ПТАХ ===
* реалізувати sign endpoint;
* реалізувати send endpoint;
* обробити помилки КЕП;
* обробити помилки відправки;
* фіксувати всі етапи в журналі. |-
| rejected
| Rejected
| Документ відхилено. |-
| SignatureError
| Помилка підписання документа. |-
| AC-11
| Відправка виконана успішно. |-
| report_id
| uuid
| ID документа. Оновити статус на Sent або Failed. |-
| XML
| Формат електронного документа звітності. |-
| sent_at
| timestamp
| Дата передачі в ПТАХ. |
| 5. Викликати PtahClient.upload_tax_report(). |-
| CreatedInPtah
| Документ створено в ПТАХ. # Які endpoint-и використовуються для відправки? |-
| ptah_raw_status
| varchar
| Останній raw-статус ПТАХ. |-
| AC-10
| Документ підписано. | платформа завантажує квитанцію або результат обробки. |-
| Sent
| Документ відправлено отримувачу. Термін
=== 11.1. Створення документа ===
metadata={
! | Опційно. |-
| Повторна відправка
| Причина, користувач системи, дата. Внутрішній статус
allowed_formats:
=== 11.7. Отримання документа ===
"taxpayer_id": report.taxpayer_id,
title: "Декларація з ПДВ"
integrations/
client.py
status_mapper.py
Retry не застосовується для:
old_status = report.status
file_storage.py
21.1. Створення документа
for report in reports:
date=report.document_date,
</syntaxhighlight>
</syntaxhighlight>
POST /api/v1/tax-reports/{report_id}/sign
12.3. Конфігурація клієнта
def send_document(self, document_id: str) -> "PtahDocumentResponse":
verify_ssl: bool = True
|
-
|
error_message
|
text
|
-
|
Signed
|
-
|
Невідомі статуси
|
-
|
uploaded
|
SentToPtah
|
-
|
API.ПТАХ
|
-
|
created_by
|
varchar
|
Статуси документів оновлюються автоматизовано. |-
|
XSD
|
-
|
Квитанція
|
-
|
AC-16
|
Документ відхилено. SEO-опис
audit_logger.log(
Заборонено: зберігати API key, client secret, токени або паролі КЕП у коді, Git-репозиторії чи відкритих логах. |-
|
Валідація
|
-
|
created_at
|
timestamp
|
Дата створення. Dockerfile
3. |-
|
ERP / облікова платформа
|
-
|
Недоступність ПТАХ
|
Платформа або мережа можуть бути тимчасово недоступні. SEO-опис
}
11.10. Повторна відправка
PTAH_RETRY_COUNT=3
|
| API Layer
|
REST API для прийому документів від ERP.
"ptah_status": "waiting_signature"
|
Додати healthcheck інтеграції та повідомлення адміністратору. |-
|
Python-сервіс
|
-
|
AC-2
|
Передано файл документа. Компонент
audit_logger.log(
- зберігання API key тільки у змінних середовища або secret storage;
- заборону логування API key;
- заборону зберігання паролів КЕП у відкритому вигляді;
- маскування персональних даних у технічних логах;
- контроль доступу до документів;
- контроль доступу до квитанцій;
- журналювання всіх операцій;
- HTTPS для API-запитів;
- перевірку SSL-сертифіката;
- обмеження доступу до адміністративних endpoint-ів;
- резервне копіювання документів і квитанцій. v
платформа повинна завантажувати та зберігати:
щоб розуміти, чи документ створено, передано, підписано, відправлено, прийнято або відхилено. |-
|
accepted_at
|
timestamp
|
Дата прийняття.
# Отримати документ із локальної БД. |-
| Webhook
| Отримання подій від ПТАХ, якщо підтримується. |-
| WaitingForReceipt
| Очікується квитанція або результат обробки. | Зберегти помилку, дозволити повторне підписання. Статус документа
{
{| class="wikitable"
[[Категорія:Технічні завдання]]
"message": "Document sent via Ptah"
== 21. Acceptance Criteria ==
{| class="wikitable"
Як користувач системи,
file_bytes = file_storage.read(report.file_path)
6. Тип
=== 11.4. Підписання документа ===
<syntaxhighlight lang="python">
title: "Декларація платника єдиного податку"
Якщо API.ПТАХ підтримує відповідний метод, Python-сервіс повинен ініціювати відправку документа отримувачу. Очікуваний результат
ДПС або інший отримувач
report_id=report.id,
=== 16.2. tax_report_events ===
def create_document(self, document: "DocumentPayload") -> "PtahDocumentResponse":
}
)
! |-
| Cancelled
| Документ скасовано. Критерій
APP_ENV=production
=== 8.1. Створення документа ===
def send_report_to_ptah(report_id: UUID, db: "Session") -> "TaxReport":
logging.py
! Що зберігати
<div style="border-left: 6px solid #1565c0; background: #e3f2fd; padding: 12px 16px; margin: 16px 0;">
Логічний endpoint Python-сервісу:
'''Уточнення:''' значення статусів виступає як попередніми. №
pyproject.toml
storage/
{| class="wikitable"
6. SEO-опис
! |-
| ORM
| SQLAlchemy. # Оновити статус на Sent. | Маскувати логи та обмежити доступ. |}
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
{{DISPLAYTITLE:Технічне завдання: Передача документів для звітності в податкову через ПТАХ для Python}}
! |-
| document_date
| date
| Дата документа. company_code: str | None = None
! Ризик
health.py
audit_logger.log(
! Пріоритет
== 25. Відкриті питання ==
routes/
=== Етап 2. Робота з документами ===
[[Категорія:K2 ERP]]
3. |-
| PtahUnavailableError
| Платформа ПТАХ недоступна. | Отримати офіційну документацію та тестовий доступ. |}
file_repository.py
details={"raw_status": send_response.status},
"taxpayer_id": "1234567890",
</div>
def upload_tax_report(self, document: "DocumentPayload") -> "PtahDocumentResponse":
! # Перевірити, що документ підписано або готовий до підписання. |-
| AC-6
| API.ПТАХ повертає помилку. |-
| sent
| Sent
| Документ відправлено.== 20. Логування та аудит ==
{| class="wikitable"
! |}
requires_receipt: true
=== Етап 6. Синхронізація статусів ===
client_secret: str | None = None
title: "Запит до податкової"
|
| id
|
uuid
|
Сценарій передачі через ПТАХ потрібно підтвердити окремо. Очікуваний результат
def get_document_status(self, document_id: str) -> "PtahStatusResponse":
Як користувач системи ERP,
Приклад змінних середовища:
|
| id
|
uuid
|
}
</syntaxhighlight>
|
№
Очікувана відповідь:
1. Перевірити, що документ створено в ПТАХ. |}
|
Спосіб
|
| Підписання в ПТАХ
|
-
|
AC-14
|
class="wikitable"
}
PTAH_RETRY_BACKOFF_SECONDS=5
|
Критерій
PTAH_TIMEOUT_SECONDS=30
|
| created
|
CreatedInPtah
|
Документ створено в ПТАХ.
"new_status": new_status,
</syntaxhighlight>
api/
{
13.2. Приклад Python-логіки
| id
|
uuid
|
Внутрішній ID документа. Внутрішній статус
Очікувана відповідь:
платформа повинна логувати:
Етап 5. Підписання та відправка
Логічний endpoint Python-сервісу:
функції ERP застосовують, коли потрібно для автоматизації передачі документів звітності з ERP або облікової системи до ПТАХ. |-
|
Background jobs
|
Резервний режим. "metadata": {
pass
- ValidationError;
- Failed;
- Rejected;
- DeliveryError;
- NeedResend. # Який SLA по оновленню статусів? |-
|
title
|
varchar
|
-
|
event_type
|
varchar
|
Тип події. SEO-опис
db/
щоб мати підтвердження результату передачі документа. Критерій
entity_id=report.id,
- наявність обов'язкових полів;
- коректність РНОКПП або ЄДРПОУ;
- коректність звітного періоду;
- наявність файлу;
- допустимий формат файлу;
- розмір файлу;
- коректність імені файлу;
- відповідність XML-структурі;
- відповідність XSD, якщо схема доступна;
- відсутність дубля документа;
- наявність налаштувань інтеграції з ПТАХ. | Не відправляти документ, показати список помилок. |-
|
payload
|
jsonb
|
-
|
sent_to_tax_at
|
timestamp
|
платформа дає можливість відправку документа. Обов'язковість
migrations/
Фінальний мапінг статусів потрібно побудувати після отримання офіційного довідника статусів API.ПТАХ. Викликати метод підписання ПТАХ, якщо він доступний. Як зменшити
session.py
6. технічна архітектура рішення для бізнесу
PTAH_CLIENT_ID=********
"document_number": "DECL-2026-0001",
Python-сервіс повинен мати метод для передачі документа в ПТАХ. Зберегти ID у локальній БД. Критерій
|
платформа зберігає причину відхилення. |-
|
Containers
|
-
|
taxpayer_name
|
string
|
Так
|
Назва компанії або ПІБ ФОП. Тип
{| class="wikitable"
</div>
Python-сервіс повинен приймати документ від ERP. | Обов'язково для MVP.== 22. MVP ==
TaxReportStatus.SENT_TO_PTAH,
</syntaxhighlight>
19.2. Конфігурація типів документів
я хочу ініціювати підписання та відправку документа через ПТАХ,
|
Він бачить всі пов'язані файли та статуси. raw_status=ptah_status.raw_status,
<syntaxhighlight lang="python">
<pre>
|-
| Python-сервіс
| Окремий backend-сервіс або компонент, який виконує інтеграцію з ПТАХ.
1. |}
Сервіс повинен забезпечити:
if report.status not in {
POST /api/v1/tax-reports/{report_id}/validate
Як бухгалтер,
SEO title: Технічне завдання: Передача документів для звітності в податкову через ПТАХ для Python
SEO keywords: Python, ПТАХ, API.ПТАХ, електронна звітність, податкова звітність, ДПС, API, XML, КЕП, електронний документообіг, технічне завдання
</noinclude>
{{SEO
Шаблон для службового SEO-опису сторінки.
}}
14.2. Логічний бізнес-процес відправки
from uuid import UUID
- Перевірити, що документ створено в ПТАХ. # Які endpoint-и використовуються для підписання? |-
|
waiting_receipt
|
WaitingForReceipt
|
-
|
PtahAuthError
|
-
|
Персональні інформаційні дані
|
-
|
file_path
|
varchar
|
платформа повертає список помилок валідації. | Реалізується в межах цього ТЗ.=== 8.6. Отримання статусів ===
"taxpayer_name": "ФОП Іваненко Іван Іванович",
requires_signature: true
},
requires_signature: true
17.1. Типи помилок<syntaxhighlight lang="json">
Задача вважається завершеною, якщо:
- zip
allowed_formats:
event_type="SENT_VIA_PTAH",
15. Робота зі статусами
},
db.commit()
workers/
платформа повинна мати background worker, який періодично оновлює статуси документів. |}
8.8. Повторна відправка
Як бухгалтер,
* доступ до платформи ПТАХ;
* активований доступ до API.ПТАХ;
* базовий URL API;
* спосіб авторизації;
* API key / token / client credentials;
* технічну документацію endpoint-ів;
* перелік доступних типів документів;
* підтвердження функції ERP передачі звітності до ДПС через ПТАХ;
* формат передачі файлів;
* формат метаданих документа;
* правила створення документа в ПТАХ;
* правила підписання документа;
* правила відправки документа;
* правила отримання статусів;
* правила отримання квитанцій;
* тестове середовище, якщо доступне;
* технічний контакт з боку постачальника ПТАХ. |-
| error
|
Failed
|
Помилка обробки. Рекомендація
schemas.py
report.ptah_document_id
18. Безпека
|
| AC-1
|
ERP передає інформаційні дані документа у Python-сервіс. Очікуваний результат
"id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
requires_receipt: true
|
{
|
class="wikitable"
response = ptah_client.upload_tax_report(payload)
- pdf
|
"document_date": "2026-04-15",
|
-
|
Document Builder
|
Формує XML або приймає готовий файл.=== 13.1. Логічний бізнес-процес ===
* повна заміна інтерфейсу ПТАХ;
* власна реалізація подання напряму до API ДПС;
* власна реалізація КЕП, якщо підписання виконується на стороні ПТАХ;
* автоматичне оновлення версій всіх XSD-схем;
* повноцінний UI для бухгалтера;
* автоматична бухгалтерська перевірка сум;
* технічна підтримка всіх типів податкової, статистичної та фінансової звітності. |-
|
ptah_document_id
|
varchar
|
ID документа у ПТАХ. Тип
entity_id=report.id,
"report_type": report.report_type,
21.2. Передача в ПТАХ
11.5. Відправка документа
5. Отримати документ з БД. Пріоритет
FILE_STORAGE_PATH=/data/tax-reports
exceptions.py
<syntaxhighlight lang="json">
RECEIPT_DOWNLOAD_ENABLED=true
pass
pass
entity_id=report.id,
timeout_seconds: int = 30
POST /api/v1/tax-reports/{report_id}/sync-status
report = tax_report_repository.get_by_id(db, report_id)
new_status=new_status,
- xml
"status": "Signed",
16.1. tax_reports
config.py
|
}
reports = tax_report_repository.get_reports_for_sync()
# Який саме ERP-продукт застосовується для: ПТАХ, API.ПТАХ або інтеграційні функції ERP через інший ERP-продукт Linkos Group? | Перевіряти ptah_document_id перед відправкою. | Зберігати raw-статус та мати UnknownStatus. |-
|
Відправка
|
-
|
Migrations
|
Alembic.== 17. Обробка помилок ==
|
-
|
taxpayer_id
|
varchar
|
-
|
file_type
|
varchar
|
-
|
ReadyToSend
|
-
|
sent_to_tax
|
SentToTax
|
}
26. Приклад структури Python-проєкту
report.sent_at = datetime.now(timezone.utc)
|
Записати відповідь API, дозволити повтор. |-
|
file_path
|
varchar
|
}
)
8. SEO-опис
|
|
|
|