1. Создать функциональную клавишу, привязать к операции, операцию привязать к скрипту.

  1. Создаем новый скрипт в группе Операции (справочник Сервис -> Скрипты).
Примечание: данный скрипт в качестве примера реализует возможность использовать начисленные баллы на карту "Сбербанка", только если сумма заказа больше 198 руб. 
Даже если количество бонусов на карте «Сбербанк» превышает сумму заказа, его нельзя оплатить полностью бонусами. Хотя бы один рубль необходимо оплатить фискальной валютой (наличные/картой). 
var ed: TObject;
    a: double;
begin
  if RKCheck.Valid = false then begin
    GUI.CmdExec('sb_merci.exe');
    Exit;
  end;
  if RKCheck.CurrentOrder.ToPaySum < 198 then begin
    GUI.ShowMessage('Сумма заказа должна быть больше 198 рублей');
    Exit;
  end;
  ed := GUI.FindComponentByName('Editor');
  if SYS.ObjectInheritsFrom(ed, 'TGEditor') then begin
    a := StrToFloatDef(TGEditor(ed).Text, 0);
    if (a > 0) and (a < 198) then begin
      GUI.ShowMessage('Сумма платежа должна быть больше 198 рублей');
      Exit;
    end;      
  end; 
  GUI.CmdExec('sb_merci.exe');
end;
  1. Берем любую свободную операцию (справочник Операции - группа Пользовательские операции) и привязываем к скрипту из пункта 1A.

Рис.1 - Свойства пользовательской операции для авторизации карты

  1. Добавляем новую функциональную клавишу (в справочнике "Настройки - Графический интерфейс - Функциональные клавиши" в группе "Операции с заказом -> Селектор операций"), привязываем к операции из пункта 1В.

Примечание: если используется собственная модель селектора "Режим оплаты", то добавить ему эту кнопку и настроить использование селектора.

2. Создать копию используемой формы в справочнике "Настройка - Графический интерфейс - Формы - Разные - Прокатайте карту". Добавьте новую кнопку (объект типа TGOperationButton) и заполните у нее параметр Операция (=операция из пункта 1В).

Рис.2 - Форма "Прокатайте карту" для использования вместе с программой Спасибо от сбербанка

Важно: обязательно нужно настроить использование новой схемы форм.

После правильной настройки данная форма будет открываться при нажатии в главном меню на кнопку "Инфо о карте" (см.рис.3).

Рис.3 - Отработка новой формы

3. На кассу добавить драйвер Sberbank Pilot POS terminal driver (XML). Это новый драйвер, добавлять нужно именно его. Не путайте со старой версией SBRF Pilot Pos!. Настройка драйвера подробно описана в статье http://support.ucs.ru/ru/node/7209.

Обратите внимание, что драйвер должен быть только один.  Если у вас несколько драйверов, удалите лишние.

Обязательно в параметре RemindLoyalty выставить SPASIBO ONLY.

Важно: Установка параметра Remind Loyalty необходима в том случае, если используется автоматическое списание баллов. В любом другом случае должно стоять NO.

4. На кассовый сервер добавить PDS intarface, задать ему имя (параметр PDS Server Name), например SBRFSPASIBO_24

Важно у PDS intarface правильно заполнить следующие параметры: 

Pass All Recepts XMLs Data = On special pays, if possible

Look Up Card By Mail Addr  = Yes

5. Создать новый логический интерфейс (Сервис - Интерфейсы) как копию предустановленного "Персональная дисконтная система(ПДС)" и связать его с интерфейсом из п.4.

6. В справочнике "Скрипты" в группе "Анализ чека (системы лояльности)" добавить новый скрипт. В тело скрипта вставить следующее:
var p:integer;
xml,PaymentTag,ExtInfo,CardInfo:string;
begin
xml:=AXMLReceiptParameters.ReceiptXML;
while xml<>'' do begin
p:=pos('<PAYMENT ',xml);
if p=0 then exit; 
xml:=copy(xml,p,length(xml));
p:=pos('/>',xml);
PaymentTag:=copy(xml,1,p+1);
xml:=copy(xml,p+2,length(xml));
p:=pos('exttransactioninfo="BANK:SBRF',PaymentTag);
if p>0 then begin 
ExtInfo:=copy(PaymentTag,p+length('exttransactioninfo="'),length(PaymentTag));
p:=pos('"',ExtInfo);
ExtInfo:=copy(ExtInfo,1,p-1);
p:=pos('/PdsCard=',ExtInfo);
if p=0 then begin
p:=pos('PdsCard=',ExtInfo);
if p=1 then
CardInfo:=copy(ExtInfo,1+length('PdsCard='),length(ExtInfo))
else
CardInfo:='';
end else
CardInfo:=copy(ExtInfo,p+length('/PdsCard='),length(ExtInfo));
if CardInfo<>'' then begin
p:=pos(CardInfo,'/');
if p>0 then
CardInfo:=copy(CardInfo,1,p-1);
AXMLReceiptParameters.CardCode:=CardInfo; 
AXMLReceiptParameters.DoTransfer := true;
AXMLReceiptParameters.SilentMode:=True;
end;
end;
end;
end;
7. В свойствах логического интерфейса (п.5) для параметра "Условия отправки XML интерфейса" выбрать скрипт из пункта 6.
 
8. Создать новый MCR алгоритм, связать с интерфейсом из п.5. Тип алгоритма - "Скрипт вер 7.0", типы устройств - "Магнитная карта". Скрипт представлен ниже.
var delimsat: integer;
begin
  Result := (pos('SBRF:', Parameter) = 1) and (length(Parameter) > 6);
  if Result then begin
    delete(Parameter, 1, 5);
    if Parameter[1] = 'H' then
      delete(Parameter, 1, 1);
    delimsat := pos(';', Parameter);
    if delimsat > -1 then
      Parameter[delimsat] := 'W';  
  end;
end;
9. Настроить Фаркардс на работу с внешней библиотекой ExtSpasibo.dll
 
Важно: Библиотека ExtSpasibo.dll использует базу EXTDLLDB1.FDB, для работы с которой должна быть установлена СУБД Firebird версии 2.5 (с версией 3 не совместима!).
 
9.1. Отредактировать Farcards_SBRF.ini
[FarServer]
Type = 1
;; имя внешней dll для связи
DLL = ExtSpasibo.dll 
Gate = 1
Log=10

[LinkDLL]
1 = pds_netk

[pds_netk]
;; имя DPS interface на кассовом сервере. Такое же как в п.4 
NetServerName=SBRFSPASIBO_24
ininame=netk.ini
DebugMessages=1
9.2. Отредактировать extspasibo.ini
[Config]
Database=.\EXTDLLDB1.FDB
//сколько секунд между запросами карточки информация не перезапрашивается, по умолчанию 60 секунд (остатки автоматически изменяются при транзакциях)
CardCacheTime=60
//0 - только Init/done
//1 - сокращённый
//2 - всё кроме XML
//3 - всё
LogLevel=1

//для разбора XML:
//код валюты "Спасибо"
SpasiboPayCode=116

//список кодов интерфейсов, который относятся к другим системам лояльности. Появление скидок или оплат от таких интерфейсов означает запрет списания/начисления бонусов
OtherLoyalty=1487, 1012711, 1017073, 2311

//Коды валют, оплата которыми будет интерпретироваться, как оплата наличными
CashPayCodes=1

//Visa,Maestro,American express,Jcb,BCR card
BankCardCodes=2,81,6,24,5, 4

//Имя терминала может содержать подстановки %0:d для кода ресторана и %1:d для кода станции, используется если не нашлось расшифровки в секции Terminals
TerminalNameFormat=%0:d_TER%1:d

BadDishCodes=1039, 100066

//[Terminals]

//Необязательная секция позволяет переназначить кассу на другой терминал (другого партнёра),
//по умолчанию терминал совпадает с кодом станции
//<код ресторана>:<код кассы>=[<Partnerid>:]<TerminalID>

//1:5=249321:burgerking

//2:1=249321:burgerking

//6:1=249321:burgerking

//60:1=391651:60_TER1

//60:2=391651:60_TER2

//60:3=391651:60_TER3

//60:4=391651:60_TER4

//60:5=391651:60_TER5

//60:6=391651:60_TER6

[Locations]
//Location в зависимости от кода ресторана

4=BK5
5=BK26
7=BK27
8=BK30
9=BK28
10=BK15
16=BK33
20=BK35
18=BK34
19=BK37
17=BK36
21=BK38
25=BK43
71=BK71
59=BK56
72=BK72
66=BK66
84=BK84
110=BK110
91=BK91
123=BK123
76=BK65
96=BK96
117=BK117

[PCX]

ConnectionString=https://xml-online.korona.net:4447/axis.Partners/services/PCP_PartnersTerm_1005


ConnectTimeout=5
SendRecvTimeout=15
CertSubjectName=SUBJ:bk24
BackgndFlushPeriod=300
FlushTimeout=240
ProxyHost=
ProxyUserID=
ProxyUserPass=

//Ресторан

//Location=BK58

PartnerID=391651

[Business]

//все деньги в копейках, максимальное число 2000000000
//Минимальная трата бонусов
MinSpendLimit=19800

//Минимальная оплата другой валютой
MinPayOtherLimit=100

//Надо ли начислять бонусы (через банк начисляются по любому, но без нас)
ToAddPoints=1

//Список кодов категорий, которые нельзя оплачивать "спасибо"
IgnoreCategCodes=1111

Описание основных параметров extspasibo.ini

Секция [Config]

Database=.\EXTDLLDB_239.FDB                         // берем чистую EXTDLLDB.FDB и переименовываем в EXTDLLDB_(№точки).FDB

Секция [Terminals]
 
В данной секци прописываем строку согласно правилу: <код ресторана>:<код кассы>=[<Partnerid>:]<TerminalID>, т.е. на примере 245:51=391651:245_TER5
<Partnerid> = 391651 для всех точек
<TerminalID> сетевое имя станции
 
Примечание: в систему СБСпасибо имя станции передается в следующем виде: %0:d_TER%1:d , где %0:d = Код ресторана, %1:d = Код станции
 
Таким образом для обычных станций код станции = имени станции (TER_5=5), а для драйва код станции не равен имени получается 241_TER5=51 и надо прописать в настройке.

Секция [locations]

245=BK245                             //  для точки БК245, где 245 - код ресторана в справочниках, BK245 - название сертификата

Секция [PCX]

ConnectionString=https://xmlonline.gift.korona.net:4443/axis.Partners/services/PCP_PartnersTerm_1005 [https://xmlonline.gift.korona.net:4443/axis.Partners/services/PCP_PartnersTerm_1005]

CertSubjectName=SUBJ:(название сертификата без расширения, чувствительно к регистру) (например CertSubjectName=SUBJ:BK239 )

10. Проверьте, чтобы выполнялось следующее правило: Call timeout(PDS intarface) <= 2 * SendRecvTimeout (extspasibo.ini)
 
11. Создать валюту для оплаты "Оплата Спасибо". Ее код должен быть равен параметру SpasiboPayCode в файле extspasibo.ini. Для параметра Интерфейс выбрать логический интерфейс, созданный в пункте 4. Параметр Автозаполнение рекоммендуется выставить в значение "Вся сумма + подтверждение". 
 
12. Запросить у СБ сертификат и спецификацию под кол-во станций. Установить сертификат.
 
13. Установить PCX (реком. 1.8.X)