В данной статье рассмотрим настройку дотаций для гостей, используя балансы в модуле Клуб.
Баланс — это виртуальный счёт, или же кошелёк, клиента. Т.е. некоторое кол-во средств, которые он может потратить на приобретение продукции в заведении.
Основная задача, это обеспечение некоего корпоративного списка гостей/клиентов ежедневной дотацией, т.е. суммой средств, которая привязана за их, к примеру, пропуску, на день, неделю или месяц.
Пункт 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. Применение.
Набирается заказ, применяется карта клиента или клиент выбирается из списка.