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 указать скрипт расположенный ниже. В скрипте указать соответствующие коды категорий. Для блюд из бесплатной категории выставить свойства:

Скрипт обнуляет стоимость добавляемого блюда из «бонусной» категории, если набрано необходимое количество блюд из основной категории.

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;