BR 1.12: Раздел «Ингредиенты» в Админке Франшизы
Суть
Добавить отдельный раздел «Ингредиенты» в sidebar Админки Франшизы. Франшиза управляет полным справочником ингредиентов и задаёт техкарты полуфабрикатов. Это стандарт рецептуры для всей сети — без цен и остатков (Phase 2, склад).
Контекст
- В YumaPos ингредиенты живут в отдельном разделе «Управление остатками» со списком, карточкой и вкладкой «Техкарта»
- В BR 1.11 мы перенесли ингредиенты в Warehouse Service, но решили не создавать отдельный раздел в sidebar — только inline создание в контексте техкарты товара
- Без отдельного раздела невозможно создать полуфабрикат (ингредиент с техкартой: тесто, соус, фарш)
- Пересматриваем решение из BR 1.11: добавляем полноценный раздел
Что нужно
1. Пункт в sidebar
Каталог
├── Товары
├── Категории
├── Модификаторы
├── Прейскуранты
└── Ингредиенты ← новый
2. Страница списка ингредиентов
Роут: /catalog/ingredients
| Колонка | Данные |
|---|---|
| Название | name — кликабельное, переход в карточку |
| Ед. изм. | unit_of_measure |
| Статус | status — бейдж active/inactive |
| Техкарта | Бейдж “Есть” если ингредиент имеет техкарту (= полуфабрикат) |
Действия:
- Кнопка “Добавить ингредиент” (Franchise only)
- Поиск по названию
- Фильтр по статусу
- Удаление (blocked если используется в рецептах)
API: GET /api/v1/ingredients (Warehouse Service, уже реализован в BR 1.11)
3. Карточка ингредиента
Роут: /catalog/ingredients/:id
Вкладки:
- Информация — название, описание, ед. изм., статус. Редактирование (Franchise).
- Техкарта — если есть техкарта = полуфабрикат. Тот же UI что на товаре:
- Таблица ингредиентов (рекурсия: ингредиент содержит другие ингредиенты)
- “Добавить ингредиент” → модалка поиска
- Inline-редактирование весов и потерь
- Cooking description (textarea)
- Выход готового (output_weight, output_unit)
- Если нет техкарты — “Техкарта не создана” + кнопка “Создать техкарту”
API создания техкарты ингредиента: POST /api/v1/tech-cards с ingredient_id (Warehouse, уже реализован в BUG-010)
4. Форма создания ингредиента
Роут: /catalog/ingredients/new (или модалка)
| Поле | Обязательность | Описание |
|---|---|---|
| Название | Обязательно | Уникальное per franchise |
| Описание | Необязательно | Текст |
| Ед. изм. | Обязательно | г, кг, мл, л, шт |
API: POST /api/v1/ingredients (уже реализован)
5. Редактирование ингредиента
Те же поля. Смена ед. изм. blocked если используется (INGREDIENT_IN_USE).
API: PATCH /api/v1/ingredients/{id} (уже реализован)
Ролевая модель
| Роль | Список | Карточка | Техкарта |
|---|---|---|---|
| Франшиза | Просмотр + CRUD | Редактирование | CRUD |
| Франчайзи | Просмотр | Просмотр | Просмотр |
| Менеджер ТТ | Просмотр | Просмотр | Просмотр |
| Кассир | Нет доступа | Нет доступа | Нет доступа |
Что уже реализовано (из BR 1.11 и BUG-010)
- Бэкенд:
ingredientsentity, CRUD endpoints, tech_cards с ingredient_id - BFF: proxy routes для /ingredients
- Shared types: Ingredient, CreateIngredientRequest
- API functions: getIngredients, createIngredient
Что нужно сделать
- Фронт: IngredientListPage, IngredientViewPage, IngredientCreatePage
- Фронт: sidebar пункт + роутинг
- Фронт: вкладка “Техкарта” на карточке ингредиента (аналог из ProductViewPage)
- Спеки: обновить фронт-спеку, добавить описание экранов
Что НЕ входит
- Складские остатки, приёмки, закупочные цены — Phase 2
- Себестоимость (расчёт) — Phase 2
- Импорт ингредиентов из Excel — Phase 2