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