Открытие абонплаты по первой установке соединения
Материал из BiTel WiKi
Admin (Обсуждение | вклад) |
Admin (Обсуждение | вклад) |
||
Строка 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 ); } } } }