2.2 X и Z отчёты смены

Референс

YUMA POS: _reference/yumapos/x-reports.md, shift-report.md, cash-balance.md, cash-flows.md, terminals-dashboard.md

Зависимость

Требует работающий Order Service (BR 2.1) — без заказов отчёт бессмыслен.


Общая идея

Кассир работает на смене: открывает, обрабатывает заказы, принимает оплату, закрывает. В любой момент смены он может посмотреть промежуточный отчёт (X-отчёт), а при закрытии формируется итоговый отчёт (Z-отчёт).

Эти отчёты нужны:

  • Кассиру — чтобы сверить кассу перед закрытием
  • Менеджеру — чтобы контролировать выручку точки
  • Франшизе/Франчайзи — чтобы видеть аналитику по всем точкам в бэк-офисе

Что такое X-отчёт и Z-отчёт

X-отчётZ-отчёт
КогдаВ любой момент во время сменыПри закрытии смены
Кто запрашиваетКассир (на POS) или менеджер (в админке)Автоматически при закрытии смены
Что содержитПромежуточные итоги с начала смены до текущего моментаФинальные итоги за всю смену
Обнуляет ли счётчикиНетДа (фиксирует итог, смена закрывается)
Где хранитсяНе сохраняется (вычисляется на лету)Сохраняется как документ (акт реализации)

Состав отчёта (по YUMA POS)

Шапка

ПолеОписаниеОткуда данные
СотрудникФИО кассира, открывшего сменуshift_records.employee_id → User Service
МагазинНазвание ТТshift_records.store_id → Store Service
ТерминалНазвание кассы (POS)Будущее — пока нет терминалов
Начало сменыДата и время clock_inshift_records.clock_in
Конец сменыТолько для Z-отчётаshift_records.clock_out

Финансовые показатели

ПолеОписаниеОткуда данные
Дневная выручкаОбщая сумма всех оплаченных заказов за сменуorders WHERE store_id + paid, SUM(paid_amount)
НаличнымиСумма оплат наличнымиorders WHERE payment_method = ‘cash’
По картеСумма оплат картойorders WHERE payment_method = ‘card’
QR-оплатаСумма оплат через QRorders WHERE payment_method = ‘qr’
ВозвращеноСумма возвратовПока нет возвратов — 0
Всего скидокСумма скидокПока нет скидок — 0
Всего заказовКоличество заказов за сменуCOUNT orders
Всего клиентовКоличество уникальных клиентовПока нет клиентской базы — = кол-во заказов
Средний чекВыручка / кол-во заказовВычисляемое

Кассовые операции (Phase 2 — пока не реализуем)

ПолеОписаниеСтатус
Сумма начала дняВнесено при открытии смены❌ Phase 2
Добавлено в кассуВнесения во время смены❌ Phase 2
Изъято из кассыИзъятия во время смены❌ Phase 2
ИнкассацияАвто при закрытии❌ Phase 2
Ожидаемая суммаНачало + выручка наличными − изъятия❌ Phase 2
ЧаевыеНаличные чаевые❌ Phase 2

Товарная аналитика (для Z-отчёта / акта реализации)

ПолеОписаниеОткуда данные
Продано позицийСписок товаров с количеством и суммойorder_items JOIN orders за смену
Топ товаровСамые продаваемыеАгрегация order_items

Складское списание (Phase 2)

ПолеОписаниеСтатус
Списано ингредиентовПо техкартам проданных блюд❌ Зависит от интеграции Warehouse + Orders

Phase 1 — что реализуем сейчас

Базовый X/Z отчёт без кассовых операций и складского списания:

Данные отчёта

{
  "employee_name": "Иванов Иван",
  "store_name": "Кофейня на Ленина",
  "shift_start": "2026-04-14T09:00:00",
  "shift_end": null,
  "total_revenue": 45200.00,
  "cash_amount": 15800.00,
  "card_amount": 25400.00,
  "qr_amount": 4000.00,
  "refund_amount": 0.00,
  "discount_amount": 0.00,
  "total_orders": 47,
  "completed_orders": 43,
  "cancelled_orders": 2,
  "average_check": 961.70,
  "top_items": [
    { "name": "Латте", "quantity": 25, "amount": 5500.00 },
    { "name": "Шаурма классическая", "quantity": 18, "amount": 6300.00 }
  ]
}

Новые эндпоинты

Order Service:

MethodPathОписание
GET /orders/shift-reportQuery: store_id, employee_id, from (datetime), to (datetime)Агрегация заказов за период: выручка, разбивка по оплате, кол-во, средний чек, топ товаров

User Service (расширение):

MethodPathОписание
GET /shift-records/{id}/reportСобирает данные смены + дёргает Order Service за агрегатыПолный X/Z отчёт для конкретной смены

Где отображается

ГдеЧтоРоль
POS-терминал (будущее)Кнопка “Отчёт” в меню кассы → X-отчётКассир
POS-терминал (будущее)При закрытии смены → Z-отчёт (печать на чековый принтер)Кассир
Админка → Активность → ТерминалыДашборд по кассам: смены, выручка, сотрудникМенеджер, Франчайзи, Франшиза
Админка → Детали сменыПолный отчёт по конкретной смене (кликнуть из расписания или активности)Менеджер, Франчайзи, Франшиза

Phase 2 — кассовые операции

Когда POS будет реализован:

Денежный ящик

  • Внесение при открытии смены (размен)
  • Изъятие (передача выручки в сейф)
  • Инкассация (авто при закрытии)

Статьи калькуляции (как в Юме)

Настраиваемые типы операций:

  • Доход — деньги приходят (курьер сдал наличные)
  • Расход — деньги уходят (выплата зарплаты из кассы)
  • Перевод — перемещение внутри предприятия (из кассы в сейф)

Баланс денежных средств

Страница в бэк-офисе: наличные + безнал + дебиторка + кредиторка по каждому ЮЛ.


Phase 3 — складское списание

Автоматическое списание ингредиентов при закрытии заказа:

  • Заказ закрыт → по техкарте каждого блюда → вычитаем ингредиенты со склада ТТ
  • В Z-отчёте (акте реализации) → вкладка “Списано”

Ролевой доступ

ДействиеФраншизаФранчайзиМенеджерКассир
X-отчёт (текущая смена на POS)Свою смену
Z-отчёт (после закрытия)Все ТТСвои ТТСвоя ТТСвою смену
Дашборд терминалов (админка)Все ТТСвои ТТСвоя ТТНет
Просмотр отчёта по смене (админка)ВсеСвоиСвоя ТТНет

Связи с другими BR

  • BR 2.1 (Order Service) — данные по заказам, товарам, оплатам
  • BR 1.4.1 (Сотрудники) — смены (shift_records), дашборд активности
  • BR 1.5 (Торговые точки) — привязка к ТТ
  • Будущее: Finance Service — кассовые операции, баланс, денежные потоки

Приоритеты

ОчередьЧтоЗависимости
1Эндпоинт агрегации в Order ServiceOrder Service должен работать
2Эндпоинт отчёта по смене в User ServiceЗависит от п.1
3Страница “Отчёт по смене” в админкеЗависит от п.2
4Дашборд терминалов (аналог Юмы “Работа касс”)Зависит от п.2
5Интеграция с POS (когда появится)POS BFF + POS App

Что НЕ входит в эту BR

ФичаПочемуКогда
Кассовые операции (внесение/изъятие/инкассация)Нужен POS + Finance ServicePhase 2
Статьи калькуляцииОтдельный модуль финансовPhase 2
Баланс денежных средствНужен Finance ServicePhase 2
Печать отчёта на чековый принтерНужен POSPhase 2
Складское списание при закрытии заказаНужна интеграция Warehouse ↔ OrdersPhase 3
ВозвратыНе реализованы в Order ServiceОтдельная BR
СкидкиНе реализованыОтдельная BR

Принятые решения (закрытые вопросы)

#ВопросРешениеОбоснование
1Граница смены для заказовПо дате оплаты (paid_at)X/Z отчёт = движение денег. Заказ попадает в смену когда была оплата.
2Несколько смен за деньДва отдельных Z-отчётаКак в Юме — закрыл смену → Z-отчёт. Открыл новую → новый счётчик.
3Параллельные кассыПо каждой кассе отдельноКак в Юме — каждый терминал = свой отчёт. В дашборде видно выручку каждой кассы.