вот написал тестовый скриптик
Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.ipn.bean.*;
import java.util.*;
import java.text.*;
private long gettraff(sid){
//sid=1 -входящий
//sid=2 исходящий
//получение названия нужной таблици с траффиком
evdate=event.getGenerateTime().clone();
//обсчитаваем предыдущий месяц
evdate.add(Calendar.MONTH,-1);
datefrm = new SimpleDateFormat("yyyyMM");
evyear=datefrm.format(evdate.getTime()).toString();
print("working date "+evyear);
//запрос из базы траффика
ps = con.prepareStatement("SELECT SUM(amount) FROM ipn_contract_data_3_"+evyear+" WHERE cid=? AND sid=? AND dt>'"+evyear+"01'");
ps.setInt( 1, cid);
ps.setInt( 2, sid);
rs = ps.executeQuery();
rs.first();
return rs.getLong(1)/1048576; //в мегабайтах
}
STATUS_ACTIV=0;
STATUS_STOPPED=4;
if( event.flag == 2 && event.getContractID() == 18){
//наш таймер
//этот скрип надо запускать в первый час начала месяца, до начисления абонплат
cid = event.getContractID();
input_traff=gettraff(1);
output_traff=gettraff(2);
print("traffic input "+input_traff);
print("traffic output "+output_traff);
//определяем пользовался ли пользователь инетом в этом месяце
//для этого смотрим его исходящий и входящий траффик со 2го числа до конца месяца
//исходящий должен быть 0, входящий < 1Гб
//if ( ! (input_traff > 1024 || output_traf > 0)) {
if (true){
//не было пользования услугой - ставим на этот месяц договору статус "приостановлен"
//c начала прошлого месяца до конца прошлого месяца
end_date=event.getGenerateTime().clone();
start_date=event.getGenerateTime().clone();
end_date.add( Calendar.DAY_OF_YEAR, -1 );
start_date.add(Calendar.MONTH,-1);
//проверяем текущий статус
csm=new ContractStatusManager(con);
print("status"+csm.getStatus(cid,start_date).getStatus());
if (csm.getStatus(cid,start_date).getStatus() == STATUS_ACTIV){
//если статус договора был активным
cstat = new ContractStatus();
cstat.setStatus(STATUS_STOPPED); //приостановлен
cstat.setDate1(start_date);
cstat.setDate2(end_date);
cstat.setComment("автоматическая блокировка");
cstat.setContractId(cid);
csm.updateStatus(cstat);
}
}
}
запускать его надо в 0.20 в первый день месяца до начисления абонплат.
писалось под BGBiliing 4.4
есть некоторые вопросы
1)почему csm.getStatus(cid,start_date) возвращает null если у договора ни разу не менялся статус?
2)правильно я понимаю что csm.updateStatus(cstat) заносит запись в таблицу смены статусов (с даты по дату), а setContractStatus просто глобально меняет статус договора и остался от старых версий
3) какой будет статус договора в том случае если я поставлю что он пристановлен с 1.11 до 30.11 по истечении этого срока?
4) надо ли добавлять запись "активен" после истечения срока приостановки?
5) откуда брать коды статусов договоров? (я их определил эспериментально)