Маркетинговая информация
Источники требований
Модуль управления статичными слайдами для standby-режима POS-кассы в зале. Маркетолог / владелец ТТ загружает картинки (постеры мерча, акции, фото блюд), задаёт порядок и активность, в standby-режиме они крутятся как полноэкранная карусель на кассе. Новый слайд появляется на кассе без перезагрузки через SSE.
Эфирное время кассы
Когда кассир не работает с кассой N минут — экран превращается в брендированный «дисплей-витрину». Это часть позиционирования Альфа ERP как brand-first продукта (первое впечатление при входе в зал).
Сущность «Слайд» (marketing_slide)
| Поле | Обязательность | Описание |
|---|---|---|
| Картинка | Обязательно | jpg / png / webp, до 10 МБ, разрешение ≥ 1280×720, рекомендуется 16:9 |
| Заголовок | Обязательно | До 200 символов. Видим только в админке (на кассе не отображается) |
| Порядок | Авто | Целое число 0…N, задаётся drag-and-drop. Стартовое значение — MAX(order) + 1 |
| Активность | Обязательно | Boolean. По умолчанию true |
| Источник | Авто | manual (загружен из админки) / ai_photo_studio (связка через BR 6.2) |
| Метаданные источника | Опционально | Для ai_photo_studio: job_id, preset_id (для трассировки) |
| ТТ | Обязательно | Слайды per-store, делиться между ТТ нельзя в MVP |
Бизнес-правила
- Per-store — слайды принадлежат конкретной ТТ. В MVP шеринг между ТТ не предусмотрен (см. Deferred)
- Максимум активных слайдов на ТТ — 20. При попытке создать 21-й активный слайд — ошибка
MARKETING_SLIDES_LIMIT_REACHED - Форматы — только статика
image/jpeg,image/png,image/webp. mp4 и анимированные gif — Phase 2 - Размер файла — ≤ 10 МБ. При превышении —
VALIDATION_ERRORсо списком требований - Soft delete — слайд помечается
deleted_at, картинка из S3 не удаляется немедленно (отложенная очистка раз в сутки) - Drag-and-drop порядка — клиент шлёт целый массив
[{id, order}]одним PATCH, бэк перезаписываетorderвсем слайдам ТТ в транзакции - Источник — нельзя сменить вручную.
ai_photo_studioприсваивается автоматически когда слайд создаётся через эндпоинт BR 6.2
Поведение на POS (standby-карусель)
(Полный flow — Standby-режим)
| Параметр | Значение по умолчанию | Где конфигурируется |
|---|---|---|
| Idle до запуска standby | 5 минут | Поле standby_idle_minutes на ТТ (см. Торговые точки) |
| Transition между слайдами | 9 секунд | Поле standby_transition_seconds на ТТ |
| Выход из standby | Любой клик / тач / клавиша | — |
Триггер: standby запускается только когда кассир залогинен и проявляет неактивность ≥ standby_idle_minutes. До логина — стандартный LoginScreen без карусели (см. Deferred — pre-login standby).
Live-обновление: при изменении слайдов (CRUD, reorder, активность) — Store Service публикует Kafka-событие marketing.slide.changed, pos-bff форвардит через SSE как marketing.invalidate, POS Desktop перезагружает список активных слайдов без F5.
Empty state: если активных слайдов на ТТ нет — показывается дефолтная заставка с логотипом Альфа ERP (захардкожена в POS Desktop, не зависит от данных).
Ролевая матрица
(По Ролевой модели + permissions-каталог Роли)
| Действие | Владелец франшизы | Владелец партнёра | Обычный сотрудник | Кассир |
|---|---|---|---|---|
| Просмотр списка слайдов своей ТТ | Все ТТ франшизы | Только свои ТТ | marketing.read в рамках своих ТТ | — |
| Создание / редактирование / удаление | Все ТТ | Свои ТТ | marketing.write в рамках своих ТТ | — |
| Изменение порядка | Все ТТ | Свои ТТ | marketing.write | — |
| Просмотр карусели на экране кассы | — | — | — | Видит standby после idle |
Системная роль «Администратор» получает marketing.read + marketing.write автоматически.
Создание слайда
Через форму «Маркетинговая информация» (manual)
- Маркетолог выбирает ТТ (если ещё не выбрана)
- Кнопка «Загрузить слайд» открывает форму:
- Image picker (drag-and-drop или клик)
- Поле «Заголовок»
- Checkbox «Активен» (по умолчанию
true)
- Превью с проверкой размера/формата перед отправкой
- Submit → multipart POST в store-service (см. API)
- После успеха — список обновляется, новый слайд добавляется в конец
Через AI Photo Studio (ai_photo_studio)
См. BR 6.2. В UI текущего модуля — кнопка «Сгенерировать через AI», открывает PhotoStudioModal с preset’ом «Постер». После генерации картинка копируется в erp-marketing-slides бакет и создаётся слайд с source=ai_photo_studio.
В текущей итерации (BR 6.1)
Кнопка «Сгенерировать через AI» — UI-заглушка (disabled с tooltip «Будет в BR 6.2»). Полноценная связка — в BR 6.2.
Редактирование слайда
Можно менять:
- Заголовок
- Активность
- Картинка (опционально — заменить файл; старая удаляется отложенно)
Нельзя менять:
sourceиsource_ref— авто, иммутабельныorder— меняется отдельным PATCH-эндпоинтомreorder(drag-and-drop)- ТТ — слайд нельзя переносить между ТТ (создать новый на нужной ТТ)
Удаление слайда
- Soft delete:
deleted_atустанавливается, слайд исчезает из списка - Картинка в S3 — не удаляется немедленно (cron очистки раз в сутки удаляет файлы без ссылок)
- Подтверждение в UI: «Удалить слайд “{title}“? Действие необратимо»
Изменение порядка (drag-and-drop)
- На UI — drag-and-drop в таблице слайдов
- При отпускании — отправляется один PATCH с массивом
[{id, order}]всех слайдов ТТ - Бэк в транзакции перезаписывает
orderвсем строкам - Публикуется одно событие
marketing.slide.changedсaction: reordered - POS получает SSE → reload
Список слайдов
Колонки
- Превью — миниатюра 60×60, ratio 16:9 letterbox
- Заголовок
- Порядок — drag-handle для перетаскивания
- Источник — chip
Загружено/AI Photo Studio - Активность — toggle
- Создан — дата
- Действия — меню (редактировать / удалить)
Фильтры
- Активные / Неактивные / Все
Сортировка
- По умолчанию — по
order ASC(как на кассе) - Альтернатива — по дате создания (для аудита)
Действия на панели
- «Загрузить слайд»
- «Сгенерировать через AI» (заглушка для BR 6.2)
- «Превью карусели» — открывает модальный preview с auto-transition (для проверки результата без хождения на кассу)
События
При любом CRUD или reorder — Store Service публикует marketing.slide.changed в Kafka (через outbox). Подробности — Events.
POS BFF консьюмит топик и шлёт SSE marketing.invalidate всем активным POS-сессиям ТТ. POS Desktop по этому event перезагружает список активных слайдов.
Новые permissions
(Регистрируются в каталоге Роли — Бэк-офис)
| Ключ | Описание |
|---|---|
marketing.read | Просмотр слайдов своей ТТ |
marketing.write | Создание, редактирование, удаление, изменение порядка |
Edit implies Read — marketing.write подразумевает marketing.read.
Системная роль «Администратор» получает оба permission автоматически (через миграцию).
Связи с другими модулями
- Торговые точки — слайды принадлежат ТТ; новые поля
standby_idle_minutes,standby_transition_secondsуправляются на карточке ТТ (или отдельной формой настроек) - Роли — добавляются
marketing.read/marketing.write - AI Photo Studio (BR 2.6 + BR 6.2) — источник слайдов с
source=ai_photo_studio - POS Desktop standby-режим (спека) — потребитель слайдов
- SSE-инфраструктура (POS BFF + BR SSE-1…7) — транспорт live-обновлений
Deferred
Отложено до отдельных BR
Зафиксировано сознательно, чтобы не раздувать MVP.
| Функция | Обоснование отсрочки | Возврат |
|---|---|---|
| Шеринг слайдов между ТТ одного партнёра | Усложняет model (общая таблица + per-store override) | Phase 2 BR когда появится запрос |
| Pre-login standby (карусель до логина кассира) | Требует device_token и анонимного канала; в MVP standby = после логина | Phase 2 BR |
| Расписание показа (с пн по пт, 8–12) | Cron-логика и UI планирования | Phase 2 BR |
| A/B тестирование слайдов | Аналитика просмотров отсутствует | Phase 2 BR |
| Аналитика импрессий и кликабельности | Нужен tracking-сервис | Phase 2 BR |
| Видео-слайды (mp4) | Размер файлов, video-codec на POS | Phase 2 BR |
Управление standby_idle_minutes/standby_transition_seconds через отдельную форму | В MVP — поля на карточке ТТ | Если потребуется отдельный экран настроек POS |