Ситуация следующая, пытаюсь приспособить БГ под следующую схему.
Необходимо в последний день месяца заблокировать всех абонентов у кого нет средств, что бы перейти в следующий месяц.
Фишка именно в том, что обработка должна быть выполнена именно в последний день месяца а не 1 числа. Я написал небольшой скрипт, но тут момент, система мне выдает сумму которую она снимает у абонента в текущем месяце а не в следующем. А меня интересует сумма которая будет снята в следующем месяце.
Попробую детальней.
У абонента услуг подключенных на 100 руб. На счету 100 руб. 31 дек. я должен обработать увидеть что у абонента деньги есть и оставить его активным, либо если у него денег нет я его приостанавливаю. Теперь момент. Например в декабре услуг было подключено у абонента на 200 рублей. А с первого января уже на 100 рублей, например он отказался от одной из услуг. Скрипт мне все равно выдает сумму декабрьскую. Скрипт видя что услуг подключенных на 200 рублей, а на счету 100 блокирует абонента. Вопрос как получить сумму именно ту которую БГ начислит абоненту в январе.
Код:
import bitel.billing.server.util.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.tariff.TariffTreeSet;
import bitel.billing.server.tariff.TariffModuleTree;
import bitel.billing.server.tariff.TariffRequest;
public void main( setup, con, conSlave )
{
query = "select c.id from contract c join contract_module cm on c.id=cm.cid where (gr&1<<17)=0 and cid=22";
firstDayByTextMonth = new GregorianCalendar();
firstDayByTextMonth.add(Calendar.MONTH, 1);
firstDayByTextMonth.set(Calendar.DAY_OF_MONTH, 1);
print(new Date(firstDayByTextMonth.getTimeInMillis()));
prep = con.prepareStatement(query);
rs = prep.executeQuery();
sum = 0;
while (rs.next()) {
cid = rs.getInt(1);
//print("Обработка контракта c ид="+cid);
prep2 = con.prepareStatement("select sid, col from npay_service_object_1 where cid=" + cid);
rs2 = prep2.executeQuery();
while (rs2.next()) {
sid = rs2.getInt(1);
col = rs2.getInt(2);
if (col != 0) {
contract = new ContractManager(con).getContractByID(cid);
tts = new ContractManager(con).getRealtimeTariffTreeSet(cid, firstDayByTextMonth, "npay", 1, true);
for (TariffModuleTree tree : tts.getTreeList(firstDayByTextMonth)) {
req_cost = new TariffRequest();
req_cost.setRequestParam("action", "calculate");
req_cost.setRequestParam("sid", sid);
req_cost.setRequestParam("month_days", 1);
req_cost.setRequestParam("period_days", 1);
req_cost.setRequestParam("time", firstDayByTextMonth);
req_cost.setRequestParam("date", firstDayByTextMonth);
tree.processRequest(req_cost);
cost = (Double) req_cost.getResponseParam("cost");
cost_type = req_cost.getResponseParam("cost_type");
req_calc_mode = new TariffRequest();
req_calc_mode.setRequestParam("action", "reset");
req_calc_mode.setRequestParam("sid", sid);
req_calc_mode.setRequestParam("time", firstDayByTextMonth);
req_calc_mode.setRequestParam("date", firstDayByTextMonth);
tree.processRequest(req_calc_mode);
calc_mode = (String) req_calc_mode.getResponseParam("calc_mode");
calc_type = req_calc_mode.getResponseParam("calc_type");
if (cost == null || calc_mode == null) {
error("Параметры абонплаты не найдены");
}
//print(cost);print(calc_mode);print(calc_type);print(cost_type);
sum = sum + cost * col;
}
}
}
print(cid+" - " +sum);
}
}