Доброго времени суток.
После обновления сервера с 4.6 на 5.1 перестал работать скрипт "Управление статусом договора по состоянию баланса"
Сам код:
Код:
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.task.bean.RunTaskData;
import bitel.billing.server.task.bean.RunTaskDataManager;
import java.util.*;
import bitel.billing.common.KernelConst;
import ru.bitel.bgbilling.server.util.ModuleSetup;
import bitel.billing.server.contract.bean.ContractStatusManager;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.npay.bean.ServiceObjectManager;
import bitel.billing.server.npay.bean.ServiceObject;
// Если это таймер на начало месяца, в п.1, иначе выход
// соответственно не забываем добавить параметр запуска в задачу "flag=1"
// (вместо 1 подставляем любое число, но оно же должно быть в следующем условии =)
if (event.getFlag() != 6 ) {
return;
}
// номер модуля NPAY
NPAY_MID = 5;
DateNow = new GregorianCalendar();
cid = event.getContractID();
cstm = 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.roll(Calendar.MONTH, -2);
print( df );
print( dt );
print( db );
// определяем текущий статус договора
StatusContractList = cstm.getStatusList(cid, event.getGenerateTime());
if (StatusContractList.size() == 0)
return;
StatusContract = StatusContractList.get(0);
print("StatusContract.getStatus():"+StatusContract.getStatus() );
contract = new ContractManager(con).getContractByID(cid);
contract_groups = contract.getGroups();
print ("rpynna:"+contract_groups);
print (1L);
// выбираем только нужную группу договоров (нам нужна только 1 группа)
if ((contract_groups & (1L<<1)) > 0) {
internet = 1;
} else {
internet = 0;
}
print (internet);
if( StatusContract.getStatus() == 0 && internet == 1)
{
// 1. определить нужно ли приостанавливать договор (если есть абонплата и баланс меньше лимита)
// 1.1 определить баланс и лимит: если баланс > лимита - выход, если меньше, то см. п.1.2
ctm = new ContractTariffManager( con );
csm = new ContractServiceManager( con );
cu = new ContractUtils( con );
cm = new ContractManager( con );
cn = cm.getContractByID( cid );
tts = cm.getRealtimeTariffTreeSet( cid, df, "npay", NPAY_MID, true );
msu = new ModuleAndServiceUtils( con );
bu = new BalanceUtils( con );
tpm = new TariffPlanManager(con);
// получаем текущий баланс (с учетом данного платежа)
balance = bu.getBalance(event.getGenerateTime(), cid);
limit = cn.getLimit();
fbm = cn.getFakeBalanceMode();
bm = cn.getBalanceMode();
print ( "balance = "+balance );
print ( "limit = "+limit );
print ( "fbm = "+fbm+"; bm = "+bm );
// 1.2 получить наработку для всех услуг типа "Абонплата" и если она больше 0, то в п.2 иначе выход
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", 1 );
// всего дней до конца месяца
req.setRequestParam( "period_days", 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);
if ( totalCost <= 0 || balance-totalCost >= limit) {
print ( "Все ОК!" );
return;
}
// 2. Приостановить договор. установить статус "Приостановлен"
//newdate = DateNow;
//newdate.set (2011,1,4);
ContractStatus status = new ContractStatus();
status.setContractId( cid );
status.setDate1( DateNow);
status.setDate2( null );
status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED);
status.setComment( "Недостаточно средств" );
cstm.changeStatus( status,0 );
//Закрываем шлюз
modset = new ModuleSetup(con, 3);
(new IPNContractStatusManager(con, 3, modset)).changeStatus(cid, 2, 0, true);
StatusContract = cstm.getStatus(cid, df);
// print("cm.getStatus("+df+"):"+StatusContract.getStatus() );
}
Логи:
ERROR [Thread-9] script - Eval error: Sourced file: Function [id:2; title:Блокировка статуса] : Error in method invocation: Method getStatusList( int, java.util.GregorianCalendar ) not found in class'bitel.billing.server.contract.bean.ContractStatusManager' : at Line: 55 : in file: Function [id:2; title:Блокировка статуса] : cstm .getStatusList ( cid , event .getGenerateTime ( ) )
Код:
// определяем текущий статус договора
StatusContractList = cstm.getStatusList(cid, event.getGenerateTime());
if (StatusContractList.size() == 0)
return;
StatusContract = StatusContractList.get(0);
print("StatusContract.getStatus():"+StatusContract.getStatus() );
contract = new ContractManager(con).getContractByID(cid);
contract_groups = contract.getGroups();
print ("rpynna:"+contract_groups);
print (1L);
Сам проблему решить не смог, надеюсь на вашу помощь.