OnTimer
Скрипт на создание скидки на предзаказ
На форме редактирования заказа в событии OnTimer указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var CheckView: TCheckView;
begin
// Проверка на корректный чек
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if RKCheck.CurrentOrder.IsEmpty then exit;
AddEveryOtherDiscount(10); // указать код суммовой открытой скидки на заказ
end;
Над этим скриптом разместить функцию пересчёта заранее созданной суммовой открытой скидки на заказ:
procedure AddEveryOtherDiscount(DiscCode: integer);
var i, j: integer;
it, CurItem: TCheckItem;
a, BaseSum, discsum, DiscPerc: double;
d: TDish;
CheckView: TCheckView;
ed: TObject;
Time1: TDateTime;
begin
//************************** Set parameters **********************************//
DiscPerc := 10; // %
//************************** Set parameters **********************************//
discsum := 0;
BaseSum := 0;
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
CurItem := RKCheck.CurrentCheckItem;
try
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 (RKCheck.CurrentOrder.StartService >= (TDish(it).Session.StartService)) then
// if ((it.State = disOpened) or (it.State = disPrinted)) then
begin
if (TDish(it).Quantity > 0) then
begin
BaseSum := BaseSum + TDish(it).PRListSum;
end;
end;
end;
begin
a:= BaseSum*DiscPerc/100;
// Delete discount, if a sum changed
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check dish lines only
if (it.Code = DiscCode) then
begin
if abs(TDiscountItem(it).SrcAmount) = a then a := 0
else
begin
if not(TDiscountItem(it).State = disOpened) then
begin
RKCheck.DeleteCheckItem(it); // Delete discount, if a sum changed
end
else
begin
if it <> Nil then CheckView.GotoItem(it);
ed := TObject(gui.FindComponentByName('Editor'));
TNumEditor(ed).Text := FloatToStr(a);
RK7.PerformOperation(rkoEditOpenPrice, 0); // change discount, if a sum changed
a := 0;
end;
end
break;
end;
end;
// Create discount to a dish
if a > 0 then
begin
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));
end;
end;
finally
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
RKCheck.CurrentOrder.Recalc();
end;Скрипт для автоматического добавления модификаторов
На форме редактирования чека разместить таймер и в его событии OnTimer указать:
procedure userTimer1OnTimer(Sender: TObject); но над этой процедурой разместить procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);
Должен получиться такой листинг:
procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);
var s,s1:string; i:Integer;
begin
s:=StrIn;
while length(s)<>0 do begin
i:=pos(marker,s);
if i=0 then begin
s1:=s;
delete(s,1,length(s1));
StringsOut.Add(s1);
end
else begin
s1:=copy(s,1,i-1);
delete(s,1,i);
StringsOut.Add(s1)
end;
end;
end;
procedure userTimer1OnTimer(Sender: TObject);
var i, j, k, z, p, linenum: integer;
it,it2,CurItem: TCheckItem;
CheckView: TCheckView;
SL,SLtmp: TStringList;
str: string;
ModifPresent: boolean;
begin
// Проверка на корректный чек
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
CurItem := RKCheck.CurrentCheckItem;
SL := TStringList.Create;
SL.Clear;
SL.Sorted := false;
// serch and remember modificators
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).Modifiers.Count > 0 then
begin
str := inttostr(i)+'=';
for j := 0 to TDish(it).Modifiers.Count - 1 do // checking by modifier
begin
str := str+IntToStr(TDish(it).Modifiers.Items[j].Code)+';';
end;
SL.Add(str);
end;
end;
// adding modificators
for i := 0 to SL.Count - 1 do
begin
SLtmp := TStringList.Create;
SLtmp.Clear;
SLtmp.Sorted := false;
p := pos('=',SL.strings[i]);
linenum := StrToInt(copy(SL.strings[i],1,p-1));
SliceStrToStrings(copy(SL.strings[i],p+1,length(SL.strings[i])-p),';',SLtmp);
//dbg.dbgprint(' '+SL.strings[i]+' '+IntToStr(linenum)+ ' ' +copy(SL.strings[i],p+1,length(SL.strings[i])-p));
// cycle for dish
for j := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
if linenum <= j then
begin
it2 := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it2, 'TDish') then
begin
// cycle for remember modifiers
for k := 0 to SLtmp.Count - 1 do
begin
ModifPresent := False;
// cycle for dish modifiers
for z := 0 to TDish(it2).Modifiers.Count - 1 do // checking by modifier
begin
if TDish(it2).Modifiers.Items[z].Code = StrToInt(SLtmp.strings[k]) then
ModifPresent := True;
end;
if not(ModifPresent) then
begin
//dbg.dbgprint('add modif '+SLtmp.strings[k]+' to dish '+TDish(it2).Name);
CheckView.GotoItem(it2);
RKCheck.CreateCheckItem(rkrefModifiers, SLtmp.strings[k], '1'); // add modificator
end;
end;
end;
end;
SLtmp.Free();
end;
SL.Free();
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;Предыдущий скрипт, в который добавляется только последний модификатор, попадающий в диапазон кодов с 46 по 53, а не все модификаторы предыдущего блюда.
procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);
var s,s1:string; i:Integer;
begin
s:=StrIn;
while length(s)<>0 do begin
i:=pos(marker,s);
if i=0 then begin
s1:=s;
delete(s,1,length(s1));
StringsOut.Add(s1);
end
else begin
s1:=copy(s,1,i-1);
delete(s,1,i);
StringsOut.Add(s1)
end;
end;
end;
procedure userTimer1OnTimer(Sender: TObject);
var i, j, k, z, p, linenum1,linenum2, ModifCodeLimit1,ModifCodeLimit2: integer;
it,it2,CurItem: TCheckItem;
CheckView: TCheckView;
SL,SLtmp: TStringList;
str: string;
ModifPresent: boolean;
begin
ModifCodeLimit1 := 1; //46;
ModifCodeLimit2 := 53;
// Ïðîâåðêà íà êîððåêòíûé ÷åê
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
CurItem := RKCheck.CurrentCheckItem;
SL := TStringList.Create;
SL.Clear;
SL.Sorted := false;
// serch and remember modificators
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).Modifiers.Count > 0 then
begin
str := inttostr(i)+'=';
for j := TDish(it).Modifiers.Count - 1 downto 0 do // checking by modifier
if (TDish(it).Modifiers.Items[j].Code >= ModifCodeLimit1)and(TDish(it).Modifiers.Items[j].Code <= ModifCodeLimit2) then // select range code
begin
str := str+IntToStr(TDish(it).Modifiers.Items[j].Code)+';';
SL.Add(str);
break;
end;
end;
end;
// adding modificators
for i := 0 to SL.Count - 1 do
begin
SLtmp := TStringList.Create;
SLtmp.Clear;
SLtmp.Sorted := false;
p := pos('=',SL.strings[i]);
linenum1 := StrToInt(copy(SL.strings[i],1,p-1));
if i+1 > SL.Count - 1 then
linenum2 := RKCheck.CurrentOrder.Sessions.LinesCount - 1
else
linenum2 := StrToInt(copy(SL.strings[i+1],1,p-1));
SliceStrToStrings(copy(SL.strings[i],p+1,length(SL.strings[i])-p),';',SLtmp);
// cycle for dish
for j := linenum1 to linenum2 do
// if linenum1 <= j then
begin
it2 := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(it2, 'TDish') then
begin
// cycle for remember modifiers
for k := 0 to SLtmp.Count - 1 do
begin
ModifPresent := False;
// cycle for dish modifiers
for z := TDish(it2).Modifiers.Count - 1 downto 0 do // checking by modifier
begin
if (TDish(it2).Modifiers.Items[z].Code >= ModifCodeLimit1)and(TDish(it2).Modifiers.Items[z].Code <= ModifCodeLimit2) then
ModifPresent := True;
end;
if not(ModifPresent) then
begin
CheckView.GotoItem(it2);
RKCheck.CreateCheckItem(rkrefModifiers, SLtmp.strings[k], '1'); // add modificator
end;
end;
end;
end;
SLtmp.Free();
end;
SL.Free();
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;Скрипт при добавлении одного модификатора указанного диапазона кодов удаляет у текущего блюда все остальные модификаторы из этого диапазона
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var j,ModifCodeLimit1,ModifCodeLimit2: integer;
begin
ModifCodeLimit1 := 46;
ModifCodeLimit2 := 53;
if SYS.ObjectInheritsFrom(AObjectAft, 'TModiItem') then
if (TModiItem(AObjectAft).code >= ModifCodeLimit1)and(TModiItem(AObjectAft).code <= ModifCodeLimit2) then
begin
for j := TDish(RKCheck.CurrentCheckItem).Modifiers.Count - 1 downto 0 do // checking by modifier
if (TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j].Code >= ModifCodeLimit1)and(TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j].Code <= ModifCodeLimit2) then // select range code
RKCheck.DeleteCheckItem(TModiItem(TDish(RKCheck.CurrentCheckItem).Modifiers.Items[j]));
end;
end;Скрипт, добавляющий блюда при определенном типе заказа
На форме редактирования заказа добавить таймер и указать ему скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var i,CntDish1,OrderTypeCode,DishCode:integer;
it: TCheckItem;
begin
//************************** Set parameters **********************************//
DishCode := 220;
OrderTypeCode := 1; // код типа заказа
//************************** Set parameters **********************************//
// Проверка на корректный чек
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if (RKCheck.CurrentOrder.OrderTypeCode = OrderTypeCode) then // for different OrderTypeCode
if RKCheck.CurrentOrder.UserTag1 = 0 then
begin
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).quantity > 0) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;
if CntDish1=0 then
begin
RKCheck.CurrentOrder.UserTag1 := 1;
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), inttostr(1)); // add dish
end;
end;
end;Скрипт, отслеживающий суммы чеков в денежных диапазонах
Необходимо при каждом превышении лимита выводить сообщение и не выводить его повторно пока не превышен следующий лимит.
Нижеприведенный скрипт отрабатывает корректно до момента печати чека. В этот момент начинают сыпаться несвоевременные сообщения.
procedure userTimerSumLimitOnTimer(Sender: TObject);
var ToPaySum, SumInterval : double;
tt : TTimer;
begin
//14-09-16 Show message and open selector when order reaches every 200 rubles
//if (TRK7Restaurant(RK7.CashGroup.MainParent).Code = 6)
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then
exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
begin
if (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 294)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 293)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 172)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 9053)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 240)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 190)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 116)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 113)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 9017)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 67)
and (TRK7Restaurant(RK7.CashGroup.MainParent).Code <> 24)
then
begin
SumInterval := 200;
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
if RKCheck.CurrentOrder.UserTag1 = 0 then
RKCheck.CurrentOrder.UserTag1 := trunc(SumInterval);
if (ToPaySum >= RKCheck.CurrentOrder.UserTag1) and (RKCheck.CurrentOrder.UserTag1 >= SumInterval) then
begin
RKCheck.CurrentOrder.UserTag1 := trunc(ToPaySum / SumInterval)*SumInterval +SumInterval;
gui.ShowMessage(' «Возьмите снек\десерт по Акции! (49 руб.)» ');
RK7.PostOperation(rkoTableSelector, 147);
end;
if (ToPaySum <= (RKCheck.CurrentOrder.UserTag1)) and (RKCheck.CurrentOrder.UserTag1 >= SumInterval) then // ???? ????? ???? ?????????? ???? ??????
begin
RKCheck.CurrentOrder.UserTag1 := trunc(ToPaySum / SumInterval)*SumInterval +SumInterval;
end;
end;
end;
//14-09-16 Show message and open selector when order reaches every 200 rubles
end;Скрипт на добавление\удаление блюда при определенной сумме заказа
На форме редактирования заказа разместить объект «TTimer?», назвав его «userTimerSumLimit». В свойствах этого объекта задать интервал срабатывания (по умолчанию задано 1000. что соответствует 1 секунде). В событии OnTimer указать скрипт:
procedure userTimerSumLimitOnTimer(Sender: TObject);
var ToPaySum, SumInterval : double;
tt : TTimer;
i, j: integer;
it: TCheckItem;
DiscCode, DishCode, CntDish1: integer;
begin
SumInterval := 700; // limit сумма чека по достижении которой автоматически добавится блюдо
DishCode := 43; // special dish code код автоматически добавляемого блюда
CntDish1 := 0;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
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(it, 'TDish') then
if (TDish(it).Code = DishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if ToPaySum < SumInterval 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 ToPaySum >= SumInterval then // check limit exceed добавление блюда при превышении указанной суммы
if CntDish1 = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');
end;
end;В скрипте задать необходимые значения для SumInterval и DishCode.
Скрипт на добавление/удаление блюда, при определенной сумме сохраненного заказа
procedure userTimerSumLimitOnTimer(Sender: TObject);
var ToPaySum, SumInterval : double;
tt : TTimer;
i, j: integer;
it,CurItem: TCheckItem;
DiscCode, DishCode, CntDish1: integer;
CheckView:TCheckView;
begin
SumInterval := 700; // limit сумма чека по достижении которой автоматически добавится блюдо
DishCode := 43; // special dish code код автоматически добавляемого блюда
CntDish1 := 0;
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
CurItem := RKCheck.CurrentCheckItem;
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(it, 'TDish') then
if (TDish(it).Code = DishCode) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if ToPaySum < SumInterval 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
begin
CheckView.GotoItem(TObject(it));
if it.State = disOpened then begin
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end else
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание
end;
end;
end;
if ToPaySum >= SumInterval then // check limit exceed добавление блюда при превышении указанной суммы
if CntDish1 = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');
end;
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;Скрипт для акции «Блюдо в подарок при сумме заказа 1300 руб. со скидкой»
В период Пн-Пт с 10:00 до 18:00, при сумме заказа 1300 руб. (со скидкой), в заказ, вручную, добавляется одно конкретное блюдо. необходимо, чтобы это блюдо появлялосьв списке только в том случае, если сумма заказа больше или равна 1300 руб
На форме редактирования чека разместить таймер (TTimer) и в его событии указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var ToPaySum : double;
i, DishCode1: integer;
qnt, qntMax: double;
LimitSum1: double;
it: TCheckItem;
CurrTime, Time1, Time2: TDateTime;
tt : TTimer;
begin
qnt := 0;
DishCode1 := 25; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
LimitSum1 := 1300; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
CurrTime := Time;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then
exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) 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(it, 'TDish') then
if TDish(it).code = DishCode1 then
qnt := qnt + TDish(it).Quantity;
end;
if (ToPaySum <= LimitSum1)and(qnt>0) then
begin
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 = DishCode1) 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;
end;
end;
Скрипт на событие OnBeforeCheckViewEdit объекта CheckView расположенного на форме редактирования чека
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, DishCode1: integer;
qnt, qntMax: double;
checksum, LimitSim1: double;
it: TCheckItem;
CurrTime, Time1, Time2: TDateTime;
begin
qnt := 0;
DishCode1 := 25; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
LimitSim1 := 1300; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
CurrTime := Time;
checksum := 0;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if TDish(AObjectAft).code = DishCode1 then
if not(AEditType = etRemove) then
begin
AAllow := false;
AMessage := 'Access denied';
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime)and(CurrTime<=Time2) then
begin
// gui.showmessage(Timetostr(time1)+' '+Timetostr(currtime)+' '+Timetostr(time2));
AAllow := true;
AMessage := '';
checksum := RKCheck.CurrentOrder.ToPaySum;
qnt := TDish(AObjectAft).Quantity;
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 = DishCode1 then
qnt := qnt + TDish(it).Quantity;
end;
if (qnt > qntMax)or(LimitSim1>checksum) then // check limit exceed
begin
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
end;
end;Скрипт для печати в пречеке процента изменяемой скидки
Создали по желанию клиента "скидку равную возрасту", которая имеет изменяемое значение от 0 до 60%.
Скрипт отображает скидку в пречеке.
На форме редактирования разместите таймер, а в его событии OnTimer указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var i,discCode:integer;
it: TCheckItem;
begin
discCode := 10;
// Проверка на корректный чек
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
if (it.code = discCode) and (TDiscountItem(it).State <> disDeleted) then
RKCheck.UpdateVisitComment(FloatToStr(abs(TDiscountItem(it).CalcPercent/100))+'%', '');
end;
end;Скрипт, реализующий акцию «При покупке билета в кино и при заказе в баре от 600руб — 1 блюдо на выбор бесплатно»
На форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт (контролирует ручное добавление бонусного блюда):
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, DishCode1, DishCode2: integer;
qnt, qntMax: double;
checksum, LimitSim1: double;
it: TCheckItem;
begin
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
LimitSum1 := 600; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
qnt := 0;
checksum := 0;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then
if not(AEditType = etRemove) then
begin
AAllow := false;
AMessage := 'Access denied';
begin
AAllow := true;
AMessage := '';
checksum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(checksum / LimitSim1);
if qntMax >= 1 then qntMax := 1;
if TDish(AObjectAft).Quantity<>0 then
qnt := 1;
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 = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
if (qnt > qntMax) then // check limit exceed
begin
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
end;
end;Скрипт для таймера, размещаемого на форме редактирования чека (контролирует автоматическое добавление/удаление бонусного блюда):
procedure userTimer1OnTimer(Sender: TObject);
var ToPaySum : double;
i, DishCode1, DishCode2: integer;
qnt, qnt_temp, qnt_temp2, qntMax: double;
LimitSum1: double;
it: TCheckItem;
tt : TTimer;
ed: TObject;
begin
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
LimitSum1 := 600; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
qnt := 0;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if (RKCheck.CurrentOrder.ToPaySum < LimitSum1)and(RKCheck.CurrentOrder.UserTag1 > 0) then
RKCheck.CurrentOrder.UserTag1 := 0;
if (RKCheck.CurrentOrder.ToPaySum >= LimitSum1)and(RKCheck.CurrentOrder.UserTag1 = 0) then
begin
RKCheck.CurrentOrder.UserTag1 := 1;
if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then
if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // добавление блюда 1
else
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // добавление блюда 2
end;
begin
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(ToPaySum / LimitSum1);
if qntMax >= 1 then qntMax := 1;
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 = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
if (qnt > qntMax) then
begin
RK7.PerformOperation(rkoHome, 0);
while True do begin
qnt_temp := 0;
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 = DishCode1)or(TDish(it).code = DishCode2) then begin
if (TDish(it).Quantity) > 0 then
if it.State = disOpened then begin
if (qnt-TDish(it).Quantity) >= qntmax then
begin
qnt := qnt - TDish(it).Quantity;
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end
else
begin
qnt_temp := qntmax-(qnt-TDish(it).Quantity);
qnt_temp2 := TDish(it).Quantity;
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
begin
TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));
RK7.PerformOperation(rkoEditAmount, 0);
TNumEditor(ed).Text := '';
qnt := qnt -(qnt_temp2-qnt_temp);
end;
end
end else
begin
qnt := qnt - TDish(it).Quantity;
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // ????????
end;
end;
RK7.PerformOperation(rkoDown, 0);
if (qnt <= qntMax) then break;
end;
end;
end;
end;Скрипт на добавление блюда.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, DishCode1, DishCode2: integer;
qnt, qntMax: double;
checksum, LimitSim1: double;
it: TCheckItem;
begin
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
LimitSum1 := 600; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
qnt := 0;
checksum := 0;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then
if not(AEditType = etRemove) then
begin
AAllow := false;
AMessage := 'Access denied';
begin
AAllow := true;
AMessage := '';
checksum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(checksum / LimitSim1);
if qntMax >= 1 then qntMax := 1;
if TDish(AObjectAft).Quantity<>0 then
qnt := 1;
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 = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
if (RKCheck.CurrentOrder.UserTag1 > 0) then // check limit exceed
begin
AAllow := false;
AMessage := 'You can''t add dish manually';
end;
if (qnt > qntMax) then // check limit exceed
begin
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
end;
end;Скрипт для таймера:
procedure userTimer1OnTimer(Sender: TObject);
var ToPaySum : double;
i, DishCode1, DishCode2: integer;
qnt, qnt_temp, qnt_temp2, qntMax: double;
LimitSum1: double;
it: TCheckItem;
tt : TTimer;
ed: TObject;
begin
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
LimitSum1 := 600; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
qnt := 0;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if (RKCheck.CurrentOrder.ToPaySum < LimitSum1)and(RKCheck.CurrentOrder.UserTag1 > 0) then
RKCheck.CurrentOrder.UserTag1 := 0;
if (RKCheck.CurrentOrder.ToPaySum >= LimitSum1)and(RKCheck.CurrentOrder.UserTag1 = 0) then
begin
RK7.PerformOperation(rkoUser07, 0);
{
if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then
if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // добавление блюда 1
else
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // добавление блюда 2
}
RKCheck.CurrentOrder.UserTag1 := 1;
end;
begin
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(ToPaySum / LimitSum1);
if qntMax >= 1 then qntMax := 1;
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 = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
if (qnt > qntMax) then
begin
RK7.PerformOperation(rkoHome, 0);
while True do begin
qnt_temp := 0;
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 = DishCode1)or(TDish(it).code = DishCode2) then begin
if (TDish(it).Quantity) > 0 then
if it.State = disOpened then begin
if (qnt-TDish(it).Quantity) >= qntmax then
begin
qnt := qnt - TDish(it).Quantity;
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end
else
begin
qnt_temp := qntmax-(qnt-TDish(it).Quantity);
qnt_temp2 := TDish(it).Quantity;
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
begin
TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));
RK7.PerformOperation(rkoEditAmount, 0);
TNumEditor(ed).Text := '';
qnt := qnt -(qnt_temp2-qnt_temp);
end;
end
end else
begin
qnt := qnt - TDish(it).Quantity;
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание
end;
end;
RK7.PerformOperation(rkoDown, 0);
if (qnt <= qntMax) then break;
end;
end;
end;
end;Скрипт для пользовательской операции:
procedure ProcessOperation1001832(Parameter: integer);
var DishCode1, DishCode2: integer;
begin
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
if GUI.RKMessageDlg('Есть ли у клиента чек с АКЦИЕЙ? ', 0, 3, 100000) = 6 then
if GUI.RKMessageDlg('Добавить блюдо №1?', 0, 3, 100000) = 6 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // добавление блюда 1
else
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // добавление блюда 2
end;Последний скрипт необходимо назначить пользовательской процедуре и в свойствах выставить галочку «Контроль доступа» — «ограничение доступа к пользовательской операции»
В кассовых правах пользователей появится соответствующий пункт: «кассовые права работника»
Скрипт для акции «Получи подарок за каждые три заказанные блюда из списка»
На форме редактирования чека разместить таймер. Задать ему интервал равным 200 (это время срабатывания таймера). В событии OnTimer указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var ToPaySum, quantity : double;
tt : TTimer;
i, j, every: integer;
it: TCheckItem;
BonusDishCode, DishCode1, DishCode2, DishCode3, DishCode4, DishCode5, DishCode6, DishCode7, DishCode8, DishCode9, CntDish, CntBonusDish: integer;
begin
DishCode1 := 23; // special dish code код контролируемого блюда
DishCode2 := 24; // special dish code код контролируемого блюда
DishCode3 := 25; // special dish code код контролируемого блюда
DishCode4 := 47; // special dish code код контролируемого блюда
DishCode5 := 4; // special dish code код контролируемого блюда
DishCode6 := 14; // special dish code код контролируемого блюда
DishCode7 := 43; // special dish code код контролируемого блюда
DishCode8 := 43; // special dish code код контролируемого блюда
DishCode9 := 43; // special dish code код контролируемого блюда
BonusDishCode := 45; // bonus dish code код автоматически добавляемого блюда
CntDish := 0;
CntBonusDish := 0;
every := 3; // bonus for every dish quantity
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
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)
or (TDish(it).Code = DishCode2)
or (TDish(it).Code = DishCode3)
or (TDish(it).Code = DishCode4)
or (TDish(it).Code = DishCode5)
or (TDish(it).Code = DishCode6)
or (TDish(it).Code = DishCode7)
or (TDish(it).Code = DishCode8)
or (TDish(it).Code = DishCode9)
then
CntDish := CntDish + trunc(TDish(it).Quantity);
if (TDish(it).Code = BonusDishCode) then
CntBonusDish := CntBonusDish + trunc(TDish(it).Quantity);
end;
end;
if trunc(CntDish / every)<>CntBonusDish then // удаление блюда при несоответствии требуемого количества бонусных блюд
if CntBonusDish > 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 = BonusDishCode) then
RKCheck.DeleteCheckItem(it);
end;
end;
if trunc(CntDish / every) > 0 then
if trunc(CntDish / every) >= CntBonusDish then // проверка необходимости добавления блюда
if CntBonusDish = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(BonusDishCode), IntToStr(trunc(CntDish / every)));
end;
end;Скрипт для акции «Блюда на выбор в подарок при сумме заказа 1300 руб. в определённый период»
В период Пн-Пт с 18:01 до 03:00 и Сб-Вс с 10:00 до 03:00, при сумме заказа 1300 руб. (со скидкой), в заказ, вручную, будет на выбор добавляться одно из двух блюд, либо делаться скидка 10%.
Скрипт запрещает показ эти блюд на кассе, пока сумма заказа не будет равна 1300 руб.
На форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;
qnt, qntMax: double;
checksum, LimitSim1: double;
it: TCheckItem;
CurrTime, Time1, Time2: TDateTime;
begin
qnt := 0;
DiscountCode := 2; // код акционной скидки
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
LimitSim1 := 1300; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
CurrTime := Time;
checksum := 0;
cntDisk := 0;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if (TDish(AObjectAft).code = DishCode1)or(TDish(AObjectAft).code = DishCode2) then
if not(AEditType = etRemove) then
begin
AAllow := false;
AMessage := 'Access denied';
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime)and(CurrTime<=Time2) then
begin
AAllow := true;
AMessage := '';
checksum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(checksum / LimitSim1);
// qnt := TDish(AObjectAft).Quantity; // неверно отображает количество
if TDish(AObjectAft).Quantity<>0 then
qnt := 1;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
if (TDiscountItem(it).Code = DiscountCode) then
cntDisk := cntDisk + 1; // учёт акционной скидки
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
qnt := qnt + cntDisk;
if (qnt > qntMax) then // check limit exceed
begin
// gui.showmessage('qnt='+inttostr(qnt)+'qntMax='+inttostr(qntMax));
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
end;
end;Скрипт для таймера, размещаемого на форме редактирования чека:
procedure userTimer1OnTimer(Sender: TObject);
var ToPaySum : double;
i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;
qnt, qnt_temp, qnt_temp2, qntMax: double;
LimitSum1: double;
it: TCheckItem;
CurrTime, Time1, Time2: TDateTime;
tt : TTimer;
ed: TObject;
begin
qnt := 0;
DiscountCode := 2; // код акционной скидки
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
LimitSum1 := 1300; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
CurrTime := Time;
cntDisk := 0;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) then
begin
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(ToPaySum / LimitSum1);
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
if (TDiscountItem(it).Code = DiscountCode) then
cntDisk := cntDisk + 1; // учёт акционной скидки
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
qnt := qnt + cntDisk;
if (qnt > qntMax)and(cntDisk<>trunc(qnt)) then
begin
RK7.PerformOperation(rkoHome, 0);
while True do begin
qnt_temp := 0;
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 = DishCode1)or(TDish(it).code = DishCode2) then begin
if (TDish(it).Quantity) > 0 then
if it.State = disOpened then begin
if (qnt-TDish(it).Quantity) >= qntmax then
begin
qnt := qnt - TDish(it).Quantity;
RK7.PerformOperation(rkoDeleteLine, 1); // удаление
continue;
end
else
begin
qnt_temp := qntmax-(qnt-TDish(it).Quantity);
qnt_temp2 := TDish(it).Quantity;
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
begin
TNumEditor(ed).Text := IntToStr(trunc(qnt_temp));
RK7.PerformOperation(rkoEditAmount, 0);
TNumEditor(ed).Text := '';
qnt := qnt -(qnt_temp2-qnt_temp);
end;
end
end else
begin
qnt := qnt - TDish(it).Quantity;
RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание
end;
end;
RK7.PerformOperation(rkoDown, 0);
if (qnt <= qntMax) then break;
end;
end;
end;
end;
Скрипт для применения скидки:
procedure DiscountUsage1001717(UsageParameters: TDiscountUsageParameters);
var i, DishCode1, DishCode2, cntDisk, DiscountCode: integer;
it: TCheckItem;
CurrTime, Time1, Time2: TDateTime;
qnt, qnt_temp, qnt_temp2, qntMax, ToPaySum, LimitSum1: double;
begin
qnt := 0;
DiscountCode := 2; // код акционной скидки
DishCode1 := 45; // код контролируемого блюда
DishCode2 := 46; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
LimitSum1 := 1300; // сумма чека превысив которую будет разрешено добавить бонусное блюдо.
CurrTime := Time;
cntDisk := 0;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
if not RKCheck.Valid then
exit //important checking
else
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) then
begin
ToPaySum := RKCheck.CurrentOrder.ToPaySum;
qntMax := trunc(ToPaySum / LimitSum1);
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
if (TDiscountItem(it).Code = DiscountCode) then
cntDisk := cntDisk + 1; // учёт акционной скидки
if SYS.ObjectInheritsFrom(it, 'TDish') then
if (TDish(it).code = DishCode1)or(TDish(it).code = DishCode2) then
qnt := qnt + TDish(it).Quantity;
end;
qnt := qnt + cntDisk;
begin
if (qnt < qntMax) then
UsageParameters.UsageMode := umAllow
else
UsageParameters.UsageMode := umDeny;
end;
end;
end;Скрипт автодобавления дополнительных блюд (упаковка для заказов «с собой»)
Все скрипты добавляются на форме редактирования чека
Объявление глобальной переменной в форме редактирования чека. Объявляется массив в который будут заноситься базовые блюда и идущие к ним упаковочные блюда:
var ModifArr: array of string;
Скрипт по добавлению блюд для указанного основного блюда.
procedure AddSpecDish(Dish:TDish);
var
j,p1,p2: integer;
s, dcode, AddCode, q: string;
begin
for j := 0 to GetArrayLength(ModifArr)-1 do
begin
s := ModifArr[j];
p1 := pos(';',s);
p2 := p1+pos(';',copy(s,p1+1, length(s)-p1));
dcode := copy(s,1,p1-1);
AddCode := copy(s,p1+1,p2-p1-1);
q := copy(s,p2+1, length(s)-p2);
if (Dish.Code = StrToInt(dcode) ) then
begin
RKCheck.CreateCheckItem(rkrefMenuItems, AddCode, FloatToStr(StrToFloat(q)*TDish(Dish).Quantity)); // добавление блюда с учётом количества основного блюда
end;
end;
end;Скрипт для добавления блюд всем ранее добавленным в заказ до добавления условного блюда «с собой»
procedure AddSpecDishBefore;
var i: integer;
it: TCheckItem;
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
AddSpecDish(TDish(it));
end;
end;В процедуре OnAfterCheckViewEdit компонента CheckView проверяется добавляемое блюдо. Если оно указано в массиве, то к нему добавляются заданные упаковочные блюда. Проверка каждого добавляемого блюда.
procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
var i,j,p1,p2: integer;
it: TCheckItem;
s, dcode, AddCode, q: string;
begin
if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then // check condition to add pack dishes
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if TDish(AObjectAft).Code = 20874 then // 20874 - это код условного блюда "с собой"
begin
RKCheck.CurrentOrder.UserTag1 := 30;
// add dishes for order
for j := 0 to GetArrayLength(ModifArr)-1 do
begin
s := ModifArr[j];
p1 := pos(';',s);
p2 := p1+pos(';',copy(s,p1+1, length(s)-p1));
dcode := copy(s,1,p1-1);
AddCode := copy(s,p1+1,p2-p1-1);
q := copy(s,p2+1, length(s)-p2);
if (0 = StrToInt(dcode) ) then
RKCheck.CreateCheckItem(rkrefMenuItems, AddCode, FloatToStr(StrToFloat(q)*1));
end;
// add dishes for order
AddSpecDishBefore; // добавление паковочных блюд для всех ранее добавленных в заказ позиций
end;
if (RKCheck.CurrentOrder.UserTag1 = 30) then // check condition to add pack dishes
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
AddSpecDish(TDish(AObjectAft));
end;
// checking by modifier
{ for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
begin
for j := 0 to TDish(it).Modifiers.Count - 1 do
begin
gui.showmessage('step 2 '+inttostr(TDish(it).Modifiers.Items[j].Code));
if (TDish(it).Modifiers.Items[j].Code=20) then
RKCheck.CurrentOrder.UserTag1 := 30;
end;
end;
end; }
end;На форме разместить таймер и в событии таймера указать скрипт, отслеживающий момент удаления условного блюда «с собой» для отключения режима паковки:
procedure userTimer1OnTimer(Sender: TObject);
var i,j, cnt: integer;
it: TCheckItem;
begin
cnt := 0;
if not RKCheck.Valid then
exit //important checking
else
if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then // different discounts for different tables
begin
// serch special dishes
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 = 20874 then
cnt := cnt + 1;
{ serch special modificator
for j := 0 to TDish(it).Modifiers.Count - 1 do
if (TDish(it).Modifiers.Items[j].Code=20) then }
end;
// remove tag for autoadding dishes
if cnt = 0 then
RKCheck.CurrentOrder.UserTag1 := 0;
end;
end;
Скрипт на событие OnShowScript компонента CheckView задаёт набор привязок упаковочных блюд к основным:
procedure userTimer1OnTimer(Sender: TObject);
var i,j, cnt: integer;
it: TCheckItem;
begin
cnt := 0;
if not RKCheck.Valid then
exit //important checking
else
if (RKCheck.CurrentOrder.TableCode >= 0)and(RKCheck.CurrentOrder.TableCode < 500) then // different discounts for different tables
begin
// serch special dishes
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 = 20874 then
cnt := cnt + 1;
{ serch special modificator
for j := 0 to TDish(it).Modifiers.Count - 1 do
if (TDish(it).Modifiers.Items[j].Code=20) then }
end;
// remove tag for autoadding dishes
if cnt = 0 then
RKCheck.CurrentOrder.UserTag1 := 0;
end;
end;Скрипт на автоматическое добавление порядков подачи в новый заказ
На форме редактирования заказа разместить таймер и в его событии указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var i,CntDish1:integer;
it: TCheckItem;
begin
// Проверка на корректный чек
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if RKCheck.CurrentOrder.UserTag1 = 0 then
begin
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).quantity > 0) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;
if CntDish1=0 then
begin
RKCheck.CurrentOrder.UserTag1 := 1;
RK7.PerformOperation(rkoServLineSelector, 0);
RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 4)); // код курса подачи
RK7.PerformOperation(rkoDown, 0);
RK7.PerformOperation(rkoServLineSelector, 0);
RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 1)); // код курса подачи
RK7.PerformOperation(rkoDown, 0);
RK7.PerformOperation(rkoServLineSelector, 0);
RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 3)); // код курса подачи
RK7.PerformOperation(rkoDown, 0);
end;
end;
end;Скрипт на автоматическое добавление блюда в пустой заказ и выход из заказа с сохранением
На форме редактирования чека разместить таймер, задать ему период 2 секунды и в событии OnTimer указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var i,CntDish1:integer;
it: TCheckItem;
begin
// Проверка на корректный чек
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
if RKCheck.CurrentOrder.UserTag1 = 0 then
begin
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).quantity > 0) then
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
end;
if CntDish1<>0 then RKCheck.CurrentOrder.UserTag1 := 2;
if CntDish1=0 then
begin
RKCheck.CurrentOrder.UserTag1 := 1;
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(15304), inttostr(RKCheck.CurrentOrder.Visit.GuestCnt))// here insert code of free dish
RK7.PerformOperation(rkoSaveOrder, 0);
end;
end;
end;Скрипт на автоматическое добавление блюда при регистрации карты ПДС (назначении заданной скидки)
На форме редактироования чека разместить таймер, в событии которого указать скрипт:
procedure userTimer1OnTimer(Sender: TObject);
var limit : double;
i, j: integer;
it: TCheckItem;
BonusDishCode, DiscountCode, CntDiscount, CntBonusDish, BonusDishQnt: integer;
begin
DiscountCode := 33; // special dish code код контролируемого блюда
BonusDishCode := 45; // bonus dish code код автоматически добавляемого блюда
BonusDishQnt := 3; // bonus dish quantity количество автоматически добавляемого блюда
limit := 1000;
CntDiscount := 0;
CntBonusDish := 0;
if not RKCheck.Valid then Exit;
if (GUI.CheckFormInPayMode) then exit;
if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TPrintCheckItem') then Exit;
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 = BonusDishCode) then
CntBonusDish := CntBonusDish + trunc(TDish(it).Quantity);
end;
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
begin
if (TDiscountItem(it).Code = DiscountCode) then
CntDiscount := CntDiscount + 1;
end;
end;
if CntDiscount > 0 then // удаление блюда при несоответствии требуемого количества бонусных блюд
if CntBonusDish > 0 then
if RKCheck.CurrentOrder.ToPaySum < limit 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 = BonusDishCode) then
RKCheck.DeleteCheckItem(it);
end;
end;
if RKCheck.CurrentOrder.ToPaySum >= limit then // проверка необходимости добавления блюда
if CntDiscount > 0 then
if CntBonusDish = 0 then
RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(BonusDishCode), IntToStr(BonusDishQnt));
end;
end;