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)

  • Бэкенд: ingredients entity, 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