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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Версия биллинга - 5.1. Скрипт открывает абонентскую плату на договоре по первой авторизаци…»)
Строка 44: Строка 44:
new ServiceObjectManager( con, NPAY_MID ).updateServiceObject( serviceObject );
new ServiceObjectManager( con, NPAY_MID ).updateServiceObject( serviceObject );
new RunTaskDataManager( con ).addTask( new Recalculator( NPAY_MID, new GregorianCalendar(), null, 0, String.valueOf( contractId ), "Автоматическое открытие абонплаты" ) );
new RunTaskDataManager( con ).addTask( new Recalculator( NPAY_MID, new GregorianCalendar(), null, 0, String.valueOf( contractId ), "Автоматическое открытие абонплаты" ) );
 +
}
 +
}
 +
}
 +
</source>
 +
 +
Усложнённая версия скрипта. В дополнение снимает группу и устанавливает начало тарифного плана на дату первого входа. Это может быть необходимо при использовании в тарифах узла '''Диапазон наработки''' в режиме пропорциональном тарифу.
 +
<source lang="java">
 +
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();
}
}
}
}
}
}
</source>
</source>

Версия 10:14, 13 июля 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();
		}
	}
}
Личные инструменты