Инструкция по настройке
Установка и настройка состоит из двух этапов:
- Настройка в менеджерской части;
- Настройка и запуск FarCards с плагином Premium Bonus. [Скачать]
Конфигурация со стороны RK7:
1. Добавить на кассовом сервере PDS Interface с настройками как на скрине:
Название сервера (PDS Server Name) произвольное, главное, чтобы оно совпадало с названием в farcards.ini
Для работы с категориями по XML-интерфейсу требуется добавить на кассовый сервер этот самый интерфейс:
Порт интерфейса и адрес расположения этого сервера необходимо будет указать в настройках модуля, проставив предусмотренную галочку для активации функционала. Конечно же, не забываем про привязку интерфейса к объекту (по аналогии с п. 2). Важно заметить, что если какой-либо XML-интерфейс уже прикреплен к серверу, то можно не создавать новый, но привязку необходимо проверить.
2. В “Сервис” - ”Интерфейсы” создать новый интерфейс и привязать ранее созданный PDS Interface в разделе «Файлы библиотек», а в разделе «Интерфейс» в поле “Xml dish attributes” указать “2560.CategPath”, подробнее на скрине:
3. В “Сервис” – “Обработка сигналов устройств” – “MCR алгоритмы” добавить новый алгоритм.
В настройках алгоритма необходимо указать область применения «Интерфейс», а в объекте указать ранее созданный интерфейс и выставить галки на типы устройств как на скрине:

В свойство скрипт скопировать убрав дефолтное значение:
begin
Result := (Length(Parameter) >= 6) and
(Length(Parameter) <= 11) and
(GUI.CheckFormInPayMode = false);
end;
Вариант для B в начале кода:
begin
if ('B'=Copy(Parameter, 1, 1)) or ('В'=Copy(Parameter, 1, 1)) then // в первой части буква на кирилице а во второй на латыни – для избежания проблем с раскладкой клавиатуры
begin
Parameter := copy(Parameter, 2, length(Parameter)-1);
Result := (Length(Parameter) >= 6) and
(Length(Parameter) <= 11) and not GUI.CheckFormInPayMode;
end
else
begin
Result:=False;
end;
end;
4. В меню “Деньги” – “Скидки” создать 3 скидки. Для удобства и порядка можно создать отдельную папку под эти скидки. Для одновременной работы всех скидок необходимо в настройках каждой скидки изначально задать флаг “Комбинировать с любой скидкой”.
Первая скидка процентная для авторизации карты в заказе:
Название для скидки “Карта PB”
Галочки на “Не вручную” и "На заказ"
Детализация на 0 процентов
Вторая скидка суммовая для Бонусов.
Название “Бонусы PB”
Галочки на “Не вручную” и "На блюдо"
В настройках надо указать тип «Сумма», в детализации установить значение 100 000.
Третья скидка суммовая для работы доп. акций.
Название “Скидка PB”
Галочки на “Не вручную” и "На блюдо"
В настройках надо указать тип «Сумма», в детализации установить значение 100 000.
5. Настроить макеты печати для Чека и Пречека.
В макет Пречека необходимо добавить виртуальный бенд, в его свойствах в разделе "Данные" выбрать источник данных "Скидки", в свойстве "Группировка" настроить группировку по переменной [PDSPrintText].
В созданном бенде добавить мемо на всю ширину макета, настроить выравнивание по центру и внутри мемо добавить переменную [PDSPrintText]
В макет Чека добавляем виртуальный бенд, в его свойствах в разделе "Данные" выбираем источник данных "Инфо о карте".

В созданном бенде добавляем мемо на всю ширину макета, настраиваем выравнивание по центру и внутри мемо добавляем переменную [AdditionalInfo]
6. В форме редактирования заказа(обычной и для быстрого чека) нужно добавить скрипты.
Перед редактированием формы, нужно проанализировать актуальную схему и её формы на наличие возможных конфликтующих скриптов.
В самом начале обработчика событий формы нужно вставить текст скриптов и указать верные коды скидок:
// Лояльность премиум бонус
function PBMarkerCode : Integer;
begin
Result := 9; // Скидка для активации карты
end;
function PBBonusCode : Integer;
begin
Result := 10; // Суммовая скидка для бонусов
end;
function PBActionCode : Integer;
begin
Result := 11; // Суммовая скидка для акций
end;
function IsPBMarker(O : TObject) : Boolean;
begin
Result := False;
if SYS.ObjectInheritsFrom(O, 'TDiscountItem') then
begin
Result := TDiscountItem(O).code = PBMarkerCode;
end;
end;
function IsPBDiscount(O : TObject) : Integer; // 0 - не скидка, 1 - бонусы, 2 - акции
var
code : integer;
begin
Result := 0;
if SYS.ObjectInheritsFrom(O, 'TCheckItem') then
begin
code := TCheckItem(O).Code;
if Code = PBBonusCode then Result := 1
else if Code = PBActionCode then Result := 2;
end;
end;
function CheckPBDiscounts : Integer;
var
i, j : Integer;
it : TCheckItem;
dish : TDish;
begin
Result := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if it.state <> disDeleted then
begin
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
dish := TDish(it);
for j := 0 to dish.discounts.count - 1 do
begin
Result := Result or ( IsPBDiscount( dish.discounts.items[j] )*2 );
if Result and 6 = 6 then Break;
end;
end
else if IsPBMarker( it ) then Result := Result or 1
else if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem')
then Result := Result or ( IsPBDiscount( it )*2 );
end;
if Result and 7 = 7 then Exit;
end;
end;
procedure RemovePBDiscounts;
var
i, j : Integer;
it : TCheckItem;
dish : TDish;
discount : TCheckItem;
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if it.state <> disDeleted then
begin
if SYS.ObjectInheritsFrom(it,'TDish') then
begin
dish := TDish(it);
j := 0;
while j < dish.discounts.count do
begin
discount := dish.discounts.items[j];
if IsPBDiscount(discount) > 0
then RKCheck.DeleteCheckItem(discount)
else j := j + 1;
end;
end
else if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') and ( IsPBDiscount(it) > 0 )
then RKCheck.DeleteCheckItem(it);
end;
end;
end;
procedure RemovePBBonusOnly;
var
i, j : Integer;
it : TCheckItem;
dish : TDish;
discount : TCheckItem;
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if it.state <> disDeleted then
begin
if SYS.ObjectInheritsFrom(it,'TDish') then
begin
dish := TDish(it);
j := 0;
while j < dish.discounts.count do
begin
discount := dish.discounts.items[j];
if IsPBDiscount(discount) = 1
then RKCheck.DeleteCheckItem(discount)
else j := j + 1;
end;
end
else if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') and ( IsPBDiscount(it) = 1 )
then RKCheck.DeleteCheckItem(it);
end;
end;
end;
procedure CheckAndRemovePBDiscounts;
var
check : Integer;
begin
check := CheckPBDiscounts;
if ( check > 0 ) and ( check and 1 = 0 ) then RemovePBDiscounts;
end;
// лояльность премиум бонус - конец кода; дальше код в обработчиках
В этой же форме(редактирование заказа и редактирование заказа для быстрого чека) в самом низу добавить данный кусок:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var
Allow : Boolean;
HasDiscounts : Integer;
begin
CheckAndRemovePBDiscounts;
HasDiscounts := CheckPBDiscounts;
if ( HasDiscounts and 1 = 1 ) and ( HasDiscounts and 6 > 0 ) then
begin
Allow := False;
if (AEditType = etRemove) and IsPBMarker(AObjectBef) then Allow := True;
if (AEditType = etInsert) and ( IsPBDiscount(AObjectAft) > 0 ) then Allow := True;
if SYS.ObjectInheritsFrom(AObjectBef, 'TPayLine') or
SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine')
then Allow := True;
if not Allow then
begin
AMessage := 'Редактирование заказа после применения карты лояльности запрещено.';
AAllow := False;
Exit;
end;
end;
end;
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);
begin
CheckAndRemovePBDiscounts;
end;
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var
HasDiscounts : Integer;
begin
ShowOrderInfo('hide');
if Operation = 412 then
begin
HasDiscounts := CheckPBDiscounts;
if HasDiscounts and 1 = 1 then
begin
res := 1;
if HasDiscounts and 2 = 2 then
begin
if gui.RKMessageDlg( 'Удалить списание бонусов Премиум Бонус из заказа?', 3, 3, 0 ) = 6
then RemovePBBonusOnly;
end
else gui.ShowMessage( 'Редактирование заказа после применения карты лояльности запрещено.' );
end
else if HasDiscounts and 6 > 0 then RemovePBDiscounts;
end
else if ( Operation = 420 ) or ( Operation = 455 ) then CheckAndRemovePBDiscounts;
end;
procedure DesignFormOnProcessCard(IntfID, EntranceCardType: integer; CardCode: string; RKCardInfo: TRKCardInfo; var res: integer);
begin
CheckAndRemovePBDiscounts;
end;
Настройка и запуск FarCards с плагином Premium Bonus
Копируем PremiumBonusSetup.exe на компьютер где располагается Midserv и запускаем его.
Далее по пунктам:
- Выберите папку для установки. Само ПО будет установлено в подпапку с именем PremiumBonus внутри выбранной папки.
- Проверьте и при небходимости измените сетевое имя и номер TCP порта для FarCards.
- Нажмите кнопку "Выполнить".
Когда основные этапы установки будут завершены, появится сообщение
4. Установите пароль и войдите с паролем в настройки. Возможные варианты помимо классики: Gfhjkm1! и 12345
5. Лицензируем экземпляр:

6. Укажите необходимые настройки в конфигураторе.
Настройки для подключения к API передает менеджер PremiumBonus, ссылка стандартная https://api.premiumbonus.su/v2/
Настройки Rkeeper указываются в соответствии с кодами объектов, которые были заведены ранее.
Инструкция написана для настройки на базе 3 скидок, именно такой флаг надо выбрать в конфигураторе. Остальные параметры выставляем как на скриншоте.
Логирование по умолчанию используется только для фиксации ошибок.
При возникновении проблем можно воспользоваться расширенным логированием XML, JSON и трафика HTTP. Рекомендую всегда сразу включать все логи.
7. После настройки конфигуратора можно запустить приложение Farcards с ключом /desktop для проверки, что ПО корректно запустилось.
Проверка работы системы лояльности на кассе:
В кассовом интерфейсе при редактировании заказа нужно нажать “Код с клавиатуры”:

и ввести код карты 79001234567:

После подтверждения ввода, в зоне "Меню" отобразится набор возможных действий:

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

После подтверждения действия отобразится окно "Инфо о карте". Если гость в чеке один, то просто подтверждаем нажатием на картинку, если гостей несколько, то дополнительно щелкаем на одну из выделенных областей:

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









No Comments