ММ, вроде на месте.
Код:
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.common.*;
import bitel.billing.common.KernelConst;
import java.util.*;
import java.mysql.*;
import bitel.billing.server.npay.Calculator;
NPAY_MID = 2;
limit = 0d;
print ("Payment added");
cid = event.getContractID();
// округляем день (на 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);
ps = con.prepareStatement( "SELECT gr FROM contract WHERE id=?" );
ps.setInt ( 1, cid);
rs = ps.executeQuery();
gr = 0;
if (rs.first())
{
gr = rs.getInt( 1 );
}
// если договор принадлежит к группе "Приостановлен по балансу", или "С пониженным лимитом" то определяем размер абонплаты для снятия и сравниваем с балансом после платежа
if( gr == 2 || gr == 8)
{
DateNow = new GregorianCalendar();
ContractStatusManager statusManager = new ContractStatusManager(con);
status = statusManager.getStatus(cid, DateNow);
contract_status = KernelConst.CONTRACT_STATUS_ACTIVE;
if (status != null)
{
contract_status = status.getStatus ();
}
if (contract_status == null)
{
contract_status = KernelConst.CONTRACT_STATUS_ACTIVE;
};
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 );
bu = new BalanceUtils( con );
// получаем текущий баланс (с учетом данного платежа)
balance = bu.getBalance(new Date(), cid );
limit = cn.getBalanceLimit();
//limit = Double.parseDouble(limit);
fbm = cn.getFakeBalanceMode();
bm = cn.getBalanceMode();
//print ( "balance = "+balance );
//print ( "limit = "+limit );
//print ( "fbm = "+fbm+"; bm = "+bm );
totalCost = 0d;
// получаем список услуг
serviceList = csm.getContractServiceList( cid, df );
for( Iterator it = serviceList.iterator(); it.hasNext(); )
{
service = (ContractService)it.next();
sid = service.getServiceID();
mid = msu.getService(sid).getModuleId();
//print ( "Service.title "+msu.getService(sid).getTitle() );
//print ( "Module.title "+msu.getModule(mid).getTitle() );
// Если услуга относится к модулю "NPay"
if( mid == NPAY_MID )
{
print ("sid" + sid );
// считаем сумму абонплаты
// перебор тарифов в порядке позиций сначала персональных, потом глобальных
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 = " + totalCost);
print ("Balance = "+ balance);
// если денег на продление услуг хватает, то меняем группу договора, запускаем перерасчет абонплаты
if ( balance > (totalCost * 7))
{
ContractStatus status = new ContractStatus();
status.setContractId(cid);
status.setDate1(DateNow);
status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
status.setComment("Активирован по поступлению платежа");
statusManager.changeStatus(status, 0);
psup = con.prepareStatement( "UPDATE contract SET gr=1 WHERE id=?" );
psup.setInt ( 1, cid);
psup.executeUpdate();
/* Calendar cal = Calendar.getInstance();
calculator.setCid( cid );
calculator.setExecutingTime( cal );
calculator.initTask( bgSetup, 0, "mid=" + NPAY_MID );
calculator.startTask();*/
}
}
Скопипастил все, как есть, кусок перенаслений закоменчен до разбора. setCids пробовал менять на setCid, т.к. описалово класса не нашел в API и тыкался вслепую. Спасибо за отклик.