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

Скрипт запрещает добавление подарочного блюда при сумме заказа менее указанной (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»Link to Скрипт на запрет оплаты валютой с кодом «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

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

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

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

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

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

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

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

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

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

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

Есть купоны с определенным номиналов (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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var i, codecurr: integer;

currsum, limitcurrsum: double;

it: TCheckItem;

begin

currsum := 0;

limitcurrsum := round(RKCheck.CurrentOrder.ToPaySum*0.5); // limit sum

codecurr := 16; // Currency code

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

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

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

if (it.Code = codecurr) then

begin

dbg.dbgprint('TPayLine(it).NationalSum='+floattostr(TPayLine(it).NationalSum));

currsum := currsum + TPayLine(it).NationalSum;

end;

end;


dbg.dbgprint('currsum='+floattostr(currsum));

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

begin

//dbg.dbgprint('TPayLine(AObjectAft).code='+inttostr(TPayLine(AObjectAft).code)); 

if (TPayLine(AObjectAft).code = codecurr) then

begin

dbg.dbgprint('TPayLine(AObjectAft).BasicSum='+floattostr(TPayLine(AObjectAft).BasicSum));

dbg.dbgprint('TPayLine(AObjectAft).OriginalSum='+floattostr(TPayLine(AObjectAft).OriginalSum)); 

dbg.dbgprint('TPayLine(AObjectAft).DBKurs='+floattostr(TPayLine(AObjectAft).DBKurs));

if (currsum + TPayLine(AObjectAft).BasicSum) > limitcurrsum then

begin 

dbg.dbgprint('(currsum + TPayLine(AObjectAft).BasicSum) > '+floattostr(limitcurrsum)); 

AAllow := false;

AMessage := 'Payment is limited by this currency '+FloatToStr(limitcurrsum)+' !';

end;

end;

end;

end;
DELPHI

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

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

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

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

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

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

В приведенных ниже скриптах реализовано подтверждение пользователем операции оплаты валютой с кодом «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


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

Скрипт для события 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 блюд в заказеLink to Скрипт на запрет более чем 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

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

Сценарий.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Подготовка:

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

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

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

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

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

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

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

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

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

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

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