Перейти к содержимому

Отчётность

Назначение

Аналитические отчёты по выручке. Денормализованная read-model для быстрых запросов. Данные из POS-чеков распределяются по методам оплаты, сотрудникам, блюдам и временным периодам.

1 контроллер, ~3 эндпоинта.


Сценарии

Дневная выручка

Актор: Владелец / Управляющий

Выручка за каждый день выбранного периода.

Фильтры: корпорация, дата начала/окончания (макс. 366 дней), опционально подразделение и метод оплаты.

Результат: дата, выручка, скидки, себестоимость, прибыль.

Почасовая выручка

Актор: Управляющий

Распределение по часам дня — пиковые часы и «мёртвые зоны».

Результат: час, выручка, количество чеков.

Выручка по сотрудникам

Актор: Управляющий

Сколько выручки принёс каждый официант/кассир.

Результат: имя, количество чеков, выручка, средний чек.

Продажи по блюдам

Актор: Менеджер меню / Управляющий

Какие блюда и сколько продано.

Результат: название, количество, выручка, себестоимость, маржа.


Как устроена read-model

Проблема

Данные для отчётов разбросаны по чекам, позициям, оплатам, номенклатуре, сотрудникам. JOIN на лету — медленно.

Решение — денормализация

При обработке чека создаются плоские записи RevenueReportEntry. Для каждой позиции чека × каждого метода оплаты:

  1. Рассчитать долю метода в сумме чека (paymentShare)
  2. Распределить пропорционально: выручка × доля, скидка × доля, себестоимость × доля
  3. Для возвратов — все суммы со знаком минус

Пример:

Чек 1000р: Стейк (700р) + Кофе (300р). Оплата: карта 600р (60%) + наличные 400р (40%).

БлюдоМетодДоляВыручка
СтейкКарта60%420р
СтейкНаличные40%280р
КофеКарта60%180р
КофеНаличные40%120р

Группировка по любому разрезу без JOIN.

Идемпотентность

При повторной обработке: старые записи удаляются → новые создаются. Безопасный пересчёт.


Бизнес-правила

  • Диапазон дат: макс. 366 дней
  • Дата начала и окончания обязательны
  • Все расчёты с timezone корпорации
  • Учётная дата — по настройке «начало учётного дня»

Связи с другими контекстами

НаправлениеЧтоЗачем
POS → ОтчётностьЧеки, позиции, оплатыИсточник данных
Организация → ОтчётностьTimezone, учётный деньГруппировка по дням
Меню → ОтчётностьНоменклатураГруппировка по блюдам
Закупки → ОтчётностьМетоды оплатыГруппировка по способам
Кадры → ОтчётностьСотрудникиОтчёт по официантам/кассирам

Сущности

Запись отчёта по выручке (RevenueReportEntry)

Денормализованная запись:

ПолеОписание
Учётная датаК какому рабочему дню относится
НоменклатураКакое блюдо
Метод оплатыКаким способом
ПодразделениеВ каком подразделении
Смена, чек, позицияСсылки на исходные данные
КоличествоПорций
Цена за единицуЦена продажи
СкидкаРазмер скидки
Итоговая ценаПосле скидки
СебестоимостьСебестоимость товара
Food costДоля себестоимости в выручке
ПрибыльВыручка − себестоимость
Доля метода оплатыКакая часть суммы на этот метод