external:pro_bonus:98_dop:21_raznie_proxenti_oplat

Разный процент оплаты для разных счетов

Бывает ситуация, когда часть счетов должна иметь ограничения на оплату бонусами, а часть - не должна.
При этом стандартная настройка подразумевает, что в 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;
  • external/pro_bonus/98_dop/21_raznie_proxenti_oplat.txt
  • Последнее изменение: 2025/03/20 11:48
  • Алексей Коробов