A script to open a custom selector when adding a specified dish to an order

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;

A script to offer a dessert to a guest

The script should add the "Desserts" menu group when adding the "Beverages" menu group and if the guest gives agrees.

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

var MenuCode, GroupMenu: integer;


begin 

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

MenuCode := 11; // code of the "Desserts" menu to be added

GroupMenu := 8; // "beverages" group menu

//********** 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;

A script to automatically turn on charging by time

The two restaurants have a common room and separate booths. There is a 10% extra charge for service both in the common room and booths. Besides, in the booths there is an additional minute-by-minute charging. Thus, an hour in the cabin costs 40 somoni, and a minute costs about 66 dirams. It’s necessary to make the system automatically turn on per-minute charging when opening an order in the booths, put it on pause when printing the bill and show the charging amount in the bill. Mobile Waiter is used in one of the restaurants, and a regular POS-terminal — in the second one.

On the receipt editing form of the object, insert the script in the event:

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;  Instead of the bill selector, create your own variant and assign it a custom operation with the following script:   

procedure ProcessOperation1001625(Parameter: integer);

begin

RK7.PostOperation(rkoCloseTariff, 0);

end;

A script to change the weight of a dish with modifiers

When adding modifiers with the codes specified in the script, their weight specified in the extended property will be removed from the dish served by weight:

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)); // + if the modifier has a negative weight, and - if the modifier has a positive weight.

RK7.PerformOperation(rkoEditPortionWeight, 0);

TNumEditor(ed).Text := '';

end;

end; 

end; 

end;

A promotion script: order 2 dishes — get the cheapest 3d one for free

Respectively, two cheapest dishes are for free if 6 dishes are ordered.

On the check editing form of the CheckView object, insert the script in the OnAfterCheckViewEdit event:

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

begin

AddEveryOtherDiscount(11{DiscCode}); // 11 opened fixed amount discount on a dish

end;

Before the abovementioned script, add the following one:


Corrected version:


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;

A script to automatically add a bonus dish if a specified dish is ordered

The script adds a bonus dish when adding a promotional dish from a specified category.

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'); // code of category of promotional dish, for which bonus dish is added; bonus dish code
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)); // code of category of promotional dish, for which bonus dish is added; 

DishCode := StrToInt(copy(DishesCode.Strings[z],p+1,length(DishesCode.Strings[z])-p)); // bonus dish code

//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(); // focus is broken if you uncomment

end;

A script to add a bonus dish for each 4th unique dish from the category !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Есть блюда категории «шот». Нужно при заказе четырёх одинаковых блюд из этой категории добавлять в заказ на выбор блюдо из категории «пицца». Пицца должна добавиться с нулевой ценой, либо со 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;

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

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;

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

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

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

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;

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

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

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


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

Существует акционное блюдо с нулевой ценой. Клиент хочет, чтобы это блюдо автоматически добавлялось в заказ, если сумма заказа достигла 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;

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

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

При сумме заказа от 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;

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

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;

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

Бонусы действуют до 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;

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

В скриптах задать соответствующие значения для 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;

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

Системы доставки нет. Вся доставка просто бьется на стол 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;

Для объект 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;

Скрипт на перенос блюда со 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;

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

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;

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

Необходимо, чтобы при пробитии комбо-блюд, относящихся к классификации «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;

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

Message_Addon_49

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;

Для того ,чтобы в ресторане начали показывать сообщение, нужно указать «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;

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

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

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

на

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

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

Необходимо при продаже кофе вместе с любым блюдом из классификации (не категории) «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;