Скрипт для считывания штрихкодов для сигарет

У блюда предварительно необходимо разрешить открытую цену.

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
str, Alphabet : string;
k, l, catCode, power: integer;
it: TCheckItem;
CheckView: TCheckView;
Categ: TClassificatorGroup;
price: double;
begin
Alphabet := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&’*+-./_,:;=<>?';
catCode := 16391; // tobacco category code
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', catCode));
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TModiItem') then
begin
it := RKCheck.CurrentOrder.Sessions.Lines[RKCheck.CurrentOrder.Sessions.LinesCount - 2];
if (SYS.ObjectInheritsFrom(TObject(it), 'TDish')) then
if Categ.IsChild(TDish(it).RefItem) and (trk7menuItem(TDish(it).RefItem).OpenPrice=true) then
begin
str := TModiItem(AObjectAft).openname;
Gui.showmessage(str);
if(length(str) = 29) then
begin
price := 0;
str:= copy(str, 22,4);
k:=0;
while(k < 4) do
begin
power := 1;
for l := (3 - k) downto l = 0 do
begin
power := power * 80;
end;
price := price + power * (pos(str[k+1], alphabet)-1);
k:=k+1;
end;
price := price / 100;
if price>= TDish(it).minPrice then
begin
TDish(it).IsUserPrice := true;
TDish(it).UserPrice := price;
rk7.performoperation(rkoEND, 0);
RKCheck.CurrentOrder.Recalc();
end;
end;
end;
end;
end;
CODE

Скрипт для MCR-алгоритма для получения номера карты после преобразования QR кода с помощью камеры.

Необходимо  регистрировать QR-код в заказе с помощью Ipod и с кассы-планшета.

Формат QR кода:

QRC=<card info>:<var info>

Пример:

QRC=123456789:121212

card info - 123456789

var info - 121212

Card code = card info - ( год ( полный ) + месяц (1 - 12) + день ).

Т.е. если имеем карту с № 5555, то Card info на 13.05.15 будет равно Card

Code(5555)+Год(2015)+Месяц(5)+День(13)

5555+2015+5+13=7588

На выходе необходимо получить Card code.

function MCR1002183(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

begin

  // for input parameter: QRC=123456789:121212

  Result := False;

  if pos('QRC=',parameter) > 0 then

  begin

    parameter := copy(parameter,5,pos(':',parameter)-5);

    Parameter := IntToStr(StrToInt(Parameter)-(StrToInt(FormatDateTime('yyyy',now))+StrToInt(FormatDateTime('mm',now))+StrToInt(FormatDateTime('dd',now))));

    Result := True;

  end;

end;

Скрипт выбора стола

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

function MCR1001882(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

begin

  Result := False;

  { 999идентификатор_стола }

  if pos('999', Parameter) = 1 then begin

    delete(Parameter, 1,3);

    if length(Parameter) > 0 then begin

        gui.showmessage(Parameter);

        RK7.PerformRefObject(RK7.FindItemByCode(rkrefTables, StrToInt(Parameter)))

        Result := true;

    end;

  end;

end;

Скрипт по преобразованию Hex в bin

function MCR1001196(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

var RestCode: integer;

    i, j: Integer;  

    hex, t1, res1: string;

begin

  Result := false;

    Parameter := Trim(Parameter);

    if length(Parameter) > 0 then begin

      Res1 := '';

      for i:=1 to length(Parameter) do

      begin

        hex := Copy(Parameter, i, 1);

        t1 := '';

        case hex of

          '0': t1 := '0000';

          '1': t1 := '0001';

          '2': t1 := '0010';

          '3': t1 := '0011';

          '4': t1 := '0100';

          '5': t1 := '0101';

          '6': t1 := '0110';

          '7': t1 := '0111';

          '8': t1 := '1000';

          '9': t1 := '1001';

          'A': t1 := '1010';

          'B': t1 := '1011';

          'C': t1 := '1100';

          'D': t1 := '1101';

          'E': t1 := '1110';

          'F': t1 := '1111';

        end;

        Res1 := Res1 + t1;

      end;

      Result := true;

      Parameter:= Res1;      

    end;

end;

Скрипт по преобразованию HEX в DEC

function MCR1001665(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

var RestCode: integer;

    i, j, t1, S: Integer;

    res1, t2: int64;  

    hex,resulttext: string;

begin

  Result := false;

  { 778=HEX?????? }

    Parameter := Trim(Parameter);

    if Pos('ISD=',Parameter) > 0 then begin

      if length(Parameter) >= 8 then

        Parameter := Copy(Parameter, 5, 8);

      Parameter:= Int64ToStr(StrToInt64('0x'+Parameter)and StrToInt64('0x7FFFFFFF'));  

      Result := true;

    end;   

end;

Скрипт по преобразованию Dec в Oct

Используемое ПО:

1. RK7_7.5.3.279

2. СкиБарс2

В чем сложность:

- для карт Скибарса на уже работающих станциях R_Keeper_7 использовались считыватели PRX KE (PS/2)

- приехали новые станции, на них установлены другие считыватели СРЧ125 (RS232)

- проблема в том, что одна и та же карта на этих считывателях считывается по разному

Проверяем на станции с помощью «Отладка MCR алгоритмов»

PRX KE (PS/2): 0,41153061004700

СРЧ125 (RS232): 0,3684940

Скрипт конвертирует записи типа 0,3684940 в 0,41153061000000

function MCR1001908(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

var

  i,len, ost1,ost2:integer;

  s,res: string;

begin

  Result := False;

  if pos(',',Parameter)=2 then

  begin

    s:=copy(Parameter,3,9);

    res:='';

    ost1 := StrToInt(s);

    While ost1<>0 do

    begin

      ost2 := ost1 mod 8;

      ost1 := ost1 div 8;

      res := IntToStr(ost2) + res;

    end;    

    s:='';

    len := length(res);

    for i:=1 to len do

    begin

      s:=res[i]+s;

    end;

    for i:=1 to 14-len do

    begin

      s := s + '0';

    end;

    Parameter := '0,'+s;

    Result := True;

  end;

end;

Скрипт для добавления блюда с ценой 0 р. при прокате карты MasterCard

function MCR1001296(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

begin

 Result := False;

 if (pos('=',Parameter)>=12) and (copy(Parameter,1,2)>='51') and (copy(Parameter,1,2)<='55') then

   if RKCheck.CurrentOrder.ToPaySum >= 300 then // проверка суммы заказа

   begin // Parameter := '22'; Result := True;

     if GUI.RKMessageDlg('Вам доступна акция Мастер Кард. Добавить блюдо?', 3, 3, 0) = 6 then

     begin

       RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(43), '1');       // добавление в заказ блюда с кодом 43  

       Parameter := '8081';

       Result := True;

     end

     else

     Result := False;

   end;

end;

Скрипт для использование кода корпорации+кода ресторана+кода карты при заведении карты сотрудника

function MCR1002181(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

var s:string;

begin

  if length(Parameter)=4 then  // проверка кол-ва символов в параметре

    if TRK7Restaurant(RK7.CashGroup.MainParent).Code = 79 then // проверка кода ресторана

    begin

      s := IntToStr(TRK7Restaurant(RK7.CashGroup.MainParent).Code);

      s := copy('000'+s,length('000'+s)-4,4);  // вывод кода ресторана 4-мя символами

      Parameter := '99999'+s+Parameter;

      Result := true;

    end;

end;

Скрипт для контроля добавления второй карты CRM

Добавление скидки в счет, начисление и списание бонусов должно работать только с первой добавленной карты.

function MCR1006889(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

var RestCode,i,DiscCode,DiscCnt: integer;

it: TCheckItem;

begin

//************************** Set parameters **********************************//

  DiscCode := 11;

//************************** Set parameters **********************************//

  Result := false;

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  DiscCnt := 0;

  for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

  begin

    it := RKCheck.CurrentOrder.Sessions.Lines[i];

    if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check dish lines only

      if (TDiscountItem(it).Code = DiscCode) then

        if TDiscountItem(it).CalcAmount <> 0 then     

          DiscCnt := DiscCnt + 1;

  end;


  if DiscCnt > 0 then

  begin

    gui.showmessage('В заказе уже есть карта.');

    Result := False;

  end

  else


  { 778=КодРесторана=КодКарты }

  if pos('778=', Parameter) = 1 then begin

    delete(Parameter, 1, 4);

    if pos('=', Parameter) > 1 then begin

      RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1);

      delete(Parameter, 1, pos('=', Parameter));

      if RestCode mod 10000 = 0 then

        {без кода ресторана - на всю компанию}

        Result := RestCode div 10000 = IntParam('EnterpriseCode')

      else

        Result := RestCode = IntParam('RestaurantCode');

    end;

  end;

end;