Отчёты по сменам
Источник требований
Аналитика по смене кассира: выручка, количество заказов, разбивка по способам оплаты, топ товаров. Данные собираются из 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-отчёта на чековом принтере
- Возвраты и скидки — отображение в отчёте
Связи с другими модулями
- Учёт рабочего времени — данные по сменам (clock_in/out, перерывы)
- Дашборд активности — список сотрудников за день (переход к отчёту по смене)
- Сотрудники — ФИО, роли
- Order Service — агрегация заказов за период
- User Service — данные смен (shift_records)
- Store Service — названия ТТ