Отчёты по сменам

Источник требований

Аналитика по смене кассира: выручка, количество заказов, разбивка по способам оплаты, топ товаров. Данные собираются из Order Service (заказы) и User Service (смены).


X-отчёт vs Z-отчёт

ПараметрX-отчётZ-отчёт
КогдаВ любой момент во время сменыПосле закрытия смены
Кто формируетМенеджер / Франшиза / ФранчайзиАвтоматически при clock_out
ХранитсяНе хранится (вычисляется на лету)Не хранится (вычисляется по факту)
СчётчикиТекущие (нарастающим итогом)Финальные
Периодclock_in .. текущий моментclock_in .. clock_out

MVP: оба типа вычисляемые

В Phase 1 ни X, ни Z отчёт не кэшируются. Каждый запрос — агрегация из Order Service. Если потребуется снэпшотирование — отдельное решение (Phase 2+).


Состав отчёта (Phase 1)

Шапка

ПолеОписание
СотрудникФИО кассира
Торговая точкаНазвание ТТ
ДатаДата смены
Начало сменыclock_in (datetime)
Конец сменыclock_out (datetime) или “Смена открыта”
ПерерывДлительность перерыва (минуты)
ОтработаноЧистое время (clock_out - clock_in - перерыв)
Тип отчётаX-отчёт (смена открыта) / Z-отчёт (смена закрыта)

Финансы

ПоказательОписание
ВыручкаСумма paid_amount всех оплаченных заказов за период
НаличныеОплата наличными (payment_method = cash)
КартаОплата картой (payment_method = card)
QRОплата QR (payment_method = qr)
Возвраты0 (не реализованы в Phase 1)
Скидки0 (не реализованы в Phase 1)
Заказов всегоОбщее число заказов
ЗавершеноЧисло заказов в статусе closed
ОтмененоЧисло заказов в статусе cancelled
Средний чекВыручка / количество завершённых заказов

Товарная аналитика

Топ продаваемых товаров за период смены:

КолонкаОписание
Названиеproduct_name из позиции заказа
КоличествоСуммарное количество (quantity)
СуммаСуммарная стоимость (unit_price * quantity)

Сортировка: по сумме (desc).


Привязка заказов к смене

Фильтрация по paid_at

Заказы привязываются к смене по полю paid_at (дата фактической оплаты), а не по created_at (дата создания). Неоплаченные заказы не попадают в отчёт.

Почему paid_at:

  • Заказ может быть создан до начала смены, но оплачен во время неё
  • Факт оплаты — это момент, когда деньги попали в кассу
  • Фискальный учёт привязан к моменту оплаты

Множественные смены

Каждая смена = отдельный отчёт. Если в течение дня на одной ТТ было 3 смены (утренняя, дневная, вечерняя) — будет 3 отдельных Z-отчёта.

Агрегация по ТТ за день (суммирование всех смен) — задача дашборда терминалов, а не отчёта по смене.


Per-terminal отчёт

Отчёт привязан к конкретной смене:

  • Сотрудник — кассир, который открыл смену
  • Торговая точка — ТТ, где открыта смена
  • Временной диапазон — clock_in .. clock_out

Нет агрегации по нескольким сменам или сотрудникам в одном отчёте.


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

МестоPhaseОписание
Админка: Отчёт по сменеPhase 1Детальный отчёт (клик из дашборда активности / расписания)
Админка: Дашборд терминаловPhase 1Список смен за день с выручкой по каждой
POS: Z-отчёт при закрытии сменыPhase 2Печать/экран на кассе

Ролевая матрица

РольДоступ
ФраншизаВсе ТТ, все смены
ФранчайзиТолько свои ТТ
Менеджер ТТТолько своя ТТ
КассирНет доступа в админке (Phase 2: в POS только своя смена)

Phase 2+ (будущее)

  • Кассовые операции — внесение/изъятие наличных, учёт в отчёте
  • Складское списание — автоматическое списание ингредиентов при закрытии смены
  • Снэпшотирование Z-отчёта — сохранение отчёта при закрытии смены (не вычислять каждый раз)
  • POS-печать — печать Z-отчёта на чековом принтере
  • Возвраты и скидки — отображение в отчёте

Связи с другими модулями