BR 1.11: Меню с версионностью (Франчайзи) — ОТМЕНЕНА
ОТМЕНЕНА
Меню — не отдельная сущность. Меню вычисляется на лету из: каталог (published) + прейскурант − стоп-листы − складские остатки. Версионирование перенесено на каталог (BR 1.7).
Зависит от:
Перед реализацией
Необходимо создать продукт “Админка Франчайзи” в
08-Specs/Админка Франчайзи/и репозиторийerp-franchisee.
Контекст
Каталог (BR 1.7) — справочник товаров франшизы. Но каталог сам по себе не определяет что продаётся на конкретной ТТ. Для этого нужна сущность Меню.
Меню — набор товаров из каталога, который франчайзи собирает для своих ТТ. Меню версионируется: черновик → публикация → архив.
Фронт: Админка Франчайзи (будущий erp-franchisee). Франшиза видит меню франчайзи в readonly.
Каталог и Меню — разные сущности
Каталог = “что существует” (справочник франшизы, BR 1.7). Меню = “что продаём” (конфигурация франчайзи, эта BR).
Что нужно
1. Сущность “Меню”
Поля:
- Название (обязательное, например “Основное”, “Летнее”, “Завтрак”)
- Франчайзи (владелец меню)
- Статус: draft / published / archived
- Версия (автоинкремент: 1, 2, 3…)
- Дата публикации
- Дата архивирования
2. Позиции меню (MenuItems)
- Товар из каталога (только из разрешённых для ТТ — доступность, BR 1.9)
- Порядок отображения
- Цена не хранится в меню — берётся из прейскуранта ТТ (BR 1.9)
3. Жизненный цикл (версионность)
[Создание] → DRAFT
↓
[Редактирование — свободно]
↓
[Публикация] → PUBLISHED
↓
[Нажатие "Редактировать"]
↓
Создаётся новый DRAFT (копия текущего PUBLISHED)
Старый PUBLISHED продолжает работать
↓
[Публикация нового DRAFT]
↓
Новый → PUBLISHED
Старый → ARCHIVED
Правила:
- Одновременно 1 PUBLISHED версия на одно меню
- DRAFT — свободное редактирование (добавление/удаление товаров, порядок)
- PUBLISHED — нельзя редактировать. Кнопка “Редактировать” → создаёт DRAFT (копия)
- При публикации DRAFT → текущий PUBLISHED → ARCHIVED
- ARCHIVED — только просмотр. Кнопка “Восстановить” → создаёт DRAFT (копия)
- Франчайзи сам апрувит (без цепочки согласования)
4. Привязка к ТТ
- Каждая ТТ привязана к одному опубликованному меню
- На MVP: одно меню на франчайзи (все его ТТ используют одно меню)
- В будущем: несколько параллельных меню (Завтрак, Основное, Летнее), ТТ привязана к нескольким
5. Что видит клиент
Товар виден клиенту на ТТ если:
- Товар существует в каталоге и
status = active - Товар разрешён для ТТ (доступность, BR 1.9)
- Товар включён в опубликованное меню ТТ
- Товар не в стоп-листе (BR 1.10)
- ТТ опубликована (BR 1.5)
Цена = прейскурант ТТ → базовая цена товара (fallback).
6. Ролевой доступ
| Роль | Что может |
|---|---|
| Франшиза | Просмотр всех меню всех франчайзи (без редактирования) |
| Франчайзи | CRUD своих меню: создание, редактирование draft, публикация, просмотр архива |
| Менеджер ТТ | Просмотр опубликованного меню своей ТТ |
| Кассир | Нет доступа в админке |
Структура фронта (Админка Франчайзи)
Sidebar (Админка Франчайзи):
├── Dashboard
├── Мои ТТ
├── Меню ← этот раздел
│ ├── /menus — Список меню (название, статус, версия, дата)
│ ├── /menus/new — Создание меню
│ ├── /menus/:id — Просмотр меню
│ ├── /menus/:id/edit — Редактор (только draft)
│ └── /menus/:id/versions — Архив версий
├── Стоп-листы
└── ...
Ключевой экран: Редактор меню
Экран редактирования draft-версии:
- Левая панель: каталог товаров (дерево категорий, список товаров с поиском). Показываются только разрешённые для ТТ франчайзи.
- Правая панель: товары в меню (порядок, кнопка удаления). Цены рядом (из прейскуранта, информационно).
- Действия: чекбоксы или drag-and-drop для добавления из каталога в меню.
- Статус-бар: “Черновик v3” с кнопками “Сохранить” / “Опубликовать” / “Отменить”.
Франшиза видит меню в readonly
В Админке Франшизы (erp-admin):
- Раздел “Меню франчайзи” — список всех меню всех франчайзи
- Просмотр содержимого (какие товары, какая версия, статус)
- Без возможности редактирования
Что НЕ входит (отложено)
- Несколько параллельных меню на ТТ — Phase 2 (архитектура готова)
- Расписание меню (Завтрак до 12:00) — Phase 2
- A/B тестирование меню — Phase 2+
- Сохранённые пресеты/наборы (“Летнее”, “Зимнее”) — Phase 2