Определение размера абонентской платы
Материал из BiTel WiKi
(Различия между версиями)
Admin (Обсуждение | вклад) |
Lda (Обсуждение | вклад) (как это могло работать?) |
||
(5 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | Для версии 5.0, 5.1. Предтарификация с определением стоимости абонплат за будущий месяц. | + | Для версии 5.2. Определение суммы конкретной абонплаты в конкретном тарифе без учёта тарифных опций. |
+ | |||
+ | <source lang="java"> | ||
+ | import java.math.*; | ||
+ | import java.sql.*; | ||
+ | import java.util.*; | ||
+ | import bitel.billing.common.*; | ||
+ | import bitel.billing.server.util.*; | ||
+ | import bitel.billing.server.task.bean.*; | ||
+ | import bitel.billing.server.admin.bean.*; | ||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | import bitel.billing.server.npay.*; | ||
+ | import bitel.billing.server.npay.bean.*; | ||
+ | import bitel.billing.common.KernelConst; | ||
+ | import ru.bitel.common.*; | ||
+ | import ru.bitel.bgbilling.modules.npay.server.*; | ||
+ | |||
+ | int ABON_SID = 79; | ||
+ | |||
+ | ............ | ||
+ | |||
+ | Calendar now = new GregorianCalendar(); | ||
+ | Calendar startMonth = TimeUtils.getStartMonth( now ); | ||
+ | Calendar endMonth = TimeUtils.getEndMonth( now ); | ||
+ | |||
+ | List serviceObjectList = new ArrayList(); | ||
+ | |||
+ | ServiceObject serviceObject = new ServiceObject(); | ||
+ | serviceObject.setContractId( cid ); | ||
+ | serviceObject.setServiceId( ABON_SID ); | ||
+ | serviceObject.setDate1( TimeUtils.convertCalendarToDate( startMonth ) ); | ||
+ | |||
+ | serviceObjectList.add( serviceObject ); | ||
+ | |||
+ | BigDecimal planAccount = BigDecimal.ZERO; | ||
+ | |||
+ | List tariffList = new ArrayList(); | ||
+ | |||
+ | String query = | ||
+ | "SELECT tpid FROM contract_tariff " + | ||
+ | "INNER JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id AND tariff_plan.title LIKE 'И:%' " + | ||
+ | "WHERE cid=? AND (date2 IS NULL OR CURDATE()<=date2) LIMIT 1"; | ||
+ | PreparedStatement ps = con.prepareStatement( query ); | ||
+ | ps.setInt( 1, cid ); | ||
+ | |||
+ | ResultSet rs = ps.executeQuery(); | ||
+ | if( rs.next() ) | ||
+ | { | ||
+ | ContractTariff tariff = new ContractTariff(); | ||
+ | tariff.setTariffPlanID( rs.getInt( 1 ) ); | ||
+ | tariff.setDate1( startMonth ); | ||
+ | tariff.setDate2( endMonth ); | ||
+ | tariffList.add( tariff ); | ||
+ | |||
+ | print( "Tariff plan id: " + rs.getInt( 1 ) ); | ||
+ | } | ||
+ | ps.close(); | ||
+ | |||
+ | Calculator calculator = new Calculator(); | ||
+ | calculator.setExecutingTime( endMonth ); | ||
+ | calculator.setPreCalc(); | ||
+ | calculator.setActiveFromDate( startMonth ); | ||
+ | calculator.setServiceObjectList( serviceObjectList ); | ||
+ | calculator.setTariffList( tariffList ); | ||
+ | calculator.setTariffOptionEnable( false ); | ||
+ | calculator.initTask( setup, 0, "mid=" + NPAY_MID ); | ||
+ | calculator.setCids( String.valueOf( cid ) ); | ||
+ | calculator.startTask(); | ||
+ | |||
+ | print( "Precalc for time: " + TimeUtils.formatDate( endMonth ) ); | ||
+ | |||
+ | if( calculator.isCalcErrors() ) | ||
+ | { | ||
+ | print( "Precalc to end month errors!" ); | ||
+ | return planAccount; | ||
+ | } | ||
+ | |||
+ | Map planAccountMap = calculator.getCostCache().getContractAccounts(); | ||
+ | if( planAccountMap.get( cid ) == null ) | ||
+ | { | ||
+ | print( "Can't calculate plan account" ); | ||
+ | return planAccount; | ||
+ | } | ||
+ | |||
+ | planAccount = planAccountMap.get( cid ); | ||
+ | |||
+ | print( "planAccount=" + planAccount ); | ||
+ | |||
+ | return planAccount; | ||
+ | ............ | ||
+ | </source> | ||
+ | |||
+ | |||
+ | Для версий 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; | ||
+ | |||
+ | ............ | ||
+ | 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.1. Предтарификация с определением стоимости абонплат за будущий месяц. | ||
<source lang="java"> | <source lang="java"> | ||
Строка 15: | Строка 156: | ||
calculator.setExecutingTime(dt); | calculator.setExecutingTime(dt); | ||
calculator.setPreCalc(); | calculator.setPreCalc(); | ||
+ | // если не ставить эту опцию, то будет считать абонплаты как будто статус активен от dt начиная | ||
+ | calculator.setActiveFromDate( null ); | ||
calculator.initTask(setup, 0, "mid=16"); | calculator.initTask(setup, 0, "mid=16"); | ||
calculator.setCids("12345"); | calculator.setCids("12345"); |
Текущая версия на 17:57, 23 мая 2017
Для версии 5.2. Определение суммы конкретной абонплаты в конкретном тарифе без учёта тарифных опций.
import java.math.*; import java.sql.*; import java.util.*; import bitel.billing.common.*; import bitel.billing.server.util.*; import bitel.billing.server.task.bean.*; import bitel.billing.server.admin.bean.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.npay.*; import bitel.billing.server.npay.bean.*; import bitel.billing.common.KernelConst; import ru.bitel.common.*; import ru.bitel.bgbilling.modules.npay.server.*; int ABON_SID = 79; ............ Calendar now = new GregorianCalendar(); Calendar startMonth = TimeUtils.getStartMonth( now ); Calendar endMonth = TimeUtils.getEndMonth( now ); List serviceObjectList = new ArrayList(); ServiceObject serviceObject = new ServiceObject(); serviceObject.setContractId( cid ); serviceObject.setServiceId( ABON_SID ); serviceObject.setDate1( TimeUtils.convertCalendarToDate( startMonth ) ); serviceObjectList.add( serviceObject ); BigDecimal planAccount = BigDecimal.ZERO; List tariffList = new ArrayList(); String query = "SELECT tpid FROM contract_tariff " + "INNER JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id AND tariff_plan.title LIKE 'И:%' " + "WHERE cid=? AND (date2 IS NULL OR CURDATE()<=date2) LIMIT 1"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt( 1, cid ); ResultSet rs = ps.executeQuery(); if( rs.next() ) { ContractTariff tariff = new ContractTariff(); tariff.setTariffPlanID( rs.getInt( 1 ) ); tariff.setDate1( startMonth ); tariff.setDate2( endMonth ); tariffList.add( tariff ); print( "Tariff plan id: " + rs.getInt( 1 ) ); } ps.close(); Calculator calculator = new Calculator(); calculator.setExecutingTime( endMonth ); calculator.setPreCalc(); calculator.setActiveFromDate( startMonth ); calculator.setServiceObjectList( serviceObjectList ); calculator.setTariffList( tariffList ); calculator.setTariffOptionEnable( false ); calculator.initTask( setup, 0, "mid=" + NPAY_MID ); calculator.setCids( String.valueOf( cid ) ); calculator.startTask(); print( "Precalc for time: " + TimeUtils.formatDate( endMonth ) ); if( calculator.isCalcErrors() ) { print( "Precalc to end month errors!" ); return planAccount; } Map planAccountMap = calculator.getCostCache().getContractAccounts(); if( planAccountMap.get( cid ) == null ) { print( "Can't calculate plan account" ); return planAccount; } planAccount = planAccountMap.get( cid ); print( "planAccount=" + planAccount ); return planAccount; ............
Для версий 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; ............ 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.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(); // если не ставить эту опцию, то будет считать абонплаты как будто статус активен от dt начиная calculator.setActiveFromDate( null ); 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; } }