Каталог — Модификаторы

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

Роут: /catalog/modifiers API: GET /api/v1/modifier-groups, GET /api/v1/modifier-groups/{id}, POST /api/v1/modifier-groups, PATCH /api/v1/modifier-groups/{id}, DELETE /api/v1/modifier-groups/{id}, POST /api/v1/modifier-groups/{id}/restore, GET /api/v1/modifier-groups/{id}/assignments, POST /api/v1/modifier-groups/{id}/assignments, POST /api/v1/products/{id}/dependent-modifiers

Справочник групп модификаторов. Каждая группа содержит опции. Изменения применяются мгновенно — без версионирования.


Список групп

Роут: /catalog/modifiers

Таблица

КолонкаДанныеПримечание
НазваниеnameКликабельное — переход в карточку
ТипtypeБейдж: Групповой (group) / Простой (single)
Опцийoption_countЧисло
СтатусstatusБейдж: Активный / Неактивный. Для Franchise — кликабельный inline toggle (PATCH status)

Фильтры

ФильтрТипЗначенияDefault
ТипSelectВсе / Групповой / ПростойВсе
СтатусSelectВсе / Активный / НеактивныйВсе

Поиск

  • По названию (debounce 300ms)

Пагинация

  • 20 записей на страницу

Табы

  • “Активные” (default)
  • “Удалённые” (только Franchise) — soft deleted с кнопкой “Восстановить”

Действия

КнопкаПереходВидимость
”Создать группу”/catalog/modifiers/newТолько Franchise

Состояния

СостояниеЧто показываем
ЗагрузкаSkeleton-таблица
Пусто (Franchise)“Группы модификаторов пока не созданы” + кнопка “Создать группу”
Пусто (Franchisee/Manager)“Группы модификаторов пока не созданы”
Ошибка”Не удалось загрузить данные” + “Повторить”

Карточка группы

Роуты:

  • /catalog/modifiers/:id — просмотр
  • /catalog/modifiers/new — создание
  • /catalog/modifiers/:id/edit — редактирование

API: GET /api/v1/modifier-groups/{id}, POST /api/v1/modifier-groups, PATCH /api/v1/modifier-groups/{id}

Просмотр

Табы: Информация | Назначенные продукты (N)

Таб “Информация”

Поля группы (readonly) + inline-таблица опций (readonly).

ПолеДанные
Названиеname
Типtype — бейдж
Мин. опцийmin_amount
Макс. опцийmax_amount
Статусstatus — бейдж

Таблица опций:

КолонкаДанныеПримечание
Названиеname
Мин. кол-воmin_amount
Макс. кол-воmax_amount
По умолчаниюdefault_amount
Бесплат.free_quantity
Акт.is_activeДа/Нет
ТехкартаБейдж “Есть” (кликабельный) / кнопка “Создать”. (BR 1.9.1)
Код 1Сsku_1cПоказывается только для structural-привязки группы. Заполнено → текст-код моноширинным шрифтом. Пусто → значок ⚠️ «Не заполнен» (красная подсказка). (BR 1.17)

Видимость колонки «Код 1С»

Колонка скрыта если у группы все привязки binding_type = free. Видна если хотя бы один привязанный товар имеет binding_type = structural для этой группы. Также видна всегда для зависимых модификаторов (см. ниже).

Таб “Назначенные продукты” (MOD-03/11)

API: GET /modifier-groups/{id}/assignments, POST /modifier-groups/{id}/assignments

Таблица назначенных продуктов:

КолонкаДанныеПримечание
Продуктproduct_nameСсылка на /catalog/products/{product_id}
Категорияcategory_nameили ”—“
Тип привязкиbinding_typeБейдж: “Зависимый” (structural) / “Свободный” (free)

Кнопка “Назначить на продукты” (Franchise) → модалка:

  • Дерево категорий (раскрываемые разделы)
  • Продукты внутри каждой категории — чекбоксы
  • Уже назначенные продукты — disabled с пометкой “(уже назначен)”
  • Привязка типа free
  • Toast “Назначено на N продуктов”

Состояния:

  • Пусто → “Группа не назначена ни на один продукт”
  • Загрузка → спиннер

Кнопки: “Редактировать” (Franchise only), “Назад к списку”, “Удалить” (Franchise only).

Модалка техкарты опции (BR 1.9.1)

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

При клике на “Есть” или “Создать” в колонке “Техкарта” — модалка с рецептурой опции.

API (Warehouse Service):

  • GET /api/v1/modifier-tech-cards?modifier_option_id={id}
  • POST /api/v1/modifier-tech-cards — создание
  • PATCH /api/v1/modifier-tech-cards/{id} — обновление
  • POST /api/v1/modifier-tech-cards/{id}/items — добавить ингредиент
  • DELETE /api/v1/modifier-tech-cards/{id}/items/{itemId} — убрать

Содержимое модалки:

  • Шапка: выход (output_weight + output_unit), статус (active/inactive)
  • Таблица ингредиентов (аналогично табу Техкарта в товаре):
    • Колонки: ингредиент, тип, брутто, нетто, % потерь, действия
    • Inline-редактирование брутто/нетто с авто-пересчётом
    • “Добавить ингредиент” → sub-модалка (поиск + быстрое создание)
    • “Убрать” → подтверждение
  • Без per-size вкладок (это добавки, не размеры)

Состояния:

  • Техкарта не создана → “Создать техкарту” (Franchise)
  • Пустая → “Добавить ингредиент”
  • Read-only для Franchisee/Manager

Создание

Форма:

  • Название (text, required)
  • Тип (select: Групповой / Простой, required)
  • Мин. опций (number, default 0)
  • Макс. опций (number, default 1)

Inline-таблица опций (editable):

ПолеТипRequired
НазваниеTextДа
Мин. кол-воNumberНет (default 0)
Макс. кол-воNumberНет (default 1)
По умолчаниюNumberНет (default 0)
Бесплат.NumberНет (default 0)
Акт.CheckboxНет (default true)
Код 1СText (50)Нет — обязательно для structural-привязок (BR 1.17)
ПорядокСтрелки ↑↓

Подсказка над «Код 1С» при создании

«Заполните если опция будет использоваться в structural-моде (привязка к товару как ‘зависимая’). Код берётся из справочника Номенклатура 1С. Подробнее — 1С Общепит

Кнопка ”+ Добавить опцию” — новая строка в таблице. Кнопка ”✗” на строке — удалить опцию. Стрелки ↑↓ — переупорядочивание опций.

Кнопки: “Сохранить” / “Отмена”. После успеха: redirect на карточку, toast “Группа создана”.

Редактирование

Те же поля, предзаполненные + select “Статус” (active/inactive). Изменения применяются мгновенно.

Опции заменяются целиком

При сохранении отправляется полный список опций. Удалённые опции исчезают, новые добавляются.

После успеха: redirect на карточку, toast “Группа обновлена”.

Создание зависимого модификатора (со страницы продукта)

На ProductViewPage → секция “Закреплённые модификаторы” → кнопка “Создать”:

  • Модалка: Название группы, Мин./Макс. опций, inline-таблица опций
  • Создаёт группу типа single + привязывает как structural к текущему товару
  • API: POST /products/{id}/dependent-modifiers
  • После успеха: обновляет список модификаторов продукта, toast “Зависимый модификатор создан”

Код 1С обязателен в зависимых модификаторах (BR 1.17)

Зависимый модификатор = всегда structural. В модалке создания у каждой опции поле «Код 1С» обязательное. Валидация на фронте при попытке сохранить:

  • Пустое поле → красная обводка ячейки + текст «Заполните Код 1С»
  • Дубликат кода в группе → красная подсветка обеих строк + текст «Коды должны быть уникальны»

Кнопка «Сохранить» дизейблится пока есть невалидные поля.

Ошибки

КодЧто показываем
NAME_DUPLICATE (409)“Группа с таким названием уже существует”
VALIDATION_ERROR (400)Подсветка полей + текст ошибки
STRUCTURAL_OPTION_MISSING_SKU_1C (422)Toast: «Не все опции имеют Код 1С — заполните перед привязкой как structural» + красные обводки пустых полей в таблице опций (BR 1.17)
DUPLICATE_SKU_1C_IN_GROUP (422)Toast: «Код 1С должен быть уникальным в рамках группы» + подсветка дублирующихся строк (BR 1.17)

Ролевая видимость

Franchise

  • Все действия: CRUD групп, опций, таб “Удалённые”
  • Inline toggle статуса в списке
  • Массовое назначение на продукты (таб “Назначенные продукты”)
  • Создание зависимых модификаторов со страницы продукта

Franchisee / Manager

  • Только просмотр модификаторов
  • Нет кнопки “Создать”, нет “Редактировать”, нет таба “Удалённые”

Cashier

  • 403, редирект на дашборд

Переходы

ОткудаКудаТриггер
СписокКарточка просмотраКлик по названию
СписокФорма создания”Создать группу”
КарточкаФорма редактирования”Редактировать”
ФормаКарточкаПосле сохранения / “Отмена”

Ссылки