Открытие абонплаты по первой установке соединения
Материал из BiTel WiKi
(Различия между версиями)
Admin (Обсуждение | вклад) (Новая страница: «Версия биллинга - 5.1. Скрипт открывает абонентскую плату на договоре по первой авторизаци…») |
Admin (Обсуждение | вклад) |
||
Строка 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(); } } }