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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var

Categ: TClassificatorGroup;

begin 

if TRK7Restaurant(RK7.CashGroup.MainParent).Code = 6 then

if (AEditType = etInsert) and SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then begin

Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 145)); // oeacaou eia eeanneoeeaoee

if Categ.IsChild(TDish(AObjectAft).RefItem) then

RK7.PostOperation(rkoPrepaySelector, 145);

end;

end;
DELPHI

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

Скрипт должен добавит группу меню «десерты» при добавлении группы меню «напитки» и положительном ответе на вопрос.

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var MenuCode, GroupMenu: integer;


begin 

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

MenuCode := 11; // код добавляемого меню "десерты"

GroupMenu := 8; // группы меню "напитки"

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

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

begin

if (TMenuGroupLine(AObjectAft).Code = GroupMenu) then 

begin 

RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, MenuCode )); //Code open menu

end

end

end;
DELPHI

Скрипт для автоматического включения тарификации по времени

В двух ресторанах есть общий зал и отдельные кабины. В общем зале и кабинах есть 10% наценка за обслуживание, а в кабинах дополнительно поминутная тарификация, то есть час пребывания в кабине стоит 40 сомони, а минута стоит около 66 дирамов. Необходимо сделать, чтобы при открытии заказа в кабинах система автоматически включила поминутную тарификацию, а при печати пречека тарификация приостановилась и в пречеке была сумма тарификации.  В одном из ресторанов используется «Мобильный официант», а во втором — обычный POS-терминал.

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, CntDish: integer;

it: TCheckItem;

begin

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

begin

CntDish := 0;

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

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

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

CntDish := CntDish + 1;

end;

if CntDish = 1 then

RK7.PostOperation(rkoAddTariff, 0);

end;

end;

Вместо селектора пречека создать свой вариант и назначить ему пользовательскую операцию со скриптом:


procedure ProcessOperation1001625(Parameter: integer);

begin

RK7.PostOperation(rkoCloseTariff, 0);

end;
DELPHI

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

При добавлении модификаторов с кодами указанными в скрипте, их вес из расширенного свойства будет удаляться из весового блюда:

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var j,ModifCode1,ModifCode2,ModifCode3: integer;

ed: TObject;

weight:double;

it: TCheckItem;

begin

ModifCode1 := 98;

ModifCode2 := 98;

ModifCode3 := 100;


weight:=0;


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

if (TModiItem(AObjectAft).code = ModifCode1)

or(TModiItem(AObjectAft).code = ModifCode2)

or(TModiItem(AObjectAft).code = ModifCode3) then

begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then Exit;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then Exit;

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

begin

weight:= TDish(it).Quantity; 

ed := TObject(gui.FindComponentByName('Editor'));

if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then

begin

weight:=StrToFloat(TModifier(TModiItem(AObjectAft).RefItem).genWeight0419);

TNumEditor(ed).Text := floatToStr(TDish(it).Quantity+(weight/1000)); // + если в модификаторе отрицательный вес блюд и - если в модификаторе положительный вес.

RK7.PerformOperation(rkoEditPortionWeight, 0);

TNumEditor(ed).Text := '';

end;

end; 

end; 

end;
DELPHI

Скрипт: при заказе 2-х блюд — третье, самое дешевое, в подарок

Если в заказе 6 блюд, соответственно, двум самым дешевым.

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

begin

AddEveryOtherDiscount(11{DiscCode}); // 11 суммовая открытая скидка на блюдо

end;

Перед этим скриптом добавить следующий скрипт:


Исправленный вариант:


procedure AddEveryOtherDiscount(DiscCode: integer);

var i, j, k, evr, qntdsc, CategCode: integer;

it, CurItem: TCheckItem;

SL: TStringList;

a, q, Price: double;

d: TDish;

CheckView: TCheckView;

categ: TClassificatorGroup;

begin

evr := 3; // make discount every this count

qntdsc := 0;

CategCode := 5; //5 - paste your category code

CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

if CheckView = Nil then Exit;

CurItem := RKCheck.CurrentCheckItem;

SL := TStringList.Create;

try

// Create list of the dishes, sorted by price 

SL.Sorted := True;

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

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

Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));

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

if Categ.IsChild(it.RefItem) then //Check category of the dish 

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

if not(TDish(it).IsComboComp) then

if ((it.State = disOpened) or (it.State = disPrinted)) then begin

// gui.showmessage(TDish(it).name);

if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price

else Price := TDish(it).PRListSum/TDish(it).Quantity;

SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI), TObject(it));

end;

end;


if evr > 0 then

qntdsc := SL.Count div evr;


if SL.Count >= evr then 

for i := 0 to SL.Count - 1 do begin

d := TDish(SL.Objects[i]); 

a := 0;

q := d.Quantity;

if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price

else Price := d.PRListSum/d.Quantity;

while q + 0.0001 > 1 do begin 

//if (i+1) mod evr = 0 then

if ((i+1)<=qntdsc)and(qntdsc>0) then

a := a + Price;

q := q - 1;

end;


// Delete discount, if a sum changed

for j := RKCheck.CheckItemCount(TObject(d.Discounts)) - 1 downto 0 do begin

it := RKCheck.CheckItemByNumber(TObject(d.Discounts), j);

if (it.Code = DiscCode) then begin

if abs(TDiscountItem(it).SrcAmount) = a then

a := 0 

else RKCheck.DeleteCheckItem(it);

break;

end;

end;


// Create discount to a dish

if a > 0 then begin

CheckView.GotoItem(TObject(d));

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));

end;

end;

finally

SL.Free();

if CurItem <> Nil then

CheckView.GotoItem(CurItem);

end;

RKCheck.CurrentOrder.Recalc();

end;
DELPHI

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

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, j, p, z, CategCode: integer;

Categ: TClassificatorGroup;

it, CurItem: TCheckItem;

DishCode, CntDish1, CntDish2: integer;

CheckView: TCheckView;

DishesCode: TStringList; 

begin

CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

if CheckView = Nil then Exit;

DishesCode := TStringList.Create;

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

DishesCode.Add('27;45'); // код категории акционного блюда для которого добавляется бонусное блюдо ; код бонусного блюда

DishesCode.Add('28;46');

DishesCode.Add('8;43');

//DishesCode.Add('17;24');

//DishesCode.Add('18;25');

//DishesCode.Add('19;26');

//DishesCode.Add('11;27');

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

CurItem := RKCheck.CurrentCheckItem;

if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only 

try

for z := 0 to DishesCode.Count-1 do

begin

p:=pos(';',DishesCode.Strings[z]);

CategCode := StrToInt(copy(DishesCode.Strings[z],1,p-1)); // код категории акционного блюда для которого добавляется бонусное блюдо 

DishCode := StrToInt(copy(DishesCode.Strings[z],p+1,length(DishesCode.Strings[z])-p)); // код бонусного блюда

//dbg.dbgprint('CategCode = '+inttostr(CategCode)+' DishCode = '+inttostr(DishCode));

Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code

//dbg.dbgprint('TDish(AObjectAft).Code = '+inttostr(TDish(AObjectAft).Code));

if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish

begin

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(TDish(AObjectAft).Quantity)); // add bonus dish

end;

end;

finally

DishesCode.Free();

if CurItem <> Nil then CheckView.GotoItem(CurItem); 

end;

RKCheck.CurrentOrder.Recalc(); // нарушается фокусировка, если раскоментировать

end;
DELPHI

Скрипт, добавляющий «блюдо в подарок» для каждого 4-го уникального блюда из категории

Есть блюда категории «шот». Нужно при заказе четырёх одинаковых блюд из этой категории добавлять в заказ на выбор блюдо из категории «пицца». Пицца должна добавиться с нулевой ценой, либо со 100% скидкой.

Скрипт на событие OnAfterCheckViewEdit объекта CheckView, расположенного на форме редактирования чека. Считаются все блюда в категории и на каждое n-ое добавляется бонусное блюдо.

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, j, CategCode, every, p1, p2: integer;

Categ: TClassificatorGroup;

it, it2, CurItem: TCheckItem;

DishCode, CntDish1, CntDish2, AddDish2: integer;

mem, mem2, str: string;

CheckView: TCheckView; 

DishesCode: TStringList;

begin

CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

if CheckView = Nil then Exit;

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

CategCode := 27; // код категории

DishCode := 45; // код бонусного блюда

every := 4;

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

Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));//category code

CurItem := RKCheck.CurrentCheckItem;

if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only 

if (Categ.IsChild(TDish(AObjectAft).RefItem)) then // checking category of dish

begin

CntDish2 := 0; // счётчик кол-ва акционного блюда

mem := '';

mem2 := '';

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

begin

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

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

begin

if (Categ.IsChild(TDish(it).RefItem)) then // checking category of dish

begin

CntDish1 := 0; // счётчик кол-ва бонусного блюда

if pos(';' + IntToStr(TDish(it).Sifr) + '=',mem)<=0 then

begin

mem := mem + ';' + IntToStr(TDish(it).Sifr) + '='+FloatToStr(TDish(it).Quantity);

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

begin

it2 := RKCheck.CurrentOrder.Sessions.Lines[j];

if SYS.ObjectInheritsFrom(TObject(it2), 'TDish') then

if (TDish(it2).code=TDish(it).code) then // checking category of dish

CntDish1 := CntDish1 + trunc(TDish(it2).Quantity);

end;

end;

if CntDish1>=every then

begin

mem2 := mem2 + ';' + IntToStr(TDish(it).code) + '='+FloatToStr(CntDish1);

end; 

end;


if (TDish(it).Code = DishCode) then

CntDish2 := CntDish2 + trunc(TDish(it).Quantity);

end;

end;

AddDish2 := 0;

while mem2<>'' do

begin

p1 := Pos(';', mem2);

if p1 > 0 then

begin

str := Copy(mem2, p1+1, 10000);

p2 := Pos(';', str);

if p2 = 0 then p2 := 10000;

str := Copy(mem2, p1+1, p2 - 1);

Delete(mem2, p1, p2);

CntDish1 := trunc(StrToFloat(Copy(str, Pos('=', str)+1, 10000))/every);

if CntDish1>0 then

AddDish2 := AddDish2 + CntDish1;

end;

end;


if (AddDish2 <> CntDish2) then

begin

if CntDish2 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do

begin

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

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

if (TDish(it).Code = DishCode) then

RKCheck.DeleteCheckItem(it);

end;

end;

if CntDish1 > 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(AddDish2)); // add bonus dish

end;


end;

if CurItem <> Nil then CheckView.GotoItem(CurItem); 

end;
DELPHI

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

procedure DiscountUsage1002304(UsageParameters: TDiscountUsageParameters);

var i,cntDiscount, DiscountCode1, DiscountCode2, DiscountCode3: integer;

it: TCheckItem;

begin

// if not RKCheck.Valid then exit; 

DiscountCode1 := 12; // код скидки1

DiscountCode2 := 12; // код скидки2

DiscountCode3 := 14; // код скидки3

cntDiscount := 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 = DiscountCode1)or(it.code = DiscountCode2)or(it.code = DiscountCode3) then 

if TDiscountItem(it).SrcAmount<>0 then

begin 

cntDiscount := cntDiscount + 1;

break;

end;

end;

if cntDiscount>0 then

UsageParameters.UsageMode := umDeny

else

UsageParameters.UsageMode := umAllow;

end;
DELPHI

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

Пример: на входе кассир открыл тарифицируемое место и отдал гостю карту, гость пошел в бар и бармен добавил ему блюда в заказ на карту.

Необходимо добавить наценку в тот момент, когда бармен открыл его заказ на редактирование.

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var Categ: TClassificatorGroup;

it: TCheckItem;

i, CategCode, DiscCode, DiscCnt: Integer;

begin

CategCode := 8; // указать код категории

DiscCode := 5; // код наценки

DiscCnt := 0;

if AEditType = etInsert then

begin

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

begin

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

if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check dish lines only

if (TDiscountItem(it).Code = DiscCode) then

DiscCnt := DiscCnt + 1;

end;


// add discount

Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));

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

if Categ.IsChild(TDish(AObjectAft).RefItem) then

if DiscCnt = 0 then

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(100)); // add discount with code 11

end; 

end;
DELPHI

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

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, j: integer;

it: TCheckItem;

DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer; 


disk : integer;

disksum: double;

CurrTime, Time1, Time2: TDateTime; 

begin

Time1 := EncodeTime(08,00,00,00); // начало периода акции

Time2 := EncodeTime(21,00,00,00); // конец периода акции

DiscCode := 12; // код скидки

DishCode := 13; // код бонусного блюда

AddDishCode := 7; // код акционного блюда


CntDish1 := 0;

CntDish2 := 0;

CurrTime := Time;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

if DayOfWeek(Now)=5 then // проверка дня недели

if (Time1<=CurrTime) and(CurrTime<=Time2) then

if SYS.ObjectInheritsFrom(AObjectAft, 'TDish') then //Check dish lines only

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

begin


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

begin

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

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

begin

if (TDish(it).Code = AddDishCode) then

CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

if (TDish(it).Code = DishCode) then

CntDish2 := CntDish2 + trunc(TDish(it).Quantity);

end; 

end; 


if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;


if (CntDish1 <> CntDish2) then

begin

if CntDish2 > 0 then

begin

if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;

RK7.PerformOperation(rkoHome, 0);

while True do begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

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

if (TDish(it).Code = DishCode) then begin

if it.State = disOpened then begin

RK7.PerformOperation(rkoDeleteLine, 1); // удаление

continue;

end else

RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание

end;

RK7.PerformOperation(rkoDown, 0);

end;

end;

if CntDish1 > 0 then

begin

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки

end;

end;

end;

end;
DELPHI

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

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

var i, j: integer;

it: TCheckItem;

DiscCode, DishCode, CntDish1, CntDish2, AddDishCode: integer; 


disk : integer;

disksum: double;

CurrTime, Time1, Time2: TDateTime; 

begin

Time1 := EncodeTime(08,00,00,00); // начало периода акции

Time2 := EncodeTime(21,00,00,00); // конец периода акции

DiscCode := 12; // код скидки

DishCode := 13; // код бонусного блюда

AddDishCode := 7; // код акционного блюда


CntDish1 := 0;

CntDish2 := 0;

CurrTime := Time;

//1 = воскресенье

//2 = понедельник

//3 = вторник

//4 = среда

//5 = четверг

//6 = пятница

//7 = суббота

if DayOfWeek(Now)=5 then // проверка дня недели

if (Time1<=CurrTime) and(CurrTime<=Time2) then

if SYS.ObjectInheritsFrom(AObjectBef, 'TDish') then //Check dish lines only

if (TDish(AObjectBef).Code = AddDishCode) then

if (AEditType = etRemove) then

begin

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

begin

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

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

begin

if (TDish(it).Code = AddDishCode) then

CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

if (TDish(it).Code = DishCode) then

CntDish2 := CntDish2 + trunc(TDish(it).Quantity);

end; 

end; 

CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);


if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;


if (CntDish1 <> CntDish2) then

begin

if CntDish2 > 0 then

begin 

if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;

RK7.PerformOperation(rkoHome, 0);

while True do begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

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

if (TDish(it).Code = DishCode) then begin

if it.State = disOpened then begin

RK7.PerformOperation(rkoDeleteLine, 1); // удаление

continue;

end else

RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity)); // списание

end;

RK7.PerformOperation(rkoDown, 0);

end; 

end;

if CntDish1 > 0 then

begin

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(CntDish1)); // добавление блюда

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), '0'); // добавление скидки

end;

end; 

end;

end;
DELPHI


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

Существует акционное блюдо с нулевой ценой. Клиент хочет, чтобы это блюдо автоматически добавлялось в заказ, если сумма заказа достигла 999 рублей и чтобы удалялось, если сумма заказа не достигла 999 рублей (не доверяют персоналу).

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

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

var i, j: integer;

it: TCheckItem;

limit, sum : double; 

DiscCode, DishCode, CntDish1: integer; 

begin

limit := 200; 

DishCode := 43; // special dish code

CntDish1 := 0;


// { блокировка добавления специального блюда при сумме меньше лимита.

if AEditType = etInsert then

if RKCheck.CurrentOrder.UnpaidSum < limit then

if (TDish(AObjectBef).Code = DishCode) then // dish code

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

begin 

AAllow := false;

AMessage := 'Блюдо нельзя добавить, т.к. заказ менее 200 р.';

end;

// }


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

if AEditType = TdiscountItem

e then

begin

sum := 0;

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 = DishCode) then

CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

end; 

if (TDish(AObjectBef).Code = DishCode) then // dish code

CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);


if AEditType = etRemove then

sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum)

else

sum := RKCheck.CurrentOrder.UnpaidSum;


if sum < limit then // если сумма меньше лимита, то удалить специальное блюдо

if CntDish1 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

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

if (TDish(it).Code = DishCode) then

RKCheck.DeleteCheckItem(it);

end;

end; 


if RKCheck.CurrentOrder.UnpaidSum >= limit then // check limit exceed если сумма чека равна или больше лимита, то добавить спец.блюдо

if CntDish1 = 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');

end;

end;
DELPHI

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, j: integer;

it: TCheckItem;

limit, sum, Price: double; 

DiscCode, DishCode, CntDish1: integer; 


begin

// if AEditType = etInsert then

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


begin 

sum := 0;

limit := 200; 

DishCode := 43; // special dish code

CntDish1 := 0;


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 = DishCode) then

CntDish1 := CntDish1 + trunc(TDish(it).Quantity);

end; 


if (TDish(AObjectBef).Code = DishCode) then // dish code

CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity);


Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum);


sum := RKCheck.CurrentOrder.UnpaidSum + Price;

if sum < limit then 

if CntDish1 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

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

if (TDish(it).Code = DishCode) then

RKCheck.DeleteCheckItem(it);

end;

end;


if sum >= limit then // check limit exceed если сумма равна или больше лимита, то добавить спец.блюдо

if CntDish1 = 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), '1');


end; 

end;
DELPHI

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

При сумме заказа от 1000 р. в заказ добавляется определенное блюдо, а при сумме заказа от 2000 р. добавляется другое блюдо.

Также на чек автоматически делается скидка 20%, если добавить блюдо по цене 1000 (сумма заказа в таком случае составит 800).

Бесплатное блюдо добавляется при постепенном формировании заказа. При уменьшение суммы заказа блюдо удаляется. Если заказ превышает сумму в 2000 р., бесплатное блюдо с условием заказ>2000р. добавляется, а блюдо с условием заказ>1000 р. удаляется. А если уменьшить сумму заказа с 2000 до 1500, то блюдо с условием заказ>2000 р. убирается, а блюдо с условием заказ>1000р. должно добавляться.

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var i, j: integer;

it: TCheckItem;

limit1, limit2, sum, Price: double; 

DishCode1, DishCode2, CntDish1, CntDish2: integer;

go1: boolean;

begin

sum := 0;

limit1 := 1000;

limit2 := 2000;

DishCode1 := 45; // special dish code

DishCode2 := 46; // special dish code

CntDish1 := 0;

CntDish2 :=0;

Price := 0;

go1 := false;


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

if (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) then

go1 := true;

if go1 or SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then 

begin


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

begin

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

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

begin

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

CntDish1 := CntDish1 + trunc(TDish(it).Quantity)

else 

if (TDish(it).Code = DishCode2) then

CntDish2 := CntDish2 + trunc(TDish(it).Quantity);

end;

end; 


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

if ( (TDish(AObjectAft).code <> DishCode1) and (TDish(AObjectAft).code <> DishCode2) ) then

begin

if (TDish(AObjectBef).Code = DishCode1) then // dish code

CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity)

else

if (TDish(AObjectBef).Code = DishCode2) then // dish code

CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity);


// Price := (TDish(AObjectAft).PRListSum) - (TDish(AObjectBef).PRListSum);

Price := (TDish(AObjectAft).SumWithDiscounts) - (TDish(AObjectBef).SumWithDiscounts); // SumWithDiscounts

end;


sum := RKCheck.CurrentOrder.ToPaySum + Price+ RKCheck.CurrentOrder.DiscountSum;


// if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then 

// gui.showmessage('ToPaySum='+FloatToStr(RKCheck.CurrentOrder.ToPaySum)+' Price='+FloatToStr(Price)+' Discountsum='+FloatToStr(RKCheck.CurrentOrder.DiscountSum)+' CalcAmount='+FloatToStr(TDiscountItem(AObjectAft).CalcAmount));


if sum < limit2 then

if CntDish2 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do

begin

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

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

if (TDish(it).Code = DishCode2) then

RKCheck.DeleteCheckItem(it);

end;

end;


if (sum < limit1) or (sum >=limit2) then

if CntDish1 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do

begin

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

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

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

RKCheck.DeleteCheckItem(it);

end;

end;


if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????

begin

if CntDish2 <= 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1');

end

else

if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????

if CntDish1 <= 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1');


end;

end;




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

var i, j: integer;

it: TCheckItem;

limit1, sum, limit2 : double;

DiscCode, DishCode1, CntDish1, DishCode2, CntDish2: integer;

begin

limit1 := 1000;

limit2 := 2000;

DishCode1 := 45; // special dish code

DishCode2 := 46; // special dish code

CntDish1 := 0;

CntDish2 :=0;


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

if AEditType = etRemove then

begin

sum := 0;

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

begin

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

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

begin

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

CntDish1 := CntDish1 + trunc(TDish(it).Quantity)

else 

if (TDish(it).Code = DishCode2) then

CntDish2 := CntDish2 + trunc(TDish(it).Quantity);

end;

end;

if (TDish(AObjectBef).Code = DishCode1) then // dish code

CntDish1 := CntDish1 - trunc(TDish(AObjectBef).Quantity)

else

if (TDish(AObjectBef).Code = DishCode2) then // dish code

CntDish2 := CntDish2 - trunc(TDish(AObjectBef).Quantity); 


if AEditType = etRemove then

// sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).PRListSum)

sum := RKCheck.CurrentOrder.UnpaidSum - (TDish(AObjectBef).SumWithDiscounts)

else

sum := RKCheck.CurrentOrder.UnpaidSum;


if sum < limit2 then // ???? ????? ?????? ??????, ?? ??????? ??????????? ?????

if CntDish2 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

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

if (TDish(it).Code = DishCode2) then

RKCheck.DeleteCheckItem(it);

end;

end; 


if (sum < limit1) or (sum >=limit2) then // ???? ????? ?????? ??????, ?? ??????? ??????????? ?????

if CntDish1 > 0 then

begin

for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin

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

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

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

RKCheck.DeleteCheckItem(it);

end;

end;


if sum >= limit2 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????

begin

if CntDish2 <= 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), '1');

end

else

if sum >= limit1 then // check limit exceed ???? ????? ????? ??? ?????? ??????, ?? ???????? ????.?????

if CntDish1 <= 0 then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), '1');


end;

end;
DELPHI

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var codedish1: integer;

begin

codedish1 := 23; // dish code for autoadding

if RKCheck.CurrentOrder.IsEmpty then

if AEditType = etInsert then

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

begin

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(codedish1), IntToStr(RKCheck.CurrentOrder.GuestsCount)); // add dish

end;

end;
DELPHI

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

Бонусы действуют до 22:00. Гость пришел в 21:50, заказал сок за 100р. В 22:20 заказал пирожок за 50р. В 22:40 (или в час ночи) попросил счёт и дал карту - бонусы должны начислиться на сок, но не на пирожок, несмотря на время проведения картой.

Скрипт для события OnAfterCheckViewEdit у объекта CheckView на форме редактирования заказа:

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var

i, cntDish, DishCode: integer;

it: TCheckItem;

a, Price: double;

CurrTime, Time1: TDateTime; 

begin

DishCode := 43; // код блюда с открытой ценой

Time1 := EncodeTime(18,05,00,00); // граничное время

if (AEditType=etInsert)or(AEditType=etChange) then 

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

if (TDish(AObjectAft).Code <> DishCode) then

begin

a := 0;

cntDish := 0;

Price := 0;

CurrTime := Time;

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 (TDish(it).Code = DishCode) then

cntDish := cntDish + 1

else

begin

if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then

a := a + TDish(it).PRListSum;

end;

end; 

if (a > 0.00001) then

begin

if (cntDish = 0) then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) // ?????????? ? ????? ????? ? ????? 43

else

begin


if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;

RK7.PerformOperation(rkoHome, 0);

while True do begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin

if (TDish(it).Code = DishCode) then 

if a <> TDish(it).UserPrice then

if it.State = disOpened then begin

RK7.PerformOperation(rkoDeleteLine, 1);

continue;

end else

RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));

end;

RK7.PerformOperation(rkoDown, 0);

end;

if CurrTime < Time1 then 

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) 


end; 

if CurrTime < Time1 then 

if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then

begin

TDish(RKCheck.CurrentCheckItem).IsUserPrice := true;

TDish(RKCheck.CurrentCheckItem).UserPrice := a;

end;

end;

end;

end;
DELPHI

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

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

var

i, j, cntDish, DishCode: integer;

it: TCheckItem;

a, Price: double;

CurrTime, Time1: TDateTime; 

begin

DishCode := 43; // код блюда с открытой ценой

Time1 := EncodeTime(18,05,00,00); // граничное время

if (AEditType=etRemove) then // etChange etRemove

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

if (TDish(AObjectBef).Code <> DishCode) then

begin

a := 0;

cntDish := 0;

Price := 0;

CurrTime := Time;

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 (TDish(it).Code = DishCode) then

cntDish := cntDish + 1

else

begin


if (StrToTime(TimeToStr(TDish(it).Session.StartService)) < Time1) then

a := a + TDish(it).PRListSum;

end;

end; 


// if (StrToTime(TimeToStr(TDish(AObjectBef).Session.StartService)) < Time1) then // учитывать сумму удаляемого блюда / раскоментировать когда будет исправлен баг

a := a - TDish(AObjectBef).PRListSum;


if (a > 0.00001) then

begin

if (cntDish = 0) then

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), FloatToStr(1)) 

else

if CurrTime < Time1 then

begin


if GUI.CheckFormInPayMode then Exit;

if RK7.CashUser.ConfirmOperation(rkoCreateVoid) = False then Exit;

RK7.PerformOperation(rkoHome, 0);

while True do begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then begin

if (TDish(it).Code = DishCode) then 

if a <> TDish(it).UserPrice then

if it.State = disOpened then begin

if trk7menuItem(TDish(it).RefItem).OpenPrice then

begin

TDish(it).IsUserPrice := true;

TDish(it).UserPrice := a;

end; 

end else

RKCheck.CreateCheckItem(rkrefOrderVoids, '1', FloatToStr(TDish(it).Quantity));

end;

RK7.PerformOperation(rkoDown, 0);

end;

end; 

end;

end;

end;
DELPHI

В скриптах задать соответствующие значения для DishCode и Time1.

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

procedure DiscountUsage1001731(UsageParameters: TDiscountUsageParameters);

var i: integer;

it: TCheckItem;

a: double; 

begin 

a := 0;

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

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

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

a := a + TDish(it).PRListSum

else if SYS.ObjectInheritsFrom(TObject(it), 'TChargeLine') then

a := a + TChargeLine(it).CalcAmount;

end;


if a >= 150 then

UsageParameters.UsageMode := umAuto

else UsageParameters.UsageMode := umDeny;

end;
DELPHI

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

Системы доставки нет. Вся доставка просто бьется на стол 80, а самовынос - на стол 70. 

Скрипт для объекта CheckView в событии OnBeforeCheckViewEdit

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

var ToPaySum, sumDiscount : double;

i, CntDicount, DiscCode, sumActtion: integer;

it: TCheckItem;

begin

CntDicount := 0;

DiscCode := 18; // код суммовой скидки добавляемой по акции

sumActtion := 700; // сумма чека для активации акции

sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки)

ToPaySum := RKCheck.CurrentOrder.ToPaySum;

if AEditType = etRemove then

begin

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 = DiscCode) then

CntDicount := CntDicount + 1;

end;


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

ToPaySum := ToPaySum - TDish(AObjectBef).PRListSum;

if CntDicount > 0 then

ToPaySum := ToPaySum + sumDiscount;

if ToPaySum >= sumActtion+sumDiscount then

begin

if CntDicount = 0 then

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0));

end

else

if CntDicount > 0 then

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 = DiscCode) then begin

RKCheck.DeleteCheckItem(it);

CntDicount := 0;

end;

end; 

end; 

end;
DELPHI

Для объекта CheckView в событии OnAfterCheckViewEdit

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var ToPaySum, sumDiscount, sumActtion: double;

i, CntDicount, DiscCode: integer;

it: TCheckItem;

begin

CntDicount := 0;

DiscCode := 18; // код суммовой скидки добавляемой по акции

sumActtion := 700; // сумма чека для активации акции

sumDiscount := 70; // сумма используемой скидки (подставить сумму из настроек суммовой скидки)

if not(AEditType = etRemove) then

begin

ToPaySum := RKCheck.CurrentOrder.ToPaySum;

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 = DiscCode) then

CntDicount := CntDicount + 1;

end;


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

begin 

if AEditType = etInsert then

ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum

else if AEditType = etChange then

ToPaySum := ToPaySum + TDish(AObjectAft).PRListSum - TDish(AObjectBef).PaySum; 

end;


if ToPaySum >= sumActtion+sumDiscount then

begin

if CntDicount = 0 then

RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(0));

end

else

if CntDicount > 0 then

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 = DiscCode) then begin

RKCheck.DeleteCheckItem(it);

CntDicount := 0;

end;

end; 

end;

end;
DELPHI

Скрипт на перенос блюда со 100% скидкой в отдельный пакет

Если 100% скидка применяется на блюдо, у которого цена в момент добавления скидки больше 0, то тогда такое блюдо перемещается в новый пакет с нулевой ценой.

При переносе блюда — название скидки сохраняется под этим блюдом. И потом можно посмотреть отчет по этим скидкам

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

begin

if AEditType = etInsert then

begin

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

if (TDiscountItem(AObjectAft).Code = 1000105) then // discount code

begin

if trk7menuItem(TDish(RKCheck.CurrentCheckItem).RefItem).OpenPrice then

begin

TDish(RKCheck.CurrentCheckItem).IsUserPrice := true;

TDish(RKCheck.CurrentCheckItem).UserPrice := 0;

end;

RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course

if SYS.ObjectInheritsFrom(RKCheck.CurrentCheckItem, 'TDish') then

if RKCheck.CurrentCheckItem.Session.iKurs <> 1000155 then

RKCheck.DeleteCheckItem(TDiscountItem(AObjectAft)); 

end;

end; 

end;
DELPHI

Проверка статуса блюда.

procedure ProcessOperation1001712(Parameter: integer);

var

it: TCheckItem;

i, code: integer;

qntnew, qntold, pricenew: double;

CurItem: TCheckItem;

ed: TObject;

begin

qntnew := 0;

pricenew := 100;

if not RKCheck.Valid then

exit //important checking

else

begin

CurItem := RKCheck.CurrentCheckItem;

if not(TDish(CurItem).State = disOpened) then

begin

gui.showmessage('You can''t move saved dish!!!');

exit;

end; 

ed := TObject(gui.FindComponentByName('Editor'));

if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then

if (length(TNumEditor(ed).Text)>0) then

qntnew := StrToFloat(TNumEditor(ed).Text)

else

qntnew := 1;

if SYS.ObjectInheritsFrom(TObject(CurItem), 'TDish') then

if (TDish(CurItem).quantity > qntnew) and (qntnew > 0) then

begin

TNumEditor(ed).Text := FloatToStr(TDish(CurItem).quantity-qntnew);

RK7.PerformOperation(rkoEditAmount, 0);

code := CurItem.code; 

RK7.PerformOperation(rkoDown, 0);

RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(code), IntToStr(Trunc(qntnew))); // add dish

end;

end;

TNumEditor(ed).Text := FloatToStr(qntnew);

// RK7.PerformOperation(rkoMoveCurrentDishToSes, 1000155) // ident of course 

RK7.PerformOperation(rkoMoveCurrentDishToSes, 1) // ident of course 

TNumEditor(ed).Text := '';

RK7.PostOperation(rkoDiscountSelector, 0); 

end;
DELPHI

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

Необходимо, чтобы при пробитии комбо-блюд, относящихся к классификации «49 рублей» на экране выходило информационное окно с текстом «предложи добавку за 49 рублей»

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var

Categ: TClassificatorGroup;

begin 

if AEditType = etInsert then

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

if TDish(AObjectAft).IsCombo then

begin

Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 8)); // указать код классификации

if Categ.IsChild(TDish(AObjectAft).RefItem) then

gui.ShowMessage('предложи добавку на 49 рублей');

end; 

end;
DELPHI

2) Добавить расширенное свойство в ресторане

Message_Addon_49
DELPHI

3) Назначить скрипт на форму быстрого чека

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var

Categ: TClassificatorGroup;

begin

if ( TRK7Restaurant(RK7.CashGroup.MainParent).genMessage_Addon_49='1') then

if AEditType = etInsert then

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

if TDish(AObjectAft).IsCombo then

begin

Categ := TClassificatorGroup(RK7.FindItemByCode(rkrefClassificatorGroups, 144)); // указать код классификации

if Categ.IsChild(TDish(AObjectAft).RefItem) then

gui.ShowMessage('Предложи Гостю добавку к комбо за 49 руб');

end;

end;
DELPHI

Для того ,чтобы в ресторане начали показывать сообщение, нужно указать «1» в расширенном свойстве Message_Addon_49

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

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

procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

var

i, DishCode: integer;

it: TCheckItem; 

begin

DishCode := 13; // код контролируемого блюда

if (AEditType=etInsert)or(AEditType=etChange) then 

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

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

begin

RK7.PerformOperation(rkoConsumatorSelector, 1);

end;

end;
DELPHI

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

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var

i, DishCode: integer;

it: TCheckItem; 

begin

DishCode := 13; // код контролируемого блюда

if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека

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 = DishCode) then

begin

// checking by Consumators

if TDish(it).Consumators.Count = 0 then

begin 

gui.ShowMessage('Операция запрещена, т.к. не выбран консумант!');

AContinue := false;

end;

end;

end; 

end;
DELPHI

Чтобы запретить выход из чека, если у блюда нет косуманта, то необходимо заменить условие в строке:

 if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при печати чека и пречека
DELPHI

на

if (AVerifyType = vtBeforeSave)or(AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then // срабатывать при сохранении заказа, печати чека и пречека
DELPHI

Скрипт на автоматическое изменение цены

Необходимо при продаже кофе вместе с любым блюдом из классификации (не категории) «Food» менять цену кофе

procedure ChangePrice;

var i, CategCode1, CategCode2, Categ2DishCnt, course1, course2: integer; 

Categ1, Categ2: TClassificatorGroup;

it, CurItem: TCheckItem;

CheckView: TCheckView;

begin

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

course1 := 1002378; // ident of course 1 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при наличии в заказе блюд из категории 2

course2 := 1002379; // ident of course 2 // указать идентификатор порядка подачи к которому привязан тип цены для блюда категории 1 при отсутсвии в заказе блюд из категории 2

CategCode1 := 8; // code of category for cofe // код категории 1

CategCode2 := 27; // code of category FOOD // код категории 2

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

CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

if CheckView = Nil then Exit;

Categ2DishCnt := 0;

Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));//category code

Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));//category code

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

begin

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

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

if Categ2.IsChild(TDish(it).RefItem) then

if TDish(it).Quantity > 0 then

Categ2DishCnt := Categ2DishCnt + 1;

end;

CurItem := RKCheck.CurrentCheckItem;

RK7.PerformOperation(rkoHome, 0);

while True do begin

it := RKCheck.CurrentCheckItem;

if TObject(it) = Nil then break;

if SYS.ObjectInheritsFrom(TObject(it), 'TPrintCheckItem') then break;

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

if (Categ1.IsChild(TDish(it).RefItem)) then // checking category of dish

if Categ2DishCnt > 0 then

begin 

if TRk7MenuItem(it.RefItem).Kurs <> course1 then

RK7.PerformOperation(rkoMoveCurrentDishToSes, course1) // change course

end

else

begin 

if TRk7MenuItem(it.RefItem).Kurs <> course2 then

RK7.PerformOperation(rkoMoveCurrentDishToSes, course2); // change course;

end;

RK7.PerformOperation(rkoDown, 0);

end; 

if CurItem <> Nil then CheckView.GotoItem(CurItem);

end;


procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);

begin

ChangePrice;

end;


procedure CheckViewCurItemChangedScript(Sender: TObject);

begin

ChangePrice;

end;
DELPHI