...
- чек,
- товарная позиция,
- набор товаров.
Набор - – совокупность товаров, которые рассматриваются как единый объект. Наиболее распространенным вариантом набора является предоставление скидки на один вид товара при условии покупки другого. Для Для предоставления скидки, необходимо чтобы все элементы набора присутствовали в чеке в нужном количестве. В В наборах могут участвовать все штучные и весовые товары за исключением расфасованных.
...
Относительный недостаток объектной модели скидок - – необходимость использования отдельного инструмента для управления акциями.
...
- распределение по позициям пропорционально стоимости каждой позиции;,
- размещение остатка максимально возможными суммами начиная с первой позиции.
Правила распределения остатка определяется параметром distributeReceiptDiscountFully
в конфигурационном файле /
linuxcash/cash/conf/ncash.ini
в секции [Discount]
. :
- При при значении параметра
true
остаток скидки распределяется максимально возможными суммами, учитывая ограничения минимальной ценой товара. Выполняется только первый этап распределения скидки.; - При при значении параметра
false
сумма скидки на чек распределяется по позициям пропорционально их стоимости.
Размер скидки на позицию ограничивается минимальной ценой товара. В случае предоставления скидок на наборы минимальную цену на товары можно игнорировать для того, чтобы иметь возможность задавать акции вида "купи две штуки и одну получи в подарок", когда скидка назначается только на один из товаров. Возможность игнорирования минимальной цены при предоставлении скидки на наборы задается параметром ignoreMinimalPriceForKit
в конфигурационном файле /
linuxcash/cash/conf/ncash.ini
в секции [Discount]
. :
- При при значении параметра
true
минимальная цена при применении скидки на набор игнорируется., - При при значении параметра
false
скидка на комплект будет предоставлена с учетом минимальной цены на товар.
В основе дисконтной системы заложена идея использования любых доступных элементов чека (товарная позиция, дисконтная карта и т.д.) для проверки условий и вычисления ставок. Так как условия скидок могут быть сложными, то после изменения состава чека выполняется отмена ранее примененных скидок, последующий пересчет и применение новых. Пересчет скидок может занимать продолжительное время, это может происходить из-за недостатка ресурсов машины, на которой осуществляется работа, или из-за сложности самих скидок. Кассовое ПО Artix может быть настроено таким образом, чтобы расчет скидок происходил как в процессе формирования чека, так и только при переходе к оплате документа. Момент расчета скидок задается параметром recalcDiscInFormingMode
в конфигурационном файле /
linuxcash/cash/conf/ncash.ini
в секции [Check]
. :
- При при значении параметра
true
скидки пересчитываются в режиме формирования документа., - При при значении параметра
false
скидки пересчитываются при переходе в подитогподытог.
Если расчет скидок происходит в режиме формирования документа, то пересчет скидок выполняется после:
...
При использовании акций со ставкой 0% (например, рекламных) можно контролировать запись информации о сработавшем дисконтном воздействии на позицию в БД Documents
таблицу Discitem
. Возможность сохранения скидки 0% на позицию в БД задается параметром saveNullDiscountForPosition
в конфигурационном файле /linuxcash/cash/conf/ncash.ini
в секции [Discount]
.:
- При при значении параметра
true
скидки 0% на позицию сохраняются в БД.При 0% на позицию сохраняются в БД, - при значении параметра
false
скидки 0% на позицию не сохраняются в БД.
Info |
---|
Скидка 0% на чек в БД не записывается. Скидка более 0% на позицию, но с результатом 0 р. будет записана в БД. Например, если скидка 50%, то для позиций с ценой 0.00 или 0.01 в БД будет записываться информация о скидке. |
Наименование | Тип данных | Возможные значения | Описание | Примечания |
---|---|---|---|---|
distributeReceiptDiscountFully | логический |
| Полностью распределять по позициям сумму скидки на чек | По умолчанию true |
ignoreMinimalPriceForKit | логический |
| Игнорировать минимальную цену при применении скидки на комплект | По умолчанию true |
recalcDiscInFormingMode | логический |
| Пересчитывать скидки в режиме формирования чека | По умолчанию |
saveNullDiscountForPosition | логический |
| Сохранять скидку 0% на позицию в базу данных | По умолчанию false |
Code Block | ||||
---|---|---|---|---|
| ||||
[Discounts] ; ; Скидки ; ... ; Полностью распределять по позициям сумму скидки на чек distributeReceiptDiscountFully = false ... ; Сохранять скидку 0% на позицию в базу данных saveNullDiscountForPosition = true ; Игнорировать минимальную цену при применении скидки на комплект ignoreMinimalPriceForKit = false [Check] ; ; Настройки чека ; ... ; Пересчитывать скидки в режиме формирования чека, по-умолчанию true. recalcDiscInFormingMode = true |
...
Сообщения системы лояльности сохраняются в логе кассовой программы /linuxcash/logs/current/terminal.log
на уровне INFO ERROR
. Уровень логирования, формат сообщения и место сохранения данных могут быть изменены в файле /linuxcash/cash/discountsystemdiscountsystems/logging.properties
. Изменения вступают в силу после перезапуска кассовой программы.
Подробнее об уровнях логирования можно прочитать в статье "Логирование работы кассы".
Panel |
---|
При установке уровня логирования DEBUG для Subsystem , Discount , Campaign работа дисконта может быть замедлена. |
Code Block | ||||
---|---|---|---|---|
| ||||
[loggers] keys=root,suartix,sqlalchemy [handlers] keys=fileHandler,consoleHandler [formatters,Subsystem,Impact,AggregateImpact,Discount,Campaign,DiscountCondition,DiscountRate,Kit,KitLogic,Ratefunction,Conditionfunction [handlers] keys=fileHandler,consoleHandler [formatters] keys=defaultFormatter [logger_root] level=INFO handlers=consoleHandler [logger_sqlalchemy] qualname=sqlalchemy level=INFOERROR handlers=consoleHandler propagate=10 [handlerlogger_consoleHandlersuartix] classqualname=StreamHandlersuartix formatterlevel=defaultFormatterINFO args=(sys.stdout,) level=INFOhandlers=consoleHandler propagate=0 [formatterlogger_defaultFormatterSubsystem] format=[%(levelname)s] %(name)s %(asctime)s <%(module)s/%(funcName)s:%(lineno)d> - %(message)s datefmt= class=logging.Formatter |
Объектная модель
...
qualname=Subsystem
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Impact]
qualname=Impact
level=ERROR
handlers=consoleHandler
propagate=0
[logger_AggregateImpact]
qualname=AggregateImpact
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Discount]
qualname=Discount
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Campaign]
qualname=Campaign
level=ERROR
handlers=consoleHandler
propagate=0
[logger_DiscountCondition]
qualname=DiscountCondition
level=ERROR
handlers=consoleHandler
propagate=0
[logger_DiscountRate]
qualname=DiscountRate
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Kit]
qualname=Kit
level=ERROR
handlers=consoleHandler
propagate=0
[logger_KitLogic]
qualname=KitLogic
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Ratefunction]
qualname=Ratefunction
level=ERROR
handlers=consoleHandler
propagate=0
[logger_Conditionfunction]
qualname=Conditionfunction
level=ERROR
handlers=consoleHandler
propagate=0
[handler_consoleHandler]
class=StreamHandler
formatter=defaultFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
formatter=defaultFormatter
args=('dm.log', 'a')
[formatter_defaultFormatter]
format=[%(levelname)s] <%(module)-9s/%(funcName)-15s:%(lineno)-3d> - %(message)s
datefmt=
class=logging.Formatter |
Объектная модель
Объектная модель представляет множество дисконтных акций, которые состоят из объекта скидки, множества условий, ставки, сообщений для кассира и покупателя. Акции организуются в иерархическую структуру (дерево), в рамках одной ступени иерархии задается правило совместного применения акций. Воздействия выбираются по одному из критериев:
- все сработавшие акции;,
- максимальная по сумме воздействия;,
- минимальная по сумме воздействия;,
- первая акция по порядку;,
- последняя акция по порядку;,
- максимум по позициям.
Определить в какой версии кассового ПО будет применена та или иная акция, можно при помощи условия:
...
Загрузка объектной модели лояльности производится в БД Dictionaries
таблицу Discountsystem
:
- в поле
discsystem
- – первое дерево дисконта, - в поле
seconddiscsystem
- – второе (дополнительное) дерево дисконта.
После применения всех дисконтных воздействий в чеке информация о примененной дисконтной системе будет записана в БД Documents
таблицу Discitem
поле discsystem
:
- 1 - – воздействие из первого дерева дисконта,
- 2 - – воздействие из второго дерева дисконта.
...
Если у акции не задан приоритет, то происходит наследование приоритета от родительской группы.
Panel title Пример Группа акций с приоритетом 1 содержит:
- акцию №1, приоритет не задан,
- акцию №2 с приоритетом 3,
- акцию №3 с приоритетом 2.
Очередность акций:
- первой сработает акция №1 (приоритет унаследован от группы акций),
- второй сработает акция №3 с приоритетом 2,
- последней сработает акция №2 с приоритетом 3.
Если у акций внутри группы приоритет задан, а у группы акций - – нет, то акции будут срабатывать в порядке очередности.
Panel title Пример Группа акций, приоритет не задан, содержит:
- акцию №1 с приоритетом 4,
- акцию №2 с приоритетом 3,
- акцию №3 с приоритетом 2.
Очередность акций:
- первой сработает акция №3 с приоритетом 2,
- второй сработает акция №2 с приоритетом 3,
- последней сработает акция №1 с приоритетом 4.
Если у акции и у группы акций не задан приоритет, то акция наследует приоритет у группы акции, стоящей выше по иерархии.
Panel title Пример Родительская группа акций с приоритетом 3 содержит:
Группу акций 1, приоритет не задан, содержит:
- акцию №1, приоритет не задан.
Группа акций 2 с приоритетом 2 содержит:
- акцию №2 с приоритетом 1.
Очередность акций:
- первой сработает акция №2 с приоритетом 1,
- второй сработает акция №1 (приоритет 3 унаследован от родительской группы акций).
Если у акций и группы акций приоритет не задан, то акции будут срабатывать по порядку согласно дереву дисконта.
...
При задании дисконтных акций на наборы с наименьшей скидкой желательно использовать объединение позиций, которое регламентируется параметром unitePositionsInKit
в конфигурационном файле /linuxcash/cash/conf/ncash.ini
в секции [Discount]
.:
- При при значении параметра
true
позиции, являющиеся составной частью набора объединяются в одну при условии, что у товаров совпадают код, штрих-код и цена., - При при значении параметра
false
наборные позиции не объединяются.
Наименование | Тип данных | Возможные значения | Описание | Примечания |
---|---|---|---|---|
unitePositionsInKit | логический |
| Объединять позиции в наборах | По умолчанию true |
Code Block | ||||
---|---|---|---|---|
| ||||
[Discounts] ; ; Скидки ; ... ; Объединять позиции в наборах (по умолчанию true) ; unitePositionsInKit = true |
...
Для того, чтобы к объекту было применено воздействие, необходимо выполнение всех заданных условий. Условия Условия могут быть самыми разнообразными, от тривиального: "если сумма чека больше ...", до более изощренных - – "на каждый второй товар с определенным признаком".
...
- текущая товарная позиция (доступен при условии, что объектом скидки является товарная позиция);,
- чек (доступен всегда);,
- дисконтная карта (доступен в условиях, которые используют карту);,
- клиент (доступен в условиях, которые используют карту);,
- нажатая кнопка (ручная скидка по кнопке).
...
- процентная, сумма скидки вычисляется как процент от суммы объекта скидки
СуммаСоСкидкой = Сумма - (Сумма * (ПроцентСкидки / 100));, абсолютная, сумма скидки равна указанной ставке:
СуммаСоСкидкой = Сумма - СуммаСкидки;Info В случае применения абсолютной скидки к позиции ее размер не зависит от количества товара в данной позиции. - индексная, сумма вычисляется как разность стоимости объекта и стоимости объекта при выборе указанной колонки цен (для товарных позиций):
СуммаСоСкидкой = Количество * (Цена - ИндекснаяЦена);, - расчетная, размер ставки рассчитывается по произвольно заданному условию.
Расчет размеров воздействий выполняется дисконтной системой, в кассовую программу передаются примененные воздействия и их абсолютные значения (суммы). Кассовая программа может накладывать дополнительное условие на итоговую цену товара: итоговая цена после применения скидок должна быть выше или равна минимальной цене товара.
Info |
---|
Для отдельных акций дисконтная система позволяет игнорировать ограничение минимальной цены товара. |
Info |
---|
Для отдельных акций дисконтная система позволяет игнорировать ограничение минимальной цены товара. |
Сообщения
...
Сообщения
Кроме воздействий, дисконтная система позволяет формировать сообщения для покупателя и кассира. Сообщения из всех акций консолидируются с сообщениями из внешней системы лояльности и передаются в программу общим блоком.
Сообщение для кассира отображается на экране однократно или каждый раз перед переходом к оплате чека. Данное поведение регулируется параметром alwaysShowCashierMessages
в конфигурационном файле /linuxcash/cash/conf/ncash.ini
в секции [Check]
:
- при значении параметра
true
сообщение для кассира отображается каждый раз перед переходом к оплате чека, если чек был изменен при возврате в режим формирования, - при значении параметра
false
сообщение для кассира отображается однократно перед переходом к оплате чека.
...
Наименование | Тип данных | Возможные значения | Описание | Примечания |
---|---|---|---|---|
alwaysShowCashierMessages | логический |
| Всегда показывать сообщение кассиру при переходе в подытог | По умолчанию false |
После оповещения программа остается в режиме работы с товарами. Сообщение Сообщение для покупателя сохраняется в чеке и может быть напечатано на чековой ленте.
...
Преимуществом традиционной модели является возможность ведения условий в системе товарного учета, недостаток модели - – ограниченные возможности по заданию условий скидок. Традиционная модель наиболее совместима с дисконтной системой Штрих-М:кассир. Выгружать условия скидок для традиционной модели можно во всех конвертерах, которые позволяют загружать скидки в кассу, наиболее полно загрузка условий реализована в форматах AIF и Штрих-М.
Info |
---|
Для использования традиционной модели необходимо создать акцию в дисконтной системе, в качестве объекта выбрать "старый дисконт". |
...
Порядок расчета скидок в традиционной модели жестко предопределен и не может быть изменен. В первую очередь применяются скидки на комплекты; во вторую - – скидки без использования дисконтной карты; в третьих - – скидки по карте.
Info |
---|
В расчете может участвовать только одна карта. |
Поиск условия для вычисления скидки по карте выполняется в следующем порядке:
- Наборы;.
- Автоматические скидки:
- скидки на позицию без карты (вид карты равен 0),
- скидки на чек без карты (вид карты равен 0),
- скидки по карте,.
- Накопительные скидки;.
- Фиксированные скидки.
Подбор скидки прекращается при обнаружении подходящего условия.
Для определения механизмов взаимодействия скидок используется ряд параметров, которые задаются в конфигурационном файле /linuxcash/cash/conf/ncash.ini
в секции [Discounts]
основного конфигурационного файла ncash.ini
.
Параметры взаимодействия скидок
Наименование | Тип данных | Возможные значения | Описание | Примечания |
---|---|---|---|---|
discMode | строковый |
| Способ взаимодействия скидок на чек
|
|
|
|
|
| По умолчанию over | ||
discPositionMode | строковый |
| Способ взаимодействия скидок на позицию
|
|
|
|
|
|
|
| По умолчанию | ||
pos2CheckDiscRel | строковый |
| Взаимодействие скидок на чек и на позицию
|
|
|
|
| По умолчанию deny |
Code Block | ||
---|---|---|
| ||
[Discounts] ; ; Скидки ; ... ; способ воздействия скидок на чек discMode = "all" ; способ воздействия скидок на на позицию discPositionMode = "deny" ; отношение скидки на чек к скидке на позиции pos2CheckDiscRel = "add" ... |
...