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

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

(Различия между версиями)
Перейти к: навигация, поиск
(как это могло работать?)
 
Строка 40: Строка 40:
"SELECT tpid FROM contract_tariff " +
"SELECT tpid FROM contract_tariff " +
"INNER JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id AND tariff_plan.title LIKE 'И:%' " +
"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";
+
"WHERE cid=? AND (date2 IS NULL OR CURDATE()<=date2) LIMIT 1";
PreparedStatement ps = con.prepareStatement( query );
PreparedStatement ps = con.prepareStatement( query );
ps.setInt( 1, cid );
ps.setInt( 1, cid );

Текущая версия на 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;
    }
}
Личные инструменты