BR 6.1: Маркетинговая информация (Standby-карусель на POS)
Демо 29.05.2026 — Сценарий 1
Этот BR закрывает Сценарий 1 показа Лидеру департамента: до прихода гостя на кассе в зале крутится карусель из брендированных слайдов Альфа. Превью — HTML-демо.
Зависит от:
- BR 1.4.4 — для permissions
- SSE-инфраструктура (BR SSE-1…7, задачи #284–289) — уже задеплоена
Контекст
Сейчас касса desktop-pos, когда не используется, либо стоит на экране входа (логин), либо в режиме главного меню. Это «мёртвое» эфирное время — место, где можно показывать бренд, акции, новинки.
Альфа ERP — позиционируем как brand-first продукт. На демо 29.05 Лидер заходит в зал и первое, что видит — наш брендированный экран на реальной кассе. Это первое впечатление, оно работает само даже до начала презентации.
Что хочет бизнес
Маркетолог / владелец точки управляет витриной кассы — закидывает картинки (постеры от мерча, акции, фото блюд), задаёт порядок и активность, видит превью. На кассе автоматически запускается полноэкранная карусель этих картинок, когда касса не используется. Новый слайд появляется на экране без перезагрузки.
Функции «Маркетинговой информации»
- Список слайдов — все слайды текущей ТТ, drag-and-drop сортировка, превью каждого
- Загрузка слайда — загружает картинку с локального диска (jpg/png/webp до 10 МБ), задаёт заголовок и активность
- Редактирование слайда — изменить заголовок, активность, порядок
- Удаление слайда — с подтверждением
- Источник слайда —
manual(загруженный вручную) илиai_photo_studio(см. BR 6.2) - Live-обновление на POS — при изменении слайдов касса подхватывает изменения моментально через SSE, без F5
Поведение на POS
- Standby-режим запускается автоматически после N минут неактивности кассира (N по умолчанию 5, конфигурируется в настройках ТТ)
- Касса показывает full-screen карусель активных слайдов
- Авто-transition между слайдами: 8–10 секунд (по умолчанию 9, конфигурируется)
- Любой клик / тач возвращает кассу в рабочее состояние (логин/главное меню)
- Если активных слайдов нет — показывается дефолтная заставка с логотипом Альфы
Пользователи
| Профиль | Кто | Permissions |
|---|---|---|
| Маркетолог / владелец ТТ | Управляет слайдами своей ТТ | marketing.read, marketing.write |
| Менеджер ТТ | Видит, но не редактирует | marketing.read |
| Кассир | Видит карусель на экране в standby (нет доступа в админке) | — |
Сущности
marketing_slide
| Поле | Тип | Описание |
|---|---|---|
id | UUID | PK |
store_id | UUID FK | К stores.id |
image_url | TEXT | URL картинки в S3 (бакет erp-marketing) |
title | VARCHAR(200) | Заголовок (для админки, на экране кассы не отображается) |
order | INTEGER | Порядок в карусели (0, 1, 2, …) |
active | BOOLEAN | Активность слайда |
source | ENUM | manual / ai_photo_studio |
source_ref | JSONB nullable | Метаданные источника (для AI: job_id, preset_id) |
created_at | TIMESTAMPTZ | |
updated_at | TIMESTAMPTZ |
Slides — per-store. Делиться между ТТ нельзя в MVP (можем добавить «общие» в Phase 2).
API (store-service)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/stores/{store_id}/marketing-slides | Список слайдов точки |
| POST | /api/v1/admin/stores/{store_id}/marketing-slides | Создать слайд (multipart с картинкой) |
| PUT | /api/v1/admin/stores/{store_id}/marketing-slides/{id} | Обновить (title, active) |
| PATCH | /api/v1/admin/stores/{store_id}/marketing-slides/reorder | Массовая смена порядка |
| DELETE | /api/v1/admin/stores/{store_id}/marketing-slides/{id} | Удалить |
| GET | /api/v1/public/stores/{store_id}/marketing-slides/active | Активные слайды для POS (без auth, по store_token) |
События (Kafka)
| Топик | Когда |
|---|---|
marketing.slide.changed | При любом CRUD: payload `{store_id, slide_id, action: ‘created' |
POS-BFF слушает топик, форвардит через SSE в активные desktop-pos сессии этой ТТ.
Новые permissions
| Ключ | Описание |
|---|---|
marketing.read | Просмотр слайдов |
marketing.write | Создание, редактирование, удаление, изменение порядка |
Системная роль «Администратор» получает обе автоматически (миграция).
Что НЕ входит в текущий скоуп
- Шеринг слайдов между ТТ одного партнёра — Phase 2
- Расписание показа (с пн по пт, с 8 до 12) — Phase 2
- A/B-тестирование слайдов — Phase 2
- Аналитика по показам (импрессии, кликабельность) — Phase 2
- Видео-слайды (mp4) — Phase 2, только статика на MVP
Затронутые сервисы и продукты
| Компонент | Что меняется |
|---|---|
| store-service | Новая сущность marketing_slide, CRUD API, outbox-публикация marketing.slide.changed |
| admin-bff | Прокси для CRUD + загрузка картинки в S3 (или прямой presigned upload) |
| erp-admin/web | Новая вкладка «Маркетинговая информация» в карточке ТТ (слева в навигации) |
| erp-pos-desktop | Standby-режим (новый route /standby), full-screen карусель, SSE-подписка |
| pos-bff | Forward marketing.slide.changed через SSE в активные сессии |
| erp-user-service | Добавить marketing.read, marketing.write в PermissionCatalog |
Acceptance criteria для демо 29.05
- На карточке ТТ есть вкладка «Маркетинговая информация» — открывается, показывает 3 seed-слайда (Hero CTA / Замена стека / AI inside)
- Загрузка нового слайда → появляется в списке за 1 секунду
- На реальной кассе (desktop-pos в зале) — после 5 минут неактивности запускается standby-карусель
- Карусель листает все активные слайды с интервалом 9 секунд
- При добавлении нового слайда в админке — он появляется в карусели на кассе без перезагрузки через ≤ 3 секунды
- Любой клик на кассе возвращает её в рабочее состояние