Агрегация скидок и бонусов

Редактировал(а) Татьяна Брыкова 2026/02/03 13:07

Основные изменения в агрегации скидок 1 релизе 2025 г.

Появилась возможность для каждого отдельного правила устанавливать признак участия в общей агрегации. Не участвующее в агрегации правило будет применяться на чек со своей скидкой. Если таких правил окажется несколько, то они агрегируют между собой одним из методов, указанных в настройке Loyalty.Processing.CalcMethod.Rules.Discount. Со скидками других правил, которые прошли все этапы агрегации, скидки этих правил могут складываться только арифметически или последовательно. Как именно также определяется значением из настройки Loyalty.Processing.CalcMethod.RulesAndTotalAmount.Discount.

Помимо этого, конкуренция с внешней скидкой теперь определяется для каждого отдельного правила, а не на уровне кампании. В настройке правила в интерфейсе лояльности доступно 3 варианта взаимодействия внешней скидки и скидки правила: внешняя скидка отменяет применение правила, применяется максимальная скидка, скидки правила и внешней скидки арифметически суммируются.

На уровне кампании действуют все виды сложения скидок, в том числе последовательная сумма, когда ставки правил поочередно по приоритету применяются к рассчитанному результату предыдущего правила.  Например, на чек в 1000 руб. применяется несколько правил, 1-ое дает скидку 10%, 2-ое – 7%. При последовательном сложении скидка по 2-му правилу будет применять уже к сумме со скидкой, полученной после применения 1-го правила, то есть на 900 руб. и составит 63 руб. Выбор того или иного метода расчета скидки на уровне кампании определяется настройкой в UI.

На уровне группы баллов, кампаний, не входящих в группу, самих групп баллов применяется только 2 вида агрегации: арифметическое сложение и максимум. Методы агрегации определяются партнерскими настройками Loyalty.Processing.CalcMethod.BonusGroup.Discount, Loyalty.Processing.CalcMethod.Discount.

Агрегирование в рамках одной кампании

Методы агрегирования баллов и скидок, предоставляемых отдельными правилами, которые относятся к кампании, определяются настройками данной кампании. Для дисконтных правил и бонусных правил кампанию можно настроить таким образом, что правила начисления баллов будут агрегировать одним способом, а дисконтные правила этой кампании – другим способом. Агрегация счётчиков и уровней скидки по карте также предусматривается. Агрегирование значений счётчиков от правил кампании отвечают те же самые параметры, которыми задаётся агрегация баллов. Агрегирование уровней скидок по карте определяется теми же параметрами кампании, которые отвечают за агрегирование скидок по чеку.

Агрегации подвержены только правила с признаком "Участвует в агрегации скидок" в значении "Да". 

Агрегация дисконтных правил происходит ПОСЛЕ применения правил коэффициентов, исключений, ограничений в правиле на максимальный размер скидки и количественных лимитов.

Агрегация дисконтных правил происходит ДО: применения лимитов на размер скидки, формирования динамического МРЦ, скидки в пределах фонда, получение скидки из-за действия настройки Custom.Discount.FixPriceAlgoritm.TurnOn, применения фактического МРЦ.

Функциональность, связанная с включением алгоритмов агрегации с учётом последовательных скидок, отдельной агрегации отдельных правил, учёта внешней скидки на уровне параметров правил, включается настройкой  Loyalty.Processing.Discount.NewAggregation.

Агрегирование скидок в рамках одной кампании

Для агрегирования скидок по чеку в рамках одной кампании существует такие методы: Максимум, Геометрическая сумма, Приоритет, Арифметическая сумма, Последовательная сумма. Причём все методы используются отдельно для позиционных правил и чековых правил. После независимой агрегации чековых и позиционных правил результат их агрегации складывается арифметически.

1770122964755-306.png

Рис. Варианты агрегации скидок для чека и отдельной позиции в карточке Кампании

1770123441148-141.pngРис. Настройка агрегации скидок для чека и отдельной позиции в карточке Кампании

Максимум

Если установлен метод агрегации «Максимум», то из всех дисконтных правил одного типа (чековые, позиционные) будет применяться правило, которое предоставляет максимальную скидку. 

Геометрическая сумма

Если установлен метод агрегации «Сумма», то применяются все правила, причём ставки правил вычисляются. Для чековых правил – для всего чека, для позиционного для каждой позиции. Для правил-значений (с фиксированным значением скидки) для агрегации вычисляется процентная ставка.

Если общее количество правил в рамках одной кампании равно N, а каждое i-тое правило предоставляет скидку, то результирующая скидка вычисляется по формуле:

1747047113386-839.png

В итоге, результирующая скидка всех правил никогда не превосходит 100%.

Например, к чеку в 1000 рублей применилось 4 правила, со ставками 10%, 20%, 30%, 40%, итоговая ставка скидки в этом случае будет равна:

1747047129000-430.png

После того, как получена общая ставка вычисляются ставки отдельных правил.

Приведённая  ставка отдельного правила равна: (ставка правила)*(рассчитанная при агрегации ставка)/(сумма указанных ставок).

В примере выше: полученная ставка = 69.76, сумма указанных ставок = 10+20+30+40 = 100, поэтому действующие ставки будут:

Для правила 10% = 10*(69.76/100) = 6.976%

Для правила 20% = 20*(69.76/100) = 13.952%

Для правила 30% = 30*(69.76/100) = 20.928%

Для правила 40% = 40*(69.76/100) = 27.904%

Таким образом, при геометрическом сложении уменьшаются ставки всех правил пропорционально.

В РА чека можно увидеть, по какому правилу и какая изначально ставка должна примениться к позиции чека. На примере из рисунка ниже, на одну и ту же позицию чека было применено два разных правила (в поле «Ключ» указывается название правила «173033_сумма 20%_1» и «173033_сумма 20%_2») с одинаковой изначальной ставкой 20% (указывается в поле «Значение» в параметре «D»)

1747047155073-429.png

Рис. Расширенные атрибуты чека со значением скидки по правилу до применения агрегации.

1747047192329-497.png

Приоритет

Данный метод агрегации предусматривает применения из всех дисконтных правил только одного, приоритет которого самый большой. В случае равенства приоритетов будет применяться правило с самой последней датой изменения. Также данный метод агрегации действует независимо для чековых и позиционных правил.

Арифметическая сумма

Данный метод агрегации предусматривает применение всех правил с непосредственным сложением ставок. Например, если есть два правила со ставками по 20%, то результатом будет общая ставка скидки 40%. Данный метод также действует независимо для чековых и позиционных правил. Следует иметь в виду, что для этого метода возможна результирующая скидка более 100%, в то время как для метода «Сумма» такое получиться не может.

Последовательная сумма 

При последовательной агрегации  ставки правил уменьшаются поочередно, по самому приоритетному правилу  ставка правила применяется без изменений, далее скидка  рассчитывается с учётом применимости последующего правила к результату предыдущего.

При последовательном сложении нескольких правил результирующая скидка вычисляется также как при геометрической агрегации.

Общая ставка правил будет:

1747047217181-589.png

Однако, ставки отдельных правил вычисляются не пропорционально, а уже зависят от приоритета правила (при равенстве приоритетов, приоритет отдаётся правилу, которое позже создано).

Приведённая ставка правила наибольшего приоритета равняется его заданной ставке (если скидка указана как значение, то значение переводится в процент).

Ставка правила второго (от максимального) приоритета устанавливается как геометрическая ставок правил 1-ого и 2-ого приоритетов за вычетом ставки правила наивысшего приоритета.

Ставка правила третьего (от максимального) приоритета устанавливается как геометрическая сумма ставок правил 1-ого и 2-ого приоритетов и ставки правила 3-его приоритета, за вычетом суммы ставок правил первого и второго приоритетов (уже вычисленных, а не первоначальных).

Итак далее, пока не исчерпается весь массив применившихся правил.

Таким образом чек обрабатывается 1 раз по формуле:

1747047234621-879.png

Например, к чеку в 1000 рублей применилось 4 правила, со ставками:

Правило 1- 10%, приоритет 2

Правило 2 - 20%, приоритет 12

Правило 3 - 30%, приоритет 22

Правило 4 - 40%, приоритет 32

Ставка правила наивысшего приоритета (40%) сохраняется в качестве приведённой. Правило следующего приоритета, это правило со ставкой 30%. Для него приведённая ставка  вычисляется по формуле:

(1-(1-40/100)(1-30/100))*100 – 40 = 58-40 = 18%

Приведённая ставка правила третьего приоритета (правило 20%) вычисляется по формуле:

(1-(1-40/100)(1-30/100)(1-20/100))*100 – (40+18) = 66.4-58= 8.4%

Приведённая ставка правила четвёртого приоритета (правило 10%) вычисляется по формуле:

(1-(1-40/100)(1-30/100)(1-20/100) (1-10/100))*100 – (40+18+8.4) = 69.76-66.4= 3.36%

Агрегация правил, помеченных признаком "Участвует в агрегации скидок"

На правилах  начисления (Базовое правило, Поощрение за купон, Правила-комплекты, Персональная акция и Товарная акция) есть признак участия в агрегации. 

1747047267956-388.png

Рис. Признак участия в агрегации в правиле начисления (Базовое)

По умолчанию на правиле признак активирован в значение "Да" и включается в алгоритм агрегации, установленной на связанной с ним кампании.

Не участвующее в агрегации правило, с признаком "Нет",  сохраняет свою скидку до окончания агрегации и всегда применяется. Если таких правил несколько, то они агрегируются отдельно. Алгоритм агрегации задаётся значением партнёрской настройки: Loyalty.Processing.CalcMethod.Rules.Discount. Агрегация аналогичная алгоритму агрегации правил отдельной кампании: максимум, приоритет, арифметическая сумма, геометрическая сумма, последовательная сумма.

Алгоритм сложения результирующих скидок общего агрегата и агрегата по правилам, исключённым из общей агрегации, определяется по настройке  Loyalty.Processing.CalcMethod.RulesAndTotalAmount.Discount. Общий агрегат этих правил может быть добавлен к глобальному агрегату 2 способами: арифметически или последовательно (меньший приоритет всегда отдаётся агрегату исключённых правил).

При арифметическом сложении применяются все правила.

При последовательном сложении агрегация происходит следующим образом:

  1. Чековый агрегат общей агрегации складывается с чековым агрегатом правил с признаком в значении "Да" по геометрическому алгоритму. Таким образом высчитывается приведённая ставка правил. Посчитанная чековая ставка общего чекового агрегата остается как есть, а чековая ставка агрегата правил в признаком участия в агрегации в значении "Да" получается как геометрическая сумма минус ставка общего агрегата.
  2. По каждой позиции позиционный агрегат общей агрегации складывается с позиционным агрегатом  правил, отмеченных признаком,  по геометрическому алгоритму по каждой позиции. По каждой позиции ставка общего агрегата остается как есть, а позиционная ставка агрегата участвующих в агрегации правил получается как геометрическая сумма минус ставка общего агрегата.

После этого вычисляются окончательные ставки правил с признаком участия в агрегации в значении "Да" :

  1. Для чекового случая: устанавливается  как: (ставка правила до заключительного этапа агрегации)*(чековая ставка агрегата  правил с включенным признаком)/(чековая ставка до заключительной агрегации).
  2. Для позиционного случая: устанавливаетсякак: (ставка правила до заключительного этапа агрегации по позиции)*(чековая ставка агрегата правил с включенным признаком по позиции)/(чековая ставка до заключительной агрегации по позиции).

На этом этапе внутренняя агрегация считается выполненной, по ее итогу формируется массив применившихся правил к чеку и к позициям.

Агрегирование баллов в рамках одной кампании

Для агрегирования баллов и значений счётчиков в рамках одной кампании существует три метода: Максимум, Сумма, Приоритет.

1747047295996-940.png

Рис. Варианты агрегации бонусов для чека и отдельной позиции в карточке Кампании

Причём все методы используются отдельно для позиционных правил и чековых правил.

1770123540288-497.pngРис. Настройка агрегации бонусов для чека и отдельной позиции в карточке Кампании

Максимум

Если установлен метод агрегации «Максимум», то из всех правил начисления баллов будет применяться одно правило, которое начисляет максимальное количество баллов. В случае равенства начисляемых баллов будет применяться правило с самой последней датой изменения. Данный метод агрегации действует независимо для чековых и позиционных правил.

Сумма

При данном методе агрегации будут применяться все правила начисления баллов, которые связаны с кампанией.

Приоритет

Данный метод агрегации предусматривает применение из всех правил начисления баллов только одного, приоритет которого самый большой. В случае равенства приоритетов будет применяться правило с самой последней датой изменения. Также данный метод агрегации действует независимо для чековых и позиционных правил.

Методы агрегирования бонусных баллов и статусных баллов зависят от значений одних и тех же полей. На это следует обращать внимание при методе агрегирования «Максимум». В этом случае, если правила одновременно начисляют оба вида баллов, то для начисления статусных баллов может примениться какое-то одно правило, а для начисления бонусных баллов какое-то другое; в зависимости от того, какие правила начисляют максимальное количество.

Дальнейшая агрегация баллов и скидок осуществляется на уровне записей Групп баллов, а также между кампаниями без групп баллов (свободные кампании).

Агрегирование между кампаниями

Под свободными кампаниями понимаются кампании, которые не относятся к какой-либо группе баллов (наличие группы баллов в кампании не обязательно). Между свободными кампаниями можно установить алгоритмы агрегации. Эти алгоритмы настраиваются установкой значений партнерских настроек.

Агрегирование скидок между кампаниями

Для выбора алгоритма агрегации скидок между различными свободными кампаниями необходимо установить в соответствующее значение партнерскую настройку Loyalty.Processing.CalcMethod.Discount.

При значении 1 – применяется максимальная результирующая скидка среди всех сработавших кампаний. При значении 4 - арифметически суммируются скидки от всех сработавших кампаний. При любом другом значении применяется арифметическое суммирование скидок от всех кампаний. Значение по умолчанию 1 – максимальная скидка.

Агрегирование баллов между кампаниями

Для выбора алгоритма агрегации баллов между различными свободными кампаниями необходимо установить в соответствующее значение системную настройку Loyalty.Processing.CalcMethod.Campaign.Bonus.

Если данная настройка установлена в значение 1, то в итоге будет применена кампания, по правилам которой начисляется максимальное, по сравнению с другими, количество баллов. Если данная настройка установлена в значение 2, то баллы от разных кампаний суммируются. Если данная настройка установлена в значение 3, то будет применяться кампания, приоритет которой максимальный.

Учет лимитов скидки при агрегации, устанавливаемых на уровне правила

На уровне правила возможно задать три вида лимитов:

  1. Максимальная сумма скидки по правилу (для процентных правил)
  2. Максимальная сумма  позиционной скидки 
  3. Максимальный процент скидки по правилу (для правил значений)

1747047402628-637.png

Рис. Лимиты на  уровне правила (для процентного правила)

1747047440935-640.png

Рис. Лимиты на  уровне правила (для правил с типом расчета "Значение")

На оставшиеся  правила после агрегации лимиты оказывают следующие действия:

  • Если правило чековое/позиционное, процентное и в нём заполнено поле  "Максимальная сумма скидки по правилу", то ставка правила сохраняется, если общая скидка по правилу (по чеку или позиции) меньше или равна значению в этом поле.  В противном случае ставка правила уменьшается так,  чтобы общая скидка по правилу (по чеку или позиции) равнялась значению из лимита.
  • Если правило чековое с типом расчета "Значение" и в нём заполнено поле "Максимальный процент скидки по правилу", то ставка правила сохраняется, , если ставка скидки по правилу (по чеку) меньше или равна значению лимита. В противном случае ставка правила уменьшается так,  чтобы общая скидка по правилу  равнялась этому значению.
  • Если правило позиционное, типом расчета "Значение" или "Значение для каждого элемента" и в нём аполнено поле "Максимальный процент скидки по правилу" то ставка правила сохраняется, , если ставка скидки по правилу (по позиции) меньше или равна значению лимита. В противном случае ставка правила уменьшается так,  чтобы общая скидка по правилу  равнялась этому значению.
  • После этого, если в позиционном, процентном правиле, заполнено значение в поле "Максимальная сумма  позиционной скидки", то вычисляется общая сумма скидки по такому правилу (с учётом  лимита по максимальной скидки). Если общая скидка по правилу меньше или равна значению в поле "Максимальная сумма  позиционной скидки", то  ставки остаются такими, какие есть. Либо пропорционально уменьшаются по всем позициям так, чтобы общая скидка по правилу по всем позициям (к которым применено) была равна значению лимита.

Например, после всех агрегаций и применения лимита по максимальной скидки, оказалось, что позиционное правило к позициям применилось следующим образом:

Позиция1 Сумма=1100 15% Скидка=165

Позиция2 Сумма=1200

Позиция3 Сумма=1300 15% Скидка=195

Позиция4 Сумма=1400

Позиция5 Сумма=1500 15% Скидка=225

Позиция6 Сумма=1600

Общая сумма скидки получилась 585. При этом установлено значение "Максимальная сумма  позиционной скидки" = 311. Итоговая скидка по правилу с учётом заданного лимита должна быть:

Позиция1 Сумма=1100 15% Скидка=165 СкидкаА=(311*(165/585))=87.72 Ставка=7.975%

Позиция2 Сумма=1200

Позиция3 Сумма=1300 15% Скидка=195 СкидкаА=(311*(195/585))=103.67 Ставка=7.975%

Позиция4 Сумма=1400

Позиция5 Сумма=1500 15% Скидка=225 СкидкаА=(311*(225/585))=119.61 Ставка=7.975%

Позиция6 Сумма=1600

Необходимо обратить внимание, что (311*(225/585))=119.62, но тогда 87.72+103.67+119.62=311.01. Получилась разница в 1 копейку с лимитом в 311. Эта 1 копейка вычитается из самой большой скидки 119.61. 

По данным ставкам формируется позиционная детализация в расширенных атрибутах.

В случаях, если хотя бы по одной позиции сумма со скидкой получается отрицательной, сумма со скидкой приравнивается к  0, а  ставка скидки по позиции устанавливается 100%. При этом  атрибуты не пересчитываются, а  общая сумма со скидкой чека (заказа) и  общая ставка скидки по чеку (заказу) пересчитываются.

Агрегация с учетом внешней скидки

Влияние внешней скидки учитывается после того, как проведена общая агрегация и учтены все лимиты.

На правилах  начисления (Базовое правило, Поощрение за купон, Правила-комплекты, Персональная акция и Товарная акция) есть признак взаимодействия с внешней скидкой.

Данный признак может принимать 3 значения:

  • Арифметическая сумма - скидки правила и внешней скидки суммируются.
  • Отменяет правило - внешняя скидка отменяет применение скидки правила. Если внешней скидки нет, то сохраняется ставка правила.
  • Максимум -  применяется максимальная скидка из скидки по правилу и внешней скидки.

Для чековых правил – конкуренция по скидкам чековая (даже если внешняя скидка на одну позицию, и она больше чековой скидки по правилу – чековое правило отменяется целиком), для позиционных – позиционная, для правил с признаком "Учитывать состав"  – с правилом конкурирует суммарная внешняя скидка позиций, прошедших фильтр правила.

Конкуренция скидок происходит независимо для каждого отдельного правила. Например, если, среди трех конкурирующих с внешней скидкой правила, первое победило внешнюю скидку, а два других  - нет, то они не применяются.

После агрегации возможно по каким-то позициям остаётся внешняя скидка.

На следующем этапе агрегации происходит применение правил по своим ставкам, которые сохранялись на протяжении всех агрегаций, учёта лимита и внешней скидки.

Чековые скидки уже применяются к позициям и арифметически суммируются с позиционными скидками. В итоге получается чек с применёнными скидками.

Учёт МРЦ на заключительном этапе агрегации

Данный алгоритм применяется в самом конце расчёта, когда к чеку и позициям уже применены все внутренние и внешние скидки по правилам.

МРЦ может быть задано в трёх видах:

  1. Товарное МРЦ – задаётся в карточке товара или передаётся в запросе чека
  2. Минимальная сумма оплаты чека в целом. Задаётся как значение партнёрской настройки: Loyalty.Processing.WriteOff.AvoidChequeSum
  3. Минимальная сумма оплаты позиции чека. Задаётся как значение партнёрской настройки: Loyalty.Processing.WriteOff.AvoidChequeItemSum

Учёт товарного МРЦ

Если общая сумма со скидкой (с учётом оставшейся внешней) по позиции оказывается строго больше, чем МРЦ * (кол-во товара в позиции) –  применение правил и внешней скидки сохраняется.

Если сумма только с внешней скидкой по позиции получается меньше либо равной значению МРЦ * (кол-во товара в позиции), то по данной позиции отменяется применение всех правил, в том числе и чековых и всей внутренней скидки. Внешняя скидка при этом сохраняется.

Если сумма только с внешней скидкой по позиции получается строго больше значению МРЦ * (кол-во товара в позиции), но общая сумма со скидкой (с учётом внешней) получается меньше либо равной значению МРЦ * (кол-во товара в позиции), тогда вся внутренняя скидка уменьшается до значения (МРЦ * (кол-во товара в позиции)) – (Сумма со скидкой по позиции (с учётом внешней)). Далее в порядке увеличения приоритета отменяется применение правил к позиции, находится пограничное правило и ему устанавливается  такая скидка, которую позволяет МРЦ.

После учёта товарной МРЦ пересчитываются позиционные и чековые скидки и суммы со скидкой.

Учёт минимальной суммы оплаты позиции чека

Если общая сумма со скидкой (с учётом оставшейся внешней) по позиции оказывается строго больше значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeItemSum –  сохраняется применение правил и внешней скидки по ставкам, какие получились после учёта товарного МРЦ.

Если сумма с оставшейся внешней скидкой (только с внешней скидкой) по позиции получается меньше либо равной значению партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeItemSum – по данной позиции отменяется применение всех правил, в том числе и чековых и вся внутренняя скидка. При этом внешняя скидка  сохраняется.

Если сумма с оставшейся внешней скидкой (только с внешней скидкой) по позиции получается строго больше значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeItemSum, но общая сумма со скидкой (с учётом внешней) получается меньше либо равной значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeItemSum, тогда вся внутренняя скидка уменьшается до значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeItemSum – (Сумма со скидкой по позиции (с учётом внешней)). Далее в порядке увеличения приоритета отменяется применение правил к позиции, находится пограничное правило и ему устанавливается такая скидку, которую позволяет значение настройки.

После учёта минимальной оплаты позиции пересчитываются  позиционные и чековые скидки и суммы со скидкой.

Учёт минимальной суммы оплаты чека

Если поле учёта товарного МРЦ и минимальной суммы оплаты позиции чека,  получается, что общая сумма со скидкой (с учётом оставшейся внешней) по позиции оказывается строго больше значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeSum – сохраняется применение правил и внешней скидки по ставкам.

Если поле учёта товарного МРЦ и минимальной суммы оплаты позиции чека, получается так, что сумма с оставшейся внешней скидкой (только с внешней скидкой) по чеку в целом меньше либо равной значению партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeSum –  отменяется применение всех правил по чеку, в том числе и чековых и вся внутренняя скидка. При этом внешняя скидка  сохраняется..

Если поле учёта товарного МРЦ и минимальной суммы оплаты позиции чека, получается так, что сумма с оставшейся внешней скидкой (только с внешней скидкой) по чеку получается строго больше значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeSum, но общая сумма со скидкой (с учётом внешней) получается меньше либо равной значения партнёрской настройки Loyalty.Processing.WriteOff.AvoidChequeSum, тогда необходимо уменьшить внутреннюю скидку. Рассматриваются позиции по убыванию суммы со скидкой и находится пограничная позиция, при отмене скидки по которой получается, что общая сумма со скидкой по чеку становится меньшей, чем значение настройки Loyalty.Processing.WriteOff.AvoidChequeSum. По данной позиции применяется скидка, которую позволяет ограничение. Далее применяется тот же алгоритм, который использовался, когда к позиции применялось ограничение по настройке Loyalty.Processing.WriteOff.AvoidChequeItemSum.