Каталог — Модификаторы
(Добавлено в 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, редирект на дашборд
Переходы
| Откуда | Куда | Триггер |
|---|---|---|
| Список | Карточка просмотра | Клик по названию |
| Список | Форма создания | ”Создать группу” |
| Карточка | Форма редактирования | ”Редактировать” |
| Форма | Карточка | После сохранения / “Отмена” |