Рубрики
Клуб Менеджер Настройки системы

Настройка дотаций через Балансы

В данной статье рассмотрим настройку дотаций для гостей, используя балансы в модуле Клуб.

В данной статье рассмотрим настройку дотаций для гостей, используя балансы в модуле Клуб.

Баланс — это виртуальный счёт, или же кошелёк, клиента. Т.е. некоторое кол-во средств, которые он может потратить на приобретение продукции в заведении.

Основная задача, это обеспечение некоего корпоративного списка гостей/клиентов ежедневной дотацией, т.е. суммой средств, которая привязана за их, к примеру, пропуску, на день, неделю или месяц.

Пункт 1. Настройка.

В последних сборках нашей системы, для работы с модулем Клуб, уже применены необходимые триггеры.

Однако, если же БД очень старая или клубные функции работают некорректно, то необходимо выполнить скрипт C:\AVERS\CREATE25\club.sql

club.sql

DROP TRIGGER ClientInsA
;

CREATE TRIGGER ClientInsA
AFTER INSERT ON Client
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN (n.AccountID IS NULL AND
(SELECT AccountGroupID FROM ClientGroup
WHERE ClientGroupID=n.ClientGroupID) IS NOT NULL)
BEGIN ATOMIC
INSERT INTO Account (AccountID, CurrencyID, AccountGroupID, Code,
Name, Total, TotalBase, Certificate)
VALUES (0,
VALUE((SELECT CurrencyID FROM AccountGroup WHERE AccountGroupID =
(SELECT AccountGroupID FROM ClientGroup WHERE ClientGroupID=n.ClientGroupID)),
(SELECT CurrencyID FROM Defaults)),
(SELECT AccountGroupID FROM ClientGroup WHERE ClientGroupID=n.ClientGroupID),
n.Code, n.Name, 0, 0, »)
; UPDATE Client SET AccountID = (SELECT MAX(AccountID) FROM Account WHERE Code = n.Code)
WHERE ClientID = n.ClientID
; END
;

DROP TRIGGER ClientUpGroup
;

CREATE TRIGGER ClientUpGroup
AFTER UPDATE OF ClientGroupID ON Client
REFERENCING NEW AS n OLD AS o
FOR EACH ROW MODE DB2SQL
WHEN (n.ClientGroupIDo.ClientGroupID AND n.AccountID IS NOT NULL AND
(SELECT AccountGroupID FROM ClientGroup
WHERE ClientGroupID=n.ClientGroupID) IS NOT NULL)
BEGIN ATOMIC
UPDATE Account SET AccountGroupID=(SELECT AccountGroupID FROM ClientGroup WHERE ClientGroupID=n.ClientGroupID)
WHERE AccountID = n.AccountID
; END
;

DROP TRIGGER CheckBonus
;

CREATE TRIGGER CheckBonus
AFTER INSERT ON Check
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN (n.ClientID IS NOT NULL
AND (n.BillNumber IN (SELECT BillNumber FROM Bill WHERE OpenTime=n.OpenTime))
AND (SELECT AccountID FROM Client WHERE ClientID = n.ClientID) IS NOT NULL
AND (SELECT VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))
FROM Client WHERE ClientID = n.ClientID) IS NOT NULL)
BEGIN ATOMIC
INSERT INTO Transaction
(TransactionID, Time, Card, AccountID, ClientID,
Total, TotalBase, Certificate)
SELECT 0, n.CloseTime, Client.Code, Client.AccountID, n.ClientID,
-n.Total*VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))/100,
-n.TotalBase*VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))/100,
»
FROM Client WHERE Client.ClientID = n.ClientID
; END
;

DROP TRIGGER CheckStornBonus
;

DROP TRIGGER CheckBonusUpd
;

CREATE TRIGGER CheckBonusUpd
AFTER UPDATE ON Check
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN (n.ClientID IS NOT NULL
AND (SELECT AccountID FROM Client WHERE ClientID = n.ClientID) IS NOT NULL
AND (SELECT VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))
FROM Client WHERE ClientID = n.ClientID) IS NOT NULL)
BEGIN ATOMIC
UPDATE Transaction SET Total=
CASE WHEN n.DeleteReasonID IS NULL THEN
-n.Total*(SELECT VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))
FROM Client WHERE ClientID = n.ClientID)/100
ELSE 0 END, TotalBase=
CASE WHEN n.DeleteReasonID IS NULL THEN
-n.Total*(SELECT VALUE(BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = Client.ClientGroupID))
FROM Client WHERE ClientID = n.ClientID)/100
ELSE 0 END
WHERE Time=n.CloseTime AND ClientID=n.ClientID
AND AccountID=(SELECT AccountID FROM Client WHERE ClientID=n.ClientID) AND Total=0
; END
;

DROP TRIGGER TransactionUpdA
;

CREATE TRIGGER TransactionUpdA
AFTER UPDATE OF Total ON Transaction
REFERENCING OLD AS o NEW AS n
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
UPDATE Account SET Total = Total — n.Total + o.Total,
TotalBase = TotalBase — n.TotalBase + o.TotalBase
WHERE AccountID = n.AccountID
; END
;

DROP TRIGGER ClientCheckIns
;

CREATE TRIGGER ClientCheckIns
AFTER INSERT ON Check
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN ((n.ClientID IS NOT NULL) AND (SELECT ClientTotal FROM Defaults)0
AND (n.BillNumber IN (SELECT BillNumber FROM Bill WHERE OpenTime=n.OpenTime)))
UPDATE Client SET Total = VALUE(Total,0) + CASE
WHEN (SELECT ClientTotal FROM Defaults)=1 THEN n.Total
WHEN (SELECT ClientTotal FROM Defaults)=2 THEN n.SubTotal
WHEN (SELECT ClientTotal FROM Defaults)=3 THEN n.SubTotal-n.Total END
WHERE ClientID = n.ClientID
;

DROP TRIGGER ClientCheckStorn
;

CREATE TRIGGER ClientCheckStorn
AFTER UPDATE OF DeleteReasonID ON Check
REFERENCING NEW AS n OLD AS o
FOR EACH ROW MODE DB2SQL
WHEN (n.ClientID IS NOT NULL)
BEGIN ATOMIC
UPDATE Client SET Total = VALUE(Total,0) + CASE
WHEN (SELECT ClientTotal FROM Defaults)=1 THEN n.Total
WHEN (SELECT ClientTotal FROM Defaults)=2 THEN n.SubTotal
WHEN (SELECT ClientTotal FROM Defaults)=3 THEN n.SubTotal-n.Total END
WHERE ClientID = n.ClientID
AND n.DeleteReasonID IS NULL AND o.DeleteReasonID IS NOT NULL
; UPDATE Client SET Total = VALUE(Total,0) — CASE
WHEN (SELECT ClientTotal FROM Defaults)=1 THEN n.Total
WHEN (SELECT ClientTotal FROM Defaults)=2 THEN n.SubTotal
WHEN (SELECT ClientTotal FROM Defaults)=3 THEN n.SubTotal-n.Total END
WHERE ClientID = n.ClientID
AND n.DeleteReasonID IS NOT NULL AND o.DeleteReasonID IS NULL
; END
;

DROP TRIGGER ClientTotalUp
;

CREATE TRIGGER ClientTotalUp
NO CASCADE BEFORE UPDATE OF Total ON Client
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN ((n.Total IS NOT NULL)
AND (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) IS NOT NULL
AND (n.Total = (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID)))
BEGIN ATOMIC
SET n.Percent = CASE WHEN
(SELECT IncPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) IS NULL
THEN n.Percent ELSE
VALUE(n.Percent,(SELECT Percent FROM ClientGroup
WHERE ClientGroupID = n.ClientGroupID),0) +
(SELECT IncPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID))
END
; SET n.Percent = CASE WHEN n.Percent IS NULL OR n.Percent =
VALUE((SELECT MaxPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID),100)
THEN n.Percent ELSE
VALUE((SELECT MaxPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID),100)
END
; SET n.BonusPercent = CASE WHEN
(SELECT IncBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) IS NULL
THEN n.BonusPercent ELSE
VALUE(n.BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = n.ClientGroupID),0) +
(SELECT IncBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID))
END
; SET n.BonusPercent = CASE WHEN n.BonusPercent IS NULL OR n.BonusPercent =
VALUE((SELECT MaxBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID),100)
THEN n.BonusPercent ELSE
VALUE((SELECT MaxBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID),100)
END
; SET n.Total = n.Total — (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID))
; END
;

DROP TRIGGER ClientTotalDown
;

CREATE TRIGGER ClientTotalDown
NO CASCADE BEFORE UPDATE OF Total ON Client
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN (n.Total 0)
BEGIN ATOMIC
SET n.Percent = CASE WHEN
(SELECT IncPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) IS NULL
THEN n.Percent ELSE
VALUE(n.Percent,(SELECT Percent FROM ClientGroup
WHERE ClientGroupID = n.ClientGroupID),0) +
(SELECT IncPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) — 0.999999999999)
END
; SET n.BonusPercent = CASE WHEN
(SELECT IncBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) IS NULL
THEN n.BonusPercent ELSE
VALUE(n.BonusPercent,(SELECT BonusPercent FROM ClientGroup
WHERE ClientGroupID = n.ClientGroupID),0) +
(SELECT IncBonusPercent FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) — 0.999999999999)
END
; SET n.Total = n.Total — (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) *
Int (n.Total / (SELECT IncTotal FROM ClientGroup WHERE ClientGroupID = n.ClientGroupID) — 0.999999999999)
; END
;

Скрипт предназначен для настройки БД. Он добавляет ряд функций для корректной работы модуля Клуб.

Для реализации дотаций через балансы нам потребуется:

  • Создать тип платежа
  • Создать платёж
  • Создать категорию клиентов и тип балансового счёта (тип кошелька)
  • Настроить фискализацию/нефискализацию балансового платежа
  • Настроить автоматическое пополнение средств на кошельки
  • Настройка автоматического списания с баланса или по решению гостя

Создаём тип платежа и платёж.

Создание типа платежей

Примечание: «Фискальный номер платежа» — показывает каким платежом будет числится данная оплата в ФР. Если балансовые платежи должны фискализироваться, то необходимо установить номер от 0 и выше.
0 — наличными на ФР
1 — безналичными на ФР
2 и больше — прочие фискальные платежи
Если балансовые платежи не должны фискализироваться, то прописываем -1. Так же фискализация отключается другими методами, которые будут описаны далее в статье.

Создание платежа

Примечание: «Код» — платежа, для удобства, указывайте малым количеством символов и на латинице. Это уникальное значение, не может повторятся.

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

Открываем доступ должности
Открываем доступ в зале

Создать категорию клиентов.

Максим. бонус (!) — поле, обязательное к заполнению. В данной настройке используется не по прямому назначению, а просто как маркер. Вписываем сюда сумму, которую необходимо вносить клиентам данной категории ежедневно/еженедельно/ежемесячно или за любой другой период.

Тип платежа для операций по балансовому счету — выбираем тот платёж, который мы подготовили для работы с балансами.

Тип балансового счета для новых клиентов — нажимаем на иконку плюса и добавляем новый тип кошельков. Мы указываем его, чтобы каждый новый клиент, созданный в данной категории, автоматически получал кошелёк (изначально пустой).

Минимальный баланс (!) — поле, обязательное к заполнению. Если наши гости, по договору, не имеют права уходить в минус по кошельку, то устанавливаем 0. Если наоборот, то указываем отрицательное значение, которое будет служить максимальным пределом (например -100). Если будет указано положительное значение отличное от нуля, то гости с данным типом кошельков не смогут потратить все свои средства.

Максимальный дневной расход — не обязательное поле. Предназначено для установки максимального расхода средств в день. Чаще всего применимо, если договор составлен в формате «5000 руб на месяц, но расход не более 250 руб в день».

Примечание: Сумму для пополнения клиентского кошелька можно персонализировать. Её можно указать не только в свойствах категории клиентов, но и в карточке самого клиента. Так же не по прямому назначению, используем поле «Процент бонуса» в свойствах клиента.
Если данное поле будет заполнено, то параметр пополнения, указанный в свойствах категории клиентов, игнорируется.

Настройка фискализации балансового платежа.

Данная настройка выполняется на всех станциях, на которых установлен ФР и запущен соответствующий спулер.

Открываем файл C:\AVERS\SPOOL\spooler.cfg текстовым редактором. Находим раздел [FiscalMode] и в нём параметр
NoFiscal= — после равно вписываем коды всех платежей, которые не должны быть фискализированы.

Если платежи должны быть фискализированы, то убираем их коды из данной настройки.

Примечание: Аналогичная настройка используется в C:\AVERS\front.cfg в разделе [Station] для корректного отображения тех или иных платежей в таблице закрытия смены.

Настройка автоматического пополнения средств на кошельки.

Для начала необходимо скорректировать скрипт пополнения для наших категорий клиентов.

Скрипт autobalace.sql находится в C:\AVERS\CLIENT

autobalace.sql

DROP TRIGGER TRANSACTIONINSOVER;

export to tr.txt of del
select 0,CHAR(CURRENT DATE,JIS) CONCAT ‘ ‘ CONCAT ’00:01:00’
,’AUTO’ CONCAT RTRIM(CHAR(cg.maxbonuspercent)),
cl.AccountID,cl.ClientID,
-(VALUE(cl.bonuspercent,cg.maxbonuspercent)-ac.Total),
-(VALUE(cl.bonuspercent,cg.maxbonuspercent)-ac.Total),»
from client cl,account ac,clientgroup cg
where cl.clientgroupid in (1,2,3,4)
and cl.clientgroupid=cg.clientgroupid
and VALUE(cl.deleted,0)=0
and cl.accountid=ac.accountid
and (cg.maxbonuspercent is not null or cl.bonuspercent is not null)
and ac.total<>VALUE(cl.bonuspercent,cg.maxbonuspercent)
order by cl.clientgroupid
;

import from tr.txt of del insert into transaction
;

CREATE TRIGGER TransactionInsOver
NO CASCADE BEFORE INSERT ON Transaction
REFERENCING NEW AS n
FOR EACH ROW MODE DB2SQL
WHEN (n.Total > (SELECT Account.Total — AccountGroup.MinDeposit
FROM Account, AccountGroup
WHERE Account.AccountID = n.AccountID
AND Account.AccountGroupID = AccountGroup.AccountGroupID)
)
BEGIN ATOMIC
SIGNAL SQLSTATE ‘99003’ (‘Account overdraft’)
; END

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

autobalace.sql

Закончив с редактированием, добавляем в Планировщик заданий Windows задание на выполнение данного скрипта.
Нажимаем правой кнопкой мыши по иконке «Этот компьютер» или «Мой компьютер» и выбираем пункт «Управление».

Выполняем пункты согласно нумерации на картинке. Таким образом мы импортируем в конкретную локальную систему, заранее приготовленное задание.

Откроется следующее окно. В нём нажимаем «Изменить…». В следующем окне в поле «Введите имена выбираемых объектов:» вписываем USERID и нажимаем кнопку «Проверить имена», затем нажимаем «ОК».

Затем переходим в закладку «Триггеры» и изменяем существующие параметры частоты выполнения задачи, либо же добавляем новые. Выбор параметров зависит от того, как часто должно происходить пополнение балансов у гостей.

Настройка автоматического списания с баланса или по решению гостя.

Данная настройка выполняется в разделе «Настройка», закладка «Менеджер». Название опции — «Автоматическая оплата картой».

Работает следующим образом:
Настройка включена — Front при применении клиента с виртуальным кошельком автоматически списывает средства с клиента/гостя. Если средств достаточно, то чек полностью закрывается. Если средств не достаточно, то кассиру на экране отображается калькулятор с суммой необходимой доплаты.

Настройка выключена — Front при применении клиента с виртуальным кошельком предлагает выбор: списывать с клиента средства или позволить ему оплатить полную стоимость другими способами оплаты.

На данном этапе настройка балансов закончена.

Пункт 2. Применение.

Набирается заказ, применяется карта клиента или клиент выбирается из списка.

Далее 2 возможных варианта.

Настройка «Автоматическая оплата картой» включена.

Front выводит калькулятор только с доплатой

Настройка «Автоматическая оплата картой» выключена.

Front выводит калькулятор на выбор любой из доступных оплат

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *