Бывают случаи, когда программа лояльности предполагает запрет на оплату бонусами в заказе, где они начисляются. Т. е. можно либо оплатить заказ или его часть бонусами (при этом на сумму оплаченную Рублями бонус не начисляется), либо начислить бонусы (на всю сумму заказа, без возможности потраты бонусов).
Такая задача решается с помощью кассового скрипта, размещаемого на форме «Редактирование заказа» и/или «Редактирование заказа (быстрый чек)» - в компоненте CheckView .
Скрипт работает как для расчёта по местам, так и для обычного случая.
При нажатии на кнопку «оплата» - задаёт вопрос.

В зависимости от ответа либо блокируется для оплаты валюта «Оплата бонусами», либо удаляется из заказа скидка-бонус (и тогда бонусы не начисляются).
Скрипт вставляем в верхнюю часть обработчика (важна последовательность).
Внутри скрипта нужно поменять код валюты оплаты бонусами и код скидки-бонуса.
function DiscPres(DiscCode: integer; seatN:string):string;
var
j,i: integer;
it: tCheckitem;
aga:string;
begin
aga:='';
for j := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[j];
if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountitem') then
if (TDiscountitem(it).state=disdeleted) and (TDiscountitem(it).code=discCode) and(TDiscountItem(it).SeatName=seatN) then aga:=TDiscountItem(it).CardCode;
end;
result:=aga;
end;
procedure DesignFormOnOperation(Sender: TBasePanel; Operation, Param: integer; var res: integer);
var
k,i,diskcode:integer;
CheckView: TCheckView;
it,CurItem: TCheckItem;
d:TDiscountitem;
isDisk:boolean;
sl: TStringList;
begin
diskcode:=35; // код скидки-бонуса
dbg.dbgprint(inttostr(operation));
SL:= TStringList.Create;
if (((operation = rkoCalcOrder) or (operation = rkoBalanceReceipt)or (operation = rkoCalcBySeats)) and(RKCheck.CurrentOrder.BillExists=false)) or (operation = rkoPrintBill) or (operation = rkoPrintSeatBills) then
begin
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(it, 'TDiscountItem') then
if (TDiscountItem(it).code= diskcode) and (TDiscountItem(it).state<>disdeleted) then
begin
isDisk:=true;
SL.AddObject(FormatFloat('00000000.00', TDiscountitem(it).code) + IntToStr(TDiscountitem(it).UNI), TObject(it));
end;
end;
if isdisk then
begin
for i:= 0 to SL.Count - 1 do
begin
d:= TDiscountitem(SL.Objects[i]);
k:=GUI.MessageDlgEx('Списываем бонусы или начисляем бонусы? для места № '+inttostr(Tdiscountitem(d).seat)+'?',mtInformation, mbYes+mbNo, 'Оплачиваем бонусами;Начисляем бонусы');
if k= id_YES then
begin
CheckView.GotoItem(TObject(d));
RKCheck.DeleteCheckItem(d);
RKCheck.CurrentOrder.Recalc();
end;
end;
end;
SL.Free();
end;
end;
procedure MainSelectorAfterConnectObjectScript(Obj: TObject; Button: TGCustomButton);
var
CurrCode, diskcode:integer;
CheckView: TCheckView;
CurItem: TCheckItem;
c: TVisualComponent;
begin
CurrCode:=10; //код валюты "оплата бонусами"
diskcode:=35; // код скидки-бонуса
CheckView:=TCheckView(GUI.FindComponentByName('CheckView'));
c := GUI.FindComponentByName('MainSelector');
if CheckView = Nil then Exit;
if SYS.ObjectInheritsFrom(obj, 'TMcrPay') then
begin
CurItem := RKCheck.CurrentCheckItem;
if SYS.ObjectInheritsFrom(TObject(curitem), 'TPrintCheckitem') then
begin
if DiscPres(diskcode, TPrintCheckitem(curitem).SeatName )=TMcrPay(obj).CardNum then
button.enabled :=true
else button.enabled :=false;
end;
end;
end;