Скрипт на создание скидки на предзаказLink to Скрипт на создание скидки на предзаказ

На форме редактирования заказа в событии OnTimer указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var CheckView: TCheckView;

begin

// Проверка на корректный чек

  CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

  if CheckView = Nil then Exit; 

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit; 

  if RKCheck.CurrentOrder.IsEmpty then exit;

  AddEveryOtherDiscount(10);  // указать код суммовой открытой скидки на заказ

end;


Над этим скриптом разместить функцию пересчёта заранее созданной суммовой открытой скидки на заказ:


procedure AddEveryOtherDiscount(DiscCode: integer);

var i, j: integer;

    it, CurItem: TCheckItem;

    a, BaseSum, discsum, DiscPerc: double;

    d: TDish;

    CheckView: TCheckView;

    ed: TObject;

    Time1: TDateTime;

begin

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

  DiscPerc := 10;  // %

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

  discsum := 0; 

  BaseSum := 0;

  CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

  if CheckView = Nil then Exit;

  CurItem   := RKCheck.CurrentCheckItem;

  try

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

    begin

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

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

        if (RKCheck.CurrentOrder.StartService >= (TDish(it).Session.StartService)) then

//        if ((it.State = disOpened) or (it.State = disPrinted)) then

          begin

            if (TDish(it).Quantity > 0) then

            begin

              BaseSum := BaseSum + TDish(it).PRListSum;

            end;

          end;

    end;


    begin

      a:= BaseSum*DiscPerc/100;

    // Delete discount, if a sum changed

      for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do

      begin

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

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

          if (it.Code = DiscCode) then

          begin

            if abs(TDiscountItem(it).SrcAmount) = a then a := 0

            else

            begin

              if not(TDiscountItem(it).State = disOpened) then

              begin

                RKCheck.DeleteCheckItem(it);                     // Delete discount, if a sum changed

              end

              else

              begin 

                if it <> Nil then CheckView.GotoItem(it);

                ed := TObject(gui.FindComponentByName('Editor'));

                TNumEditor(ed).Text := FloatToStr(a);

                RK7.PerformOperation(rkoEditOpenPrice, 0);      // change discount, if a sum changed

                a := 0;

              end;

            end

            break;

          end;

      end;

    // Create discount to a dish

      if a > 0 then

      begin

        RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));

      end;

    end;

  finally

    if CurItem <> Nil then CheckView.GotoItem(CurItem);

  end;

  RKCheck.CurrentOrder.Recalc();

end;

Скрипт для автоматического добавления модификаторовLink to Скрипт для автоматического добавления модификаторов

На форме редактирования чека разместить таймер и в его событии OnTimer указать:

procedure userTimer1OnTimer(Sender: TObject);

но над этой процедурой разместить

procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);

Должен получиться такой листинг:

procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);

var s,s1:string; i:Integer;

begin

s:=StrIn;

while length(s)<>0 do begin

i:=pos(marker,s);

if i=0 then begin

    s1:=s;

    delete(s,1,length(s1));

    StringsOut.Add(s1);

  end

  else begin

    s1:=copy(s,1,i-1);

    delete(s,1,i);

    StringsOut.Add(s1)

  end;

end;

end;



procedure userTimer1OnTimer(Sender: TObject);

var i, j, k, z, p, linenum: integer;

    it,it2,CurItem: TCheckItem;

    CheckView: TCheckView;

    SL,SLtmp: TStringList;

    str: string;

    ModifPresent: boolean;

begin

// Проверка на корректный чек

  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;


  CurItem   := RKCheck.CurrentCheckItem;

  SL        := TStringList.Create;

  SL.Clear;

  SL.Sorted := false;

// serch and remember modificators

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if TDish(it).Modifiers.Count > 0 then

        begin  

          str := inttostr(i)+'=';

          for j := 0 to TDish(it).Modifiers.Count - 1 do      //   checking by modifier

          begin

            str := str+IntToStr(TDish(it).Modifiers.Items[j].Code)+';';

          end;

          SL.Add(str);

        end;

    end; 


// adding modificators

  for i := 0 to SL.Count - 1 do

  begin

    SLtmp := TStringList.Create;

    SLtmp.Clear;

    SLtmp.Sorted := false;

    p := pos('=',SL.strings[i]);

    linenum := StrToInt(copy(SL.strings[i],1,p-1));

    SliceStrToStrings(copy(SL.strings[i],p+1,length(SL.strings[i])-p),';',SLtmp);

//dbg.dbgprint(' '+SL.strings[i]+'   '+IntToStr(linenum)+ ' ' +copy(SL.strings[i],p+1,length(SL.strings[i])-p));

// cycle for dish

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

      if linenum <= j then

      begin

        it2 := RKCheck.CurrentOrder.Sessions.Lines[j];

        if SYS.ObjectInheritsFrom(it2, 'TDish') then

        begin  

// cycle for remember modifiers 

          for k := 0 to SLtmp.Count - 1 do

          begin

            ModifPresent := False;

// cycle for dish modifiers

            for z := 0 to TDish(it2).Modifiers.Count - 1 do      //   checking by modifier

            begin

              if TDish(it2).Modifiers.Items[z].Code = StrToInt(SLtmp.strings[k]) then

                ModifPresent := True;

            end;


            if not(ModifPresent) then

            begin

//dbg.dbgprint('add modif '+SLtmp.strings[k]+' to dish '+TDish(it2).Name);

              CheckView.GotoItem(it2);

              RKCheck.CreateCheckItem(rkrefModifiers, SLtmp.strings[k], '1');    // add modificator

            end;

          end;


        end;    

      end;

    SLtmp.Free();

  end;


  SL.Free();

  if CurItem <> Nil then CheckView.GotoItem(CurItem);    

end;

Предыдущий скрипт, в который добавляется только последний модификатор, попадающий в диапазон кодов с 46 по 53, а не все модификаторы предыдущего блюда.

procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);

var s,s1:string; i:Integer;

begin

s:=StrIn;

while length(s)<>0 do begin

i:=pos(marker,s);

if i=0 then begin

    s1:=s;

    delete(s,1,length(s1));

    StringsOut.Add(s1);

  end

  else begin

    s1:=copy(s,1,i-1);

    delete(s,1,i);

    StringsOut.Add(s1)

  end;

end;

end;


procedure userTimer1OnTimer(Sender: TObject);

var i, j, k, z, p, linenum1,linenum2, ModifCodeLimit1,ModifCodeLimit2: integer;

    it,it2,CurItem: TCheckItem;

    CheckView: TCheckView;

    SL,SLtmp: TStringList;

    str: string;

    ModifPresent: boolean;

begin

  ModifCodeLimit1 := 1; //46;

  ModifCodeLimit2 := 53;

// Ïðîâåðêà íà êîððåêòíûé ÷åê

  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;


  CurItem   := RKCheck.CurrentCheckItem;

  SL        := TStringList.Create;

  SL.Clear;

  SL.Sorted := false;

// serch and remember modificators

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if TDish(it).Modifiers.Count > 0 then

        begin  

          str := inttostr(i)+'=';

          for j := TDish(it).Modifiers.Count - 1 downto 0 do      //   checking by modifier

          if (TDish(it).Modifiers.Items[j].Code >= ModifCodeLimit1)and(TDish(it).Modifiers.Items[j].Code <= ModifCodeLimit2) then // select range code

          begin

            str := str+IntToStr(TDish(it).Modifiers.Items[j].Code)+';';

            SL.Add(str);

            break;

          end;   

        end;

    end; 


// adding modificators

  for i := 0 to SL.Count - 1 do

  begin

    SLtmp := TStringList.Create;

    SLtmp.Clear;

    SLtmp.Sorted := false;

    p := pos('=',SL.strings[i]);

    linenum1 := StrToInt(copy(SL.strings[i],1,p-1));

    if i+1 > SL.Count - 1 then

      linenum2 := RKCheck.CurrentOrder.Sessions.LinesCount - 1

    else

      linenum2 := StrToInt(copy(SL.strings[i+1],1,p-1));

    SliceStrToStrings(copy(SL.strings[i],p+1,length(SL.strings[i])-p),';',SLtmp);

// cycle for dish

    for j := linenum1 to linenum2 do

//      if linenum1 <= j then

      begin

        it2 := RKCheck.CurrentOrder.Sessions.Lines[j];

        if SYS.ObjectInheritsFrom(it2, 'TDish') then

        begin  

// cycle for remember modifiers

          for k := 0 to SLtmp.Count - 1 do

          begin

            ModifPresent := False;

// cycle for dish modifiers

            for z := TDish(it2).Modifiers.Count - 1 downto 0 do      //   checking by modifier

            begin

              if (TDish(it2).Modifiers.Items[z].Code >= ModifCodeLimit1)and(TDish(it2).Modifiers.Items[z].Code <= ModifCodeLimit2) then

                ModifPresent := True;

            end;


            if not(ModifPresent) then

            begin

              CheckView.GotoItem(it2);

              RKCheck.CreateCheckItem(rkrefModifiers, SLtmp.strings[k], '1');    // add modificator

            end;

          end;


        end;   

      end;

    SLtmp.Free();

  end;


  SL.Free();

  if CurItem <> Nil then CheckView.GotoItem(CurItem);    

end;

Скрипт при добавлении одного модификатора указанного диапазона кодов удаляет у текущего блюда все остальные модификаторы из этого диапазона

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var j,ModifCodeLimit1,ModifCodeLimit2: integer;

begin

  ModifCodeLimit1 := 46;

  ModifCodeLimit2 := 53;


  if SYS.ObjectInheritsFrom(AObjectAft, 'TModiItem') then

    if (TModiItem(AObjectAft).code >= ModifCodeLimit1)and(TModiItem(AObjectAft).code <= ModifCodeLimit2) then

    begin

      for j := TDish(RKCheck.CurrentCheckItem).Modifiers.Count - 1 downto 0 do      //   checking by modifier

          if (TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j].Code >= ModifCodeLimit1)and(TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j].Code <= ModifCodeLimit2) then // select range code

            RKCheck.DeleteCheckItem(TModiItem(TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j]));

    end;

end;

Скрипт, добавляющий блюда при определенном типе заказаLink to Скрипт, добавляющий блюда при определенном типе заказа

На форме редактирования заказа добавить таймер и указать ему скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var i,CntDish1,OrderTypeCode,DishCode:integer;

    it: TCheckItem;

begin

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

  DishCode := 220;

  OrderTypeCode := 1; // код типа заказа

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

// Проверка на корректный чек

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;


  if (RKCheck.CurrentOrder.OrderTypeCode = OrderTypeCode) then // for different OrderTypeCode

  if RKCheck.CurrentOrder.UserTag1 = 0 then

  begin

    CntDish1 := 0;

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if (TDish(it).quantity > 0) then

          CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

    end;

    if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;

    if CntDish1=0 then

    begin

      RKCheck.CurrentOrder.UserTag1 := 1;

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), inttostr(1));  // add dish

    end;

  end;

end;

Скрипт, отслеживающий суммы чеков в денежных диапазонахLink to Скрипт, отслеживающий суммы чеков в денежных диапазонах

Необходимо при каждом превышении лимита выводить сообщение и не выводить его повторно пока не превышен следующий лимит.

Нижеприведенный скрипт отрабатывает корректно до момента печати чека. В этот момент начинают сыпаться несвоевременные сообщения.

procedure userTimerSumLimitOnTimer(Sender: TObject);

var ToPaySum, SumInterval : double;

    tt : TTimer;

begin

//14-09-16 Show message and open selector when order reaches every 200 rubles

//if (TRK7Restaurant(RK7.CashGroup.MainParent).Code = 6)

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then

    exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  begin

       if (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 294)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 293)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 172)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 9053)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 240)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 190)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 116)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 113)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 9017)

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 67)  

       and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 24)

  then

  begin   

    SumInterval := 200;

    ToPaySum := RKCheck.CurrentOrder.ToPaySum;    

    if RKCheck.CurrentOrder.UserTag1 = 0 then

      RKCheck.CurrentOrder.UserTag1 := trunc(SumInterval);

     if (ToPaySum >= RKCheck.CurrentOrder.UserTag1) and (RKCheck.CurrentOrder.UserTag1 >= SumInterval) then

     begin

       RKCheck.CurrentOrder.UserTag1 := trunc(ToPaySum / SumInterval)*SumInterval +SumInterval;

       gui.ShowMessage('              «Возьмите снек\десерт по Акции! (49 руб.)»              ');

       RK7.PostOperation(rkoTableSelector, 147);

     end;


    if (ToPaySum <= (RKCheck.CurrentOrder.UserTag1)) and (RKCheck.CurrentOrder.UserTag1 >= SumInterval) then  // ???? ????? ???? ?????????? ???? ??????

    begin

      RKCheck.CurrentOrder.UserTag1 := trunc(ToPaySum / SumInterval)*SumInterval +SumInterval;

    end;  

  end;

  end;

//14-09-16 Show message and open selector when order reaches every 200 rubles 

end;

Скрипт на добавление\удаление блюда при определенной сумме заказаLink to Скрипт на добавление\удаление блюда при определенной сумме заказа

На форме редактирования заказа разместить объект «TTimer?», назвав его «userTimerSumLimit». В свойствах этого объекта задать интервал срабатывания (по умолчанию задано 1000. что соответствует 1 секунде). В событии OnTimer указать скрипт:

procedure userTimerSumLimitOnTimer(Sender: TObject);

var ToPaySum, SumInterval : double;

    tt : TTimer;

    i, j: integer;

    it: TCheckItem;

    DiscCode, DishCode, CntDish1: integer; 

begin

  SumInterval := 700;   // limit сумма чека по достижении которой автоматически добавится блюдо

  DishCode := 43; // special dish code  код автоматически добавляемого блюда

  CntDish1 := 0;

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  begin

    ToPaySum := RKCheck.CurrentOrder.ToPaySum;    

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if (TDish(it).Code = DishCode) then

          CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

    end;  

    if ToPaySum < SumInterval then  // удаление блюда при уменьшении суммы ниже указанной

      if CntDish1 > 0 then

      begin

        for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if (TDish(it).Code = DishCode) then

              RKCheck.DeleteCheckItem(it);

        end;

      end;         


    if ToPaySum >= SumInterval then // check limit exceed  добавление блюда при превышении указанной суммы

      if CntDish1 = 0 then

        RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');

  end;

end;

В скрипте задать необходимые значения для SumInterval и DishCode.

Скрипт на добавление/удаление блюда, при определенной сумме сохраненного заказаLink to Скрипт на добавление/удаление блюда, при определенной сумме сохраненного заказа

procedure userTimerSumLimitOnTimer(Sender: TObject);

var ToPaySum, SumInterval : double;

    tt : TTimer;

    i, j: integer;

    it,CurItem: TCheckItem;

    DiscCode, DishCode, CntDish1: integer;

    CheckView:TCheckView;

begin


  SumInterval := 700;   // limit сумма чека по достижении которой автоматически добавится блюдо

  DishCode := 43; // special dish code  код автоматически добавляемого блюда

  CntDish1 := 0;

  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;

  CurItem   := RKCheck.CurrentCheckItem;

  begin

    ToPaySum := RKCheck.CurrentOrder.ToPaySum;    

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if (TDish(it).Code = DishCode) then

          CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

    end;  


    if ToPaySum < SumInterval then  // удаление блюда при уменьшении суммы ниже указанной

      if CntDish1 > 0 then

      begin

        for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if (TDish(it).Code = DishCode) then

            begin

              CheckView.GotoItem(TObject(it));

              if it.State = disOpened then begin

                RK7.PerformOperation(rkoDeleteLine, 1);                                          // удаление

                continue;

              end else

                RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));   // списание

            end;

        end;

      end;         


    if ToPaySum >= SumInterval then // check limit exceed  добавление блюда при превышении указанной суммы

      if CntDish1 = 0 then

        RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');


  end;

  if CurItem <> Nil then CheckView.GotoItem(CurItem);

end;

Скрипт для акции «Блюдо в подарок при сумме заказа 1300 руб. со скидкой»Link to Скрипт для акции «Блюдо в подарок при сумме заказа 1300 руб. со скидкой»

В период Пн-Пт с 10:00 до 18:00, при сумме заказа 1300 руб. (со скидкой), в заказ, вручную, добавляется одно конкретное блюдо. необходимо, чтобы это блюдо появлялосьв списке только в том случае, если сумма заказа больше или равна 1300 руб

На форме редактирования чека разместить таймер (TTimer) и в его событии указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var ToPaySum : double;

    i, DishCode1: integer;

    qnt, qntMax: double;

    LimitSum1: double;

    it: TCheckItem;

    CurrTime, Time1, Time2: TDateTime; 

    tt : TTimer;

begin

  qnt := 0;

  DishCode1 := 25;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  Time1 := EncodeTime(10,00,00,00);  // начало периода акции

  Time2 := EncodeTime(18,00,00,00);  // конец периода акции

  LimitSum1 := 1300;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  CurrTime := Time;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then

    exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then                                // проверка дня недели

    if (Time1<=CurrTime) and(CurrTime<=Time2) then

    begin

      ToPaySum := RKCheck.CurrentOrder.ToPaySum;    

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

      begin

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

        if SYS.ObjectInheritsFrom(it, 'TDish') then

        if TDish(it).code = DishCode1 then    

           qnt := qnt + TDish(it).Quantity;

      end;    


      if (ToPaySum <= LimitSum1)and(qnt>0) then

      begin

        RK7.PerformOperation(rkoHome, 0);

        while True do begin

          it := RKCheck.CurrentCheckItem;

          if TObject(it) = Nil then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

            if (TDish(it).Code = DishCode1) then begin

              if it.State = disOpened then begin

                RK7.PerformOperation(rkoDeleteLine, 1);                                          // удаление

                continue;

              end else

                RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));   // списание

            end;

          RK7.PerformOperation(rkoDown, 0);

        end;   

      end;

    end;

end;

Скрипт на событие OnBeforeCheckViewEdit объекта CheckView расположенного на форме редактирования чека

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var i, DishCode1: integer;

    qnt, qntMax: double;

    checksum, LimitSim1: double;

    it: TCheckItem;

    CurrTime, Time1, Time2: TDateTime; 

begin

  qnt := 0;

  DishCode1 := 25;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  Time1 := EncodeTime(10,00,00,00);  // начало периода акции

  Time2 := EncodeTime(18,00,00,00);  // конец периода акции

  LimitSim1 := 1300;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  CurrTime := Time;

  checksum := 0;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

    if TDish(AObjectAft).code = DishCode1 then

      if not(AEditType = etRemove) then

      begin

        AAllow := false;

        AMessage := 'Access denied';


        if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then                                // проверка дня недели

          if (Time1<=CurrTime)and(CurrTime<=Time2) then

          begin

         //   gui.showmessage(Timetostr(time1)+' '+Timetostr(currtime)+' '+Timetostr(time2));

            AAllow := true;

            AMessage := '';

            checksum := RKCheck.CurrentOrder.ToPaySum;

            qnt := TDish(AObjectAft).Quantity;

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

            begin

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

              if SYS.ObjectInheritsFrom(it, 'TDish') then

              if TDish(it).code = DishCode1 then    

                qnt := qnt + TDish(it).Quantity;

            end;    

            if (qnt > qntMax)or(LimitSim1>checksum)  then // check limit exceed

            begin    

              AAllow := false;

              AMessage := 'Quantity exceeded the permitted limit ';

            end;

          end;

      end;

end;

Скрипт для печати в пречеке процента изменяемой скидкиLink to Скрипт для печати в пречеке процента изменяемой скидки

Создали по желанию клиента "скидку равную возрасту", которая имеет изменяемое значение от 0 до 60%.

Скрипт отображает скидку в пречеке. 

На форме редактирования разместите таймер, а в его событии OnTimer указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var i,discCode:integer;

   it: TCheckItem;

begin

  discCode := 10;

// Проверка на корректный чек

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;


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

  begin

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

    if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

      if (it.code = discCode) and (TDiscountItem(it).State <> disDeleted) then

        RKCheck.UpdateVisitComment(FloatToStr(abs(TDiscountItem(it).CalcPercent/100))+'%', '');

  end;

end;

Скрипт, реализующий акцию «При покупке билета в кино и при заказе в баре от 600руб — 1 блюдо на выбор бесплатно»Link to Скрипт, реализующий акцию «При покупке билета в кино и при заказе в баре от 600руб — 1 блюдо на выбор бесплатно»

На форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт (контролирует ручное добавление бонусного блюда):

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var i, DishCode1, DishCode2: integer;

    qnt, qntMax: double;

    checksum, LimitSim1: double;

    it: TCheckItem;

begin

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  LimitSum1 := 600;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  qnt := 0;

  checksum := 0;

  if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

    if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then

      if not(AEditType = etRemove) then

      begin

        AAllow := false;

        AMessage := 'Access denied';


          begin

            AAllow := true;

            AMessage := '';

            checksum := RKCheck.CurrentOrder.ToPaySum;

            qntMax :=  trunc(checksum / LimitSim1);

            if qntMax >= 1 then qntMax := 1;

            if TDish(AObjectAft).Quantity<>0 then

              qnt := 1;

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

            begin

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

              if SYS.ObjectInheritsFrom(it, 'TDish') then

                if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

                  qnt := qnt + TDish(it).Quantity;

            end;

            if (qnt > qntMax) then // check limit exceed

            begin          

              AAllow := false;

              AMessage := 'Quantity exceeded the permitted limit ';

            end;

          end;

      end;

end;


Скрипт для таймера, размещаемого на форме редактирования чека (контролирует автоматическое добавление/удаление бонусного блюда):

procedure userTimer1OnTimer(Sender: TObject);

var ToPaySum : double;

    i, DishCode1, DishCode2: integer;

    qnt, qnt_temp, qnt_temp2, qntMax: double;

    LimitSum1: double;

    it: TCheckItem; 

    tt : TTimer;

    ed: TObject;

begin

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  LimitSum1 := 600;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  qnt := 0;

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  if (RKCheck.CurrentOrder.ToPaySum < LimitSum1)and(RKCheck.CurrentOrder.UserTag1 > 0) then

    RKCheck.CurrentOrder.UserTag1 := 0;   

  if (RKCheck.CurrentOrder.ToPaySum >= LimitSum1)and(RKCheck.CurrentOrder.UserTag1 = 0) then

    begin

      RKCheck.CurrentOrder.UserTag1 := 1;

      if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then

       if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then

         RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1))       // добавление блюда 1

       else

         RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1));      // добавление блюда 2

    end;

    begin

      ToPaySum := RKCheck.CurrentOrder.ToPaySum;   

      qntMax :=  trunc(ToPaySum / LimitSum1);

      if qntMax >= 1 then qntMax := 1;      

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

      begin

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

        if SYS.ObjectInheritsFrom(it, 'TDish') then

          if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

            qnt := qnt + TDish(it).Quantity;

      end;    

      if (qnt > qntMax) then

      begin

        RK7.PerformOperation(rkoHome, 0);

        while True do begin

          qnt_temp := 0;

          it := RKCheck.CurrentCheckItem;

          if TObject(it) = Nil then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

            if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then begin

              if (TDish(it).Quantity) > 0 then 

                if it.State = disOpened then begin

                  if (qnt-TDish(it).Quantity) >= qntmax then

                  begin

                    qnt := qnt - TDish(it).Quantity;

                    RK7.PerformOperation(rkoDeleteLine, 1);                                          // удаление

                    continue;

                  end

                  else

                  begin

                    qnt_temp := qntmax-(qnt-TDish(it).Quantity);

                    qnt_temp2 := TDish(it).Quantity;

                    ed := TObject(gui.FindComponentByName('Editor'));

                    if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then

                    begin

                      TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));

                      RK7.PerformOperation(rkoEditAmount, 0);

                      TNumEditor(ed).Text := '';

                      qnt := qnt -(qnt_temp2-qnt_temp);

                    end;

                  end

                end else

                begin

                  qnt := qnt - TDish(it).Quantity;

                  RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));   // ????????

                end;

            end;

            RK7.PerformOperation(rkoDown, 0);

            if (qnt <= qntMax) then break;

        end;   

      end;

    end;

end;

Скрипт на добавление блюда.

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var i, DishCode1, DishCode2: integer;

    qnt, qntMax: double;

    checksum, LimitSim1: double;

    it: TCheckItem;

begin

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  LimitSum1 := 600;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  qnt := 0;

  checksum := 0;

  if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

    if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then

      if not(AEditType = etRemove) then

      begin

        AAllow := false;

        AMessage := 'Access denied';


          begin

            AAllow := true;

            AMessage := '';

            checksum := RKCheck.CurrentOrder.ToPaySum;

            qntMax :=  trunc(checksum / LimitSim1);

            if qntMax >= 1 then qntMax := 1;

            if TDish(AObjectAft).Quantity<>0 then

              qnt := 1;

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

            begin

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

              if SYS.ObjectInheritsFrom(it, 'TDish') then

                if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

                  qnt := qnt + TDish(it).Quantity;

            end;

            if (RKCheck.CurrentOrder.UserTag1 > 0) then // check limit exceed

            begin          

              AAllow := false;

              AMessage := 'You can''t add dish manually';

            end;

            if (qnt > qntMax) then // check limit exceed

            begin          

              AAllow := false;

              AMessage := 'Quantity exceeded the permitted limit ';

            end;

          end;

      end;

end;

Скрипт для таймера:

procedure userTimer1OnTimer(Sender: TObject);

var ToPaySum : double;

    i, DishCode1, DishCode2: integer;

    qnt, qnt_temp, qnt_temp2, qntMax: double;

    LimitSum1: double;

    it: TCheckItem; 

    tt : TTimer;

    ed: TObject;

begin

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  LimitSum1 := 600;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  qnt := 0;

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  if (RKCheck.CurrentOrder.ToPaySum < LimitSum1)and(RKCheck.CurrentOrder.UserTag1 > 0) then

    RKCheck.CurrentOrder.UserTag1 := 0;   

  if (RKCheck.CurrentOrder.ToPaySum >= LimitSum1)and(RKCheck.CurrentOrder.UserTag1 = 0) then

    begin

      RK7.PerformOperation(rkoUser07, 0);

     {

      if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then

       if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then

         RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1))       // добавление блюда 1

       else

         RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1));      // добавление блюда 2

     }

      RKCheck.CurrentOrder.UserTag1 := 1;

    end;

      begin

      ToPaySum := RKCheck.CurrentOrder.ToPaySum;   

      qntMax :=  trunc(ToPaySum / LimitSum1);

      if qntMax >= 1 then qntMax := 1;      

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

      begin

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

        if SYS.ObjectInheritsFrom(it, 'TDish') then

          if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

            qnt := qnt + TDish(it).Quantity;

      end;    

      if (qnt > qntMax) then

      begin

        RK7.PerformOperation(rkoHome, 0);

        while True do begin

          qnt_temp := 0;

          it := RKCheck.CurrentCheckItem;

          if TObject(it) = Nil then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

            if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then begin

              if (TDish(it).Quantity) > 0 then 

                if it.State = disOpened then begin

                  if (qnt-TDish(it).Quantity) >= qntmax then

                  begin

                    qnt := qnt - TDish(it).Quantity;

                    RK7.PerformOperation(rkoDeleteLine, 1);                                          // удаление

                    continue;

                  end

                  else

                  begin

                    qnt_temp := qntmax-(qnt-TDish(it).Quantity);

                    qnt_temp2 := TDish(it).Quantity;

                    ed := TObject(gui.FindComponentByName('Editor'));

                    if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then

                    begin

                      TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));

                      RK7.PerformOperation(rkoEditAmount, 0);

                      TNumEditor(ed).Text := '';

                      qnt := qnt -(qnt_temp2-qnt_temp);

                    end;

                  end

                end else

                begin

                  qnt := qnt - TDish(it).Quantity;

                  RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));   // списание

                end;

            end;

            RK7.PerformOperation(rkoDown, 0);

            if (qnt <= qntMax) then break;

        end;   

      end;

    end;

end;

Скрипт для пользовательской операции:

procedure ProcessOperation1001832(Parameter: integer);

var DishCode1, DishCode2: integer;

begin

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then

    if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1))       // добавление блюда 1

    else

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1));      // добавление блюда 2

end;

Последний скрипт необходимо назначить пользовательской процедуре и в свойствах выставить галочку «Контроль доступа» — «ограничение доступа к пользовательской операции»

В кассовых правах пользователей появится соответствующий пункт: «кассовые права работника»

Скрипт для акции «Получи подарок за каждые три заказанные блюда из списка»Link to Скрипт для акции «Получи подарок за каждые три заказанные блюда из списка»

На форме редактирования чека разместить таймер. Задать ему интервал равным 200 (это время срабатывания таймера). В событии OnTimer указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var ToPaySum, quantity : double;

    tt : TTimer;

    i, j, every: integer;

    it: TCheckItem;

    BonusDishCode, DishCode1, DishCode2, DishCode3, DishCode4, DishCode5, DishCode6, DishCode7, DishCode8, DishCode9, CntDish, CntBonusDish: integer; 

begin

  DishCode1 := 23; // special dish code  код контролируемого блюда

  DishCode2 := 24; // special dish code  код контролируемого блюда

  DishCode3 := 25; // special dish code  код контролируемого блюда

  DishCode4 := 47; // special dish code  код контролируемого блюда

  DishCode5 := 4; // special dish code  код контролируемого блюда

  DishCode6 := 14; // special dish code  код контролируемого блюда

  DishCode7 := 43; // special dish code  код контролируемого блюда

  DishCode8 := 43; // special dish code  код контролируемого блюда

  DishCode9 := 43; // special dish code  код контролируемого блюда

  BonusDishCode := 45; // bonus dish code  код автоматически добавляемого блюда

  CntDish := 0;

  CntBonusDish := 0;

  every := 3;   // bonus for every dish quantity

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  begin

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

      begin     

        if   (TDish(it).Code = DishCode1)

          or (TDish(it).Code = DishCode2)

          or (TDish(it).Code = DishCode3)

          or (TDish(it).Code = DishCode4)

          or (TDish(it).Code = DishCode5)

          or (TDish(it).Code = DishCode6)

          or (TDish(it).Code = DishCode7)

          or (TDish(it).Code = DishCode8)

          or (TDish(it).Code = DishCode9)

        then

      CntDish := CntDish + trunc(TDish(it).Quantity);

      if (TDish(it).Code = BonusDishCode) then

        CntBonusDish := CntBonusDish + trunc(TDish(it).Quantity);

      end;

  end;

    if trunc(CntDish / every)<>CntBonusDish then  // удаление блюда при несоответствии требуемого количества бонусных блюд

      if CntBonusDish > 0 then

      begin

        for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if (TDish(it).Code = BonusDishCode) then

              RKCheck.DeleteCheckItem(it);

        end;

      end;         

    if trunc(CntDish / every) > 0 then

     if trunc(CntDish / every) >= CntBonusDish then // проверка необходимости добавления блюда

      if CntBonusDish = 0 then

        RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(BonusDishCode), IntToStr(trunc(CntDish / every)));

  end;

end;

Скрипт для акции «Блюда на выбор в подарок при сумме заказа 1300 руб. в определённый период»Link to Скрипт для акции «Блюда на выбор в подарок при сумме заказа 1300 руб. в определённый период»

В период Пн-Пт с 18:01 до 03:00 и Сб-Вс с 10:00 до 03:00, при сумме заказа 1300 руб. (со скидкой), в заказ, вручную, будет на выбор добавляться одно из двух блюд, либо делаться скидка 10%.

Скрипт запрещает показ эти блюд на кассе, пока сумма заказа не будет равна 1300 руб.

На форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;

    qnt, qntMax: double;

    checksum, LimitSim1: double;

    it: TCheckItem;

      CurrTime, Time1, Time2: TDateTime; 

begin

  qnt := 0;

  DiscountCode := 2; // код акционной скидки

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  Time1 := EncodeTime(10,00,00,00);  // начало периода акции

  Time2 := EncodeTime(18,00,00,00);  // конец периода акции

  LimitSim1 := 1300;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  CurrTime := Time;

  checksum := 0;

  cntDisk := 0;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

    if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then

      if not(AEditType = etRemove) then

      begin

        AAllow := false;

        AMessage := 'Access denied';


        if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then                                // проверка дня недели

          if (Time1<=CurrTime)and(CurrTime<=Time2) then

          begin

            AAllow := true;

            AMessage := '';

            checksum := RKCheck.CurrentOrder.ToPaySum;

            qntMax :=  trunc(checksum / LimitSim1);


//            qnt := TDish(AObjectAft).Quantity; // неверно отображает количество

            if TDish(AObjectAft).Quantity<>0 then

              qnt := 1;

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

            begin

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

               if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

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

                  cntDisk := cntDisk + 1;                               // учёт акционной скидки

              if SYS.ObjectInheritsFrom(it, 'TDish') then

                if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

                  qnt := qnt + TDish(it).Quantity;

            end;    

            qnt := qnt + cntDisk;

            if (qnt > qntMax) then // check limit exceed

            begin 

//              gui.showmessage('qnt='+inttostr(qnt)+'qntMax='+inttostr(qntMax));           

              AAllow := false;

              AMessage := 'Quantity exceeded the permitted limit ';

            end;

          end;

      end;

end;

Скрипт для таймера, размещаемого на форме редактирования чека:

procedure userTimer1OnTimer(Sender: TObject);

var ToPaySum : double;

    i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;

    qnt, qnt_temp, qnt_temp2, qntMax: double;

    LimitSum1: double;

    it: TCheckItem;

    CurrTime, Time1, Time2: TDateTime; 

    tt : TTimer;

    ed: TObject;

begin

  qnt := 0;

  DiscountCode := 2; // код акционной скидки

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  Time1 := EncodeTime(10,00,00,00);  // начало периода акции

  Time2 := EncodeTime(18,00,00,00);  // конец периода акции

  LimitSum1 := 1300;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  CurrTime := Time;

  cntDisk := 0;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then                                // проверка дня недели

    if (Time1<=CurrTime) and(CurrTime<=Time2) then

    begin

      ToPaySum := RKCheck.CurrentOrder.ToPaySum;    

      qntMax :=  trunc(ToPaySum / LimitSum1);     

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

      begin

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

        if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

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

            cntDisk := cntDisk + 1;                               // учёт акционной скидки

        if SYS.ObjectInheritsFrom(it, 'TDish') then

          if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

            qnt := qnt + TDish(it).Quantity;

      end;    

      qnt := qnt + cntDisk;

      if (qnt > qntMax)and(cntDisk<>trunc(qnt)) then

      begin

        RK7.PerformOperation(rkoHome, 0);

        while True do begin

          qnt_temp := 0;

          it := RKCheck.CurrentCheckItem;

          if TObject(it) = Nil then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

          if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

            if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then begin

              if (TDish(it).Quantity) > 0 then 

                if it.State = disOpened then begin

                  if (qnt-TDish(it).Quantity) >= qntmax then

                  begin

                    qnt := qnt - TDish(it).Quantity;

                    RK7.PerformOperation(rkoDeleteLine, 1);                                          // удаление

                    continue;

                  end

                  else

                  begin

                    qnt_temp := qntmax-(qnt-TDish(it).Quantity);

                    qnt_temp2 := TDish(it).Quantity;

                    ed := TObject(gui.FindComponentByName('Editor'));

                    if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then

                    begin

                      TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));

                      RK7.PerformOperation(rkoEditAmount, 0);

                      TNumEditor(ed).Text := '';

                      qnt := qnt -(qnt_temp2-qnt_temp);

                    end;

                  end

                end else

                begin

                  qnt := qnt - TDish(it).Quantity;

                  RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));   // списание

                end;

            end;

            RK7.PerformOperation(rkoDown, 0);

            if (qnt <= qntMax) then break;

        end;   

      end;

    end;

end;

Скрипт для применения скидки:

procedure DiscountUsage1001717(UsageParameters: TDiscountUsageParameters);

var i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;

    it: TCheckItem;

    CurrTime, Time1, Time2: TDateTime;

    qnt, qnt_temp, qnt_temp2, qntMax, ToPaySum, LimitSum1: double;

begin

  qnt := 0;

  DiscountCode := 2; // код акционной скидки

  DishCode1 := 45;  // код контролируемого блюда

  DishCode2 := 46;  // код контролируемого блюда

  qntMax := 1;      // максимальное количество контролируемого блюда в заказе.

  Time1 := EncodeTime(10,00,00,00);  // начало периода акции

  Time2 := EncodeTime(18,00,00,00);  // конец периода акции

  LimitSum1 := 1300;   //  сумма чека превысив которую будет разрешено добавить бонусное блюдо.


  CurrTime := Time;

  cntDisk := 0;


//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  if not RKCheck.Valid then

    exit //important checking

  else

  if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then                                // проверка дня недели

    if (Time1<=CurrTime) and(CurrTime<=Time2) then

    begin

      ToPaySum := RKCheck.CurrentOrder.ToPaySum;   

      qntMax :=  trunc(ToPaySum / LimitSum1);     

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

      begin

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

        if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

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

            cntDisk := cntDisk + 1;                               // учёт акционной скидки

        if SYS.ObjectInheritsFrom(it, 'TDish') then

          if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then    

            qnt := qnt + TDish(it).Quantity;

      end;

      qnt := qnt + cntDisk; 

  begin

    if (qnt < qntMax) then

      UsageParameters.UsageMode := umAllow

    else

      UsageParameters.UsageMode := umDeny;

  end;        

 end;

end;

Скрипт автодобавления дополнительных блюд (упаковка для заказов «с собой»)Link to Скрипт автодобавления дополнительных блюд (упаковка для заказов «с собой»)

Все скрипты добавляются на форме редактирования чека

Объявление глобальной переменной в форме редактирования чека. Объявляется массив в который будут заноситься базовые блюда и идущие к ним упаковочные блюда:

var ModifArr: array of string;

Скрипт по добавлению блюд для указанного основного блюда.

procedure AddSpecDish(Dish:TDish);

var

  j,p1,p2: integer;

  s, dcode, AddCode, q: string;

begin

  for j := 0 to GetArrayLength(ModifArr)-1 do

  begin

        s := ModifArr[j];

        p1 := pos(';',s);

        p2 := p1+pos(';',copy(s,p1+1, length(s)-p1));

        dcode := copy(s,1,p1-1);

        AddCode := copy(s,p1+1,p2-p1-1);

        q := copy(s,p2+1, length(s)-p2);

        if (Dish.Code = StrToInt(dcode) ) then

        begin

          RKCheck.CreateCheckItem(rkrefMenuItems, AddCode, FloatToStr(StrToFloat(q)*TDish(Dish).Quantity));  // добавление блюда с учётом количества основного блюда

        end;

  end;

end;


Скрипт для добавления блюд всем ранее добавленным в заказ до добавления условного блюда «с собой»

procedure AddSpecDishBefore;

var i: integer;

    it: TCheckItem;

begin

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

  begin

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

    if SYS.ObjectInheritsFrom(it, 'TDish') then

      AddSpecDish(TDish(it));

    end;     

end;

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i,j,p1,p2: integer;

    it: TCheckItem;

    s, dcode, AddCode, q: string;

begin

  if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then   //  check condition to add pack dishes

    if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

      if TDish(AObjectAft).Code = 20874 then  // 20874 - это код условного блюда "с собой"

      begin

        RKCheck.CurrentOrder.UserTag1 := 30;


        // add dishes for order

        for j := 0 to GetArrayLength(ModifArr)-1 do

        begin

          s := ModifArr[j];

          p1 := pos(';',s);

          p2 := p1+pos(';',copy(s,p1+1, length(s)-p1));

          dcode := copy(s,1,p1-1);

          AddCode := copy(s,p1+1,p2-p1-1);

          q := copy(s,p2+1, length(s)-p2);

          if (0 = StrToInt(dcode) ) then

            RKCheck.CreateCheckItem(rkrefMenuItems, AddCode, FloatToStr(StrToFloat(q)*1));

        end; 

        // add dishes for order


        AddSpecDishBefore;      // добавление паковочных блюд для всех ранее добавленных в заказ позиций

      end;


  if (RKCheck.CurrentOrder.UserTag1 = 30) then   // check condition to add pack dishes

  begin

    if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then

    AddSpecDish(TDish(AObjectAft));

  end;

  //   checking by modifier

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

        begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

          begin

            for j := 0 to TDish(it).Modifiers.Count - 1 do

            begin

              gui.showmessage('step 2 '+inttostr(TDish(it).Modifiers.Items[j].Code));

              if (TDish(it).Modifiers.Items[j].Code=20) then

              RKCheck.CurrentOrder.UserTag1 := 30;

            end;

          end;

        end;    }

end;

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

procedure userTimer1OnTimer(Sender: TObject);

var i,j, cnt: integer;

    it: TCheckItem;

begin

  cnt := 0;

  if not RKCheck.Valid then

    exit //important checking

  else

    if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then   // different discounts for different tables

  begin

    // serch special dishes

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

    begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if TDish(it).Code = 20874 then

              cnt := cnt + 1;        

{ serch special modificator

        for j := 0 to TDish(it).Modifiers.Count - 1 do

          if (TDish(it).Modifiers.Items[j].Code=20) then      }

    end;      

// remove tag for autoadding dishes

    if cnt = 0 then

      RKCheck.CurrentOrder.UserTag1 := 0;

  end;

end;

Скрипт на событие OnShowScript компонента CheckView задаёт набор привязок упаковочных блюд к основным:

procedure userTimer1OnTimer(Sender: TObject);

var i,j, cnt: integer;

    it: TCheckItem;

begin

  cnt := 0;

  if not RKCheck.Valid then

    exit //important checking

  else

    if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then   // different discounts for different tables

  begin

    // serch special dishes

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

    begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if TDish(it).Code = 20874 then

              cnt := cnt + 1;        

{ serch special modificator

        for j := 0 to TDish(it).Modifiers.Count - 1 do

          if (TDish(it).Modifiers.Items[j].Code=20) then      }

    end;      

// remove tag for autoadding dishes

    if cnt = 0 then

      RKCheck.CurrentOrder.UserTag1 := 0;

  end;

end;

Скрипт на автоматическое добавление порядков подачи в новый заказLink to Скрипт на автоматическое добавление порядков подачи в новый заказ

На форме редактирования заказа разместить таймер и в его событии указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var i,CntDish1:integer;

    it: TCheckItem;

begin

// Проверка на корректный чек

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;


  if RKCheck.CurrentOrder.UserTag1 = 0 then

  begin

    CntDish1 := 0;

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if (TDish(it).quantity > 0) then

          CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

    end;

    if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;

    if CntDish1=0 then

    begin

      RKCheck.CurrentOrder.UserTag1 := 1;

      RK7.PerformOperation(rkoServLineSelector, 0);

      RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 4)); //  код курса подачи

      RK7.PerformOperation(rkoDown, 0);

      RK7.PerformOperation(rkoServLineSelector, 0);


      RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 1)); //  код курса подачи

      RK7.PerformOperation(rkoDown, 0);


      RK7.PerformOperation(rkoServLineSelector, 0);

      RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 3)); //  код курса подачи

      RK7.PerformOperation(rkoDown, 0);

    end;

  end;

end;


Скрипт на автоматическое добавление блюда в пустой заказ и выход из заказа с сохранениемLink to Скрипт на автоматическое добавление блюда в пустой заказ и выход из заказа с сохранением

На форме редактирования чека разместить таймер, задать ему период 2 секунды и в событии OnTimer указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var i,CntDish1:integer;

    it: TCheckItem;

begin

// Проверка на корректный чек

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;


  if RKCheck.CurrentOrder.UserTag1 = 0 then

  begin

    CntDish1 := 0;

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if (TDish(it).quantity > 0) then

          CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

    end;

    if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;

    if CntDish1=0 then

    begin

      RKCheck.CurrentOrder.UserTag1 := 1;

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(15304), inttostr(RKCheck.CurrentOrder.Visit.GuestCnt))// here insert code of free dish

      RK7.PerformOperation(rkoSaveOrder, 0);

    end;

  end;

end;

Скрипт на автоматическое добавление блюда при регистрации карты ПДС (назначении заданной скидки)Link to Скрипт на автоматическое добавление блюда при регистрации карты ПДС (назначении заданной скидки)

На форме редактироования чека разместить таймер, в событии которого указать скрипт:

procedure userTimer1OnTimer(Sender: TObject);

var limit : double;

    i, j: integer;

    it: TCheckItem;

    BonusDishCode, DiscountCode, CntDiscount, CntBonusDish, BonusDishQnt: integer; 

begin

  DiscountCode := 33; // special dish code  код контролируемого блюда

  BonusDishCode := 45; // bonus dish code  код автоматически добавляемого блюда

  BonusDishQnt  := 3; // bonus dish quantity  количество автоматически добавляемого блюда

  limit := 1000;

  CntDiscount := 0;

  CntBonusDish := 0;

  if not RKCheck.Valid then Exit;

  if (GUI.CheckFormInPayMode) then exit;

  if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;

  begin

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

    begin

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

      if SYS.ObjectInheritsFrom(it, 'TDish') then

      begin     

        if (TDish(it).Code = BonusDishCode) then

          CntBonusDish := CntBonusDish + trunc(TDish(it).Quantity);

      end;

      if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

      begin     

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

          CntDiscount := CntDiscount + 1;

      end;

  end;

    if CntDiscount > 0 then  // удаление блюда при несоответствии требуемого количества бонусных блюд

     if CntBonusDish > 0 then

      if RKCheck.CurrentOrder.ToPaySum < limit then

      begin

        for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

          if SYS.ObjectInheritsFrom(it, 'TDish') then

            if (TDish(it).Code = BonusDishCode) then

              RKCheck.DeleteCheckItem(it);

        end;

      end;  


    if RKCheck.CurrentOrder.ToPaySum >= limit then  // проверка необходимости добавления блюда

      if CntDiscount > 0 then

        if CntBonusDish = 0 then

          RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(BonusDishCode), IntToStr(BonusDishQnt));

  end;

end;