| -
|
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-документацією, яку надає «Вчасно» для конкретного клієнта або тарифу.
|
|
|