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