Кухонные станции
Источники требований
- BR 2.5 — Статусная модель заказа, Фаза 1 — справочник станций
- BR 5.1 — Phase 2: реальный KDS-экран, цветовые пороги per-станция
Сущность для разделения производственных зон на торговой точке. Каждый товар, требующий приготовления, привязан к конкретной станции — это позволяет определять кто и где готовит заказ (горячая кухня, холодный цех, бар, мангал и т.п.).
С приходом 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_statusper-item управляется KDS - KDS — Кухонный экран — потребитель станций для фильтрации заказов и цветовых порогов
- Настройки KDS — звуки и общие правила KDS-приложений (per-франшиза)