Catalog Service

Ответственность

Единый каталог = товары + категории. Изменения применяются напрямую.

Функции

Kafka Events (BR 3.4)

  • Publisher для 6 топиков изменений каталога: catalog.product.{upserted,deleted}, catalog.category.{upserted,deleted}, catalog.modifier_group.{upserted,deleted}
  • Transactional outbox (таблица catalog_outbox) — гарантия доставки
  • Consumer — Paykeeper Adapter для синхронизации в ЛК PayKeeper. Подробнее: Events
  • Internal endpoint GET /internal/catalog/full-snapshot?franchise_id=X — полный срез для re-sync (ночной cron + manual)

Public API (BR 1.7 + BR 1.7.1 + BR 1.7.2)

  • Категории: standalone CRUD дерева категорий франшизы
  • Товары: справочник всех товаров франшизы (CRUD с category_id, soft delete + восстановление)
  • Модификаторы: справочник групп модификаторов с опциями (CRUD, soft delete), привязка к товарам. Изменения применяются мгновенно (BR 1.8)
  • Прейскуранты: справочник прейскурантов (CRUD), цены товаров и опций модификаторов. Изменения применяются мгновенно (BR 1.10)
  • Стоп-листы per-store: блокировка товаров и категорий от продажи per-ТТ (BR 1.13)
  • КБЖУ товара: поля kcal, protein, fat, carbs в Product (миграция 019, BR 2.1)
  • Технологические флаги товара: is_open_price, is_by_weight, is_exclude_from_promo, is_manual_discount_banned, is_admin_only, is_alcohol, is_tobacco, is_sugary_drink — управляют доступом и поведением на кассе
  • Вычисляемое меню ТТ (BR 1.16) — агрегированная выдача видимых товаров с учётом прейскуранта ТТ и стоп-листа
  • External Menu Builder (BR 4.1) — конструктор внешних меню для каналов вне ERP (рекламный монитор, JSON-экспорт; в BR 4.2 — Yandex.Eda и Коала). Сущности external_menus, external_menu_categories, external_menu_items с якорной связью на products. Override полей (имя, описание, цена, видимость), soft-delete с восстановлением, live URL для kiosk-mode + WebSocket, offline ZIP. Stop-list применяется автоматически при рендере. Топик external_menu.updated для live-обновления

Бизнес-правила

  • Категории: standalone CRUD, иерархия через parent_id. Удаление — только если нет дочерних и нет привязанных товаров
  • Товары: category_id на товаре (nullable). Изменения применяются мгновенно
  • Уникальность названия товара: в рамках franchise_id среди неудалённых
  • Soft delete товаров: deleted_at, восстановление через отдельный эндпоинт
  • Флаги на товаре: управляют UX (открытая цена на кассе, весовой товар, исключение из промо/ручной скидки, 18+, табак, сахаросодержащий напиток, только админ)

Подробнее: Спецификация каталога

JWT валидируется локально (HS256 + shared secret). Auth Service не используется на этапе MVP.

Ролевой доступ

ОперацияFranchiseFranchiseeManagerCashier
Категории (GET)ДаДаДа403
Категории (CRUD)ДаНетНетНет
Список товаровВсеАктивные товарыАктивные товары403
Детали товараЛюбойАктивные товарыАктивные товары403
CRUD товаровДаНетНетНет
Удаление / восстановлениеДаНетНетНет
Справочник модификаторовCRUDАктивныеАктивные403
Привязка модификаторов к товарамДаНетНетНет
Стоп-листы (просмотр)Все ТТСвои ТТСвоя ТТRead-only
Стоп-листы (остановить/снять)Любая ТТСвои ТТСвоя ТТ403

Зависимости

  • PostgreSQL (catalog_db) — основное хранилище

Redis и S3 не нужны на MVP

  • Redis — кэш каталога планируется в Phase 2 (вычисляемое меню)
  • S3/MinIO — фотографии товаров планируются в Phase 2

Конфигурация

ПеременнаяОписаниеDefault
DATABASE_URLPostgreSQL connection string
JWT_SECRETСекрет для валидации JWT (HS256)
SERVICE_TOKENТокен для internal API (будущее)
SERVER_PORTПорт сервиса3004

Интеграция с 1С Общепит

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

Catalog Service хранит маппинг товаров и опций модификаторов с номенклатурой 1С Общепит:

  • products.sku — для простых товаров. Формат 1c:КОД (например 1c:00000003541). Используется существующее поле, без миграции.
  • modifier_options.sku_1c — для опций structural-модификатора (BR 1.17, миграция 031). Новое поле, nullable.

Правило валидации: опции группы, привязанной как structural к товару, обязаны иметь заполненный sku_1c. Нарушение — ошибка STRUCTURAL_OPTION_MISSING_SKU_1C (422).

При сохранении группы / привязки модификатора Service проверяет это правило. Подробнее — см. 1С Общепит.

Ключевые решения

Что НЕ входит в MVP

  • Модификаторы товаров — реализованы (BR 1.8)
  • Прейскуранты — реализованы (BR 1.10)
  • Стоп-листы — реализованы (BR 1.13)
  • КБЖУ — реализовано (миграция 019, BR 2.1)
  • Техкарты (BR 1.9, Warehouse Service)
  • Фото товаров (S3)
  • Tags / Daily menu / Аллергены — см. Не реализовано vs YumaPOS
  • КБЖУ, аллергены, штрихкод
  • Тип ingredient — убран, ингредиенты в Warehouse Service (BR 1.11)
  • Допродажи и рекомендации

Ссылки