Skip to main content

Инструкция по настройке (v 2.7.2 Beta)

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

  • Настройка в менеджерской части
  • Настройка и запуск Farcards

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

Добавление интерфейсов кассового сервера

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

image-1776081068067.png


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

Отдельно стоит обратить внимание на настройку "Pass ALL Receipts XML data", если необходимо передавать все чеки(даже без скидочной карты) в процессинг системы лояльности, то нужно выставить "Yes, if possible". Однако надо учитывать, что если на объекте проблемы с интернетом, то при закрытии чеков это может вызывать ошибку. Как временное решение в таком случае, можно изменить значение на "by script". 

Добавить на кассовом сервере драйвер XML interface for Windows

image-1776081805776.png

В поле порт указать номер любого свободного порта

Создание логических интерфейсов

В “Сервис” - ”Интерфейсы” создать новый интерфейс и привязать ранее созданный PDS Interface в разделе «Файлы библиотек»:

image-1776082073952.png

В “Сервис” - ”Интерфейсы” создать новый интерфейс и привязать ранее созданный XML interface for windows в разделе «Файлы библиотек»:

image-1776082151329.png

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

Создание MCR-алгоритма

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

image-1776082501906.png

В свойство скрипт скопировать, убрав дефолтное значение:

begin    
    Result := (
      ( Copy( Parameter, 1, 4 ) = '0000' ) or // префикс MindBoxID из приложения
      (( Length( Parameter ) >= 12 ) and ( Length( Parameter ) <= 13 )) or // Номера карт
      (( Length( Parameter ) >= 6 ) and ( Length( Parameter ) <= 8 )) or // Динамические коды
      (( Length( Parameter ) = 11 ) and
       (( Copy( Parameter, 1, 1 ) = '7' ) or (Copy( Parameter, 1, 1 ) = '8' ))) or // номера телефонов с префиксом
      ( Length( Parameter ) = 10 ) or // номера телефонов без префикса
      ( Parameter = '12345' ) // специальный код
      ) and not GUI.CheckFormInPayMode;
end;

Значения констант в MCR алгоритме должны соответствовать настройкам плагина, их необходимо скорректировать, если вы меняете соответствующие настройки.
Префикс для ввода MindboxId гостя проверяется в строке 3, значение префикса должно совпадать с соответствующей настройкой в плагине.
Диапазон номеров карт проверяется в строке 4, параметры диапазона должны совпадать с соответствующей настройкой в плагине.
Динамический код из мобильного приложения проверяется в строке 5, значение длины кода в символах должно совпадать с соответствующей настройкой в плагине. Если клиент не использует коды из мобильного приложения, строку 5 следует удалить целиком.
Специальный код карты для удаления расчета из заказа и применения промокода в анонимных заказах проверяется в строке 8, значение должно совпадать с соответствующей настройкой в плагине. Если числовой код из строки 8 неудобен персоналу или пересекается с другими MCR алгоритмами, можно заменить его коротким символьным кодом, например "МБ" с помощью следующего кода:

begin    
    Result := (
      ( Copy( Parameter, 1, 4 ) = '0000' ) or // префикс MindBoxID из приложения
      (( Length( Parameter ) >= 12 ) and ( Length( Parameter ) <= 13 )) or // Номера карт
      (( Length( Parameter ) >= 6 ) and ( Length( Parameter ) <= 8 )) or // Динамические коды
      (( Length( Parameter ) = 11 ) and
       (( Copy( Parameter, 1, 1 ) = '7' ) or (Copy( Parameter, 1, 1 ) = '8' ))) or // номера телефонов с префиксом
      ( Length( Parameter ) = 10 ) // номера телефонов без префикса
      ) and not GUI.CheckFormInPayMode;
    if ( Parameter = 'МБ' ) and not GUI.CheckFormInPayMode then
    begin
        Parameter := '12345'; // специальный код
        Result := True;
    end;      
end;

В таком случае в значении Parameter в строке 9 указывается символьный код, а в строке 11 - числовой, совпадающий с соответствующей настройкой в плагине

Добавление скидок

4. В меню “Деньги” – “Скидки” создать 3 скидки. Для удобства и порядка можно создать отдельную папку под эти скидки. Для одновременной работы всех скидок необходимо в настройках каждой скидки изначально задать флаг “Комбинировать с любой скидкой”.

Первая скидка процентная для авторизации карты в заказе:
Название для скидки “Карта MB”
Галочки на “Не вручную” и "На заказ"
Детализация на 0 процентов

Вторая скидка суммовая для Бонусов. 
Название “Бонусы MB”
Галочки на “Не вручную” и "На блюдо"
В настройках надо указать тип «Сумма», в детализации установить значение 100 000.

Третья скидка суммовая для работы доп. акций. 
Название “Скидка MB”
Галочки на “Не вручную” и "На блюдо"
В настройках надо указать тип «Сумма», в детализации установить значение 100 000.

Редактирование скриптов экранных форм

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

Перед редактированием формы, нужно проанализировать актуальную схему и её формы на наличие возможных конфликтующих скриптов.

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

// Лояльность mindbox
function MBMarkerCode : Integer;
begin
  Result := 9; // Скидка для авторизации карты лояльности в заказе
end;

function MBBonusCode : Integer;
begin
  Result := 10; // Суммовая скидка для бонусов
end;

function MBActionCode : Integer;
begin
  Result := 11; // Суммовая скидка для акций
end;

function IsMBMarker(O : TObject) : Boolean;
begin
  Result := False;
  if SYS.ObjectInheritsFrom(O, 'TDiscountItem') then
  begin
    Result := TDiscountItem(O).code = MBMarkerCode;
  end;
end;

function IsMBDiscount(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 = MBBonusCode then Result := 1
    else if Code = MBActionCode then Result := 2;
  end;
end;

function CheckMBDiscounts : 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 ( IsMBDiscount( dish.discounts.items[j] )*2 );
          if Result and 6 = 6 then Break;
        end;
      end
      else if IsMBMarker( it ) then Result := Result or 1
      else if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem')
      then Result := Result or ( IsMBDiscount( it )*2 );
    end;
    if Result and 7 = 7 then Exit;
  end;
end;

procedure RemoveMBDiscounts;
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 IsMBDiscount(discount) > 0
          then RKCheck.DeleteCheckItem(discount)
          else j := j + 1;
        end;      
      end
      else if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') and ( IsMBDiscount(it) > 0 )
      then RKCheck.DeleteCheckItem(it);
    end;
  end;
end;

procedure CheckAndRemoveMBDiscounts;
var
  check : Integer;
begin
  check := CheckMBDiscounts; 
  if ( check > 0 ) and ( check and 1 = 0 ) then RemoveMBDiscounts;
end;

// лояльность mindbox - конец кода; дальше код в обработчиках
  

В этой же форме(редактирование заказа и редактирование заказа для быстрого чека) в самом низу добавить данный кусок:

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var
  Allow : Boolean;
  HasDiscounts : Integer;
  MarkingModi : TModiItem; // для проверки маркировки
begin
  CheckAndRemoveMBDiscounts;  
  HasDiscounts := CheckMBDiscounts;
  if ( HasDiscounts and 1 = 1 ) and ( HasDiscounts and 6 > 0 ) then
  begin
    Allow := False;
    if (AEditType = etRemove) and IsMBMarker(AObjectBef) then Allow := True;
    if (AEditType = etInsert) and ( IsMBDiscount(AObjectAft) > 0 ) then Allow := True;
    if SYS.ObjectInheritsFrom(AObjectBef, 'TPayLine') or
       SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') 
    then Allow := True;
    // исключение для ввода маркировки
    if SYS.ObjectInheritsFrom(AObjectAft,'TModiItem') then
    begin
      MarkingModi := TModiItem(AObjectAft);
      if (MarkingModi.Sifr = 2012) or (MarkingModi.Sifr=2112) then Allow := True;
    end;    
    if not Allow then
    begin
      AMessage := 'Редактирование заказа после применения карты лояльности запрещено.';
      AAllow := False;
      Exit;
    end;
  end;  
end;

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);
begin
  CheckAndRemoveMBDiscounts;
end;

procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var
  HasDiscounts : Integer;
begin
  ShowOrderInfo('hide');
  if Operation = 412 then
  begin
    HasDiscounts := CheckMBDiscounts;
    if HasDiscounts and 1 = 1 then
    begin
      res := 1;
      gui.ShowMessage( 'Редактирование заказа после применения карты лояльности запрещено.' );
    end
    else if HasDiscounts and 6 > 0 then RemoveMBDiscounts;
  end
  else if ( Operation = 420 ) or ( Operation = 455 ) then CheckAndRemoveMBDiscounts;
end;

procedure DesignFormOnProcessCard(IntfID, EntranceCardType: integer; CardCode: string; RKCardInfo: TRKCardInfo; var res: integer);
begin
  CheckAndRemoveMBDiscounts;
end;

Настройка и запуск Farcards

Установка Farcards

Запустите инсталлятор MindBoxSetup на компьютере где располагается Midserv, укажите:

  • Путь для новой установки ПО
  • Сетевое имя Farcards такое же, как указали ранее в параметре PDS Server Name при добавлении драйверов кассового сервера
  • Номер TCP порта - любой свободный TCP порт

image-1776086601606.png

Нажмите Выполнить и дождитесь завершения установки. Конфигуратор настроек MindBoxSettings запустится автоматически. 

Лицензирование 

Запустите настроек MindBoxSettings (если он не был запущен автоматически после установки). При первом запуске необходимо задать пароль для доступа к настройкам, затем войти, используя заданный пароль. Возможные варианты уже установленных паролей: Gfhjkm1!, 12345 и 123456
Пролицензируйте экземпляр ПО. Для этого сообщите Код запроса и дополнительную информацию о клиенте ответственному за настройку интеграции сотруднику. Перечень дополнительной информации, необходимой для генерации лицензии:

  • Наименование ЮЛ
  • ИНН КПП
  • Фактическое название заведения
  • Фактический адрес заведения
  • Код ресторана РК
  • Идентификатор ПК, на который устанавливается интеграция (любая информация, которая поможет идентифицировать машину - ip (если он статический), сетевое имя, роль (сервер, главная касса и т.д.)
  • Контактное лицо: ФИО, телефон, почта
  • Код запроса

image-1728400043925.png

Введите полученный лицензионный ключ в поле Код ответа и нажмите Сохранить.

Настройки плагина в MindBoxSettings

Укажите необходимые настройки в конфигураторе. Ниже приведено общее изображения окна настроек, описание параметров находится в следующих разделов:

image-1776087916707.png


Подключение к API и его настройки

Значение параметров URL API, Ключ API, Endpoint ID, ID ресторана, Имя Id блюд передает менеджер Mindbox, стандартная ссылка: https://api.mindbox.ru/v3/operations/sync
image-1776089483612.png

Настройки r_keeper

image-1776089752886.png

Код скидки для авторизации карты, Код скидки для бонусов, Код скидки для акций - коды r_keeper соответствующих скидок, созданных ранее.

Код интерфейса - код r_keeper логического PDS интерфейса, созданного ранее.

Использовать скидки на блюдо - предпочитаемое значение по умолчанию "Включено", в случае отключения скидка будет автоматически распределяться самим r-keeper между блюд и появятся копейки при расчетах. Если принимается решение отключить использование скидок на блюда, необходимо изменить настройку у суммовых скидок в r_keeper, созданных ранее: снять флаг "На блюдо" и выставить флаг "На заказ"

Адрес кассового сервера - IP-адрес, по которому доступен кассовый сервер.

Номер порта - порт XML интерфейса, добавленного ранее.

Код кассы, для которой запрашиваются цены - код r_keeper кассовой станции, тип цен которой будет использоваться при загрузке цен в MindBox.

Настройка режимов работы плагина

image-1776090561236.png

Выбрать сумму бонусов к списанию - включить/отключить возможность выбрать количество баллов, отличное от максимально возможного в меньшую сторону. Если отключена - можно списывать только максимально доступное для этого пользователя и заказа количество бонусов.

Использовать промокоды - включить/отключить возможность использования промокодов.

Загрузка меню с кассового сервера в процессинг - включить/отключить функцию загрузки меню с кассового сервера в процессинг, при включении активирует дополнительный блок настроек Настройки для загрузки меню в процессинг.

Автоматически удалять старые расчеты через - указывается кол-во часов через которые будут удалены рассчитанные скидки в заказах которые не были закрыты. Используется для разблокирования зарезервированных скидок в случае, если карту добавили, но потом удалили из заказа или в целом весь заказ был аннулирован.

Настройки для загрузки меню в процессинг

image-1776091487691.png

Изменить название операции на - используется, если необходимо использовать название операции, отличное от ImportProducts.

ID Бренда - значение поля BrandSystemName в MindBox.

Загрузка цен блюд меню с кассового сервера в процессинг - включить/отключить функции загрузки цен из меню r_keeper в MinBox. Для определения загружаемого типа цен используется код станции r_keeper, указанный ранее. Если включено, активирует поле ID региональных данных для загрузки цен.

ID региональных данных для загрузки цен - значение поля AreaExternalID в MindBox.

Сохранять локальную копию загружаемых данных в файл - включить/отключить сохранение локальной копии загружаемых в MindBox данных в файл. Может быть использована при отладке.

Диапазоны и префиксы

image-1776093914456.png

Префикс для ввода mindboxId гостя - используется при вводе короткого id по схеме префикс+id.

Диапазон номеров карт от... до... - согласовывается с Mindbox. Длина не может быть менее 12 символов, чтобы не пересекаться с номерами телефонов. Указываются минимальное и максимальное значение номера карты в диапазоне.

Динамические коды от... до... - диапазон возможных значений динамических кодов в мобильном приложении, согласовывается с MindBox. Указываются минимальное и максимальное значение динамического кода в диапазоне.

Специальный код карты для удаления расчета из заказа и применения промокодов в анонимных заказах - используется в случае если нужно аннулировать расчет по примененной карте в заказе не дожидаясь автоматического удаления расчета, или для применения промокода в анонимном заказе.

Префикс для передачи mindboxId заказа от FastOperator, Префикс для передачи minboxId заказа с сайта -  значение выставляется автоматически при первом сохранении, не менять.

Ведение лога

image-1776094769431.png

Записывать лог работы в файл - включить/отключить логирование

Насколько подробным должен быть лог - выставление уровня подробности логирования

Записывать весь http трафик в отдельный файл - включить/отключить дополнительное логирование http-трафика

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


Описание механики работы с промокодами

Применение промокода в анонимном заказе

Если у Гостя нет карты MindBox, но есть промокод, необходимо ввести специальный код из настроек плагина (или его символьный эквивалент из скрипта MCR-алгоритма), например через Код с клавиатуры:

image-1776162479930.png

Затем нажать кнопку Ввести промокод:

image-1776162517370.png

В форме экранного ввода ввести промокод:

image-1776162560007.png

В окне авторизации нажать на поле [Картинка]:

image-1776162624269.png

Промокод применится к заказу.

Применение промокода в авторизованном заказе

Если у гостя есть карта MindBox и промокод, необходимо в первую очередь авторизовать карту Minbox стандартным способом и, после авторизации выбрать кнопку Ввести промокод.
Если авторизация промокода не требуется, следует выбрать кнопку Продолжить без промокода

image-1776163619349.png

В форме экранного ввода ввести промокод:

image-1776163666811.png

После ввода промокода информация о нем отобразится в поле в правом верхнем углу, и появится следующий набор кнопок:

Не списывать бонусы. Использовать скидку - отказаться от списания бонусов, оставить в заказе только скидку, примененную по промокоду.
Списать Х бонусов - списать максимальное доступное для этого пользователя и заказа количество бонусов (как и в стандартном сценарии работы с картой MindBox).
Выбрать количество бонусов - указать для списания количество бонусов меньшее, чем максимальное доступное для этого пользователя и заказа (как и в стандартном сценарии работы с картой MindBox).

image-1776163698331.png

После выбранного сценария работы с бонусами откроется окно авторизации карты, необходимо нажать на поле [Картинка]:

image-1776163738669.png

После к заказу применится и скидка по промокоду, и учтутся бонусы (если был выбран соответствующий сценарий)

image-1776163770746.png