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

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

На форме редактирования чека у формы в событии 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;

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

Скрипт разместить на форме редактирования заказа в событии 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;

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

У формы в свойстве 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;

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


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

Необходимо добавить следующий функционал для принятия пожертвований:
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;

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

В форме редактирования чека у основной формы в событии 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;