Дерево условий скидок
Передача и хранение
Дерево условий скидок хранится отдельно для каждой скидки. Дерево представляет собой рекуррентную структуру, состоящую из узлов трех типов:
- Группа условий
- Контейнер условий скидок
- Условие скидки
Начальным корневым узлом структуры может быть только группа условий. Внутри группы могут находиться только контейнеры условий, а уже в контейнерах условий содержатся массивы условий.
Дерево описывается вложенными узлами, с указанием соответствующего типа объекта:
"type": "group", // Определяет тип объекта
"container": {
// Состав полей зависит от типа объекта (см. ниже)
}
Каждый объект имеет свою структуру полей. При разборе объектов сервис выполняет отложенный разбор поля container
, в зависимости от типа указанного в поле type
Группа условий
Определяет взаимодействие вложенных результатов вычисленных условий.
{
"type": "group",
"container": {
"rule": "max", // Правило взаимодействия значений скидки подчиненных элементов
"operator": "or", // Правило взаимодействия срабатывания подчиненных элементов
"items": [] // Подчиненные элементы - группы или контейнеры условий
}
Контейнер условий
Определяет множество условий, значение скидки при срабатывании контейнера и правило взаимодействия сработавших скидок внутри контейнера.
{
"type": "conditions",
"container": {
"rule": "and", // Правило взаимодействия условий
"value": 1.5, // Значение скидки, переопределяющее основное значение
"conditions": [] // Набор условий контейнера
}
Условие
Определяет утверждение, при срабатывании которого условие считается выполненным.
{
"type":"some-type", // Тип условия, от типа зависит состав полей объекта `container`
"container": {} // Объект описывающий состав условия, зависит от типа условия(см. ниже)
}
Типы условий
Булево
Описывает простое булево условие, если значение в поле `operand` == true, условие считается всегда выполненным, в противном случае не выполненным.
{
"type":"boolean,
"container": {
"operand": true
}
}
Уровень карты
Выполняется, если уровень карты равен или не равен установленному
{
"type":"card-level",
"container": {
// Оператор
"operator":"==",
// Идентификатор уровня карт
"operand": 1
}
}
Номер позиции
Выполняется, если номера позиций чека соответствуют условию
{
"type":"row-number",
"container": {
// Оператор
"operator":"==",
// Номер строки
"operand": 1
}
}
Дни недели
Выполняется, если дата документа выпадает на указанные в маске дни недели
{
"type":"week-day",
"container": {
// Маска дней недели, каждый бит отвечает за день недели пн-вс слева направо
"operand": "0010101"
}
}
День рождения
Выполняется, если день рождения клиента попадает в диапазон дат от даты документа
{
"type":"birthday",
"container": {
// Период перед днем рождения в днях, когда скидка может сработать
"days_before": 2,
// Период после дня рождения в днях, когда скидка может сработать
"days_after": 2
}
}
Сумма без учета скидки
Выполняется, если сумма без учета скидки соответствует условию. Возможно уточнение сегмента товаров, для которого условие будет проверяться
{
"type":"sum-without-discounts",
"container": {
"area":"document|position",
"operator":">=",
"operand": 100.50,
"segments": [1, 2, 3, 4]
}
}
Сумма c учетом скидки
Выполняется, если сумма с учетом скидок соответствует условию. Возможно уточнение сегмента товаров, для которого условие будет проверяться
{
"type":"sum-with-discounts",
"container": {
"area":"document|position",
"operator":">=",
"operand": 100.50,
"segments": [1, 2, 3, 4]
}
}
Количество товара
Выполняется, если количество товара соответствует условию. Возможно уточнение сегмента товаров, для которого условие будет проверяться
{
"type":"quantity",
"container": {
"area":"document|position",
"operator":">=",
"operand": 100.50,
"segments": [1, 2, 3, 4]
}
}
Первая покупка по карте
Выполняется, текущий документ первый по карте
{
"type":"first-purchase",
"container": {
"operand": true
}
}
Сумма покупок по карте
Выполняется, если сумма покупок по карте соответствует условию
{
"type":"card-purchase-sum",
"container": {
"operator":">="
"operand": 100500.99
}
}
Группа ассортимента
Выполняется, если товар входит в группу ассортимента
{
"type":"catalog-group",
"container": {
"operator":"in"
// Идентификатор группа товаров
"operand": 42
}
}
Сумма покупок по карте за период
Выполняется, сумма покупок по карте за указанный период соответствует условию
{
"type":"card-purchase-sum-over",
"container": {
"operator":">",
"operand": 50000,
"step": "days|month|month-aligned|year|year-aligned|quarter-aligned",
"steps_before": 1,
"steps_after": 1
}
}
Комплект
Выполняется, если в документе есть комплекты
{
"type":"product-set",
"container": {
"price_sorting":"asc|desc",
"no_intersection": false,
"segments":[
{
"id": 1,
"calculate": true,
"distribute":true,
"quantity":10
}
],
}
}
Группа промокодов
Выполняется, если промокод был передан и входит в группу
{
"type":"promo-group",
"container": {
"operand": 1 // Идентификатор группы промокодов
}
}
Маска промокода
Выполняется, если промокод подходит под переданную маску. Возможно использование регулярных выражений.
{
"type":"promo-mask",
"container": {
"operand": "%PROMO-202%" // Маска, символы % будут инерпретироваться как 0 или более любых символов
}
}
No Comments