Механики начисления¶
Механика — шаблон акции, определяющий, как из события покупки вычисляется бонус в баллах. Каждая акция создаётся на основе одной механики и доопределяет её параметрами (ставка награды и другие значения, нужные расчёту), периодом, условиями и ограничениями.
Каталог механик — справочник, который ведёт администратор в разделе «Справочники»; каждая запись соответствует диаграмме расчёта RT Flow. При создании акции механика выбирается из этого справочника на вкладке «Механика», а форма показывает поля именно её параметров — см. «Создание и редактирование акции».
| Метод и путь | Назначение | Право |
|---|---|---|
GET /v1/mechanics |
Каталог механик | LOYALTY_PROMOTION_READ |
GET /v1/mechanics/{code} |
Механика с диаграммой и параметрами (для формы акции) | LOYALTY_PROMOTION_READ |
GET /v1/admin/mechanics/export |
Выгрузка механик с параметрами для переноса между контурами | LOYALTY_PROMOTION_READ |
POST /v1/admin/mechanics/import |
Загрузка механик; dryRun=true — предпросмотр без записи |
LOYALTY_PROMOTION_WRITE |
Загрузка проверяет механику и её параметры так же, как заведение в админке, — см. «Перенос настроек между контурами».
Запись механики содержит код (code), наименование (title), тип (type, у всех механик
начисления — ACCRUAL), описание, имя диаграммы (rtFlowDiagram), число ссылающихся акций
(usedByPromotions), признак deletable и два признака для формы акции:
accruesPoints— начисляет ли механика баллы. От него зависит, доступны ли в акции срок жизни и тип начисляемых баллов (см. Начисляемые баллы);paramsConfigured— заведены ли у механики параметры. В новой акции форма предлагает только такие механики.
Механику, на которую ссылаются акции, удалить нельзя — 409 mechanic_in_use; решение сервер отдаёт
в ответе, поэтому интерфейс не показывает кнопку, которая заведомо откажет.
Параметры механики¶
У механики может быть описан набор параметров (param_def) — из них форма строит вкладку
«Механика». Каждый параметр несёт ключ, подпись, тип, обязательность, значение по умолчанию, группу,
порядок, подсказку, единицу и границы min/max; у списков — варианты значений.
| Тип параметра | Контрол в форме | Проверка на сервере |
|---|---|---|
PERCENT, MONEY, INT, DECIMAL |
число с единицей и границами | число, не меньше min и не больше max |
BOOLEAN |
переключатель | только обязательность |
ENUM, MULTISELECT |
список значений | только обязательность |
CATEGORY, SKU, SEGMENT |
ввод значений чипсами | только обязательность |
STRING |
текстовое поле | только обязательность |
Обязательный параметр без значения — 422 promotion_param_required (проверяется всегда, даже если
params пустой); нечисловое значение — promotion_param_type, выход за границы —
promotion_param_min / promotion_param_max. Ключи, которых нет в описании механики, сервер
принимает и хранит: так в params живут условия по клиенту (conditions.client). Параметры типа
MONEY (деньги и баллы) хранятся в минорных единицах — форма умножает введённое значение на 100.
Значение по умолчанию из справочника форма подставляет в поле.
Награда — один из параметров. Отдельного поля «значение вознаграждения» нет: ставку, по которой
считается бонус, сервер берёт из параметра-награды механики. Поле value запроса для механик с
параметром-наградой не используется, форма его не передаёт.
Механика без параметров (например, заведённая администратором собственная механика RT Flow, у
которой параметры ещё не описаны) в форме новой акции не предлагается: награду задать негде.
Существующая акция на такой механике открывается с плашкой «Настройки этой механики ещё не заведены
— акцию на ней пока не собрать. Обратитесь к администратору», а её черновик не запускается —
409 promotion_mechanic_not_configured.
Каталог механик¶
| Код | Наименование | Что делает | Параметры (подпись в форме) | Начисляет баллы |
|---|---|---|---|---|
CASHBACK |
Кэшбэк | Процент от суммы покупки баллами | «Процент кэшбэка» (cashbackPercent, 0–100 %) — награда |
да |
UNIT_BONUS |
Начисление за единицу | Баллы за натуральный объём (литры, штуки) | «Баллов за единицу» (pointsPerUnit) — награда |
да |
MULTIPLIER |
Множитель | Сумма покупки × множитель | «Множитель» (multiplier, от 0,01) — награда |
да |
GIFT |
Подарок | Фиксированное начисление за событие | «Баллов в подарок» (giftMinor) — награда |
да |
REFERRAL |
Реферальная | Вознаграждение за приведённого друга | «Вознаграждение реферера» и «Вознаграждение реферала», у каждого — своя единица | да |
BUNDLE_1PLUS1 |
1+1=3 | Бандл: покупка N единиц — M в подарок; логику исполняет диаграмма RT Flow | «Покупает единиц», «Дополнительных единиц», «Стоимость дополнительной единицы» (по умолчанию 1 ₽) | нет — выдаёт единицы товара |
Параметры «1+1=3» форма показывает фразой «За покупку [N] шт товара клиент дополнительно получает ещё [M] шт по стоимости [1] ₽ за штуку»; какой именно товар участвует, задаётся на вкладке «Условия» (категории, SKU).
Изменение 26.3.0: параметры механик пересобраны
У «Кэшбэка» удалены параметры «Макс. бонус», «Мин. сумма чека» и «Сегменты клиентов»: потолок бонуса задаётся только ограничением акции «Максимальное количество баллов», сумма чека и сегменты — условиями на вкладке «Условия». Сохранённый в акции «Макс. бонус» перенесён в ограничение акции. У «Множителя», «Подарка» и «Начисления за единицу» награда стала обязательным параметром; у ранее сохранённых акций параметр заполнен прежней ставкой, начисление не изменилось. У «1+1=3» удалён параметр «Категория товаров» (товар задаётся условиями), «В подарок единиц» переименован в «Дополнительных единиц», добавлена обязательная «Стоимость дополнительной единицы».
Расчёт бонуса¶
Все механики считают бонус в минорных единицах баллов, округляют до целого по правилу
«половина вверх» (HALF_UP) и ограничиваются сверху ограничением акции «Максимальное количество
баллов» (maxBonusMinor), если оно задано. Ставка (value) — значение параметра-награды.
| Механика | Формула |
|---|---|
CASHBACK |
bonus = round(amountMinor × value / 100) — value в процентах |
UNIT_BONUS |
bonus = round(quantity × value) — value в баллах-минор за единицу |
MULTIPLIER |
bonus = round(amountMinor × value) — value — множитель |
GIFT |
bonus = round(value) — не зависит от суммы покупки |
REFERRAL |
в расчёте по покупке — 0 |
Механики, которых нет в таблице (например, BUNDLE_1PLUS1 и заведённые администратором
собственные механики RT Flow), ядром не рассчитываются: акция на такой механике создаётся и
хранится, а начисление выполняет диаграмма RT Flow через интеграционный вызов начисления.
Пример
Покупка на 1000,00 (amountMinor = 100000), механика «Кэшбэк», cashbackPercent = 5,
«Максимальное количество баллов» — 4000 баллов-минор. Сырой бонус: 100000 × 5 / 100 = 5000.
После ограничения: min(5000, 4000) = 4000.
Изменение 26.3.0: «Множитель» и «Подарок» действительно начисляют
Раньше расчёт был реализован только для «Кэшбэка» и «Начисления за единицу», а акции на «Множителе» и «Подарке» молча давали нулевой бонус (и потому отсеивались подбором). Теперь обе механики считают начисление.
Начисление за единицу¶
Бонус начисляется за натуральный объём: количество единиц × ставка. Если событие не содержит
количества, механика возвращает 0 и акция не применяется. Единица измерения подразумевается
условиями акции (категория, артикул).
Изменение 26.3.0: механика заработала на кассовом канале
Строка кассового чека не несла количества и единицы измерения — настроенная акция «10 баллов
за литр» на кассе молча не применялась. Теперь позиция чека принимает quantity и
unitCode (необязательные: штучная позиция без явного количества остаётся корректной), как их
с самого начала принимала прямая ручка покупки.
Реферальная механика¶
В пер-событийном расчёте по покупке REFERRAL не начисляет ничего: вознаграждение уходит другому
клиенту (пригласившему), и из события одной покупки его не вывести. Такую акцию использует
реферальная программа: когда покупка активирует реферальную связь, она начисляет обеим сторонам по
параметрам активной акции с механикой REFERRAL — «Вознаграждение реферера» и «Вознаграждение
реферала», у каждого своя единица («баллы» — значение в минорных единицах, «%» — процент от суммы
активирующей покупки). «Максимальное количество баллов» акции ограничивает каждую сторону
отдельно.
Начисляемые баллы¶
У акции на механике, которая начисляет баллы (accruesPoints), на вкладке «Механика» задаются:
| Настройка | Поле API | Поведение |
|---|---|---|
| «Срок жизни начисляемых баллов» | pointsLifetimeDays |
1–36 500 дней. Пусто — срок партии определяется при начислении по цепочке: свой срок субсчёта → срок уровня клиента в его конфигурации программы → базовый срок валюты баллов → не сгорают. Срок и его источник фиксируются в партии и потом не пересчитываются |
| «Тип начисляемых баллов» | pointsSubaccountCode |
Субсчёт валюты баллов программы, в который идёт начисление. Пусто — «Акционные баллы» (PROMO) |
Через API у такой акции задаётся ещё область списания начисленных баллов (pointsRedemptionScope:
товары, категории, мерчанты, торговые точки). Сервер хранит её и записывает на партию баллов при
начислении, но при списании пока не проверяет; в форме этого поля нет — см. «Создание и
редактирование акции».
У механики, которая баллы не начисляет, эти настройки недоступны: непустое значение отклоняется
422 promotion_points_settings_not_applicable. Субсчёт, которого нет в валюте баллов программы или
который не принимает начисления, — 422 promotion_points_subaccount_invalid. Подробнее о сроках и
субсчетах — «Сгорание баллов» и «Субсчета баллов».
Параметры акции, влияющие на расчёт¶
| Параметр | Назначение |
|---|---|
| Параметр-награда механики | Процент, баллы за единицу, множитель, размер подарка |
«Максимальное количество баллов» (maxBonusMinor) |
Верхний предел бонуса по одному событию |
«Приоритет» (priority) |
Порядок арбитража конкурирующих акций (меньше — выше); обязателен |
«Совмещение» (stacking) |
«Совмещается» (STACKABLE) или «Только одна» (EXCLUSIVE) |
Прочие ограничения (бюджет, лимиты участий) на величину бонуса не влияют, но решают, применится ли акция, — см. «Ограничения и лимиты акции». Сумма чека — условие акции на вкладке «Условия», см. «Условия акции».
Отбор и арбитраж акций¶
Для события покупки из активных акций отбираются те, что проходят период, условия акции (категория, артикул, география, мерчант, канал продаж, сегменты, сумма чека, дополнительные условия) и условия по клиенту (см. «Условия акции»), дают положительный бонус и укладываются в ограничения. Только затем выполняется арбитраж: акции упорядочиваются по приоритету, затем по идентификатору.
flowchart TD
A[Событие покупки] --> B{Период?}
B -- нет --> X[Пропустить]
B -- да --> C{"Условия акции —<br/>товары, место, сумма чека?"}
C -- нет --> X
C -- да --> K{Условия<br/>по клиенту?}
K -- нет --> X
K -- да --> D{Бонус > 0?}
D -- нет --> X
D -- да --> E{Лимиты и бюджет?}
E -- нет --> X
E -- да --> F[Сортировка по приоритету, id]
F --> G{Старшая акция<br/>«Только одна»?}
G -- да --> H[Применяется только она]
G -- нет --> I[Складываются все совмещаемые]
- Если акция с наивысшим приоритетом помечена «Только одна» — применяется только она.
- Иначе складываются все совпавшие совмещаемые акции (акции «Только одна» с более низким приоритетом отбрасываются).
- Акция, выбывшая по ограничению, в арбитраже не участвует и не блокирует совместимые.
Условия акции
Выключенное условие не ограничивает. Событие должно выполнить все включённые условия зоны «Акция применяется, если» и ни одного условия зоны «Не применяется, если» (для сегментов достаточно совпадения хотя бы по одному). Незнакомое движку условие акцию не применяет.
Поверх акций может работать базовое начисление программы (глобальная механика) — оно настраивается отдельно и в арбитраже акций не участвует.
Возврат покупки¶
Когда касса сообщает о возврате по чеку, баллы, начисленные по этому чеку акциями и базовым начислением, сторнируются пропорционально доле возвращённой суммы; при возврате всего чека остаток каждого начисления сторнируется точно. Сторно не больше доступного остатка на субсчёте исходного начисления: уже потраченные клиентом баллы не сторнируются, баланс в минус не уходит. Запись сторно наследует привязку к акции, поэтому расход бюджета акции уменьшается; использованное участие возврат не возвращает. Отмена возврата начисляет баллы обратно с той же привязкой к акциям.