A script to open a custom selector when adding a specified dish to an order
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var Categ: TClassificatorGroup; begin if TRK7Restaurant(RK7.CashGroup.MainParent).Code = 6 then if (AEditType = etInsert) and SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 145)); // oeacaou eia eeanneoeeaoee if Categ.IsChild(TDish(AObjectAft).RefItem) then RK7.PostOperation(rkoPrepaySelector, 145); end; end;
A script to offer a dessert to a guest
The script should add the "Desserts" menu group when adding the "Beverages" menu group and if the guest gives agrees.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var MenuCode, GroupMenu: integer; begin //********** Set parameters ***********// MenuCode := 11; // code of the "Desserts" menu to be added GroupMenu := 8; // "beverages" group menu //********** Set parameters ***********// if SYS.ObjectInheritsFrom(AObjectAft, 'TMenuGroupLine') then begin if (TMenuGroupLine(AObjectAft).Code = GroupMenu) then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, MenuCode )); //Code open menu end end end;
A script to automatically turn on charging by time
The two restaurants have a common room and separate booths. There is a 10% extra charge for service both in the common room and booths. Besides, in the booths there is an additional minute-by-minute charging. Thus, an hour in the cabin costs 40 somoni, and a minute costs about 66 dirams. It’s necessary to make the system automatically turn on per-minute charging when opening an order in the booths, put it on pause when printing the bill and show the charging amount in the bill. Mobile Waiter is used in one of the restaurants, and a regular POS-terminal — in the second one.
On the receipt editing form of the object, insert the script in the event:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, CntDish: integer; it: TCheckItem; begin if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin CntDish := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then CntDish := CntDish + 1; end; if CntDish = 1 then RK7.PostOperation(rkoAddTariff, 0); end; end; Instead of the bill selector, create your own variant and assign it a custom operation with the following script: procedure ProcessOperation1001625(Parameter: integer); begin RK7.PostOperation(rkoCloseTariff, 0); end;
A script to change the weight of a dish with modifiers
When adding modifiers with the codes specified in the script, their weight specified in the extended property will be removed from the dish served by weight:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var j,ModifCode1,ModifCode2,ModifCode3: integer; ed: TObject; weight:double; it: TCheckItem; begin ModifCode1 := 98; ModifCode2 := 98; ModifCode3 := 100; weight:=0; if SYS.ObjectInheritsFrom(AObjectAft, 'TModiItem') then if (TModiItem(AObjectAft).code = ModifCode1) or(TModiItem(AObjectAft).code = ModifCode2) or(TModiItem(AObjectAft).code = ModifCode3) then begin it := RKCheck.CurrentCheckItem; if TObject(it) = Nil then Exit; if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then Exit; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin weight:= TDish(it).Quantity; ed := TObject(gui.FindComponentByName('Editor')); if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then begin weight:=StrToFloat(TModifier(TModiItem(AObjectAft).RefItem).genWeight0419); TNumEditor(ed).Text := floatToStr(TDish(it).Quantity+(weight/1000)); // + if the modifier has a negative weight, and - if the modifier has a positive weight. RK7.PerformOperation(rkoEditPortionWeight, 0); TNumEditor(ed).Text := ''; end; end; end; end;
A promotion script: order 2 dishes — get the cheapest 3d one for free
Respectively, two cheapest dishes are for free if 6 dishes are ordered.
On the check editing form of the CheckView object, insert the script in the OnAfterCheckViewEdit event:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); begin AddEveryOtherDiscount(11{DiscCode}); // 11 opened fixed amount discount on a dish end; Before the abovementioned script, add the following one: Corrected version: procedure AddEveryOtherDiscount(DiscCode: integer); var i, j, k, evr, qntdsc, CategCode: integer; it, CurItem: TCheckItem; SL: TStringList; a, q, Price: double; d: TDish; CheckView: TCheckView; categ: TClassificatorGroup; begin evr := 3; // make discount every this count qntdsc := 0; CategCode := 5; //5 - paste your category code CheckView := TCheckView(GUI.FindComponentByName('CheckView')); if CheckView = Nil then Exit; CurItem := RKCheck.CurrentCheckItem; SL := TStringList.Create; try // Create list of the dishes, sorted by price SL.Sorted := True; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if Categ.IsChild(it.RefItem) then //Check category of the dish // it := RKCheck.CurrentOrder.Sessions.Lines[i]; if not(TDish(it).IsComboComp) then if ((it.State = disOpened) or (it.State = disPrinted)) then begin // gui.showmessage(TDish(it).name); 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; if evr > 0 then qntdsc := SL.Count div evr; if SL.Count >= evr then for i := 0 to SL.Count - 1 do begin d := TDish(SL.Objects[i]); a := 0; q := d.Quantity; if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price else Price := d.PRListSum/d.Quantity; while q + 0.0001 > 1 do begin //if (i+1) mod evr = 0 then if ((i+1)<=qntdsc)and(qntdsc>0) then a := a + Price; q := q - 1; end; // Delete discount, if a 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) = a then a := 0 else RKCheck.DeleteCheckItem(it); break; end; end; // Create discount to a dish if a > 0 then begin CheckView.GotoItem(TObject(d)); RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a)); end; end; finally SL.Free(); if CurItem <> Nil then CheckView.GotoItem(CurItem); end; RKCheck.CurrentOrder.Recalc(); end;
A script to automatically add a bonus dish if a specified dish is ordered
The script adds a bonus dish when adding a promotional dish from a specified category.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, j, p, z, CategCode: integer; Categ: TClassificatorGroup; it, CurItem: TCheckItem; DishCode, CntDish1, CntDish2: integer; CheckView: TCheckView; DishesCode: TStringList; begin CheckView := TCheckView(GUI.FindComponentByName('CheckView')); if CheckView = Nil then Exit; DishesCode := TStringList.Create; //********** Set parameters ***********// DishesCode.Add('27;45'); // code of category of promotional dish, for which bonus dish is added; bonus dish code DishesCode.Add('28;46'); DishesCode.Add('8;43'); //DishesCode.Add('17;24'); //DishesCode.Add('18;25'); //DishesCode.Add('19;26'); //DishesCode.Add('11;27'); //********** Set parameters ***********// CurItem := RKCheck.CurrentCheckItem; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only try for z := 0 to DishesCode.Count-1 do begin p:=pos(';',DishesCode.Strings[z]); CategCode := StrToInt(copy(DishesCode.Strings[z],1,p-1)); // code of category of promotional dish, for which bonus dish is added; DishCode := StrToInt(copy(DishesCode.Strings[z],p+1,length(DishesCode.Strings[z])-p)); // bonus dish code //dbg.dbgprint('CategCode = '+inttostr(CategCode)+' DishCode = '+inttostr(DishCode)); Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code //dbg.dbgprint('TDish(AObjectAft).Code = '+inttostr(TDish(AObjectAft).Code)); if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish begin RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(TDish(AObjectAft).Quantity)); // add bonus dish end; end; finally DishesCode.Free(); if CurItem <> Nil then CheckView.GotoItem(CurItem); end; RKCheck.CurrentOrder.Recalc(); // focus is broken if you uncomment end;
A script to add a bonus dish for each 4th unique dish from the category !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Есть блюда категории «шот». Нужно при заказе четырёх одинаковых блюд из этой категории добавлять в заказ на выбор блюдо из категории «пицца». Пицца должна добавиться с нулевой ценой, либо со 100% скидкой.
Скрипт на событие OnAfterCheckViewEdit объекта CheckView, расположенного на форме редактирования чека. Считаются все блюда в категории и на каждое n-ое добавляется бонусное блюдо.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, j, CategCode, every, p1, p2: integer; Categ: TClassificatorGroup; it, it2, CurItem: TCheckItem; DishCode, CntDish1, CntDish2, AddDish2: integer; mem, mem2, str: string; CheckView: TCheckView; DishesCode: TStringList; begin CheckView := TCheckView(GUI.FindComponentByName('CheckView')); if CheckView = Nil then Exit; //********** Set parameters ***********// CategCode := 27; // код категории DishCode := 45; // код бонусного блюда every := 4; //********** Set parameters ***********// Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code CurItem := RKCheck.CurrentCheckItem; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish begin CntDish2 := 0; // счётчик кол-ва акционного блюда mem := ''; mem2 := ''; 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 (Categ.IsChild(TDish(it).RefItem)) then // checking category of dish begin CntDish1 := 0; // счётчик кол-ва бонусного блюда if pos(';' + IntToStr(TDish(it).Sifr) + '=',mem)<=0 then begin mem := mem + ';' + IntToStr(TDish(it).Sifr) + '='+FloatToStr(TDish(it).Quantity); for j := i to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it2 := RKCheck.CurrentOrder.Sessions.Lines[j]; if SYS.ObjectInheritsFrom(TObject(it2), 'TDish') then if (TDish(it2).code=TDish(it).code) then // checking category of dish CntDish1 := CntDish1 + trunc(TDish(it2).Quantity); end; end; if CntDish1>=every then begin mem2 := mem2 + ';' + IntToStr(TDish(it).code) + '='+FloatToStr(CntDish1); end; end; if (TDish(it).Code = DishCode) then CntDish2 := CntDish2 + trunc(TDish(it).Quantity); end; end; AddDish2 := 0; while mem2<>'' do begin p1 := Pos(';', mem2); if p1 > 0 then begin str := Copy(mem2, p1+1, 10000); p2 := Pos(';', str); if p2 = 0 then p2 := 10000; str := Copy(mem2, p1+1, p2 - 1); Delete(mem2, p1, p2); CntDish1 := trunc(StrToFloat(Copy(str, Pos('=', str)+1, 10000))/every); if CntDish1>0 then AddDish2 := AddDish2 + CntDish1; end; end; if (AddDish2 <> CntDish2) then begin if CntDish2 > 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 CntDish1 > 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(AddDish2)); // add bonus dish end; end; if CurItem <> Nil then CheckView.GotoItem(CurItem); end;
Скрипт на обнуление скидки при добавлении другой скидки
procedure DiscountUsage1002304(UsageParameters: TDiscountUsageParameters); var i,cntDiscount, DiscountCode1, DiscountCode2, DiscountCode3: integer; it: TCheckItem; begin // if not RKCheck.Valid then exit; DiscountCode1 := 12; // код скидки1 DiscountCode2 := 12; // код скидки2 DiscountCode3 := 14; // код скидки3 cntDiscount := 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 (it.code = DiscountCode1)or(it.code = DiscountCode2)or(it.code = DiscountCode3) then if TDiscountItem(it).SrcAmount<>0 then begin cntDiscount := cntDiscount + 1; break; end; end; if cntDiscount>0 then UsageParameters.UsageMode := umDeny else UsageParameters.UsageMode := umAllow; end;
Скрипт для автоматической наценки в зависимости от места
Пример: на входе кассир открыл тарифицируемое место и отдал гостю карту, гость пошел в бар и бармен добавил ему блюда в заказ на карту.
Необходимо добавить наценку в тот момент, когда бармен открыл его заказ на редактирование.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var Categ: TClassificatorGroup; it: TCheckItem; i, CategCode, DiscCode, DiscCnt: Integer; begin CategCode := 8; // указать код категории DiscCode := 5; // код наценки DiscCnt := 0; if AEditType = etInsert then begin for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check dish lines only if (TDiscountItem(it).Code = DiscCode) then DiscCnt := DiscCnt + 1; end; // add discount Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if SYS.ObjectInheritsFrom(TDish(AObjectAft), 'TDish') then if Categ.IsChild(TDish(AObjectAft).RefItem) then if DiscCnt = 0 then RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(100)); // add discount with code 11 end; end;
Скрипт для добавления бесплатного блюда в определенный день недели, в определенное время, при пробитии определенного блюда
В форме редактирования у компонента CheckView в событии OnAfterCheckViewEdit записать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, j: integer; it: TCheckItem; DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer; disk : integer; disksum: double; CurrTime, Time1, Time2: TDateTime; begin Time1 := EncodeTime(08,00,00,00); // начало периода акции Time2 := EncodeTime(21,00,00,00); // конец периода акции DiscCode := 12; // код скидки DishCode := 13; // код бонусного блюда AddDishCode := 7; // код акционного блюда CntDish1 := 0; CntDish2 := 0; CurrTime := Time; //1 = воскресенье //2 = понедельник //3 = вторник //4 = среда //5 = четверг //6 = пятница //7 = суббота if DayOfWeek(Now)=5 then // проверка дня недели if (Time1<=CurrTime) and(CurrTime<=Time2) then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only if (TDish(AObjectAft).Code = AddDishCode) then 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 = AddDishCode) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity); if (TDish(it).Code = DishCode) then CntDish2 := CntDish2 + trunc(TDish(it).Quantity); end; end; if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; if (CntDish1 <> CntDish2) then begin if CntDish2 > 0 then begin if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; 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 = DishCode) 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; if CntDish1 > 0 then begin RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки end; end; end; end;
В форме редактирования у компонента CheckView в событии OnBeforeCheckViewEdit записать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, j: integer; it: TCheckItem; DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer; disk : integer; disksum: double; CurrTime, Time1, Time2: TDateTime; begin Time1 := EncodeTime(08,00,00,00); // начало периода акции Time2 := EncodeTime(21,00,00,00); // конец периода акции DiscCode := 12; // код скидки DishCode := 13; // код бонусного блюда AddDishCode := 7; // код акционного блюда CntDish1 := 0; CntDish2 := 0; CurrTime := Time; //1 = воскресенье //2 = понедельник //3 = вторник //4 = среда //5 = четверг //6 = пятница //7 = суббота if DayOfWeek(Now)=5 then // проверка дня недели if (Time1<=CurrTime) and(CurrTime<=Time2) then if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then //Check dish lines only if (TDish(AObjectBef).Code = AddDishCode) then if (AEditType = etRemove) then 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 = AddDishCode) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity); if (TDish(it).Code = DishCode) then CntDish2 := CntDish2 + trunc(TDish(it).Quantity); end; end; CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity); if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; if (CntDish1 <> CntDish2) then begin if CntDish2 > 0 then begin if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; 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 = DishCode) 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; if CntDish1 > 0 then begin RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки end; end; end; end;
Скрипт на добавление\удаление блюда при определенном пороге суммы заказа
Существует акционное блюдо с нулевой ценой. Клиент хочет, чтобы это блюдо автоматически добавлялось в заказ, если сумма заказа достигла 999 рублей и чтобы удалялось, если сумма заказа не достигла 999 рублей (не доверяют персоналу).
В форме редактирования заказа у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, j: integer; it: TCheckItem; limit, sum : double; DiscCode, DishCode, CntDish1: integer; begin limit := 200; DishCode := 43; // special dish code CntDish1 := 0; // { блокировка добавления специального блюда при сумме меньше лимита. if AEditType = etInsert then if RKCheck.CurrentOrder.UnpaidSum < limit then if (TDish(AObjectBef).Code = DishCode) then // dish code if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin AAllow := false; AMessage := 'Блюдо нельзя добавить, т.к. заказ менее 200 р.'; end; // } if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then if AEditType = TdiscountItem e then begin sum := 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).Code = DishCode) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity); end; if (TDish(AObjectBef).Code = DishCode) then // dish code CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity); if AEditType = etRemove then sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum) else sum := RKCheck.CurrentOrder.UnpaidSum; if sum < limit 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 RKCheck.CurrentOrder.UnpaidSum >= limit then // check limit exceed если сумма чека равна или больше лимита, то добавить спе.блюдо if CntDish1 = 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1'); end; end;
В форме редактирования заказа у объекта CheckView в событии OnAfterCheckViewEdit указать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, j: integer; it: TCheckItem; limit, sum, Price: double; DiscCode, DishCode, CntDish1: integer; begin // if AEditType = etInsert then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin sum := 0; limit := 200; DishCode := 43; // special dish code 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).Code = DishCode) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity); end; if (TDish(AObjectBef).Code = DishCode) then // dish code CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity); Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum); sum := RKCheck.CurrentOrder.UnpaidSum + Price; if sum < limit 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 sum >= limit then // check limit exceed если сумма равна или больше лимита, то добавить спец.блюдо if CntDish1 = 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1'); end; end;
Скрипт на автоматическое добавление блюда в заказ
При сумме заказа от 1000 р. в заказ добавляется определенное блюдо, а при сумме заказа от 2000 р. добавляется другое блюдо.
Также на чек автоматически делается скидка 20%, если добавить блюдо по цене 1000 (сумма заказа в таком случае составит 800).
Бесплатное блюдо добавляется при постепенном формировании заказа. При уменьшение суммы заказа блюдо удаляется. Если заказ превышает сумму в 2000 р., бесплатное блюдо с условием заказ>2000р. добавляется, а блюдо с условием заказ>1000 р. удаляется. А если уменьшить сумму заказа с 2000 до 1500, то блюдо с условием заказ>2000 р. убирается, а блюдо с условием заказ>1000р. должно добавляться.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, j: integer; it: TCheckItem; limit1, limit2, sum, Price: double; DishCode1, DishCode2, CntDish1, CntDish2: integer; go1: boolean; begin sum := 0; limit1 := 1000; limit2 := 2000; DishCode1 := 45; // special dish code DishCode2 := 46; // special dish code CntDish1 := 0; CntDish2 :=0; Price := 0; go1 := false; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) then go1 := true; if go1 or SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then 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) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity) else if (TDish(it).Code = DishCode2) then CntDish2 := CntDish2 + trunc(TDish(it).Quantity); end; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if ( (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) ) then begin if (TDish(AObjectBef).Code = DishCode1) then // dish code CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity) else if (TDish(AObjectBef).Code = DishCode2) then // dish code CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity); // Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum); Price := (TDish(AObjectAft).SumWithDiscounts) - (TDish(AObjectBef).SumWithDiscounts); // SumWithDiscounts end; sum := RKCheck.CurrentOrder.ToPaySum + Price+ RKCheck.CurrentOrder.DiscountSum; // if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then // gui.showmessage('ToPaySum='+FloatToStr(RKCheck.CurrentOrder.ToPaySum)+' Price='+FloatToStr(Price)+' Discountsum='+FloatToStr(RKCheck.CurrentOrder.DiscountSum)+' CalcAmount='+FloatToStr(TDiscountItem(AObjectAft).CalcAmount)); if sum < limit2 then if CntDish2 > 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 = DishCode2) then RKCheck.DeleteCheckItem(it); end; end; if (sum < limit1) or (sum >=limit2) 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 = DishCode1) then RKCheck.DeleteCheckItem(it); end; end; if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.????? begin if CntDish2 <= 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1'); end else if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.????? if CntDish1 <= 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1'); end; end; procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, j: integer; it: TCheckItem; limit1, sum, limit2 : double; DiscCode, DishCode1, CntDish1, DishCode2, CntDish2: integer; begin limit1 := 1000; limit2 := 2000; DishCode1 := 45; // special dish code DishCode2 := 46; // special dish code CntDish1 := 0; CntDish2 :=0; if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then if AEditType = etRemove then begin sum := 0; 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) then CntDish1 := CntDish1 + trunc(TDish(it).Quantity) else if (TDish(it).Code = DishCode2) then CntDish2 := CntDish2 + trunc(TDish(it).Quantity); end; end; if (TDish(AObjectBef).Code = DishCode1) then // dish code CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity) else if (TDish(AObjectBef).Code = DishCode2) then // dish code CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity); if AEditType = etRemove then // sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum) sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).SumWithDiscounts) else sum := RKCheck.CurrentOrder.UnpaidSum; if sum < limit2 then // ???? ????? ?????? ??????, ?? ??????? ??????????? ????? if CntDish2 > 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 = DishCode2) then RKCheck.DeleteCheckItem(it); end; end; if (sum < limit1) or (sum >=limit2) 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 = DishCode1) then RKCheck.DeleteCheckItem(it); end; end; if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.????? begin if CntDish2 <= 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1'); end else if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.????? if CntDish1 <= 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1'); end; end;
Скрипт для автоматического добавления бесплатного (стартового) блюда в заказ при создании нового заказа
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var codedish1: integer; begin codedish1 := 23; // dish code for autoadding if RKCheck.CurrentOrder.IsEmpty then if AEditType = etInsert then if SYS.ObjectInheritsFrom(TDish(AObjectAft), 'TDish') then begin RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(codedish1), IntToStr(RKCheck.CurrentOrder.GuestsCount)); // add dish end; end;
Скрипт для накопление бонусов в зависимости от времени
Бонусы действуют до 22:00. Гость пришел в 21:50, заказал сок за 100р. В 22:20 заказал пирожок за 50р. В 22:40 (или в час ночи) попросил счёт и дал карту - бонусы должны начислиться на сок, но не на пирожок, несмотря на время проведения картой.
Скрипт для события OnAfterCheckViewEdit у объекта CheckView на форме редактирования заказа:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, cntDish, DishCode: integer; it: TCheckItem; a, Price: double; CurrTime, Time1: TDateTime; begin DishCode := 43; // код блюда с открытой ценой Time1 := EncodeTime(18,05,00,00); // граничное время if (AEditType=etInsert)or(AEditType=etChange) then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if (TDish(AObjectAft).Code <> DishCode) then begin a := 0; cntDish := 0; Price := 0; CurrTime := Time; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if (TDish(it).Code = DishCode) then cntDish := cntDish + 1 else begin if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then a := a + TDish(it).PRListSum; end; end; if (a > 0.00001) then begin if (cntDish = 0) then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) // ?????????? ? ????? ????? ? ????? 43 else begin if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; 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 begin if (TDish(it).Code = DishCode) then if a <> TDish(it).UserPrice then 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; if CurrTime < Time1 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) end; if CurrTime < Time1 then if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then begin TDish(RKCheck.CurrentCheckItem).IsUserPrice := true; TDish(RKCheck.CurrentCheckItem).UserPrice := a; end; end; end; end;
Скрипт для события OnBeforeCheckViewEdit у объекта CheckView на форме редактирования заказа:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, j, cntDish, DishCode: integer; it: TCheckItem; a, Price: double; CurrTime, Time1: TDateTime; begin DishCode := 43; // код блюда с открытой ценой Time1 := EncodeTime(18,05,00,00); // граничное время if (AEditType=etRemove) then // etChange etRemove if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then if (TDish(AObjectBef).Code <> DishCode) then begin a := 0; cntDish := 0; Price := 0; CurrTime := Time; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if (TDish(it).Code = DishCode) then cntDish := cntDish + 1 else begin if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then a := a + TDish(it).PRListSum; end; end; // if (StrToTime(TimeToStr(TDish(AObjectBef).Session.StartService)) < Time1) then // учитывать сумму удаляемого блюда / раскоментировать когда будет исправлен баг a := a - TDish(AObjectBef).PRListSum; if (a > 0.00001) then begin if (cntDish = 0) then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) else if CurrTime < Time1 then begin if GUI.CheckFormInPayMode then Exit; if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit; 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 begin if (TDish(it).Code = DishCode) then if a <> TDish(it).UserPrice then if it.State = disOpened then begin if trk7menuItem(TDish(it).RefItem).OpenPrice then begin TDish(it).IsUserPrice := true; TDish(it).UserPrice := a; end; end else RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); end; RK7.PerformOperation(rkoDown, 0); end; end; end; end; end;
В скриптах задать соответствующие значения для DishCode и Time1.
Скрипт, оставляющий скидку в заказе при печати пречека
procedure DiscountUsage1001731(UsageParameters: TDiscountUsageParameters); var i: integer; it: TCheckItem; a: double; begin a := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then a := a + TDish(it).PRListSum else if SYS.ObjectInheritsFrom(TObject(it), 'TChargeLine') then a := a + TChargeLine(it).CalcAmount; end; if a >= 150 then UsageParameters.UsageMode := umAuto else UsageParameters.UsageMode := umDeny; end;
Скрипт на добавлении скидки при заказе любых двух блюд с доставкой или самовыносом
Системы доставки нет. Вся доставка просто бьется на стол 80, а самовынос - на стол 70.
Скрипт для объекта CheckView в событии OnBeforeCheckViewEdit
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var ToPaySum, sumDiscount : double; i, CntDicount, DiscCode, sumActtion: integer; it: TCheckItem; begin CntDicount := 0; DiscCode := 18; // код суммовой скидки добавляемой по акции sumActtion := 700; // сумма чека для активации акции sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки) ToPaySum := RKCheck.CurrentOrder.ToPaySum; if AEditType = etRemove then begin 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 (it.Code = DiscCode) then CntDicount := CntDicount + 1; end; if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then ToPaySum := ToPaySum - TDish(AObjectBef).PRListSum; if CntDicount > 0 then ToPaySum := ToPaySum + sumDiscount; if ToPaySum >= sumActtion+sumDiscount then begin if CntDicount = 0 then RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0)); end else if CntDicount > 0 then 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 (it.Code = DiscCode) then begin RKCheck.DeleteCheckItem(it); CntDicount := 0; end; end; end; end;
Для объект CheckView в событии OnAfterCheckViewEdit
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var ToPaySum, sumDiscount, sumActtion: double; i, CntDicount, DiscCode: integer; it: TCheckItem; begin CntDicount := 0; DiscCode := 18; // код суммовой скидки добавляемой по акции sumActtion := 700; // сумма чека для активации акции sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки) if not(AEditType = etRemove) 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(TObject(it), 'TDiscountItem') then if (it.Code = DiscCode) then CntDicount := CntDicount + 1; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin if AEditType = etInsert then ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum else if AEditType = etChange then ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum - TDish(AObjectBef).PaySum; end; if ToPaySum >= sumActtion+sumDiscount then begin if CntDicount = 0 then RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0)); end else if CntDicount > 0 then 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 (it.Code = DiscCode) then begin RKCheck.DeleteCheckItem(it); CntDicount := 0; end; end; end; end;
Скрипт на перенос блюда со 100% скидкой в отдельный пакет
Если 100% скидка применяется на блюдо, у которого цена в момент добавления скидки больше 0, то тогда такое блюдо перемещается в новый пакет с нулевой ценой.
При переносе блюда — название скидки сохраняется под этим блюдом. И потом можно посмотреть отчет по этим скидкам
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); begin if AEditType = etInsert then begin if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then if (TDiscountItem(AObjectAft).Code = 1000105) then // discount code begin if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then begin TDish(RKCheck.CurrentCheckItem).IsUserPrice := true; TDish(RKCheck.CurrentCheckItem).UserPrice := 0; end; RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TDish') then if RKCheck.CurrentCheckItem.Session.iKurs <> 1000155 then RKCheck.DeleteCheckItem(TDiscountItem(AObjectAft)); end; end; end;
Проверка статуса блюда.
procedure ProcessOperation1001712(Parameter: integer); var it: TCheckItem; i, code: integer; qntnew, qntold, pricenew: double; CurItem: TCheckItem; ed: TObject; begin qntnew := 0; pricenew := 100; if not RKCheck.Valid then exit //important checking else begin CurItem := RKCheck.CurrentCheckItem; if not(TDish(CurItem).State = disOpened) then begin gui.showmessage('You can''t move saved dish!!!'); exit; end; ed := TObject(gui.FindComponentByName('Editor')); if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then if (length(TNumEditor(ed).Text)>0) then qntnew := StrToFloat(TNumEditor(ed).Text) else qntnew := 1; if SYS.ObjectInheritsFrom(TObject(CurItem), 'TDish') then if (TDish(CurItem).quantity > qntnew) and (qntnew > 0) then begin TNumEditor(ed).Text := FloatToStr(TDish(CurItem).quantity-qntnew); RK7.PerformOperation(rkoEditAmount, 0); code := CurItem.code; RK7.PerformOperation(rkoDown, 0); RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(code), IntToStr(Trunc(qntnew))); // add dish end; end; TNumEditor(ed).Text := FloatToStr(qntnew); // RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course RK7.PerformOperation(rkoMoveCurrentDishToSes, 1) // ident of course TNumEditor(ed).Text := ''; RK7.PostOperation(rkoDiscountSelector, 0); end;
Скрипт, выводящий сообщение при добавлении спецблюд
Необходимо, чтобы при пробитии комбо-блюд, относящихся к классификации «49 рублей» на экране выходило информационное окно с текстом «предложи добавку за 49 рублей»
1) Назначить скрипт на событие OnAfterCheckViewEdit объекта CheckView в форме редактирования заказа:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var Categ: TClassificatorGroup; begin if AEditType = etInsert then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if TDish(AObjectAft).IsCombo then begin Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 8)); // указать код классификации if Categ.IsChild(TDish(AObjectAft).RefItem) then gui.ShowMessage('предложи добавку на 49 рублей'); end; end;
2) Добавить расширенное свойство в ресторане
Message_Addon_49
3) Назначить скрипт на форму быстрого чека
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var Categ: TClassificatorGroup; begin if ( TRK7Restaurant(RK7.CashGroup.MainParent).genMessage_Addon_49='1') then if AEditType = etInsert then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if TDish(AObjectAft).IsCombo then begin Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 144)); // указать код классификации if Categ.IsChild(TDish(AObjectAft).RefItem) then gui.ShowMessage('Предложи Гостю добавку к комбо за 49 руб'); end; end;
Для того ,чтобы в ресторане начали показывать сообщение, нужно указать «1» в расширенном свойстве Message_Addon_49
Скрипт по принудительному выбору консуманта при выборе блюда
На форме редактирования чека у объекта CheckView в событии OnAfterCheckViewEdit указать скрипт открывающий выбор консуманта при добавлении определённого блюда:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); var i, DishCode: integer; it: TCheckItem; begin DishCode := 13; // код контролируемого блюда if (AEditType=etInsert)or(AEditType=etChange) then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if (TDish(AObjectAft).Code = DishCode) then begin RK7.PerformOperation(rkoConsumatorSelector, 1); end; end;
На форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт запрещающий продолжать работу при печати чека или пречека в случае отсутствия консуманта у контролируемого блюда:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, DishCode: integer; it: TCheckItem; begin DishCode := 13; // код контролируемого блюда if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека 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 begin // checking by Consumators if TDish(it).Consumators.Count = 0 then begin gui.ShowMessage('Операция запрещена, т.к. не выбран консумант!'); AContinue := false; end; end; end; end;
Чтобы запретить выход из чека, если у блюда нет косуманта, то необходимо заменить устовие в строке:
if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека
на
if (AVerifyType = vtBeforeSave)or(AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при сохранении заказа, печати чека и пречека
Скрипт на автоматическое изменение цены
Необходимо при продаже кофе вместе с любым блюдом из классификации (не категории) «Food» менять цену кофе
procedure ChangePrice; var i, CategCode1, CategCode2, Categ2DishCnt, course1, course2: integer; Categ1, Categ2: TClassificatorGroup; it, CurItem: TCheckItem; CheckView: TCheckView; begin //********** Set parameters ***********// course1 := 1002378; // ident of course 1 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при наличии в заказе блюд из категории 2 course2 := 1002379; // ident of course 2 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при отсутсвии в заказе блюд из категории 2 CategCode1 := 8; // code of category for cofe // код категории 1 CategCode2 := 27; // code of category FOOD // код категории 2 //********** Set parameters ***********// CheckView := TCheckView(GUI.FindComponentByName('CheckView')); if CheckView = Nil then Exit; Categ2DishCnt := 0; Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));//category code Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));//category code for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDish') then if Categ2.IsChild(TDish(it).RefItem) then if TDish(it).Quantity > 0 then Categ2DishCnt := Categ2DishCnt + 1; end; CurItem := RKCheck.CurrentCheckItem; 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 (Categ1.IsChild(TDish(it).RefItem)) then // checking category of dish if Categ2DishCnt > 0 then begin if TRk7MenuItem(it.RefItem).Kurs <> course1 then RK7.PerformOperation(rkoMoveCurrentDishToSes, course1) // change course end else begin if TRk7MenuItem(it.RefItem).Kurs <> course2 then RK7.PerformOperation(rkoMoveCurrentDishToSes, course2); // change course; end; RK7.PerformOperation(rkoDown, 0); end; if CurItem <> Nil then CheckView.GotoItem(CurItem); end; procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject); begin ChangePrice; end; procedure CheckViewCurItemChangedScript(Sender: TObject); begin ChangePrice; end;