Определение размера абонентской платы

Материал из BiTel WiKi

Перейти к: навигация, поиск

Для версий 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;
    }
}
Личные инструменты