вот написал тестовый скриптик
Код:
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) откуда брать коды статусов договоров? (я их определил эспериментально)