Определение размера абонентской платы
Материал из BiTel WiKi
(Различия между версиями)
Admin (Обсуждение | вклад) |
Admin (Обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | Для версий 5.0, 5.1. Определение суммы конкретной абонплаты до конца месяца при условии если договор всё время будет активным. | ||
+ | Вообще метод подходит для получения стоимости произвольных абонплат. | ||
+ | |||
+ | Фрагмент из скрипта [[Открытие_абонплаты_по_первой_установке_соединения]]. | ||
+ | |||
+ | <source lang="java"> | ||
+ | import ru.bitel.common.*; | ||
+ | import bitel.billing.server.task.bean.*; | ||
+ | import java.sql.*; | ||
+ | import java.math.*; | ||
+ | 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.*; | ||
+ | import bitel.billing.server.tariff.*; | ||
+ | import bitel.billing.server.tariff.TariffTreeSet.TariffSetEntry; | ||
+ | import ru.bitel.bgbilling.modules.npay.server.*; | ||
+ | |||
+ | int NPAY_MID = 1; | ||
+ | int SERVICE = 1; | ||
+ | |||
+ | int GROUP_ID = 18; | ||
+ | |||
+ | ............ | ||
+ | ServiceObject serviceObject = new ServiceObject(); | ||
+ | serviceObject.setContractId( contractId ); | ||
+ | serviceObject.setServiceId( SERVICE ); | ||
+ | serviceObject.setDate1( curdate ); | ||
+ | |||
+ | List serviceObjectList = new ArrayList(); | ||
+ | serviceObjectList.add( serviceObject ); | ||
+ | |||
+ | packet.setCode( RadiusPacket.ACCESS_REJECT ); | ||
+ | |||
+ | Calculator calculator = new Calculator(); | ||
+ | calculator.setExecutingTime( now ); | ||
+ | calculator.setPreCalc(); | ||
+ | calculator.setServiceObjectList( serviceObjectList ); | ||
+ | calculator.initTask( setup, 0, "mid=" + NPAY_MID ); | ||
+ | calculator.setCids( String.valueOf( contractId ) ); | ||
+ | calculator.startTask(); | ||
+ | |||
+ | Map planAccountMap = calculator.getCostCache().getContractAccounts(); | ||
+ | BigDecimal planAccount = Utils.maskNull( (BigDecimal)planAccountMap.get( contractId ) ); | ||
+ | |||
+ | ............ | ||
+ | </source> | ||
+ | |||
+ | |||
Для версии 5.0, 5.1. Предтарификация с определением стоимости абонплат за будущий месяц. | Для версии 5.0, 5.1. Предтарификация с определением стоимости абонплат за будущий месяц. | ||
Версия 10:55, 29 июля 2010
Для версий 5.0, 5.1. Определение суммы конкретной абонплаты до конца месяца при условии если договор всё время будет активным. Вообще метод подходит для получения стоимости произвольных абонплат.
Фрагмент из скрипта Открытие_абонплаты_по_первой_установке_соединения.
import ru.bitel.common.*; import bitel.billing.server.task.bean.*; import java.sql.*; import java.math.*; 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.*; import bitel.billing.server.tariff.*; import bitel.billing.server.tariff.TariffTreeSet.TariffSetEntry; import ru.bitel.bgbilling.modules.npay.server.*; int NPAY_MID = 1; int SERVICE = 1; int GROUP_ID = 18; ............ ServiceObject serviceObject = new ServiceObject(); serviceObject.setContractId( contractId ); serviceObject.setServiceId( SERVICE ); serviceObject.setDate1( curdate ); List serviceObjectList = new ArrayList(); serviceObjectList.add( serviceObject ); packet.setCode( RadiusPacket.ACCESS_REJECT ); Calculator calculator = new Calculator(); calculator.setExecutingTime( now ); calculator.setPreCalc(); calculator.setServiceObjectList( serviceObjectList ); calculator.initTask( setup, 0, "mid=" + NPAY_MID ); calculator.setCids( String.valueOf( contractId ) ); calculator.startTask(); Map planAccountMap = calculator.getCostCache().getContractAccounts(); BigDecimal planAccount = Utils.maskNull( (BigDecimal)planAccountMap.get( contractId ) ); ............
Для версии 5.0, 5.1. Предтарификация с определением стоимости абонплат за будущий месяц.
import java.math.*; import bitel.billing.server.npay.Calculator; import bitel.billing.common.TimeUtils; public void main(setup, con, conSlave) { Calendar dt = new GregorianCalendar(); dt.set(Calendar.DAY_OF_MONTH ,31); Calculator calculator = new Calculator(); print(TimeUtils.convertCalendarToDateString(dt)); calculator.setExecutingTime(dt); calculator.setPreCalc(); calculator.initTask(setup, 0, "mid=16"); calculator.setCids("12345"); calculator.startTask(); if (!calculator.isCalcErrors()) { BigDecimal planAccount = BigDecimal.ZERO; Map planAccountMap = calculator.getCostCache().getContractAccounts(); for (Integer contractId : ru.bitel.common.Utils.stringToIntegerList("12345")) { if(planAccountMap.get(contractId)!=null){ planAccount = planAccount.add((BigDecimal)planAccountMap.get(contractId)); } } print(planAccount); } }
http://forum.bgbilling.ru/viewtopic.php?f=16&t=4076
Фрагмент скрипта, для определения размера абонентской платы по определенной услуге.
API тарифов значительно поменялось для Npay в версии 5.0
рабочий вариант
import java.sql.Connection; import java.util.Calendar; import java.util.Collections; import java.util.GregorianCalendar; import bitel.billing.common.TimeUtils; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTree; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffTreeBuilder; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffTreeSet; import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffContext; import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffRequest; import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffRequest.NPayServiceCost; import ru.bitel.bgbilling.server.util.Setup; // код договора cid = 455; // на какой момент смотреть тариф time = new GregorianCalendar(); // код услуги sid = 79; // код экземпляра модуля mid = 66; Calendar startMonth = TimeUtils.getStartMonth( time ); Calendar endMonth = TimeUtils.getEndMonth( time ); int daysInMonth = startMonth.getActualMaximum( Calendar.DAY_OF_MONTH ); NPayTariffContext ctx = new NPayTariffContext( Setup.getSetup().getModuleSetup( mid ), con, mid, startMonth, endMonth, String.valueOf( cid ), null ); TariffTreeSet result = TariffTreeBuilder.getInstance().getRealtimeTariffTreeSet( con, cid, startMonth, "npay", mid, 0, 0 ); for( TariffModuleTree tariffPeriod : result.getTreeList( time ) ) { NPayTariffRequest req = new NPayTariffRequest( mid, cid, sid ); req.setInfoEnable( true ); req.setConnection( con ); req.setAccountingMonthDays( daysInMonth ); // эта дата нужна, если режимы тарификации помещены в период req.setTime( startMonth ); req.setServiceCost( sid, Collections.singletonList( new NPayServiceCost( sid, startMonth, endMonth, startMonth, endMonth, 1 ) ) ); tariffPeriod.execute( req, ctx ); if( req.isAccepted() ) { for( NPayServiceCost cost : req.getServiceCost().get( sid ) ) { if( cost.cost != null ) { print( cost ); break; } } } }
Для версии 4.6. Работает при простых абонплатах.
import java.sql.*; import java.util.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.tariff.*; import bitel.billing.server.util.*; // код договора cid = 455; // на какой момент смотреть тариф time = new GregorianCalendar(); // код услуги sid = 79; // код экземпляра модуля mid = 66; tts = new ContractManager( con ).getRealtimeTariffTreeSet( cid, time, "npay", mid, true ); // перебор тарифов в порядке позиций сначала персональных, потом глобальных for( TariffModuleTree tree : tts.getTreeList( time ) ) { req = new TariffRequest(); req.setRequestParam( "action", "calculate" ); req.setRequestParam( "sid", sid ); // считаем как будто абонплата подключена весь месяц req.setRequestParam( "month_days", 1 ); req.setRequestParam( "period_days", 1 ); tree.processRequest( req ); cost = (Float)req.getResponseParam( "cost" ); if( req.wasAccepted() && cost != null ) { print( cost ); break; } }