| 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:
|
; Призначення
- Отримати документ з локального сховища.; Пріоритет
"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 ClientVCHASNO_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,
|
|
|
|
| |
|