Разный процент оплаты для разных счетов
Бывает ситуация, когда часть счетов должна иметь ограничения на оплату бонусами, а часть - не должна.
При этом стандартная настройка подразумевает, что в r_keeper всего одна валюта для оплаты бонусами и у неё задаётся процент.
Пример - гости могут оплачивать 30% заказа бонусами, персонал - 100%.
Решение для этой ситуации:
1) Сделать две отдельные валюты и две отдельные скидки - для гостей и для персонала.
2) В админке ProBonus для групп счетов гостей и персонала в поле «Шаблон для API» указать созданные скидки. Это нужно чтобы при регистрации в телеграм-боте они сразу получали нужные привязанные скидки.
В скрипт вписать коды скидок и валют соответственно.
Скрипт на форму редактирования заказа:
В данном примере предполагается, что есть скидка «для персонала» с кодом 26 и ей соответствует валюта с кодом 101.
В данном примере предполагается, что есть скидка «для гостей» с кодом 25 и ей соответствует валюта с кодом 102.
//проверяется заказ, проверяются скидки в нём function FindBonusDiscount(DiscCode :integer) :boolean; var i :integer; it: TCheckItem; begin result := false; for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin it := RKCheck.CurrentOrder.Sessions.Lines[i]; if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then begin //Если неудаленная if (TDiscountItem(it).State <> disDeleted) then //если активна //if (TDiscountItem(it).ChargeSource = chsInterface) then //если добавлена интерфейсом (т. е. не вручную) begin dbg.dbgprint('найдена бонусная скидка ' + TDiscountItem(it).Name + ' код скидки ' + IntToStr(TDiscountItem(it).Code) + ' элемент № ' + IntToStr(TDiscountItem(it).Number)); if (TDiscountItem(it).Code = DiscCode) then result := true; end; end; end; if result then dbg.dbgprint('FindBonusDiscount true ' + IntToStr(DiscCode)); if result then dbg.dbgprint('FindBonusDiscount false ' + IntToStr(DiscCode)); end; //фильтр оплат картой/счётом ProBonus: для каждого интерфейса только последняя примененная в заказе карта и только одной валютой procedure MainSelectorOnSuitableObjectScript(Sender: TBasePanel; Obj: TObject; var Suitable: boolean); begin if GUI.CheckFormInPayMode then // если сейчас режим оплаты if Suitable then //если валюта доступна //Персонализированные уже авторизованные валюты if (SYS.ObjectInheritsFrom(Obj, 'TMcrPay') OR SYS.ObjectInheritsFrom(Obj, 'TMcrCoupon')) then begin dbg.dbgprint('TMcrPay(Obj).Code ' + IntToStr(TMcrPay(Obj).Code) + ' ' + TMcrPay(Obj).Name); if TMcrPay(Obj).Code = 101 then Suitable := FindBonusDiscount(26); //валюта с кодом 101 только если есть скидка с кодом 26 if TMcrPay(Obj).Code = 102 then Suitable := FindBonusDiscount(25); //валюта 102 только если есть скидка 25 end; //Неперсонализированные валюты if SYS.ObjectInheritsFrom(Obj, 'TCurrency') then begin dbg.dbgprint('TCurrency(Obj).Code ' + IntToStr(TCurrency(Obj).Code) + ' ' + TCurrency(Obj).Name); if TCurrency(Obj).Code = 101 then Suitable := FindBonusDiscount(26); //валюта 101 только если есть скидка 26 if TCurrency(Obj).Code = 102 then Suitable := FindBonusDiscount(25); //валюта 102 только если есть скидка 25 end; end;