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

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

Матеріал з K2 ERP Wiki
POST /api/v1/tax-reports/{report_id}/send-to-vchasno
requires_signature: true
; Статуси / квитанції

До MVP входить: Python-сервіс повинен приймати від ERP інформаційні дані для формування документа.; |}

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

я хочу бачити журнал API-запитів і помилок,

14.1.; Фонове актуалізація

7. User Story

raise InvalidStatusError(
id uuid Реалізується в межах цього ТЗ.; | Додати healthcheck інтеграції та повідомлення адміністратору.; | Маскувати логи та обмежити доступ.; |- Generated Файл документа сформовано.; Компонент

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

main.py

11.4.; актуалізація статусу

- signed Signed - Status Sync Worker - document_number varchar Номер документа.; Поле Зупинити відправку, повідомити адміністратора.; !; Що зберігати
except Exception as exc:
  • створення Python API-клієнта для «Вчасно»;
  • створення сервісного шару для роботи з документами;
  • формування XML/PDF/JSON-документів;
  • завантаження документа у «Вчасно»;
  • передача метаданих документа;
  • отримання статусів;
  • отримання підписаних документів або квитанцій;
  • зберігання технічного журналу;
  • retry-механізм;
  • інтеграційні функціональні можливості з основною ERP / обліковою системою.; |}
v
def upload_document(self, document: "DocumentPayload") -> "VchasnoDocumentResponse":
  • наявність обов'язкових полів;
  • коректність податкового номера;
  • коректність звітного періоду;
  • наявність файлу;
  • допустимий формат файлу;
  • розмір файлу;
  • коректність імені файлу;
  • наявність метаданих для «Вчасно»;
  • відсутність дубля документа.; характеристика
- document_number string Так - ERP / облікова платформа Джерело даних для формування документів.; Тип

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

title: "Декларація платника єдиного податку"
; Поле

APP_ENV=production </syntaxhighlight> }

index.php?title=Категорія:K2 ERP

workers/
details={"vchasno_document_id": response.id}, я хочу бачити актуальний статус документа, file_bytes = file_storage.read(report.file_path) audit_logger.log( api_key: str index.php?title=Категорія:Інтеграції
) "metadata": { 5.;{{SEO


  • додати Dockerfile;
  • додати docker-compose;
  • додати structured logging;
  • додати metrics;
  • додати alerting;
  • додати rate limiting;
  • додати security review.; |-
Передача у «Вчасно» - report_type varchar Тип звіту.; # Хто має доступ до API key?;=== 12.3.; Конфігурація клієнта ===
  • реалізувати endpoint send-to-vchasno;
  • зберігати vchasno_document_id;
  • оновлювати статуси;
  • логувати API-взаємодію.; Тип
)
  • зберігання API key тільки у змінних середовища або secret storage;
  • заборону логування API key;
  • маскування персональних даних у технічних логах;
  • контроль доступу до документів;
  • контроль доступу до квитанцій;
  • журналювання всіх операцій;
  • шифрування файлів у сховищі, якщо це передбачено політикою безпеки;
  • HTTPS для всіх API-запитів;
  • перевірку SSL-сертифіката;
  • обмеження доступу до адміністративних endpoint-ів.; |-
period varchar Звітний період.; Зберегти ID у локальній БД.; Як бухгалтер,

23.; Ризики

client.py

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

- SentToVchasno платформа повертає список помилок валідації.; |- WaitingForSignature Документ очікує підписання.; Спосіб

def sync_pending_reports() -> None:

Створення документа }
core/
payload = DocumentPayload(
  • квитанцію про отримання;
  • квитанцію про прийняття;
  • квитанцію про відхилення;
  • підписаний документ;
  • PDF-візуалізацію документа;
  • технічний протокол обробки, якщо доступний.; Передача у Вчасно

20.2.; Передача у «Вчасно»

20. Acceptance Criteria

- Персональні інформаційні дані Документи можуть містити РНОКПП, ЄДРПОУ, фінансові інформаційні дані.; характеристика class="wikitable"

Vchasno API Client

{
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
=== 15.1. tax_reports ===
!; |-
| created_at
| timestamp
| Дата події.; |-
| file_type
| varchar
| original, signed, pdf, receipt, error_protocol.; |-
| XML
| Формат електронного документа звітності.; |-
| Migrations
| Alembic.; 
POST /api/v1/tax-reports/{report_id}/validate
 README.md
!; |-
| error
| Failed
| Помилка обробки.; характеристика

я хочу повторно відправити документ після помилки, 

 pass
 download_receipts.py
<pre>
!; )

* помилок валідації;
* неправильного API key;
* відсутності прав доступу;
* відхилення документа податковою;
* дублювання документа.; |-
| AC-7
| Документ вже був переданий.; |-
| Вчасно
| Український сервіс електронного документообігу та звітності.; інформаційні дані для звітності
 config.py
платформа повинна логувати:
 |
 | 2.; |-
| AC-2
| Передано файл документа.; tax_report_repository.py

!; подання: «Вчасно.Звіт» забезпечується через # Який саме сервіс застосовується; додатково реалізовано «Вчасно.EDO» чи окрема партнерська API-інтеграція?; характеристика
 def download_pdf(self, document_id: str) -> bytes:
 "old_status": "SentToVchasno",
|-
| Python-сервіс
| Окремий сервіс або компонент, який виконує інтеграцію з «Вчасно».; |-
| Polling
| Періодичне опитування API для отримання статусів.; |-
| taxpayer_name
| string
| Так
| Назва компанії або ПІБ ФОП.; |-
| accepted
| Accepted
| Документ прийнято.; # Чи потрібна супровід ФОП, юридичних осіб або обох варіантів?; актуалізація статусу
[[index.php?title=Категорія:Технічні завдання]]
ERP / Accounting System
!; Внутрішній статус
платформа повинна завантажувати та зберігати:
 v
!; '''Уточнення:''' фінальний мапінг статусів потрібно зробити після отримання офіційного довідника статусів від «Вчасно».; Подія

Метою задачі є собою створення Python-модуля / Python-сервісу для передачі документів податкової звітності через сервіс «Вчасно».; Ризик
 logging.py
== 28.; Джерела ==
=== 20.1.; Створення документа ===
=== 8.1.; Формування документа ===
 entity_id=report.id,
 "source_system": "K2 ERP",
 try:
 api/
функціональні можливості застосовують, коли потрібно для автоматизації передачі документів звітності з внутрішньої системи обліку або ERP до сервісу «Вчасно» з подальшим поданням у податкову.; |-
| HTTP client
| httpx.; |-
| Audit Logger
| Фіксує всі дії користувачів і системи.; Отримати файл зі сховища.; |-
| Accepted
| Документ прийнято.; security.py
Retry застосовується для:
|-
| API Layer
| REST API для прийому запитів від ERP або інших систем.; Як зменшити
== 9.; Статуси документа ==
 pass

 "status": "SentToVchasno",

{
 tax_reports.py
 requires_receipt: true

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

=== 20.3.; Статуси ===

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

 date=report.document_date,

 report.vchasno_document_id
}

Python Reporting Service

status_sync_service.py
taxpayer_id string Так - Signed Документ підписано.; Формування XML / PDF / JSON

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

 |
 | 3.; |-
| SentToTax
| Документ передано до податкової.; |-
| Failed
| Виникла технічна помилка.; |}

!; Рекомендація

!; |-
| Помилка API
| HTTP-код, тіло відповіді, correlation ID.; | Виконати retry.; |-
| Недоступність сервісу
| «Вчасно» або мережа можуть бути недоступні.; # Чи потрібно робити UI, чи тільки backend API?; # Підготувати файл та метадані.; Тип
 vchasno/
!; характеристика

</syntaxhighlight>
# Чи надає «Вчасно» endpoint саме для подання звітності до ДПС?; Внутрішній статус

 },
 requires_signature: true
!; # Чи підпис виконується всередині «Вчасно»?; |-
| AC-13
| користувач системи відкриває картку документа.; |-
| content_type
| varchar
| MIME-тип.; Критерій

 "period": report.period,

 docker-compose.yml
 routes/
 },
|-
| Python
| 3.11 або вище.; |-
| Logging
| structlog або стандартний logging у JSON-форматі.; |-
| PDF
| Візуальна форма документа.; report.vchasno_document_id = response.id

* розробка програмного забезпечення особистого кабінету користувача;
* реалізація власного КЕП-провайдера;
* заміна функціоналу «Вчасно»;
* ручне редагування податкових форм;
* бухгалтерська перевірка правильності сум;
* автоматичне актуалізація всіх форм податкової звітності;
* інтеграційні функціональні можливості напряму з API Електронного кабінету ДПС.; - xml

 title=report.title,

Очікувана відповідь:
Retry не застосовується для:
платформа повинна підтримувати два способи актуалізація статусів:
}

</syntaxhighlight>
</div>
<pre>
== 18.; конфігурація ==
!; |}

</syntaxhighlight>

Як адміністратор, 

4.; |-
| Webhook
| Механізм отримання подій від зовнішньої системи.; # Чи є собою webhook-и для статусів?; !; Підготувати метадані.; !; | платформа надає можливість передачу у «Вчасно».; №

{
</div>
=== 6.1.; Загальна схема ===
 "status": "ReadyToSend",
== 24.; Відкриті питання ==
!; |-
| taxpayer_name
| varchar
| Назва платника.;=== 8.4.; Отримання статусів ===

{| class="wikitable"
 tests/
 "vchasno_document_id": "external-document-id",
VCHASNO_RETRY_COUNT=3
 )
- VchasnoTimeoutError - Невідомі статуси - id uuid - API платформа зберігає причину відхилення.;</syntaxhighlight>

Етап 7.; Production hardening

ValidationError - size_bytes integer Розмір файлу.; Очікуваний результат

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

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

* API token / API key від «Вчасно»;
* базовий URL API;
* специфікацію endpoint-ів для подання звітності;
* перелік підтримуваних типів документів;
* формат метаданих документа;
* правила підписання документа;
* правила отримання статусів;
* правила отримання квитанцій;
* тестове середовище, якщо доступне;
* технічний контакт з боку «Вчасно».; # Чи є собою тестове середовище?;=== 11.1.; Створення документа ===

* реалізувати авторизацію;
* реалізувати upload_document;
* реалізувати get_document_status;
* реалізувати download_document;
* реалізувати обробку помилок;
* реалізувати retry.; Викликати VchasnoClient.upload_document().; Отримати документ з БД.; # Який формат документів передається: XML, PDF, ZIP, JSON?; |-
| Cancelled
| Документ скасовано користувачем.; |-
| Завантаження квитанції
| Тип файлу, назва, дата.; {| class="wikitable"

* webhook-інтеграція;
* повна автоматизація процесів подання у ДПС без участі «Вчасно»;
* власний компонент КЕП;
* складний UI;
* автоматичне актуалізація XSD;
* супровід всіх типів звітності.; |-
| document_date
| date
| Так
| Дата документа.; POST /api/v1/tax-reports/{report_id}/sync-status
def send_report_to_vchasno(report_id: UUID, db: Session) -> TaxReport:
 "file_content_base64": "BASE64_XML_CONTENT",

 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",

<syntaxhighlight lang="json">
!; №
VCHASNO_RETRY_COUNT=3
|-
| Немає відкритої API-документації для «Вчасно.Звіт»
| Публічно доступна документація має змогу не покривати подання звітності до ДПС.; allowed_formats:

!; !; | платформа зберігає помилку та не втрачає документ.; |}

<syntaxhighlight lang="yaml">

 health.py

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

"errors": []

}

session.py
uploaded SentToVchasno - ReadyToSend як ілюстрація K2 ERP або інша внутрішня платформа.; |- accepted_at timestamp Дата прийняття.; Записати подію в журнал.; - report_id uuid - DB - FileStorageError Зафіксувати помилку, повідомити адміністратора.; |- ValidationError Заборонити повтор без підтвердження.;
  • створити FastAPI-проєкт;
  • налаштувати PostgreSQL;
  • створити моделі tax_reports, tax_report_events, tax_report_files;
  • реалізувати конфігурацію через environment variables;
  • реалізувати healthcheck endpoint.; |-
report_type string Так - Помилки авторизації API key має змогу бути неправильним або простроченим.;=== 8.2.; Валідація документа ===

{ щоб розуміти, чи документ передано, підписано, прийнято або відхилено.; Компонент


 pass

'''істотно:''' фінальні endpoint-и, параметри авторизації та формат подання звітності через «Вчасно.Звіт» мають бути уточнені за офіційною API-документацією, яку надає «Вчасно» для конкретного клієнта або тарифу.; services/
=== 11.5.; Отримання документа ===
{| class="wikitable"
 title: "Запит до податкової"
|-
| AC-11
| Документ прийнято.; |-
| Vchasno Client
| Python-клієнт для роботи з API «Вчасно».; | Перевіряти vchasno_document_id перед відправкою.; |-
| document_date
| date
| Дата документа.; |-
| new_status
| varchar
| Новий статус.; |-
| Background jobs
| Celery, RQ або APScheduler.; |-
| sent
| SentToTax
| Документ передано далі.; |-
| Containers
| Docker.; pass
{| class="wikitable"
 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
== 8.; Функціональні вимоги ==
 file_name=report.file_name,
Як бухгалтер, 
 "file_format": "xml",
 def send_for_signature(self, document_id: str) -> "VchasnoDocumentResponse":

 pyproject.toml
 f"Report {report_id} cannot be sent from status {report.status}"
=== 15.3. tax_report_files ===
{
=== 18.1.; Змінні середовища ===
 tax_request:
 new_status = status_mapper.map_vchasno_status(vchasno_status)
<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">

'''Технічний стек:''' Python 3.11+, FastAPI або окремий background-service, PostgreSQL, Celery/RQ/APScheduler, requests/httpx, Pydantic, SQLAlchemy, Docker.; характеристика
== 4.; Передумови ==
 "message": "Document sent to Vchasno"
document_types:
 migrations/

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

=== Етап 5.; Синхронізація статусів ===
VCHASNO_BASE_URL=https://edo.vchasno.ua/api/v2
!; |-
| Зміна API
| Endpoint-и або формати відповіді можуть змінюватися.; |-
| event_type
| varchar
| Тип події.; |-
| Receipt Loader
| Завантажує квитанції або результати обробки.; |-
| WaitingForTaxReceipt
| Очікується квитанція або результат обробки.; |}

 status_mapper.py

 def reject_document(self, document_id: str, reason: str) -> "VchasnoDocumentResponse":

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

}

 if report.status != TaxReportStatus.READY_TO_SEND:
 app/
ДПС
 entity_id=report.id,
|-
| AC-8
| Worker запускає синхронізацію.; Критерій
VCHASNO_RETRY_BACKOFF_SECONDS=5
<pre>

!; |-
| AC-5
| API «Вчасно» повертає успішну відповідь.; |-
| Вчасно.Звіт
| Подання звітності до податкової.; | Завантаження, підписання, статуси, скачування документів.; Статус документа
 pass
 vchasno_status = vchasno_client.get_document_status(
== 17.; Безпека ==
== 13.; Передача документа у «Вчасно» ==

 "document_date": "2026-04-15",

<pre>
 v
 sync_statuses.py

Приклад:

=== Етап 6.; Квитанції та результати обробки ===
 )
 if new_status != report.status:

FILE_STORAGE_PATH=/data/tax-reports

 v
 report.sent_at = datetime.utcnow()
 for report in reports:

{| class="wikitable"

 )

 number=report.document_number,

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

 verify_ssl: bool = True
=== 7.5.; Технічний аудит ===
{| class="wikitable"
 allowed_formats:

 report = tax_report_repository.get_by_id(db, report_id)
<syntaxhighlight lang="python">

=== 16.1.; Типи помилок ===
 details={"error": str(exc)},

 timeout_seconds: int = 30
=== 18.2.; Конфігурація типів документів ===

=== 12.2.; Основні методи ===
 "old_status": report.status,

=== Етап 3.; Vchasno API Client ===
=== 15.2. tax_report_events ===

'''Головна ідея:''' розробити Python-сервіс, який формує, перевіряє, передає та контролює документи для податкової звітності через інтеграцію з сервісами «Вчасно».; |-
| Повторна відправка
| Причина, користувач системи, дата.; |-
| updated_at
| timestamp
| Дата актуалізація.; Перевірка документа
 db/
tax_reporting_service/
 |
 | 4.; |-
| old_status
| varchar
| Попередній статус.; Як користувач системи, 
== 5.; Терміни та скорочення ==
!;</syntaxhighlight>

VCHASNO_TIMEOUT_SECONDS=30
 event_type="STATUS_SYNC_FAILED",
<syntaxhighlight lang="json">
|-
| Draft
| Документ створено, але ще не готовий до передачі.; Поле
 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
 response = vchasno_client.upload_document(payload)
|-
| SentToVchasno
| кожні 5 хвилин
|-
| WaitingForSignature
| кожні 15 хвилин
|-
| SentToTax
| кожні 10 хвилин
|-
| WaitingForTaxReceipt
| кожні 10 хвилин
|-
| Accepted / Rejected
| не перевіряти
|}

DATABASE_URL=postgresql+psycopg://user:password@db:5432/reports

Приклад логічного endpoint-а Python-сервісу:
def download_receipts(self, document_id: str) -> list [bytes]:

index.php?title=Категорія:Вчасно

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

щоб оперативно знаходити причину проблеми.; Тип помилки

- title varchar - created_at timestamp Дата створення.; # Записати подію в журнал.; "created_by": "user@example.com"
"taxpayer_name": "ФОП Іваненко Іван Іванович",
def download_original(self, document_id: str) -> bytes:
; Призначення
  1. Отримати документ з локального сховища.; Пріоритет
 "period": "2026-Q1",
 "report_type": "single_tax_declaration",
 receipt_service.py
!; |-
| Storage Layer
| Зберігає документи, статуси, квитанції та логи.; POST /api/v1/tax-reports/{report_id}/download-receipts

* Прийнято;
* Завершено;
* Очікується обробка;
* Передано у Вчасно.; |-
| VchasnoAuthError
| Помилка авторизації у «Вчасно».; |-
| sent_at
| timestamp
| Дата передачі у «Вчасно».; # Який SLA по оновленню статусів?; |-
| payload
| jsonb
| Технічні інформаційні дані події.; |-
| status
| varchar
| Внутрішній статус.;== 22.; Етапи реалізації ==
 v
 event_type="STATUS_CHANGED",
<syntaxhighlight lang="json">
!;[[index.php?title=Категорія:Податкова звітність]]

!; # Викликати Vchasno API.; |}

 "report_type": report.report_type,

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

* REST API для створення документа;
* збереження документа;
* базова валідація;
* Vchasno API Client;
* передача документа у «Вчасно»;
* збереження зовнішнього ID;
* ручний запуск синхронізації статусу;
* журнал подій;
* базова обробка помилок.; |-
| file_name
| varchar
| Назва файлу.;== 21. MVP ==
я хочу отримати квитанції або результат обробки документа в ERP, 

!; Приклад тіла запиту:
 "taxpayer_id": report.taxpayer_id,
 "new_status": new_status,
</pre>
== 3.; Джерела інтеграції ==
=== 7.1.; Передача документа у Вчасно ===

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

{| class="wikitable"
!; base_url: str

* реалізувати створення документа;
* реалізувати збереження файлу;
* реалізувати валідацію;
* реалізувати статуси;
* реалізувати журнал подій.; Дія системи
!; |-
| created_by
| varchar
| користувач системи або system.; | платформа не створює дубль без окремого підтвердження.; | Використовувати retry та чергу задач.; |-
| КЕП
| Кваліфікований електронний підпис.; # Чи потрібно отримувати квитанції з ДПС через «Вчасно»?; |-
| created_at
| timestamp
| Дата створення.; | Обов'язково для MVP.; | Файл зберігається у файловому сховищі.; Приклад змінних середовища:

 file_repository.py
 tax_report_service.py
=== 13.2.; Приклад Python-логіки ===
class VchasnoClient:
|-
| Вчасно.EDO API
| застосовується для документообігу.; Примітка
Оскільки статуси «Вчасно» можуть повертатися числовими кодами або текстовими значеннями, у Python-сервісі необхідно реалізувати мапінг.; |-
Дублювання документів - rejected_at timestamp Дата відхилення.; Компонент

STATUS_SYNC_ENABLED=true

Перед передачею у «Вчасно» платформа повинна перевірити: Очікувана відповідь: До MVP не входить:

def get_document(self, document_id: str) -> "VchasnoDocumentResponse":
file_storage.py

До області задачі не входить у першій версії:

ERP / Accounting System платформа повинна забезпечити: - pdf

12. Vchasno API Client

VCHASNO_API_KEY=********

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

Python-сервіс повинен мати метод для завантаження документа у «Вчасно».; №

8.3.; Передача документа у «Вчасно»

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

- AC-6 API «Вчасно» повертає помилку.; Критерій
Polling - error_message text Остання помилка.; Очікуваний результат Повторна відправка не дозволена для статусів: щоб не створювати документ вручну заново.; | платформа завантажує квитанцію або результат обробки.; Отримати ID документа у «Вчасно».; характеристика STATUS_SYNC_INTERVAL_SECONDS=300

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

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


 audit_logger.log(
== 14.; Робота зі статусами ==
{| class="wikitable"

2.; |-
| file_path
| varchar
| Шлях до файлу.; |-
| Webhook
| Отримання подій від «Вчасно», якщо підтримується.; |}

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

class VchasnoSettings(BaseSettings):
Очікувана дія:
VCHASNO_TIMEOUT_SECONDS=30
=== 7.4.; Повторна відправка ===
|-
| id
| uuid
| ID події.; def get_document_status(self, document_id: str) -> "VchasnoStatusResponse":

!; |-
| AC-3
| Передано некоректні інформаційні дані.; # Оновити статус документа.; характеристика
== 27. Definition of Done ==
<pre>
Задача вважається завершеною, якщо:
 storage/
!; Подання / підписання / обробка
 exceptions.py
!;<syntaxhighlight lang="json">
!; |-
| Document Builder
| Формує документ звітності у потрібному форматі.; |-
| ORM
| SQLAlchemy.; |}

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

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

 "document_number": "DECL-2026-0001",
 "message": "Document created"
== 10.; Мапінг статусів «Вчасно» ==
 return report
|-
| AC-1
| ERP передає інформаційні дані документа у Python-сервіс.; |-
| Вчасно.Звіт
| Сервіс для ведення ФОП та подання звітності.; |-
| VchasnoApiError
| API повернув помилку.; | Інкапсулювати API в окремому VchasnoClient.; |-
| AC-10
| «Вчасно» повертає невідомий статус.; |-
| file_content
| binary / base64
| Так
| Вміст документа.; |-
| vchasno_document_id
| varchar
| ID документа у «Вчасно».; db.commit()

* реалізувати background worker;
* реалізувати періодичне актуалізація статусів;
* реалізувати мапінг статусів;
* реалізувати обробку невідомих статусів.; |-
| period
| string
| Так
| Звітний період.; | Не відправляти документ, показати список помилок.;

6.; | Raw-статус зберігається, створюється подія UnknownStatus.; |-

Tests - Вчасно.EDO Сервіс електронного документообігу.; Критерій
tax_report_repository.update_status(report.id, new_status)

9.; Оновити статус на SentToVchasno.; |}

v
Dockerfile
integrations/
validation_service.py

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

AC-4 Зберегти raw-статус, позначити як Failed або Unknown.; |- Валідація Результат, список помилок.; Статус «Вчасно»
"vchasno_status": "waiting_signature"
single_tax_declaration:
"taxpayer_id": "1234567890",

платформа повинна мати background worker, який періодично оновлює статуси документів.; !; Перевірити, що документ має статус ReadyToSend.; |}

 retry_backoff_seconds: int = 5
<pre>

 v

VCHASNO_API_KEY=********

Для реалізації задачі необхідно отримати:
 file_content=file_bytes,
7.; | Отримати офіційну API-специфікацію від «Вчасно».; | Опційно.; |-
| StatusMappingError
| Невідомий статус від «Вчасно».; |-
| Validation
| Pydantic.; |-
| Python-сервіс
| Інтеграційний шар між ERP та «Вчасно».; Очікуваний результат
 "new_status": "WaitingForSignature",

POST /api/v1/tax-reports

Validation Layer
Python Reporting Service
!; Інтервал перевірки
=== 8.5.; Отримання квитанцій ===

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

 details={
 repositories/
це Python-клас або пакет, який інкапсулює роботу з API «Вчасно» виступає ключовою рисою Vchasno API Client.; | У системі створюється запис tax_reports.; |-
| актуалізація статусу
| Старий статус, новий статус, raw-статус «Вчасно».; # Перевірити статус документа.; Поле
щоб мати підтвердження подання звітності.; | Записати відповідь API, дозволити повтор.; |-
| DuplicateDocumentError
| Документ вже був переданий.; Вчасно
 retry_count: int = 3

== 2.; Область сфера застосування ==
 "id": "9ddaa913-03a3-4e11-a90a-582adf8a05ff",
 event_repository.py
{| class="wikitable"

</pre>

 - xml
 audit_logger.log(
 metadata={
GET /api/v1/tax-reports/{report_id}/events
 pass
[[index.php?title=Категорія:Python]]
Рекомендована періодичність:
!;=== Етап 2.; Робота з документами ===

 requires_receipt: true
 models.py
== 1.; Мета ==

<pre>

RECEIPT_DOWNLOAD_ENABLED=true
== 26.; Технічні вимоги до Python ==
 pass
!; {| class="wikitable"
 "status": "Generated",
=== 13.1.; Логічний бізнес-процес ===
</pre>
{{DISPLAYTITLE:Технічне завдання: Передача документів для звітності в податкову через Вчасно для Python}}
!; |-
| report_id
| uuid
| ID документа.; характеристика

 event_type="SENT_TO_VCHASNO",
!; |-
| rejected
| Rejected
| Документ відхилено.; # Де зберігати файли: локально, S3, MinIO, DMS?; # Чи потрібно підписувати документ до передачі у «Вчасно»?; | Внутрішній статус документа змінюється.; | Він бачить всі пов'язані файли та статуси.; |-
| file_name
| varchar
| Назва файлу.; характеристика

* Помилка передачі;
* Відхилено;
* Не доставлено;
* Потребує повторної відправки.; |-
| metadata
| object
| Ні
| Додаткові реквізити документа.; | Зберігати raw-статус та мати UnknownStatus.; |-
| Sending
| Документ передається у «Вчасно».; Обов'язковість

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

Як користувач системи ERP, 
 reports = tax_report_repository.get_reports_for_sync()
- file_format varchar - taxpayer_id varchar } ; entity_id=report.id, я хочу сформувати документ звітності та передати його у «Вчасно», 8.; report.status = TaxReportStatus.SENT_TO_VCHASNO </syntaxhighlight> schemas.py 1.; |- waiting_signature WaitingForSignature - file_format string Так - Web framework Статуси документів оновлюються автономно.; характеристика

7.2.; Автоматичне отримання статусів

<syntaxhighlight lang="python"> exceptions.py unit/

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

VCHASNO_BASE_URL=https://edo.vchasno.ua/api/v2 * формування документів для податкової звітності; * перевірку структури документа; * передачу документа у «Вчасно»; * отримання статусів документа; * отримання результатів обробки; * збереження історії передачі; * обробку помилок; * можливість повторної відправки; * журналювання всіх дій.; |-
last_sync_at timestamp - ДПС - file_path varchar Шлях до файлу у сховищі.; До області задачі входить: * https://vchasno.ua/integration/ * https://help.vchasno.com.ua/integration/ * https://www.postman.com/vchasnoapi/vchasno-edo-public-api/documentation/urluvz0/vchasno-edo-public-api * https://zvit.vchasno.ua/ * https://kasa.vchasno.com.ua/vchasno-zvit } * Python * FastAPI * K2 ERP * Податкова звітність * Вчасно * Вчасно.Звіт * Вчасно.EDO * ДПС * КЕП * API інтеграція Повторна відправка дозволена тільки для документів у статусах: integration/ - Validation Layer - Rejected 7.; Очікуваний результат POST /api/v1/tax-reports/{report_id}/send-to-vchasno } щоб не завантажувати документ вручну.; Термін - pdf } 3.; |- AC-9 У документі зберігається vchasno_document_id.; | Потрібно отримати API-специфікацію від «Вчасно».; Тип

Див.; 29.; додатково

16.2.; Retry-логіка

"vchasno_status": vchasno_status.raw_status,