...
Code Block | ||
---|---|---|
| ||
procedure userTimer1OnTimer(Sender: TObject); var CheckView: TCheckView; begin // Проверка на корректный чекChecking for correct receipt 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; |
...
specify the code of open amount discount for the order
end; |
Above this script, place the function for recalculating the previously created open amount discount for the order:
Code Block | ||
---|---|---|
| ||
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 указать:
A script to add modifiers automatically
Place a timer on the receipt editing form and specify it in its OnTimer event:
Code Block | ||
---|---|---|
| ||
procedure userTimer1OnTimer(Sender: TObject); |
...
But above this procedure insert the following:
Code Block | ||
---|---|---|
| ||
procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList); |
Должен получиться такой листинг:
As a result, you should get the following listing:
Code Block | ||
---|---|---|
| ||
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
// |
...
Checking |
...
for |
...
correct |
...
receipt 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, а не все модификаторы предыдущего блюда.
The previous script, which does not add all the modifiers of the previous dish but only the last modifier within the range of codes from 46 to 53.
Code Block | ||
---|---|---|
| ||
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; |
...
When adding one modifier of the specified range of codes, the script removes all other current dish modifiers from this range:
Code Block | ||
---|---|---|
| ||
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; |
Скрипт, добавляющий блюда при определенном типе заказа
На форме редактирования заказа добавить таймер и указать ему скрипт:
...
A script to add dishes for a certain type of order
On the order editing form, add a timer and specify a script for it:
Code Block | ||
---|---|---|
| ||
procedure userTimer1OnTimer(Sender: TObject); var i,CntDish1,OrderTypeCode,DishCode:integer; it: TCheckItem; begin //************************** Set parameters **********************************// DishCode := 220; OrderTypeCode := 1; // |
...
order |
...
type |
...
code //************************** Set parameters **********************************// // |
...
Checking |
...
for |
...
correct |
...
receipt 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; |
Скрипт, отслеживающий суммы чеков в денежных диапазонах
Необходимо при каждом превышении лимита выводить сообщение и не выводить его повторно пока не превышен следующий лимит.
Нижеприведенный скрипт отрабатывает корректно до момента печати чека. В этот момент начинают сыпаться несвоевременные сообщения.
A script to track receipt totals within money ranges
It is necessary to display a message every time the limit is exceeded and not to display it again until the next limit is exceeded.
The following script works correctly until the receipt is printed. At this moment, untimely messages begin to appear.
Code Block | ||
---|---|---|
| ||
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(' |
...
«Take a snack/dessert at a special price! (49 |
...
rub.)» '); 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; |
Скрипт на добавление\удаление блюда при определенной сумме заказа
...
A script to add or remove dishes at a certain order amount
On the order editing form, place the "TTimer?" object, naming it "userTimerSumLimit". In the properties of this object, set the trigger interval (1000 is set by default, which corresponds to 1 second). In the OnTimer event, specify the script:
Code Block | ||
---|---|---|
| ||
procedure userTimerSumLimitOnTimer(Sender: TObject);
var ToPaySum, SumInterval : double;
tt : TTimer;
i, j: integer;
it: TCheckItem;
DiscCode, DishCode, CntDish1: integer;
begin
SumInterval := 700; // limit |
...
receipt total upon reaching which the dish is added automatically DishCode := 43; // special dish code |
...
automatically |
...
added |
...
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 // deleting |
...
a |
...
dish |
...
when |
...
the |
...
receipt |
...
total |
...
is less than specified |
...
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 adding |
...
a dish |
...
when |
...
the |
...
receipt |
...
total |
...
is more than specified |
...
if CntDish1 = 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1'); end; end; |
В скрипте задать необходимые значения для SumInterval и DishCode.
...
Set the required values for SumInterval and DishCode in the script.
A script to add or remove dishes at a certain amount of the saved order
Code Block | ||
---|---|---|
| ||
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 |
...
receipt total upon reaching which the dish is added automatically DishCode := 43; // special dish code |
...
automatically |
...
added |
...
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 // |
...
deleting a dish when the receipt total is less than specified 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); // |
...
deletion continue; end else RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // |
...
write-off end; end; end; if ToPaySum >= SumInterval then // check limit exceed adding |
...
a dish when the receipt total is more than specified 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 руб
...
A script for the «Gift dish for an order amount of 1300 rubles with a discount» promotion
During the period Mon-Fri from 10:00 till 18:00 one specified dish is added manually to the order with the amount 1300 rub (with a discount). This dish should appear in the list only if the order amount is greater than or equal to 1300 rub.
Place a timer (TTimer) on the receipt editing form and specify a script in its event:
Code Block | ||
---|---|---|
| ||
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; // |
...
special |
...
dish |
...
code qntMax := 1; // |
...
special dish |
...
max |
...
quantity |
...
for |
...
the |
...
order Time1 := EncodeTime(10,00,00,00); // |
...
promotion |
...
period |
...
start Time2 := EncodeTime(18,00,00,00); // |
...
promotion |
...
period |
...
end LimitSum1 := 1300; // the receipt total |
...
over which the bonus dish will be allowed to be added CurrTime := Time; |
...
//1 = |
...
Sunday //2 = |
...
Monday //3 = |
...
Tuesday //4 = |
...
Wednesday //5 = |
...
Thursday //6 = |
...
Friday //7 = |
...
Saturday 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 // |
...
week |
...
day |
...
check 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); // |
...
deletion continue; end else RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // |
...
write-off end; RK7.PerformOperation(rkoDown, 0); end; end; end; end; |
...
A script for the OnBeforeCheckViewEdit event of the CheckView object located on the check editing form:
Code Block | ||
---|---|---|
| ||
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; // |
...
special |
...
dish |
...
code qntMax := 1; // |
...
special dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. Time1 := EncodeTime(10,00,00,00); / / |
...
|
...
promotion |
...
period |
...
start Time2 := EncodeTime(18,00,00,00); / / |
...
|
...
promotion |
...
period |
...
end LimitSim1: |
...
= 1300; / / the receipt total |
...
over which |
...
the |
...
bonus |
...
dish |
...
will |
...
be |
...
allowed |
...
to |
...
be |
...
added |
...
CurrTime |
...
:= Time; checksum := 0; / /1 = |
...
Sunday / /2 = |
...
Monday / /3 = |
...
Tuesday / /4 = |
...
Wednesday / /5 = |
...
Thursday / /6 = |
...
Friday / /7 = |
...
Saturday |
...
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 // |
...
week |
...
day |
...
check 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 указать скрипт:
A script to print the percentage of the variable discount in the bill
At the request of the client, the «Discount equal to the age» was created, which has a variable value from 0 to 60%.
The script displays the discount in the bill.
On the edit form, place the timer, and specify the script in its OnTimer event:
Code Block | ||
---|---|---|
| ||
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 указать скрипт (контролирует ручное добавление бонусного блюда):
...
A script to implement the «Buy a movie ticket and make an order from 600 rubles in the bar — and choose 1 free dish» promotion
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event (controls the manual addition of the bonus dish):
Code Block | ||
---|---|---|
| ||
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; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // |
...
special dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. LimitSum1 |
...
:= 600; // the receipt total |
...
over which the bonus dish will be allowed to be added. 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; |
...
|
A script for the timer placed on the receipt editing form (controls the automatic addition or deletion of the bonus dish):
Скрипт для таймера, размещаемого на форме редактирования чека (контролирует автоматическое добавление/удаление бонусного блюда):
Code Block | ||
---|---|---|
|
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; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // |
...
special dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. LimitSum1 |
...
:= 600; // |
...
the receipt total over which the bonus dish will be allowed to be added. |
...
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(' |
...
Does the client have a receipt with the promotion? ', 0, 3, 100000) = 6 then if GUI.RKMessageDlg(' |
...
Add |
...
dish №1?', 0, 3, 100000) = 6 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // |
...
adding |
...
dish 1 else RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // |
...
adding |
...
dish 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); // |
...
deletion 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; |
...
A script to add a dish:
Code Block | ||
---|---|---|
| ||
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; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // |
...
special dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. LimitSum1 |
...
:= 600; // the receipt total over which |
...
the |
...
bonus |
...
dish |
...
will |
...
be |
...
allowed |
...
to |
...
be |
...
added. 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; |
...
A script for the timer:
Code Block | ||
---|---|---|
| ||
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; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // special |
...
dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. LimitSum1 |
...
:= 600; // the receipt |
...
total |
...
over |
...
which |
...
the |
...
bonus |
...
dish |
...
will |
...
be allowed to be added. 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(' |
...
Does the client have a receipt with the promotion? ', 0, 3, 100000) = 6 then if GUI.RKMessageDlg(' |
...
Add |
...
dish №1?', 0, 3, 100000) = 6 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // |
...
adding |
...
dish 1 else RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // |
...
adding |
...
dish 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); // |
...
deletion 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)); // |
...
write-off end; end; RK7.PerformOperation(rkoDown, 0); if (qnt <= qntMax) then break; end; end; end; end; |
Скрипт для пользовательской операции:
A script for a custom operation:
Code Block | ||
---|---|---|
| ||
procedure ProcessOperation1001832(Parameter: integer);
var DishCode1, DishCode2: integer;
begin
DishCode1 := 45; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code if GUI.RKMessageDlg(' |
...
Does the client have a receipt with the promotion? ', 0, 3, 100000) = 6 then if GUI.RKMessageDlg(' |
...
Add |
...
dish №1?', 0, 3, 100000) = 6 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), FloatToStr(1)) // |
...
adding |
...
dish 1 else RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), FloatToStr(1)); // |
...
adding |
...
dish 2 end; |
Последний скрипт необходимо назначить пользовательской процедуре и в свойствах выставить галочку «Контроль доступа» — «ограничение доступа к пользовательской операции»
В кассовых правах пользователей появится соответствующий пункт: «кассовые права работника»
Скрипт для акции «Получи подарок за каждые три заказанные блюда из списка»
На форме редактирования чека разместить таймер. Задать ему интервал равным 200 (это время срабатывания таймера). В событии OnTimer указать скрипт:
Assign the last script to the user procedure and check the box «Access control» — «Restrict access to the user operation» in the properties.
In the cash rights of users, the corresponding item «Cash rights of the employee» will appear.
A script for the «Get a gift for every three dishes from the list» promotion
Place a timer on the receipt editing form. Set the interval equal to 200 (this is the timer triggering time). In the OnTimer event, specify the following script:
Code Block | ||
---|---|---|
| ||
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 |
...
automatically |
...
added |
...
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 // |
...
deleting a dish if the required number of bonus dishes does not match |
...
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 // |
...
checking the need to check the dish 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 руб.
...
A script for the «Make an order for 1300 rubles and choose gift dishes during a certain period» promotion
During the period Mon-Fri from 18:01 to 03:00 and Sat-Sun from 10:00 to 03:00, either one of two specified dishes is added manually to the order with the amount 1300 rub (with a discount) or a 10% discount is applied.
The script prohibits to display these dishes at the cash register until the order amount is equal to 1300 rubles.
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
Code Block | ||
---|---|---|
| ||
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; // |
...
promotional |
...
discount |
...
code DishCode1 := 45; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special dish |
...
code |
...
qntMax := 1; // |
...
controlled dish |
...
max |
...
quantity |
...
in |
...
the |
...
order. Time1 := EncodeTime(10,00,00,00); // |
...
promotion |
...
period |
...
start Time2 := EncodeTime(18,00,00,00); // |
...
promotion |
...
period |
...
end LimitSim1 := 1300; // the receipt total over which |
...
the |
...
bonus |
...
dish |
...
will |
...
be |
...
allowed |
...
to |
...
be |
...
added. CurrTime := Time; checksum := 0; cntDisk := 0; //1 = |
...
Sunday //2 = |
...
Monday //3 = |
...
Tuesday //4 = |
...
Wednesday //5 = |
...
Thursday //6 = |
...
Friday //7 = |
...
Saturday |
...
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 // |
...
week |
...
day |
...
check if (Time1<=CurrTime)and(CurrTime<=Time2) then begin AAllow := true; AMessage := ''; checksum := RKCheck.CurrentOrder.ToPaySum; qntMax := trunc(checksum / LimitSim1); // qnt := TDish(AObjectAft).Quantity; // displays |
...
the quantity |
...
incorrectly |
...
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; // |
...
promotional |
...
discount |
...
registered 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; |
...
A script for the timer placed on the receipt editing form:
Code Block | ||
---|---|---|
| ||
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; // |
...
promotional |
...
discount |
...
code DishCode1 := 45; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // special |
...
dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. Time1 := EncodeTime(10,00,00,00); // |
...
promotion |
...
period |
...
start Time2 := EncodeTime(18,00,00,00); // |
...
promotion |
...
period |
...
end LimitSum1 := 1300; // receipt |
...
total |
...
upon |
...
reaching |
...
which |
...
the |
...
dish |
...
is |
...
added |
...
automatically. CurrTime := Time; cntDisk := 0; //1 = |
...
Sunday //2 = |
...
Monday //3 = |
...
Tuesday //4 = |
...
Wednesday //5 = |
...
Thursday //6 = |
...
Friday //7 = |
...
Saturday 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 // |
...
week |
...
day |
...
check 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; // |
...
promotional |
...
discount |
...
registered 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); // |
...
deletion 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)); // |
...
write-off end; end; RK7.PerformOperation(rkoDown, 0); if (qnt <= qntMax) then break; end; end; end; end; |
...
A script to apply the discount:
Скрипт для применения скидки:
Code Block | ||
---|---|---|
|
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; // |
...
promotional |
...
discount |
...
code DishCode1 := 45; // |
...
special |
...
dish |
...
code DishCode2 := 46; // |
...
special |
...
dish |
...
code qntMax := 1; // special |
...
dish |
...
max |
...
quantity |
...
for |
...
the |
...
order. Time1 := EncodeTime(10,00,00,00); // |
...
promotion |
...
period |
...
start Time2 := EncodeTime(18,00,00,00); // |
...
promotion |
...
period |
...
end LimitSum1 := 1300; // receipt |
...
total |
...
over |
...
which |
...
the |
...
dish |
...
is |
...
added |
...
automatically. CurrTime := Time; cntDisk := 0; //1 = |
...
Sunday //2 = |
...
Monday //3 = |
...
Tuesday //4 = |
...
Wednesday //5 = |
...
Thursday //6 = |
...
Friday //7 = |
...
Saturday if not RKCheck.Valid then exit //important checking else if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // |
...
week |
...
day |
...
check 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; // |
...
promotional |
...
discount |
...
registered 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; |
Скрипт автодобавления дополнительных блюд (упаковка для заказов «с собой»)
Все скрипты добавляются на форме редактирования чека
...
A script to automatically add additional dishes (packaging for takeout orders)
All scripts are specified on the receipt editing form.
Declaring a global variable in the receipt editing form. An array is declared in which basic dishes and related packaging items will be entered:
Code Block | ||
---|---|---|
| ||
var ModifArr: array of string; |
...
A script to add dishes for the specified main dish:
Code Block | ||
---|---|---|
| ||
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)); // |
...
adding a dish considering the amount of the main dish end; |
...
end;
end;
|
A script to add dishes to all previously added to the order before adding the nominal takeout dish:
Code Block | ||
---|---|---|
| ||
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; |
...
In the OnAfterCheckViewEdit procedure of the CheckView component, the added dish is checked. If it is specified in the array, the specified packaging items are added to it. Each added dish is checked.
Code Block | ||
---|---|---|
| ||
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 - |
...
nominal |
...
takeout |
...
dish code 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; // |
...
adding packaging |
...
dishes |
...
for |
...
all |
...
items |
...
previously |
...
added |
...
to |
...
the |
...
order |
...
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; |
...
Place a timer on the form and specify a script in the timer event that tracks the moment when the nominal takeout dish is deleted to disable the packing mode:
Code Block | ||
---|---|---|
| ||
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; |
...
A script for the OnShowScript event of the CheckView component. It sets a group of bounds of packaging dishes to the main ones:
Скрипт на событие OnShowScript компонента CheckView задаёт набор привязок упаковочных блюд к основным:
Code Block | ||
---|---|---|
|
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; |
Скрипт на автоматическое добавление порядков подачи в новый заказ
На форме редактирования заказа разместить таймер и в его событии указать скрипт:
A script to automatically add dish serving sequences to a new order
Place a timer on the order editing form and insert a script in its event:
Code Block | ||
---|---|---|
| ||
procedure userTimer1OnTimer(Sender: TObject);
var i,CntDish1:integer;
it: TCheckItem;
begin
// |
...
Checking |
...
for |
...
correct |
...
receipt 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)); // |
...
serving |
...
sequence |
...
code RK7.PerformOperation(rkoDown, 0); RK7.PerformOperation(rkoServLineSelector, 0); RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 1)); // serving |
...
sequence |
...
code RK7.PerformOperation(rkoDown, 0); RK7.PerformOperation(rkoServLineSelector, 0); RK7.PerformRefObject(RK7.FindItemByCode(rkrefKurses, 3)); // serving |
...
sequence |
...
code RK7.PerformOperation(rkoDown, 0); end; end; end; |
Скрипт на автоматическое добавление блюда в пустой заказ и выход из заказа с сохранением
На форме редактирования чека разместить таймер, задать ему период 2 секунды и в событии OnTimer указать скрипт:
A script to automatically add a dish to an empty order and exit from the order saving it
Place a timer on the receipt editing form, assign a 2 seconds period to it, and insert the script in the OnTimer event:
Code Block | ||
---|---|---|
| ||
procedure userTimer1OnTimer(Sender: TObject);
var i,CntDish1:integer;
it: TCheckItem;
begin
// |
...
Checking |
...
for |
...
correct |
...
receipt 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; |
Скрипт на автоматическое добавление блюда при регистрации карты ПДС (назначении заданной скидки)
На форме редактироования чека разместить таймер, в событии которого указать скрипт:
A script to automatically add a dish when registering a PDS card (assigning a specified discount)
On the form for editing the receipt, place a timer and specify the script in its event:
Code Block | ||
---|---|---|
| ||
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 // |
...
deleting a dish if the required number of bonus dishes does not match 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 // |
...
checking the need to check the dish if CntDiscount > 0 then if CntBonusDish = 0 then RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(BonusDishCode), IntToStr(BonusDishQnt)); end; end; |