Skip to main content

Инструкция по настройке

Установка и настройка состоит из двух этапов:

  • Настройка в менеджерской части;
  • Настройка и запуск FarCards с плагином Premium Bonus. [Скачать]

Конфигурация со стороны RK7:

1. Добавить на кассовом сервере PDS Interface с настройками как на скрине:

пдс.png

Название сервера (PDS Server Name) произвольное, главное, чтобы оно совпадало с названием в farcards.ini

Для работы с категориями по XML-интерфейсу требуется добавить на кассовый сервер этот самый интерфейс:

image-1733235120630.png

Порт интерфейса и адрес расположения этого сервера необходимо будет указать в настройках модуля, проставив предусмотренную галочку для активации функционала. Конечно же, не забываем про привязку интерфейса к объекту (по аналогии с п. 2). Важно заметить, что если какой-либо XML-интерфейс уже прикреплен к серверу, то можно не создавать новый, но привязку необходимо проверить.

2. В “Сервис” - ”Интерфейсы” создать новый интерфейс и привязать ранее созданный PDS Interface в разделе «Файлы библиотек», а в разделе «Интерфейс» в поле “Xml dish attributes” указать “2560.CategPath”, подробнее на скрине:

image-1715784856385.png

3. В “Сервис” – “Обработка сигналов устройств” – “MCR алгоритмы” добавить новый алгоритм.
В настройках алгоритма необходимо указать область применения «Интерфейс», а в объекте указать ранее созданный интерфейс и выставить галки на типы устройств как на скрине:

image-1715792527039.png
В свойство скрипт скопировать убрав дефолтное значение:

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].

image-1715792681334.pngВ созданном бенде добавить мемо на всю ширину макета, настроить выравнивание по центру и внутри мемо добавить переменную [PDSPrintText]

image-1715792736164.png

В макет Чека добавляем виртуальный бенд, в его свойствах в разделе "Данные" выбираем источник данных "Инфо о карте". 

image-1715792906521.png

В созданном бенде добавляем мемо на всю ширину макета, настраиваем выравнивание по центру и внутри мемо добавляем переменную [AdditionalInfo]

image-1715792955057.png

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 и запускаем его.

image-1760368434129.png

Далее по пунктам:

  1. Выберите папку для установки. Само ПО будет установлено в подпапку с именем PremiumBonus внутри выбранной папки.
  2. Проверьте и при небходимости измените сетевое имя и номер TCP порта для FarCards.
  3. Нажмите кнопку "Выполнить".

Когда основные этапы установки будут завершены, появится сообщение

image-1760368640219.png
Нажмите кнопку "Ok".

4. Установите пароль и войдите с паролем в настройки. Возможные варианты помимо классики: Gfhjkm1! и 12345

5. Лицензируем экземпляр:

image-1715790187618.png

6. Укажите необходимые настройки в конфигураторе.
Настройки для подключения к API передает менеджер PremiumBonus, ссылка стандартная https://api.premiumbonus.su/v2/
Настройки Rkeeper указываются в соответствии с кодами объектов, которые были заведены ранее.
Инструкция написана для настройки на базе 3 скидок, именно такой флаг надо выбрать в конфигураторе.                  Остальные параметры выставляем как на скриншоте.

image-1737627062931.png


Логирование по умолчанию используется только для фиксации ошибок. 
При возникновении проблем можно воспользоваться расширенным логированием XML, JSON и трафика HTTP. Рекомендую всегда сразу включать все логи.
7. После настройки конфигуратора можно запустить приложение Farcards с ключом /desktop для проверки, что ПО корректно запустилось. 

Проверка работы системы лояльности на кассе:

В кассовом интерфейсе при редактировании заказа нужно нажать “Код с клавиатуры”:

image-1715790870369.png
и ввести код карты 79001234567:

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

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

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

image-1715791311184.png
После нажатия на картинку в заказе бонусы и скидка будут распределены в соответствии с тем как были переданы из процессинга:

image-1715791352452.png

На этом настройка и запуск завершены.