Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • чек,
  • товарная позиция,
  • набор товаров. 

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

...

Относительный недостаток объектной модели скидок - необходимость использования отдельного инструмента для управления акциями.

...

  • распределение по позициям пропорционально стоимости каждой позиции;,
  • размещение остатка максимально возможными суммами начиная с первой позиции.

Правила распределения остатка определяется параметром 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
  • false
Полностью распределять по позициям сумму скидки на чекПо умолчанию true
ignoreMinimalPriceForKitлогический
  • true
  • false
Игнорировать минимальную цену при применении скидки на комплектПо умолчанию true

recalcDiscInFormingMode

логический
  • true
  • false

Пересчитывать скидки в режиме формирования чека

По умолчанию true

saveNullDiscountForPositionлогический
  • true
  • false
Сохранять скидку 0% на позицию в базу данныхПо умолчанию false


Code Block
languagetext
titleПример настроек
[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
languagetext
titleПример настроек логгера
[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
  • false
Объединять позиции в наборахПо умолчанию true


Code Block
languagetext
titleПример настройки
[Discounts]
;
; Скидки
;
...
; Объединять позиции в наборах (по умолчанию true)
; unitePositionsInKit = true

...

Для того, чтобы к объекту было применено воздействие, необходимо выполнение всех заданных условий.  Условия Условия могут быть самыми разнообразными, от тривиального: "если сумма чека больше ...", до более изощренных - "на каждый второй товар с определенным признаком". 

...

  • текущая товарная позиция (доступен при условии, что объектом скидки является товарная позиция);,
  • чек (доступен всегда);,
  • дисконтная карта (доступен в условиях, которые используют карту);,
  • клиент (доступен в условиях, которые используют карту);,
  • нажатая кнопка (ручная скидка по кнопке).

...

  • процентная, сумма скидки вычисляется как процент от суммы объекта скидки
    СуммаСоСкидкой = Сумма - (Сумма * (ПроцентСкидки / 100));,
  • абсолютная, сумма скидки равна указанной ставке: 
    СуммаСоСкидкой = Сумма - СуммаСкидки;

    Info
    В случае применения абсолютной скидки к позиции ее размер не зависит от количества товара в данной позиции. 


  • индексная, сумма вычисляется как разность стоимости объекта и стоимости объекта при выборе указанной колонки цен (для товарных позиций): 
    СуммаСоСкидкой = Количество * (Цена - ИндекснаяЦена);,
  • расчетная, размер ставки рассчитывается по произвольно заданному условию.

Расчет размеров воздействий выполняется дисконтной системой, в кассовую программу передаются примененные воздействия и их абсолютные значения (суммы). Кассовая программа может накладывать дополнительное условие на итоговую цену товара: итоговая цена после применения скидок должна быть выше или равна минимальной цене товара.

Info
Для отдельных акций дисконтная система позволяет игнорировать ограничение минимальной цены товара.
Info
Для отдельных акций дисконтная система позволяет игнорировать ограничение минимальной цены товара.

Сообщения

...

Сообщения

Кроме воздействий, дисконтная система позволяет формировать сообщения для покупателя и кассира. Сообщения из всех акций консолидируются с сообщениями из внешней системы лояльности и передаются в программу общим блоком.

Сообщение для кассира отображается на экране однократно или каждый раз перед переходом к оплате чека. Данное поведение регулируется параметром alwaysShowCashierMessages в конфигурационном файле /linuxcash/cash/conf/ncash.ini в секции [Check]:

  • при значении параметра true сообщение для кассира отображается каждый раз перед переходом к оплате чека, если чек был изменен при возврате в режим формирования,
  • при значении параметра false сообщение для кассира отображается однократно перед переходом к оплате чека.

...

НаименованиеТип данныхВозможные значенияОписаниеПримечания

alwaysShowCashierMessages

логический
  • true
  • false
Всегда показывать сообщение кассиру при переходе в подытогПо умолчанию false

После оповещения программа остается в режиме работы с товарами.  Сообщение Сообщение для покупателя сохраняется в чеке и может быть напечатано на чековой ленте.

...

Преимуществом традиционной модели является возможность ведения условий в системе товарного учета, недостаток модели - ограниченные возможности по заданию условий скидок. Традиционная модель наиболее совместима с дисконтной системой Штрих-М:кассир. Выгружать условия скидок для традиционной модели можно во всех конвертерах, которые позволяют загружать скидки в кассу, наиболее полно загрузка условий реализована в форматах AIF и Штрих-М.

Info
Для использования традиционной модели необходимо создать акцию в дисконтной системе, в качестве объекта выбрать "старый дисконт".

...

Порядок расчета скидок в традиционной модели жестко предопределен и не может быть изменен. В первую очередь применяются скидки на комплекты; во вторую - скидки без использования дисконтной карты; в третьих - скидки по карте.

Info
В расчете может участвовать только одна карта.

Поиск условия для вычисления скидки по карте выполняется в следующем порядке:

  1. Наборы;.
  2. Автоматические скидки:
    • скидки на позицию без карты (вид карты равен 0),
    • скидки на чек без карты (вид карты равен 0),
    • скидки по карте,.
  3. Накопительные скидки;.
  4. Фиксированные скидки.

Подбор скидки прекращается при обнаружении подходящего условия.

Для определения механизмов взаимодействия скидок используется ряд параметров, которые задаются в конфигурационном файле /linuxcash/cash/conf/ncash.ini в секции [Discounts] основного конфигурационного файла ncash.ini.

Параметры взаимодействия скидок

НаименованиеТип данныхВозможные значенияОписаниеПримечания
discModeстроковый
  • all
  • over
  • deny

Способ взаимодействия скидок на чек

  • all
-
  • суммирование скидок
;
  • ,
  • over
-
  • применение последней скидки
;
  • ,
  • deny
-
  • использование первой примененной скидки.
По умолчанию over
discPositionModeстроковый
  • all
  • over
  • max
  • deny

Способ взаимодействия скидок на позицию

  • all
-
  • суммирование скидок
;
  • ,
  • over
-
  • применение последней скидки
;
  • ,
  • max
-
  • применение наибольшей из скидок
;
  • ,
  • deny
-
  • использование первой примененной скидки.

По умолчанию deny

pos2CheckDiscRelстроковый
  • add
  • deny

Взаимодействие скидок на чек и на позицию

  • add
-
  • применять скидку на чек всегда
;
  • ,
  • deny
-
  • применять скидку на чек,
если не
  • если не применены скидки на позицию.
По умолчанию deny


Code Block
titleПример настроек
[Discounts]
;
; Скидки
;

... 
; способ воздействия скидок на чек
discMode = "all"
 
; способ воздействия скидок на на позицию
discPositionMode = "deny"
 
; отношение скидки на чек к скидке на позиции
pos2CheckDiscRel = "add"
...

...