Маркетинговая информация

Источники требований

  • BR 6.1 — Standby-карусель брендированных слайдов на POS Desktop
  • BR 6.2 — связка слайда с источником ai_photo_studio (отдельная задача)
  • BR 1.4.4 — модель permissions

Модуль управления статичными слайдами для 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 до запуска standby5 минутПоле 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)

  1. Маркетолог выбирает ТТ (если ещё не выбрана)
  2. Кнопка «Загрузить слайд» открывает форму:
    • Image picker (drag-and-drop или клик)
    • Поле «Заголовок»
    • Checkbox «Активен» (по умолчанию true)
  3. Превью с проверкой размера/формата перед отправкой
  4. Submit → multipart POST в store-service (см. API)
  5. После успеха — список обновляется, новый слайд добавляется в конец

Через 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 Readmarketing.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 на POSPhase 2 BR
Управление standby_idle_minutes/standby_transition_seconds через отдельную формуВ MVP — поля на карточке ТТЕсли потребуется отдельный экран настроек POS

Ссылки