Мы вышли из ситуации следующим образом.
В каждом тарифе в названии была добавлена стоимость тарифа.
И нарисованы три метки (соответственно списанию абонплат и собственно требованию доп. расхода).
На событие "Запрос доп. расхода для открытия договора" повесили скрипт.
Код:
package ru.ellcom.bgbilling.scripts.tariff;
import bitel.billing.server.contract.bean.*;
import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.kernel.tariff.common.bean.TariffLabelItem;
import ru.bitel.bgbilling.kernel.tariff.common.bean.TariffPlan;
import ru.bitel.bgbilling.kernel.tariff.server.bean.TariffLabelManager;
import ru.bitel.bgbilling.kernel.tariff.server.bean.TariffPlanManager;
import ru.bitel.bgbilling.modules.npay.server.bean.event.DebetStatusManageOpenGetAdditionalCharge;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;
import java.math.BigDecimal;
import java.sql.Connection;
import java.util.Date;
import java.util.List;
import java.util.Set;
public class GetAdditionalCharge
extends EventScriptBase {
private static int LABEL_GET_ADD_CHARGE = 84;
private static int LABEL_DAY_TARIFF = 86;
private static int LABEL_MONTH_TARIFF = 85;
@Override
public void onEvent(Event event, Setup setup, ConnectionSet connectionSet)
throws Exception {
Connection con = connectionSet.getConnection();
ContractTariffManager ctm = new ContractTariffManager(con);
ContractManager cm = new ContractManager(con);
TariffPlanManager tpm = new TariffPlanManager(con);
TariffLabelManager tariffLabelManager = new TariffLabelManager(con);
BalanceUtils bu = new BalanceUtils(con);
Boolean needAddCharge = false;
DebetStatusManageOpenGetAdditionalCharge e = (DebetStatusManageOpenGetAdditionalCharge) event;
int cid = e.getContractId();
Date nowDate = new Date();
Contract contract = cm.getContractById(cid);
BigDecimal result = BigDecimal.ZERO;
BigDecimal currentBalance = bu.getBalance(nowDate, contract);
BigDecimal currentLimit = contract.getBalanceLimit();
result = currentBalance.subtract(currentLimit).negate();
BigDecimal tariffPrice = BigDecimal.ZERO;
List<ContractTariff> contractTariffs = ctm.getContractTariffList(cid, new Date());
for (ContractTariff ct : contractTariffs) {
TariffPlan tp = tpm.getTariffPlan(ct.getTariffPlanId());
List<TariffLabelItem> tariffLabelItems = tariffLabelManager.getTariffLabelItemList();
Set<Integer> tariffLabelSet = tariffLabelManager.getTariffLabelIds(tp.getId());
if (tariffLabelSet.contains(LABEL_GET_ADD_CHARGE)) {
needAddCharge = true;
for (TariffLabelItem tariffLabelItem : tariffLabelItems) {
if (tariffLabelSet.contains(tariffLabelItem.getId())) {
if (tariffLabelItem.getId() == LABEL_DAY_TARIFF) {
String tpTitle = tp.getTitle();
int indexOf = tp.getTitle().indexOf("=");
tpTitle = tpTitle.substring(indexOf);
tariffPrice = tariffPrice.add(Utils.parseBigDecimal(tpTitle.replaceAll("[^0-9]", ""), BigDecimal.ZERO));
tariffPrice = tariffPrice.multiply(new BigDecimal(30.0));
}
if (tariffLabelItem.getId() == LABEL_MONTH_TARIFF) {
String tpTitle = tp.getTitle();
int indexOf = tp.getTitle().indexOf("=");
tpTitle = tpTitle.substring(indexOf);
tariffPrice = tariffPrice.add(Utils.parseBigDecimal(tpTitle.replaceAll("[^0-9]", ""), BigDecimal.ZERO));
}
}
}
}
}
if(needAddCharge && tariffPrice.compareTo(BigDecimal.ZERO) > 0){
result = result.add(tariffPrice);
//System.err.print("RESULT! Договор " + contract.getTitle() + ". Сумма для разблокировки = " + result);
e.setMode(DebetStatusManageOpenGetAdditionalCharge.MODE_REPLACE);
e.setSumma(result);
}
}
}
Вроде работает.
P.S. Это версия с тестового сервера, но она рабочая.
На рабочем были изменены условие needAddCharge. Я от него тупо избавился.