Настройка шаблонов сценариев ценообразования
Настройка шаблонов ценообразования производится при создании/редактировании сценариев ценообразования. Чтобы создание шаблона стало доступно, нужно сделать активной галочку "Уникальный алгоритм формирования цены".
Для написания шаблона мы используем язык Scriban. Scriban - это быстрый, мощный, безопасный и легкий язык сценариев. Подробнее с языком можно ознакимиться здесь.
Шаблон на вход получает объект model, содержащий следующие поля:
- Settings - [объект с параметрами] - предпосчитанные настройки необходимые для ценообразования товара
- ProductCard - [объект с параметрами] - карточка товара (основные данные и свойства)
- SupplierPrices - [список объектов] - список данных активных цен поставщиков
- CompetitorPrices - [список объектов] - список данных активных цен конкурентов
- CommonAlgorithmPrice - [объект с параметрами] - данные о цене, посчитанные стандартным алгоритмом
Объект Settings содержит следующие поля:
- MinSupplierPrice - [объект с параметрами] - данные о минимальной цене поставщика
- MinCompetitorPrice - [объект с параметрами или null] - данные о минимальной цене конкурента
- DeliveryTownPrice - [число] - цена доставки по городу
- DeliveryCountryPrice - [число] - цена доставки по стране
- MinExtraCharge - [число] - минимальная наценка (%)
- MaxExtraCharge - [число] - максимальная наценка (%)
- FixedExtraCharge - [число] - фиксированная наценка
- TargetMargin - [число] - целевая маржинальность (%)
- AverageOrderExpenses - [число] - средние расходы на один заказ товара. Заполнены, если хотя бы для одного товара задана целевая маржинальность
- AverageOrderCommissionPercent - [число] - средний процент комиссии на один заказ товара (%). Заполнен, если хотя бы для одного товара задана целевая маржинальность
- GlobalMinRetailPrice - [число] - МРЦ среди поставщиков для которых указано "Глобальное МРЦ" в опциях поставщиков
- MinRetailPrice - [число] - МРЦ среди всех поставщиков
Объект CommonAlgorithmPrice содержит следующие поля:
- Price - [число] - вычисленная цена
- SupplierPrice - [число] - цена поставщика
- SupplierPriceSellerCode - [текст или null] - код товара в системе поставщика
- DeliveryTime - [число] - время доставки (дней)
- SupplierId - [число] - Id поставщика
- OriginalPrice - [число или null] - цена до акции
- DeliveryTownPrice - [число] - цена доставки по городу
- DeliveryCountryPrice - [число] - цена доставки по стране
- CompetitorPrice - [число или null] - цена конкурента
- InStockAmount - [число] - количество товаров в наличии
- MinRetailPrice - [число или null] - МРЦ
- CompetitorName - [текст или null] - Название конкурента
Объект MinSupplierPrice из объекта Settings и объекты из списка SupplierPrices содержат следующие данные о цене поставщика:
- Supplier - [объект с параметрами] - данные о поставщике
- Price - [число] - цена
- MinRetailPrice - [число] - МРЦ
- InStockAmount - [число] - количество товаров в наличии
- Product - [объект с параметрами] - данные о товаре
- DeliveryTime - [число] - время доставки (дней)
- DeliveryTownPrice - [число или null] - цена доставки по городу
- DeliveryCountryPrice - [число или null] - цена доставки по стране
- ConsiderLocalMinRetailPrice - [логическое значение] - соблюдать ли "МРЦ только для предложений от этого поставщика" выбранное на вкладке с опциями поставщиков
- PriceSellerCode - [строка или null] - код товара в системе поставщика
Объект Supplier содержит следующие данные о поставщике:
- Id - [число] - Id
- Name - [текст] - название
- ExternalId - [текст или null] - внешний код
- BundleIds - [список чисел] - спикок Id пакетов, в которые входит поставщик
Объект Product содержит следующие данные о товаре поставщика:
- Id - [текст или null] - Id
- Name - [текст] - название
- Article - [текст или null] - артикул
- CategoryName - [текст или null] - категория
- VendorName - [текст или null] - бренд
- Ean - [текст или null] - EAN
Объект MinCompetitorPrice из объекта Settings и объекты из списка CompetitorPrices содержат следующие данные о цене конкурента:
- Competitor - [объект с параметрами] - данные о конкуренте
- Product - [объект с параметрами] - данные о товаре
- Price - [число] - цена
- OriginalPrice - [число] - цена до применения скидок
- InStockAmount - [число] - количество товаров в наличии
Объект Competitor содержит следующие данные о конкуренте:
- Id - [число] - Id
- Name - [текст] - название
- ExternalId - [текст или null] - внешний код
Объект Product содержит следующие данные о товаре конкурента:
- Id - [текст или null] - Id
- Name - [текст] - название
- Article - [текст или null] - артикул
- CategoryName - [текст или null] - категория
- VendorName - [текст или null] - бренд
Объект ProductCard содержит следующие поля:
- Id - [число] - Id
- Name - [текст] - название
- Color - [текст или null] - цвет
- Article - [текст или null] - артикул
- CategoryId - [число] - Id категории
- CategoryName - [текст] - название категории
- VendorId - [число] - Id бренда
- VendorName - [текст] - название бренда
- Ean - [текст или null] - EAN
- ExternalId - [текст или null] - внешний Id
- Properties - [список объектов] - список свойств
- Tags - [список объектов] - список тегов
Список Tags состоит из объектов содержащих следующие данные о тегах:
- Id - [число] - Id
- Name - [текст] - название
Список Properties состоит из объектов содержащих следующие данные о свойствах:
- Id - [число] - Id
- Name - [текст] - название
- Type - [текст] - тип
- Unit - [текст] - визическая величина
- StringValue - [текст] - тестовое значение, когда тип равен "String"
- BooleanValue - [логическое значение] - логическое значение, когда тип равен "Boolean"
- IntegerValue - [число] - целое число, когда тип равен "Integer"
- DecimalValue - [число] - дробное число, когда тип равен "Decimal"
- MinRangeValue - [число] - дробное число, нижняя граница диапазона, когда тип равен "Range"
- MaxRangeValue - [число] - дробное число, верхняя граница диапазона, когда тип равен "Range"
- EnumValue - [текст или null] - тестовое значение, когда тип равен "Enum"
- FlagValues - [список текстовых значений] - список текстовых значений, когда тип равен "Flag" (множественный выбор)
Поле Unit может иметь следующие значения:
- NotUnit - неизвестная величина
- Nanometers - нанометры
- Micrometers - микрометры
- Millimeters - миллиметры
- Centimeters - сантиметры
- Meters - метры
- Milligrams - миллиграммы
- Grams - граммы
- Kilograms - килограммы
- Tons - тонны
- Seconds - секунды
- Minutes - минуты
- Hours - часы
- Days - дни
- Weeks - недели
- Months - месяцы
- Years - годы
- Kelvins - кельвины
- DegreeCelsius - градусы по цельсию
- SquareMeters - квадратные метры
- SquareCentimeters - квадратные сантиметры
- Milliliters - миллилитры
- Liters - литры
- CubicMillimeters - кубические миллиметры
- CubicCentimeters - кубические сантиметры
- CubicMeters - кубические метры
- Amperes - амперы
- Kiloamperes - килоамперы
- Volts - вольты
- Kilovolts - киловольты
- Watts - ватты
- Kilowatts - киловатты
- Megawatts - мегаватты
- Ohms - омы
- Kiloohms - килоомы
- Candles - канделы
- Luxes - люксы
- Lumens - люмены
- Joules - джоули
- Hertz - герцы
- Kilohertz - килогерцы
- Megahertz - мегагерцы
- Gigahertz - гигагерцы
- Bits - биты
- Bytes - байты
- Kilobytes - килобайты
- Megabytes - мегабайты
- Gigabytes - гигабайты
- Terabytes - терабайты
- BitsPerSecond - биты в секунду
- KilobitsPerSecond - килобиты в секунду
- MegabitsPerSecond - мегабиты в секунду
- GigabitsPerSecond - гигабиты в секунду
- AmpereHours - ампер-часы
- MilliampereHours - миллиампер-часы
- WattHours - ватт-часы
- KilowattHours - киловатт-часы
- MegawattHours - мегаватт-часы
- Grands - штуки
- GramsPerSquareCentimeter - граммы на квадратный сантиметр
- GramsPerSquareMeter - граммы на квадратный метр
- Inches - дюймы
- CubicMetersPerMinute - кубические метры в минуту
- MetersPerSecond - метры в секунду
- MetersPerHour - метры в час
- Percents - проценты
- Pixels - пиксели
- Megapixels - мегапиксели
- Diaphragm - диафрагма
- FramesPerSeconds - фреймы в секунду
- ScreenDensity - разрешение экрана
- Decibels - децибелы
- GramsPerMinute - граммы в минуту
- KilogramsPerMinute - килограммы в минуту
- KilogramsPerHour - килограммы в час
- RotationsPerMinute - обороты в минуту
- LitersPerHour - литры в час
- Bars - бары
- CubicMetersPerHour - кубические метры в час
- DotsPerInch - точки на дюйм
- MillilitersPerHour - миллилитры в час
- MillilitersPerSecond - миллилитры в секунду
- MillilitersPerMinute - миллилитры в минуту
- PixelsPerInch - пиксели на дюйм
- LitersPerMinute - литры в минуту
- LitersPerDays - литры в день
- BeatsPerMinute - удары в минуту
- SheetsPerMinute - страницы в минуту
- SheetsPerSecond - страницы в секунду
- Sheets - листы
- InputOutputOperationsPerSecond - опрерации ввода-вывода в секунду
- KilometersPerHour - километры в час
- Kilometers - километры
- CentimetersPerMinute - сантиметры в минуту
- MetersPerMinute - метры в минуту
- KilogramsPerDays - килограммы в день
- FramesPerMinute - кадры в минуту
- Horsepowers - лошадиные силы
- Milliseconds - миллисекуды
- NewtonMeters - ньютон-метры
- MovesPerMinute - ходы в минуту
- DecibelsPerMilliwatt - децибелы на милливатт
- AngleDegrees - градусы углов
- VoltAmperes - вольт-амперы
- MillionPacketsPerSecond - миллионы пакетов в секунду
- Dins - вязкость (DIN)
- GuideNumbers - ведущие числа
- StandardAtmospheres - стандартные атмосферы
- WattsPerKilogram - ватты на килограмм
- ThousandGrands - тысячи штук
- IsotropicDecibels - изотропные децибелы
- GrandsPerSquareMeter - штуки на метр квадратный
- DimensionlessQuantity - безразмерная величина
- WattsPerSquareMeter - ватты на квадратный метр
- GrandsPerSleepingArea - штуки на спальное место
- VibrationsPerMinute - колебания в минуту
- LitersPerSquareMeter - литры на квадратный метр
- Milliamperes - миллиамперы
- KilovoltAmperes - киловольт-амперы
- Kilonewtons - килоньютоны
- CutsPerMinute - резов в минуту
- CandelaPerSquareMeter - канделы на квадратный метр
- PointsPerSecond - пункты в секунду
- GramsPerKilowattHour - граммы на киловатт-час
- MillimetersPerSecond - миллиметры в секунду
- MillimetersPerMinute - миллиметры в минуту
- SquareMetersPerHour - квадратные метры в час
- SquareMetersPerMinute - квадратные метры в минуту
- Pascals - паскали
- Megapascals - мегапаскали
- PersonHours - человеко-часы
- Newtons - ньютоны
- NewtonsPerSquareMillimeter - ньютоны на квадратный миллиметр
- LitersPerSecond - литры в секунду
- GramsPerHour - граммы в час
- MetersPerSquareSecond - метры на секунду в квадрате
- SquareCentimetersPerMinute - квадратные сантиметры в минуту
- GrandsPerHour - штуки в час
- KilogramsPerSquareMeter - килограммы на квадратный метр
- Hectares - гектары
- Ares - сотки
- Kilopascals - килопаскали
- HectaresPerHour - гектаров в час
- GrandsPerMinute - штук в минуту
- SquareMillimeters - квадратные миллиметры
- PoundsPerSquareInch - фунты на квадратный дюйм
- Farads - фарады
- Millifarads - миллифарады
- Microfarads - микрофарады
- Nanofarads - нанофарады
- Picofarads - пикофарады
Шаблон на вход должен получать объект model, а возращать один из трех типов данных:
- true
- false
- объект с таким же набором полей как у CommonAlgorithmPrice (можно оставлять только часть полей, остальные сохранят свои значения)
Пример шаблона для исключения товаров тяжелеее 100 кг (проверка по свойству с названием "Вес"):
func normalize(value)
ret string.downcase(string.strip(value))
end
func get_property(prop_name)
normalized_prop_name = normalize(prop_name)
for prop in model.ProductCard.Properties
if normalize(prop.Name) == normalized_prop_name
ret prop
end
end
ret null
end
prop = get_property("Вес")
if (prop != null && prop.Unit == "Kilograms" && (prop.Type == "Decimal" && prop.DecimalValue > 100 || prop.Type == "Integer" && prop.IntegerValue > 100))
ret false
else
ret true
end
Пример шаблона для установки зачеркнутых цен на 20 процентов выше от вычисленных:
ret {
OriginalPrice: model.CommonAlgorithmPrice.Price * 1.2
}