Store Service

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

Управление торговыми точками (ТТ) и их физической инфраструктурой: CRUD магазинов, расписание работы, публикация на сайт/приложение, привязка к юридическому лицу, POS-терминалы (привязка по ФН/РН ККТ), столы зала (dine-in карта с позициями и статусами). В будущем — зоны доставки, авто-увеличение ETA при загрузке.

Функции

Public API (BR 1.5)

  • Список ТТ с пагинацией, поиском по названию/адресу, фильтрами (статус, ЮЛ, город)
  • Детали ТТ с расписанием работы (7 дней)
  • Создание ТТ (только Franchise) с привязкой к ЮЛ
  • Редактирование ТТ (Franchise — все поля, Franchisee/Manager — ограниченный набор)
  • Soft delete (только Franchise, только неопубликованные)
  • Публикация / снятие с публикации (только Franchise)

POS-терминалы

  • CRUD POS-терминалов на ТТ (POSTerminalController)
  • Привязка по fs_number (заводской номер ФН, уникальный глобально) и rn_kkt
  • Статус active/inactive, отслеживание last_seen_at при первом обращении с терминала

Столы зала (dine-in)

  • CRUD столов (ZalTableController) — номер, метка, вместимость, позиция (x/y) на canvas-карте
  • Статусы: free / occupied / reserved
  • Привязка активного заказа (current_order_id) и брони (reserved_note, reserved_until)
  • Обновление статуса по событию order.status.changed от Order Service

Маркетинговая информация (BR 6.1)

  • CRUD маркетинговых слайдов на ТТ (MarketingSlideController) — картинка, заголовок, активность, порядок
  • Multipart upload в S3-бакет erp-marketing-slides (jpg/png/webp, ≤ 10 МБ)
  • Drag-and-drop переупорядочивание через PATCH /reorder
  • Публикация события marketing.slide.changed через outbox для live-обновления карусели на POS Desktop
  • Internal endpoint /internal/stores/{id}/marketing-slides/active для POS BFF (агрегирует слайды + standby_* конфиг ТТ)
  • Конфигурируемые поля на ТТ: standby_idle_minutes (default 5), standby_transition_seconds (default 9)

Internal API (service-to-service)

  • Подсчёт ТТ по списку ЮЛ (batch)
  • Список ТТ по ЮЛ
  • Массовое снятие с публикации при приостановке ЮЛ
  • Internal POS-terminals / zal-tables — read-доступ для других сервисов

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

  • Два поля статуса: status (active/suspended) и is_published (true/false)
  • Виртуальные статусы для фронтенда: draft (active + !published), published (active + published), suspended (suspended + !published)
  • legal_entity_id неизменяем после создания
  • Публикация возможна только при status = active
  • Удаление возможно только для неопубликованных ТТ

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

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

ОперацияFranchiseFranchiseeManagerCashier
Список ТТВсеСвои ЮЛСвоя ТТ403
Детали ТТВсеСвои ЮЛСвоя ТТ403
СозданиеДаНетНетНет
РедактированиеВсе поляОграниченноОграниченноНет
УдалениеДаНетНетНет
ПубликацияДаНетНетНет

Зависимости

  • PostgreSQL (store_db) — основное хранилище
  • Redis — кэш ТТ, геоданные
  • S3/MinIO — фотографии ТТ + бакет erp-marketing-slides для маркетинговых слайдов (BR 6.1)
  • Kafka — публикация store.table.upserted (fire-and-forget) и marketing.slide.changed (через outbox)
  • User Service — ЮЛ для привязки (валидация legal_entity_id через internal API)
  • Warehouse ServiceStoreService.create() синхронно вызывает POST /internal/warehouses для авто-создания склада (BR 1.14, best-effort: ошибка логируется, но не откатывает создание ТТ)

Ссылки