Общие положения

Задачи
  • централизованное хранение данных о картах, быстрый доступ к информации о карте, возможность обновления информации
  • централизованное хранение чеков и предоставление их для анализа
  • быстрый расчёт скидок
  • простое распространение изменений в алгоритмах расчёта
  • нетребовательная и устойчивая инфраструктура

Выделяются три независимых модуля
  • Сервер карт - хранение, регистрация карт, выдача информации о карте по запросу, обновление информации о карте по запросу.
  • Модуль скидок - расчёт скидок
  • Сервер чеков - хранение проведённых чеков 
Схема взаимодействия модулей
  • Касса обращается на сервер карт. Сервер карт проверяет актуальность карт и возвращает в кассу ответ. 
  • Касса передаёт чек в модуль скидок (товары и карты). Модуль при необходимости запрашивает у сервера карт дополнительные данные о картах. Модуль выполняет расчёт цен со скидками и возвращает в кассу чек с новыми ценами.
  • После оплаты чека касса передаёт данные на сервер карт и сервер чеков. Результата передачи касса не ждёт.  Повторная (проверочная) передача будет выполнена позже. Сервер карт вносит сведения о совершенной покупке по карте. Сервер чеков сохраняет чек.
Источники появления скидок
  1. фиксированная акционная цена (Скидка заранее указана в виде цены в реестре на распродажу). 
  2. цена, рассчитанная по правилам дисконтной схемы. Расчёт выполняется либо самой кассой  (встроенный модуль скидок), либо внешним сервером (Дисконтный сервер или система лояльности).
  3. ручная скидка (указывается кассиром в чеке).
  4. скидка за оплату баллами
Ограничения расчёта скидок
  1. фиксированная акционная цена не участвует в расчётах модуля скидок
  2. цена после ручной скидки не участвует в расчётах модуля скидок
  3. МРЦ на алкоголь и табак (итоговая цена не может быть ниже или выше значений, регулируемых государством)
  4. доля стоимости, которая может быть оплачена баллами, не может быть выше заданного значения
Принципы расчёта
  1. Скидка всегда считается на строку. Скидка на чек означает, что скидка применяется к каждой строке.
  2. Расчёт скидок модулем выполняется либо при нажатии кнопки ПодИтог, либо при переходе в режим оплаты
  3.  
Схема работы 

Ввод чека и расчёт цен

  1. Кассир добавляет товары в чек. Для товара отображается либо акционная цена, либо текущая розничная цена
  2. Если кассир указал ручную скидку на товар, то сумма в строке изменяется.
  3. Если кассир нажимает кнопку ПодИтог, то выполняется запрос в модуль скидок и отображаются суммы со скидками
  4. При переходе в режим оплаты также выполняется запрос в модуль скидок. Если кассир вернётся в режим продажи, будут отображены суммы со скидками.
  5. Дисконтные карты, купоны, промо-слова необходимо считывать до перехода в режим оплаты. В противном случае скидки не будут рассчитаны.
  6. Дисконтный модуль получает на вход чек и все предъявленные покупателем дисконтные карты и купоны. Расчёт выполняется внутри модуля. В кассу модуль передаёт чек с новыми ценами.

Учёт скидок за баллы

1. Если на карте покупателя имеются баллы для оплаты, то модуль рассчитывает максимальное число баллов, которыми покупатель может расплатиться. 

Общая сумма для расчёта максимального количества баллов вычисляется по формуле: цена * количество. Если в строке указан товар с МРЦ, то цена для расчёта максимального количества баллов рассчитывается как разница между факт. ценой товара и МРЦ. Если задан максимальный процент оплаты баллами, то рассчитанная сумма изменяется в соответствии со значением этого процента. 

2. Кассир запрашивает у покупателя число баллов для оплаты с учётом имеющихся на карте баллов и рассчитанного максимального количества баллов. 

3. Баллы для оплаты распределяются пропорционально на строки чека в виде скидок. В зависимости от значения соответствующего параметра строк с акционной ценой и ручной скидкой могут быть исключены из распределения. Нераспределённый в результате округления сумм остаток переносится на строку с наибольшей ценой товара. В каждую строку чека записывается число списанных баллов за оплату данного товара. 

Оплата

1. Кассир узнаёт способ оплаты и принимает деньги.

2. По окончании оплаты выполняется передача окончательного варианта чека в сервер чеков.

3. В систему лояльности передаются два значения: списанные баллы и начисленные баллы за текущую покупку. Баллы могут быть начислены  при оплате наличными или банковской картой.

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