OnAfterCheckViewEdit
Скрипт для открытия пользовательского селектора при добавлении в заказ конкретного блюда
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
Categ: TClassificatorGroup;
begin
if TRK7Restaurant(RK7.CashGroup.MainParent).Code = 6 then
if (AEditType = etInsert) and SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin
Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 145)); // oeacaou eia eeanneoeeaoee
if Categ.IsChild(TDish(AObjectAft).RefItem) then
RK7.PostOperation(rkoPrepaySelector, 145);
end;
end;
Скрипт для предложения гостю десерта
Скрипт должен добавит группу меню «десерты» при добавлении группы меню «напитки» и положительном ответе на вопрос.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var MenuCode, GroupMenu: integer;
begin
//********** Set parameters ***********//
MenuCode := 11; // код добавляемого меню "десерты"
GroupMenu := 8; // группы меню "напитки"
//********** Set parameters ***********//
if SYS.ObjectInheritsFrom(AObjectAft, 'TMenuGroupLine') then
begin
if (TMenuGroupLine(AObjectAft).Code = GroupMenu) then
begin
RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, MenuCode )); //Code open menu
end
end
end;
Скрипт для автоматического включения тарификации по времени
В двух ресторанах есть общий зал и отдельные кабины. В общем зале и кабинах есть 10% наценка за обслуживание, а в кабинах дополнительно поминутная тарификация, то есть час пребывания в кабине стоит 40 сомони, а минута стоит около 66 дирамов. Необходимо сделать, чтобы при открытии заказа в кабинах система автоматически включила поминутную тарификацию, а при печати пречека тарификация приостановилась и в пречеке была сумма тарификации. В одном из ресторанов используется «Мобильный официант», а во втором — обычный POS-терминал.
В форме редактирования чека у объекта в событии указать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, CntDish: integer;
it: TCheckItem;
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
CntDish := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
CntDish := CntDish + 1;
end;
if CntDish = 1 then
RK7.PostOperation(rkoAddTariff, 0);
end;
end;
Вместо селектора пречека создать свой вариант и назначить ему пользовательскую операцию со скриптом:
procedure ProcessOperation1001625(Parameter: integer);
begin
RK7.PostOperation(rkoCloseTariff, 0);
end;
Скрипт для изменения модификаторами веса блюда
При добавлении модификаторов с кодами указанными в скрипте, их вес из расширенного свойства будет удаляться из весового блюда:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var j,ModifCode1,ModifCode2,ModifCode3: integer;
ed: TObject;
weight:double;
it: TCheckItem;
begin
ModifCode1 := 98;
ModifCode2 := 98;
ModifCode3 := 100;
weight:=0;
if SYS.ObjectInheritsFrom(AObjectAft, 'TModiItem') then
if (TModiItem(AObjectAft).code = ModifCode1)
or(TModiItem(AObjectAft).code = ModifCode2)
or(TModiItem(AObjectAft).code = ModifCode3) then
begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then Exit;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then Exit;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
begin
weight:= TDish(it).Quantity;
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
begin
weight:=StrToFloat(TModifier(TModiItem(AObjectAft).RefItem).genWeight0419);
TNumEditor(ed).Text := floatToStr(TDish(it).Quantity+(weight/1000)); // + если в модификаторе отрицательный вес блюд и - если в модификаторе положительный вес.
RK7.PerformOperation(rkoEditPortionWeight, 0);
TNumEditor(ed).Text := '';
end;
end;
end;
end;
Скрипт: при заказе 2-х блюд — третье, самое дешевое, в подарок
Если в заказе 6 блюд, соответственно, двум самым дешевым.
На форме редактирования чека у объекта CheckView в событии OnAfterCheckViewEdit указать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
begin
AddEveryOtherDiscount(11{DiscCode}); // 11 суммовая открытая скидка на блюдо
end;
Перед этим скриптом добавить следующий скрипт:
Исправленный вариант:
procedure AddEveryOtherDiscount(DiscCode: integer);
var i, j, k, evr, qntdsc, CategCode: integer;
it, CurItem: TCheckItem;
SL: TStringList;
a, q, Price: double;
d: TDish;
CheckView: TCheckView;
categ: TClassificatorGroup;
begin
evr := 3; // make discount every this count
qntdsc := 0;
CategCode := 5; //5 - paste your category code
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
CurItem := RKCheck.CurrentCheckItem;
SL := TStringList.Create;
try
// Create list of the dishes, sorted by price
SL.Sorted := True;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(it.RefItem) then //Check category of the dish
// it := RKCheck.CurrentOrder.Sessions.Lines[i];
if not(TDish(it).IsComboComp) then
if ((it.State = disOpened) or (it.State = disPrinted)) then begin
// gui.showmessage(TDish(it).name);
if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price
else Price := TDish(it).PRListSum/TDish(it).Quantity;
SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI), TObject(it));
end;
end;
if evr > 0 then
qntdsc := SL.Count div evr;
if SL.Count >= evr then
for i := 0 to SL.Count - 1 do begin
d := TDish(SL.Objects[i]);
a := 0;
q := d.Quantity;
if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price
else Price := d.PRListSum/d.Quantity;
while q + 0.0001 > 1 do begin
//if (i+1) mod evr = 0 then
if ((i+1)<=qntdsc)and(qntdsc>0) then
a := a + Price;
q := q - 1;
end;
// Delete discount, if a sum changed
for j := RKCheck.CheckItemCount(TObject(d.Discounts)) - 1 downto 0 do begin
it := RKCheck.CheckItemByNumber(TObject(d.Discounts), j);
if (it.Code = DiscCode) then begin
if abs(TDiscountItem(it).SrcAmount) = a then
a := 0
else RKCheck.DeleteCheckItem(it);
break;
end;
end;
// Create discount to a dish
if a > 0 then begin
CheckView.GotoItem(TObject(d));
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));
end;
end;
finally
SL.Free();
if CurItem <> Nil then
CheckView.GotoItem(CurItem);
end;
RKCheck.CurrentOrder.Recalc();
end;
Скрипт, автоматически добавляющий подарочное блюдо, если в заказе присутствует определенное блюдо
Скрипт добавляет бонусное блюдо при добавлении акционного блюда из заданной категории.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, j, p, z, CategCode: integer;
Categ: TClassificatorGroup;
it, CurItem: TCheckItem;
DishCode, CntDish1, CntDish2: integer;
CheckView: TCheckView;
DishesCode: TStringList;
begin
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
DishesCode := TStringList.Create;
//********** Set parameters ***********//
DishesCode.Add('27;45'); // код категории акционного блюда для которого добавляется бонусное блюдо ; код бонусного блюда
DishesCode.Add('28;46');
DishesCode.Add('8;43');
//DishesCode.Add('17;24');
//DishesCode.Add('18;25');
//DishesCode.Add('19;26');
//DishesCode.Add('11;27');
//********** Set parameters ***********//
CurItem := RKCheck.CurrentCheckItem;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only
try
for z := 0 to DishesCode.Count-1 do
begin
p:=pos(';',DishesCode.Strings[z]);
CategCode := StrToInt(copy(DishesCode.Strings[z],1,p-1)); // код категории акционного блюда для которого добавляется бонусное блюдо
DishCode := StrToInt(copy(DishesCode.Strings[z],p+1,length(DishesCode.Strings[z])-p)); // код бонусного блюда
//dbg.dbgprint('CategCode = '+inttostr(CategCode)+' DishCode = '+inttostr(DishCode));
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code
//dbg.dbgprint('TDish(AObjectAft).Code = '+inttostr(TDish(AObjectAft).Code));
if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish
begin
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(TDish(AObjectAft).Quantity)); // add bonus dish
end;
end;
finally
DishesCode.Free();
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
RKCheck.CurrentOrder.Recalc(); // нарушается фокусировка, если раскоментировать
end;
Скрипт, добавляющий «блюдо в подарок» для каждого 4-го уникального блюда из категории
Есть блюда категории «шот». Нужно при заказе четырёх одинаковых блюд из этой категории добавлять в заказ на выбор блюдо из категории «пицца». Пицца должна добавиться с нулевой ценой, либо со 100% скидкой.
Скрипт на событие OnAfterCheckViewEdit объекта CheckView, расположенного на форме редактирования чека. Считаются все блюда в категории и на каждое n-ое добавляется бонусное блюдо.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, j, CategCode, every, p1, p2: integer;
Categ: TClassificatorGroup;
it, it2, CurItem: TCheckItem;
DishCode, CntDish1, CntDish2, AddDish2: integer;
mem, mem2, str: string;
CheckView: TCheckView;
DishesCode: TStringList;
begin
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
//********** Set parameters ***********//
CategCode := 27; // код категории
DishCode := 45; // код бонусного блюда
every := 4;
//********** Set parameters ***********//
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code
CurItem := RKCheck.CurrentCheckItem;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only
if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish
begin
CntDish2 := 0; // счётчик кол-ва акционного блюда
mem := '';
mem2 := '';
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
if (Categ.IsChild(TDish(it).RefItem)) then // checking category of dish
begin
CntDish1 := 0; // счётчик кол-ва бонусного блюда
if pos(';' + IntToStr(TDish(it).Sifr) + '=',mem)<=0 then
begin
mem := mem + ';' + IntToStr(TDish(it).Sifr) + '='+FloatToStr(TDish(it).Quantity);
for j := i to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it2 := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(TObject(it2), 'TDish') then
if (TDish(it2).code=TDish(it).code) then // checking category of dish
CntDish1 := CntDish1 + trunc(TDish(it2).Quantity);
end;
end;
if CntDish1>=every then
begin
mem2 := mem2 + ';' + IntToStr(TDish(it).code) + '='+FloatToStr(CntDish1);
end;
end;
if (TDish(it).Code = DishCode) then
CntDish2 := CntDish2 + trunc(TDish(it).Quantity);
end;
end;
AddDish2 := 0;
while mem2<>'' do
begin
p1 := Pos(';', mem2);
if p1 > 0 then
begin
str := Copy(mem2, p1+1, 10000);
p2 := Pos(';', str);
if p2 = 0 then p2 := 10000;
str := Copy(mem2, p1+1, p2 - 1);
Delete(mem2, p1, p2);
CntDish1 := trunc(StrToFloat(Copy(str, Pos('=', str)+1, 10000))/every);
if CntDish1>0 then
AddDish2 := AddDish2 + CntDish1;
end;
end;
if (AddDish2 <> CntDish2) then
begin
if CntDish2 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
RKCheck.DeleteCheckItem(it);
end;
end;
if CntDish1 > 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(AddDish2)); // add bonus dish
end;
end;
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
Скрипт на обнуление скидки при добавлении другой скидки
procedure DiscountUsage1002304(UsageParameters: TDiscountUsageParameters);
var i,cntDiscount, DiscountCode1, DiscountCode2, DiscountCode3: integer;
it: TCheckItem;
begin
// if not RKCheck.Valid then exit;
DiscountCode1 := 12; // код скидки1
DiscountCode2 := 12; // код скидки2
DiscountCode3 := 14; // код скидки3
cntDiscount := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if (it.code = DiscountCode1)or(it.code = DiscountCode2)or(it.code = DiscountCode3) then
if TDiscountItem(it).SrcAmount<>0 then
begin
cntDiscount := cntDiscount + 1;
break;
end;
end;
if cntDiscount>0 then
UsageParameters.UsageMode := umDeny
else
UsageParameters.UsageMode := umAllow;
end;
Скрипт для автоматической наценки в зависимости от места
Пример: на входе кассир открыл тарифицируемое место и отдал гостю карту, гость пошел в бар и бармен добавил ему блюда в заказ на карту.
Необходимо добавить наценку в тот момент, когда бармен открыл его заказ на редактирование.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var Categ: TClassificatorGroup;
it: TCheckItem;
i, CategCode, DiscCode, DiscCnt: Integer;
begin
CategCode := 8; // указать код категории
DiscCode := 5; // код наценки
DiscCnt := 0;
if AEditType = etInsert then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check dish lines only
if (TDiscountItem(it).Code = DiscCode) then
DiscCnt := DiscCnt + 1;
end;
// add discount
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if SYS.ObjectInheritsFrom(TDish(AObjectAft), 'TDish') then
if Categ.IsChild(TDish(AObjectAft).RefItem) then
if DiscCnt = 0 then
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(100)); // add discount with code 11
end;
end;
Скрипт для добавления бесплатного блюда в определенный день недели, в определенное время, при пробитии определенного блюда
В форме редактирования у компонента CheckView в событии OnAfterCheckViewEdit записать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, j: integer;
it: TCheckItem;
DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer;
disk : integer;
disksum: double;
CurrTime, Time1, Time2: TDateTime;
begin
Time1 := EncodeTime(08,00,00,00); // начало периода акции
Time2 := EncodeTime(21,00,00,00); // конец периода акции
DiscCode := 12; // код скидки
DishCode := 13; // код бонусного блюда
AddDishCode := 7; // код акционного блюда
CntDish1 := 0;
CntDish2 := 0;
CurrTime := Time;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if DayOfWeek(Now)=5 then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only
if (TDish(AObjectAft).Code = AddDishCode) then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
if (TDish(it).Code = AddDishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
if (TDish(it).Code = DishCode) then
CntDish2 := CntDish2 + trunc(TDish(it).Quantity);
end;
end;
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
if (CntDish1 <> CntDish2) then
begin
if CntDish2 > 0 then
begin
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
RK7.PerformOperation(rkoHome, 0);
while True do begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if (TDish(it).Code = DishCode) then begin
if it.State = disOpened then begin
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end else
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание
end;
RK7.PerformOperation(rkoDown, 0);
end;
end;
if CntDish1 > 0 then
begin
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки
end;
end;
end;
end;
В форме редактирования у компонента CheckView в событии OnBeforeCheckViewEdit записать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, j: integer;
it: TCheckItem;
DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer;
disk : integer;
disksum: double;
CurrTime, Time1, Time2: TDateTime;
begin
Time1 := EncodeTime(08,00,00,00); // начало периода акции
Time2 := EncodeTime(21,00,00,00); // конец периода акции
DiscCode := 12; // код скидки
DishCode := 13; // код бонусного блюда
AddDishCode := 7; // код акционного блюда
CntDish1 := 0;
CntDish2 := 0;
CurrTime := Time;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if DayOfWeek(Now)=5 then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) then
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then //Check dish lines only
if (TDish(AObjectBef).Code = AddDishCode) then
if (AEditType = etRemove) then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
if (TDish(it).Code = AddDishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
if (TDish(it).Code = DishCode) then
CntDish2 := CntDish2 + trunc(TDish(it).Quantity);
end;
end;
CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
if (CntDish1 <> CntDish2) then
begin
if CntDish2 > 0 then
begin
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
RK7.PerformOperation(rkoHome, 0);
while True do begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if (TDish(it).Code = DishCode) then begin
if it.State = disOpened then begin
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end else
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание
end;
RK7.PerformOperation(rkoDown, 0);
end;
end;
if CntDish1 > 0 then
begin
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки
end;
end;
end;
end;
Скрипт на добавление или удаление блюда при определенном пороге суммы заказа
Существует акционное блюдо с нулевой ценой. Клиент хочет, чтобы это блюдо автоматически добавлялось в заказ, если сумма заказа достигла 999 рублей и чтобы удалялось, если сумма заказа не достигла 999 рублей (не доверяют персоналу).
В форме редактирования заказа у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, j: integer;
it: TCheckItem;
limit, sum : double;
DiscCode, DishCode, CntDish1: integer;
begin
limit := 200;
DishCode := 43; // special dish code
CntDish1 := 0;
// { блокировка добавления специального блюда при сумме меньше лимита.
if AEditType = etInsert then
if RKCheck.CurrentOrder.UnpaidSum < limit then
if (TDish(AObjectBef).Code = DishCode) then // dish code
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
AAllow := false;
AMessage := 'Блюдо нельзя добавить, т.к. заказ менее 200 р.';
end;
// }
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then
if AEditType = TdiscountItem
e then
begin
sum := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if (TDish(AObjectBef).Code = DishCode) then // dish code
CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);
if AEditType = etRemove then
sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum)
else
sum := RKCheck.CurrentOrder.UnpaidSum;
if sum < limit then // если сумма меньше лимита, то удалить специальное блюдо
if CntDish1 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
RKCheck.DeleteCheckItem(it);
end;
end;
if RKCheck.CurrentOrder.UnpaidSum >= limit then // check limit exceed если сумма чека равна или больше лимита, то добавить спец.блюдо
if CntDish1 = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');
end;
end;
В форме редактирования заказа у объекта CheckView в событии OnAfterCheckViewEdit указать скрипт:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, j: integer;
it: TCheckItem;
limit, sum, Price: double;
DiscCode, DishCode, CntDish1: integer;
begin
// if AEditType = etInsert then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
sum := 0;
limit := 200;
DishCode := 43; // special dish code
CntDish1 := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if (TDish(AObjectBef).Code = DishCode) then // dish code
CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);
Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum);
sum := RKCheck.CurrentOrder.UnpaidSum + Price;
if sum < limit then
if CntDish1 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
RKCheck.DeleteCheckItem(it);
end;
end;
if sum >= limit then // check limit exceed если сумма равна или больше лимита, то добавить спец.блюдо
if CntDish1 = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');
end;
end;
Скрипт на автоматическое добавление блюда в заказ
При сумме заказа от 1000 р. в заказ добавляется определенное блюдо, а при сумме заказа от 2000 р. добавляется другое блюдо.
Также на чек автоматически делается скидка 20%, если добавить блюдо по цене 1000 (сумма заказа в таком случае составит 800).
Бесплатное блюдо добавляется при постепенном формировании заказа. При уменьшение суммы заказа блюдо удаляется. Если заказ превышает сумму в 2000 р., бесплатное блюдо с условием заказ>2000р. добавляется, а блюдо с условием заказ>1000 р. удаляется. А если уменьшить сумму заказа с 2000 до 1500, то блюдо с условием заказ>2000 р. убирается, а блюдо с условием заказ>1000р. должно добавляться.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i, j: integer;
it: TCheckItem;
limit1, limit2, sum, Price: double;
DishCode1, DishCode2, CntDish1, CntDish2: integer;
go1: boolean;
begin
sum := 0;
limit1 := 1000;
limit2 := 2000;
DishCode1 := 45; // special dish code
DishCode2 := 46; // special dish code
CntDish1 := 0;
CntDish2 :=0;
Price := 0;
go1 := false;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) then
go1 := true;
if go1 or SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
if (TDish(it).Code = DishCode1) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity)
else
if (TDish(it).Code = DishCode2) then
CntDish2 := CntDish2 + trunc(TDish(it).Quantity);
end;
end;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if ( (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) ) then
begin
if (TDish(AObjectBef).Code = DishCode1) then // dish code
CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity)
else
if (TDish(AObjectBef).Code = DishCode2) then // dish code
CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity);
// Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum);
Price := (TDish(AObjectAft).SumWithDiscounts) - (TDish(AObjectBef).SumWithDiscounts); // SumWithDiscounts
end;
sum := RKCheck.CurrentOrder.ToPaySum + Price+ RKCheck.CurrentOrder.DiscountSum;
// if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then
// gui.showmessage('ToPaySum='+FloatToStr(RKCheck.CurrentOrder.ToPaySum)+' Price='+FloatToStr(Price)+' Discountsum='+FloatToStr(RKCheck.CurrentOrder.DiscountSum)+' CalcAmount='+FloatToStr(TDiscountItem(AObjectAft).CalcAmount));
if sum < limit2 then
if CntDish2 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode2) then
RKCheck.DeleteCheckItem(it);
end;
end;
if (sum < limit1) or (sum >=limit2) then
if CntDish1 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode1) then
RKCheck.DeleteCheckItem(it);
end;
end;
if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????
begin
if CntDish2 <= 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1');
end
else
if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????
if CntDish1 <= 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1');
end;
end;
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, j: integer;
it: TCheckItem;
limit1, sum, limit2 : double;
DiscCode, DishCode1, CntDish1, DishCode2, CntDish2: integer;
begin
limit1 := 1000;
limit2 := 2000;
DishCode1 := 45; // special dish code
DishCode2 := 46; // special dish code
CntDish1 := 0;
CntDish2 :=0;
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then
if AEditType = etRemove then
begin
sum := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
if (TDish(it).Code = DishCode1) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity)
else
if (TDish(it).Code = DishCode2) then
CntDish2 := CntDish2 + trunc(TDish(it).Quantity);
end;
end;
if (TDish(AObjectBef).Code = DishCode1) then // dish code
CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity)
else
if (TDish(AObjectBef).Code = DishCode2) then // dish code
CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity);
if AEditType = etRemove then
// sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum)
sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).SumWithDiscounts)
else
sum := RKCheck.CurrentOrder.UnpaidSum;
if sum < limit2 then // ???? ????? ?????? ??????, ?? ??????? ??????????? ?????
if CntDish2 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode2) then
RKCheck.DeleteCheckItem(it);
end;
end;
if (sum < limit1) or (sum >=limit2) then // ???? ????? ?????? ??????, ?? ??????? ??????????? ?????
if CntDish1 > 0 then
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode1) then
RKCheck.DeleteCheckItem(it);
end;
end;
if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????
begin
if CntDish2 <= 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1');
end
else
if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????
if CntDish1 <= 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1');
end;
end;
Скрипт для автоматического добавления бесплатного (стартового) блюда в заказ при создании нового заказа
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var codedish1: integer;
begin
codedish1 := 23; // dish code for autoadding
if RKCheck.CurrentOrder.IsEmpty then
if AEditType = etInsert then
if SYS.ObjectInheritsFrom(TDish(AObjectAft), 'TDish') then
begin
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(codedish1), IntToStr(RKCheck.CurrentOrder.GuestsCount)); // add dish
end;
end;
Скрипт для накопление бонусов в зависимости от времени
Бонусы действуют до 22:00. Гость пришел в 21:50, заказал сок за 100р. В 22:20 заказал пирожок за 50р. В 22:40 (или в час ночи) попросил счёт и дал карту - бонусы должны начислиться на сок, но не на пирожок, несмотря на время проведения картой.
Скрипт для события OnAfterCheckViewEdit у объекта CheckView на форме редактирования заказа:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
i, cntDish, DishCode: integer;
it: TCheckItem;
a, Price: double;
CurrTime, Time1: TDateTime;
begin
DishCode := 43; // код блюда с открытой ценой
Time1 := EncodeTime(18,05,00,00); // граничное время
if (AEditType=etInsert)or(AEditType=etChange) then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).Code <> DishCode) then
begin
a := 0;
cntDish := 0;
Price := 0;
CurrTime := Time;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if (TDish(it).Code = DishCode) then
cntDish := cntDish + 1
else
begin
if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then
a := a + TDish(it).PRListSum;
end;
end;
if (a > 0.00001) then
begin
if (cntDish = 0) then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) // ?????????? ? ????? ????? ? ????? 43
else
begin
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
RK7.PerformOperation(rkoHome, 0);
while True do begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin
if (TDish(it).Code = DishCode) then
if a <> TDish(it).UserPrice then
if it.State = disOpened then begin
RK7.PerformOperation(rkoDeleteLine, 1);
continue;
end else
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));
end;
RK7.PerformOperation(rkoDown, 0);
end;
if CurrTime < Time1 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1))
end;
if CurrTime < Time1 then
if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then
begin
TDish(RKCheck.CurrentCheckItem).IsUserPrice := true;
TDish(RKCheck.CurrentCheckItem).UserPrice := a;
end;
end;
end;
end;
Скрипт для события OnBeforeCheckViewEdit у объекта CheckView на форме редактирования заказа:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var
i, j, cntDish, DishCode: integer;
it: TCheckItem;
a, Price: double;
CurrTime, Time1: TDateTime;
begin
DishCode := 43; // код блюда с открытой ценой
Time1 := EncodeTime(18,05,00,00); // граничное время
if (AEditType=etRemove) then // etChange etRemove
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then
if (TDish(AObjectBef).Code <> DishCode) then
begin
a := 0;
cntDish := 0;
Price := 0;
CurrTime := Time;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if (TDish(it).Code = DishCode) then
cntDish := cntDish + 1
else
begin
if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then
a := a + TDish(it).PRListSum;
end;
end;
// if (StrToTime(TimeToStr(TDish(AObjectBef).Session.StartService)) < Time1) then // учитывать сумму удаляемого блюда / раскоментировать когда будет исправлен баг
a := a - TDish(AObjectBef).PRListSum;
if (a > 0.00001) then
begin
if (cntDish = 0) then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1))
else
if CurrTime < Time1 then
begin
if GUI.CheckFormInPayMode then Exit;
if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;
RK7.PerformOperation(rkoHome, 0);
while True do begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin
if (TDish(it).Code = DishCode) then
if a <> TDish(it).UserPrice then
if it.State = disOpened then begin
if trk7menuItem(TDish(it).RefItem).OpenPrice then
begin
TDish(it).IsUserPrice := true;
TDish(it).UserPrice := a;
end;
end else
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));
end;
RK7.PerformOperation(rkoDown, 0);
end;
end;
end;
end;
end;
В скриптах задать соответствующие значения для DishCode и Time1.
Скрипт, оставляющий скидку в заказе при печати пречека
procedure DiscountUsage1001731(UsageParameters: TDiscountUsageParameters);
var i: integer;
it: TCheckItem;
a: double;
begin
a := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
a := a + TDish(it).PRListSum
else if SYS.ObjectInheritsFrom(TObject(it), 'TChargeLine') then
a := a + TChargeLine(it).CalcAmount;
end;
if a >= 150 then
UsageParameters.UsageMode := umAuto
else UsageParameters.UsageMode := umDeny;
end;
Скрипт на добавлении скидки при заказе любых двух блюд с доставкой или самовыносом
Системы доставки нет. Вся доставка просто бьется на стол 80, а самовынос - на стол 70.
Скрипт для объекта CheckView в событии OnBeforeCheckViewEdit
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var ToPaySum, sumDiscount : double;
i, CntDicount, DiscCode, sumActtion: integer;
it: TCheckItem;
begin
CntDicount := 0;
DiscCode := 18; // код суммовой скидки добавляемой по акции
sumActtion := 700; // сумма чека для активации акции
sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки)
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
if AEditType = etRemove then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if (it.Code = DiscCode) then
CntDicount := CntDicount + 1;
end;
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then
ToPaySum := ToPaySum - TDish(AObjectBef).PRListSum;
if CntDicount > 0 then
ToPaySum := ToPaySum + sumDiscount;
if ToPaySum >= sumActtion+sumDiscount then
begin
if CntDicount = 0 then
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0));
end
else
if CntDicount > 0 then
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if (it.Code = DiscCode) then begin
RKCheck.DeleteCheckItem(it);
CntDicount := 0;
end;
end;
end;
end;
Для объекта CheckView в событии OnAfterCheckViewEdit
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var ToPaySum, sumDiscount, sumActtion: double;
i, CntDicount, DiscCode: integer;
it: TCheckItem;
begin
CntDicount := 0;
DiscCode := 18; // код суммовой скидки добавляемой по акции
sumActtion := 700; // сумма чека для активации акции
sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки)
if not(AEditType = etRemove) then
begin
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if (it.Code = DiscCode) then
CntDicount := CntDicount + 1;
end;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
if AEditType = etInsert then
ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum
else if AEditType = etChange then
ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum - TDish(AObjectBef).PaySum;
end;
if ToPaySum >= sumActtion+sumDiscount then
begin
if CntDicount = 0 then
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0));
end
else
if CntDicount > 0 then
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if (it.Code = DiscCode) then begin
RKCheck.DeleteCheckItem(it);
CntDicount := 0;
end;
end;
end;
end;
Скрипт на перенос блюда со 100% скидкой в отдельный пакет
Если 100% скидка применяется на блюдо, у которого цена в момент добавления скидки больше 0, то тогда такое блюдо перемещается в новый пакет с нулевой ценой.
При переносе блюда — название скидки сохраняется под этим блюдом. И потом можно посмотреть отчет по этим скидкам
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
begin
if AEditType = etInsert then
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then
if (TDiscountItem(AObjectAft).Code = 1000105) then // discount code
begin
if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then
begin
TDish(RKCheck.CurrentCheckItem).IsUserPrice := true;
TDish(RKCheck.CurrentCheckItem).UserPrice := 0;
end;
RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TDish') then
if RKCheck.CurrentCheckItem.Session.iKurs <> 1000155 then
RKCheck.DeleteCheckItem(TDiscountItem(AObjectAft));
end;
end;
end;
Проверка статуса блюда.
procedure ProcessOperation1001712(Parameter: integer);
var
it: TCheckItem;
i, code: integer;
qntnew, qntold, pricenew: double;
CurItem: TCheckItem;
ed: TObject;
begin
qntnew := 0;
pricenew := 100;
if not RKCheck.Valid then
exit //important checking
else
begin
CurItem := RKCheck.CurrentCheckItem;
if not(TDish(CurItem).State = disOpened) then
begin
gui.showmessage('You can''t move saved dish!!!');
exit;
end;
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
if (length(TNumEditor(ed).Text)>0) then
qntnew := StrToFloat(TNumEditor(ed).Text)
else
qntnew := 1;
if SYS.ObjectInheritsFrom(TObject(CurItem), 'TDish') then
if (TDish(CurItem).quantity > qntnew) and (qntnew > 0) then
begin
TNumEditor(ed).Text := FloatToStr(TDish(CurItem).quantity-qntnew);
RK7.PerformOperation(rkoEditAmount, 0);
code := CurItem.code;
RK7.PerformOperation(rkoDown, 0);
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(code), IntToStr(Trunc(qntnew))); // add dish
end;
end;
TNumEditor(ed).Text := FloatToStr(qntnew);
// RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course
RK7.PerformOperation(rkoMoveCurrentDishToSes, 1) // ident of course
TNumEditor(ed).Text := '';
RK7.PostOperation(rkoDiscountSelector, 0);
end;
Скрипт, выводящий сообщение при добавлении спецблюд
Необходимо, чтобы при пробитии комбо-блюд, относящихся к классификации «49 рублей» на экране выходило информационное окно с текстом «предложи добавку за 49 рублей»
1) Назначить скрипт на событие OnAfterCheckViewEdit объекта CheckView в форме редактирования заказа:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
Categ: TClassificatorGroup;
begin
if AEditType = etInsert then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if TDish(AObjectAft).IsCombo then
begin
Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 8)); // указать код классификации
if Categ.IsChild(TDish(AObjectAft).RefItem) then
gui.ShowMessage('предложи добавку на 49 рублей');
end;
end;
2) Добавить расширенное свойство в ресторане
Message_Addon_49
3) Назначить скрипт на форму быстрого чека
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
Categ: TClassificatorGroup;
begin
if ( TRK7Restaurant(RK7.CashGroup.MainParent).genMessage_Addon_49='1') then
if AEditType = etInsert then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if TDish(AObjectAft).IsCombo then
begin
Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 144)); // указать код классификации
if Categ.IsChild(TDish(AObjectAft).RefItem) then
gui.ShowMessage('Предложи Гостю добавку к комбо за 49 руб');
end;
end;
Для того ,чтобы в ресторане начали показывать сообщение, нужно указать «1» в расширенном свойстве Message_Addon_49
Скрипт по принудительному выбору консуманта при выборе блюда
На форме редактирования чека у объекта CheckView в событии OnAfterCheckViewEdit указать скрипт открывающий выбор консуманта при добавлении определённого блюда:
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var
i, DishCode: integer;
it: TCheckItem;
begin
DishCode := 13; // код контролируемого блюда
if (AEditType=etInsert)or(AEditType=etChange) then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).Code = DishCode) then
begin
RK7.PerformOperation(rkoConsumatorSelector, 1);
end;
end;
На форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт запрещающий продолжать работу при печати чека или пречека в случае отсутствия консуманта у контролируемого блюда:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);
var
i, DishCode: integer;
it: TCheckItem;
begin
DishCode := 13; // код контролируемого блюда
if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).Code = DishCode) then
begin
// checking by Consumators
if TDish(it).Consumators.Count = 0 then
begin
gui.ShowMessage('Операция запрещена, т.к. не выбран консумант!');
AContinue := false;
end;
end;
end;
end;
Чтобы запретить выход из чека, если у блюда нет косуманта, то необходимо заменить условие в строке:
if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека
на
if (AVerifyType = vtBeforeSave)or(AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при сохранении заказа, печати чека и пречека
Скрипт на автоматическое изменение цены
Необходимо при продаже кофе вместе с любым блюдом из классификации (не категории) «Food» менять цену кофе
procedure ChangePrice;
var i, CategCode1, CategCode2, Categ2DishCnt, course1, course2: integer;
Categ1, Categ2: TClassificatorGroup;
it, CurItem: TCheckItem;
CheckView: TCheckView;
begin
//********** Set parameters ***********//
course1 := 1002378; // ident of course 1 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при наличии в заказе блюд из категории 2
course2 := 1002379; // ident of course 2 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при отсутсвии в заказе блюд из категории 2
CategCode1 := 8; // code of category for cofe // код категории 1
CategCode2 := 27; // code of category FOOD // код категории 2
//********** Set parameters ***********//
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
Categ2DishCnt := 0;
Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));//category code
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));//category code
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if Categ2.IsChild(TDish(it).RefItem) then
if TDish(it).Quantity > 0 then
Categ2DishCnt := Categ2DishCnt + 1;
end;
CurItem := RKCheck.CurrentCheckItem;
RK7.PerformOperation(rkoHome, 0);
while True do begin
it := RKCheck.CurrentCheckItem;
if TObject(it) = Nil then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if (Categ1.IsChild(TDish(it).RefItem)) then // checking category of dish
if Categ2DishCnt > 0 then
begin
if TRk7MenuItem(it.RefItem).Kurs <> course1 then
RK7.PerformOperation(rkoMoveCurrentDishToSes, course1) // change course
end
else
begin
if TRk7MenuItem(it.RefItem).Kurs <> course2 then
RK7.PerformOperation(rkoMoveCurrentDishToSes, course2); // change course;
end;
RK7.PerformOperation(rkoDown, 0);
end;
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
begin
ChangePrice;
end;
procedure CheckViewCurItemChangedScript(Sender: TObject);
begin
ChangePrice;
end;