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

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

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

pass

exceptions.py
"status": "ReadyToSend",

! інформаційні дані для звітності

! # Оновити статус документа. щоб розуміти, чи документ передано, підписано, прийнято або відхилено. )

! |- | оновлення версій статусу | Старий статус, новий статус, raw-статус «Вчасно». | Статуси документів оновлюються автоматизовано. |- | period | string | Так | Звітний період. Інтервал перевірки

Dockerfile

! Як зменшити

"created_by": "user@example.com"

|- | AC-4 | Документ має статус ReadyToSend. | Записати відповідь API, дозволити повтор. |- | file_path | varchar | Шлях до файлу у сховищі. |- | Валідація | Результат, список помилок. |}

оновлення версій статусу
report.vchasno_document_id

tax_reporting_service/

file_bytes = file_storage.read(report.file_path)

23. Ризики

Див. 29. так само

VCHASNO_BASE_URL=https://edo.vchasno.ua/api/v2

v
API Layer }
title: "Запит до податкової"
- VchasnoApiError - taxpayer_name string Так }

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

- pdf
- Web framework - Персональні інформаційні дані - Failed Виникла технічна помилка. {

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

tests/
file_content=file_bytes,

</syntaxhighlight>

=== 20.2. Передача у «Вчасно» ===
Як користувач системи ERP, 
я хочу бачити журнал API-запитів і помилок, 
! 3. №
 api_key: str
=== 7.5. Технічний аудит ===
|-
| Draft
| Документ створено, але ще не готовий до передачі. |-
| file_format
| varchar
| XML, PDF тощо. |-
| accepted
| Accepted
| Документ прийнято. |-
| document_date
| date
| Дата документа. |-
| Недоступність сервісу
| «Вчасно» або мережа можуть бути недоступні. Перевірка документа
! |-
| Receipt Loader
| Завантажує квитанції або результати обробки. | Маскувати логи та обмежити доступ. Очікуваний результат
 def download_original(self, document_id: str) -> bytes:
Як бухгалтер, 
Python-сервіс повинен мати метод для завантаження документа у «Вчасно». Очікуваний результат
7. |-
| ДПС
| Державна податкова служба України. №
# Чи надає «Вчасно» endpoint саме для подання звітності до ДПС? Метою задачі виступає як створення Python-модуля / Python-сервісу для передачі документів податкової звітності через сервіс «Вчасно». |-
| taxpayer_id
| varchar
| РНОКПП або ЄДРПОУ. | Реалізується в межах цього ТЗ. # Перевірити статус документа. |}

 metadata={

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

Повторна відправка не дозволена для статусів:
платформа повинна мати background worker, який періодично оновлює статуси документів. ! |-
| title
| varchar
| Назва документа. Тип

!=== 16.2. Retry-логіка ===
DATABASE_URL=postgresql+psycopg://user:password@db:5432/reports
 config.py
 except Exception as exc:

ERP / Accounting System

)
- new_status varchar }
requires_signature: true
- sent SentToTax Завантаження, підписання, статуси, скачування документів. tax_report_repository.update_status(report.id, new_status)
  • реалізувати створення документа;
  • реалізувати збереження файлу;
  • реалізувати валідацію;
  • реалізувати статуси;
  • реалізувати журнал подій. Поле
"message": "Document sent to Vchasno"

подання: «Вчасно.Звіт» забезпечується через # Який саме сервіс застосовується для; так само реалізовано «Вчасно.EDO» чи окрема партнерська API-інтеграція? |-

AC-13 class="wikitable"
  • реалізувати endpoint send-to-vchasno;
  • зберігати vchasno_document_id;
  • оновлювати статуси;
  • логувати API-взаємодію. "old_status": report.status,
taxpayer_id string Так У системі створюється запис tax_reports. |- Передача у «Вчасно» - Вчасно.Звіт }
pass
try:
 |
 | 1. |-
| AC-3
| Передано некоректні інформаційні дані. Очікуваний результат
! |-
| WaitingForTaxReceipt
| Очікується квитанція або результат обробки. |-
| Polling
| Періодичне опитування API для отримання статусів. Оновити статус на SentToVchasno. # Чи виступає як тестове середовище? # Які типи звітів підтримуються першими? |-
| Status Sync Worker
| Фоновий бізнес-процес для оновлення версій статусів. | платформа не створює дубль без окремого підтвердження. |-
| VchasnoTimeoutError
| Перевищено час очікування. integration/
'''Технічний стек:''' Python 3.11+, FastAPI або окремий background-service, PostgreSQL, Celery/RQ/APScheduler, requests/httpx, Pydantic, SQLAlchemy, Docker.== 21. MVP ==

 - xml

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

<pre>
 audit_logger.log(
RECEIPT_DOWNLOAD_ENABLED=true

 exceptions.py

# Отримати документ з локального сховища. # Чи виступає як webhook-и для статусів? Подія
Для реалізації задачі необхідно отримати:

 pass

 requires_receipt: true
 receipt_service.py
[[index.php?title=Категорія:Вчасно]]
=== 15.3. tax_report_files ===
 - pdf
Retry не застосовується для:
щоб мати підтвердження подання звітності. Поле
|-
| Створення документа
| ID, користувач системи, дата, тип документа. Мінімальний набір вхідних даних:

VCHASNO_API_KEY=********

== 13. Передача документа у «Вчасно» ==
 audit_logger.log(
 integrations/

 status_mapper.py

платформа повинна логувати:
Retry застосовується для:
 def download_receipts(self, document_id: str) -> list [bytes]:
=== Етап 3. Vchasno API Client ===
<syntaxhighlight lang="json">
VCHASNO_RETRY_COUNT=3
{| class="wikitable"
2. }
== 18. конфігурація ==
! def reject_document(self, document_id: str, reason: str) -> "VchasnoDocumentResponse":

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

 "report_type": "single_tax_declaration",
! |-
| Webhook
| Механізм отримання подій від зовнішньої системи. Тип

 },

* створення Python API-клієнта для «Вчасно»;
* створення сервісного шару для роботи з документами;
* формування XML/PDF/JSON-документів;
* завантаження документа у «Вчасно»;
* передача метаданих документа;
* отримання статусів;
* отримання підписаних документів або квитанцій;
* зберігання технічного журналу;
* retry-механізм;
* інтеграційні функції ERP з основною ERP / обліковою системою. |-
| AC-12
| Документ відхилено. tax_report_repository.py

 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
POST /api/v1/tax-reports/{report_id}/send-to-vchasno
<syntaxhighlight lang="json">
|-
| Python-сервіс
| Окремий сервіс або компонент, який виконує інтеграцію з «Вчасно». Поле

<syntaxhighlight lang="python">

=== 13.2. Приклад Python-логіки ===
 "taxpayer_id": report.taxpayer_id,
<pre>

 entity_id=report.id,

 base_url: str
VCHASNO_BASE_URL=https://edo.vchasno.ua/api/v2
</syntaxhighlight>

 response = vchasno_client.upload_document(payload)

 db.commit()
! | Опційно.=== 7.1. Передача документа у Вчасно ===
Приклад змінних середовища:
 pyproject.toml
 "vchasno_status": vchasno_status.raw_status,
</syntaxhighlight>
 )
 event_type="SENT_TO_VCHASNO",
 tax_request:
</syntaxhighlight>
{
Очікувана відповідь:

9. |-
| id
| uuid
| ID файлу. |-
| API
| Програмний інтерфейс для інтеграції. | Зафіксувати помилку, повідомити адміністратора. |-
| AC-2
| Передано файл документа. |-
| event_type
| varchar
| Тип події. Спосіб
! |-
| DuplicateDocumentError
| Документ вже був переданий. }

class VchasnoClient:

VCHASNO_TIMEOUT_SECONDS=30
! |-
| taxpayer_name
| varchar
| Назва платника. |-
| file_name
| varchar
| Назва файлу. # Зберегти зовнішній ID документа. Статус документа

 sync_statuses.py
=== 15.1. tax_reports ===
Python Reporting Service

Перед передачею у «Вчасно» платформа повинна перевірити:

=== Етап 2. Робота з документами ===
=== 20.1. Створення документа ===
=== 11.5. Отримання документа ===
</syntaxhighlight>
 "metadata": {
щоб не створювати документ вручну заново. |-
| Помилка API
| HTTP-код, тіло відповіді, correlation ID. |-
| report_id
| uuid
| ID документа. SEO-опис

* Помилка передачі;
* Відхилено;
* Не доставлено;
* Потребує повторної відправки. |}

[[index.php?title=Категорія:API]]

=== Етап 7. Production hardening ===

{| class="wikitable"
</syntaxhighlight>

це Python-клас або пакет, який інкапсулює роботу з API «Вчасно» виступає ключовою рисою Vchasno API Client. SEO-опис

"new_status": "WaitingForSignature",
- AC-9 - file_name varchar - Accepted Документ прийнято. SEO-опис

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

new_status = status_mapper.map_vchasno_status(vchasno_status)
Polling - Document Builder - WaitingForSignature платформа дає можливість передачу у «Вчасно». SEO-опис

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

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

щоб оперативно знаходити причину проблеми. |-

Signed - created_at timestamp - VchasnoAuthError - AC-7 - Повторна відправка Причина, користувач системи, дата. repositories/
allowed_formats:

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

я хочу сформувати документ звітності та передати його у «Вчасно»,

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

if report.status != TaxReportStatus.READY_TO_SEND:
- old_status varchar - created_by varchar - error_message text Остання помилка. До області задачі не входить у першій версії:
  • помилок валідації;
  • неправильного API key;
  • відсутності прав доступу;
  • відхилення документа податковою;
  • дублювання документа. |-
document_date date Так - SentToVchasno - Storage Layer - document_number varchar - Завантаження квитанції - StatusMappingError - document_number string Так - Tests pytest. SEO-опис
payload = DocumentPayload(
"file_format": "xml",

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

)
SEO-опис
models.py

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

10. Мапінг статусів «Вчасно»

date=report.document_date,
- Generated }

</syntaxhighlight>

20. Acceptance Criteria

  • timeout;
  • тимчасової недоступності API;
  • HTTP 429;
  • HTTP 500;
  • HTTP 502;
  • HTTP 503;
  • HTTP 504. |-
ValidationError - error Failed - Background jobs Інкапсулювати API в окремому VchasnoClient. | Отримати офіційну API-специфікацію від «Вчасно». |- period varchar - SentToTax Перевіряти vchasno_document_id перед відправкою.

* додати Dockerfile;
* додати docker-compose;
* додати structured logging;
* додати metrics;
* додати alerting;
* додати rate limiting;
* додати security review. Дія системи
 event_type="STATUS_SYNC_FAILED",
 title: "Декларація платника єдиного податку"
 report.vchasno_document_id = response.id
== 4. Передумови ==
POST /api/v1/tax-reports/{report_id}/validate
=== 14.2. Приклад worker-а ===
! |-
| Дублювання документів
| Повторна відправка здатна створити дубль. |-
| Webhook
| Отримання подій від «Вчасно», якщо підтримується.<pre>
Приклад логічного endpoint-а Python-сервісу:
=== 12.2. Основні методи ===
 for report in reports:
 v
== 12. Vchasno API Client ==
POST /api/v1/tax-reports

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

=== 12.1. Призначення ===
 event_type="STATUS_CHANGED",
 },

я хочу бачити актуальний статус документа, 

 v
 if new_status != report.status:
! |-
| ReadyToSend
| Документ готовий до передачі. pass
=== 12.3. Конфігурація клієнта ===

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

def sync_pending_reports() -> None:
 validation_service.py
== 7. User Story ==
<syntaxhighlight lang="python">
 def get_document_status(self, document_id: str) -> "VchasnoStatusResponse":
{| class="wikitable"

! |-
| content_type
| varchar
| MIME-тип. |-
| report_id
| uuid
| ID документа. # Записати подію в журнал.</syntaxhighlight>

! |-
| vchasno_document_id
| varchar
| ID документа у «Вчасно». |}

 routes/

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

{| class="wikitable"

=== 14.1. Фонове оновлення версій ===
<syntaxhighlight lang="json">
 unit/
}
|-
| uploaded
| SentToVchasno
| Документ завантажено у «Вчасно». # Чи потрібно робити UI, чи тільки backend API? |-
| report_type
| string
| Так
| Тип звіту або документа. ! |-
| signed
| Signed
| Документ підписано. |-
| FileStorageError
| Неможливо прочитати або записати файл. |-
| Sending
| Документ передається у «Вчасно». №
 services/
Приклад тіла запиту:
{| class="wikitable"
 audit_logger.log(
Як адміністратор, 
=== 6.2. Основні компоненти Python-сервісу ===
}
 "report_type": report.report_type,
 report.sent_at = datetime.utcnow()
VCHASNO_RETRY_BACKOFF_SECONDS=5

</div>

=== 11.6. Отримання журналу ===
 "vchasno_document_id": "external-document-id",
 schemas.py
|-
| Python
| 3.11 або вище. |-
| file_content
| binary / base64
| Так
| Вміст документа. |-
| Migrations
| Alembic. Пріоритет
Vchasno API Client

 event_repository.py
 "file_content_base64": "BASE64_XML_CONTENT",
Задача вважається завершеною, якщо:
 f"Report {report_id} cannot be sent from status {report.status}"
=== 8.4. Отримання статусів ===

'''Головна ідея:''' розробити Python-сервіс, який формує, перевіряє, передає та контролює документи для податкової звітності через інтеграцію з сервісами «Вчасно». |-
| payload
| jsonb
| Технічні інформаційні дані події. Поле
 single_tax_declaration:

 pass

{| class="wikitable"
 def send_for_signature(self, document_id: str) -> "VchasnoDocumentResponse":
POST /api/v1/tax-reports/{report_id}/send-to-vchasno

 allowed_formats:

 workers/
=== 8.6. Повторна відправка ===
VCHASNO_TIMEOUT_SECONDS=30

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

! |-
| Вчасно.EDO
| Сервіс електронного документообігу. Формування XML / PDF / JSON
{| class="wikitable"
=== Етап 6. Квитанції та результати обробки ===
 |
 | 3. |-
| DB
| PostgreSQL. | Зберегти raw-статус, позначити як Failed або Unknown. |-
| XML
| Формат електронного документа звітності. SEO-опис

 storage/

[[index.php?title=Категорія:Технічні завдання]]
6. |-
| HTTP client
| httpx. |-
| file_format
| string
| Так
| XML, PDF або інший підтримуваний формат. Тип помилки

=== 11.3. Передача у «Вчасно» ===

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

Використовувати retry та чергу задач. |- ORM SQLAlchemy. # Який формат документів передається: XML, PDF, ZIP, JSON? Очікувана відповідь:
  • webhook-інтеграція;
  • повна автоматизація процесів подання у ДПС без участі «Вчасно»;
  • власний компонент КЕП;
  • складний UI;
  • автоматичне оновлення версій XSD;
  • технічна підтримка всіх типів звітності. |-
file_path varchar Шлях до файлу. "errors": []
  • зберігання API key тільки у змінних середовища або secret storage;
  • заборону логування API key;
  • маскування персональних даних у технічних логах;
  • контроль доступу до документів;
  • контроль доступу до квитанцій;
  • журналювання всіх операцій;
  • шифрування файлів у сховищі, якщо це передбачено політикою безпеки;
  • HTTPS для всіх API-запитів;
  • перевірку SSL-сертифіката;
  • обмеження доступу до адміністративних endpoint-ів. Викликати VchasnoClient.upload_document(). | У документі зберігається vchasno_document_id. |-
ERP / облікова платформа Джерело даних для формування документів. # Чи потрібно отримувати квитанції з ДПС через «Вчасно»? v

1. Мета

AC-1 ERP передає інформаційні дані документа у Python-сервіс. raise InvalidStatusError(

Очікувана дія: index.php?title=Категорія:Податкова звітність

- Validation - report_type varchar Raw-статус зберігається, створюється подія UnknownStatus. | Внутрішній статус документа змінюється.SEO title: Технічне завдання: Передача документів для звітності в податкову через Вчасно для Python

SEO keywords: Python, Вчасно, Вчасно.Звіт, Вчасно.EDO, ДПС, податкова звітність, API, XML, КЕП, електронний документообіг, технічне завдання

</noinclude>
 {{SEO
Шаблон для службового SEO-опису сторінки. 

}}


  • реалізувати background worker;
  • реалізувати періодичне оновлення версій статусів;
  • реалізувати мапінг статусів;
  • реалізувати обробку невідомих статусів. Очікувана відповідь:
  • реалізувати завантаження квитанцій;
  • реалізувати збереження PDF/XML/receipt-файлів;
  • реалізувати прив'язку файлів до документа;
  • реалізувати перегляд історії. | платформа зберігає помилку та не втрачає документ. |}

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

Як бухгалтер, } Вчасно

AC-11 Додати healthcheck інтеграції та повідомлення адміністратору. |- status varchar Внутрішній статус. Примітка
number=report.document_number,

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

  • формування документів для податкової звітності;
  • перевірку структури документа;
  • передачу документа у «Вчасно»;
  • отримання статусів документа;
  • отримання результатів обробки;
  • збереження історії передачі;
  • обробку помилок;
  • можливість повторної відправки;
  • журналювання всіх дій.
  • Прийнято;
  • Завершено;
  • Очікується обробка;
  • Передано у Вчасно. | платформа завантажує квитанцію або результат обробки. |-
PDF Візуальна форма документа.
! Статус «Вчасно»
 v
! "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
 "vchasno_status": "waiting_signature"

Приклад:

</div>

 app/

 README.md

Як користувач системи, 
[[index.php?title=Категорія:K2 ERP]]
 requires_receipt: true
8. {

* реалізувати авторизацію;
* реалізувати upload_document;
* реалізувати get_document_status;
* реалізувати download_document;
* реалізувати обробку помилок;
* реалізувати retry. | платформа повертає список помилок валідації. Внутрішній статус
 "period": "2026-Q1",
 timeout_seconds: int = 30
 status_sync_service.py
 tax_reports.py
{
5. # Чи має Python-сервіс сам формувати XML, чи отримує готовий файл з ERP? |-
| last_sync_at
| timestamp
| Дата останньої синхронізації. # Чи підпис виконується всередині «Вчасно»? |}

 file_storage.py

 "status": "SentToVchasno",

document_types:
<pre>
! |-
| Audit Logger
| Фіксує всі дії користувачів і системи. |-
| Зміна API
| Endpoint-и або формати відповіді можуть змінюватися. |-
| AC-10
| «Вчасно» повертає невідомий статус. SEO-опис

 pass

{
 file_repository.py
def send_report_to_vchasno(report_id: UUID, db: Session) -> TaxReport:
{| class="wikitable"
я хочу повторно відправити документ після помилки, 
 )
== 24. Відкриті питання ==
</pre>
Повторна відправка дозволена тільки для документів у статусах:
<pre>
 report = tax_report_repository.get_by_id(db, report_id)

4. SEO-опис
 report.status = TaxReportStatus.SENT_TO_VCHASNO
 def get_document(self, document_id: str) -> "VchasnoDocumentResponse":
|-
| id
| uuid
| Внутрішній ID документа. |}

 main.py

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

* наявність обов'язкових полів;
* коректність податкового номера;
* коректність звітного періоду;
* наявність файлу;
* допустимий формат файлу;
* розмір файлу;
* коректність імені файлу;
* наявність метаданих для «Вчасно»;
* відсутність дубля документа. | Обов'язково для MVP. | Заборонити повтор без підтвердження. |-
| Помилки авторизації
| API key здатна бути неправильним або простроченим. | Файл зберігається у файловому сховищі. |-
| created_at
| timestamp
| Дата створення. |-
| Вчасно.Звіт
| Подання звітності до податкової. |-
| size_bytes
| integer
| Розмір файлу. Передача у Вчасно
! |-
| sent_at
| timestamp
| Дата передачі у «Вчасно». |-
| created_at
| timestamp
| Дата створення. |}

 pass

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

* REST API для створення документа;
* збереження документа;
* базова валідація;
* Vchasno API Client;
* передача документа у «Вчасно»;
* збереження зовнішнього ID;
* ручний запуск синхронізації статусу;
* журнал подій;
* базова обробка помилок. 
 |
 | 2. # Викликати Vchasno API. Ризик
GET /api/v1/tax-reports/{report_id}/events
GET /api/v1/tax-reports/{report_id}
<syntaxhighlight lang="json">
[[index.php?title=Категорія:Python]]
{| class="wikitable"
 verify_ssl: bool = True
{| class="wikitable"
Очікувана відповідь:
! # Хто має доступ до API key? |-
| Validation Layer
| Перевіряє обов'язкові поля, формат та структуру документа. |-
| Rejected
| Документ відхилено.<syntaxhighlight lang="python">

! |-
| Cancelled
| Документ скасовано користувачем. Рекомендація
! | Зупинити відправку, повідомити адміністратора. Що зберігати
 vchasno/
=== Етап 4. Передача документів ===
! Тип

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

 download_receipts.py
{{DISPLAYTITLE:Технічне завдання: Передача документів для звітності в податкову через Вчасно для Python}}
'''Уточнення:''' фінальний мапінг статусів потрібно зробити після отримання офіційного довідника статусів від «Вчасно». Обов'язковість
=== 20.4. Квитанції та файли ===
=== 20.3. Статуси ===

 session.py
Рекомендована періодичність:
 vchasno_status = vchasno_client.get_document_status(
 security.py

== 27. Definition of Done ==

функції ERP застосовують, коли потрібно для автоматизації передачі документів звітності з внутрішньої системи обліку або ERP до сервісу «Вчасно» з подальшим поданням у податкову. | Виконати retry. |-
| rejected
| Rejected
| Документ відхилено. Призначення
STATUS_SYNC_INTERVAL_SECONDS=300
</pre>
Python Reporting Service
! SEO-опис
|-
| Вчасно.EDO API
| застосовується для для документообігу. Зберегти ID у локальній БД. |-
| Logging
| structlog або стандартний logging у JSON-форматі. # Де зберігати файли: локально, S3, MinIO, DMS? |}

 "document_number": "DECL-2026-0001",

! | як приклад K2 ERP або інша внутрішня платформа.</pre>

 "old_status": "SentToVchasno",

* створити FastAPI-проєкт;
* налаштувати PostgreSQL;
* створити моделі tax_reports, tax_report_events, tax_report_files;
* реалізувати конфігурацію через environment variables;
* реалізувати healthcheck endpoint. |-
| rejected_at
| timestamp
| Дата відхилення. Отримати документ з БД. Критерій

== 9. Статуси документа ==
Оскільки статуси «Вчасно» можуть повертатися числовими кодами або текстовими значеннями, у Python-сервісі необхідно реалізувати мапінг. SEO-опис

</pre>

</pre>

Validation Layer

! Критерій
 retry_count: int = 3
 api/
=== 16.1. Типи помилок ===
 tax_report_service.py
{| class="wikitable"
! return report
STATUS_SYNC_ENABLED=true

! | платформа зберігає причину відхилення. |-
| waiting_signature
| WaitingForSignature
| Очікується підпис. Отримати ID документа у «Вчасно». Очікуваний результат
<pre>

=== Етап 1. Базова структура Python-сервісу ===
=== 13.1. Логічний бізнес-процес ===

APP_ENV=production
До MVP входить:

{| class="wikitable"
 details={"vchasno_document_id": response.id},

VCHASNO_API_KEY=********
! Компонент
 entity_id=report.id,
 )
|-
| SentToVchasno
| кожні 5 хвилин
|-
| WaitingForSignature
| кожні 15 хвилин
|-
| SentToTax
| кожні 10 хвилин
|-
| WaitingForTaxReceipt
| кожні 10 хвилин
|-
| Accepted / Rejected
| не перевіряти
|}

<syntaxhighlight lang="json">

}
 entity_id=report.id,
=== 8.3. Передача документа у «Вчасно» ===

=== 11.7. Завантаження квитанцій ===
 "taxpayer_id": "1234567890",
! | Зберігати raw-статус та мати UnknownStatus. |-
| ValidationError
| Некоректні інформаційні дані документа. |-
| Vchasno Client
| Python-клієнт для роботи з API «Вчасно». |-
| file_type
| varchar
| original, signed, pdf, receipt, error_protocol. Тип
 - xml
 |
 | 5. |-
| Python-сервіс
| Інтеграційний шар між ERP та «Вчасно». Компонент

* квитанцію про отримання;
* квитанцію про прийняття;
* квитанцію про відхилення;
* підписаний документ;
* PDF-візуалізацію документа;
* технічний протокол обробки, якщо доступний. |-
| Containers
| Docker. ! |-
| КЕП
| Кваліфікований електронний підпис. def download_pdf(self, document_id: str) -> bytes:

== 28. Джерела ==
class VchasnoSettings(BaseSettings):
=== 8.2. Валідація документа ===
{| class="wikitable"
|-
| Немає відкритої API-документації для «Вчасно.Звіт»
| Публічно доступна документація здатна не покривати подання звітності до ДПС. |-
| AC-6
| API «Вчасно» повертає помилку. Отримати файл зі сховища. Критерій
1. | Не відправляти документ, показати список помилок. |-
| metadata
| object
| Ні
| Додаткові реквізити документа. |}

 title=report.title,
ДПС
FILE_STORAGE_PATH=/data/tax-reports

 health.py

 "source_system": "K2 ERP",

POST /api/v1/tax-reports/{report_id}/sync-status
 "new_status": new_status,
! Статуси / квитанції
</div>
 db/
 |
 | 7. |-
| Невідомі статуси
| «Вчасно» здатна повертати статуси, яких немає в системі. |-
| accepted_at
| timestamp
| Дата прийняття. Термін

* Python-сервіс розгортається через Docker;
* API створення документа функціонує;
* документ зберігається у БД та файловому сховищі;
* документ проходить валідацію;
* документ передається у «Вчасно»;
* зовнішній ID документа зберігається;
* статус документа оновлюється;
* помилки API обробляються;
* retry-механізм функціонує;
* журнал подій заповнюється;
* написані unit-тести для ключових сервісів;
* написані інтеграційні тести для VchasnoClient з mock API;
* документація для запуску додана в README. | Він бачить всі пов'язані файли та статуси. "status": "Generated",

<pre>
 retry_backoff_seconds: int = 5
! Критерій

 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
{| class="wikitable"
 "taxpayer_name": "ФОП Іваненко Іван Іванович",
== 11. API Python-сервісу ==
 logging.py
я хочу отримати квитанції або результат обробки документа в ERP, 
! |-
| Вчасно
| Український сервіс електронного документообігу та звітності. |}

 requires_signature: true

 v
 v
 pass
<pre>
|-
| id
| uuid
| ID події.== 2. Область сценарії використання ==
== 19. Логування та аудит ==
 details={
ERP / Accounting System
=== 7.2. Автоматичне отримання статусів ===
 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
Python-сервіс повинен приймати від ERP інформаційні дані для формування документа. |-
| AC-5
| API «Вчасно» повертає успішну відповідь.== 5. Терміни та скорочення ==
=== 18.2. Конфігурація типів документів ===

До MVP не входить:
<syntaxhighlight lang="yaml">

! Внутрішній статус

VCHASNO_RETRY_COUNT=3

 "message": "Document created"
[[index.php?title=Категорія:Інтеграції]]
Подання / підписання / обробка
core/
"document_date": "2026-04-15",
}
docker-compose.yml
  • API token / API key від «Вчасно»;
  • базовий URL API;
  • специфікацію endpoint-ів для подання звітності;
  • перелік підтримуваних типів документів;
  • формат метаданих документа;
  • правила підписання документа;
  • правила отримання статусів;
  • правила отримання квитанцій;
  • тестове середовище, якщо доступне;
  • технічний контакт з боку «Вчасно». |}
def upload_document(self, document: "DocumentPayload") -> "VchasnoDocumentResponse":

11.4. оновлення версій статусу

15.2. tax_report_events

client.py
migrations/
AC-8 Worker запускає синхронізацію. Компонент
  • розробка програмного забезпечення особистого кабінету користувача;
  • реалізація власного КЕП-провайдера;
  • заміна функціоналу «Вчасно»;
  • ручне редагування податкових форм;
  • бухгалтерська перевірка правильності сум;
  • автоматичне оновлення версій всіх форм податкової звітності;
  • інтеграційні функції ERP напряму з API Електронного кабінету ДПС. |-
updated_at timestamp Дата оновлення версій. file_name=report.file_name,

щоб не завантажувати документ вручну. | Потрібно отримати API-специфікацію від «Вчасно». # Чи потрібна технічна підтримка ФОП, юридичних осіб або обох варіантів? details={"error": str(exc)},

</syntaxhighlight>

"period": report.period,

17. Безпека

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

платформа повинна завантажувати та зберігати: reports = tax_report_repository.get_reports_for_sync() критично: фінальні endpoint-и, параметри авторизації та формат подання звітності через «Вчасно.Звіт» мають бути уточнені за офіційною API-документацією, яку надає «Вчасно» для конкретного клієнта або тарифу.