Имеем кредитный способ расчета с абонентами, отключение производится после 20 числа, если абонент покрывал долг прошлого месяца - договор не активировался т.к. ему не хватало денег для покрытия полного долга(до 20 числа текущего месяца абонент может заплатить долг за прошлый месяц и должен начать работать до следующего отключения)
Написал скрипт поведения(Функции скриптов поведения) который висит на событии приход платежа:
Код:
import java.sql.*;
import java.util.*;
import java.math.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.util.*;
import ru.bitel.bgbilling.kernel.event.*;
import bitel.billing.server.script.bean.event.*;
public void onEvent( event, setup, con, conSlave )
{
int cid = event.getContractId();
ContractStatusManager contract_status_manager = new ContractStatusManager( con );
Contract contract = new ContractManager(con).getContractById(cid);
Calendar DateNow = Calendar.getInstance();
BalanceUtils bu = new BalanceUtils( con );
//Получаю текущий день месяца
int schDate = DateNow.get(Calendar.DAY_OF_MONTH);
//Получаю первый день предыдущего месяца
month=bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.getPrevDay(bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.convertCalendarToDate(DateNow))));
//Абонент должне заплатить абонплату до 20 числа, поэтому проверяем что текущий день месяца меньше или равен 20 числу
if (schDate<21)
{
//Получаю Входящий остаток на начало прошлого месяца
contract_balance = bu.getBalanceSumma1 (month, cid);
bu.close();
// Получаю платежи с 1 числа прошлого месяца по текущее число
String sql = " SELECT sum(cp.summa) FROM contract_payment as cp left join contract on contract.id=cp.cid where cp.dt > \""+bitel.billing.common.TimeUtils.formatSQLDate(month)+"\" and cp.dt < \""+bitel.billing.common.TimeUtils.formatSQLDate(DateNow)+"\" and cp.cid="+cid;
PreparedStatement ps = con.prepareStatement( sql );
ResultSet rs = ps.executeQuery();
while(rs.next())
{
int pm = rs.getInt( 1 );
BigDecimal sum = new BigDecimal(pm.toString());
//Складываем Входящий остаток и платежи
BigDecimal balance=contract_balance.add(sum);
//Если Входящий остаток + платежи больше либо равен и договор не активен - активируем его
if (balance.compareTo( new BigDecimal("0.00") )>= 0 && contract.getStatus()!=0)
{
// активируем договор
ContractStatus status = new ContractStatus();
status.setContractId( cid );
status.setDateFrom( DateNow.getTime() );
status.setDateTo( null );
status.setStatus(0);
status.setComment( "Активировано скриптом 1-20" );
contract_status_manager.changeStatus( status, 0 );
}
}
}
}
Меня тут сильно смущает вот этот кусок.Может есть способ попроще получить первый день прошлого месяца?
Код:
month=bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.getPrevDay(bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.convertCalendarToDate(DateNow))));
Ну и может кто какую ошибку увидит....