Скрипт на запрет добавления блюда при сумме заказа менее указанной

Скрипт запрещает добавление подарочного блюда при сумме заказа менее указанной (300р.):

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);

var DishCode1: integer;

begin

//********** Set parameters ***********//

DishCode1 := 46; // код блюда запрещённого для добавления

//********** Set parameters ***********//

if RKCheck.CurrentOrder.ToPaySum < 300 then // сумма чека, ниже которой скрывается селектор блюда

if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then 

if (TDish(AObjectAft).Code = DishCode1) then

begin

AAllow := false;

AMessage := 'Запрещено добавлять блюдо '+TDish(AObjectAft).Name+' !'; 

end; 

end;
DELPHI


Скрипт на запрет оплаты валютой с кодом «1», если в чеке имеется скидка/наценка с кодом «5»

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 := 'Oplata etoj valutoj zapreshena!';

end;

end;
DELPHI

Скрипт на запрет оплаты заказа всем, кроме основного официанта заказа

На форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:

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;
DELPHI

Скрипт на редактирование заказа при наличии скидки ПДС

Необходимо, чтобы кассиры не могли добавлять новые блюда после ввода карты клиента. Но могли редактировать заказ (применение бонусов, удаление\замена карты клиента в заказе и т.п.)

В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:

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 := 'Добавление блюд запрещено, т.к. проведена карта.';

end;

end;
DELPHI

Скрипт на запрет оплаты определенной валютой, если в чеке есть скидки

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; //код скидки

currCode := 1; //код запрещаемой валюты

for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

begin

it := RKCheck.CurrentOrder.Sessions.Lines[i];

if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then

if it.code = discCode then discPresent := true;

end;


if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then

if ((TPayLine(AObjectAft).code=currCode) and discPresent) then // указать код запрещаемой валюты

begin 

AAllow := false;

AMessage := 'Оплата запрещена при наличии скидки';

end;

end;
DELPHI

Скрипт запрещающий вносить предоплату, если нет скидки в заказе

В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:

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; // код контролируемой скидки

discountpresent := 0;

// проверка наличия скидки в заказе

for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

it := RKCheck.CurrentOrder.Sessions.Lines[i];

if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then

if TDiscountItem(it).Code=DiscountCode then

if TDiscountItem(it).CalcAmount < 0 then

discountpresent := discountpresent + 1;

end; 

// контроль при оплате

if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then

if discountpresent > 0 then

AAllow:= True

else

begin 

AAllow := false;

AMessage := 'Примените скидку!';

end; 

end;
DELPHI

Скрипт для ограничения оплаты определенной валюты в чеке

Есть купоны с определенным номиналов (2000 р.) При сумме заказа <2000 рублей, гость может полностью оплатить заказ данной валютой, а при сумме >2000 р., валютой 2000 р., а остаток либо наличными либо безналом.

Добавьте скрипт на событие OnBeforeCheckViewEdit объекта CheckView в форме редактирования заказа:

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; // лимит оплаты валютой

codecurr := 5; // код валюты

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 := 'Оплата этой валютой ограничена лимитом в '+FloatToStr(limitcurrsum)+' !';

end;

end;
DELPHI

Скрипт, меняющий активность кнопки национальной валюты

При оплате скрипт проверяет:

если есть оплата с кодом первой валюты, то оплата второй валютой будет запрещена.

Замените коды валют на актуальные в строках скрипта с комментариями.

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 := 'Oplata etoj valutoj zapreshena!';

end;

end;
DELPHI

Скрипт на запрет комбинированной оплаты фискальной и не фискальной валютой

Скрипт запрещает комбинировать указанный тип валюты с другими типами валют. Размещается на форме редактирования чека в событии OnBeforeCheckViewEdit у объекта CheckView:

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; // код типа валюты для которого запретить комбинирование с другими валютами

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 := 'Данная комбинация валют запрещена!';

Exit;

end; 

end;
DELPHI

Скрипт на комбинирование фискальных и нефискальных валют с ПДС оплатами

Необходимо чтобы безнличный расчет мог комбинироваться только с платежными картами, но ПДС-оплата не должна быть запрещена к комбинированию с другими группами.

Скрипт запрещает комбинировать типы валют 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 := 'This currency combination is prohibited!';

Exit;

end; 

end;
DELPHI


Для валюты типа №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;
DELPHI


Скрипт на комбинирование фискальных и нефискальных валют

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;
DELPHI

Скрипт для ограничения оплат разными валютами

Скрипт запрещает смешанную оплату - нельзя оплатить счет рублями и кредиткой,

а также проводить две оплаты: рубли+рубли  или кредитная карта+кредитная карта

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;
DELPHI


Модифицированный скрипт для двух типов кредиток:

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;
DELPHI

Скрипт на ограничение суммы платежа валютой

Необходимо чтобы кассиры не могли ввести 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;
DELPHI

Скрипт на ограничение на сумму оплаты по классификациям

Скрипт считает сумму блюд заданной категории и не позволяет ввести сумму валюты, превышающую данную сумму. Также проверяется ограничение на превышение максимальной суммы через задание переменной 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;
DELPHI

Скрипт на ограничение ваучеров в 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;
DELPHI

Скрипт на ограничение приобретения блюда (не более двух раз в день)

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;
DELPHI

Скрипт на добавление бесплатного блюда

Акция — при заказе 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;
DELPHI

Скрипт на подтверждение оплаты неплательщиком

В свойстве валюты «Автозаполнение» выставлено «Вся сумма+подтверждение». При оплате заказа на эту валюту выходит сообщение: «Вы хотите оплатить чек с помощью «Питание персонала?»

В приведенных ниже скриптах реализовано подтверждение пользователем операции оплаты валютой с кодом «1». Срабатывает при вводе в чеке суммы этой валютой.

Сначала необходимо создать пустой скрипт для пользовательской операции:

procedure ProcessOperation1001446(Parameter: integer);

begin


end; 
DELPHI


Назначить этот скрипт к пользовательской операции. Этой пользовательской операции назначить права доступа только менеджеру.

В форме редактирования заказа у компонента 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;
DELPHI


Скрипт, удаляющий скидки при оплате неплательщиком

Скрипт для события 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;
DELPHI

свойство 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;
DELPHI

Скрипт на добавление в чек только блюда из определенной категории

Сценарий.

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;
DELPHI

Скрипт контролирует добавление блюд из указанной классификации по категории первого блюда в заказе:

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;
DELPHI

Скрипт для контроля продаж алкоголя

Режим работы кассы - быстрый чек. При при добавлении в заказ блюда определенной категории (для 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;
DELPHI

Скрипт для объекта 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;
DELPHI


Скрипт вывода сообщения запроса возраста гостя при продаже алкоголя

На форме редактирования заказа назначить скрипт 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;
DELPHI

Скрипт для пробития в быстрый чек не более одного комбо-блюда с определенным кодом

Скрипт для пробития в быстрый чек не более одного комбо-блюда ПИТАНИЕ ПЕРСОНАЛА с кодом 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;
DELPHI

Скрипт проверяет добавляемое в заказ блюдо, подсчитывая его текущее количество. Если оно превышает заданный лимит, то добавление блюда блокируется.

Скрипт на запрет оплаты стола до прокатывания картой лояльности (ПДС)

В форме редактирования чека у объекта 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;
DELPHI

Скрипт на изменение типа оплаты

Скриптами реализована блокировка добавление любых объектов в чек кроме оплаты разрешённой валютой при смене валюты платежа в закрытом чеке.

Скрипт для селектора

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;
DELPHI


В форме редактирования чека у объекта 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;
DELPHI

Скрипт для замены типа оплаты

Необходим скрипт который будет позволять производить замену типа оплаты в пробитом чеке.

Подготовка:

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;
DELPHI

В форме редактирования чека у объекта 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;
DELPHI

У пользовательской операции, назначенной на селектор по смене оплаты в закрытом чеке, включить «Запись в журнал», переименовать саму операцию так как хотелось бы видеть в логе операций.

Скрипт на ограничение количества ваучеров

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;
DELPHI

Скрипт на ограничение удаления блюд из несохраненного заказа

Нужен скрипт реализующий следующее:

- кассир самостоятельно может удалять блюда из заказа до момента нажатия кнопки «Оплата».

- удалить все блюда до нуля нельзя, хотя бы одно в заказе должно остаться.

1. добавить скрипт 

procedure ProcessOperation1000185(Parameter: integer);

begin

end;
DELPHI

2. добавьте его в пользовательскую операцию, запомните её номер, и установите св-во контроль доступа.

3. В свойствах ролей пользователей добавьте менеджеру разрешение на использование данной пользовательской операцией.

4. В форму «Редактирование заказа: Быстрый чек», объект DesignForm добавить строку

if Operation = 454 then RKCheck.CurrentOrder.UserTag1 := 1;
DELPHI

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;
DELPHI

6. В процедуре CheckViewOnOrderVerify после первого begin добавить

if AVerifyType=vtPrintReceipt then begin

RKCheck.CurrentOrder.UserTag2 := 0;

//gui.showmessage('обнуление контрольной переменной');

end; 
DELPHI

Скрипт на запрет изменения количества

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;
DELPHI