Отключение Fake сессий при приходе платежа
Материал из BiTel WiKi
Для версии 5.1 сброс Reject-To-Accept сессий при приходе платежа в договор либо понижении лимита в случае если баланс превышает лимит.
import bitel.billing.server.dialup.bean.busevent.*; import bitel.billing.server.admin.eventbus.*; import bitel.billing.server.contract.bean.*; import ru.bitel.bgbilling.server.util.*; import java.math.*; import java.util.*; import java.sql.*; import ru.bitel.common.*; int MID = 8; public void onEvent( event, setup, con, conSlave ) { Payment payment = event.getPayment(); int contractId = payment.getContractID(); java.util.Date date = event.getGenerateTime().getTime(); BigDecimal summa = payment.getSumma(); BalanceUtils bu = new BalanceUtils( con ); BigDecimal balance = bu.getBalance( date, contractId ); if( balance.compareTo( BigDecimal.ZERO ) > 0 /*&& summa.compareTo( balance ) > 0*/ ) { int count = 0; String tableName = ServerUtils.getModuleMonthTableName( "log_session", date, MID ); if( ServerUtils.tableExists( con, tableName ) ) { String loginTable = "user_login_" + MID; String aliasTable = "user_alias_" + MID; Set nameSet = new HashSet(); //т.к. у фиктивной сессии нет привязки к коду логина - поиск по логину либо алиасу String query = "SELECT login.login, alias.login_alias FROM " + loginTable + " AS login " + "LEFT JOIN " + aliasTable +" AS alias ON login.id=alias.login_id WHERE login.cid=?"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt( 1, contractId ); ResultSet rs = ps.executeQuery(); while( rs.next() ) { nameSet.add( rs.getString( 1 ) ); nameSet.add( rs.getString( 2 ) ); }; ps.close(); if( nameSet.size() > 0 ) { String logins = "'" + Utils.toString( nameSet, "','" ) + "'"; logins = logins.substring( 0, logins.length() - 2 ); print( "Logins: " + logins ); query = "SELECT session.id FROM " + tableName + " AS session " + "WHERE session.status=0 AND fake=1 AND session.login_name IN (" + logins + ")"; PreparedStatement ps = con.prepareStatement( query ); ResultSet rs = ps.executeQuery(); while( rs.next() ) { int recordId = rs.getInt( 1 ); count++; print( "Killing " + recordId ); BillingEventBus.publish( new DialupSessionBreakEvent( MID, recordId ) ); } } } print( "Сброшено " + count + " сессий." ); } }