Нашел чуть более элегантный способ сделать процентные скидки через абонплаты.
В npay уже есть классы, получающие наработку по услугам:
http://bgbilling.ru/v5.2/doc/ch18s04s03.htmlОсталось использовать их для процентных скидок. Сейчас в зависимости от наработки по другим услугам можно задать догоняющую абонплату или условие по наработке.
Предлагаю сделать ещё один узел тарифа - процентная скидка. В узле указывается только id "наработки" из конфига. Узел возвращает цену в -1% от наработки по услугам за месяц.
Т.е. как в первом посте, только список услуг, по которым считаем скидку, выносится в конфиг:
Код:
module.account.<id>.title=<title>
module.account.<id>.mid=<mid>
module.account.<id>.class=<class_name>
#module.account.<id>.sids=<sids>
Написал код, проверил - работает:
Код:
package ru.bitel.bgbilling.modules.npay.tariff.server;
import bitel.billing.server.npay.bean.ModuleAccount;
import java.math.BigDecimal;
import ru.bitel.bgbilling.kernel.tariff.tree.server.DefaultTariffTreeNode;
import ru.bitel.common.ParameterMap;
public class MonthModeDiscountTariffTreeNode extends DefaultTariffTreeNode<NPayTariffRequest, NPayTariffContext>
{
  private final int account;
  public MonthModeDiscountTariffTreeNode(int id, ParameterMap parameterMap)
  {
    super(id, parameterMap);
    this.account = parameterMap.getInt("account", 0);
  }
  protected int executeImpl(Long treeNodeId, NPayTariffRequest req, NPayTariffContext ctx)
  {
    ModuleAccount moduleAccount = ctx.getModuleAccount(this.account);
    if (moduleAccount == null)
    {
      req.addError("Not found account " + this.account);
      return 0;
    }
    //Наработка по услугам
    BigDecimal accountValue = ctx.getModuleAccount(this.account).getPeriodAccount(req.getConnection(), 
      req.cid, ((NPayTariffRequest.NPayServiceCost)req.serviceCost).date1, ((NPayTariffRequest.NPayServiceCost)req.serviceCost).date2);
      ((NPayTariffRequest.NPayServiceCost)req.serviceCost).cost = accountValue.divide(BigDecimal.valueOf(100)).negate();
    return 1;
  }
}
Можно это реализовать в стандартном npay?
С меня - документация и примеры использования.