Отключение 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 + " сессий." );		
	}
}
Личные инструменты