Лояльностьмобилка вендора
demo UI/UX · Этап 0 · batele_vendor_flutter · development
Поверхность · мобильное приложение вендора

Лояльность в мобилке вендора

Экраны нарисованы «как влитые» в реальный batele_vendor_flutter (ветка development, монохромный ребрендинг): шрифт Inter, палитра из palette.dart (бренд/акцент = чёрный #222222, без фиолетового), белый AppBar с заголовком слева, нижняя навигация из 4 вкладок (Заказы · Доставки · Каталог · Настройки), карточки с рамкой 1.5px rgba(0,0,0,.08) и радиусом 16. Раздел живёт под вкладкой «Настройки». Названия полей и enum — из DTO модуля vendor-api/loyalty; суммы в сомах, в API — *InCents (тыйын). Права: vendor.loyalty.view / vendor.loyalty.manage. Полная логика — в десктоп-прототипе.

Вход из «Настроек» + главный экран GET /loyalty/settings · /levels

Раздел встраивается в список «Настройки» (плитка после «Клиенты»). На главном экране — статус (isEnabled), режим (mode: скидка / кешбек — один на заведение), список уровней. Кнопки управления — только при vendor.loyalty.manage.

Настройки
Город
Бишкек
Аккаунт
Организация
Клиенты
Лояльностьновое
Филиалы
вход · «Настройки» → «Лояльность»
Лояльность
Программа активна
пересчёт после каждого заказа
Режим · mode
Скидка %Кешбек %
Окно трат · windowMonths6 мес
Лимит оплаты кешбеком50%
Клиентов
515
в программе
Кешбек на балансах
84 200 с
по всем клиентам
Уровни · benefitPercent
🥉
Bronze
порог: от 0 с
3%
412 клиентов
🥈
Silver
от 15 000 с
5%
86 клиентов
🥇
Gold
от 40 000 с
8%
17 клиентов
главный · режим кешбек · manage
Лояльность
Программа активна
Кофейня Bloom · режим скидка
Скидка %Кешбек %
Скидка уменьшает сумму заказа сразу. В режиме скидки полей кешбека (баланс, лимит оплаты) нет.
Уровни дают скидку
🥉
Base
от 0 с
2%
скидка
🥈
Друг
от 10 000 с
5%
скидка
🥇
VIP
от 30 000 с
7%
скидка
режим скидка · те же поля, без кешбека
Лояльность

Программа не настроена

Выберите режим (скидка или кешбек) и добавьте уровни — клиенты начнут копить выгоду в вашем заведении.

empty state · settings = null

Уровень — bottom-sheet POST /loyalty/levels

Создание/правка уровня — модальный нижний лист с drag-handle. Поля из create-loyalty-level: name, thresholdInCents, benefitPercent (1–100). Тип выгоды не задаётся — наследуется из режима заведения (mode).

Лояльность

Уровень «Silver»

Название · name
Silver
Порог, с · thresholdInCents
15 000
% · benefitPercent
5
Тип вознаграждения
Кешбек % · из режима заведения

Пороги не пересекаются, ровно один уровень с порогом 0 (базовый), процент 1–100.

bottom-sheet · create-loyalty-level
Изменить порог
Новый порог Silver, с
20 000 было 15 000
Предпросмотр пересчёта. 24 клиента перейдут с Silver на Bronze. Кешбек-балансы не трогаем, пересчёт фоновый.
Удаление уровня — только с переносом клиентов на соседний. DELETE /loyalty/levels/:id
правка порога · предпросмотр миграции

Промокоды /loyalty/promocodes

Список с фильтром по computedStatus (хранится active/paused; scheduled/expired/exhausted — вычисляются). Создание — bottom-sheet по create-promocode. Аналитика — из promocode-analytics.

Промокоды
Всеактивныеприостановл.истёкшиеисчерпанные
WELCOME10скидка 10%
исп. 128 / 300 · 1/клиент
активен
PLOV300−300 с
исп. 41 / ∞ · 3/клиент
приостановлен
CASHBACK5кешбек 5%
исп. 203 / 500 · истёк 31.05
истёк
SUMMER25скидка 25%
исп. 200 / 200 · лимит
исчерпан
список · computedStatus · usageCount
Промокоды

Новый промокод

Код · code
WELCOME10
Сгенерир.
Тип выгоды · benefitType
Скидка %Фикс. сКешбек %
Значение · benefitValue
10 %
С · startsAt
01.06.2026
По · endsAt
31.07.2026
Лимит/клиент
1
Общий лимит
300
Мин. заказ, с · minOrderInCents · опц.
500

Лимиты и мин. заказ можно оставить пустыми (∞ / без минимума). Пустой код → сервер сгенерирует 8-символьный [A-Z0-9].

bottom-sheet · create-promocode
WELCOME10
активен · скидка 10%
Применений
128
96 уник. клиентов
Сумма заказов
214 500 с
ordersSumInCents
Выгода клиентам
18 320 с
benefitSumInCents
Осталось слотов
172
из 300 · до 31.07
Применения по дням · byDay
24
25
26
27
28
29
30
01
02
05
06
Новые vs существующие
62 новых · newClients 34 существующих · existingClients
аналитика · promocode-analytics

Акции /loyalty/promotions

Акция = условие «заказ от суммы → выгода». Поля из create-promotion: name, description, minOrderInCents, benefitType + benefitValue, период. Применяется автоматически в корзине. Комбо / спеццена наборов — на стороне каталога, не в этом модуле.

Акции
Скидка за чекактивна
от 1 500 с → скидка 10% · до 20.07
Кешбек-бустерзапланирована
от 3 000 с → кешбек 15% · с 15.07
Приведи другаприостановлена
от 800 с → скидка 5% · 15.06–15.07
Статус вычисляется (computedStatus): active / paused / scheduled / expired.
список акций · условие → выгода
Акции

Новая акция

Название · видно клиенту · name
Скидка за чек от 1 500 с
Описание · description · опц.
Применится автоматически в корзине
Условие · мин. заказ, с · minOrderInCents
1 500
Тип выгоды · benefitType
Скидка %Фикс. сКешбек %
Значение · benefitValue
10 %
Статус · status
active
С · startsAt
01.07.2026
По · endsAt
20.07.2026
bottom-sheet · create-promotion

Клиент · вкладка «Лояльность» GET /loyalty/clients/:id

Расширяет существующий экран client_loyalty.dart (карточка со статами «Заказов / Средний чек» и «Является клиентом с»): ниже добавляются уровень (levelName/levelPercent), кешбек-баланс (cashbackBalanceInCents), прогресс (amountToNextLevelInCents) и история операций (history) — в той же карточной вёрстке.

Айбек Т.
ПрофильИсторияЛояльность
Заказов
31
Средний чек
784 с
Является клиентом с12.03.2025
Уровень🥈 Silver · 5% кешбек
Баланс кешбека
460 с
Потрачено (6 мес)
24 300 с
До Gold24 300 / 40 000 с
осталось 15 700 с трат · amountToNextLevelInCents
История кешбека · history
начисление#V1043
06.07 · 5% от 656 с
+33 с
оплата#V1043
06.07 · списание с баланса
−460 с
начисление#V1027
29.06
+72 с
откат · возврат#V1021
21.06 · reversesEntryId
−56 с
вкладка «Лояльность» · расширяет client_loyalty.dart

Заказ · блок лояльности детализация

В карточке заказа — блок «Выгоды»: уровень клиента на момент заказа и каждая применённая выгода отдельной строкой (акция, промокод, скидка уровня, оплата кешбеком, начисленный кешбек).

Заказ #V1043
Айбек Т. · 06.07 14:02выполнен
Уровень на момент заказа🥈 Silver
Состав
Плов «Тандыр»560 с
Салат «Ачичук»320 с
Чай × 2360 с
Выгоды
Промокод WELCOME10 −10%−124 с
Оплачено кешбеком−460 с
Оплачено деньгами656 с
Кешбек начислен · 5% от 656 с+33 с
Порядок: акция → промокод → скидка уровня → оплата кешбеком → начисление.
детализация заказа · блок «Выгоды» · вкладка «Заказы»

Права и ошибки view / manage · errors.loyalty.*

С правом vendor.loyalty.view экраны read-only — кнопки создания и «+» скрыты; управление — только с vendor.loyalty.manage. Ошибки применения промокода/кешбека приходят с ключами errors.loyalty.* (тексты из i18n ru.json).

Лояльность
vendor.loyalty.view · только просмотр
Программа активна
режим — кешбек
Уровни
🥉
Bronze
от 0 с
3%
🥈
Silver
от 15 000 с
5%
Кнопки «+ уровень», «+» и редактирование скрыты — нужно право vendor.loyalty.manage.
read-only · кнопки скрыты
Ошибки применения
Общий лимит использования промокода исчерпанerrors.loyalty.promocodeTotalLimit
Срок действия промокода истёкerrors.loyalty.promocodeExpired
Оплата кешбеком не может превышать 50% от суммы заказаerrors.loyalty.cashbackLimitExceeded
Промокод действует при заказе от 500 сerrors.loyalty.promocodeMinOrder
Уровень с таким порогом трат уже существуетerrors.loyalty.levelThresholdTaken
тосты ошибок · тексты из ru.json

Логика — коротко полная версия — в десктоп-прототипе

Ключевые правила модели. Развёрнутая логика, edge cases, порядок применения выгод и открытые вопросы — в десктоп-прототипе (раздел «Логика и правила»).

Изоляция по вендорам

У клиента отдельный профиль лояльности в каждом заведении: уровень, траты, кешбек, промокоды и акции границу вендора не пересекают.

Один режим на заведение

mode = скидка либо кешбек, общий для всех уровней. Уровень задаёт порог трат (thresholdInCents) и процент (benefitPercent) в скользящем окне windowMonths.

Кешбек — в финансах

Баланс кешбека — в микросервисе финансов, начисляется после успешного заказа, идемпотентно по заказу. Оплата кешбеком — не более cashbackPaymentLimitPercent от суммы.

Статусы вычисляются

Хранится только active/paused; computedStatus промокода — active / paused / scheduled / expired / exhausted, акции — без exhausted.

Порядок выгод

Комбо (каталог) → акция (условие «от суммы») → промокод → скидка уровня → оплата кешбеком → начисление кешбека.

Права

vendor.loyalty.view — просмотр (кнопки скрыты), vendor.loyalty.manage — создание/правка/удаление уровней, промокодов и акций.

Этап 0 — демо UI/UX. Реализация начинается после утверждения. Экраны нарисованы под нативные паттерны batele_vendor_flutter (ветка development) и DTO модуля vendor-api/loyalty.