Это старая версия документа!
Либо начисление бонуса, либо оплата бонусами
Бывают случаи, когда программа лояльности предполагает запрет на оплату бонусами в заказе, где они начисляются. Т. е. можно либо оплатить заказ или его часть бонусами, либо начислить бонусы.
Такая задача решается с помощью кассового скрипта, размещаемого на форме «Редактирование заказа» и/или «Редактирование заказа (быстрый чек)» - в компоненте 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;