OnOrderVerify
Скрипт на автоматическое добавление группы меню в заказ
В заказе группа должна отображаться строкой, при нажатии на которую была бы возможность, либо пробить блюдо, находящееся в ней, либо удалить строку.
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;
Скрипт для создание акций 2+1 и 3+1
Скрипт необходимо повесить на событие OnOrderVerify у компонента CheckView в форме редактирования чека. Скидка посчитается и добавится в чек при печати пречека.
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) // пречек // or (AVerifyType=vtBeforeSave) // сохранение заказа // or (AVerifyType=vtFirstPay) // ввод первого платежа // or (AVerifyType=vtPrintReceipt) // печать чека 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 else tdisc := 3; // акция 3+1 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 categore 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;
Скрипт на добавлении скидки при использовании карты ПДС
Алгоритм работы:
1. При прокатывании ПДС карты (обработчик OnProcessCard) скрипт проверяет можно ли будет добавлять скидку на блюдо.
2. Если не применялась, то скрипт ищет блюдо, на которое можно дать 100%:
2.1 На это блюдо дается 100%
2.2. В заказ добавляется скидка "СКИДКА ИСПОЛЬЗОВАНА". Добавляется через PerformMCRAlgoritm, чтобы в скидке прописался код карты.
У скидки «СКИДКА ИСПОЛЬЗОВАНА» должны быть выставлен флаг «Не вручную» и не отмечено «Печатать нулевые».
Скрипт нужно вставить в метод OnProcessCard на форме редактирования заказа.
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; // идентификатор интерфейса ПДС 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); // здесь 1000308 заменить на соотвествующее значение поля SIFR из SQL-таблицы [DISCOUNTS] для 100% скидки. 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;
Создать MCR-скрипт с такими настройками:
Основное — Область: Скидка
Основное — Объект: СКИДКА ИСПОЛЬЗОВАНА
Основное — Типы устройств — Скрипт: поставить галочку
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;
Скрипт, показывающий сообщение после печати слипов авторизации или печати чека, если оплата была картой MasterCard
В форме заказа у объекта CheckView в событии OnOrderVerify указать скрипт:
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;
Скрипт для автоматического LogOut после каждой продажи в Quick Sale Mode
На форме быстрого чека у объекта CheckView в событии OnOrderVerify указать скрипт:
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;
Скрипт на добавления в заказ подарочного блюда, в зависимости от суммы заказа и количества гостей
В форме редактирования заказа у объекта CheckView в событии OnOrderVerify указать скрипт:
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; // лимит для предложения подарка GuestTypeCode := 2; // код типа гостя if (AVerifyType=vtBill) // пречек 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('В заказ будет добавлено блюдо "Открытка..." в количестве '+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' штук, блюдо "Подарочный набор",'+#10#13+'не забудьте вынести гостю подарок'); RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) ); // открытки RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) ); // подарок end else begin gui.showmessage('В заказ будет добавлено блюдо "Открытка..." в количестве '+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' штук,'+#10#13+'не забудьте вынести гостю подарок'); RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) ); // открытки end; end; end;
Скрипт для изменения стоимости доставки в зависимости от зоны доставки
Стоимость доставки в зону 1 - 600 рублей, в зону 2 - 750 рублей. Если стоимость заказа в зону 1 больше 600 рублей, тогда доставка бесплатная.
Скрипт размещается в событии OnOrderVerify объекта CheckView расположенного на форме редактирования чека:
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; // лимит для платной доставки 1 limit2 := 750; // лимит для платной доставки 2 limit3 := 850; // лимит для платной доставки 3 limit4 := 950; // лимит для платной доставки 4 ZoneId1 := 2; // идентификатор зоны доставки 1 ZoneId2 := 3; // идентификатор зоны доставки 2 ZoneId3 := 4; // идентификатор зоны доставки 3 ZoneId4 := 5; // идентификатор зоны доставки 4 if (AVerifyType=vtBill) // пречек 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
Есть блюда, которые доступны только держателям клубных карт. При выборе этого блюда должно появляться окно — «Используйте карту 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 только быстрым чеком
Необходимо разрешить оплату картами 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;
Скрипт на печать финального чека в R_Keeper_7
Ресторан работает под ООО и ИП. В ООО - фискальный регистратор и накопитель. В ИП — роловый принтер. В качестве чекового принтера — фискалкальный регистратор, на котором задана классификация — отдел ФР. Необходимо, чтобы кроме этих двух разделенных чеков, дополнительно печатался третий — общий, на роловом принтере.
Создать макет в "Прочее -- Пользовательский макет" Загрузить в него макет чека. Создать для него представление печати в схемах печати.
В форме редактирования чека у объекта 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 подставите код представления своего чека. Печать будет происходить сразу после печати основного чека.