Начиная с версии (при обновлении на версию) 10.2.99.0 содержимое конфигурацонного файла ext-loyalty-providers.xml перенесено в БД и вносить изменения надо будет в БД, подробнее ниже по тексту. |
Расчет скидок на кассе производится в модуле "провайдер лояльности".
На кассе может присутствовать более одного провайдера:
При расчете скидок чек последовательно проходит через цепочку подключенных к кассе провайдеров лояльности, обрастая скидками. Порядок, в котором применяются провайдеры, может быть важен при расчете скидок.
Одно из частых требований - производить фильтрацию рекламных акций (РА) и применять скидку на округление только после окончания расчета скидок в цепочке. Для настройки порядка, в котором провайдеры лояльности будут применяться к чеку, а также выбора порядка применения скидок различного типа (округление, суммирующиеся всегда, и.т.д.), используется конфигурацонный файл /home/tc/storage/crystal-cash/modules/loyalty/ext-loyalty-providers.xml.
/home/tc/storage/crystal-cash/modules/loyalty/ext-loyalty-providers.xml |
Этот файл требуется настраивать вручную для каждой кассы.
При установке кассы из дистрибутива, файл (для версий 10.2.59.0 и выше) ext-loyalty-providers.xml будет выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <beans xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- Расширенный (EXTended) список поставщиков "услуг лояльности". Или внешние (EXTernal) поставщики лояльности --> <!-- Средство для получения списка РА, что могут действовать на чек прямо сейчас --> <bean id="loy-actions-provider" class="ru.crystals.loyal.actions.provider.InMemoryLoyActionsProvider" init-method="start"> <property name="cache" ref="actions-cache"/> </bean> <!-- Реестр всех "поставщиков" "услуг лояльности". Он же - главный "калькулятор" "преференций" --> <bean id="loy-providers-registry" class="ru.crystals.loyal.providers.LoyProvidersRegistryImpl" init-method="init"> <property name="providers"> <list> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.SetActionsAndFilter"> <property name="filters"> <list> <bean class="ru.crystals.loyal.providers.set.filters.NonWorksAnyTimeSetActionsFilter" /> <bean class="ru.crystals.loyal.providers.set.filters.NonRoundingSetActionsFilter" /> </list> </property> </bean> </property> </bean> <!-- сторонние поставщики лольяности пошли --> <ref bean="set-api-loy-provider"/> <bean class="ru.crystals.pos.loyal.ml.ManzanaLoyProvider" /> <bean class="ru.crystals.pos.loyal.sc.SCLoyProvider" /> <ref bean="loymax-loy-provider" /> <ref bean="kopilka-loy-provider" /> <ref bean="set-machine-loy-provider" /> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.SetActionsAndFilter"> <property name="filters"> <list> <bean class="ru.crystals.loyal.providers.set.filters.WorksAnyTimeSetActionsFilter" /> <bean class="ru.crystals.loyal.providers.set.filters.NonRoundingSetActionsFilter" /> </list> </property> </bean> </property> </bean> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.RoundingSetActionsFilter" /> </property> </bean> </list> </property> <property name="staleFeedbackSendIntervalSeconds" value="120"/> <property name="maxStaleFeedbackToSend" value="5"/> </bean> <!-- Наш (SET10) классический поставщик услуг лояльности --> <bean id="classic-set10-loy-provider" class="ru.crystals.loyal.providers.ClassicSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности SetMachine --> <bean id="set-machine-loy-provider" class="ru.crystals.pos.loyal.sm.SetMachineLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности Loymax --> <bean id="loymax-loy-provider" class="ru.crystals.pos.loyal.loymax.LoymaxLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности Kopilka --> <bean id="kopilka-loy-provider" class="ru.crystals.pos.loyal.kopilka.KopilkaLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <bean id="set-api-loy-provider" class="ru.crystals.pos.loyal.SetApiPluginLoyProvider" init-method="init"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> </beans> |
С версии 10.2.99.0+ содержимое конфигурацонного файла ext-loyalty-providers.xml переносится в кассовую БД и находится в таблице catalog.sales_management_properties:
module_name | plugin_name | property_key | property_value | description |
---|---|---|---|---|
SET_DISCOUNTS | ext.loyalty.providers | (конфигурация провайдеров лояльности - ранее текстовое содержимое файла ext-loyalty-providers.xml как оно есть, в формате xml) | Описание провайдеров лояльности (xml) |
При обновлении кассы на версию 10.2.99.0 и выше содержимое файла ext-loyalty-providers.xml перенесётся в БД кассы автоматически, в указанную таблицу. После ручного редактирования конфигурации провайдеров лояльности в БД кассы необходимо перезагрузить кассу. Файл ext-loyalty-providers.xml останется на кассе, но потеряет актуальность, кроме случаев, когда конфигурация в БД окажется невалидной (например, формат некорректный). В случае ошибки в конфигурации из БД, конфигурация возьмется из файла, чтобы не сломать работу кассы.
Список и порядок применяемых провайдеров лояльности находится в бине "loy-providers-registry", свойстве "providers". Вам всё ещё нужно регистрировать провайдер лояльности во "Внешних системах" на сервере и создавать рекламную акцию для срабатывания его, чтобы расчет скидок в нем действительно был произведен. Доступные кассе провайдеры лояльности и способ их записи представлены в таблице 1.
Список и порядок применяемых провайдеров лояльности находится в секции loy-providers-registry
, свойстве providers
.
В любом случае вам нужно зарегистрировать провайдер лояльности во "Внешних системах" на сервере и создать рекламную акцию для его срабатывания, чтобы расчет скидок был произведен.
Доступные кассе провайдеры лояльности и способ их записи представлены в таблице 1.
Таблица 1 - доступные кассе провайдеры лояльности.
Провайдер | Способ подключения в список | |
---|---|---|
Стандартный провайдер лояльности Set10 |
| |
Конфигурируемый провайдер лояльности Set10 | См. ниже "Конфигурируемый провайдер лояльности Set10" | |
Провайдер лояльности "Копилка" |
| |
Manzana Loyalty |
| |
Loymax (не плагинный) |
| |
Set Machine |
| |
Smart Checkout |
| |
Set API |
|
В отличии от стандартного провайдера лояльности Set10, конфигурируемый провайдер лояльности Set10 может применять к своим рекламным акциям заданные фильтры.
Обычно такая методика используется для того, чтобы посчитать скидки Set10 первыми, не учитывая результаты рекламной акции с результатом "Округление", а затем скидки какого-либо иного провайдера и только затем РА с результатом "Округление". Поэтому такой провайдер может встречаться в цепочке расчета несколько раз. Для этого провайдер может быть настроен одним или несколькими фильтрами рекламных акций.
Пример декларирования конфигурируемого провайдера лояльности Set10 для выполнения расчета рекламных акций, которые не суммируются всегда и не имеют результат типа "Округление", представлен ниже.
<bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.SetActionsAndFilter"> <property name="filters"> <list> <bean class="ru.crystals.loyal.providers.set.filters.WorksAnyTimeSetActionsFilter" /> <bean class="ru.crystals.loyal.providers.set.filters.NonRoundingSetActionsFilter" /> </list> </property> </bean> </property> </bean> |
Фильтры рекламных акций, которые будут применяться провайдером, декларируются в свойстве filter
. Здесь можно задекларировать либо один фильтр, либо цепочку фильтров, применяемых по логическому И, ИЛИ, НЕ. Список доступных фильтров приведен ниже в таблице 2.
Таблица 2 - фильтры рекламных акций конфигурируемого провайдера лояльности Set10
Какие акции допускает | Пример декларации | Комментарий | |
---|---|---|---|
Акции, приводящие к начислению бонусов Set10 |
| ||
"Бонусы как скидка" |
| ||
Печать купона |
| ||
Оповещение о подарках |
| ||
Любая рекламная акция, результатом которой не является скидка на округление |
| ||
Любая рекламная акция, которая не суммируется всегда |
| ||
Результатом рекламной акции является "Скидка на округление" |
| ||
Рекламные акции, которые суммируются всегда |
| ||
Комплексный фильтр рекламных акций, объединяет находящиеся в нём фильтры логическим "И". Это означает, рекламная акция допускается к рассмотрению только при условии, что она удовлетворяет всем фильтрам данного фильтра. |
| Для примера изображено подключение двух фильтров: "Суммируются всегда" и "Не округление". Это означает, задекларированный фильтр пропускает только суммирующиеся всегда рекламные акции, результатом которых не является округление притом. | |
Комплексный фильтр рекламных акций, объединяет находящиеся в нём фильтры логическим "ИЛИ". Это означает, рекламная акция допускается к рассмотрению, если она удовлетворяет хотя бы одному фильтру. |
| Для примера изображен фильтр, пропускающий РА типа "Начисление бонусов Set 10" или "Бонусы как скидка". | |
Служебный фильтр, предназначен для инвертирования результата другого фильтра |
| На примере изображен эквивалент фильтра "Несуммирующиеся всегда" |
Например: в SetRetail10 заведены рекламные акции, представленные в таблице. Необходимо обеспечить расчет скидок округления после всех остальных скидок, расчет скидок Loymax после плагинов Set API, но до суммирующихся всегда и несуммирующиеся всегда скидки считаются первыми. Тогда конфигурационный файл цепочки провайдеров лояльности примет вид, представленный ниже в коде.
Таблица 3 - пример заведения рекламных акций
Название | Суммируется всегда | Результат |
---|---|---|
Скидка 10% безусловная | Нет | Скидка 10% от суммы чека |
Расчет скидок в Loymax | Да | Расчет скидок в бонусной системе Loymax |
Расчет скидок в плагинах Set API | Нет | Расчет скидок в одном или более подключенных плагинов Set API |
Скидка 3% безусловная, всегда | Да | Скидка 3% |
Округление | Да | Скидка на округление до рубля |
<?xml version="1.0" encoding="UTF-8"?> <beans xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bean id="loy-actions-provider" class="ru.crystals.loyal.actions.provider.InMemoryLoyActionsProvider" init-method="start"> <property name="cache" ref="actions-cache"/> </bean> <!-- Реестр всех "поставщиков" "услуг лояльности". Он же - главный "калькулятор" "преференций" --> <bean id="loy-providers-registry" class="ru.crystals.loyal.providers.LoyProvidersRegistryImpl" init-method="init"> <property name="providers"> <list> <!-- Первыми считаются рекламные акции Set10, которые не являются суммирующимися всегда и не производят округления--> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.SetActionsAndFilter"> <property name="filters"> <list> <bean class="ru.crystals.loyal.providers.set.filters.NonWorksAnyTimeSetActionsFilter" /> <bean class="ru.crystals.loyal.providers.set.filters.NonRoundingSetActionsFilter" /> </list> </property> </bean> </property> </bean> <!-- Далее следует расчет скидок в Set API --> <ref bean="set-api-loy-provider"/> <!-- Расчет скидок в неплагинной (не Set API) интеграции с Loymax --> <ref bean="loymax-loy-provider" /> <!-- Расчет скидок Set10, суммирующихся всегда и не являющихся скидками на округление --> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.SetActionsAndFilter"> <property name="filters"> <list> <bean class="ru.crystals.loyal.providers.set.filters.WorksAnyTimeSetActionsFilter" /> <bean class="ru.crystals.loyal.providers.set.filters.NonRoundingSetActionsFilter" /> </list> </property> </bean> </property> </bean> <!-- Расчет скидок на округление --> <bean class="ru.crystals.loyal.providers.CustomSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> <property name="filter"> <bean class="ru.crystals.loyal.providers.set.filters.RoundingSetActionsFilter" /> </property> </bean> </list> </property> <property name="staleFeedbackSendIntervalSeconds" value="120"/> <property name="maxStaleFeedbackToSend" value="5"/> </bean> <!-- Наш (SET10) классический поставщик услуг лояльности --> <bean id="classic-set10-loy-provider" class="ru.crystals.loyal.providers.ClassicSetLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности SetMachine --> <bean id="set-machine-loy-provider" class="ru.crystals.pos.loyal.sm.SetMachineLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности Loymax --> <bean id="loymax-loy-provider" class="ru.crystals.pos.loyal.loymax.LoymaxLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <!-- Поставщик лояльности Kopilka --> <bean id="kopilka-loy-provider" class="ru.crystals.pos.loyal.kopilka.KopilkaLoyProvider"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> <bean id="set-api-loy-provider" class="ru.crystals.pos.loyal.SetApiPluginLoyProvider" init-method="init"> <property name="actionsProvider" ref="loy-actions-provider"/> </bean> </beans> |
Таким образом, в процессе расчета скидок над чеком будут произведены следующие вариации расчета:
Обратите внимание, несмотря на то, что РА "Расчет скидок в плагинах Set API" помечена как "несуммирующаяся всегда", её расчет был выполнен до расчета только суммирующихся скидок. Так произошло потому что только провайдеры лояльности Set10 учитывают флаг суммируемости. |