Skip to main content

Дерево условий скидок

Передача и хранение

Дерево условий скидок хранится отдельно для каждой скидки. Дерево представляет собой рекуррентную структуру, состоящую из узлов трех типов:

  • Группа условий
  • Контейнер условий скидок
  • Условие скидки

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

изображение_2025-02-07_124953704.png

Дерево описывается вложенными узлами, с указанием соответствующего типа объекта:

"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 или более любых символов
    } 
}