Код:
import bitel.billing.common.TimeUtils.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.service.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.util.*;
import bitel.billing.server.npay.*;
import bitel.billing.server.npay.bean.*;
import bitel.billing.server.task.bean.RunTaskData;
import bitel.billing.server.task.bean.RunTaskDataManager;
import java.util.*;
NPAY_MID = 2;
NO_PAYMENT_GROUP = 27;
cid = event.getContractId();
cm = new ContractStatusManager( con );
// округляем день (на 00:00:00) платежа
egt = event.getGenerateTime();
df = egt.clone();
df.clear();
df.set(egt.get(Calendar.YEAR), egt.get(Calendar.MONTH), egt.get(Calendar.DAY_OF_MONTH));
// получаем день, предыдущий платежу
dt = df.clone();
dt.roll(Calendar.DAY_OF_YEAR, -1);
// получаем дату начала месяца
db = df.clone();
db.set(Calendar.DAY_OF_MONTH, 1);
// определяем текущий статус договора
//StatusContractList = cm.getStatusList(cid, event.getGenerateTime());
StatusContractList = cm.getStatusList(cid);
if (StatusContractList.size() == 0)
return;
StatusContract = StatusContractList.get(0);
print("StatusContract.getStatus():"+StatusContract.getStatus() );
// если договор приостановлен, то определяем размер абонплаты для снятия и сравниваем с балансом после платежа
if( StatusContract.getStatus() == 4 )
{
ctm = new ContractTariffManager( con );
csm = new ContractServiceManager( con );
cu = new ContractUtils( con );
cman = new ContractManager( con );
cn = cman.getContractById( cid );
tts = cman.getRealtimeTariffTreeSet( cid, df, "npay", NPAY_MID, true );
msu = new ModuleAndServiceUtils( con );
tu = new TimeUtils();
bu = new BalanceUtils( con );
// получаем текущий баланс (с учетом данного платежа)
balance = bu.getBalance(tu.convertCalendarToDate(event.getGenerateTime()), cid);
limit = cn.getBalanceLimit();
bm = cn.getBalanceMode();
print ( "balance = "+balance );
print ( "limit = "+limit );
print ( "bm = "+bm );
totalCost = 0d;
som = new ServiceObjectManager(con,NPAY_MID);
serviceList = som.getServiceObjectList( cid, -1 , -1, -1);
for( Iterator it = serviceList.iterator(); it.hasNext(); ) {
service = (ServiceObject)it.next();
if ( TimeUtils.dateInRange( TimeUtils.convertCalendarToDate( egt ), service.getDate1(), service.getDate2() ) ) {
sid = service.getServiceId();
// считаем сумму абонплаты
for( TariffModuleTree tree : tts.getTreeList( df ) ) {
req = new TariffRequest();
req.setRequestParam( "action", "calculate" );
req.setRequestParam( "sid", sid );
req.setRequestParam( "month_days", df.getActualMaximum(Calendar.DAY_OF_MONTH) );
req.setRequestParam( "period_days", df.getActualMaximum(Calendar.DAY_OF_MONTH) - df.get(Calendar.DAY_OF_MONTH) + 1 );
tree.processRequest( req );
cost = (Double) req.getResponseParam( "cost" );
print ( "cost:" + cost );
if( req.wasAccepted() && cost != null ) {
print( cost );
totalCost += cost;
break;
}
}
}
}
print (totalCost+" : "+balance+" - "+limit);
// если денег на продление услуг хватает, то меняем статус договора и даем задание на обсчет услуг с абонплатой
if (totalCost >= 0 ) {
if (totalCost <= (balance.floatValue() - limit.floatValue()) ) {
//обновляем дату окончания предыдущего состояния
if (StatusContract.getDate1().compareTo(df) < 0) {
StatusContract.setDate2(dt);
cm.setContractStatus(StatusContract);
}
ncs = new ContractStatus();
ncs.setContractId(cid);
ncs.setDate1(df);
ncs.setStatus(0);
cm.changeStatus(ncs, 1, true);
StatusContract = cm.getStatus(cid, df);
print("cm.getStatus("+df+"):"+StatusContract.getStatus() );
// Удаляем договор из группы "Нет оплаты по подключению"
contract = new ContractManager(con).getContractByID(cid);
contract_groups = contract.getGroups();
if ((contract_groups & (1L<<NO_PAYMENT_GROUP)) > 0) {
NewContractGroups=contract_groups^(1L<<NO_PAYMENT_GROUP);
contract.setGroups(NewContractGroups);
cman.updateContract(contract);
}
// запускаем пересчет абонплат для договора cid
new RunTaskDataManager(con).addTask(new Recalculator(NPAY_MID, db, "", 0, ""+cid));
}
}
}