Каталог

Категории, товары, модификаторы, прейскуранты, стоп-листы, техкарты, меню в карточке ТТ.

Известно багов в зоне: 24 + cross-cutting (X02, X04)

1 Critical, 13 Major, 10 Minor. Подробности — inline ниже.

Категории

  • Дерево с parent_id, неограниченная вложенность (на практике 2-3 уровня)
  • Активность с каскадной деактивацией (отключаешь родителя → дочерние и товары отключаются)
  • Каскадная активация — НЕ работает, дочерние не включаются автоматически (BUG-040)
  • Удаление — только если нет дочерних (CATEGORY_HAS_CHILDREN) и нет товаров (CATEGORY_HAS_PRODUCTS)
  • Порядок отображения, цвет, доступность по каналам — недоступны для редактирования, можно только название (BUG-039)
  • Создание с пустым именем — сохраняется без ошибки и подсказки (BUG-042)
  • 255 символов без пробелов — ломает вёрстку, при редактировании 409 (BUG-041)
  • «Без категории» — товары с category_id=NULL

Товары — CRUD

  • CRUD: создание, редактирование (моментально), soft delete с восстановлением
  • Тип: dish / good (тип ingredient убран в BR 1.11)
  • Уникальность названия в рамках franchise_id среди неудалённых
  • Категория (nullable)
  • Смена категории на «Без категории» — возвращается исходная категория (BUG-035)
  • Дублирование товара — не переносит фото, модификаторы, техкарту (BUG-036)
  • Фильтры по типу, статусу, категории
  • Фильтр «Ингредиент» — пусто, хотя ингредиенты в системе есть (BUG-032)
  • Поиск по названию

Товары — поля

  • КБЖУ: kcal, protein, fat, carbs (миграция 019, BR 2.1)
  • Фискальные атрибуты (BR 3.3): vat_rate, payment_subject, payment_type — обязательны для PayKeeper invoice
  • Технологические флаги: is_open_price, is_by_weight, is_exclude_from_promo, is_manual_discount_banned, is_admin_only, is_alcohol, is_tobacco, is_sugary_drink
  • Связка requires_kitchenkitchen_station_id (обязательна при requires_kitchen=true, NULL при false)
  • При смене requires_kitchen=true→false — kitchen_station_id сбрасывается
  • «Доступно во всех точках» — снятие галочки не сохраняется (BUG-031)

Товары — UX полей

  • Поле «Описание» — шрифт textarea, не консистентен с обычными input (BUG-030, BUG-X02)
  • Поле «Описание» — растягивается без предела (нет auto-resize / max-height) (BUG-037)
  • Поле «Описание» — длинные строки без пробелов выходят за границы страницы (BUG-038, BUG-X04)

Товары — версионирование (BR 1.7 / ADR-011)

  • Изменение товара должно создавать новую version — НЕ реализовано (BUG-033)
  • Фильтр версионного списка в каталоге — отсутствует (BUG-034)

Модификаторы

  • Группы CRUD с binding_type (structural / free)
  • Опции с ценой, привязанные к группе
  • Min/max по группе и опциям — нет валидации (нет проверки max ≥ min) (BUG-044)
  • Опция: нет maxlength=255, принимает «Пробел» как значение (BUG-045)
  • Привязка модификаторов к товарам через таб «Модификаторы» (BR 1.8.1)
  • Две секции: «Закреплённые» (structural) / «Свободные» (free)
  • Изменения применяются мгновенно (BR 1.8)
  • Поле «Описание» при создании модификатора — шрифт textarea (BUG-043)

Прейскуранты

  • CRUD прейскурантов
  • Привязка к ТТ (один прейскурант на ТТ через stores.price_list_id)
  • Цены товаров и опций модификаторов в price_list_items / price_list_modifier_items
  • Auto-populate активным каталогом при создании
  • Только цены редактируются — Название/Активность/Назначено ТТ недоступны (BUG-050)
  • Создание — нельзя вручную привязать к ТТ, всегда становится дефолтным (BUG-051)
  • «Назначено ТТ» = 0 даже после привязки

Стоп-листы (per-store)

  • Блокировка товаров и категорий per-ТТ
  • Просмотр: Franchise — все ТТ; Franchisee — свои; Manager — своя ТТ
  • Постановка/снятие стопа: Franchise — любая ТТ; Franchisee — свои ТТ; Manager — своя
  • Manager → 403 на постановку/снятие стопа на своей ТТ (BUG-049)
  • Cashier — 403 на изменения, read-only на просмотр
  • Internal endpoint для проверки доступности (GET /stop-lists/stores/{storeId}/check/{productId})

Техкарты блюд (per-product)

  • Per-product (для блюд type=dish)
  • Per-option модификатора (для размеров «Пицца 25/30/35»)
  • Состав: ингредиенты с gross/net weight, потери (cold/hot loss)
  • Опции закреплённого модификатора — техкарта синхронизирована между опциями (изменение одной меняет все) (BUG-047)
  • Удаление текста «Технология приготовления» не сохраняется (текст возвращается) (BUG-048)
  • Расчёт себестоимости с разворачиванием полуфабрикатов

Ингредиенты (справочник)

  • Справочник franchise-level (CRUD)
  • Уникальность по name per franchise
  • Поле «Описание» — шрифт textarea (BUG-046)
  • См. также Зона 05 — Склад для приёмок и списаний

Меню в карточке ТТ (вычисляемое)

  • Меню = все активные товары + прейскурант ТТ + стоп-листы (вычитаются)
  • BR 1.16: эндпоинт GET /internal/catalog/menu с фильтрацией по store_id
  • Переход во вкладку «Меню» в карточке ТТ → 500 (BUG-060)
  • В Меню отсутствует кнопка/возможность добавить товар (BUG-061)
  • Вместо описания товара отображаются модификаторы, привязанные к товару (BUG-062)

Связано: