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 подставите код представления своего чека. Печать будет происходить сразу после печати основного чека.