Открытие абонплаты по первой установке соединения

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
Строка 50: Строка 50:
Усложнённая версия скрипта. В дополнение снимает группу и устанавливает начало тарифного плана на дату первого входа. Это может быть необходимо при использовании в тарифах узла '''Диапазон наработки''' в режиме пропорциональном тарифу.
Усложнённая версия скрипта. В дополнение снимает группу и устанавливает начало тарифного плана на дату первого входа. Это может быть необходимо при использовании в тарифах узла '''Диапазон наработки''' в режиме пропорциональном тарифу.
 +
Обратите внимание, что изменяется период также и закэшированного в памяти тарифа, который будет использоваться при тарификации первой сессии.
 +
<source lang="java">
<source lang="java">
import bitel.billing.server.util.*;
import bitel.billing.server.util.*;
Строка 109: Строка 111:
ps.setInt( 2, contractId );
ps.setInt( 2, contractId );
ps.executeUpdate();
ps.executeUpdate();
 +
 +
                        java.util.Date now = new java.util.Date();
 +
 +
// изменение в кэше
 +
TariffTreeSet tts = event.getContract().getTts();
 +
for( TariffSetEntry tse : tts.getEntries() )
 +
{
 +
tse.setDateFrom( now );
 +
}
}
}
}
}
}
}
</source>
</source>

Версия 07:18, 14 июля 2010

Версия биллинга - 5.1.

Скрипт открывает абонентскую плату на договоре по первой авторизации, если её не было и передаёт задание планировщику произвести начисление абонплат. Есть небольшой "костыль" - необходимо в BGRadiusDialup/lib либо скопировать либо сделать символическую ссылку на библиотеку BGBillingServer/lib/npay.jar. Т.к. скрипту нужны классы этой библиотеки.

Скрипт - обрабатывает событие RADIUS-аунтификация модуля DialUp.

import bitel.billing.server.util.*;
import bitel.billing.server.task.bean.*;
import java.sql.*;
import ru.bitel.bgbilling.kernel.network.radius.*;
import bitel.billing.server.npay.bean.*;
import bitel.billing.server.npay.*;
import java.util.*;
 
int NPAY_MID = 1;
int SERVICE = 1;
 
public void onEvent( event, setup, con, conSlave )
{
	int contractId = event.getContractId();
	RadiusPacket packet = event.getResponse();
 
	if( packet.getCode() == RadiusPacket.ACCESS_ACCEPT )
	{
		print( "It's accept packet" );
 
		String tableName = "npay_service_object_" + NPAY_MID;
		String query = "SELECT COUNT(*) FROM " + tableName + " WHERE cid=? AND sid=?";
 
		PreparedStatement ps = con.prepareStatement( query );		
		ps.setInt( 1, contractId );
		ps.setInt( 2, SERVICE );
 
		ResultSet rs = ps.executeQuery();
		if( !rs.next() || rs.getInt( 1 ) == 0 )
		{
			print( "Adding service" );
 
			ServiceObject serviceObject = new ServiceObject();
			serviceObject.setContractId( contractId );
			serviceObject.setServiceId( SERVICE );
			serviceObject.setDate1( new java.util.Date() );
 
			new ServiceObjectManager( con, NPAY_MID ).updateServiceObject( serviceObject );
			new RunTaskDataManager( con ).addTask( new Recalculator( NPAY_MID, new GregorianCalendar(), null, 0, String.valueOf( contractId ), "Автоматическое открытие абонплаты" ) );
		}
	}
}

Усложнённая версия скрипта. В дополнение снимает группу и устанавливает начало тарифного плана на дату первого входа. Это может быть необходимо при использовании в тарифах узла Диапазон наработки в режиме пропорциональном тарифу. Обратите внимание, что изменяется период также и закэшированного в памяти тарифа, который будет использоваться при тарификации первой сессии.

import bitel.billing.server.util.*;
import bitel.billing.server.task.bean.*;
import java.sql.*;
import ru.bitel.bgbilling.kernel.network.radius.*;
import bitel.billing.server.npay.bean.*;
import bitel.billing.server.npay.*;
import java.util.*;
import bitel.billing.server.contract.bean.*;
 
int NPAY_MID = 1;
int SERVICE = 1;
int GROUP_ID = 18;
 
public void onEvent( event, setup, con, conSlave )
{
	int contractId = event.getContractId();
	RadiusPacket packet = event.getResponse();
 
	if( packet.getCode() == RadiusPacket.ACCESS_ACCEPT )
	{
		print( "It's accept packet" );
 
		String tableName = "npay_service_object_" + NPAY_MID;
		String query = "SELECT COUNT(*) FROM " + tableName + " WHERE cid=? AND sid=?";
 
		PreparedStatement ps = con.prepareStatement( query );		
		ps.setInt( 1, contractId );
		ps.setInt( 2, SERVICE );
 
		ResultSet rs = ps.executeQuery();
		if( !rs.next() || rs.getInt( 1 ) == 0 )
		{
			print( "Adding service" );
 
			ServiceObject serviceObject = new ServiceObject();
			serviceObject.setContractId( contractId );
			serviceObject.setServiceId( SERVICE );
			serviceObject.setDate1( new java.util.Date() );
 
			new ServiceObjectManager( con, NPAY_MID ).updateServiceObject( serviceObject );
			new RunTaskDataManager( con ).addTask( new Recalculator( NPAY_MID, new GregorianCalendar(), null, 0, String.valueOf( contractId ), "Автоматическое открытие абонплаты" ) );
 
			ContractTariffManager ctm = new ContractTariffManager( con );
 
			// изменение периода тарифного плана
			List tariffList = ctm.getContractTariffList( contractId, (java.util.Date)null );
			for( ContractTariff tariff : tariffList )
			{
				tariff.setDate1( new GregorianCalendar() );
				ctm.updateContractTariff( tariff );
			}
 
			// удаление группы
			query = "UPDATE contract SET gr = gr&(~(1<<?)) WHERE id=?";
			ps = con.prepareStatement( query );
			ps.setInt( 1, GROUP_ID );
			ps.setInt( 2, contractId );
			ps.executeUpdate();
 
                        java.util.Date now = new java.util.Date();
 
			// изменение в кэше
			TariffTreeSet tts = event.getContract().getTts();
			for( TariffSetEntry tse : tts.getEntries() )
			{
				tse.setDateFrom( now );
			}
		}
	}
}
Личные инструменты