OnBeforeCheckViewEdit
Скрипт на запрет добавления блюда при сумме заказа менее указанной
Скрипт запрещает добавление подарочного блюда при сумме заказа менее указанной (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;
Скрипт на запрет оплаты валютой с кодом «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;
Скрипт на запрет оплаты заказа всем, кроме основного официанта заказа
На форме редактирования чека у объекта 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;
Скрипт на редактирование заказа при наличии скидки ПДС
Необходимо, чтобы кассиры не могли добавлять новые блюда после ввода карты клиента. Но могли редактировать заказ (применение бонусов, удаление\замена карты клиента в заказе и т.п.)
В форме редактирования чека у объекта 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;
Скрипт на запрет оплаты определенной валютой, если в чеке есть скидки
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;
Скрипт запрещающий вносить предоплату, если нет скидки в заказе
В форме редактирования чека у объекта 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;
Скрипт для ограничения оплаты определенной валюты в чеке
Есть купоны с определенным номиналов (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;
Скрипт, меняющий активность кнопки национальной валюты
При оплате скрипт проверяет:
если есть оплата с кодом первой валюты, то оплата второй валютой будет запрещена.
Замените коды валют на актуальные в строках скрипта с комментариями.
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;
Скрипт на запрет комбинированной оплаты фискальной и не фискальной валютой
Скрипт запрещает комбинировать указанный тип валюты с другими типами валют. Размещается на форме редактирования чека в событии 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;
Скрипт на комбинирование фискальных и нефискальных валют с ПДС оплатами
Необходимо чтобы безнличный расчет мог комбинироваться только с платежными картами, но ПДС-оплата не должна быть запрещена к комбинированию с другими группами.
Скрипт запрещает комбинировать типы валют 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;
Для валюты типа №1 разрешена комбинация с валютой типа №2, но с другими - запрещена.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrType1Code, CurrType2Code, CntCurrType1, CntCurrType2, CntCurrTypeOther: integer;
it: TCheckItem;
begin
CurrType1Code := 91; // код типа валюты для которого запретить комбинирование с другими валютами кроме типа валюты2
CurrType2Code := 99; // код типа валюты
if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit;
CntCurrType1 := 0;
CntCurrType2 := 0;
CntCurrTypeOther := 0;
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code then
CntCurrType1 := CntCurrType1 + 1
else
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code then
CntCurrType2 := CntCurrType2 + 1
else
CntCurrTypeOther := CntCurrTypeOther + 1;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin
if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code then
CntCurrType1 := CntCurrType1 + 1
else
if TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code then
CntCurrType2 := CntCurrType2 + 1
else
CntCurrTypeOther := CntCurrTypeOther + 1;
end;
end;
if (CntCurrType1 > 0) and (CntCurrTypeOther > 0) then
begin
AAllow := False;
AMessage := 'Данная комбинация валют запрещена!';
Exit;
end;
end;
Скрипт на комбинирование фискальных и нефискальных валют
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrType1Code1,CurrType1Code2,CurrType1Code3,CurrType1Code4, CurrType2Code1,CurrType2Code2,CurrType2Code3,CurrType2Code4, CntCurrType1, CntCurrType2, CntCurrTypeOther: integer;
it: TCheckItem;
begin
//********** Set parameters ***********//
CurrType1Code1 := 91; // код типа валюты фискальной
CurrType1Code2 := 93; // код типа валюты фискальной
CurrType1Code3 := 1; // код типа валюты фискальной
CurrType1Code4 := 2; // код типа валюты фискальной
CurrType2Code1 := 14; // код типа валюты нефискальной
CurrType2Code2 := 94; // код типа валюты нефискальной
CurrType2Code3 := 13; // код типа валюты нефискальной
CurrType2Code4 := 24; // код типа валюты нефискальной
//********** Set parameters ***********//
if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit;
CntCurrType1 := 0;
CntCurrType2 := 0;
CntCurrTypeOther := 0;
if (TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code1)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code2)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code3)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType1Code4)
then
CntCurrType1 := CntCurrType1 + 1
else
if (TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code1)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code2)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code3)
or(TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=CurrType2Code4)
then
CntCurrType2 := CntCurrType2 + 1
else
CntCurrTypeOther := CntCurrTypeOther + 1;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if TPayLine(it).state <> disDeleted then begin // статус оплаты
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code1)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code2)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code3)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType1Code4)
then
CntCurrType1 := CntCurrType1 + 1
else
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code1)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code2)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code3)
or(TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code=CurrType2Code4)
then
CntCurrType2 := CntCurrType2 + 1
else
CntCurrTypeOther := CntCurrTypeOther + 1;
end;
end;
if (CntCurrType1 > 0) and (CntCurrType2 > 0) then
begin
AAllow := False;
AMessage := 'Данная комбинация валют запрещена!';
Exit;
end;
end;
Скрипт для ограничения оплат разными валютами
Скрипт запрещает смешанную оплату - нельзя оплатить счет рублями и кредиткой,
а также проводить две оплаты: рубли+рубли или кредитная карта+кредитная карта
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrCode1, CurrCode2, curr1present, curr2present: integer;
it: TCheckItem;
Categ: TClassificatorGroup;
CategCode: integer;
begin
CategCode := 17; // код категории
CurrCode1 := 1; // код валюты1 (рубли+рубли)
CurrCode2 := 5: // код валюты2 (кредитная карта+кредитная карта)
curr1present := 0;
curr2present := 0;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if not(AEditType = etRemove) then
if RKCheck.CurrentOrder.UserTag1 = 0 then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then
if Categ.IsChild(TDish(AObjectAft).RefItem) then
if GUI.RKMessageDlg('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ ?! '+#13#10+' Мы не продаём пиво Гостям родившимся позднее ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'ШТРАФ ЗА АДМИНИСТРАТИВНОЕ ПРАВОНАРУШЕНИЕ - 30 000 руб. С КАССИРА!', 0, 3, 100000) = 6 then
begin
RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог
AAllow := True
end
else
begin
RK7.PostOperation(rkoDishSelector, 0);
AAllow := False;
end;
if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit;
// Проверяем, что в заказе нет платежей другими валютами
// (сдачу можно давать только этой же валютой)
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin
if (it.Code = CurrCode1 ) then // code of first currency (Lit)
if TPayLine(it).CurrLineSum > 0 then
curr1present := curr1present + 1;
if (it.Code = CurrCode2 ) then // code of first currency (Lit)
if TPayLine(it).CurrLineSum > 0 then
curr2present := curr2present + 1;
if TPayLine(it).Sifr <> TPayLine(AObjectAft).Sifr then begin
AAllow := False;
AMessage := 'Сдачу нужно давать той же валютой, что и основной платеж';
Exit;
end;
end;
end;
// Запрещаем вносить платеж, если он меньше суммы заказа
if (TPayLine(AObjectAft).BasicSum > 0)
and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum)
then begin
AAllow := False;
AMessage := 'Нельзя платить меньше суммы заказа';
end;
// Запрет ввода более одного платежа
if curr1present > 0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code=CurrCode1) then // code of 1st currency
if TPayLine(AObjectAft).CurrLineSum >=0 then
begin
AAllow := false;
AMessage := 'Oplata zapreshena, т.к. уже был платёж этой валютой!';
end;
if curr2present > 0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code=CurrCode2) then // code of 2nd currency
if TPayLine(AObjectAft).CurrLineSum >=0 then
begin
AAllow := false;
AMessage := 'Oplata zapreshena, т.к. уже был платёж этой валютой!';
end;
end;
Модифицированный скрипт для двух типов кредиток:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrCode1, CurrCode2, CurrCode2_2, curr1present, curr2present: integer;
it: TCheckItem;
Categ: TClassificatorGroup;
CategCode: integer;
begin
CategCode := 17; // код категории
CurrCode1 := 1; // код валюты1 (рубли+рубли)
CurrCode2 := 5: // код валюты2 (кредитная карта+кредитная карта)
CurrCode2_2 := 6; // код валюты2 (кредитная карта+кредитная карта)
curr1present := 0;
curr2present := 0;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if not(AEditType = etRemove) then
if RKCheck.CurrentOrder.UserTag1 = 0 then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then
if Categ.IsChild(TDish(AObjectAft).RefItem) then
if GUI.RKMessageDlg('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ ?! '+#13#10+' Мы не продаём пиво Гостям родившимся позднее ' +FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date))- 18)+#13#10+' '+#13#10+'ШТРАФ ЗА АДМИНИСТРАТИВНОЕ ПРАВОНАРУШЕНИЕ - 30 000 руб. С КАССИРА!', 0, 3, 100000) = 6 then
begin
RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог
AAllow := True
end
else
begin
RK7.PostOperation(rkoDishSelector, 0);
AAllow := False;
end;
if not SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then Exit;
// Проверяем, что в заказе нет платежей другими валютами
// (сдачу можно давать только этой же валютой)
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then begin
if (it.Code = CurrCode1 ) then // code of first currency (Lit)
if TPayLine(it).CurrLineSum > 0 then
curr1present := curr1present + 1;
if (it.Code = CurrCode2 ) or (it.Code = CurrCode2_2) then // code of first currency (Lit)
if TPayLine(it).CurrLineSum > 0 then
curr2present := curr2present + 1;
if TPayLine(it).Sifr <> TPayLine(AObjectAft).Sifr then begin
AAllow := False;
AMessage := 'Сдачу нужно давать той же валютой, что и основной платеж';
Exit;
end;
end;
end;
// Запрещаем вносить платеж, если он меньше суммы заказа
if (TPayLine(AObjectAft).BasicSum > 0)
and (TPayLine(AObjectAft).BasicSum < RKCheck.CurrentOrder.UnpaidSum)
then begin
AAllow := False;
AMessage := 'Нельзя платить меньше суммы заказа';
end;
// Запрет ввода более одного платежа
if curr1present > 0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code=CurrCode1) then // code of 1st currency
if TPayLine(AObjectAft).CurrLineSum >=0 then
begin
AAllow := false;
AMessage := 'Oplata zapreshena, т.к. уже был платёж этой валютой!';
end;
if curr2present > 0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code=CurrCode2) or (TPayLine(AObjectAft).code=CurrCode2_2) then // code of 2nd currency
if TPayLine(AObjectAft).CurrLineSum >=0 then
begin
AAllow := false;
AMessage := 'Oplata zapreshena, т.к. уже был платёж этой валютой!';
end;
end;
Скрипт на ограничение суммы платежа валютой
Необходимо чтобы кассиры не могли ввести 100% оплаты баллами.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrencyCode: integer;
currsum: double;
it: TCheckItem;
begin
//********** Set parameters ***********//
CurrencyCode := 1; // код валюты(бонусов)
//********** Set parameters ***********//
currsum := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode) then
currsum := currsum + TPayLine(it).NationalSum;
end;
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code = CurrencyCode) then
if ((currsum+TPayLine(AObjectAft).NationalSum) > (RKCheck.CurrentOrder.ToPaySum-1)) then
begin
AAllow := false;
AMessage := 'Превышена оплата бонусами !';
end;
end;
Скрипт на ограничение на сумму оплаты по классификациям
Скрипт считает сумму блюд заданной категории и не позволяет ввести сумму валюты, превышающую данную сумму. Также проверяется ограничение на превышение максимальной суммы через задание переменной MaxCurrSum.
Скрипт необходимо разместить на форме редактирования заказа в событии OnBeforeCheckViewEdit объекта CheckView:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrencyCode, CategCode: integer;
currsum, MaxCurrSum, CategSum: double;
it: TCheckItem;
Categ: TClassificatorGroup;
begin
//********** Set parameters ***********//
CurrencyCode := 1; // код валюты(бонусов)
CategCode := 25; // код категории блюд для ограничения суммы платежа валютой
MaxCurrSum := 500; // максимальная сумма платежа заданной валютой
//********** Set parameters ***********//
currsum := 0;
CategSum := 0;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code = CurrencyCode) then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode) then
currsum := currsum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(it.RefItem) then
if (TDish(it).Quantity > 0) then
CategSum := CategSum + TDish(it).PRListSum
end;
if ((currsum+TPayLine(AObjectAft).NationalSum) > CategSum) then
begin
AAllow := false;
AMessage := 'Превышена оплата валютой !';
end;
if ((currsum+TPayLine(AObjectAft).NationalSum) > MaxCurrSum) then
begin
AAllow := false;
AMessage := 'Превышена максимальная сумма оплаты валютой !';
end;
end;
end;
Скрипт на ограничение ваучеров в 50%
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, codecurr: integer;
currsum, limitcurrsum: double;
it: TCheckItem;
begin
currsum := 0;
limitcurrsum := round(RKCheck.CurrentOrder.ToPaySum*0.5); // limit sum
codecurr := 16; // Currency code
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = codecurr) then
begin
dbg.dbgprint('TPayLine(it).NationalSum='+floattostr(TPayLine(it).NationalSum));
currsum := currsum + TPayLine(it).NationalSum;
end;
end;
dbg.dbgprint('currsum='+floattostr(currsum));
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
begin
//dbg.dbgprint('TPayLine(AObjectAft).code='+inttostr(TPayLine(AObjectAft).code));
if (TPayLine(AObjectAft).code = codecurr) then
begin
dbg.dbgprint('TPayLine(AObjectAft).BasicSum='+floattostr(TPayLine(AObjectAft).BasicSum));
dbg.dbgprint('TPayLine(AObjectAft).OriginalSum='+floattostr(TPayLine(AObjectAft).OriginalSum));
dbg.dbgprint('TPayLine(AObjectAft).DBKurs='+floattostr(TPayLine(AObjectAft).DBKurs));
if (currsum + TPayLine(AObjectAft).BasicSum) > limitcurrsum then
begin
dbg.dbgprint('(currsum + TPayLine(AObjectAft).BasicSum) > '+floattostr(limitcurrsum));
AAllow := false;
AMessage := 'Payment is limited by this currency '+FloatToStr(limitcurrsum)+' !';
end;
end;
end;
end;
Скрипт на ограничение приобретения блюда (не более двух раз в день)
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i,dd: integer;
tmp1 : string;
begin
dd := 0;
if (AEditType = etInsert) and SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then begin
if TDiscountItem(AObjectAft).CardCode <> '' then begin
tmp1 := TDiscountItem(AObjectAft).CardCode;
if pos('778=', tmp1) = 1 then begin
delete(tmp1, 1, 4);
tmp1 :=copy(tmp1, pos('=', tmp1) + 1, 7);
i := RKCheck.GetDiscountCount(TDiscountItem(AObjectAft).Sifr, TDiscountItem(AObjectAft).MInterface, TDiscountItem(AObjectAft).CardCode);
dd := StrToIntDef(tmp1,0);
if (dd>=100) and (dd<=500) then
if i > 0 then begin
AAllow := False;
AMessage := 'ПДС может быть применена не более 1 раза в день!';
end;
if (dd>=5001) and (dd<=6000) then
if i > 1 then begin
AAllow := False;
AMessage := 'ПДС может быть применена не более 2 раз в день!';
end;
end;
end;
end;
end;
Скрипт на добавление бесплатного блюда
Акция — при заказе 2-х десертов (1-ая категория блюд) напиток бесплатно (2-ая категория блюд). Нужен скрипт для добавления 100% скидки блюду 2-ой категории, если в заказ добавлены 2 блюда 1-ой категории.
В форме заказа у компонента CheckView в событии OnAfterCheckViewEdit указать скрипт расположенный ниже. В скрипте указать соответствующие коды категорий. Для блюд из бесплатной категории выставить свойства:
- Цены — открытая цена: V
- Порции — Добавление в заказ: «Отдельная строка для каждой порции»
Скрипт обнуляет стоимость добавляемого блюда из «бонусной» категории, если набрано необходимое количество блюд из основной категории.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, j, k: integer;
it: TCheckItem;
a: double;
CntCateg1, CntCateg2: integer;
Categ1, Categ2: TClassificatorGroup;
begin
CntCateg1 := 0;
CntCateg2 := 0;
k := 0;
Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', 1)); //1 - category code
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', 8)); //8 - category code
if SYS.ObjectInheritsFrom(TObject(AObjectBef), 'TDish') then
if Categ1.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only
begin
if Categ1.IsChild(it.RefItem) then //Check category of the dish
CntCateg1 := CntCateg1 + trunc(TDish(it).Quantity);
if Categ2.IsChild(it.RefItem) then //Check category of the dish
if TDish(it).Price = 0 then
CntCateg2 := CntCateg2 + trunc(TDish(it).Quantity);
end;
end;
if Categ1.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish
CntCateg1 := CntCateg1 - 1;
if Categ2.IsChild(TDish(AObjectBef).RefItem) then //Check category of the dish
CntCateg2 := CntCateg2 - 1;
k := (CntCateg1 div 2) - CntCateg2;
if k>0 then
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only
if Categ2.IsChild(TDish(AObjectAft).RefItem) then //Check category of the dish
if trk7menuItem(TDish(AObjectAft).RefItem).OpenPrice then
begin
TDish(AObjectAft).IsUserPrice := true;
TDish(AObjectAft).UserPrice := 0;
end;
end;
if k<0 then
while k<0 do
begin
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if Categ2.IsChild(it.RefItem) then //Check category of the dish
if TDish(it).Price = 0 then
begin
k := k + trunc(TDish(it).Quantity);
RKCheck.DeleteCheckItem(it);
end;
end;
end;
end;
end;
Скрипт на подтверждение оплаты неплательщиком
В свойстве валюты «Автозаполнение» выставлено «Вся сумма+подтверждение». При оплате заказа на эту валюту выходит сообщение: «Вы хотите оплатить чек с помощью «Питание персонала?»
В приведенных ниже скриптах реализовано подтверждение пользователем операции оплаты валютой с кодом «1». Срабатывает при вводе в чеке суммы этой валютой.
Сначала необходимо создать пустой скрипт для пользовательской операции:
procedure ProcessOperation1001446(Parameter: integer);
begin
end;
Назначить этот скрипт к пользовательской операции. Этой пользовательской операции назначить права доступа только менеджеру.
В форме редактирования заказа у компонента CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
begin
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code=1) then
if RK7.CashUser.ConfirmOperation(rkoUser07) then
AAllow := True
else
begin
AAllow := false;
AMessage := 'Oplata etoj valutoj zapreshena!';
end;
end;
end;
Скрипт, удаляющий скидки при оплате неплательщиком
Скрипт для события OnBeforeCheckViewEdit компонента CheckView на форме редактирования заказа:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i: integer;
it: TCheckItem;
begin
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=91 then // 91 - код типа валюты для которого запретить наличие скидок в чеке
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
RKCheck.DeleteCheckItem(it);
end;
end;
end;
свойство MainParent реализовано в 7.5.2.253.
В ветке 7.4.21 этого свойства нет.
Скрипт на запрет более чем 15 блюд в заказе
На форме редактирования у объекта CheckView в событии OnBeforeCheckViewEdit вставить скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i: integer;
qnt: double;
it: TCheckItem;
begin
qnt := 0;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if not(AEditType = etRemove) then
begin
qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).Quantity;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
qnt := qnt + TDish(it).Quantity;
end;
end;
if qnt > 15 then // check limit exceed
begin
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
Скрипт на добавление в чек только блюда из определенной категории
Сценарий.
1. Создаем заказ;
2. Добавляем первое блюдо. Оно лежит в категории с кодом, например, 257
3. Добавляем второе блюдо
3.1 Скрипт проверяет код категории добавленного блюда и сравнивает его с кодом категории первого добавленного блюда
3.2 Если они равны, то добавляем блюдо в заказ
3.3 Если разные, то выдает сообщение 'This dish has different department code. \n Please create different (next) order with this dish'
и блюдо в заказ не добавляется
4. Так проверяем каждое следующее блюдо
Цель. Обеспечить попадание в чек только тех блюд, которые находятся в одной категории из классификации.
Код классификации так же можно указать в скрипте для проверки.
Скрипт проверяет категорию меню у первого блюда в заказе и не позволяет добавить блюда из других групп меню.
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i,CntDish1,numcateg:integer;
it: TCheckItem;
Categ: TClassificatorGroup;
firstdish: boolean;
begin
if AEditType = etInsert then
begin
CntDish1 := 0;
firstdish := false;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if ((it.State = disOpened) or (it.State = disPrinted)) then
if TDish(it).Quantity > 0 then
begin
if not(firstdish) then
begin
numcateg := TDish(it).RefItem.MainParent.code;
firstdish := true;
end;
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
break;
end;
end;
if CntDish1<>0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
if (TDish(AObjectAft).RefItem.MainParent.code <> numcateg) then //Check category of the dish
begin
AMessage := 'This dish has different department code.'+#10#13+'Please create different (next) order with this dish';
AAllow := false;
end;
end;
end;
end;
Скрипт контролирует добавление блюд из указанной классификации по категории первого блюда в заказе:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i,j,CntDish1,ClassifCode1:integer;
it: TCheckItem;
Categ1Firts,Categ1,Classif1: TClassificatorGroup;
firstdish: boolean;
begin
//************************** Set parameters **********************************//
ClassifCode1 := 16; // code classificator
//************************** Set parameters **********************************//
if AEditType = etInsert then
begin
CntDish1 := 0;
firstdish := false;
Classif1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', ClassifCode1));
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if ((it.State = disOpened) or (it.State = disPrinted)) then
if TDish(it).Quantity > 0 then
begin
if not(firstdish) then
begin
for j := 0 to Classif1.ChildCount - 1 do begin
Categ1 := TClassificatorGroup(Classif1.ChildItem(j));
if Categ1.IsChild(it.RefItem) then begin
Categ1Firts := Categ1;
break;
end;
end;
firstdish := true;
end;
CntDish1 := CntDish1 + trunc(TDish(it).Quantity);
break;
end;
end;
if CntDish1<>0 then
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
begin
if not(Categ1Firts.IsChild(TDish(AObjectAft).RefItem)) then //Check category of Classification
begin
AMessage := 'This dish has different department code.'+#10#13+'Please create different (next) order with this dish';
AAllow := false;
end;
end;
end;
end;
Скрипт для контроля продаж алкоголя
Режим работы кассы - быстрый чек. При при добавлении в заказ блюда определенной категории (для KFC категория Crunch/18Alkdish - алкогольные напитки) кассиру выводится следующее диалоговое окно:
_____________________________
ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ?! (крупно)
кнопка ДА кнопка НЕТ
мы не продаем алкоголь гостям, родившимся
после 15 октября 1996 года*
____________________________
*система подсчитывает подсказку для кассира по допустимому возрасту
(чтобы им не приходилось задумываться над подсчетом) автоматически - 18 лет + 1 день
3. Если кассир выбирает ДА, то блюдо добавляется в заказ
4. При повторном добавлении блюда из данной категории в тот же чек диалоговое окно не вызывает. Селектор блюд остается в той же папке
5. Кассир выбирает НЕТ, то блюдо в заказ не добавляется и касса возвращается в корневую папку меню.
На форме редактирования быстрого чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var Categ: TClassificatorGroup;
CategCode: integer;
begin
CategCode := 8; // код категории
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
if not(AEditType = etRemove) then
if RKCheck.CurrentOrder.UserTag1 = 0 then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then
if Categ.IsChild(TDish(AObjectAft).RefItem) then
if GUI.RKMessageDlg('ТЫ ПРОВЕРИЛ ДОКУМЕНТЫ?! '+#13#10+' Не продаём алкоголь гостям родившимся после '+FormatDateTime('dd mmmm ',Date-1)+IntToStr(StrToInt(FormatDateTime('yyyy',Date)) - 18), 0, 3, 100000) = 6 then
begin
RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог
AAllow := True
end
else
begin
RK7.PostOperation(rkoDishSelector, 0);
AAllow := False;
end;
end;
Скрипт для объекта CheckView на событие OnOrderVerify:
procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);
begin
if AVerifyType = vtNewQuickCheck then
if RKCheck.CurrentOrder.IsEmpty then
RKCheck.CurrentOrder.UserTag1 := 0;
end;
Скрипт вывода сообщения запроса возраста гостя при продаже алкоголя
На форме редактирования заказа назначить скрипт CheckViewOnBeforeCheckViewEdit и над ним обязательно указать вспомогательную процедуру SliceStrToStrings
procedure SliceStrToStrings(StrIn,marker:String; var StringsOut:TStringList);
var s,s1:string; i:Integer;
begin
s:=StrIn;
while length(s)<>0 do begin
i:=pos(marker,s);
if i=0 then begin
s1:=s;
delete(s,1,length(s1));
StringsOut.Add(s1);
end
else begin
s1:=copy(s,1,i-1);
delete(s,1,i);
StringsOut.Add(s1)
end;
end;
end;
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var Categ, Categ2: TClassificatorGroup;
CategCode, CategCode2: integer;
sdate: string;
bdate, cdate: TDateTime;
Day, Year, Month: integer;
SLtmp: TStringList;
begin
CategCode := 8; // тут указать код категории алкоголя
CategCode2 := 5; // тут указать код категории алкоголя
cdate := EncodeDate((StrToInt(FormatDateTime('yyyy',Date)) - 18), StrToInt(FormatDateTime('mm',Date-1)),StrToInt(FormatDateTime('dd',Date-1)));
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));
if RKCheck.CurrentOrder.UserTag2 = 20000 then
if RK7.CashUser.ConfirmOperation(rkoUser08) then
AAllow := True
else
begin
AAllow := false;
AMessage := 'Необходимо подтверждение менеджера!';
exit;
end;
if not(AEditType = etRemove) then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TDish') then
if (Categ.IsChild(TDish(AObjectAft).RefItem))
or (Categ2.IsChild(TDish(AObjectAft).RefItem))
then
if (RKCheck.CurrentOrder.UserTag2 <> 10000) then
begin
AAllow := False;
AMessage := 'Неверный формат даты!!!';
sdate:=gui.InputBox('Дата рождения дд.мм.гггг', 'Введите дату рождения гостя', '', true);
if length(trim(sdate))<>10 then
begin
AMessage := 'Неверный формат даты!';
AAllow := False;
end
else
try
SLtmp := TStringList.Create;
SLtmp.Clear;
SLtmp.Sorted := false;
SliceStrToStrings(sdate,'.',SLtmp);
bdate := EncodeDate(StrToInt(SLtmp.strings[2]),StrToInt(SLtmp.strings[1]),StrToInt(SLtmp.strings[0]));
if bdate<=cdate then
begin
RKCheck.CurrentOrder.UserTag2 := 10000;
RKCheck.UpdateVisitComment('',DateToStr(bdate));
AAllow := True;
end
else if bdate>cdate then
begin
RKCheck.CurrentOrder.UserTag2 := 20000;
AMessage := 'Гость моложе 18 лет. Продажа алкоголя запрещена!';
AAllow := False;
end
else gui.showmessage('Ошибка ввода даты рождения');
finally
SLtmp.Free();
end;
end;
end;
Скрипт для пробития в быстрый чек не более одного комбо-блюда с определенным кодом
Скрипт для пробития в быстрый чек не более одного комбо-блюда ПИТАНИЕ ПЕРСОНАЛА с кодом 157.
Скрипт разместить на форме редактирования быстрого чека у объекта CheckView в событии OnBeforeCheckViewEdit
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, DishCode1: integer;
qnt, qntMax: double;
it: TCheckItem;
begin
qnt := 0;
DishCode1 := 34; // код контролируемого блюда
qntMax := 1; // максимальное количество контролируемого блюда в заказе.
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if TDish(AObjectAft).code = DishCode1 then
if not(AEditType = etRemove) then
begin
qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).Quantity;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
if TDish(it).code = DishCode1 then
qnt := qnt + TDish(it).Quantity;
end;
end;
if qnt > qntMax then // check limit exceed
begin
AAllow := false;
AMessage := 'Quantity exceeded the permitted limit ';
end;
end;
Скрипт проверяет добавляемое в заказ блюдо, подсчитывая его текущее количество. Если оно превышает заданный лимит, то добавление блюда блокируется.
Скрипт на запрет оплаты стола до прокатывания картой лояльности (ПДС)
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
Пример для трёх категорий:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CategCode, CategCode2, CategCode3, dishpresent: integer;
it: TCheckItem;
Categ, Categ2, Categ3: TClassificatorGroup;
CardCode: string;
McrPay: TMcrPay;
begin
CategCode := 8; // категория контролируемых блюд
dishpresent := 0;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));
Categ3 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode3));
CardCode := '';
// проверка наличия карты в заказе
for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.ItemCount - 1 do begin
McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Items[i]);
CardCode := McrPay.CardNum;
end;
// проверка наличия контролируемых блюд в заказе
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(it.RefItem) then
dishpresent := dishpresent + 1;
if Categ2.IsChild(it.RefItem) then
dishpresent := dishpresent + 1;
if Categ3.IsChild(it.RefItem) then
dishpresent := dishpresent + 1;
end;
// контроль при оплате
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if dishpresent > 0 then
if CardCode <> '' then
AAllow:= True
else
begin
AAllow := false;
AMessage := 'Примените карту ПЛАСТЕК!';
end;
end;
Скрипт на изменение типа оплаты
Скриптами реализована блокировка добавление любых объектов в чек кроме оплаты разрешённой валютой при смене валюты платежа в закрытом чеке.
Скрипт для селектора
procedure ProcessOperation1003036(Parameter: integer);
var i, HaveCurrency1, HaveDenyCurr, AllowCurrType1, DennyCurrType1: integer;
it: TCheckItem;
begin
//***************** Set parameters ***********************//
DennyCurrType1 := 91; // Code of currency type
AllowCurrType1 := 15; // Code of currency type
//***************** Set parameters ***********************//
HaveCurrency1 := 0;
HaveDenyCurr := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
begin
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = AllowCurrType1) then
HaveCurrency1 := HaveCurrency1 + 1;
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = DennyCurrType1) then
HaveDenyCurr := HaveDenyCurr + 1;
end;
end;
if HaveDenyCurr > 1 then
begin
gui.showmessage('You can''t change this payment!');
exit;
end;
if HaveCurrency1 > 0 then
begin
RKCheck.CurrentOrder.UserTag1 := 10000;
RK7.PerformOperation(rkoUndoReceipt,0);
RKCheck.CurrentOrder.UserTag1 := 10000;
end
else
gui.showmessage('You can''t change this payment!');
end;
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var AllowCurrType1: integer;
i, numcateg, TypeCurrCode, CurrCode, maxqntvoucher: integer;
categsum, currsum,vouchersum: double;
it: TCheckItem;
Categ: TClassificatorGroup;
begin
//********************* 54276 *********************
//***************** Set parameters ***********************//
numcateg := 39; // Code of dish category
TypeCurrCode := 91; // Code of currency type
//***************** Set parameters ***********************//
currsum := 0;
categsum := 0;
maxqntvoucher := 0;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg)); // category code
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=TypeCurrCode then // checking dish category
begin
CurrCode := TPayLine(AObjectAft).Code;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only
if Categ.IsChild(it.RefItem) then //Check category of the dish
if TDish(it).Quantity > 0 then
categsum := categsum + TDish(it).PRListSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrCode) then
if (TPayLine(it).BasicSum > 0) then
currsum := currsum + TPayLine(it).NationalSum;
end;
vouchersum := TPayLine(AObjectAft).DBKurs;
maxqntvoucher := trunc(0.99+categsum / vouchersum);
if (categsum > 0) and (maxqntvoucher=0) then
maxqntvoucher := 1;
if ((currsum + vouchersum*TPayLine(AObjectAft).OriginalSum)/vouchersum) > (maxqntvoucher) then
begin
AAllow := false;
AMessage := 'Decreese quantity of vouchers to '+IntToStr(maxqntvoucher)+' !';
end;
end;
//********************* 54276 *********************
//********************* 53641 *********************
//***************** Set parameters ***********************//
AllowCurrType1 := 91; // allow curency type
//***************** Set parameters ***********************//
if RKCheck.CurrentOrder.UserTag1 = 10000 then // it's don't work in current version R-Keeper
begin
AMessage := 'Denied this action!';
AAllow := False;
if not(AEditType = etRemove) then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TPayLine') then
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=AllowCurrType1 then // ??? ???? ?????? ??? ???????? ?????????????? ?????????? ??????
begin
AAllow := True
end
else
begin
AMessage := 'You can''t add this currency';
AAllow := False;
end;
if AAllow then
begin
RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,342)); // print check
end;
end;
//********************* 53641 *********************
end;
Скрипт для замены типа оплаты
Необходим скрипт который будет позволять производить замену типа оплаты в пробитом чеке.
Подготовка:
1. Заводим 2 валюты
тип 1-ой валюты - Наличные
тип 2-ой валюта - Платежные карты
2. Указываем скрипт-коды этих валют
3. Создаем причину отмены (Замена типа оплаты). Ее код указываем в скрипте
Сценарий:
1. Пробиваем чек
2. Идем в закрытые заказы
3. Выбираем чек, в котором хотим поменять тип оплаты
4. Жмем кнопку «Заменить тип оплаты»
5. Скрипт проверяет код валюты, на которую закрыт чек:
5.1. Если чек закрыт на любую другую валюты, код которой мы не указали в скрипте, то операцию не производим, а выдаем сообщение пользователю, что данная операция не возможна.
5.2. Если код валюты тот, который указан в скрипте, то идем дальше
6. Скрипт отменяет чек, указываем причину отмены
7. Скрипт в заказ из этого чека добавляет сохраняемый комментарий (Чек отменен при замене валюты с EUR на VISA (например))
7.1. Желательно в этот комментарий поместить номер следующего чека, того который будет закрыт на нужную валюту.
8. Скрипт пробивает новый чек с тем же содержимым, но закрываем его на другую валюту, код которой указан в скрипте.
8.1. При печати нового чека в мемо или не сохраняемый комментарий или еще в какое поле пишем «Чек с измененной валютой оплаты, напечатан вместо НОМЕР ОТМЕНЕННОГО чека»
8.2. В сохраняемый комментарий заказа добавляем «Корректный чек - НОМЕР НОВОГО ЧЕКА»
Скрипт для пользовательской операции назначаемой на селектор формы закрытого чека
procedure ProcessOperation1002528(Parameter: integer);
var i, HaveCurrency1, HaveDenyCurr, AllowCurrType1, DennyCurrType1, CheckNum: integer;
CurrName: string;
it: TCheckItem;
begin
//***************** Set parameters ***********************//
DennyCurrType1 := 91; // Code of currency type
AllowCurrType1 := 13; // Code of currency type
//***************** Set parameters ***********************//
HaveCurrency1 := 0;
HaveDenyCurr := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
begin
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = AllowCurrType1) then
begin
HaveCurrency1 := HaveCurrency1 + 1;
CurrName := TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Name;
end;
if (TCurrencyType(TCurrency(TPayLine(it).RefItem).MainParent).Code = DennyCurrType1) then
HaveDenyCurr := HaveDenyCurr + 1;
end;
if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then
CheckNum := TPrintCheckItem(it).CheckNum;
end;
if HaveDenyCurr > 1 then
begin
gui.showmessage('You can''t change this payment!');
exit;
end;
if HaveCurrency1 > 0 then
begin
RKCheck.CurrentOrder.UserTag1 := 10000;
RK7.PerformOperation(rkoUndoReceipt,0);
RKCheck.UpdateVisitComment(' #'+IntToStr(CheckNum)+' currency '+CurrName, '');
RKCheck.CurrentOrder.UserTag1 := 10000;
end
else
gui.showmessage('You can''t change this payment!');
end;
В форме редактирования чека у объекта CheckView в событии OnBeforeCheckViewEdit указать скрипт:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var AllowCurrType1: integer;
i, numcateg, TypeCurrCode, CurrCode, maxqntvoucher: integer;
categsum, currsum,vouchersum: double;
it: TCheckItem;
Categ: TClassificatorGroup;
begin
//********************* 81848 *********************
//***************** Set parameters ***********************//
AllowCurrType1 := 91; // allow curency type
//***************** Set parameters ***********************//
if RKCheck.CurrentOrder.UserTag1 = 10000 then
begin
AMessage := 'Denied this action!';
AAllow := False;
if not(AEditType = etRemove) then
if SYS.ObjectInheritsFrom(TObject(AObjectAft), 'TPayLine') then
if TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Code=AllowCurrType1 then
begin
AAllow := True
end
else
begin
AMessage := 'You can''t add this currency';
AAllow := False;
end;
if AAllow then
begin
RKCheck.UpdateVisitComment('Change payment '+RKCheck.CurrentOrder.VisitExtraInfo+' to '+TCurrencyType(TCurrency(TPayLine(AObjectAft).RefItem).MainParent).Name, '');
RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,342)); // print check
end;
end;
//********************* 81848 *********************
end;
У пользовательской операции, назначенной на селектор по смене оплаты в закрытом чеке, включить «Запись в журнал», переименовать саму операцию так как хотелось бы видеть в логе операций.
Скрипт на ограничение количества ваучеров
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, numcateg, codecurr, maxqntvoucher: integer;
categsum, currsum,vouchersum: double;
it: TCheckItem;
Categ: TClassificatorGroup;
begin
numcateg := 4; // categorycode for special dishes
vouchersum := 500; // sum of 1 voucher
currsum := 0;
categsum := 0;
maxqntvoucher := 0;
codecurr := 14;
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', numcateg)); //5 - category code
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only
if Categ.IsChild(it.RefItem) then //Check category of the dish
if TDish(it).Quantity > 0 then
categsum := categsum + TDish(it).PRListSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = codecurr) then
currsum := currsum + TPayLine(it).NationalSum;
end;
maxqntvoucher := trunc(0.99+categsum / vouchersum);
if (categsum > 0) and (maxqntvoucher=0) then
maxqntvoucher := 1;
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if (TPayLine(AObjectAft).code = codecurr) then
if ((currsum + vouchersum*TPayLine(AObjectAft).OriginalSum)/vouchersum) > (maxqntvoucher) then
begin
AAllow := false;
AMessage := 'Decreese quantity of vouchers to '+IntToStr(maxqntvoucher)+' !';
end;
end;
Скрипт на ограничение удаления блюд из несохраненного заказа
Нужен скрипт реализующий следующее:
- кассир самостоятельно может удалять блюда из заказа до момента нажатия кнопки «Оплата».
- удалить все блюда до нуля нельзя, хотя бы одно в заказе должно остаться.
1. добавить скрипт
procedure ProcessOperation1000185(Parameter: integer);
begin
end;
2. добавьте его в пользовательскую операцию, запомните её номер, и установите св-во контроль доступа.
3. В свойствах ролей пользователей добавьте менеджеру разрешение на использование данной пользовательской операцией.
4. В форму «Редактирование заказа: Быстрый чек», объект DesignForm добавить строку
if Operation = 454 then RKCheck.CurrentOrder.UserTag1 := 1;
5. Далее объект CheckView, событие OnBeforeCheckView. Тело скрипта с учетом переменных от других скриптов KFC:
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CurrCode1, CurrCode2, CurrCode2_2, curr1present, curr2present: integer;
it: TCheckItem;
Categ: TClassificatorGroup;
CategCode: integer;
j,cntrl: integer;
it1:tobject;
begin
//--------------- 63889 --------------------------
cntrl:=0;
// for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
// begin
// it:=RKCheck.CurrentOrder.Sessions.Lines[i];;
// if SYS.ObjectInheritsFrom(it, 'TDish') then cntrl:=cntrl+1;
// end;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it1:=RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it1, 'TDish') then
begin
cntrl:=cntrl+1;
if TDish(it1).IsComboComp then cntrl:=cntrl-1;
// gui.showmessage(intToStr(cntrl));
end;
end;
if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then
if AEditType=etRemove then
begin
if cntrl<2 then
begin
AAllow:=false;
AMessage:='В заказе должно быть хотя бы одно блюдо';
end
else
if RKCheck.CurrentOrder.UserTag2 = 1 then
if RK7.CashUser.ConfirmOperation(rkoUser03) then AAllow:=true
else
begin
AAllow:=false;
AMessage:='Удаление невозможно'+#13#10+'нет доступа!';
end;
end;
end;
6. В процедуре CheckViewOnOrderVerify после первого begin добавить
if AVerifyType=vtPrintReceipt then begin
RKCheck.CurrentOrder.UserTag2 := 0;
//gui.showmessage('обнуление контрольной переменной');
end;
Скрипт на запрет изменения количества
procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, integer;
it: TCheckItem;
qnt,qntbefore: double;
begin
//Start Lock change DISH QNT for Categ CRM
qnt := 0;
if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then
if not(AEditType = etRemove) then
if (TDish(AObjectAft).RefItem.MainParent.code = 3100) and (TDish(AObjectBef).Quantity <> 0) then //Check category of the dish
begin
//Gui.SHowMessage('3' + ' QNTBef=' + FloatToStr(TDish(AObjectBef).Quantity));
qntBefore := TDish(AObjectBef).Quantity;
qnt := TDish(AObjectAft).Quantity-TDish(AObjectBef).Quantity;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDish') then
qnt := qnt + TDish(it).Quantity;
end;
end;
if qnt <> qntBefore then // check limit exceed
begin
AAllow := false;
AMessage := 'You dont have permissions for change dish quantyti';
end;
//End Lock change DISH QNT for Categ CRM
end;