Открытие абонплаты по первой установке соединения
Материал из BiTel WiKi
Версия от 10:14, 13 июля 2010; Admin (Обсуждение | вклад)
Версия биллинга - 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(); } } }