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

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

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

db=db,

GET /api/v1/fiscal/receipts/{receipt_id}

task_name="fiscalize_receipt",

! Очікуваний результат

receipt.raw_response = response.raw_payload
|
| 2. "price": 250.00,
idempotency_key=command.idempotency_key,

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

  • прийом замовлень, продажів або оплат із зовнішньої системи;
  • створення фіскального чека;
  • створення чека повернення;
  • контроль відкриття касової зміни;
  • контроль закриття касової зміни;
  • формування X-звіту;
  • формування Z-звіту;
  • отримання статусів чеків;
  • збереження фіскальних номерів;
  • збереження посилання на чек або PDF/HTML-візуалізацію, якщо доступна;
  • відправку електронного чека покупцю, якщо підтримується API або налаштуваннями сервісу;
  • журналювання всіх API-запитів;
  • повторну обробку помилкових операцій;
  • захист від дублювання чеків;
  • передачу статусів назад в ERP / CRM / сайт / POS. audit_logger.log(

|- | Фіскалізація продажу | Високий | базовий бізнес-процес. Метою задачі виступає як створення Python-сервісу для інтеграції з «Вчасно.Каса» з метою автоматизації фіскалізації продажів, повернень і касових операцій. |- | total_amount | decimal | Загальна сума чека. |- | Cashier | Касир, від імені якого виконується операційна дія. |- | created_at | timestamp | Дата створення. Статус

Критично критично: повторний запит із тим самим idempotency_key не повинен створити другий фіскальний чек. |- | fiscalized_at | timestamp | Дата фіскалізації. def open_shift(self, cash_register_id: str, cashier_id: str) -> "ShiftResponse":

  • реалізувати створення чеків;
  • реалізувати валідацію;
  • реалізувати дедублікацію;
  • реалізувати чергу;
  • реалізувати worker фіскалізації. |-

| конкурентні переваги | Можливість роботи з POS-пристроями, принтерами, локальною інфраструктурою. Поле

Етап 6. Зміни та звіти

db.commit()

|- | ValidationError | Некоректні інформаційні дані чека. |}

! # Який SLA по фіскалізації? Статус ! SEO-опис ! | платформа створює чек повернення. |- | Успішна фіскалізація | fiscal_number, fiscal_url, дата. Компонент

from pydantic_settings import BaseSettings

"status": "PENDING",

13. Vchasno Kasa Client

base_url: str

! Призначення

8.5. Відкриття зміни

pass
def create_x_report(self, shift_id: str) -> "XReportResponse":
def get_receipt_status(self, receipt_id: str) -> "ReceiptStatusResponse":
7. Подія </syntaxhighlight>

17.5. fiscal_receipt_items

22. Безпека

Підходить для Хмарних ERP, CRM, інтернет-магазинів, SaaS-систем. Очікуваний результат - API Event Технічна подія інтеграції. № - unit varchar - Shift Service - shift_id uuid - Refund Service }

21.3. Список проблемних операцій

def fiscalize_receipt(receipt_id: UUID, db: "Session") -> None:

Критично критично: інтеграційні функції ERP з ПРРО не повинна втрачати чеки. | Заборонити фіскалізацію. |}

v

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

  • акаунт у «Вчасно.Каса»;
  • зареєстрований суб'єкт господарювання;
  • зареєстровану торгову точку;
  • зареєстрований ПРРО;
  • зареєстрованого касира;
  • активний доступ до API або Device Manager;
  • токен інтеграції;
  • тестову касу або тестовий режим, якщо доступний;
  • перелік кас, які будуть використовуватись;
  • перелік касирів;
  • правила відкриття і закриття зміни;
  • правила формування чеків;
  • правила повернень;
  • формат оплати;
  • формат товарних позицій;
  • формат податків і ставок;
  • вимоги до відправки електронного чека покупцю. |-
entity_id uuid - payload jsonb Технічні інформаційні дані. Тип

8.1. конфігурація інтеграції

Канали:

- Основні операції Створення чеків, повернень, отримання статусів, робота з касами. * інтернет-магазинів;
  • POS-систем;
  • CRM;
  • ERP;
  • служб доставки;
  • маркетплейсів;
  • сервісів підписок;
  • систем обліку продажів;
  • компаній, які хочуть цифровізувати фіскалізацію оплат. |-
entity_type varchar receipt, shift, integration. SEO-опис - cashier_id string Ні - old_status varchar - Fiscal Status - Z Report - tax_group varchar Податкова група.
organization_id: str | None = None

7. User Story

17.4. fiscal_receipts

db=db,
Черга, retry, статус NEEDS_RETRY. |}

Як платформа продажів,

Етап 8. Production hardening

Очікуваний результат Зберегти raw-відповідь, перевести в NEEDS_RETRY або ERROR. KPI
"raw_request": command.model_dump(),
def get_shift_status(self, shift_id: str) -> "ShiftStatusResponse":

[[Категорія:Python]]

 receipt = receipt_repository.create(

{| class="wikitable"
! |-
| style="background:#ffcc80;" | Помаранчевий
| #ffcc80
| Потрібна дія або повтор. інформаційні дані проходять валідацію. |-
| quantity
| numeric
| Кількість. Задача додається в чергу. |}

! ! {| class="wikitable"

pass
payload = receipt_mapper.to_vchasno_payload(receipt, shift)

ДПС

До першої версії не входить:

- Автоматичне відкриття платформа відкриває зміну перед першим чеком. Коментар
  • реалізувати відкриття зміни;
  • реалізувати закриття зміни;
  • реалізувати X-звіт;
  • реалізувати контроль незакритих змін. sha256(external_order_id + total_amount + payment_id + cash_register_id)

POST /api/v1/fiscal/shifts/{shift_id}/x-report

Критерій
fiscal_queue.enqueue(
"phone": "+380501112233"
"unit": "шт"
Критерій
"name": "Доставка",
"total_amount": 570.00,
Помилка

VCHASNO_KASA_DEFAULT_CASH_REGISTER_ID=cash-register-001

|-
| AC-9
| користувач системи створює повернення. |-
| items
| array
| Позиції, які повертаються. | платформа показує AuthError і не виконує фіскалізацію. | Вони підсвічуються помаранчевим. |-
| payments
| array
| Сума повернення. | style="background:#ef9a9a;" | Червоний
|-
| Потребує повтору
| NEEDS_RETRY
| Можна повторити відправку. | платформа блокує операцію. | style="background:#eeeeee;" | Сірий
|-
| Відкривається
| OPENING
| Виконується відкриття зміни. retry_backoff_seconds: int = 5
4. | Python-сервіс напряму з ДПС у MVP не функціонує. SEO-опис

{| class="wikitable"
!<pre>

 v
! | style="background:#c8e6c9;" | Зелений
|-
| Помилка фіскалізації
| FISCALIZATION_ERROR
| Виникла помилка при фіскалізації. |-
| style="background:#f3e5f5;" | Фіолетовий
| #f3e5f5
| Повернення або спеціальна операційна дія. Колір
{| class="wikitable"
! Час
! Поле

! | Чек переходить у NEEDS_RETRY. |-
| Device Manager
| Локальний або інтеграційний застосунок для роботи з ПРРО, POS-пристроями та фіскалізацією. |-
| closed_at
| timestamp
| Дата закриття. SEO-опис
{| class="wikitable"
платформа повинна:
from uuid import UUID
! | Заборонити повернення. |-
| organization_id
| string
| Так
| Внутрішній ID організації. Тип задачі
! SEO-опис
я хочу створити чек повернення, 

! |-
| RefundLimitError
| Сума повернення перевищує доступний залишок. |-
| payment_type
| varchar
| cash, card, online, mixed. SEO-опис
{| class="wikitable"
<pre>

VCHASNO_KASA_DEFAULT_CASHIER_ID=cashier-001
Окремо варто відзначити який інтегрує ERP / CRM / інтернет-магазин / POS-систему з «Вчасно. |-
| Повернення
| первинний чек, сума, причина. | платформа повертає успішний або помилковий статус. Тип помилки

Python Fiscal Service
! Призначення
</div>
=== 8.9. Відправка чека покупцю ===

{| class="wikitable"
! | style="background:#f3e5f5;" | Спеціальні операції
|-
| Незакриті зміни
| Каси з відкритими змінами. |-
| amount
| numeric
| Сума оплати. | платформа формує Z-звіт. |-
| AC-2
| Адміністратор перевіряє підключення. |-
| Невірні суми
| Сума товарів не відповідає оплатам. Приклад змінних середовища:

* реалізувати клієнт ERP API;
* реалізувати авторизацію;
* реалізувати open_shift;
* реалізувати close_shift;
* реалізувати create_receipt;
* реалізувати create_refund_receipt;
* реалізувати get_status;
* реалізувати обробку помилок. SEO-опис
VCHASNO_KASA_RETRY_COUNT=3
|-
| id
| uuid
| Внутрішній ID каси. | Довідник tax_group і валідація. |}

<syntaxhighlight lang="json">

db=db,

13.1. Призначення

7.1. Фіскалізація продажу

AC-4 - receipt_id uuid - Жовтий #fff9c4 - Фізичні магазини - Audit Logger - Єдиний dashboard }
payload={"external_order_id": command.external_order_id},
Черга чеків, pending-операції. |- name varchar - payments array - external_payment_id - status varchar - AC-11 - reason string - auto_close_shift boolean Ні - currency varchar - cash_register_id string Так class="wikitable"
  • реалізувати чек повернення;
  • перевірити доступний залишок повернення;
  • зв'язати повернення з первинним чеком. |-
discount_amount numeric }

я хочу бачити, чи відкрита касова зміна,

VCHASNO_KASA_TIMEOUT_SECONDS=30

"tax_group": "VAT_20",

13.3. Конфігурація клієнта

Хмарні продажі та реалізація style="background:#eeeeee;" | Сірий
Очікує фіскалізації PENDING Dashboard, список чеків, касові зміни. |- status varchar - Receipt Item - organization_id varchar - fiscal_operation_type string }

20. Обробка помилок

)
}
style="background:#bbdefb;" | Блакитний
Закрита CLOSED_WITH_Z_REPORT - cashier_id string - Синхронізація статусів Середній Підходить для хмарних систем. HTML

24. Acceptance Criteria

id uuid style="background:#bbdefb;" | Блакитний
Фіскалізовано FISCALIZED Чек успішно фіскалізовано. Каса

щоб контролювати фіскалізацію, помилки, повернення і незакриті зміни. | Зупинити інтеграцію, повідомити адміністратора. Тип

4. SEO-опис
receipt.error_message = str(exc)

25. MVP

Чеків створено Загальна кількість чеків за період. Код
Ручне відкриття користувач системи або адміністратор відкриває зміну. ) - Втрата чека API недоступне під час продажу. },
  • email;
  • SMS;
  • Viber;
  • інший канал, якщо підтримується сервісом. |}

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

Технічний стек: Python 3.11+, FastAPI, PostgreSQL, SQLAlchemy, Alembic, httpx, Pydantic, Celery/RQ/APScheduler, Redis, Docker. Тип щоб не втратити продаж. |-

FiscalApiError API повернув помилку. Поле

Python-сервіс повинен приймати інформаційні дані продажу та створювати фіскальний чек. Колір

"idempotency_key": command.idempotency_key,

18. API Python-сервісу

except TemporaryFiscalError as exc:

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

return existing
existing = receipt_repository.get_by_idempotency_key(

POST /api/v1/fiscal/integrations/{integration_id}/check-connection

- AC-16 Реалізується в межах цього ТЗ. Очікуваний результат

24.5. Dashboard

receipt.status = "FISCALIZATION_ERROR"

Якщо API або конфігурація «Вчасно.Каса» підтримують електронну відправку чека, Python-сервіс повинен передавати email або телефон покупця. Логічний endpoint: платформа повинна підтримувати отримання проміжного X-звіту без закриття зміни. SEO-опис

"customer": {

18.5. Отримання чека

receipt.error_message = str(exc)

! receipt.fiscal_url = response.fiscal_url

{| class="wikitable"
! Значення
! |-
| Повернення
| Високий
| Важлива фінансова операційна дія. |-
| Зміна налаштувань
| користувач системи, старі та нові параметри. |-
| Перевірка перед чеком
| Якщо зміна вже відкрита, повторно не відкривати. Де застосовується для
=== 8.6. Закриття зміни ===
VCHASNO_KASA_INTEGRATION_MODE=cloud_api

[[Категорія:Фіскалізація]]
! Критерій
=== 8.3. Приклад запиту на чек ===
 "fiscal_url": response.fiscal_url,
== 15. Дедублікація ==
Сценарії:
POST /api/v1/fiscal/shifts/{shift_id}/close

! # Чи потрібна технічна підтримка часткових повернень? |-
| Загальна БД чеків
| Усі чеки зберігаються в єдиній БД Python-сервісу. я хочу передати інформацію про оплату в Python-сервіс, 
{| class="wikitable"

! Тип
Логічний endpoint:

8.2. Створення чека продажу

ERP / CRM / Website / POS


! |}

Для підвищення надійності фіскалізація повинна виконуватись через чергу. |-
| sku
| varchar
| Артикул. я хочу бачити dashboard по касах і чеках, 
=== 16.1. Логіка черги ===
POST /api/v1/fiscal/shifts/open
! SEO-опис

{| class="wikitable"
! receipt = receipt_repository.get_by_id(db, receipt_id)

* повноцінний POS-інтерфейс касира;
* власна реалізація ПРРО без «Вчасно.Каса»;
* самостійна реєстрація ПРРО в ДПС через Python-сервіс;
* власний компонент КЕП;
* інтеграційні функції ERP з усіма еквайрингами;
* складний UI для касира;
* заміна кабінету «Вчасно.Каса». |-
| new_status
| varchar
| Новий статус. |-
| integration_mode
| varchar
| cloud_api, device_manager, hybrid. |-
| Хмарне API «Вчасно.Каса»
| Пряма інтеграційні функції ERP з кабінетом та фіскалізацією чеків. # Чи потрібен dashboard у UI, чи тільки API? Поле
== 6. Основні сутності ==
|-
| id
| uuid
| Внутрішній ID чека. |-
| AC-17
| виступає як незакриті зміни. |-
| external_cash_register_id
| varchar
| ID каси у «Вчасно.Каса». # Чи потрібна технічна підтримка декількох юридичних осіб? |-
| AC-13
| користувач системи закриває зміну. |-
| api_token_encrypted
| text
| Зашифрований токен. |-
| external_payment_id
| varchar
| ID оплати. | Healthcheck і fallback-сценарій. |-
| style="background:#ef9a9a;" | Червоний
| #ef9a9a
| Помилка або критична ситуація. |-
| fiscal_number
| varchar
| Фіскальний номер. Тип
|-
| «Вчасно.Каса»
| ПРРО-сервіс для фіскалізації чеків. | Python-сервіс створює чек зі статусом PENDING. №

style="background:#c8e6c9;" | Норма
Очікують Чеки в черзі. Сценарій

{

8.7. X-звіт

class VchasnoKasaSettings(BaseSettings):

v

Логічний endpoint Python-сервісу:

cash_register_id=receipt.cash_register_id,

VCHASNO_KASA_API_TOKEN=********

18.8. Відкриття зміни

entity_type="receipt",
"tax_group": "NO_VAT",

21.1. Основні KPI

щоб коректно відобразити повернення коштів покупцю. | Вони підсвічуються червоним. | платформа відкриває зміну, якщо auto_open_shift = true. # Чи потрібно автоматизовано відкривати зміну?== 1. Мета ==

  • Python API для прийому продажів;
  • клієнт ERP інтеграції з «Вчасно.Каса»;
  • технічна підтримка фіскалізації чеків;
  • технічна підтримка повернень;
  • відкриття та закриття змін;
  • збереження чеків;
  • збереження статусів;
  • журнал помилок;
  • retry-механізм;
  • dashboard / API для контролю;
  • інтеграційні функції ERP з внутрішньою системою. №
id uuid ID інтеграції. SEO-опис

5. Варіанти інтеграції

- TimeoutError - name varchar - status varchar class="wikitable"
<syntaxhighlight lang="python">
!
"fiscal_operation_type": "sale",

Варіант 2. 5.2. Device Manager

} платформа повинна не допускати дублювання чеків. ! |-

Завантаження PDF Низький }
"name": "Іван Петренко",

Для реалізації задачі необхідно отримати:

)

</syntaxhighlight>

retry_count: int = 3

Варіант 3. 5.3. Гібридна схема

18.9. Закриття зміни

- CashRegisterError - cash_register_id string - Validation Layer Перевіряє товари, суми, оплати, податки, касу, касира. Поле
 verify_ssl: bool = True
"email": "customer@example.com",
Статус / номер / посилання на чек

23. Логування та аудит

Мінімальні інформаційні дані:

Idempotency key і дедублікація. |}

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

Невірна податкова група Draft, Cancelled, Closed. # Які платіжні провайдери використовуються? Як зменшити
if existing:

Приклад hash:

default_cashier_id: str | None = None

POST /api/v1/fiscal/receipts

16.2. Пріоритети задач

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

платформа повинна підтримувати синхронізацію статусу чека з «Вчасно.Каса». | style="background:#ef9a9a;" | Критично

Повернення - ShiftError Помилка відкриття або закриття зміни.== 10. Статуси зміни ==
db.commit()
timeout_seconds: int = 30
- idempotency_key varchar }

8.8. Отримання статусу чека

  1. Який сценарій інтеграції застосовується для: хмарне API, Device Manager або гібрид? Стан

27. Ризики

4. Передумови

- send_receipt_to_customer boolean Ні - AC-5 } def check_connection(self) -> "ConnectionStatus":
  • створення інтеграції;
  • перевірка підключення;
  • створення чека продажу;
  • створення чека повернення;
  • валідація чеків;
  • дедублікація;
  • черга фіскалізації;
  • відкриття зміни;
  • закриття зміни;
  • отримання статусу чека;
  • збереження fiscal_number;
  • журнал подій;
  • retry-механізм;
  • dashboard API;
  • базові unit-тести;
  • mock API для інтеграційних тестів. Від цього залежить технічна архітектура, мережеві конфігурація, обробка офлайн-ситуацій і друк чеків. |-
external_shift_id varchar - base_url varchar URL API. Поле SEO-опис
},

14. Валідація чека

payload={"receipt_id": str(receipt.id)},
external_order_id string ID замовлення у зовнішній системі. SEO-опис
try:
}
],

VCHASNO_KASA_ORGANIZATION_ID=org-001

{
- Status Sync Worker - opened_at timestamp Дата відкриття. Тип
if receipt.status == "FISCALIZED":

</syntaxhighlight>

=== 20.2. Retry-логіка ===
! |-
| external_order_id
| varchar
| ID замовлення. | Refund, сторно, коригування. # Чи потрібно зберігати PDF чека локально? |-
| provider
| varchar
| LiqPay, WayForPay, Mono, terminal тощо. Валідація, дедублікація, черга
== Див. 30. так само ==
 pass
 |
 | 3.[[Категорія:Технічні завдання]]

* створити FastAPI-проєкт;
* налаштувати PostgreSQL;
* створити моделі інтеграції, кас, змін, чеків;
* налаштувати Alembic;
* реалізувати healthcheck. |-
| customer
| object
| інформаційні дані покупця. | базовий зовнішній сервіс інтеграції. |-
| current_shift_id
| uuid
| Поточна зміна. Показник
</pre>

! | Другий чек не створюється. |-
| Vchasno Kasa Client
| Python-клієнт для API «Вчасно.Каса» або Device Manager. | style="background:#fff9c4;" | Жовтий
|-
| Відправляється
| SENDING
| Виконується API-запит. "currency": "UAH"

 {

 def close_shift(self, shift_id: str) -> "ZReportResponse":
!== 8. Функціональні вимоги ==
! |-
| AC-8
| API повертає тимчасову помилку. | Підходить для інтеграцій з локальними системами, POS, принтерами. Сценарій
=== 19.2. Worker фіскалізації ===
=== 12.2. Основні компоненти Python-сервісу ===
 entity_id=receipt.id,
|-
| AC-15
| Керівник відкриває dashboard. |-
| raw_response
| jsonb
| Відповідь API. |-
| ERP / CRM / сайт / POS
| Джерело продажів, повернень, оплат і даних покупця. Поле

 "total_amount": command.total_amount,

! |-
| Shift
| Касова зміна. |-
| Незакрита зміна
| Касир або платформа не закрили зміну. |-
| event_type
| varchar
| Тип події. | Повернути існуючий чек. | інтеграційні функції ERP зберігається в системі. | Чек отримує статус FISCALIZED. | style="background:#e3f2fd;" | Інформаційний
|-
| Фіскалізовано
| Кількість успішних чеків. |-
| integration_mode
| enum
| Так
| cloud_api, device_manager, hybrid. Worker викликає API «Вчасно.Каса». |-
| receipt_hash
| Hash товарів, сум, оплат і замовлення. |}

 receipt.status = "NEEDS_RETRY"

 "name": "Товар 1",

* timeout;
* тимчасової недоступності API;
* HTTP 429;
* HTTP 500;
* HTTP 502;
* HTTP 503;
* HTTP 504;
* мережевих помилок;
* тимчасової помилки Device Manager. |-
| original_fiscal_number
| string
| Фіскальний номер первинного чека. # Які податкові групи товарів використовуються? |-
| Помилки токена
| Токен змінено або відкликано. |-
| provider
| varchar
| vchasno_kasa. Тип
{| class="wikitable"
! |-
| receipt_type
| varchar
| sale або refund. SEO-опис

! ! |-
| AC-10
| Сума повернення більша за суму продажу. Очікуваний результат
__TOC__
! pass

 event_type="RECEIPT_QUEUED",
=== 17.2. cash_registers ===
 db.commit()

POST /api/v1/fiscal/shifts/{shift_id}/x-report
 "quantity": 2,

платформа повинна логувати:
<syntaxhighlight lang="python">
Retry не застосовується для:

! Колір
== 17. Модель даних ==
=== Етап 5. Повернення ===
платформа повинна дозволяти створити конфігурація підключення до «Вчасно.Каса». | Записати помилку, дозволити повтор. API приймає запит на створення чека. |}

! Ризик
<pre>
Retry застосовується для:

== 11. Єдина логіка кольорів ==
 api_token: str
</pre>

 cashier_id=receipt.cashier_id,

ERP / CRM / Website / POS

* наявність external_order_id;
* відсутність уже фіскалізованого чека по цьому external_order_id;
* наявність каси;
* наявність касира;
* наявність відкритої зміни або можливість її відкрити;
* наявність хоча б однієї позиції;
* коректність кількості;
* коректність ціни;
* коректність суми рядка;
* відповідність total_amount сумі товарів і оплат;
* коректність типу оплати;
* коректність податкових груп;
* коректність email або телефону покупця, якщо чек потрібно відправити. | Помилки фіскалізації, незакрита зміна. Параметр

 data={

 pass

 "unit": "послуга"

 },
! |-
| DuplicateReceiptError
| Чек уже створено. |}

<div style="border-left: 6px solid #1565c0; background: #e3f2fd; padding: 12px 16px; margin: 16px 0;">

! Сутність
 "amount": 70.00,
{| class="wikitable"
|-
| Чернетка
| DRAFT
| Чек створено у Python-сервісі, але ще не відправлено. | У БД зберігається fiscal_number. |-
| конкурентні переваги
| Немає локального застосунку, простіша інфраструктура. |-
| Закриття зміни
| Z-звіт, час, результат. SEO-опис

<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
 pass
<div style="border-left: 6px solid #c62828; background: #ffebee; padding: 12px 16px; margin: 16px 0;">
|-
| API Layer
| REST API для прийому продажів, повернень, команд зміни. |-
| Обмеження
| Потрібен стабільний інтернет і доступ до зовнішнього API. Конкретний сценарій потрібно зафіксувати в налаштуваннях інтеграції. |-
| base_url
| string
| Так
| Базова адреса API або Device Manager. |-
| is_active
| boolean
| Так
| Ознака активності інтеграції. |-
| Dashboard API
| інформаційні дані для керівника: чеки, зміни, помилки, обороти. |-
| AC-7
| Повторний запит має той самий idempotency_key. |-
| integration_id
| uuid
| ID інтеграції. |-
| auto_open_shift
| boolean
| Так
| автоматизовано відкривати зміну перед першим чеком. |-
| Receipt
| Фіскальний чек продажу. | Черга, статуси API. Статус
{{SEO
|title=Технічне завдання: Інтеграція Вчасно.Каса для Python
|description=Технічне завдання на реалізацію Python-сервісу для інтеграції з Вчасно.Каса: фіскалізація чеків, відкриття і закриття змін, повернення, X/Z-звіти, статуси, помилки, API-клієнт, черги та журналювання.
|keywords=Python, Вчасно.Каса, ПРРО, API, фіскалізація чеків, каса, програмний РРО, FastAPI, інтеграція, технічне завдання, K2 ERP
}}
 entity_id=receipt.id,
 "cash_register_id": "cash-register-001",
|-
| integration_name
| string
| Так
| Назва інтеграції.=== 24.3. Повернення ===
{| class="wikitable"
! SEO-опис

3. Значення
== 3. Джерела інтеграції ==
{| class="wikitable"

{| class="wikitable"

{| class="wikitable"
6. |-
| created_at
| timestamp
| Дата створення. 

<div style="border-left: 6px solid #6a1b9a; background: #f3e5f5; padding: 12px 16px; margin: 16px 0;">
 "cashier_id": "cashier-001",
{| class="wikitable"
GET /api/v1/fiscal/dashboard?date_from=2026-05-01&date_to=2026-05-07
|-
| id
| uuid
| ID події. |}

== 28. Відкриті питання ==

! |-
| is_active
| boolean
| Чи застосовується для. Компонент
 receipt.status = "SENDING"
|-
| original_receipt_id
| uuid
| Внутрішній ID первинного чека. ERP / CRM / сайт отримує статус. Поле
== 16. Черга фіскалізації ==
{| class="wikitable"
<pre>
! Критерій

POST /api/v1/fiscal/receipts/{receipt_id}/sync-status
=== 18.10. X-звіт ===

=== 18.7. Повторна фіскалізація ===
 def get_receipt_pdf(self, receipt_id: str) -> bytes:
 pass

</div>

=== Етап 3. Vchasno Kasa Client ===
 "sku": "SKU-001",


! |-
| is_active
| boolean
| Активність. |}

 "currency": command.currency,

=== 17.1. fiscal_integrations ===

! | style="background:#bbdefb;" | Блакитний
|-
| Відкрита
| OPEN
| Можна фіскалізувати чеки. |-
| Відправка в API
| endpoint, час, request_id. щоб розуміти, чи можна фіскалізувати чеки. |-
| Python-сервіс
| Інтеграційний шар між ERP / сайтом / CRM / POS та «Вчасно.Каса». | Первинний чек отримує ознаку повного або часткового повернення. |-
| raw_request
| jsonb
| Запит до API.<pre>

Перед фіскалізацією платформа повинна перевірити:

* перевірити відкриту зміну;
* перевірити незавершені чеки;
* сформувати Z-звіт;
* зберегти результат;
* змінити статус зміни на Closed;
* записати подію в журнал. |-
| price
| numeric
| Ціна. |-
| Device Manager недоступний
| Локальний застосунок не відповідає. оновлення версій ERP / CRM / POS
 "receipt_type": "sale",
! |-
| cash_register_id
| uuid
| Каса. Створюється запис receipt зі статусом PENDING. SEO-опис

POST /api/v1/fiscal/receipts/{receipt_id}/sync-status

 default_cash_register_id: str | None = None
Вчасно.Каса
 payload={

! SEO-опис
POST /api/v1/fiscal/refund-receipts
|-
| Створення чека
| external_order_id, сума, каса, касир. |-
| external_order_id
| базовий ключ від зовнішньої системи. |-
| cash_register_id
| uuid
| Каса. |-
| X Report
| Проміжний звіт без закриття зміни.== 2. Область сценарії використання ==

* додати rate limiting;
* додати alerting;
* додати retry policy;
* додати dead letter queue;
* додати моніторинг;
* додати резервне копіювання. автоматичної фіскалізації чеків забезпечується через '''Головна ідея:''' розробити Python-сервіс.Каса»; так само реалізовано контролю касових змін, повернень, статусів, помилок і друку або відправки електронних чеків покупцям. |-
| Refund Receipt
| Чек повернення. Обов'язковість
! |-
| Payment
| Оплата в чеку: готівка, картка, онлайн-еквайринг тощо.== 21. Dashboard керівника ==

* реалізувати dashboard API;
* реалізувати журнал подій;
* реалізувати фільтри;
* реалізувати експорт, якщо потрібно. Параметр
=== 17.6. fiscal_payments ===
=== 24.4. Зміни ===


[[Категорія:Вчасно.Каса]]
=== 7.3. Контроль зміни ===
=== Етап 4. Чеки ===
=== 17.7. fiscal_events ===
<syntaxhighlight lang="python">

<pre>
 "amount": 500.00,

<pre>

'''Управлінський результат:''' керівник повинен бачити, скільки чеків сформовано, скільки фіскалізовано, скільки помилок, які каси відкриті, які зміни не закриті, скільки повернень і які операції потребують уваги. |-
| currency
| string
| Валюта. |}

 ],

POST /api/v1/fiscal/shifts/open

{| class="wikitable"
=== Етап 2. конфігурація інтеграції ===
 integration_mode: str = "cloud_api"
|-
| Підходить для
| POS-систем, локальних облікових систем, магазинів із чековими принтерами. Cloud API або Device Manager
! Критерій
Як керівник, 

=== 18.3. Створення чека продажу ===

POST /api/v1/fiscal/shifts/{shift_id}/close
! |-
| Повторна обробка
| хто запустив, коли, результат. |-
| cashier_id
| varchar
| Касир. return receipt

* помилок валідації;
* неправильного токена;
* дублювання чека;
* некоректних сум;
* неправильних податкових груп;
* повернення понад доступну суму. |-
| Помилка фіскалізації
| код помилки, повідомлення, raw-відповідь. |}

[[Категорія:ПРРО]]

</pre>
VCHASNO_KASA_BASE_URL=https://api.example.vchasno-kasa
'''Критично критично:''' чек повернення повинен бути пов'язаний із первинним чеком. Що зберігати

платформа повинна підтримувати створення чека повернення. |-
| integration_id
| uuid
| ID інтеграції. Замовлення
Як адміністратор, 
== 19. Приклад Python-логіки ==
{| class="wikitable"
 v
{| class="wikitable"

=== 19.1. Створення чека ===

=== 21.2. Приклад dashboard ===
! |-
| items
| array
| Позиції чека. |-
| api_token
| secret
| Так
| Токен інтеграції. |-
| created_at
| timestamp
| Дата події.<div style="border-left: 6px solid #f57c00; background: #fff3e0; padding: 12px 16px; margin: 16px 0;">
|-
| Cash Register
| Каса / ПРРО, через яку фіскалізуються чеки. | style="background:#fff9c4;" | Увага
|-
| Помилки
| Чеки з помилкою. Колір
 "quantity": 1,
! | платформа попереджає перед закриттям зміни. Пріоритет
POST /api/v1/fiscal/receipts

! |}

 pass

Ключі дедублікації:
! |-
| Deduplication Service
| Захищає від повторної фіскалізації одного продажу. |-
| amount
| numeric
| Сума. | Валідація перед фіскалізацією. # Чи потрібна технічна підтримка локального друку чеків? |}

Python Fiscal Service

<pre>
 audit_logger.log(
id uuid - updated_at timestamp Виконати retry. |- AC-1 Адміністратор створює інтеграцію. # Які типи оплат підтримуються? Дія

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

18.2. Перевірка підключення

POST /api/v1/fiscal/refund-receipts

Сума
v
)
- fiscal_number varchar Фіскальний номер ПРРО, якщо доступний. Ключ
  • повноцінний POS UI;
  • власний ПРРО;
  • інтеграційні функції ERP з усіма еквайрингами;
  • складна аналітичні інструменти;
  • автоматична реєстрація ПРРО в ДПС;
  • технічна підтримка всіх нестандартних податкових сценаріїв;
  • повна офлайн-робота без Device Manager. POST /api/v1/fiscal/integrations
 except Exception as exc:
 }

=== 18.1. Створення інтеграції ===
! | Не відправляти чек, повернути список помилок. |-
| Основні операції
| Фіскалізація чеків, друк, робота з POS-пристроями, X/Z-звіти. |-
| receipt_id
| uuid
| ID чека. | Він бачить кількість чеків, помилок, повернень і незакритих змін. |-
| AuthError
| Невірний API token або відсутній доступ. |-
| error_message
| text
| Остання помилка. ! |-
| Receipt Service
| Створення чеків продажу. SEO-опис

<pre>
</syntaxhighlight>

=== 24.2. Чеки ===
</div>

=== 8.4. Чек повернення ===
! Як касир або адміністратор, 
== 29. Джерела ==
=== 18.4. Створення чека повернення ===
До MVP не входить:
 "provider": "liqpay",

"external_order_id": command.external_order_id,
)

Критично критично: до початку розробки потрібно визначити сценарій інтеграції: хмарне API або Device Manager. |-

Fiscal Queue - Блакитний #bbdefb операційна дія виконується або в роботі. Поле - AC-3 Токен неправильний. Поле

def create_fiscal_receipt(command: "CreateReceiptCommand", db: "Session") -> "FiscalReceipt":

Не відкрита CLOSED style="background:#ef9a9a;" | Червоний

Варіант 1. 5.1. Хмарне API

v

До MVP входить: Вчасно.Каса

|-
| style="background:#c8e6c9;" | Зелений
| #c8e6c9
| Успішно: чек фіскалізовано, зміна відкрита або закрита коректно. |-
| Відкриття зміни
| каса, касир, час. |-
| error_message
| text
| Остання помилка. |}

Python-сервіс підтримує обидва способи інтеграції. v

"sku": "DELIVERY",
  • реалізувати створення інтеграції;
  • реалізувати зберігання токена;
  • реалізувати check-connection;
  • реалізувати права доступу.=== Етап 7. Dashboard та аудит ===

18.6. Синхронізація статусу чека

Як оператор або ERP,

17.3. fiscal_shifts

9. Статуси чеків

return
"price": 70.00,

Python-сервіс взаємодіє з Device Manager, який виконує інтеграційні функції локально або в середовищі клієнта. |-

external_payment_id varchar - fiscal_url varchar Посилання на чек, якщо доступне. Фіскалізація через ПРРО

щоб він автоматизовано створив фіскальний чек у «Вчасно.Каса». Дія системи

entity_type="receipt",

функції ERP застосовується для для:

# Чи потрібна інтеграційні функції ERP з K2 ERP?=== 7.5. Контроль керівника === "payments": [ def create_receipt(self, payload: "ReceiptPayload") -> "ReceiptResponse": receipt.fiscal_number = response.fiscal_number
style="background:#c8e6c9;" | Зелений
Помилка ERROR - default_tax_group string Ні Податкова група за замовчуванням. Код

7.2. Повернення

id uuid - external_refund_id string ID повернення у зовнішній системі. Тип
pass

Заборонено: зберігати API token, ключі, паролі касирів або інші секрети у коді, Git-репозиторії, відкритих логах або frontend-змінних. |-

Обмеження - total_amount numeric - AC-6 - idempotency_key style="background:#ffcc80;" | Помаранчевий
Скасовано CANCELLED Операцію скасовано. Фіскальний результат

До області задачі входить: Логічний endpoint:

Retry, незавершені операції. # Чи потрібна технічна підтримка декількох торгових точок? SEO-опис

Vchasno Kasa Adapter


Python-сервіс напряму викликає хмарне API «Вчасно.Каса». | style="background:#f3e5f5;" | Фіолетовий
|}

=== 13.2. Основні методи ===

! |-
| name
| varchar
| Назва товару або послуги. |-
| Закриття зміни
| Критичний
| Не можна залишати зміну незакритою. |-
| qr_code
| text
| QR або інформаційні дані QR, якщо доступні. | як приклад K2 ERP або інша платформа. |}

 receipt.qr_code = response.qr_code

 def create_refund_receipt(self, payload: "RefundReceiptPayload") -> "ReceiptResponse":

 {

1. | Check-connection і сповіщення адміністратора. |-
| z_report_number
| varchar
| Номер Z-звіту.<pre>
|-
| AC-12
| Перед першим чеком зміна закрита. "external_payment_id": command.external_payment_id,

Коментар

class VchasnoKasaClient:

- ДПС style="background:#ffcc80;" | Потрібна дія

Мінімальні інформаційні дані:

"external_order_id": "ORDER-2026-000123",

18.11. Dashboard

я хочу повторити фіскалізацію після технічної помилки,

- AC-14 style="background:#c8e6c9;" | Зелений
Закривається CLOSING Dashboard, нагадування, авто-закриття за правилом. event_type="RECEIPT_FISCALIZED",
},
style="background:#eeeeee;" | Сірий
Повернення створено REFUNDED - Сірий #eeeeee Неактивно або скасовано. Тип
Чеків за день 1240 інформаційні матеріали
Фіскалізовано 1218 Норма
Очікують у черзі 12 Увага
Помилки фіскалізації 7 Критично
Повернення 14 Контроль
Незакриті зміни 2 Потрібна дія
"fiscal_number": response.fiscal_number, "type": "card",

24.1. інтеграційні функції ERP

20.1. Типи помилок

"payment_id": "PAY-123456"
VCHASNO_KASA_RETRY_BACKOFF_SECONDS=5
10:42 Каса 1 ORDER-123 570.00 Помилка Timeout API Повторити
11:05 Каса 2 ORDER-124 1200.00 Потребує повтору Тимчасова помилка Повторити
12:10 Каса 3 SHIFT-55 - Зміна відкрита Не закрито Z-звіт Закрити зміну
response = vchasno_kasa_client.create_receipt(payload)
validation_service.validate_receipt(command)
  • зберігання токенів тільки у secret storage або в зашифрованому вигляді;
  • заборону логування токенів;
  • маскування персональних даних покупців;
  • обмеження доступу до чеків;
  • контроль доступу до повернень;
  • окремі права на закриття зміни;
  • журнал усіх дій;
  • HTTPS для API-запитів;
  • перевірку SSL;
  • обмеження повторних запитів;
  • захист від дублювання чеків. SEO-опис
shift = shift_service.ensure_open_shift(
 receipt.fiscalized_at = datetime.now(timezone.utc)
2. Продаж / оплата / повернення
} receipt.status = "FISCALIZED" платформа повинна підтримувати відкриття касової зміни.=== 7.4. Повторна обробка === ) from datetime import datetime, timezone finally: "amount": 570.00,
Дублювання чеків Повторний запит здатна створити другий чек. платформа повинна підтримувати закриття касової зміни та формування Z-звіту. Тип POST /api/v1/fiscal/receipts/{receipt_id}/retry
 "items": [