Кухонные станции

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

Сущность для разделения производственных зон на торговой точке. Каждый товар, требующий приготовления, привязан к конкретной станции — это позволяет определять кто и где готовит заказ (горячая кухня, холодный цех, бар, мангал и т.п.).

С приходом BR 5.1 — справочник стал полноценной сущностью с цветовыми порогами для KDS-карточек. На KDS-устройстве повар выбирает 1+ станций при логине и видит только заказы своих станций.


Сущность kitchen_station

Поля

ПолеОбязательностьОписание
idОбязательно (auto)UUID, первичный ключ
franchise_idОбязательноМультитенантность — каждая франшиза свой набор станций
nameОбязательноНазвание, например «Горячая кухня», «Бар», «Мангал». Макс 50 символов
descriptionНеобязательноСвободное описание
yellow_threshold_minutesОбязательноDefault: 5. Порог жёлтого цвета на KDS-карточке: карточка желтеет за N минут до expected_ready_at. (Добавлено в BR 5.1)
red_threshold_minutesОбязательноDefault: 0. Просрочка — карточка краснеет когда now > expected_ready_at + N минут (0 = просрочка с момента дедлайна). (Добавлено в BR 5.1)
deleted_atНеобязательноSoft delete
created_atОбязательно (auto)
updated_atОбязательно (auto)

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

Уникальность имени

  • Имя станции уникально в рамках франшизы среди не удалённых записей (deleted_at IS NULL)
  • Регистронезависимое сравнение при проверке (LOWER(name))

Предустановленных станций нет

  • При bootstrap новой франшизы никакие станции автоматически не создаются — владелец сам заводит под своё заведение
  • Причина: у шаурмечных и ресторанов структура производства разная, навязывать «Кухня / Бар» — контрпродуктивно

Нет «станции по умолчанию»

  • На каждом товаре с requires_kitchen=true поле kitchen_station_id выбирается вручную при создании/редактировании товара. Скрытой автоматической привязки нет.
  • Удобство: если у франшизы заведена ровно одна станция, форма товара авто-подставляет её при включении «Требует приготовления». Если станций больше — выбор обязателен.
  • Поле is_default было удалено в миграции 037 (раньше использовалось как UX-флаг авто-подстановки, но никакой бизнес-логики на него не висело и оно вводило в заблуждение — флаг можно было поставить нескольким станциям без эффекта).

Soft delete + защита от удаления

  • Удаление — soft (deleted_at)
  • Нельзя удалить станцию, если на неё ссылается хотя бы один активный товар (products.kitchen_station_id = X AND products.deleted_at IS NULL)
  • При попытке удалить — 422 STATION_IN_USE, в ответе список связанных товаров (или хотя бы их количество)
  • Для удаления: либо отвязать все товары, либо удалить товары заранее

Изменение названия

  • Название можно менять в любой момент
  • Связанные товары продолжают ссылаться на ту же станцию (FK по id)

Связь с каталогом

Товары в Каталоге имеют два поля:

  • requires_kitchen (boolean) — требует ли товар приготовления
  • kitchen_station_id (FK → kitchen_stations.id, nullable)

Правило: если requires_kitchen=true, то kitchen_station_id обязательно (не NULL). Иначе (requires_kitchen=false) — станция может быть не указана.

Подробности — в спеке Каталог.


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

ДействиеФраншизаФранчайзиМенеджер ТТКассир
Просмотр списка станцийВсеВсеВсеНет
Создать станцию
Редактировать станцию
Удалить станцию

Permissions (из Ролевой модели):

  • Просмотр — catalog.read
  • CRUD — catalog.edit

Связка с KDS-приложением

(Добавлено в BR 5.1)

Подробности — в Кухонный экран. Кратко:

  • При логине на KDS повар выбирает одну или несколько станций франшизы (multi-select)
  • На устройстве отображаются только заказы с позициями этих станций (фильтр order_item.kitchen_station_id IN selected)
  • В карточке заказа позиции группируются по станциям, у каждой — отдельный блок и отдельная кнопка «Готово»
  • Цветовые пороги (yellow_threshold_minutes, red_threshold_minutes) применяются в KDS для расчёта цвета карточки от expected_ready_at (см. Заказы). Если в заказе позиции нескольких станций — выигрывает самая «жёсткая» окраска (минимум).
  • Изменение порогов в админке применяется на KDS-устройствах при следующем pull (логин / перезапуск / явное «Применить»). Live-push — отложен в P1.
  • Soft-delete станции: устройства, у которых она в selected_station_ids, при следующем pull получат уведомление и будут вынуждены перелогиниться.

Глобальные настройки KDS франшизы (звуки, авто-логаут)

Не привязаны к станции — лежат в Настройки KDS (одна запись на франшизу).

Что НЕ входит (Phase 3+)

(Обновлено в BR 5.1 — KDS-экран теперь входит)

  • Принтеры per-станция (физическая печать чека на принтер конкретной станции, ESC/POS) — отложено в BR 5.4
  • Курсы подачи (порядок горячее/холодное/десерт внутри карточки) — BR 5.6
  • Расписание работы станций (например: «мангал работает только с 18:00 до 23:00» — автостоп товаров вне времени) — отложено
  • Per-store пороги — пока только per-станция (общая для всех ТТ); per-store настройки отложены

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

  • Каталогproduct.kitchen_station_id указывает на станцию
  • Заказы — правило «flow зависит от типа заказа и наличия кухонных позиций» опирается на requires_kitchen товаров; kitchen_status per-item управляется KDS
  • KDS — Кухонный экран — потребитель станций для фильтрации заказов и цветовых порогов
  • Настройки KDS — звуки и общие правила KDS-приложений (per-франшиза)

Ссылки