Скрипт, создающий наценку на заказ со скидкойLink to Скрипт, создающий наценку на заказ со скидкой

Необходимо настроить наценку за обслуживание, которая будет применяться на сумму заказа со скидкой.

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


procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

а над ним разместить скрипт


procedure AddEveryOtherDiscount(DiscCode: integer);

var i, j: integer;

    it, CurItem: TCheckItem;

    a, PriceSum, DiscountSum, DiscPerc: double;

    CheckView: TCheckView;

begin

  DiscPerc := 10; // 10%

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

  if CheckView = Nil then Exit;

  CurItem   := RKCheck.CurrentCheckItem;

  try

    PriceSum := 0;

    DiscountSum := 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

        if TDiscountItem(it).code <> DiscCode then

          DiscountSum := DiscountSum + TDiscountItem(it).CalcAmount;

    end;

    PriceSum := RKCheck.CurrentOrder.PriceListSum;


    a:= (PriceSum + DiscountSum)*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

          if TDiscountItem(it).code = DiscCode then

          begin

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

            else

            begin

              RKCheck.DeleteCheckItem(it);

            end

            break;

          end;

      end;


    // Create discount to a dish

    if a > 0 then

    begin

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

    end;

  finally

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

  end;

  RKCheck.CurrentOrder.Recalc();

end;


procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

begin

  if (operation = 420)  // 420 - Расcчитать чек

   or(operation = 455)  // 455 - Оплатить чек

  then  

  begin

    AddEveryOtherDiscount(14);  //  код наценки

end;

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

Скрипт разместить на форме редактирования заказа в событии OnOperation у объекта DesignForm


procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

var i, CurrencyCodeForChange,CurrencyCode1,CurrencyCode2, CategCode1,CategCode2: integer;

    CurrencyCodeForChangeSum,CurrencyCode1Sum,CurrencyCode2Sum, Categ1Sum,Categ2Sum: double;

    it: TCheckItem;

    Categ1, Categ2: TClassificatorGroup;

begin

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

  CurrencyCodeForChange := 1;   // код подменяемой валюты

  CurrencyCode1 := 18;   // код валюты(категория 1)

  CurrencyCode2 := 17;   // код валюты(категория 2)

  CategCode1 := 1;     // код категории 1

  CategCode2 := 8;     // код категории 2

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


  CurrencyCodeForChangeSum := 0;

  CurrencyCode1Sum := 0;

  CurrencyCode2Sum := 0;

  Categ1Sum := 0;

  Categ2Sum := 0;

  Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));

  Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));


  if operation = 459 then

    begin

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

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

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

          if (it.Code = CurrencyCodeForChange) then

            CurrencyCodeForChangeSum := CurrencyCodeForChangeSum + TPayLine(it).NationalSum;

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

          if (it.Code = CurrencyCode1) then

            CurrencyCode1Sum := CurrencyCode1Sum + TPayLine(it).NationalSum;           

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

          if (it.Code = CurrencyCode2) then

            CurrencyCode2Sum := CurrencyCode2Sum + TPayLine(it).NationalSum;           

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

          if Categ1.IsChild(it.RefItem) then

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

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

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

          if Categ2.IsChild(it.RefItem) then

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

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

      end;

    end;

  if (CurrencyCode1Sum=0.0) and (CurrencyCode2Sum=0.0) then

    if (CurrencyCodeForChangeSum>0) and (CurrencyCodeForChangeSum=(Categ1Sum+Categ2Sum)) then

    begin

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

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

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

          if (it.Code = CurrencyCodeForChange) then

            RKCheck.DeleteCheckItem(it);

      end;

      if Categ1Sum>0 then

        RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode1), floattoStr(Categ1Sum));

      if Categ2Sum>0 then

        RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode2), floattoStr(Categ2Sum));

    end;

end;

Скрипт, делающий кнопку «предоплата» временно неактивнойLink to Скрипт, делающий кнопку «предоплата» временно неактивной

У формы в свойстве OnOperation указать скрипт:


procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

var   ed: TObject;

begin

  if (Operation=rkoPrepaySelector) then

  begin

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

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

      if 0.0 >= StrToFloat(TNumEditor(ed).Text) then  

        gui.showmessage('Не указана сумма!!!');

    end;

end;

Будет выводиться предупреждение при нажатии кнопки «Предоплата»


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

Необходимо добавить следующий функционал для принятия пожертвований:
1. При нажатии кнопки «Оплата» появляется поп-ап с вопросом, не хочет ли гость пожертвовать денег. Варианты ответа - да/нет
2. При нажатии «да» происходит переход в каталог меню с пожертвованием.
3. При нажатии «нет» происходит переход в режим оплаты

Скрипт для события OnOperation основной экранной формы:


procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

begin

  if Operation = 455 then  //  проверка кода операции - оплата {455 420}

    if RKCheck.CurrentOrder.UserTag1 <> 1 then  // проверка показывался ли этот диалог ранее

    begin

      if GUI.RKMessageDlg('Желает ли гость пожертвовать денег?', 0, 3, 100000) = 6 then

      begin

        RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, 22));  // {Menu group code}

        res := 1;

      end;

      RKCheck.CurrentOrder.UserTag1 := 1;  // метка, чтобы повторно не открывать диалог

    end; 

end;

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

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

procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);

begin

  dbg.dbgprint('Operation '+IntToStr(Operation));

  if Operation = 459 then   // код операции оплаты

    AddEveryOtherDiscount(11);   // вызов процедуры расчёта скидки с указанием кода открытой суммовой скидки на блюдо

end;

Но перед этим скриптом разместить процедуру:

procedure AddEveryOtherDiscount(DiscCode: integer);

var

    i, j, k, PresentCnt: integer;

    it, CurItem: TCheckItem;

    SL: TStringList;

    a, CalcDiscount, q, Price, DiscPrc: double;

    d: TDish;

    CheckView: TCheckView;

    CurrTime, Time1, Time2: TDateTime; 

begin

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

  if CheckView = Nil then Exit;

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

  DiscPrc := 0.5;    // процент скидки в долях

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

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

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

  CurrTime := Time;

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

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

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

  CurItem   := RKCheck.CurrentCheckItem;

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

  if (Time1<=CurrTime) and(CurrTime<=Time2) then                                   // проверка времени

  begin

      SL        := TStringList.Create;

      try

        // Create list of the dishes, as is

        SL.Sorted := True;

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

        begin

          PresentCnt := 0;

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

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

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

          begin

            for j:= 0 to SL.Count - 1 do  // cheking present dish in list

            begin 

              d:= TDish(SL.Objects[j]);

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

                PresentCnt := PresentCnt + 1;

            end;

            if PresentCnt = 0 then       // adding dish to list`

            begin

              if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price

              else Price := TDish(it).PRListSum/TDish(it).Quantity;

              SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI),

              TObject(it));

            end;

          end;

        end;

      //Magic

        k:= -1;

        q:=0;

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

        begin

          d:= TDish(SL.Objects[i]);

          CalcDiscount:= 0;

          q:=q+ d.Quantity;

          if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price

          else Price := d.PRListSum/d.Quantity;

           if k = -1 then

            begin

              CalcDiscount:= CalcDiscount + Price*DiscPrc; // DiscPrc % discount

            end;

        // Delete discount, if CalcDiscount sum changed

          for j     := RKCheck.CheckItemCount(TObject(d.Discounts)) - 1 downto 0 do

          begin

            it      := RKCheck.CheckItemByNumber(TObject(d.Discounts), j);

            if (it.Code = DiscCode) then

              begin

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

              else RKCheck.DeleteCheckItem(it);

                break;

            end;

          end;

        // Create discount to CalcDiscount dish

          if CalcDiscount > 0 then

          begin

            CheckView.GotoItem(TObject(d));

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

          end;

        end;

      finally

        SL.Free();

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

      end;

  end;

  RKCheck.CurrentOrder.Recalc();

end;