A script to prohibit adding dishes if the order amount is less than the specified one
The script prohibits adding a gift dish if the order amount is less than the specified one (300 rubles):
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var DishCode1: integer; begin //********** Set parameters ***********// DishCode1 := 46; // non-addable dish code //********** Set parameters ***********// if RKCheck.CurrentOrder.ToPaySum < 300 then // the check amount below which the dish selector is hidden if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if (TDish(AObjectAft).Code = DishCode1) then begin AAllow := false; AMessage := 'Запрещено добавлять блюдо '+TDish(AObjectAft).Name+' !'; end; end;
A script to prohibit the payment in the currency with the code «1», if there is a discount or a markup with the code «5» in the receipt
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, discpresent: integer; it: TCheckItem; begin discpresent := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then if (it.Code = 5) then discpresent := discpresent + 1; end; if discpresent > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=1) then begin AAllow := false; AMessage := 'Payment in this currency is prohibited!'; end; end;
A script to prohibit the payment of the order to everyone except the main waiter of the order
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); begin if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if tClassifierItem(RK7.FindItemBySifr(rkrefEmployees,rk7.CashUser.Ident)).MainParent.Code <> 2 then // check for manager if RKCheck.CurrentOrder.MainWaiter <> RK7.CashUser.ident then // check mainwaiter with current waiter begin AAllow := false; AMessage := 'You aren't mainwaiter for this order!'; end; end;
A script for editing an order if a PDS discount is available
Cashiers should be prohibited to add new dishes after entering the customer's card details. But they should be able to edit the order (apply bonuses, delete or replace the customer's card in the order, etc.)
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, discCode, currCode:integer; discPresent:boolean; it: TCheckItem; begin discPresent := false; discCode := 14; //код скидки ПДС if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then 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 discPresent := true; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') and discPresent then begin AAllow := false; AMessage := 'Adding dishes is prohibited because the card is used.'; end; end;
A script to prohibit the payment in a specified currency if there are discounts in the receipt
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, discCode, currCode:integer; discPresent:boolean; it: TCheckItem; begin discPresent := false; discCode := 3; //discount code currCode := 1; //prohibited currency code 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 then discPresent := true; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if ((TPayLine(AObjectAft).code=currCode) and discPresent) then // specify prohibited currency code begin AAllow := false; AMessage := 'Payment is prohibited if there is a discount'; end; end;
A script to prohibit making a prepayment if there is no discount in the order
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, discountpresent, DiscountCode: integer; it: TCheckItem; begin DiscountCode := 10; // manageable discount code discountpresent := 0; // checking discount presence in the order 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=DiscountCode then if TDiscountItem(it).CalcAmount < 0 then discountpresent := discountpresent + 1; end; // payment control if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if discountpresent > 0 then AAllow:= True else begin AAllow := false; AMessage := 'Apply the discount!'; end; end;
A script to restrict the payment in a certain currency in the receipt
There are coupons with certain denominations (2000 rubles). If the order amount is < 2000 rubles, the guest can pay the order in full in this currency. If the amount is > 2000 rubles, 2000 rubles can be paid in this currency, and the rest — either in cash or by non-cash payment.
Add a script to the OnBeforeCheckViewEdit event of the CheckView object on the order editing form:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, codecurr: integer; currsum, limitcurrsum: double; it: TCheckItem; begin currsum := 0; limitcurrsum := 2000; // currency payment limit codecurr := 5; // currency code 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 = codecurr) then currsum := currsum + TPayLine(it).NationalSum; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code = codecurr) then if (currsum + TPayLine(AObjectAft).NationalSum) > limitcurrsum then begin AAllow := false; AMessage := 'Payment in this currency is limited to '+FloatToStr(limitcurrsum)+' !'; end; end;
A script to change the activity of the national currency button
When paying, the script checks the currency of the payment. If it coincides there with the first currency code, payment in the second currency will be prohibited.
Replace the currency codes with the current ones in the script lines with comments.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, currpresent: integer; it: TCheckItem; begin currpresent := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if (it.Code = 1) then // code of first currency (Lit) if TPayLine(it).CurrLineSum > 0 then currpresent := currpresent + 1; end; if currpresent > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=2) then // code of second currency (Euro) if TPayLine(AObjectAft).CurrLineSum >=0 then begin AAllow := false; AMessage := 'Payment in this currency is prohibited!'; end; end;
A script to prohibit a combined payment in fiscal and non-fiscal currencies
The script prohibits combining the specified currency type with other currency types. Insert it in the OnBeforeCheckViewEdit event, on the receipt editing form for the CheckView object:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrType1Code, CntCurrType1, CntCurrTypeOther: integer; it: TCheckItem; begin CurrType1Code := 91; // code of the currency type for which to prohibit combining with other currencies if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; CntCurrType1 := 0; CntCurrTypeOther := 0; if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; end; end; if (CntCurrType1 > 0) and (CntCurrTypeOther > 0) then begin AAllow := False; AMessage := 'This currency combination is prohibited!'; Exit; end; end;
A script for combining fiscal and non-fiscal currencies with PDS payments
Non-cash payments should be combined only with payment cards, but it should be allowed to combine PDS payments with other groups.
The script prohibits combining the CurrType1Code and CurrType2Code currency types with other currencies but allows to combine them with each other.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrType1Code, CurrType2Code, CntCurrType1, CntCurrType2, CntCurrTypeOther: integer; it: TCheckItem; begin CurrType1Code := 91; // code of the currency type for which to prohibit combining with other currencies CurrType2Code := 99; // code of the currency type for which to prohibit combining with other currencies if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; CntCurrType1 := 0; CntCurrType2 := 0; CntCurrTypeOther := 0; if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; end; end; if ((CntCurrType1 > 0)or(CntCurrType2 > 0)) and (CntCurrTypeOther > 0) then begin AAllow := False; AMessage := 'This currency combination is prohibited!'; Exit; end; end;
Currency type 1 is allowed to combine with currency type 2, but is prohibited to combine with other currencies.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrType1Code, CurrType2Code, CntCurrType1, CntCurrType2, CntCurrTypeOther: integer; it: TCheckItem; begin CurrType1Code := 91; // code of the currency type for which to prohibit combining with other currencies except for currency type 2 CurrType2Code := 99; // currency type code if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; CntCurrType1 := 0; CntCurrType2 := 0; CntCurrTypeOther := 0; if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code then CntCurrType1 := CntCurrType1 + 1 else if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; end; end; if (CntCurrType1 > 0) and (CntCurrTypeOther > 0) then begin AAllow := False; AMessage := 'This currency combination is prohibited!'; Exit; end; end;
A script to combine fiscal and non-fiscal currencies
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrType1Code1,CurrType1Code2,CurrType1Code3,CurrType1Code4, CurrType2Code1,CurrType2Code2,CurrType2Code3,CurrType2Code4, CntCurrType1, CntCurrType2, CntCurrTypeOther: integer; it: TCheckItem; begin //********** Set parameters ***********// CurrType1Code1 := 91; // fiscal currency type code CurrType1Code2 := 93; // fiscal currency type code CurrType1Code3 := 1; // fiscal currency type code CurrType1Code4 := 2; // fiscal currency type code CurrType2Code1 := 14; // non-fiscal currency type code CurrType2Code2 := 94; // non-fiscal currency type code CurrType2Code3 := 13; // non-fiscal currency type code CurrType2Code4 := 24; // non-fiscal currency type code //********** Set parameters ***********// if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; CntCurrType1 := 0; CntCurrType2 := 0; CntCurrTypeOther := 0; if (TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code1) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code2) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code3) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code4) then CntCurrType1 := CntCurrType1 + 1 else if (TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code1) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code2) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code3) or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code4) then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if TPayLine(it).state <> disDeleted then begin // payment status if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code1) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code2) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code3) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code4) then CntCurrType1 := CntCurrType1 + 1 else if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code1) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code2) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code3) or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code4) then CntCurrType2 := CntCurrType2 + 1 else CntCurrTypeOther := CntCurrTypeOther + 1; end; end; if (CntCurrType1 > 0) and (CntCurrType2 > 0) then begin AAllow := False; AMessage := 'This currency combination is prohibited!'; Exit; end; end;
A script to restrict payments in different currencies
The script prohibits mixed payment - you can not pay the bill in both rubles and a credit card
or make two payments: rubles+rubles or credit card+credit card
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrCode1, CurrCode2, curr1present, curr2present: integer; it: TCheckItem; Categ: TClassificatorGroup; CategCode: integer; begin CategCode := 17; // category code CurrCode1 := 1; // currency code 1 (rubles+rubles) CurrCode2 := 5: // currency code 2 (credit card+credit card) curr1present := 0; curr2present := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if not(AEditType = etRemove) then if RKCheck.CurrentOrder.UserTag1 = 0 then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then if Categ.IsChild(TDish(AObjectAft).RefItem) then if GUI.RKMessageDlg('HAVE YOU CHECKED THE DOCUMENTS ?! '+#13#10+' We do not sell beer to Guests born later than ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'FINE FOR ADMINISTRATIVE OFFENSE IS 30 000 rub. FROM THE CASHIER!', 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // label to avoid dialog reopening AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; // Check that there are no payments in other currencies in the order // (change can only be given in the same currency) for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if (it.Code = CurrCode1 ) then // code of first currency (Lit) if TPayLine(it).CurrLineSum > 0 then curr1present := curr1present + 1; if (it.Code = CurrCode2 ) then // code of first currency (Lit) if TPayLine(it).CurrLineSum > 0 then curr2present := curr2present + 1; if TPayLine(it).Sifr <> TPayLine(AObjectAft).Sifr then begin AAllow := False; AMessage := 'The change must be given in the same currency as the main payment'; Exit; end; end; end; // Prohibit making a payment less than the order amount if (TPayLine(AObjectAft).BasicSum > 0) and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum) then begin AAllow := False; AMessage := 'You can't pay less than the order amount'; end; // Entering more than one payment is prohibited if curr1present > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=CurrCode1) then // code of 1st currency if TPayLine(AObjectAft).CurrLineSum >=0 then begin AAllow := false; AMessage := 'Payment prohibited because there was already a payment in this currency!'; end; if curr2present > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=CurrCode2) then // code of 2nd currency if TPayLine(AObjectAft).CurrLineSum >=0 then begin AAllow := false; AMessage := 'Payment prohibited because there was already a payment in this currency!'; end; end;
A modified script for two types of credit cards:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrCode1, CurrCode2, CurrCode2_2, curr1present, curr2present: integer; it: TCheckItem; Categ: TClassificatorGroup; CategCode: integer; begin CategCode := 17; // category code CurrCode1 := 1; // currency code 1 (rubles+rubles) CurrCode2 := 5: // currency code 2 (credit card+credit card) CurrCode2_2 := 6; // currency code 2 (credit card+credit card) curr1present := 0; curr2present := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if not(AEditType = etRemove) then if RKCheck.CurrentOrder.UserTag1 = 0 then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then if Categ.IsChild(TDish(AObjectAft).RefItem) then if GUI.RKMessageDlg('HAVE YOU CHECKED THE DOCUMENTS ?! '+#13#10+' We do not sell beer to Guests born later than ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'FINE FOR ADMINISTRATIVE OFFENSE IS 30 000 rub. FROM THE CASHIER!', 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // label to avoid dialog reopening AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; // Check that there are no payments in other currencies in the order // (change can only be given in the same currency) for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if (it.Code = CurrCode1 ) then // code of first currency (Lit) if TPayLine(it).CurrLineSum > 0 then curr1present := curr1present + 1; if (it.Code = CurrCode2 ) or (it.Code = CurrCode2_2) then // code of first currency (Lit) if TPayLine(it).CurrLineSum > 0 then curr2present := curr2present + 1; if TPayLine(it).Sifr <> TPayLine(AObjectAft).Sifr then begin AAllow := False; AMessage := 'The change must be given in the same currency as the main payment'; Exit; end; end; end; // prohibit making a payment less than the order amount if (TPayLine(AObjectAft).BasicSum > 0) and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum) then begin AAllow := False; AMessage := 'You can't pay less than the order amount'; end; // Entering more than one payment is prohibited if curr1present > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=CurrCode1) then // code of 1st currency if TPayLine(AObjectAft).CurrLineSum >=0 then begin AAllow := false; AMessage := 'Payment prohibited because there was already a payment in this currency!; end; if curr2present > 0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=CurrCode2) or (TPayLine(AObjectAft).code=CurrCode2_2) then // code of 2nd currency if TPayLine(AObjectAft).CurrLineSum >=0 then begin AAllow := false; AMessage := 'Payment prohibited because there was already a payment in this currency!'; end; end;
A script to limit the payment amount in the currency
Cashiers should not be able to enter 100% payment with loyalty points.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrencyCode: integer; currsum: double; it: TCheckItem; begin //********** Set parameters ***********// CurrencyCode := 1; // currency (bonuses) code //********** Set parameters ***********// currsum := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if (it.Code = CurrencyCode) then currsum := currsum + TPayLine(it).NationalSum; end; if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code = CurrencyCode) then if ((currsum+TPayLine(AObjectAft).NationalSum) > (RKCheck.CurrentOrder.ToPaySum-1)) then begin AAllow := false; AMessage := 'Payment by bonuses is exceeded!'; end; end;
A script for limiting the payment amount by the classification
The script calculates the amount of dishes from the specified category and does not allow to enter the amount of currency that exceeds this amount. The limit on exceeding the maximum amount is also checked by setting the MaxCurrSum variable.
Insert the script on the order editing form in the OnBeforeCheckViewEdit event of the CheckView object:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrencyCode, CategCode: integer; currsum, MaxCurrSum, CategSum: double; it: TCheckItem; Categ: TClassificatorGroup; begin //********** Set parameters ***********// CurrencyCode := 1; // currency (bonuses) code CategCode := 25; // food category code to limit the payment amount in currency MaxCurrSum := 500; // maximum payment amount in the specified currency //********** Set parameters ***********// currsum := 0; CategSum := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code = CurrencyCode) 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 = CurrencyCode) then currsum := currsum + TPayLine(it).NationalSum; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if Categ.IsChild(it.RefItem) then if (TDish(it).Quantity > 0) then CategSum := CategSum + TDish(it).PRListSum end; if ((currsum+TPayLine(AObjectAft).NationalSum) > CategSum) then begin AAllow := false; AMessage := 'Currency payment exceeded !'; end; if ((currsum+TPayLine(AObjectAft).NationalSum) > MaxCurrSum) then begin AAllow := false; AMessage := 'Maximum amount of currency payment exceeded !'; end; end; end;
A script to limit vouchers to 50%
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, codecurr: integer; currsum, limitcurrsum: double; it: TCheckItem; begin currsum := 0; limitcurrsum := round(RKCheck.CurrentOrder.ToPaySum*0.5); // limit sum codecurr := 16; // Currency code 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 = codecurr) then begin dbg.dbgprint('TPayLine(it).NationalSum='+floattostr(TPayLine(it).NationalSum)); currsum := currsum + TPayLine(it).NationalSum; end; end; dbg.dbgprint('currsum='+floattostr(currsum)); if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then begin //dbg.dbgprint('TPayLine(AObjectAft).code='+inttostr(TPayLine(AObjectAft).code)); if (TPayLine(AObjectAft).code = codecurr) then begin dbg.dbgprint('TPayLine(AObjectAft).BasicSum='+floattostr(TPayLine(AObjectAft).BasicSum)); dbg.dbgprint('TPayLine(AObjectAft).OriginalSum='+floattostr(TPayLine(AObjectAft).OriginalSum)); dbg.dbgprint('TPayLine(AObjectAft).DBKurs='+floattostr(TPayLine(AObjectAft).DBKurs)); if (currsum + TPayLine(AObjectAft).BasicSum) > limitcurrsum then begin dbg.dbgprint('(currsum + TPayLine(AObjectAft).BasicSum) > '+floattostr(limitcurrsum)); AAllow := false; AMessage := 'Payment is limited by this currency '+FloatToStr(limitcurrsum)+' !'; end; end; end; end;
A script to limit the purchase of dishes (no more than twice a day)
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i,dd: integer; tmp1 : string; begin dd := 0; if (AEditType = etInsert) and SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then begin if TDiscountItem(AObjectAft).CardCode <> '' then begin tmp1 := TDiscountItem(AObjectAft).CardCode; if pos('778=', tmp1) = 1 then begin delete(tmp1, 1, 4); tmp1 :=copy(tmp1, pos('=', tmp1) + 1, 7); i := RKCheck.GetDiscountCount(TDiscountItem(AObjectAft).Sifr, TDiscountItem(AObjectAft).MInterface, TDiscountItem(AObjectAft).CardCode); dd := StrToIntDef(tmp1,0); if (dd>=100) and (dd<=500) then if i > 0 then begin AAllow := False; AMessage := 'PDS can be used only once a day!'; end; if (dd>=5001) and (dd<=6000) then if i > 1 then begin AAllow := False; AMessage := 'PDS can be used only twice a day!'; end; end; end; end; end;
A script to add a free dish
A special offer: order 2 desserts (1st category of dishes) and get a free drink (2nd category of dishes). You need a script to add a 100% discount to a dish of the 2nd category if 2 dishes of the 1st category are added to the order.
Insert the script specified below on the order form for the CheckView component in the OnAfterCheckViewEdit event. Specify the corresponding category codes in this script. Для блюд из бесплатной категории выставить свойства: For dishes from the free category, set the following properties:
- Prices — an open price: V
- Servings — Add to order: "Separate line for each serving"
The script resets the price of the added dish from the «bonus» category to zero if the required number of dishes from the main category is ordered.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, j, k: integer; it: TCheckItem; a: double; CntCateg1, CntCateg2: integer; Categ1, Categ2: TClassificatorGroup; begin CntCateg1 := 0; CntCateg2 := 0; k := 0; Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', 1)); //1 - category code Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', 8)); //8 - category code if SYS.ObjectInheritsFrom(TObject(AObjectBef), 'TDish') then if Categ1.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish begin for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only begin if Categ1.IsChild(it.RefItem) then //Check category of the dish CntCateg1 := CntCateg1 + trunc(TDish(it).Quantity); if Categ2.IsChild(it.RefItem) then //Check category of the dish if TDish(it).Price = 0 then CntCateg2 := CntCateg2 + trunc(TDish(it).Quantity); end; end; if Categ1.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish CntCateg1 := CntCateg1 - 1; if Categ2.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish CntCateg2 := CntCateg2 - 1; k := (CntCateg1 div 2) - CntCateg2; if k>0 then begin if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only if Categ2.IsChild(TDish(AObjectAft).RefItem) then //Check category of the dish if trk7menuItem(TDish(AObjectAft).RefItem).OpenPrice then begin TDish(AObjectAft).IsUserPrice := true; TDish(AObjectAft).UserPrice := 0; end; end; if k<0 then while k<0 do begin for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin it := RKCheck.CurrentOrder.Sessions.Lines[j]; if Categ2.IsChild(it.RefItem) then //Check category of the dish if TDish(it).Price = 0 then begin k := k + trunc(TDish(it).Quantity); RKCheck.DeleteCheckItem(it); end; end; end; end; end;
A script to confirm payment by a defaulter
«Whole amount+confirmation» is set in the currency «Autofill» property. When paying for the order in this currency, the following message appears: «Do you want to pay the bill using "Staff meals?»
The scripts, given below, provide the user's confirmation of payment in currency with the code «1». They are triggered by entering the amount of this currency in the check.
First, you need to create an empty script for a custom operation:
procedure ProcessOperation1001446(Parameter: integer); begin end;
Assign this script to a custom operation. Give the access rights for this user operation only to the manager.
On the order editing form for the CheckView component, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); begin begin if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code=1) then if RK7.CashUser.ConfirmOperation(rkoUser07) then AAllow := True else begin AAllow := false; AMessage := 'Payment in this currency is prohibited!'; end; end; end;
A script to remove discounts when paying by a defaulter
A script for the OnBeforeCheckViewEdit event of the CheckView component on the order editing form:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i: integer; it: TCheckItem; begin if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=91 then // 91 - code of currency type for which to prohibit discounts in the check begin for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then RKCheck.DeleteCheckItem(it); end; end; end;
the MainParent property is implemented in 7.5.2.253.
There is no such property in the 7.4.21 branch.
A script to prohibit more than 15 dishes in the order
On the edit form for the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i: integer; qnt: double; it: TCheckItem; begin qnt := 0; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if not(AEditType = etRemove) then begin qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).Quantity; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDish') then qnt := qnt + TDish(it).Quantity; end; end; if qnt > 15 then // check limit exceed begin AAllow := false; AMessage := 'Quantity exceeded the permitted limit '; end; end;
A script to add only dishes from a certain category to the check
The scenario:
- Create an order.
- Add the first dish. It is placed in the category with code, f.ex., 257.
- Add the second dish.
- The script verifies the category code of the added dish and compares it with the category code of the first added dish.
- If they are equal, then add the dish to the order.
- If different, it outputs the message «This dish has different department code. \n Please create different (next) order with this dish» and the dish is not added to the order.
- Check every next dish the same way.
The objective: to ensure that only dishes from the same category of the classification are included in the check.
The classification code can also be specified in the script for verification.
The script checks the menu category of the first dish in the order and does not allow to add dishes from other menu groups.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i,CntDish1,numcateg:integer; it: TCheckItem; Categ: TClassificatorGroup; firstdish: boolean; begin if AEditType = etInsert then begin CntDish1 := 0; firstdish := false; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDish') then if ((it.State = disOpened) or (it.State = disPrinted)) then if TDish(it).Quantity > 0 then begin if not(firstdish) then begin numcateg := TDish(it).RefItem.MainParent.code; firstdish := true; end; CntDish1 := CntDish1 + trunc(TDish(it).Quantity); break; end; end; if CntDish1<>0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin if (TDish(AObjectAft).RefItem.MainParent.code <> numcateg) then //Check category of the dish begin AMessage := 'This dish has different department code.'+#10#13+'Please create different (next) order with this dish'; AAllow := false; end; end; end; end;
The script controls adding the dishes from the specified classification according to the category of the first dish in the order:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i,j,CntDish1,ClassifCode1:integer; it: TCheckItem; Categ1Firts,Categ1,Classif1: TClassificatorGroup; firstdish: boolean; begin //************************** Set parameters **********************************// ClassifCode1 := 16; // code classificator //************************** Set parameters **********************************// if AEditType = etInsert then begin CntDish1 := 0; firstdish := false; Classif1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', ClassifCode1)); for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDish') then if ((it.State = disOpened) or (it.State = disPrinted)) then if TDish(it).Quantity > 0 then begin if not(firstdish) then begin for j := 0 to Classif1.ChildCount - 1 do begin Categ1 := TClassificatorGroup(Classif1.ChildItem(j)); if Categ1.IsChild(it.RefItem) then begin Categ1Firts := Categ1; break; end; end; firstdish := true; end; CntDish1 := CntDish1 + trunc(TDish(it).Quantity); break; end; end; if CntDish1<>0 then if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin if not(Categ1Firts.IsChild(TDish(AObjectAft).RefItem)) then //Check category of Classification begin AMessage := 'This dish has different department code.'+#10#13+'Please create different (next) order with this dish'; AAllow := false; end; end; end; end;
A script to control alcohol sale
The operation mode of the cash register is a quick check. When adding a dish from a certain category to the order (for KFC, the Crunch/18Alkdish category is alcoholic beverages), the following dialog box is displayed to the cashier:
_____________________________
HAVE YOU CHECKED THE DOCUMENTS?! (large)
YES button NO button
we do not sell alcohol to guests born
later than October 15, 1996*
____________________________
*the system calculates the legal age tip for the cashier
(so that they do not have to count) automatically - 18 years + 1 day
- If the cashier chooses YES, then the dish is added to the order.
- Another dish from this category added to the same order does not re-open this dialog box. The dish selector remains in the same folder.
- If the cashier selects NO, then the dish is not added to the order and the cash register returns to the root folder of the menu.
On the quick check editing form, insert the script for the CheckView object in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var Categ: TClassificatorGroup; CategCode: integer; begin CategCode := 8; // category code Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); if not(AEditType = etRemove) then if RKCheck.CurrentOrder.UserTag1 = 0 then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then if Categ.IsChild(TDish(AObjectAft).RefItem) then if GUI.RKMessageDlg('HAVE YPU CHECKED THE DOCUMENTS?! '+#13#10+' We do not sale alcohol to the Guests born later than '+FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date)) - 18), 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // label to avoid dialog re-opening AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; end;
A script for the CheckView object in the OnOrderVerify event:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean); begin if AVerifyType = vtNewQuickCheck then if RKCheck.CurrentOrder.IsEmpty then RKCheck.CurrentOrder.UserTag1 := 0; end;
A script to display a message requesting the guest's age when selling alcohol
On the order editing form, insert the CheckViewOnBeforeCheckViewEdit script and specify the SliceStrToStrings auxiliary procedure above it.
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 CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var Categ, Categ2: TClassificatorGroup; CategCode, CategCode2: integer; sdate: string; bdate, cdate: TDateTime; Day, Year, Month: integer; SLtmp: TStringList; begin CategCode := 8; // enter the alcohol category code here CategCode2 := 5; // enter the alcohol category code here cdate := EncodeDate((StrToInt(FormatDateTime('yyyy',Date)) - 18), StrToInt(FormatDateTime('mm',Date-1)),StrToInt(FormatDateTime('dd',Date-1))); Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2)); if RKCheck.CurrentOrder.UserTag2 = 20000 then if RK7.CashUser.ConfirmOperation(rkoUser08) then AAllow := True else begin AAllow := false; AMessage := 'Manager confirmation required!'; exit; end; if not(AEditType = etRemove) then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then if (Categ.IsChild(TDish(AObjectAft).RefItem)) or (Categ2.IsChild(TDish(AObjectAft).RefItem)) then if (RKCheck.CurrentOrder.UserTag2 <> 10000) then begin AAllow := False; AMessage := 'Wrong date format!!!'; sdate:=gui.InputBox('Date of birth dd. mm. yyyy', 'Enter the guest's date of birth', '', true); if length(trim(sdate))<>10 then begin AMessage := 'Wrong date format!'; AAllow := False; end else try SLtmp := TStringList.Create; SLtmp.Clear; SLtmp.Sorted := false; SliceStrToStrings(sdate,'.',SLtmp); bdate := EncodeDate(StrToInt(SLtmp.strings[2]),StrToInt(SLtmp.strings[1]),StrToInt(SLtmp.strings[0])); if bdate<=cdate then begin RKCheck.CurrentOrder.UserTag2 := 10000; RKCheck.UpdateVisitComment('',DateToStr(bdate)); AAllow := True; end else if bdate>cdate then begin RKCheck.CurrentOrder.UserTag2 := 20000; AMessage := 'Guest under the age of 18. Alcohol sale prohibited!'; AAllow := False; end else gui.showmessage('Error of birth date input'); finally SLtmp.Free(); end; end; end;
A script to add no more than one combo dish with a certain code into a quick check
A script to add no more than one combo dish «STAFF MEALS» with the code 157 into a quick check.
Insert the script on the quick check editing form of the CheckView object in the OnBeforeCheckViewEdit event.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, DishCode1: integer; qnt, qntMax: double; it: TCheckItem; begin qnt := 0; DishCode1 := 34; // special dish code qntMax := 1; // special dish max quantity in the order. if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if TDish(AObjectAft).code = DishCode1 then if not(AEditType = etRemove) then begin qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).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; end; if qnt > qntMax then // check limit exceed begin AAllow := false; AMessage := 'Quantity exceeded the permitted limit '; end; end;
The script checks the dish added to the order, counting its current quantity. If it exceeds the specified limit, the addition of the dish is blocked.
A script to prohibit the payment for the table before swiping the loyalty card (PDS)
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
The example for three categories:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CategCode, CategCode2, CategCode3, dishpresent: integer; it: TCheckItem; Categ, Categ2, Categ3: TClassificatorGroup; CardCode: string; McrPay: TMcrPay; begin CategCode := 8; // special dishes category dishpresent := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2)); Categ3 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode3)); CardCode := ''; // checking the card presence in the order for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.ItemCount - 1 do begin McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Items[i]); CardCode := McrPay.CardNum; end; // checking the special dishes presence in the order for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then if Categ.IsChild(it.RefItem) then dishpresent := dishpresent + 1; if Categ2.IsChild(it.RefItem) then dishpresent := dishpresent + 1; if Categ3.IsChild(it.RefItem) then dishpresent := dishpresent + 1; end; // payment control if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if dishpresent > 0 then if CardCode <> '' then AAllow:= True else begin AAllow := false; AMessage := 'Use PLASTEK card!'; end; end;
A script for changing the payment type
The scripts block adding any objects to the receipt except for the payment in the allowed currency when changing the payment currency in a closed receipt.
A script for the selector:
procedure ProcessOperation1003036(Parameter: integer); var i, HaveCurrency1, HaveDenyCurr, AllowCurrType1, DennyCurrType1: integer; it: TCheckItem; begin //***************** Set parameters ***********************// DennyCurrType1 := 91; // Code of currency type AllowCurrType1 := 15; // Code of currency type //***************** Set parameters ***********************// HaveCurrency1 := 0; HaveDenyCurr := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = AllowCurrType1) then HaveCurrency1 := HaveCurrency1 + 1; if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = DennyCurrType1) then HaveDenyCurr := HaveDenyCurr + 1; end; end; if HaveDenyCurr > 1 then begin gui.showmessage('You can''t change this payment!'); exit; end; if HaveCurrency1 > 0 then begin RKCheck.CurrentOrder.UserTag1 := 10000; RK7.PerformOperation(rkoUndoReceipt,0); RKCheck.CurrentOrder.UserTag1 := 10000; end else gui.showmessage('You can''t change this payment!'); end;
On the check editing form of the CheckView object, insert the script in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var AllowCurrType1: integer; i, numcateg, TypeCurrCode, CurrCode, maxqntvoucher: integer; categsum, currsum,vouchersum: double; it: TCheckItem; Categ: TClassificatorGroup; begin //********************* 54276 ********************* //***************** Set parameters ***********************// numcateg := 39; // Code of dish category TypeCurrCode := 91; // Code of currency type //***************** Set parameters ***********************// currsum := 0; categsum := 0; maxqntvoucher := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg)); // category code if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=TypeCurrCode then // checking dish category begin CurrCode := TPayLine(AObjectAft).Code; 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 Categ.IsChild(it.RefItem) then //Check category of the dish if TDish(it).Quantity > 0 then categsum := categsum + TDish(it).PRListSum; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if (it.Code = CurrCode) then if (TPayLine(it).BasicSum > 0) then currsum := currsum + TPayLine(it).NationalSum; end; vouchersum := TPayLine(AObjectAft).DBKurs; maxqntvoucher := trunc(0.99+categsum / vouchersum); if (categsum > 0) and (maxqntvoucher=0) then maxqntvoucher := 1; if ((currsum + vouchersum*TPayLine(AObjectAft).OriginalSum)/vouchersum) > (maxqntvoucher) then begin AAllow := false; AMessage := 'Decreese quantity of vouchers to '+IntToStr(maxqntvoucher)+' !'; end; end; //********************* 54276 ********************* //********************* 53641 ********************* //***************** Set parameters ***********************// AllowCurrType1 := 91; // allow curency type //***************** Set parameters ***********************// if RKCheck.CurrentOrder.UserTag1 = 10000 then // it's don't work in current version R-Keeper begin AMessage := 'Denied this action!'; AAllow := False; if not(AEditType = etRemove) then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TPayLine') then if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=AllowCurrType1 then // ??? ???? ?????? ??? ???????? ?????????????? ?????????? ?????? begin AAllow := True end else begin AMessage := 'You can''t add this currency'; AAllow := False; end; if AAllow then begin RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,342)); // print check end; end; //********************* 53641 ********************* end;
A script to change the payment type
You need a script allowing you to change the payment type in the already printed receipt.
Preparation:
- Create 2 currencies:
- the first currency type is Cash.
- the second currency type is Cards.
- Specify script codes for these currencies.
- Create canceling reason (Change payment type) Specified its code in the script.
The scenario:
- Print the receipt
- Go to closed orders.
- Choose the receipt to change the payment type for.
- Press the «Change payment type» button.
- The script checks the code of the currency for which the receipt is closed:
- If the receipt is closed for any other currency, the code of which we did not specify in the script, then we do not perform the operation, but issue a message to the user that this operation is not possible.
- If the currency code is the one specified in the script, then make the following steps.
- The script cancels the receipt, specify the reason.
The script adds a saved comment to the order from this receipt (f.ex.: «Receipt canceled when changing currency from EUR to VISA»).
- It is advisable to specify the number of the next receipt in this comment, the one that will be closed for the desired currency.
- The script prints a new receipt with the same content, but we close it for a different currency, the code of which is specified in the script.
- When printing a new receipt, write in the memo, or in the unsaved comment, or in some other field, «A receipt with a changed payment currency, printed instead of NUMBER OF THE CANCELED RECEIPT».
- In the saved order comment, add «Correct receipt - THE NUMBER OF THE NEW RECEIPT».
A script for a custom operation, assigned to the closed receipt form selector.
procedure ProcessOperation1002528(Parameter: integer); var i, HaveCurrency1, HaveDenyCurr, AllowCurrType1, DennyCurrType1, CheckNum: integer; CurrName: string; it: TCheckItem; begin //***************** Set parameters ***********************// DennyCurrType1 := 91; // Code of currency type AllowCurrType1 := 13; // Code of currency type //***************** Set parameters ***********************// HaveCurrency1 := 0; HaveDenyCurr := 0; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = AllowCurrType1) then begin HaveCurrency1 := HaveCurrency1 + 1; CurrName := TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Name; end; if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = DennyCurrType1) then HaveDenyCurr := HaveDenyCurr + 1; end; if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then CheckNum := TPrintCheckItem(it).CheckNum; end; if HaveDenyCurr > 1 then begin gui.showmessage('You can''t change this payment!'); exit; end; if HaveCurrency1 > 0 then begin RKCheck.CurrentOrder.UserTag1 := 10000; RK7.PerformOperation(rkoUndoReceipt,0); RKCheck.UpdateVisitComment(' #'+IntToStr(CheckNum)+' currency '+CurrName, ''); RKCheck.CurrentOrder.UserTag1 := 10000; end else gui.showmessage('You can''t change this payment!'); end;
On the check editing form, insert the script for the CheckView object in the OnBeforeCheckViewEdit event:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var AllowCurrType1: integer; i, numcateg, TypeCurrCode, CurrCode, maxqntvoucher: integer; categsum, currsum,vouchersum: double; it: TCheckItem; Categ: TClassificatorGroup; begin //********************* 81848 ********************* //***************** Set parameters ***********************// AllowCurrType1 := 91; // allow curency type //***************** Set parameters ***********************// if RKCheck.CurrentOrder.UserTag1 = 10000 then begin AMessage := 'Denied this action!'; AAllow := False; if not(AEditType = etRemove) then if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TPayLine') then if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=AllowCurrType1 then begin AAllow := True end else begin AMessage := 'You can''t add this currency'; AAllow := False; end; if AAllow then begin RKCheck.UpdateVisitComment('Change payment '+RKCheck.CurrentOrder.VisitExtraInfo+' to '+TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Name, ''); RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,342)); // print check end; end; //********************* 81848 ********************* end;
For a user operation assigned to the selector for changing payment in the closed receipt, enable "Log entry", rename the operation itself as you would like to see it in the operation log.
A script to limit the number of vouchers
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, numcateg, codecurr, maxqntvoucher: integer; categsum, currsum,vouchersum: double; it: TCheckItem; Categ: TClassificatorGroup; begin numcateg := 4; // categorycode for special dishes vouchersum := 500; // sum of 1 voucher currsum := 0; categsum := 0; maxqntvoucher := 0; codecurr := 14; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg)); //5 - category code 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 Categ.IsChild(it.RefItem) then //Check category of the dish if TDish(it).Quantity > 0 then categsum := categsum + TDish(it).PRListSum; if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then if (it.Code = codecurr) then currsum := currsum + TPayLine(it).NationalSum; end; maxqntvoucher := trunc(0.99+categsum / vouchersum); if (categsum > 0) and (maxqntvoucher=0) then maxqntvoucher := 1; if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if (TPayLine(AObjectAft).code = codecurr) then if ((currsum + vouchersum*TPayLine(AObjectAft).OriginalSum)/vouchersum) > (maxqntvoucher) then begin AAllow := false; AMessage := 'Decreese quantity of vouchers to '+IntToStr(maxqntvoucher)+' !'; end; end;
A script to restrict the deletion of dishes from an unsaved order
You need a script that implements the following:
- the cashier can independently delete dishes from the order before the "Payment" button is clicked
- it is impossible to delete all the dishes, at least one must remain in the order.
1. Add a script.
procedure ProcessOperation1000185(Parameter: integer); begin end;
2. Add it to the user operation, remember its number, and set up the access control property.
3. Add manager permission to use this custom operation in the user roles properties.
4. Add the following line in the DesignForm object on the «Editing order: Quick check» form:
if Operation = 454 then RKCheck.CurrentOrder.UserTag1 := 1;
5. Next are the CheckView object and the OnBeforeCheckView event. The script body with variables from other KFC scripts included:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, CurrCode1, CurrCode2, CurrCode2_2, curr1present, curr2present: integer; it: TCheckItem; Categ: TClassificatorGroup; CategCode: integer; j,cntrl: integer; it1:tobject; begin //--------------- 63889 -------------------------- cntrl:=0; // for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do // begin // it:=RKCheck.CurrentOrder.Sessions.Lines[i];; // if SYS.ObjectInheritsFrom(it, 'TDish') then cntrl:=cntrl+1; // end; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it1:=RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it1, 'TDish') then begin cntrl:=cntrl+1; if TDish(it1).IsComboComp then cntrl:=cntrl-1; // gui.showmessage(intToStr(cntrl)); end; end; if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then if AEditType=etRemove then begin if cntrl<2 then begin AAllow:=false; AMessage:='At least one dish required for the order'; end else if RKCheck.CurrentOrder.UserTag2 = 1 then if RK7.CashUser.ConfirmOperation(rkoUser03) then AAllow:=true else begin AAllow:=false; AMessage:='Deletion is not possible'+#13#10+'no access!'; end; end; end;
6. Add the following in the CheckViewOnOrderVerify procedure after the first «begin»:
if AVerifyType=vtPrintReceipt then begin RKCheck.CurrentOrder.UserTag2 := 0; //gui.showmessage('reset control variable'); end;
A script to prohibit quantity changing
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var i, integer; it: TCheckItem; qnt,qntbefore: double; begin //Start Lock change DISH QNT for Categ CRM qnt := 0; if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then if not(AEditType = etRemove) then if (TDish(AObjectAft).RefItem.MainParent.code = 3100) and (TDish(AObjectBef).Quantity <> 0) then //Check category of the dish begin //Gui.SHowMessage('3' + ' QNTBef=' + FloatToStr(TDish(AObjectBef).Quantity)); qntBefore := TDish(AObjectBef).Quantity; qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).Quantity; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(it, 'TDish') then qnt := qnt + TDish(it).Quantity; end; end; if qnt <> qntBefore then // check limit exceed begin AAllow := false; AMessage := 'You dont have permissions for change dish quantyti'; end; //End Lock change DISH QNT for Categ CRM end;