Создание и редактирование акции¶
Форма акции — основной инструмент маркетолога: в ней задаются механика и размер вознаграждения, тип события, приоритет, период действия, условия применения, ограничения и настройки начисляемых баллов. Форма открывается в режиме создания (кнопка «Создать акцию» в каталоге) или редактирования (строка каталога либо «Редактировать» на странице акции) и в обоих случаях сохраняет всё одним запросом к REST API.
Кто может работать с формой
Создание и изменение акций требуют роли LOYALTY_PROMOTION_WRITE, просмотр —
LOYALTY_PROMOTION_READ. Запуск акции — отдельное право LOYALTY_PROMOTION_ACTIVATE: без него
кнопка «Запустить» недоступна (см. «Жизненный цикл и арбитраж»). Поле «Метки»
показывается только при праве LOYALTY_PROMOTION_LABEL_READ. Списки групп акций, типов событий и
значений условий приходят из справочников формы и доступны с правом чтения акций. Для отдельных
полей нужны права на чтение смежных справочников: теги клиента — LOYALTY_TAG_READ, метки в
условии «Участие в акциях» — LOYALTY_PROMOTION_LABEL_READ, уровни — LOYALTY_TIER_READ,
субсчета баллов и курс валюты баллов — LOYALTY_DICTIONARY_READ. Все вызовы
проверяются на стороне сервиса.
Структура формы¶
Шапка. Заголовок повторяет название акции (у новой — «Новая акция»; обновляется, когда фокус уходит с поля «Название»). Под заголовком — «Код: PR-NNNNN» (у новой акции — «—», код присваивает сервер при первом сохранении), «Версия: N», статус акции и тег «В архиве» у архивной. Справа — индикатор «Заполнено» (доля заполненных обязательных элементов) и, у сохранённой акции, панель действий (см. «Действия в шапке»).
| Вкладка | Назначение |
|---|---|
| «Общие данные» | Название, код, метки, группа акций, период проведения, приоритет, совмещение, описание |
| «Механика» | Тип события, механика и её параметры, срок жизни и тип начисляемых баллов |
| «Условия» | Кому и на какие покупки применяется акция — две зоны «Акция применяется, если» / «Не применяется, если» |
| «Ограничения» | Четыре необязательных ограничения: бюджет, общий лимит, лимит участий на клиента, максимум баллов |
Правая колонка (только чтение, править — на вкладках слева):
- «Расход бюджета» — появляется, если на вкладке «Ограничения» включён бюджет и указана сумма: полоса расхода и пояснение «По линии версий акции, не по текущей версии». У новой акции расход нулевой.
- «Превью акции» — чек-лист «Готово к запуску: N из 6» по строкам «Механика», «Период», «Условия», «Приоритет», «Совмещение», «Ограничения». Строки «Механика», «Период» и «Приоритет» подсвечены как обязательные, пока соответствующий элемент не заполнен: «не выбрана — обязательное поле» у механики (строка остаётся подсвеченной и при пустом обязательном параметре механики), «не задан — обязательное поле» у периода и приоритета. «Условия», «Совмещение» и «Ограничения» без значений показывают «все события акции», «совместимая — по умолчанию» и «нет».
Нижняя панель закреплена внизу формы: «Отмена» (возврат в каталог), подсказка «Заполните обязательные поля (N)», «Сохранить» и «К запуску →». Обе кнопки сохраняют акцию и открывают её страницу; сам запуск выполняется кнопкой «Запустить» (см. «Жизненный цикл и арбитраж»). «К запуску →» недоступна, если в условиях остались удалённые из справочника значения, — с пояснением «В условиях есть удалённые значения справочника — замените или уберите их.»
Вкладка «Общие данные»¶
| Поле | Обяз. | Описание |
|---|---|---|
| Название | да | Отображаемое имя акции, до 255 символов. Уникально между акциями (без учёта регистра и пробелов по краям); версии одной акции делят одно имя. Занятое имя — ошибка под полем «Акция с таким названием уже существует» |
| Код | — | Присваивается сервером (PR-NNNNN), только чтение; рядом — кнопка «Скопировать код», доступная и в режиме чтения |
| Метки | нет | Метки из справочника «Метки акций». У новой акции уходят вместе с созданием; у сохранённой меняются сразу отдельной операцией в любом статусе — «Метки можно менять в любом статусе — они не влияют на начисления» |
| Группа акций | нет | Значение из справочника групп акций promotion-group (ведётся в «Справочниках»). Список берётся из справочников формы, отдельного права на справочники не нужно; в акции хранится код группы. Сохранённая группа, снятая с публикации, показывается с тегом «Значение в архиве» и новым акциям не предлагается |
| Период проведения | да | Дата и время начала и окончания в часовом поясе программы — под полем подсказка со смещением пояса, например «Часовой пояс: UTC+3». Без выбора времени подставляются 00:00 и 23:59 — весь выбранный день включительно. Конец не может быть раньше начала |
| Приоритет (меньше — выше) | да | Целое число от 1. Значения по умолчанию нет — приоритет задаётся осознанно: он решает, какая из пересекающихся акций сработает |
| Совмещение с другими акциями | нет | «Совмещается» (STACKABLE, по умолчанию) или «Только одна» (EXCLUSIVE) |
| Описание | нет | Цель акции для маркетолога («Опишите цель акции»). На начисления не влияет; пустое или из одних пробелов сохраняется как отсутствующее |
Границы периода включительны
Акция применяется к событию, если момент события не раньше startsAt и не позже endsAt.
Точное время позволяет, например, запустить акцию в 18:00 или закончить в полдень. Время,
введённое в форме, трактуется в часовом поясе программы, а не браузера. Сервер отклоняет период,
у которого конец не позже начала (422 promotion_period_invalid).
Изменение 26.3.0: приоритет обязателен
Раньше пустой приоритет заменялся значением 100, и все такие акции оказывались
равноправными. Теперь форма без приоритета не сохраняется, а POST и PUT /v1/promotions
без поля priority отвечают 400 validation_failed. Сохранённые ранее акции не меняются.
Вкладка «Механика»¶
| Поле | Обяз. | Описание |
|---|---|---|
| Тип события | да | Значение справочника типов событий event-type; у новой акции — «Покупка». Сохранённый тип, снятый с публикации, остаётся в поле с тегом «Значение в архиве» |
| Тип вознаграждения (механика) | да | Механика из справочника механик («Что получит клиент»). Предлагаются только механики с заведёнными параметрами. Смена механики очищает введённые параметры |
| Срок жизни начисляемых баллов | нет | Сколько дней живут баллы, начисленные акцией: целое от 1 до 36 500 («Срок жизни — целое число дней от 1 до 36 500»). Пустое поле — баллы сгорают по общим правилам; серым в поле показан действующий срок |
| Тип начисляемых баллов | нет | Субсчёт, в который акция начисляет баллы. По умолчанию — «Акционные баллы»; в списке — активные субсчета справочника (код субсчёта общий для всех валют). Начисление идёт в субсчёт с выбранным кодом в валюте баллов программы. Сохранённый субсчёт, который больше не принимает начисления, показывается с тегом «Значение в архиве» |
| Параметры механики | зависит от механики | Поля, описанные у выбранной механики, — блок «Параметры механики — ‹механика›» (или несколько блоков по группам параметров) |
Тип события. Сейчас движок исполняет только событие покупки, поэтому в поставке справочник
содержит один тип — «Покупка». Тип события и механика друг от друга не зависят: выбор одного не ограничивает
другое. Код вне справочника или неопубликованная запись отклоняются
422 promotion_event_type_invalid — ошибка показывается у поля «Тип события».
Настройки начисляемых баллов. Поля «Срок жизни начисляемых баллов» и «Тип начисляемых баллов» появляются после выбора механики. У механики, которая баллы не начисляет (например, «1+1=3» — она выдаёт единицы товара), оба поля недоступны с подсказкой «Эта механика баллы не начисляет — настройки баллов к ней не применяются».
- Пустой срок означает «как в программе»: срок партии определяется при начислении по цепочке — срок выбранного субсчёта, затем срок уровня клиента, затем базовый срок валюты баллов. Внутри пустого поля серым показан действующий срок: «Срок субсчёта: 30 дней», «Срок субсчёта: до ДД.ММ.ГГГГ», «Общий срок: 365 дней», «Общий срок: зависит от уровня клиента» или «Общий срок: не сгорают». Подробнее о сроках — «Сгорание баллов».
- Заданный срок закрепляет срок за баллами этой акции независимо от субсчёта и уровня.
- Субсчёт должен существовать в валюте баллов программы и принимать начисления, иначе
422 promotion_points_subaccount_invalid(«Этот тип баллов недоступен — выберите другой»). Субсчёт «Акционные баллы» предлагается всегда, даже если его ещё нет. Субсчета описаны в разделе «Субсчета баллов».
Параметры механики. Форма показывает только параметры, описанные у механики в справочнике: числовые (процент, деньги, целое, дробное — с единицей и границами), переключатели, списки, поля категорий, артикулов и сегментов. Значения по умолчанию из справочника подставляются в поля. Награда задаётся одним из параметров — отдельного поля «значение вознаграждения» нет. Обязательный параметр без значения не даёт сохранить форму («{название} — обязательно»). Денежные параметры вводятся в рублях (баллы — в баллах) и уходят на сервер в минорных единицах.
- «1+1=3» настраивается фразой: «За покупку [N] шт товара клиент дополнительно получает ещё [M] шт по стоимости [1] ₽ за штуку». Какой именно товар участвует, задаётся на вкладке «Условия».
- У существующей акции на механике без параметров вместо блока параметров — плашка «Настройки этой механики ещё не заведены — акцию на ней пока не собрать. Обратитесь к администратору».
Подробности расчёта по каждой механике — в разделе «Механики начисления».
Вкладка «Условия»¶
Вкладка разделена на две зоны: «Акция применяется, если» и «Не применяется, если»; каждую можно свернуть заголовком. Каждый критерий включается чекбоксом; выключенный критерий не ограничивает (серый текст «все категории», «все товары», «все клиенты», «не учитывается» и т. п.).
| Зона | Критерии |
|---|---|
| Обе зоны | «Категории товаров», «Артикулы (SKU)», «Регион», «Город», «Магазин», «Мерчант», «Канал продаж», «Сегменты клиентов», «Участие в акциях», «Теги клиента», «Сумма чека» |
| Только «Акция применяется, если» | «Статус клиента», «Уровень клиента», «Баланс баллов» |
Какие строки показывать и в каком порядке, задаёт администратор на экране «Администрирование → Настройка акции» (коробочные критерии там можно только скрыть и переставить); там же заводятся дополнительные условия со своими подписями и подсказками — они показываются в зонах после коробочных под заголовком «Дополнительные условия». Условие, которое скрыли в настройке, в существующей акции остаётся серой строкой с тегом «Скрыто в настройке» и продолжает действовать.
Значения перечней выбираются из справочников с поиском на сервере; длинный список сворачивается в чипсу «+N», его можно скопировать («Скопировать список») или очистить («Очистить список»), а вставленный через «;» список проверяется по справочнику. «Сумма чека» задаётся в рублях с копейками; диапазоны двух зон не должны пересекаться.
Правила критериев, работу с удалёнными значениями и то, как условия проверяются при покупке, описывает раздел «Условия акции».
Вкладка «Ограничения»¶
Четыре ограничения фиксированным списком, сгруппированные по тому, на что смотрит счётчик: «На всю акцию» (бюджет, общий лимит участий), «На одного клиента» (лимит участий) и «На одно начисление» (максимум баллов). Каждое ограничение — фраза с чекбоксом, например «Акция может раздать не более [N] ₽». Значения снятого чекбокса остаются в форме, но на сервер не уходят. Подробно — в разделе «Ограничения и лимиты акции».
Проверки при сохранении¶
Форма считает обязательными четыре элемента: название, механику вместе с её обязательными параметрами, период (обе границы) и приоритет; пока они не заполнены, кнопки сохранения недоступны. Кроме того, форма проверяет значения включённых ограничений и критериев условий. Если проверка не прошла, акция не сохраняется: форма открывает вкладку с первой ошибкой и показывает сообщение «Акция не сохранена: проверьте выделенные поля».
Сервер проверяет запрос независимо от интерфейса:
| Проверка | Код ошибки |
|---|---|
Нет name, mechanicCode, startsAt, endsAt или priority; срок жизни баллов вне 1–36 500; условие уровня прежним ключом params.conditions.client.level или элемент levels не вида {configId: число, code} |
400 validation_failed |
| Механика не найдена в справочнике | 404 mechanic_not_found_in_promotion |
| Конец периода не позже начала | 422 promotion_period_invalid |
Не задан обязательный параметр механики (например, процент у «Кэшбэка»), в том числе при пустом или отсутствующем params |
422 promotion_param_required |
| Числовой параметр — не число / меньше минимума / больше максимума | 422 promotion_param_type / promotion_param_min / promotion_param_max |
| Тип события вне справочника или не опубликован | 422 promotion_event_type_invalid |
| Срок жизни, тип баллов или область списания у механики, которая баллы не начисляет | 422 promotion_points_settings_not_applicable |
| Субсчёта нет в валюте баллов программы или он не принимает начисления | 422 promotion_points_subaccount_invalid |
| Пустое или повторённое значение области списания, больше 1000 значений | 422 promotion_redemption_scope_invalid |
| Название занято другой акцией | 409 promotion_name_taken |
| Ошибка в ограничениях | 422 invalid_budget, invalid_max_bonus, invalid_max_count, invalid_period, invalid_participation_window, invalid_total_limit — см. «Ограничения и лимиты» |
| Бюджет задан, а курс валюты баллов нулевой или выражен не в базовой валюте | 422 currency_zero_rate / 422 currency_rate_currency_invalid |
Ошибка в условиях criteria (незнакомое условие, пустые значения, неверный диапазон, пересечение зон, значение не найдено) |
422 promotion_criterion_* — см. «Условия акции» |
| Уровень в условии «Уровень клиента» не найден в указанной конфигурации | 422 promotion_level_unknown |
| Ошибка в условиях аудитории | 422 promotion_audience_invalid — см. «Условия акции» |
| Удалённая метка при создании | 422 unknown_label |
| Метки в запросе правки | 400 promotion_labels_not_accepted |
| Акцию уже нельзя править на месте | 409 promotion_not_editable |
«Кэшбэк» без процента больше не сохраняется
Обязательные параметры механики проверяются всегда. Раньше пустой params обходил проверку,
и акция сохранялась с нулевым вознаграждением. Ключи params, которых нет в описании
механики, по-прежнему принимаются.
Ошибки полей подсвечиваются у поля на своей вкладке (ограничения — на «Ограничениях», условия — на
«Условиях», тип события и настройки баллов — на «Механике»), и форма переключается на эту вкладку.
Ошибки без своего поля показываются сообщением в шапке формы: promotion_not_editable — «Акция уже
запущена или применялась — изменить её нельзя. Создайте новую версию акции.», отказ проверки тела
(validation_failed) — «Проверьте заполнение полей».
Сохранение¶
| Действие | Метод и путь | Право |
|---|---|---|
| Создать акцию (черновик) | POST /v1/promotions |
LOYALTY_PROMOTION_WRITE |
| Изменить акцию | PUT /v1/promotions/{id} |
LOYALTY_PROMOTION_WRITE |
| Получить акцию | GET /v1/promotions/{id} |
LOYALTY_PROMOTION_READ |
Пример тела запроса на создание:
{
"mechanicCode": "CASHBACK",
"name": "Весенний кешбэк на кофе",
"group": "SEASONAL",
"eventType": "PURCHASE",
"description": "Рост частоты покупок кофе у лояльных клиентов",
"startsAt": "2026-10-01T00:00:00+03:00",
"endsAt": "2026-10-31T23:59:59+03:00",
"params": {
"cashbackPercent": 5,
"conditions": { "client": { "status": "ACTIVE", "levels": [{ "configId": 1, "code": "GOLD" }] } }
},
"pointsLifetimeDays": 90,
"pointsSubaccountCode": "PROMO",
"priority": 50,
"stacking": "STACKABLE",
"maxBonusMinor": 50000,
"budgetMinor": 10000000,
"participationLimit": { "maxCount": 1, "period": "DAY", "periodAmount": 1, "periodMode": "CALENDAR" },
"totalLimit": 10000,
"criteria": [
{ "code": "product-category", "mode": "INCLUDE", "values": ["coffee"] },
{ "code": "check-amount", "mode": "INCLUDE", "range": { "fromMinor": 30000 } }
],
"audience": {
"include": { "customerTags": { "match": "ANY", "tagIds": [101] }, "participation": [] },
"exclude": { "customerTags": null, "participation": [] }
},
"labelIds": [7]
}
| Поле | Назначение |
|---|---|
mechanicCode, name, startsAt, endsAt, priority |
Обязательные поля |
eventType |
Тип события — код опубликованной записи справочника event-type. При создании без поля — PURCHASE. Движок поле пока не читает: акция применяется к событиям покупки |
params |
Значения параметров механики (награда — один из них) и conditions.client — условия по клиенту: статус, уровни levels (пары {configId, code}: код уровня уникален только внутри конфигурации программы), баланс |
value |
Для механик с параметром-наградой не используется: ставку сервер выводит из params (cashbackPercent, pointsPerUnit, multiplier, giftMinor). Форма передаёт поле пустым (null) |
criteria |
Условия акции списком записей {code, mode, values}; сумма чека — {"code": "check-amount", mode, range} в минорных единицах; у дополнительных условий — ещё method. Прежние scope и params.minCheckMinor/maxCheckMinor условий не задают |
group, description |
Группа и описание, необязательные |
stacking |
STACKABLE (по умолчанию) или EXCLUSIVE |
pointsLifetimeDays, pointsSubaccountCode |
Срок жизни (1–36 500 дней) и субсчёт начисляемых баллов. Без субсчёта у механики, начисляющей баллы, сохраняется PROMO («Акционные баллы») |
pointsRedemptionScope |
Область списания баллов акции — список {kind, value}, kind: PRODUCT, CATEGORY, MERCHANT, STORE; пусто — без ограничений. Сервер хранит её и записывает на партию баллов при начислении, но при списании пока не проверяет. В форме поля нет |
maxBonusMinor, budgetMinor, participationLimit, totalLimit |
Ограничения — см. «Ограничения и лимиты» |
audience |
Условия аудитории (теги клиента и участие в акциях) — см. «Условия акции» |
labelIds / labels |
Метки первой версии — только при создании: существующие по id (так передаёт форма) или значениями (так передают интеграции; недостающие заводятся при праве LOYALTY_PROMOTION_LABEL_WRITE) |
Изменение 26.3.0: тело акции — полная замена
POST и PUT принимают акцию целиком. Отсутствующее ограничение означает «ограничения
нет»: без budgetMinor, maxBonusMinor, totalLimit или participationLimit сохранение
снимает соответствующее ограничение; то же относится к pointsLifetimeDays,
pointsSubaccountCode и pointsRedemptionScope. Интеграция, которая читает акцию и
отправляет её обратно, не зная о новых полях, затрёт их. Исключения:
criteriaиaudience, отсутствующие илиnullвPUT, условия не трогают; очистить условия — передать пустой списокcriteria: []и пустые зоныincludeиexclude. Форма всегда передаёт оба поля;eventType, отсутствующий вPUT, сохранённый тип события не меняет;params.conditions.clientбез ключаlevelsсохранённый список уровней не стирает; снять его — явнымlevels: [];- метки в
PUTне принимаются (400 promotion_labels_not_accepted) — у сохранённой акции они меняются операциямиPOST /v1/promotions/bulk-label-assignиbulk-label-remove.
Форма не передаёт pointsRedemptionScope: сохранение акции из интерфейса снимает область
списания, заданную через API.
Ответ по одной акции, кроме полей запроса, содержит id, code, status, archived,
rootId, revision, авторов createdBy/updatedBy, labels, статистику applications и
bonusMinor (по этой версии), расход бюджета budgetSpentMinor, счётчики участий totalUsed (по
линии версий) и versionUsed (по этой версии), признак editable, статус согласования
approvalStatus и согласующих approvers, признак boundToConfig (акция входит в программу
лояльности), условия criteria (у записи — подпись label и признак hiddenInRegistry) и
audience со ссылками вида {id, value, resolved}. После сохранения интерфейс открывает страницу
акции.
sequenceDiagram
participant U as Маркетолог
participant UI as «Акции»
participant API as Loyalty
U->>UI: Заполняет форму и нажимает «Сохранить» или «К запуску →»
UI->>UI: Проверка обязательных полей, ограничений и условий
UI->>API: POST /v1/promotions (или PUT /v1/promotions/{id})
API->>API: Проверка механики, периода, параметров, типа события, настроек баллов, ограничений, условий
API-->>UI: 201 Created / 200 OK (акция)
UI->>U: Страница акции
Редактирование и версии¶
Правка на месте зависит не только от статуса, но и от того, применялась ли акция. Готовое
решение сервер отдаёт в поле editable, и интерфейс по нему открывает форму для правки или только
для чтения — с плашкой по состоянию акции:
| Состояние | Правка на месте | Плашка режима чтения |
|---|---|---|
| Черновик, Запланирована | да (в том числе черновик новой версии) | — |
| Пауза без применений этой версии | да | — |
| Пауза с применениями, Активна | нет | «Запущенная акция не редактируется. Чтобы изменить правила, создайте новую версию.» |
| Завершена | нет | «Завершённая акция не редактируется. Чтобы повторить её, сохраните копию.» |
| Любой статус в архиве | нет | «Акция в архиве и не редактируется.» |
В режиме чтения по-прежнему доступны копирование кода, поле «Метки» и панель действий в шапке (например, «Создать новую версию» у активной акции). Каталог открывает нередактируемую акцию сразу на странице акции, а не в форме.
Изменение 26.3.0: применявшаяся пауза не правится
Раньше PUT /v1/promotions/{id} пропускал любую акцию на паузе. Теперь пауза с хотя бы одним
применением отклоняется 409 promotion_not_editable; то же правило действует для отдельного
ресурса PUT/DELETE /v1/promotions/{id}/participation-limit.
Если в инсталляции включено согласование запуска, содержательная правка возвращает согласование в статус «В работе», а запланированную акцию — в черновик (см. «Согласование запуска»).
Чтобы изменить работающую или применявшуюся акцию, создаётся новая версия — кнопка «Создать
новую версию» в шапке формы или «Новая версия» на странице акции (POST /v1/promotions/{id}/revise,
для статусов «Активна» и «Пауза» вне архива). В шапке формы действие подтверждается окном «Создать
новую версию акции?» с номером будущей версии и кнопкой «Создать версию»; на странице акции версия
создаётся сразу. В обоих случаях новая версия открывается в форме. Новая версия — черновик в той же
линии версий (rootId); она получает параметры, тип события, настройки баллов, лимит участий,
условия и метки исходной версии, а согласование начинается заново. Текущая версия продолжает
действовать до запуска новой. Ранее выполненные начисления не пересчитываются, а израсходованный
бюджет и участия считаются по всей линии. Завершённая акция новую версию не получает
(409 promotion_not_revisable) — повторить её можно копией. Статусы и переходы описаны в разделе
«Жизненный цикл и арбитраж».
Сохранить как¶
Кнопка «Сохранить как…» в шапке формы («Сохранить как» на странице акции) создаёт независимую копию — новый черновик с новым кодом и отдельной линией версий («Сохранить как — копия акции»). По умолчанию имя — «‹название› (копия)»; имя копии тоже должно быть свободным. Копия переносит параметры, тип события, настройки баллов, описание, ограничения, условия и условия аудитории, но не метки и не статистику: счётчики бюджета и участий у неё свои. Условие, скрытое в настройке акции, в копию не переносится — после копирования по каждому такому условию выводится предупреждение «Условие «‹название›» скрыто в настройке акции и не перенесено в копию». Копия открывается в форме.
Копия против новой версии
Новая версия продолжает жизненный цикл существующей акции (общий rootId, общие счётчики),
а «Сохранить как» порождает отдельную акцию без связи с оригиналом.
Действия в шапке¶
У сохранённой акции в шапке формы — панель действий. Она видна только при праве
LOYALTY_PROMOTION_WRITE; каждое действие подтверждается своим окном.
| Кнопка | Когда показывается | Окно подтверждения |
|---|---|---|
| «Создать новую версию» | Активна, Пауза (вне архива) | «Создать новую версию акции?» → «Создать версию» |
| «Запустить» | Черновик (при включённом согласовании — только согласованный), Пауза; без права LOYALTY_PROMOTION_ACTIVATE кнопка недоступна |
«Запуск акции» → «Да, запустить» |
| «Отменить запуск» | Запланирована | «Отмена запуска акции» → «Да, отменить запуск» |
| «Приостановить» | Активна | «Приостановка акции» → «Да, приостановить» |
| «Сохранить как…» | всегда | «Сохранить как — копия акции» → «Сохранить» |
| «Архивировать» / «Разархивировать» | вне архива / в архиве | «Архивирование акции» / «Возврат из архива» |
| «Удалить» | Черновик, Запланирована | «Удаление акции» → «Да, удалить» (с пометкой «Действие необратимо») |
Если у акции есть дополнительные условия, чья переменная за последние 7 дней не приходила в покупках, окно запуска предупреждает: «Переменная «‹переменная›» за последние 7 дней не приходила в покупках — условие «‹условие›» может не сработать». Это предупреждение, а не запрет.
Удаление акции, которая входит в программу лояльности, недоступно с пояснением «Акция входит в программу лояльности. Снимите привязку в настройках программы, затем удалите».
Страница акции¶
Страница акции показывает её в режиме просмотра: ID и код (с копированием), «Тип» — код группы акций (без подписи из справочника), метки (их можно менять здесь же), дату создания, механику, период с точным временем, параметры механики с подписями и единицами из справочника, приоритет, совмещение, «Максимальное количество баллов», «Бюджет, ₽», условия строками по критериям (в порядке настройки акции) и номер версии с группой версий.
- Бюджет. Если бюджет задан, под суммой — полоса расхода «Израсходовано N из M ₽». От 80 % полоса предупреждающая, при полном расходе — «Бюджет исчерпан: израсходовано N из M ₽».
- Условия. Каждое условие — строка с критерием и значениями; значения зоны «Не применяется, если» — после «кроме:». Удалённые значения — красными чипсами. Если условий нет — «Без ограничений».
- Согласование. Если в инсталляции включено согласование запуска, рядом со статусом акции — статус согласования, а страница делится на вкладки «Общие данные» и «Согласование» (см. «Согласование запуска»).
- Действия: «Редактировать» (если акция правится на месте), «Запустить» (при праве запуска — для черновика, при включённом согласовании только согласованного, и для паузы; недоступна при удалённых значениях в условиях), «Приостановить», «Новая версия», «Сохранить как», «Архивировать». «Запустить», «Приостановить», «Новая версия» и «Архивировать» здесь выполняются сразу, без окна подтверждения; «Отменить запуск», «Разархивировать» и «Удалить» доступны в шапке формы и в каталоге.
Идемпотентность¶
Создание и изменение акции — операции над конфигурацией, а не денежные проводки. Заголовок
Idempotency-Key, обязательный для начислений и списаний, к ним не применяется: повторный POST
создаёт отдельный черновик (или получает 409 promotion_name_taken из-за занятого имени), а
изменения вносятся адресно по id через PUT.
Начисления, порождаемые акцией, защищены от повторов ключом, построенным на линии версий акции: повтор того же события покупки не даёт второго начисления, даже если между попытками акция получила новую версию.