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.
Ролевой доступ
| Операция | Franchise | Franchisee | Manager | Cashier |
|---|---|---|---|---|
| Категории (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_URL | PostgreSQL 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С Общепит.
Ключевые решения
ADR-011 — Версионирование каталога: упразднено, каталог без версионированияADR-012 — Ингредиенты отложены: типingredientубран из каталога — ингредиенты перенесены в Warehouse Service (BR 1.11)
Что НЕ входит в 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
- КБЖУ, аллергены, штрихкод
Тип— убран, ингредиенты в Warehouse Service (BR 1.11)ingredient- Допродажи и рекомендации