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.
Ролевой доступ
| Операция | Franchise | Franchisee | Manager | Cashier |
|---|---|---|---|---|
| Список ТТ | Все | Свои ЮЛ | Своя ТТ | 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 Service —
StoreService.create()синхронно вызываетPOST /internal/warehousesдля авто-создания склада (BR 1.14, best-effort: ошибка логируется, но не откатывает создание ТТ)