Группы клиентов — Карточка

Три режима одного экрана: просмотр, создание, редактирование. Структура карточки зависит от типа группы (статическая vs динамическая).

Статус реализации

Backend готов, фронт в админке не начат. См. Группы клиентов — Список.

Источники


Общий layout

Шапка карточки:

  • Breadcrumb: «Группы клиентов» → «{name или “Новая группа”}»
  • Заголовок — название группы
  • Chip типа (🔒 Статическая / ⚙️ Динамическая)
  • Счётчик: «{N} клиентов»
  • Для dynamic — «Последний пересчёт: DD.MM.YYYY HH:mm»
  • Кнопки (зависят от режима — см. ниже)

Табы под шапкой (различаются для static vs dynamic):

Для type=static

  1. Общее
  2. Участники

Для type=dynamic

  1. Общее
  2. Правила
  3. Текущие участники

В режиме new

  • Сначала экран выбора типа (radio static/dynamic) + название + описание
  • После создания — редирект в edit с соответствующими вкладками

Вкладка 1: Общее

ПолеРежимТипRequiredОписание
Названиеtext inputstringДаУникально в рамках франшизы, max 100 символов
ОписаниеtextareastringНет
Типradio (в new) / readonly chip (edit/view)static / dynamicДаНеизменяем после создания
Созданаreadonly (view/edit)dateDD.MM.YYYY
Создалreadonly link на сотрудника (view/edit)

Правила валидации:

  • Название не пустое
  • Уникальность на сервере — при ошибке GROUP_NAME_TAKEN показываем inline «Группа с таким названием уже существует»

Вкладка 2 (static): Участники

Таблица клиентов, состоящих в группе.

Таблица

КолонкаДанные
ФИОкликабельный, → карточка клиента
Телефон
Email
Дата добавленияadded_at
ДействиеКнопка «× Убрать»

Действия

  • Кнопка «+ Добавить клиентов» в шапке вкладки:
    • Открывает модалку «Поиск клиентов»
    • Поле поиска по ФИО / телефону / email (debounce 300ms) → GET /customers?search=...
    • Результаты с чекбоксами (multi-select)
    • Кнопка «Добавить выбранных» → POST /customer-groups/{id}/members { customer_ids: […] }
    • Toast «Добавлено N клиентов»
  • Кнопка «× Убрать» на строке → модалка подтверждения «Убрать клиента из группы?» → DELETE

Фильтры / поиск

  • Поиск внутри группы: по ФИО, телефону, email
  • Пагинация: 50 на страницу

Состояния

  • Пусто: «В группе пока нет участников. Добавьте клиентов из базы»
  • Loading: skeleton
  • Ошибка: toast

Вкладка 2 (dynamic): Правила

Конструктор правил автозаполнения для dynamic группы. До 5 правил, логика AND.

Структура

Блок «Правила»:

  • Каждое правило — отдельная карточка с dropdown типа + форма параметров
  • Между правилами — текст «И» (чтобы было видно что AND)
  • Кнопка «+ Добавить правило» (disabled если правил уже 5)

Каталог типов правил (dropdown)

ТипПараметры UI
Сумма покупок за всё времяОператор (>, >=, <, , between) + поле суммы (или from/to для between)
Сумма покупок за периодОператор + сумма + поле «за последние N дней»
Сумма покупок в диапазон датОператор + сумма + date pickers from/to
Дни без активностиОператор (>, >=) + поле «дней»
День рождения2 поля: «дней до» + «дней после» (default 7/7)
ГородMulti-select города (tags)
Зона доставкиMulti-select зон из Store Service
ПолMulti-select: Мужской / Женский / Другое / Не указан
Источник регистрацииMulti-select: POS / Веб / Приложение / Админка / Импорт
Включение группMulti-select других групп (клиент должен быть в них)
Исключение группMulti-select (клиент не должен быть в них)

Действия

  • «× Удалить правило» на каждом
  • «Сохранить правила» (внизу, sticky): PATCH /customer-groups/{id} с rules_json → по успеху toast «Правила сохранены, группа пересчитывается»
  • «Пересчитать сейчас» — кнопка рядом с «Сохранить» (вручную триггерит POST /recompute)

Превью

Справа / внизу от конструктора — виджет:

  • «В группе сейчас: N клиентов»
  • «Последний пересчёт: DD.MM.YYYY HH:mm» (или «Пересчитывается…» если только что Пересчитать нажали)
  • При изменении правил (не сохранённых) — «Изменения не сохранены» с подсказкой нажать «Сохранить»

Состояния

  • Loading правил: skeleton
  • Сохранение: кнопка в loading
  • Ошибка VALIDATION_ERROR (невалидные правила) — inline-ошибки под конкретными полями

Вкладка 3 (dynamic): Текущие участники

Read-only таблица клиентов, попадающих под правила.

Таблица

Колонки: ФИО (кликабельная), Телефон, Email, Дата добавления (added_at — когда пересчёт их включил)

Info-блок сверху

  • «Списком управляют правила. Чтобы добавить или убрать клиента — измените правила.»

Поиск / пагинация

  • Поиск по ФИО / телефону
  • 50 на страницу

Режим «Просмотр» (view)

  • Все поля / правила readonly
  • Кнопки:
    • «Редактировать» → /customer-groups/{id}/edit
    • «Удалить» → модалка подтверждения (описана ниже)
    • Для dynamic: «Пересчитать сейчас» — запускает пересчёт без перехода в edit

Режим «Создание» (new)

  • Шаг 1: выбор типа (radio) + название + описание → POST /customer-groups
  • Для static — после создания redirect в edit, вкладка «Участники» (пустая, с CTA «Добавить клиентов»)
  • Для dynamic — после создания redirect в edit, вкладка «Правила» (пустая, с CTA «Добавить первое правило»)

Режим «Редактирование» (edit)

  • Поля редактируемы
  • Тип нельзя менять — radio readonly с пометкой «Тип нельзя изменить после создания»
  • Кнопки:
    • «Сохранить» — PATCH /customer-groups/{id}
    • «Отмена» → view

Модалка удаления

  • Заголовок: «Удалить группу?»
  • Текст: «Группа {name} будет удалена. Членство клиентов в группе обнулится, но сами клиенты останутся.»
  • Кнопки: «Отмена» / «Удалить» (красная)
  • После успеха: redirect на /customer-groups + toast «Группа удалена»

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

РольДоступ
Владелец франшизыПолный CRUD
Владелец партнёраНет доступа
Обычный сотрудник с customer_groups.readТолько просмотр (view)
Обычный сотрудник с customer_groups.editCRUD (обычно такой permission не выдаётся)

Ошибки API

КодОтображение
GROUP_NOT_FOUNDNot found page
GROUP_NAME_TAKENInline под полем «Название»
GROUP_WRONG_TYPEToast (не должно происходить в нормальном flow — UI скрывает неподходящие действия)
VALIDATION_ERROR (правила)Inline под конкретным правилом

Ссылки