OnOperation
A script to create a markup on an order with a discount
You need to set up a service markup that will be applied to the discounted order amount.
On the receipt editing form, specify the script in the OnOperation event:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
And insert the following script above it:
procedure AddEveryOtherDiscount(DiscCode: integer);
var i, j: integer;
it, CurItem: TCheckItem;
a, PriceSum, DiscountSum, DiscPerc: double;
CheckView: TCheckView;
begin
DiscPerc := 10; // 10%
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
CurItem := RKCheck.CurrentCheckItem;
try
PriceSum := 0;
DiscountSum := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if TDiscountItem(it).code <> DiscCode then
DiscountSum := DiscountSum + TDiscountItem(it).CalcAmount;
end;
PriceSum := RKCheck.CurrentOrder.PriceListSum;
a:= (PriceSum + DiscountSum)*DiscPerc/100; // "+" because the discount amount with the "-" sign
// 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
if TDiscountItem(it).code = DiscCode then
begin
if abs(TDiscountItem(it).SrcAmount) = a then a := 0
else
begin
RKCheck.DeleteCheckItem(it);
end
break;
end;
end;
// Create discount to a dish
if a > 0 then
begin
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));
end;
finally
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
RKCheck.CurrentOrder.Recalc();
end;
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
if (operation = 420) // 420 - Calculate a check
or(operation = 455) // 455 - Pay a check
then
begin
AddEveryOtherDiscount(14); // markup code
end;
A script to divide the receipt by currency, depending on the dishes classification
Insert the script on the order editing form in the OnOperation event of the DesignForm object
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var i, CurrencyCodeForChange,CurrencyCode1,CurrencyCode2, CategCode1,CategCode2: integer;
CurrencyCodeForChangeSum,CurrencyCode1Sum,CurrencyCode2Sum, Categ1Sum,Categ2Sum: double;
it: TCheckItem;
Categ1, Categ2: TClassificatorGroup;
begin
//********** Set parameters ***********//
CurrencyCodeForChange := 1; // currency code for change
CurrencyCode1 := 18; // currency code(category 1)
CurrencyCode2 := 17; // currency code(category 2)
CategCode1 := 1; // category 1 code
CategCode2 := 8; // category 2 code
//********** Set parameters ***********//
CurrencyCodeForChangeSum := 0;
CurrencyCode1Sum := 0;
CurrencyCode2Sum := 0;
Categ1Sum := 0;
Categ2Sum := 0;
Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));
if operation = 459 then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCodeForChange) then
CurrencyCodeForChangeSum := CurrencyCodeForChangeSum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode1) then
CurrencyCode1Sum := CurrencyCode1Sum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode2) then
CurrencyCode2Sum := CurrencyCode2Sum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ1.IsChild(it.RefItem) then
if (TDish(it).Quantity > 0) then
Categ1Sum := Categ1Sum + TDish(it).PRListSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ2.IsChild(it.RefItem) then
if (TDish(it).Quantity > 0) then
Categ2Sum := Categ2Sum + TDish(it).PRListSum;
end;
end;
if (CurrencyCode1Sum=0.0) and (CurrencyCode2Sum=0.0) then
if (CurrencyCodeForChangeSum>0) and (CurrencyCodeForChangeSum=(Categ1Sum+Categ2Sum)) then
begin
for i := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCodeForChange) then
RKCheck.DeleteCheckItem(it);
end;
if Categ1Sum>0 then
RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode1), floattoStr(Categ1Sum));
if Categ2Sum>0 then
RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode2), floattoStr(Categ2Sum));
end;
end;
A script to make the "Prepayment" button temporarily inactive
Insert the script in the OnOperation property of the form:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var ed: TObject;
begin
if (Operation=rkoPrepaySelector) then
begin
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
if 0.0 >= StrToFloat(TNumEditor(ed).Text) then
gui.showmessage('Amount is not specified!!!');
end;
end;
A warning will be displayed when you click the «Prepayment» button.
Скрипт, измененяющий логику пожертвований
It is necessary to add the following functionality for accepting donations:
- When you click the «Pay» button, a pop-up appears asking if the guest wants to donate money. Answer options — «Yes» or «No».
- When you click «Yes», you will be redirected to the menu catalog with the donation.
- When you click «No», you will switch to the payment mode.
A script for the OnOperation event of the main screen form:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
if Operation = 455 then // operation code verification - payment {455 420}
if RKCheck.CurrentOrder.UserTag1 <> 1 then // verification if this dialog has been shown before
begin
if GUI.RKMessageDlg('Is the guest willing to donate?', 0, 3, 100000) = 6 then
begin
RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, 22)); // {Menu group code}
res := 1;
end;
RKCheck.CurrentOrder.UserTag1 := 1; // tag to avoid dialog reopening
end;
end;
A script to create a discount on each first course in the receipt for a certain period of time
On the receipt editing form of the main form, insert the script in the OnOperation event:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
dbg.dbgprint('Operation '+IntToStr(Operation));
if Operation = 459 then // payment operation code
AddEveryOtherDiscount(11); // calling the procedure for calculating the discount with the indicated code of the open fixed amount discount for the dish
end;
But before this script, insert the procedure:
procedure AddEveryOtherDiscount(DiscCode: integer);
var
i, j, k, PresentCnt: integer;
it, CurItem: TCheckItem;
SL: TStringList;
a, CalcDiscount, q, Price, DiscPrc: double;
d: TDish;
CheckView: TCheckView;
CurrTime, Time1, Time2: TDateTime;
begin
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
//********** Set parameters ***********//
DiscPrc := 0.5; // discount percentage in shares
Time1 := EncodeTime(10,00,00,00); // promotion period beginning
Time2 := EncodeTime(18,00,00,00); // promotion period ending
//********** Set parameters ***********//
CurrTime := Time;
//1 = Sunday
//2 = Monday
//3 = Tuesday
//4 = Wednesday
//5 = Thursday
//6 = Friday
//7 = Saturday
CurItem := RKCheck.CurrentCheckItem;
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // week day check
if (Time1<=CurrTime) and(CurrTime<=Time2) then // time check
begin
SL := TStringList.Create;
try
// Create list of the dishes, as is
SL.Sorted := True;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
PresentCnt := 0;
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only
if ((it.State = disOpened) or (it.State = disPrinted)) then
begin
for j:= 0 to SL.Count - 1 do // cheking present dish in list
begin
d:= TDish(SL.Objects[j]);
if (TDish(it).Code = TDish(d).Code) then
PresentCnt := PresentCnt + 1;
end;
if PresentCnt = 0 then // adding dish to list`
begin
if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price
else Price := TDish(it).PRListSum/TDish(it).Quantity;
SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI),
TObject(it));
end;
end;
end;
//Magic
k:= -1;
q:=0;
for i:= 0 to SL.Count - 1 do
begin
d:= TDish(SL.Objects[i]);
CalcDiscount:= 0;
q:=q+ d.Quantity;
if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price
else Price := d.PRListSum/d.Quantity;
if k = -1 then
begin
CalcDiscount:= CalcDiscount + Price*DiscPrc; // DiscPrc % discount
end;
// Delete discount, if CalcDiscount sum changed
for j := RKCheck.CheckItemCount(TObject(d.Discounts)) - 1 downto 0 do
begin
it := RKCheck.CheckItemByNumber(TObject(d.Discounts), j);
if (it.Code = DiscCode) then
begin
if abs(TDiscountItem(it).SrcAmount) = CalcDiscount then CalcDiscount := 0
else RKCheck.DeleteCheckItem(it);
break;
end;
end;
// Create discount to CalcDiscount dish
if CalcDiscount > 0 then
begin
CheckView.GotoItem(TObject(d));
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(CalcDiscount));
end;
end;
finally
SL.Free();
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
end;
RKCheck.CurrentOrder.Recalc();
end;