В заказе группа должна отображаться строкой, при нажатии на которую была бы возможность, либо пробить блюдо, находящееся в ней, либо удалить строку.
In the order, the group should be displayed as a line. When clicking on it, it would be possible to either add the dish from the group or delete the line.
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if AVerifyType = vtNewQuickCheck then if RKCheck.CurrentOrder.IsEmpty then RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, 5 {Menu group code})); end; |
Insert the script in the OnOrderVerify event of the CheckView component on the check editing form. The discount will be calculated and added to the receipt when the bill is printed.
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i: integer; i2, j, j2, t1, cntdisc, tdisc, DiscCode: integer; it, CurItem, ds: TCheckItem; SL: TStringList; a, q, Price: double; minPrice1, cnt1: double; d, dd: TDish; CheckView: TCheckView; begin // Before print if (AVerifyType=vtBill) // bill // or (AVerifyType=vtBeforeSave) // save order // or (AVerifyType=vtFirstPay) // first payment input // or (AVerifyType=vtPrintReceipt) // print receipt then begin DiscCode := 11; // code of discount CheckView := TCheckView(GUI.FindComponentByName('CheckView')); if CheckView = Nil then Exit; cntdisc := 0; CurItem := RKCheck.CurrentCheckItem; SL := TStringList.Create; try // Create list of the dishes, sorted by price SL.Sorted := False; 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 cntdisc := cntdisc + 1; j2 := i; end; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if ((it.State = disOpened) or (it.State = disPrinted)) then begin if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price else Price := TDish(it).PRListSum/TDish(it).Quantity; SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI), TObject(it)); end; end; minPrice1 := 0; cnt1 :=0; if (RKCheck.CurrentOrder.TableCode = 2) then // different discounts for different tables tdisc := 2 // 2+1 special offer else tdisc := 3; // 3+1 special offer 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; // if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin if (d.RefItem.MainParent.code = 1) then // if dish from category of menu and have same code begin cnt1 := cnt1 + d.Quantity; if 0.00 = minPrice1 then begin dd := TDish(SL.Objects[i]); minPrice1 := Price; end; // else if (Price < minPrice1) then begin dd := TDish(SL.Objects[i]); minPrice1 := Price; end; end; end; a := minPrice1; if ((cntdisc > 0)and(cnt1<tdisc)) then for i2 := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i2]; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then if (it.Code = DiscCode) then begin RKCheck.DeleteCheckItem(it); cntdisc := 0 end; end; // Create discount to a dish if ((cntdisc = 0) and (a > 0) and (cnt1 >= tdisc)) then begin CheckView.GotoItem(TObject(dd)); RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a)); end; end; finally SL.Free(); if CurItem <> Nil then CheckView.GotoItem(CurItem); end; RKCheck.CurrentOrder.Recalc(); end; end; |
The operation algorithm:
У скидки «СКИДКА ИСПОЛЬЗОВАНА» должны быть выставлен флаг «Не вручную» и не отмечено «Печатать нулевые».
Скрипт нужно вставить в метод OnProcessCard на форме редактирования заказа.
The «DISCOUNT USED» discount must have the «Not manually» flag set and the «Print nulls» option unchecked.
Insert the script in the OnProcessCard method on the order editing form.
procedure DesignFormOnProcessCard(IntfID, EntranceCardType: integer; CardCode: string; RKCardInfo: TRKCardInfo; var res: integer); var i,fst,dsk, CntDsk: integer; it,it2: TCheckItem; DeviceID : integer; begin fst:=-1; dsk:=0; CntDsk:=0; DeviceID := 0; // PDC interface ID 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 ((it.CODE = 5502) OR (it.CODE = 1003)) then // code of dishes begin fst:=i; it2 := it; end; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then if ((it.CODE = 11)) then // code of 100% discounts for dish dsk:=1; end; //function GetDiscountCount(const Sifr: integer; IntfID: integer; const CardCode: string): integer; CntDsk := RKCheck.GetDiscountCount(1000308, DeviceID, CardCode); // replace 1000308 with the corresponding value of the SIFR field from the SQL table [DISCOUNTS] for a 100% discount. If (fst>=0) and (dsk=0) and (CntDsk=0) then begin RK7.PerformOperation(rkoHome, 0); repeat it := RKCheck.CurrentCheckItem; if TObject(it) <> TObject(it2) then RK7.PerformOperation(rkoUp, 0); until ( TObject(it) = TObject(it2)) or ( TObject(it) = Nil); RKCheck.CreateCheckItem(rkrefDiscounts, '11', FloatToStr(100)); // add discount // 11 change on 100% discount for dish Data := 'CardCode'; RK7.PerformMCRAlgorith('8989=', DeviceID); end; end; |
Create an MCR script with the following settings:
Basic — Scope: Discount
Basic — Object: DISCOUNT USED
Basic — Device Types — Script: check the box
function MCR1001146(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean; var RestCode: integer; begin Result := False; if pos('8989=', Parameter) = 1 then begin Result := True; end; end; |
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, Interval, RND, DEV,happynum, CntDish, HaveSpecialDish: integer; rr : double; tt: string; it: TCheckItem; begin //************************************// // stop service without special dish // //************************************// if (AVerifyType = vtBeforeSave) then begin HaveSpecialDish := 0; 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 if (TDish(it).Quantity <> 0) then begin CntDish := CntDish + 1; if ((it.CODE = 5502) OR (it.CODE = 1003)) then HaveSpecialDish := HaveSpecialDish + 1; end; end; if (CntDish>0) and (HaveSpecialDish = 0) then begin // gui.showmessage('Нет обязательного блюда! Сохранение запрещено'); if GUI.RKMessageDlg('Return to edit order?', 0, 3, 10000) = 6 then AContinue := False else AContinue := True; end; end; //************************************// // stop service without special dish // //************************************// // show meessage on special order Interval := 10; DEV := 5; tt := TimeToStr(time); rr := 10*1/StrToInt(Copy(tt,length(tt)-1,2)); happynum := trunc(Interval + rr*DEV - trunc(DEV/2)); // GUI.ShowMessage('Happy Num='+IntToStr(happynum)); // GUI.ShowMessage('Happy Time='+tt+' --'+Copy(tt,length(tt)-1,2)); if (AVerifyType = vtBill) and (happynum=RKCheck.CurrentOrder.SeqNumber) then begin GUI.ShowMessage('Happy Order '+IntToStr(RKCheck.CurrentOrder.SeqNumber)); // ss := RKCheck.CurrentOrder.OrderName; // CheckView.Tag:=1; end; end; |
On the order form for the CheckView object, insert the script in the OnOrderVerify event:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i: integer; it: TCheckItem; begin if (AVerifyType = vtAfterReceipt) then begin for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if Pos('MASTERCARD', UpperCase(TPayLine(it).Owner)) > 0 then gui.ShowMessage('Ta-Da-a!'); end; end; end; |
On the quick check form, insert the script for the CheckView object in the OnOrderVerify event:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if (AVerifyType=vtAfterReceipt) then begin RK7.PostOperation(rkoOk,0); RK7.PostOperation(rkoUnregister,0); end; end; |
On the order editing form, insert the script for the CheckView object in the OnOrderVerify event:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var DishCode, DishCode2, GuestTypeCode: integer; limit: double; begin DishCode := 43; // special dish code DishCode2 := 46; // special dish2 code limit := 5000; // gift offer limit GuestTypeCode := 2; // guest type code if (AVerifyType=vtBill) // bill then if RKCheck.CurrentOrder.Visit.GuestType <> 0 then if RK7.FindItemBySifr(rkrefGuestTypes, RKCheck.CurrentOrder.Visit.GuestType).Code = GuestTypeCode then begin if RKCheck.CurrentOrder.ToPaySum >= limit then begin gui.showmessage('The "Postcard..." dish will be added to the order in the amount of'+IntToStr(RKCheck.CurrentOrder.GuestsCount)+'servings, dish "Gift set",'+#10#13+'don't forget to bring guest a gift'); RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) ); // postcards RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) ); // gift end else begin gui.showmessage('The "Postcard..." dish will be added to the order in the amount of'+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' servings,'+#10#13+'don't forget to bring guest a gift'); RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) ); // postcards end; end; end; |
The cost of delivery to zone 1 is 600 rubles, to zone 2 — 750 rubles. If the cost of the order in zone 1 is more than 600 rubles, then the delivery is free.
The script is inserted in the OnOrderVerify event of the CheckView object located on the check editing form:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var DishCode1, DishCode2, DishCode3, DishCode4, ZoneId1,ZoneId2,ZoneId3,ZoneId4: integer; limit1, limit2, limit3, limit4: double; begin DishCode1 := 43; // special dish1 code DishCode2 := 46; // special dish2 code DishCode3 := 47; // special dish3 code DishCode4 := 48; // special dish4 code limit1 := 600; // paid delivery limit 1 limit2 := 750; // paid delivery limit 2 limit3 := 850; // paid delivery limit 3 limit4 := 950; // paid delivery limit 4 ZoneId1 := 2; // delivery zone 1 ID ZoneId2 := 3; // delivery zone 2 ID ZoneId3 := 4; // delivery zone 3 ID ZoneId4 := 5; // delivery zone 4 ID if (AVerifyType=vtBill) // bill if (AVerifyType=vtBill) // bill !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! then if RKCheck.CurrentOrder.ZoneID > 0 then begin if RKCheck.CurrentOrder.ZoneID = ZoneId1 then if RKCheck.CurrentOrder.ToPaySum <= limit1 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), IntToStr(1) ); // доставка 1 if RKCheck.CurrentOrder.ZoneID = ZoneId2 then if RKCheck.CurrentOrder.ToPaySum <= limit2 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) ); // доставка 2 if RKCheck.CurrentOrder.ZoneID = ZoneId3 then if RKCheck.CurrentOrder.ToPaySum <= limit3 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode3), IntToStr(1) ); // доставка 3 if RKCheck.CurrentOrder.ZoneID = ZoneId4 then if RKCheck.CurrentOrder.ToPaySum <= limit4 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode4), IntToStr(1) ); // доставка 4 end; end; |
Есть блюда, которые доступны только держателям клубных карт. При выборе этого блюда должно появляться окно — «Используйте карту PDS». Если нет карты, то блюдо в чек не попадает.
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, DishCode1, DishCode2, DishCode3, DiscountCode1, DiscountCode2, DiscountCode3, CardPresent,DishPresent: integer; CardCode: string; it: TCheckItem; begin DishCode1 := 1; DiscountCode1 := 12; DiscountCode2 := 13; DiscountCode3 := 14; CardPresent := 0; DishPresent := 0; CardCode := ''; if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then begin 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 (TDish(it).code = DishCode1) then //Check category of the dish if TDish(it).Quantity > 0 then DishPresent := DishPresent + 1; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check discount lines only if (TDiscountItem(it).code = DiscountCode1) or(TDiscountItem(it).code = DiscountCode2) or(TDiscountItem(it).code = DiscountCode3) then // определение ПДС-карты по наличию ПДС-скидки CardPresent := 1; end; if DishPresent > 0 then if CardPresent > 0 then AContinue:= True else { if GUI.RKMessageDlg('Есть специальные блюда, прокатайте карту ПДС' ,0,3, 10000)=6 then AContinue := false else AContinue := True; } begin // gui.showmessage('В заказе есть специальные блюда, прокатайте картой ПДС'); gui.showmessage('Специальных блюд: '+inttostr(DishPresent)+' ; Найдено карт в заказе: '+inttostr(CardPresent)); // тестовая строка AContinue := false; end; end; if (AVerifyType = vtBill) or(AVerifyType = vtPrintReceipt) or (AVerifyType=vtBeforeSave) 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 CheckDishCode(TDish(it).Code) 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;
Необходимо разрешить оплату картами PDS только в случае, если заказ создан с помощью кнопки «Быстрый чек».
На форме быстрого чека у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if AVerifyType = vtNewQuickCheck then if RKCheck.CurrentOrder.IsEmpty then RKCheck.CurrentOrder.UserTag2 := 33; end; В MCR-скрипт добавить строку с проверкой заданного пользователького тега: if (RKCheck.CurrentOrder.UserTag2 = 33) then
Необходимо сделать так, чтобы к одним блюдам был привязан один консумант, а к другим — два консуманта.
Для этого в параметре задайте ограничение консумантов — 2, а скриптом ограничьте блюда специальной категории одним консумантом.
На форме редактирования заказа у объекта CheckView в событии OnOrderVerify укажите скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i,j,CntConsumators,MaxQntConsumCateg1:integer; it: TCheckItem; CategCode2: integer; Categ2: TClassificatorGroup; begin //************************* Set parameters ******************************// CategCode2 := 8; // категория контролируемых блюд MaxQntConsumCateg1 := 1; //************************* Set parameters ******************************// Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2)); if (AVerifyType = vtBeforeSave)or(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(TObject(it), 'TDish') then begin CntConsumators := 0; CntConsumators := TDish(it).Consumators.Count; //dbg.dbgprint(' блюдо '+TDish(it).Name +' модификаторов '+inttostr(CntConsumators)); if not(Categ2.IsChild(it.RefItem)) then //Check category of the dish if CntConsumators>MaxQntConsumCateg1 then begin AContinue := False; gui.showmessage('Превышено количество консумантов у блюда '+TDish(it).Name); end; end; end; end;
Акция — Подарок от суммы заказа. От 1000 рублей — одно блюдо бесплатно,
от 1200 - одно из двух на выбор.
Необходимо чтобы кассир не смог рассчитать заказ от 1000 рублей, если в нём нет подарочного блюда.
Cкрипт разместить на форме редактирования заказа у объекта CheckView в событии OnOrderVerify
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, CntDish, HaveSpecialDish, SpecialDishCode1, SpecialDishCode2: integer; LimitSum : double; it: TCheckItem; begin //************************************// // stop service without special dish // //************************************// //********** Set parameters ***********// SpecialDishCode1 := 23; // код блюда SpecialDishCode2 := 24; // код блюда LimitSum := 1000; // сумма чека, свыше которой требовать наличие подарочного блюда //********** Set parameters ***********// if ((AVerifyType=vtBill) // пречек or (AVerifyType=vtBeforeSave) // сохранение заказа or (AVerifyType=vtFirstPay) // ввод первого платежа or (AVerifyType=vtPrintReceipt)) // печать чека then begin HaveSpecialDish := 0; 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 if (TDish(it).Quantity <> 0) then begin CntDish := CntDish + 1; if (it.CODE = SpecialDishCode1)or(it.CODE = SpecialDishCode2) then HaveSpecialDish := HaveSpecialDish + 1; end; end; if (HaveSpecialDish = 0)and(RKCheck.CurrentOrder.ToPaySum >= LimitSum) then begin gui.showmessage('Нет подарочных блюд!'); AContinue := False end; end; //************************************// // stop service without special dish // //************************************// end;
Для организации питания персонала введено:
- два типа гостя («Гость» и «Персонал») и дополнительный тип цены;
- тип цены для персонала привязан к типу гости «Персонал»;
- для оплаты заказа по ценам для персонала используется две специальные валюты.
Скрипт ограничивает оплату только данными типами валют при выборе типа гостя «Персонал»
Версия кассовой системы 7.5.2.377
В форме редактирования заказ у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, CntDish, HaveSpecialDish, HaveDiscount: integer; it: TCheckItem; HaveAnotherCurr: integer; begin //***********41012********************// if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // if RKCheck.CurrentOrder.GuestType = 'Персонал' then if RKCheck.CurrentOrder.Visit.GuestType <> 0 then if RK7.FindItemBySifr(rkrefGuestTypes, RKCheck.CurrentOrder.Visit.GuestType).Code = 2 then begin HaveAnotherCurr := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if (TPayLine(it).Code <> 98)and(TPayLine(it).Code <> 99) then //Код валют для персонала HaveAnotherCurr := HaveAnotherCurr + 1; end; if (HaveAnotherCurr>0) then begin AContinue := False; gui.showmessage('Запрещённая валюта для этого заказа!'); end; end; //***********41012********************// end;
Ресторан работает под ООО и ИП. В ООО - фискальный регистратор и накопитель. В ИП — роловый принтер. В качестве чекового принтера — фискалкальный регистратор, на котором задана классификация — отдел ФР. Необходимо, чтобы кроме этих двух разделенных чеков, дополнительно печатался третий — общий, на роловом принтере.
Создать макет в "Прочее -- Пользовательский макет" Загрузить в него макет чека. Создать для него представление печати в схемах печати.
В форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if (AVerifyType=vtAfterReceipt) then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,219)); // код представления печати end; end;
Вместо «219» указать код представления печати пользовательского макета.
Наценка «Обслуживание 10%» действует только на официантов и рассчитывается от суммы заказа. Набор скидок (5%, 10%, Сотрудник, Приват) рассчитывается от суммы заказа.
Скидки «Сотрудник» (код 5) и «Приват» (код 6) убирают наценку.
На форме редактирования чек у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i,dsk1, dsk2: integer; it, it2: TCheckItem; begin dsk1 := 0; // счётчик скидок отменяющих наценку dsk2 := 0; // счётчик наценок for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscount') then Begin if ((it.CODE = 5) or (it.CODE = 6)) then // коды скидок отменяющих наценку dsk1 := dsk1 + 1; if (it.CODE = 10) then // код наценки begin dsk2 := dsk2 + 1; it2 := it; end; End; end; if (dsk1 > 0) and (dsk2 > 0) then RKCheck.DeleteCheckItem(it2); // удаление наценки end;
Если в чеке есть блюдо пополнения или активации — стол невозможно закрыть без применения карты лояльности
Скрипт проверяет наличие в заказе указанного блюда и скидки. Если блюдо есть, а скидки нет, то выводится сообщене и блокируется действие, пока не добавят скидку или удалят блюдо.
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, Interval, RND, DEV,happynum, CntDish, HaveSpecialDish, HaveSpecialDisc, SpecialDishCode, SpecialDiscCode: integer; rr : double; tt: string; it: TCheckItem; begin //************************************// // stop service without special dish // //************************************// if ((AVerifyType=vtBill) // пречек or (AVerifyType=vtBeforeSave) // сохранение заказа or (AVerifyType=vtFirstPay) // ввод первого платежа or (AVerifyType=vtPrintReceipt)) // печать чека then begin SpecialDishCode := 23; // код блюда SpecialDiscCode := 10; // код скидки HaveSpecialDish := 0; HaveSpecialDisc := 0; 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 if (TDish(it).Quantity <> 0) then begin CntDish := CntDish + 1; if (it.CODE = SpecialDishCode) then HaveSpecialDish := HaveSpecialDish + 1; end; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then if (it.CODE = SpecialDiscCode) then HaveSpecialDisc := HaveSpecialDisc + 1; end; if (HaveSpecialDisc = 0) and (HaveSpecialDish > 0) then begin gui.showmessage('Нет обязательной скидки!'); AContinue := False end; end; //************************************// // stop service without special dish // //************************************// end;
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, CntDish2, CntDish3, CntDish4, CodeDish2, CodeDish3_1, CodeDish3_2, CodeCateg4_1, CodeCateg4_2: integer; it: TCheckItem; Categ: TClassificatorGroup; s1: string; begin s1 := FormatDateTime('hh',Now); CntDish2 := 0; CntDish3 := 0; CntDish4 := 0; CodeDish2 := 10; // код блюда CodeDish3_1 := 100; // код блюда CodeDish3_2 := 105; // код блюда CodeCateg4_1 := 5; // код категории "салат" CodeCateg4_2 := 8; // код категории "напиток" for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin if TDish(it).Code = CodeDish2 then CntDish2 := CntDish2 + 1; if (TDish(it).Code = CodeDish3_1) or (TDish(it).Code = CodeDish3_2) then CntDish3 := CntDish3 + 1; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CodeCateg4_1)); if Categ.IsChild(it.RefItem) then CntDish4 := CntDish4 + 1; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CodeCateg4_2)); if Categ.IsChild(it.RefItem) then CntDish4 := CntDish4 + 1; end end; if AVerifyType = vtPrintReceipt then if StrtoInt(s1) <= 18 then Begin // сумма заказа >= 500 руб. if (RKCheck.CurrentOrder.ToPaySum >= 500) {and (RKCheck.CurrentOrder.ToPaySum < 1000)} then RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3031)) else // в заказе есть блюдо с кодом "ххх" if (CntDish2 > 0) then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3032)); end else // в заказе есть блюдо с кодом "100" и "105" if (CntDish3 > 0) then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3033)); end else // в заказе есть блюдо из категории "салат" или "напиток" if (CntDish4 > 0) then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3034)); end; end; end;
На форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i: integer; minweight: double; it: TCheckItem; begin minweight := 0.3; // установка минимального веса для продажи if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then begin 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).Quantity>0.0 then if SYS.ObjectInheritsFrom(it, 'TPortion') then //проверка на весовое блюдо if Tdish(it).Quantity < minweight then begin gui.showmessage('Too small weight! Set more then '+FloatToStr(minweight)); AContinue := False; end; end; end; end;
Алгоритм :
1.Официант пробивает блюдо/напиток по акции (с литерой А)
2.Нажимает «сохранить заказ». После этого всплывает окно «Требуется подтверждение картой менеджера»
3. Менеджер поводит своей картой (контролирует в этот момент корректность применения акции), после чего всплывает окно «Сохранить заказ».
4. После этого пробитые блюда печатаются в цеховых принтерах.
На форме редактирования заказа у объекта CheckView в событии OnOrderVerify указать скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, DishCode, CntDish, HaveSpecialDish: integer; it: TCheckItem; begin //************************************// // 57799 // //************************************// if (AVerifyType = vtBeforeSave) then begin DishCode := 25; // code of dish HaveSpecialDish := 0; 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 if (TDish(it).Quantity <> 0) then begin CntDish := CntDish + 1; if (it.CODE = DishCode) then HaveSpecialDish := HaveSpecialDish + 1; end; end; if (CntDish>0) and (HaveSpecialDish > 0) then begin // gui.showmessage('??? ????????????? ?????! ?????????? ?????????'); if RK7.PerformOperation(rkoUser07, 0)=1 then AContinue := True else AContinue := False; end; end; //************************************// // 57799 // //************************************// end;
Для пользовательской операции (в примере используется операция №7) задать пустой скрипт:
procedure ProcessOperation1001837(Parameter: integer); begin end;
В свойствах операции выставить галочку «Контроль доступа» и назначить права соотвествующему пользователю.
В форме редактирования чека у компонента CheckView в событии OnOrderVerify укажите скрипт:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); var i, CntDish, HaveSpecialDish: integer; it:Tcheckitem; begin //************************************// // stop service without special dish // //************************************// if (AVerifyType = vtBeforeSave) then begin HaveSpecialDish := 0; 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 if (TDish(it).Quantity <> 0) then begin CntDish := CntDish + 1; if ((it.CODE = 5502) OR (it.CODE = 1003)) then HaveSpecialDish := HaveSpecialDish + 1; end; end; if (CntDish>0) and (HaveSpecialDish = 0) then begin // gui.showmessage('Нет обязательного блюда! Сохранение запрещено'); if GUI.RKMessageDlg('Return to edit order?', 0, 3, 10000) = 6 then AContinue := False else AContinue := True; end; end; //************************************// // stop service without special dish // //************************************// end;
В строке:
if ((it.CODE = 5502) OR (it.CODE = 1003)) then
указаны коды обязательных блюд. Замените условие в этой строке на своё.
Скрипт для формы «Редактирование заказа(быстрый чек)»
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if (AVerifyType=vtAfterReceipt) then RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,1001965)); end;
Вместо 1001965 подставите код представления своего чека. Печать будет происходить сразу после печати основного чека.