Нашел чуть более элегантный способ сделать процентные скидки через абонплаты.
В 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?
С меня - документация и примеры использования.