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 payment in 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 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 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;
script to restrict the payment of 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 combined payment in fiscal and non-fiscal currency
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;
Скрипт на комбинирование фискальных и нефискальных валют с ПДС оплатами!!!!!!!!!!!!!!!!!!!!!!!!!
Необходимо чтобы безнличный расчет мог комбинироваться только с платежными картами, но ПДС-оплата не должна быть запрещена к комбинированию с другими группами.
Скрипт запрещает комбинировать типы валют CurrType1Code и CurrType2Code с другими валютами, но разрешает их комбинацию между собой.
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; // код типа валюты для которого запретить комбинирование с другими валютами CurrType2Code := 99; // код типа валюты для которого запретить комбинирование с другими валютами 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 := 'Данная комбинация валют запрещена!'; Exit; end; end;
Для валюты типа №1 разрешена комбинация с валютой типа №2, но с другими - запрещена.
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; // код типа валюты для которого запретить комбинирование с другими валютами кроме типа валюты2 CurrType2Code := 99; // код типа валюты 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 := 'Данная комбинация валют запрещена!'; Exit; end; end;
Скрипт на комбинирование фискальных и нефискальных валют
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; // код типа валюты фискальной CurrType1Code2 := 93; // код типа валюты фискальной CurrType1Code3 := 1; // код типа валюты фискальной CurrType1Code4 := 2; // код типа валюты фискальной CurrType2Code1 := 14; // код типа валюты нефискальной CurrType2Code2 := 94; // код типа валюты нефискальной CurrType2Code3 := 13; // код типа валюты нефискальной CurrType2Code4 := 24; // код типа валюты нефискальной //********** 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 // статус оплаты 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 := 'Данная комбинация валют запрещена!'; Exit; end; end;
Скрипт для ограничения оплат разными валютами
Скрипт запрещает смешанную оплату - нельзя оплатить счет рублями и кредиткой,
а также проводить две оплаты: рубли+рубли или кредитная карта+кредитная карта
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; // код категории CurrCode1 := 1; // код валюты1 (рубли+рубли) CurrCode2 := 5: // код валюты2 (кредитная карта+кредитная карта) 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('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ ?! '+#13#10+' Мы не продаём пиво Гостям родившимся позднее ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'ШТРАФ ЗА АДМИНИСТРАТИВНОЕ ПРАВОНАРУШЕНИЕ - 30 000 руб. С КАССИРА!', 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; // Проверяем, что в заказе нет платежей другими валютами // (сдачу можно давать только этой же валютой) 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 := 'Сдачу нужно давать той же валютой, что и основной платеж'; Exit; end; end; end; // Запрещаем вносить платеж, если он меньше суммы заказа if (TPayLine(AObjectAft).BasicSum > 0) and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum) then begin AAllow := False; AMessage := 'Нельзя платить меньше суммы заказа'; end; // Запрет ввода более одного платежа 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 := 'Oplata zapreshena, т.к. уже был платёж этой валютой!'; 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 := 'Oplata zapreshena, т.к. уже был платёж этой валютой!'; end; end;
Модифицированный скрипт для двух типов кредиток:
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; // код категории CurrCode1 := 1; // код валюты1 (рубли+рубли) CurrCode2 := 5: // код валюты2 (кредитная карта+кредитная карта) CurrCode2_2 := 6; // код валюты2 (кредитная карта+кредитная карта) 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('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ ?! '+#13#10+' Мы не продаём пиво Гостям родившимся позднее ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'ШТРАФ ЗА АДМИНИСТРАТИВНОЕ ПРАВОНАРУШЕНИЕ - 30 000 руб. С КАССИРА!', 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit; // Проверяем, что в заказе нет платежей другими валютами // (сдачу можно давать только этой же валютой) 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 := 'Сдачу нужно давать той же валютой, что и основной платеж'; Exit; end; end; end; // Запрещаем вносить платеж, если он меньше суммы заказа if (TPayLine(AObjectAft).BasicSum > 0) and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum) then begin AAllow := False; AMessage := 'Нельзя платить меньше суммы заказа'; end; // Запрет ввода более одного платежа 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 := 'Oplata zapreshena, т.к. уже был платёж этой валютой!'; 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 := 'Oplata zapreshena, т.к. уже был платёж этой валютой!'; end; end;
Скрипт на ограничение суммы платежа валютой
Необходимо чтобы кассиры не могли ввести 100% оплаты баллами.
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; // код валюты(бонусов) //********** 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 := 'Превышена оплата бонусами !'; end; end;
Скрипт на ограничение на сумму оплаты по классификациям
Скрипт считает сумму блюд заданной категории и не позволяет ввести сумму валюты, превышающую данную сумму. Также проверяется ограничение на превышение максимальной суммы через задание переменной MaxCurrSum.
Скрипт необходимо разместить на форме редактирования заказа в событии OnBeforeCheckViewEdit объекта CheckView:
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; // код валюты(бонусов) CategCode := 25; // код категории блюд для ограничения суммы платежа валютой MaxCurrSum := 500; // максимальная сумма платежа заданной валютой //********** 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 := 'Превышена оплата валютой !'; end; if ((currsum+TPayLine(AObjectAft).NationalSum) > MaxCurrSum) then begin AAllow := false; AMessage := 'Превышена максимальная сумма оплаты валютой !'; end; end; end;
Скрипт на ограничение ваучеров в 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;
Скрипт на ограничение приобретения блюда (не более двух раз в день)
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 := 'ПДС может быть применена не более 1 раза в день!'; end; if (dd>=5001) and (dd<=6000) then if i > 1 then begin AAllow := False; AMessage := 'ПДС может быть применена не более 2 раз в день!'; end; end; end; end; end;
Скрипт на добавление бесплатного блюда
Акция — при заказе 2-х десертов (1-ая категория блюд) напиток бесплатно (2-ая категория блюд). Нужен скрипт для добавления 100% скидки блюду 2-ой категории, если в заказ добавлены 2 блюда 1-ой категории.
В форме заказа у компонента CheckView в событии OnAfterCheckViewEdit указать скрипт расположенный ниже. В скрипте указать соответствующие коды категорий. Для блюд из бесплатной категории выставить свойства:
- Цены — открытая цена: V
- Порции — Добавление в заказ: «Отдельная строка для каждой порции»
Скрипт обнуляет стоимость добавляемого блюда из «бонусной» категории, если набрано необходимое количество блюд из основной категории.
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;
Скрипт на подтверждение оплаты неплательщиком
В свойстве валюты «Автозаполнение» выставлено «Вся сумма+подтверждение». При оплате заказа на эту валюту выходит сообщение: «Вы хотите оплатить чек с помощью «Питание персонала?»
В приведенных ниже скриптах реализовано подтверждение пользователем операции оплаты валютой с кодом «1». Срабатывает при вводе в чеке суммы этой валютой.
Сначала необходимо создать пустой скрипт для пользовательской операции:
procedure ProcessOperation1001446(Parameter: integer); begin end;
Назначить этот скрипт к пользовательской операции. Этой пользовательской операции назначить права доступа только менеджеру.
В форме редактирования заказа у компонента CheckView в событии OnBeforeCheckViewEdit указать скрипт:
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 := 'Oplata etoj valutoj zapreshena!'; end; end; end;
Скрипт, удаляющий скидки при оплате неплательщиком
Скрипт для события OnBeforeCheckViewEdit компонента CheckView на форме редактирования заказа:
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 - код типа валюты для которого запретить наличие скидок в чеке 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;
свойство MainParent реализовано в 7.5.2.253.
В ветке 7.4.21 этого свойства нет.
Скрипт на запрет более чем 15 блюд в заказе
На форме редактирования у объекта CheckView в событии OnBeforeCheckViewEdit вставить скрипт:
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;
Скрипт на добавление в чек только блюда из определенной категории
Сценарий.
1. Создаем заказ;
2. Добавляем первое блюдо. Оно лежит в категории с кодом, например, 257
3. Добавляем второе блюдо
3.1 Скрипт проверяет код категории добавленного блюда и сравнивает его с кодом категории первого добавленного блюда
3.2 Если они равны, то добавляем блюдо в заказ
3.3 Если разные, то выдает сообщение 'This dish has different department code. \n Please create different (next) order with this dish'
и блюдо в заказ не добавляется
4. Так проверяем каждое следующее блюдо
Цель. Обеспечить попадание в чек только тех блюд которые находятся в одной категории из классификации.
Код классификации так же можно указать в скрипте для проверки.
Скрипт проверяет категорию меню у первого блюда в заказе и не позволяет добавить блюда из других групп меню.
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;
Скрипт контролирует добавление блюд из указанной классификации по категории первого блюда в заказе:
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;
Скрипт для контроля продаж алкоголя
Режим работы кассы - быстрый чек. При при добавлении в заказ блюда определенной категории (для KFC категория Crunch/18Alkdish - алкогольные напитки) кассиру выводится следующее диалоговое окно:
_____________________________
ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ?! (крупно)
кнопка ДА кнопка НЕТ
мы не продаем алкоголь гостям, родившимся
после 15 октября 1996 года*
____________________________
*система подсчитывает подсказку для кассира по допустимому возрасту
(чтобы им не приходилось задумываться над подсчетом) автоматически - 18 лет + 1 день
3. Если кассир выбирает ДА, то блюдо добавляется в заказ
4. При повторном добавлении блюда из данной категории в тот же чек диалоговое окно не вызывает. Селектор блюд остается в той же папке
5. Кассир выбирает НЕТ, то блюдо в заказ не добавляется и касса возвращается в корневую папку меню.
На форме редактирования быстрого чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string); var Categ: TClassificatorGroup; CategCode: integer; begin CategCode := 8; // код категории 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('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ?! '+#13#10+' Не продаём алкоголь гостям родившимся после '+FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date)) - 18), 0, 3, 100000) = 6 then begin RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог AAllow := True end else begin RK7.PostOperation(rkoDishSelector, 0); AAllow := False; end; end;
Скрипт для объекта CheckView на событие OnOrderVerify:
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;
Скрипт вывода сообщения запроса возраста гостя при продаже алкоголя
На форме редактирования заказа назначить скрипт CheckViewOnBeforeCheckViewEdit и над ним обязательно указать вспомогательную процедуру SliceStrToStrings
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; // тут указать код категории алкоголя CategCode2 := 5; // тут указать код категории алкоголя 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 := 'Необходимо подтверждение менеджера!'; 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 := 'Неверный формат даты!!!'; sdate:=gui.InputBox('Дата рождения дд.мм.гггг', 'Введите дату рождения гостя', '', true); if length(trim(sdate))<>10 then begin AMessage := 'Неверный формат даты!'; 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 := 'Гость моложе 18 лет. Продажа алкоголя запрещена!'; AAllow := False; end else gui.showmessage('Ошибка ввода даты рождения'); finally SLtmp.Free(); end; end; end;
Скрипт для пробития в быстрый чек не более одного комбо-блюда с определенным кодом
Скрипт для пробития в быстрый чек не более одного комбо-блюда ПИТАНИЕ ПЕРСОНАЛА с кодом 157.
Скрипт разместить на форме редактирования быстрого чека у объекта CheckView в событии OnBeforeCheckViewEdit
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; // код контролируемого блюда qntMax := 1; // максимальное количество контролируемого блюда в заказе. 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;
Скрипт проверяет добавляемое в заказ блюдо, подсчитывая его текущее количество. Если оно превышает заданный лимит, то добавление блюда блокируется.
Скрипт на запрет оплаты стола до прокатывания картой лояльности (ПДС)
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
Пример для трёх категорий:
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; // категория контролируемых блюд dishpresent := 0; Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode)); Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2)); Categ3 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode3)); CardCode := ''; // проверка наличия карты в заказе for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.ItemCount - 1 do begin McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Items[i]); CardCode := McrPay.CardNum; end; // проверка наличия контролируемых блюд в заказе 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; // контроль при оплате if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then if dishpresent > 0 then if CardCode <> '' then AAllow:= True else begin AAllow := false; AMessage := 'Примените карту ПЛАСТЕК!'; end; end;
Скрипт на изменение типа оплаты
Скриптами реализована блокировка добавление любых объектов в чек кроме оплаты разрешённой валютой при смене валюты платежа в закрытом чеке.
Скрипт для селектора
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;
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
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;
Скрипт для замены типа оплаты
Необходим скрипт который будет позволять производить замену типа оплаты в пробитом чеке.
Подготовка:
1. Заводим 2 валюты
тип 1-ой валюты - Наличные
тип 2-ой валюта - Платежные карты
2. Указываем скрипт-коды этих валют
3. Создаем причину отмены (Замена типа оплаты). Ее код указываем в скрипте
Сценарий:
1. Пробиваем чек
2. Идем в закрытые заказы
3. Выбираем чек, в котором хотим поменять тип оплаты
4. Жмем кнопку «Заменить тип оплаты»
5. Скрипт проверяет код валюты, на которую закрыт чек:
5.1. Если чек закрыт на любую другую валюты, код которой мы не указали в скрипте, то операцию не производим, а выдаем сообщение пользователю, что данная операция не возможна.
5.2. Если код валюты тот, который указан в скрипте, то идем дальше
6. Скрипт отменяет чек, указываем причину отмены
7. Скрипт в заказ из этого чека добавляет сохраняемый комментарий (Чек отменен при замене валюты с EUR на VISA (например))
7.1. Желательно в этот комментарий поместить номер следующего чека, того который будет закрыт на нужную валюту.
8. Скрипт пробивает новый чек с тем же содержимым, но закрываем его на другую валюту, код которой указан в скрипте.
8.1. При печати нового чека в мемо или не сохраняемый комментарий или еще в какое поле пишем «Чек с измененной валютой оплаты, напечатан вместо НОМЕР ОТМЕНЕННОГО чека»
8.2. В сохраняемый комментарий заказа добавляем «Корректный чек - НОМЕР НОВОГО ЧЕКА»
Скрипт для пользовательской операции назначаемой на селектор формы закрытого чека
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;
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
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;
У пользовательской операции, назначенной на селектор по смене оплаты в закрытом чеке, включить «Запись в журнал», переименовать саму операцию так как хотелось бы видеть в логе операций.
Скрипт на ограничение количества ваучеров
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;
Скрипт на ограничение удаления блюд из несохраненного заказа
Нужен скрипт реализующий следующее:
- кассир самостоятельно может удалять блюда из заказа до момента нажатия кнопки «Оплата».
- удалить все блюда до нуля нельзя, хотя бы одно в заказе должно остаться.
1. добавить скрипт
procedure ProcessOperation1000185(Parameter: integer); begin end;
2. добавьте его в пользовательскую операцию, запомните её номер, и установите св-во контроль доступа.
3. В свойствах ролей пользователей добавьте менеджеру разрешение на использование данной пользовательской операцией.
4. В форму «Редактирование заказа: Быстрый чек», объект DesignForm добавить строку
if Operation = 454 then RKCheck.CurrentOrder.UserTag1 := 1;
5. Далее объект CheckView, событие OnBeforeCheckView. Тело скрипта с учетом переменных от других скриптов KFC:
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:='В заказе должно быть хотя бы одно блюдо'; end else if RKCheck.CurrentOrder.UserTag2 = 1 then if RK7.CashUser.ConfirmOperation(rkoUser03) then AAllow:=true else begin AAllow:=false; AMessage:='Удаление невозможно'+#13#10+'нет доступа!'; end; end; end;
6. В процедуре CheckViewOnOrderVerify после первого begin добавить
if AVerifyType=vtPrintReceipt then begin RKCheck.CurrentOrder.UserTag2 := 0; //gui.showmessage('обнуление контрольной переменной'); end;
Скрипт на запрет изменения количества
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;