OnOperation
Скрипт, создающий наценку на заказ со скидкой
Необходимо настроить наценку за обслуживание, которая будет применяться на сумму заказа со скидкой.
На форме редактирования чека у формы в событии OnOperation указать скрипт:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
а над ним разместить скрипт
procedure AddEveryOtherDiscount(DiscCode: integer);
var i, j: integer;
it, CurItem: TCheckItem;
a, PriceSum, DiscountSum, DiscPerc: double;
CheckView: TCheckView;
begin
DiscPerc := 10; // 10%
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
CurItem := RKCheck.CurrentCheckItem;
try
PriceSum := 0;
DiscountSum := 0;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if TDiscountItem(it).code <> DiscCode then
DiscountSum := DiscountSum + TDiscountItem(it).CalcAmount;
end;
PriceSum := RKCheck.CurrentOrder.PriceListSum;
a:= (PriceSum + DiscountSum)*DiscPerc/100; // "+" потому что сумма скидки со знаком "-"
// Delete discount, if a sum changed
for j := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then
if TDiscountItem(it).code = DiscCode then
begin
if abs(TDiscountItem(it).SrcAmount) = a then a := 0
else
begin
RKCheck.DeleteCheckItem(it);
end
break;
end;
end;
// Create discount to a dish
if a > 0 then
begin
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));
end;
finally
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
RKCheck.CurrentOrder.Recalc();
end;
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
if (operation = 420) // 420 - Расcчитать чек
or(operation = 455) // 455 - Оплатить чек
then
begin
AddEveryOtherDiscount(14); // код наценки
end;Скрипт, разделяющий чек по валютам в зависимости от классификации блюд
Скрипт разместить на форме редактирования заказа в событии OnOperation у объекта DesignForm
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var i, CurrencyCodeForChange,CurrencyCode1,CurrencyCode2, CategCode1,CategCode2: integer;
CurrencyCodeForChangeSum,CurrencyCode1Sum,CurrencyCode2Sum, Categ1Sum,Categ2Sum: double;
it: TCheckItem;
Categ1, Categ2: TClassificatorGroup;
begin
//********** Set parameters ***********//
CurrencyCodeForChange := 1; // код подменяемой валюты
CurrencyCode1 := 18; // код валюты(категория 1)
CurrencyCode2 := 17; // код валюты(категория 2)
CategCode1 := 1; // код категории 1
CategCode2 := 8; // код категории 2
//********** Set parameters ***********//
CurrencyCodeForChangeSum := 0;
CurrencyCode1Sum := 0;
CurrencyCode2Sum := 0;
Categ1Sum := 0;
Categ2Sum := 0;
Categ1 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode1));
Categ2 := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));
if operation = 459 then
begin
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCodeForChange) then
CurrencyCodeForChangeSum := CurrencyCodeForChangeSum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode1) then
CurrencyCode1Sum := CurrencyCode1Sum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCode2) then
CurrencyCode2Sum := CurrencyCode2Sum + TPayLine(it).NationalSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ1.IsChild(it.RefItem) then
if (TDish(it).Quantity > 0) then
Categ1Sum := Categ1Sum + TDish(it).PRListSum;
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ2.IsChild(it.RefItem) then
if (TDish(it).Quantity > 0) then
Categ2Sum := Categ2Sum + TDish(it).PRListSum;
end;
end;
if (CurrencyCode1Sum=0.0) and (CurrencyCode2Sum=0.0) then
if (CurrencyCodeForChangeSum>0) and (CurrencyCodeForChangeSum=(Categ1Sum+Categ2Sum)) then
begin
for i := RKCheck.CurrentOrder.Sessions.LinesCount - 1 downto 0 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = CurrencyCodeForChange) then
RKCheck.DeleteCheckItem(it);
end;
if Categ1Sum>0 then
RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode1), floattoStr(Categ1Sum));
if Categ2Sum>0 then
RKCheck.CreateCheckItem(rkrefCurrencies, inttostr(CurrencyCode2), floattoStr(Categ2Sum));
end;
end;Скрипт, делающий кнопку «предоплата» временно неактивной
У формы в свойстве OnOperation указать скрипт:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var ed: TObject;
begin
if (Operation=rkoPrepaySelector) then
begin
ed := TObject(gui.FindComponentByName('Editor'));
if SYS.ObjectInheritsFrom(TObject(ed), 'TNumEditor') then
if 0.0 >= StrToFloat(TNumEditor(ed).Text) then
gui.showmessage('Не указана сумма!!!');
end;
end;Будет выводиться предупреждение при нажатии кнопки «Предоплата»
Скрипт, измененяющий логику пожертвований
Необходимо добавить следующий функционал для принятия пожертвований:
1. При нажатии кнопки «Оплата» появляется поп-ап с вопросом, не хочет ли гость пожертвовать денег. Варианты ответа - да/нет
2. При нажатии «да» происходит переход в каталог меню с пожертвованием.
3. При нажатии «нет» происходит переход в режим оплаты
Скрипт для события OnOperation основной экранной формы:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
if Operation = 455 then // проверка кода операции - оплата {455 420}
if RKCheck.CurrentOrder.UserTag1 <> 1 then // проверка показывался ли этот диалог ранее
begin
if GUI.RKMessageDlg('Желает ли гость пожертвовать денег?', 0, 3, 100000) = 6 then
begin
RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, 22)); // {Menu group code}
res := 1;
end;
RKCheck.CurrentOrder.UserTag1 := 1; // метка, чтобы повторно не открывать диалог
end;
end;Скрипт, создающий скидку на каждое первое блюдо в чеке в определенный период времени
В форме редактирования чека у основной формы в событии OnOperation указать скрипт:
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
begin
dbg.dbgprint('Operation '+IntToStr(Operation));
if Operation = 459 then // код операции оплаты
AddEveryOtherDiscount(11); // вызов процедуры расчёта скидки с указанием кода открытой суммовой скидки на блюдо
end;Но перед этим скриптом разместить процедуру:
procedure AddEveryOtherDiscount(DiscCode: integer);
var
i, j, k, PresentCnt: integer;
it, CurItem: TCheckItem;
SL: TStringList;
a, CalcDiscount, q, Price, DiscPrc: double;
d: TDish;
CheckView: TCheckView;
CurrTime, Time1, Time2: TDateTime;
begin
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
//********** Set parameters ***********//
DiscPrc := 0.5; // процент скидки в долях
Time1 := EncodeTime(10,00,00,00); // начало периода акции
Time2 := EncodeTime(18,00,00,00); // конец периода акции
//********** Set parameters ***********//
CurrTime := Time;
//1 = воскресенье
//2 = понедельник
//3 = вторник
//4 = среда
//5 = четверг
//6 = пятница
//7 = суббота
CurItem := RKCheck.CurrentCheckItem;
if (DayOfWeek(Now)>=2)and(DayOfWeek(Now)<=6) then // проверка дня недели
if (Time1<=CurrTime) and(CurrTime<=Time2) then // проверка времени
begin
SL := TStringList.Create;
try
// Create list of the dishes, as is
SL.Sorted := True;
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
PresentCnt := 0;
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only
if ((it.State = disOpened) or (it.State = disPrinted)) then
begin
for j:= 0 to SL.Count - 1 do // cheking present dish in list
begin
d:= TDish(SL.Objects[j]);
if (TDish(it).Code = TDish(d).Code) then
PresentCnt := PresentCnt + 1;
end;
if PresentCnt = 0 then // adding dish to list`
begin
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;
end;
//Magic
k:= -1;
q:=0;
for i:= 0 to SL.Count - 1 do
begin
d:= TDish(SL.Objects[i]);
CalcDiscount:= 0;
q:=q+ d.Quantity;
if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price
else Price := d.PRListSum/d.Quantity;
if k = -1 then
begin
CalcDiscount:= CalcDiscount + Price*DiscPrc; // DiscPrc % discount
end;
// Delete discount, if CalcDiscount 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) = CalcDiscount then CalcDiscount := 0
else RKCheck.DeleteCheckItem(it);
break;
end;
end;
// Create discount to CalcDiscount dish
if CalcDiscount > 0 then
begin
CheckView.GotoItem(TObject(d));
RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(CalcDiscount));
end;
end;
finally
SL.Free();
if CurItem <> Nil then CheckView.GotoItem(CurItem);
end;
end;
RKCheck.CurrentOrder.Recalc();
end;