OnTimer
Скрипт на создание скидки на предзаказ
На форме редактирования заказа в событии 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;
Скрипт для автоматического добавления модификаторов
На форме редактирования чека разместить таймер и в его событии 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;
Скрипт, добавляющий блюда при определенном типе заказа
На форме редактирования заказа добавить таймер и указать ему скрипт:
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;
Скрипт, отслеживающий суммы чеков в денежных диапазонах
Необходимо при каждом превышении лимита выводить сообщение и не выводить его повторно пока не превышен следующий лимит.
Нижеприведенный скрипт отрабатывает корректно до момента печати чека. В этот момент начинают сыпаться несвоевременные сообщения.
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;
Скрипт на добавление\удаление блюда при определенной сумме заказа
На форме редактирования заказа разместить объект «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.
Скрипт на добавление/удаление блюда, при определенной сумме сохраненного заказа
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 руб. со скидкой»
В период Пн-Пт с 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;
Скрипт для печати в пречеке процента изменяемой скидки
Создали по желанию клиента "скидку равную возрасту", которая имеет изменяемое значение от 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 блюдо на выбор бесплатно»
На форме редактирования чека у объекта 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;
Последний скрипт необходимо назначить пользовательской процедуре и в свойствах выставить галочку «Контроль доступа» — «ограничение доступа к пользовательской операции»
В кассовых правах пользователей появится соответствующий пункт: «кассовые права работника»
Скрипт для акции «Получи подарок за каждые три заказанные блюда из списка»
На форме редактирования чека разместить таймер. Задать ему интервал равным 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 руб. в определённый период»
В период Пн-Пт с 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;
Скрипт автодобавления дополнительных блюд (упаковка для заказов «с собой»)
Все скрипты добавляются на форме редактирования чека
Объявление глобальной переменной в форме редактирования чека. Объявляется массив в который будут заноситься базовые блюда и идущие к ним упаковочные блюда:
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;
Скрипт на автоматическое добавление порядков подачи в новый заказ
На форме редактирования заказа разместить таймер и в его событии указать скрипт:
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;
Скрипт на автоматическое добавление блюда в пустой заказ и выход из заказа с сохранением
На форме редактирования чека разместить таймер, задать ему период 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;
Скрипт на автоматическое добавление блюда при регистрации карты ПДС (назначении заданной скидки)
На форме редактироования чека разместить таймер, в событии которого указать скрипт:
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;