Смена тарифного плана по заданию пользователя

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

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

Для версии 5.1

Скрипт списывает расход по смене тарифного плана пользователем. Сумма расхода получается как стоимость услуги в RSCM модуле.

import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.*;
import ru.bitel.common.*;
import java.util.*;
import java.math.*;
 
int RSCM_MID = 2;
int RSCM_SID = 30;
 
public void onEvent( event, setup, con, conSlave ) 
{
	int cid = event.getContractId();
 
	BalanceUtils bu = new BalanceUtils( con );
	ChargeManager chm = new ChargeManager( con );
	ContractManager contractManager = new ContractManager( conSlave );
 
	Date dt = new Date();
	Calendar date = TimeUtils.convertDateToCalendar( dt );
 
	// цена смены
	BigDecimal changeCost = new BigDecimal( 100 );
 
	TariffTreeSet tts = contractManager.getRealtimeTariffTreeSet( cid, date, "rscm", RSCM_MID, true );
	TariffModuleTree tree = tts.getTree( date );
 
	if( tree != null )
	{
		TariffRequest req = new TariffRequest();
		req.setRequestParam( "sid", RSCM_SID );
		req.setRequestParam( "time", date );
 
		tree.processRequest( req );
 
		Float cost = req.getResponseParam( "cost" );
		Long divisor = req.getResponseParam( "divisor" );
 
		if( !req.wasAccepted() || cost == null || divisor == null  || divisor <= 0 )
		{
			error( "Incorrect result tariff RSCM request. cost: " + cost + "; devisor: " + devisor );
		}
		else
		{
			changeCost = Utils.roundBigDecimalSumm( new BigDecimal( cost / divisor ) );
 
			print( "Change cost: " + changeCost );
		}
	}
 
	// текущий баланс
	BigDecimal balance = bu.getBalance( dt, cid );
	if( balance.compareTo( changeCost ) < 0 )
	{
		// установка флага обработанности скриптом прервет стандартную смне тарифа
		event.setProcessed( true );
		event.setError( "Недостаточно средств для смены тарифа" ); 
		return;
	}
 
	// заносим расход
	Charge charge = new Charge();
	charge.setContractID( cid );
	charge.setDate( dt );
	charge.setChargeTypeID( 4 );
	charge.setComment( "Смена тарифа через Web" );
	charge.setSumma( changeCost );
 
	chm.updateCharge( charge );
 
	// обновляем баланс 
	bu.updateBalance( dt, cid );
 
	event.setMessage( "За смену тарифного плана с вас было удержано " + changeCost.toPlainString() + " руб." );
}

Для версий от 4.5

Начиная с 4.5 версии для простой организации смены тарифа не обязательно писать скрипты. Однако, использование обработки событий позволяет выполнять некоторые нештатные функциии.

Например, снятие расхода за смену тарифного плана. При этом, тариф не меняется, если средств недостаточно. Если средств достаточно - заносится расход (скорректируйте код типа расхода с 40 на нужный вам!) и клиенту на странице статистики выводится уведомление о произведенном списании.

import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.*;
import java.util.*;
import java.math.*;
 
cid = event.getContractID();
bu = new BalanceUtils( con );
chm = new ChargeManager( con );
 
// цена смены
changeCost = new BigDecimal( 10 );
 
// текущий баланс
balance = bu.getBalance( new Date(), cid );
if( balance.compareTo( changeCost ) < 0 )
{
  // установка флага обработанности скриптом прервет стандартную смне тарифа
  event.setProcessed( true );
  event.setError( "Недостаточно средств для смены тарифа" ); 
  return;
}
 
now = new GregorianCalendar();
 
// заносим расход
charge = new Charge();
charge.setContractID( cid );
charge.setDate( now );
charge.setChargeTypeID( 40 );
charge.setComment( "Смена тарифа через Web" );
charge.setSumma( changeCost );
 
chm.updateCharge( "new", charge );
 
// обновляем баланс 
bu.updateBalance( now, cid );
 
event.setMessage( "За смену тарифного плана с вас было удержано " + changeCost.toPlainString() + " руб." );

Еще один пример. Имеется линейка тарифов с увеличивающейся абонплатой и снижающейся стоимостью мегабайта. Расход заносится только при переходе на тариф с меньшей абонплатой. В начале скрипта - выборка из таблицы tariff_plan с кодами тарифов. Также необходимо указывать свой код типа расхода.

import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.util.*;
import java.util.*;
import java.math.*;
 
/*
+----+-------------------------------------------+---------------------+
| id | title                                     | lm                  |
+----+-------------------------------------------+---------------------+
|  1 | Инт - скупой рыцарь (2.00)                | 0000-00-00 00:00:00 |
|  3 | Инт - стандартный (1.50)                  | 0000-00-00 00:00:00 |
|  4 | Инт - самурай (1.25)                      | 0000-00-00 00:00:00 |
|  5 | Инт - основной (1.80)                     | 0000-00-00 00:00:00 |
| 16 | Инт - VIP                                 | 0000-00-00 00:00:00 |
+----+-------------------------------------------+---------------------+
*/
 
// Тип расхода "Смена тарифа через Web"
CHANGE_TARIFF_CHARGE_TYPE = 15;
 
// Массив используемых тарифных планов
int[] tparray = { 1, 3, 4, 5, 16 };
// Матрица смены тарифных планов
// Новый тариф           1    3    4    5   16
int[][] tpmatrix = { {   0,   0,   0,   0,   0 },    // 1
                     { 50,   0,   0,  50,   0 },    // 3
                     { 50,  50,   0,  50,   0 },    // 4     Старый тариф
                     { 50,   0,   0,   0,   0 },    // 5
                     { 50, 50,  50,  50,   0 } };  // 16
 
cid = event.getContractID();
fromDate = event.getFromDate();
event.setProcessed( true );
 
ctm =  new ContractTariffManager(  con );
chm = new ChargeManager( con );
csm = new ContractServiceManager( con );
bu = new BalanceUtils( con );
 
// текущий тарифный план
currentTariff = event.getFromTariff();
if( currentTariff == null )
{
 error( "Current tariff not found" );
 return;
}
 
tpid = currentTariff.getTariffPlanID();
print( "Current tariff: " + tpid );
tpIndex = -1;
 
for ( i = 0; i < tparray.length; i++ ) {
    if ( tpid == tparray[i] ) {
        tpIndex = i;
        print( "index: " + tpIndex );
        break;
    }
}
if( tpIndex == -1 ) {
    error("Wrong current tariff!" );
    return;
}
 
ntpid = event.getToTariff().getID();
print( "New tariff: " + ntpid );
ntpIndex = -1;
 
for ( i = 0; i < tparray.length; i++ ) {
    if ( ntpid == tparray[i] ) {
        ntpIndex = i;
        print( "index: " + ntpIndex );
        break;
    }
}
if( ntpIndex == -1 ) {
    error("Wrong new tariff!" );
    return;
}
 
// закрываем старый тариф днем ранее
endDate = new GregorianCalendar();
endDate.setTime( fromDate);
 
print( "endDate: " + TimeUtils.formatDate( endDate ) );
 
endDate.add( Calendar.DAY_OF_MONTH, -1 );
 
currentTariff.setDate2( endDate );
ctm.updateContractTariff( String.valueOf( currentTariff.getID() ), currentTariff  );
 
// если переход на более дешевый тариф - заносим в расход 50 руб
print("tpmatrix[" + tpIndex + "][" + ntpIndex + "]= " + tpmatrix[tpIndex][ntpIndex]);
 
if( tpmatrix[tpIndex][ntpIndex] > 0 )
{
 now = new GregorianCalendar();
 
 charge = new Charge();
 charge.setContractID( cid );
 charge.setDate( now );
 charge.setChargeTypeID( CHANGE_TARIFF_CHARGE_TYPE );
 charge.setComment( "Смена тарифа через WEB" );
 charge.setSumma( new BigDecimal( tpmatrix[tpIndex][ntpIndex] ) );
 
 chm.updateCharge( "new", charge );
 
 // обновляем баланс 
 bu.updateBalance( now, cid );
}
 
// устанавливаем новый тарифный план
newPlan = new  ContractTariff();
newPlan.setContractID( cid );
newPlan.setTariffPlanID( ntpid );
newPlan.setDate1( TimeUtils.convertDateToCalendar( fromDate ) );
newPlan.setComment( "Смена тарифа через WEB" );
 
ctm.updateContractTariff( "new", newPlan );

Для версий до 4.4 включительно

Для смены тарифного плана по заданию пользователя можно использовать следующий скрипт. Он заносит расход 50 рублей на баланс пользователя и сменяет тарифный план. Тип расхода необходимо подставить свой, в данном случае он равен 40. Скрипт подходит для односервисных договоров, в которых возможна смена тарифа только по одной услуге. В один момент времени на договоре может быть только один тариф, при наличии тарифов на доп. услуги или другием модули следует модифицировать скрипт.

import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import java.util.*;
 
cid = event.getContractID();
 
task = event.getTask();
 
ctm =  new ContractTariffManager(  con );
chm = new ChargeManager( con );
 
// текущий тарифный план
currentTariff = ctm.getContractTariff( cid, task.getFromDate() );
if( currentTariff == null )
{
 error( "Current tariff not found" );
 return;
}
 
// закрываем старый тариф днем ранее
endDate = (Calendar)task.getFromDate().clone();
endDate.add( Calendar.DAY_OF_YEAR, -1 );
 
currentTariff.setDate2( endDate );
ctm.updateContractTariff( String.valueOf( currentTariff.getID() ), currentTariff  );
 
// заносим расход  50 руб
charge = new Charge();
charge.setContractID( cid );
charge.setDate( task.getFromDate() );
charge.setChargeTypeID( 40 );
charge.setComment( "Смена тарифа через Web" );
charge.setSumma( 50f );
 
chm.updateCharge( "new", charge );
 
// обновляем баланс 
new BalanceUtils( con ).updateBalance( task.getFromDate(), cid );
 
// вносим новый тариф
newPlan = new  ContractTariff();
newPlan.setContractID( cid );
newPlan.setTariffPlanID( task.getTariffPlanID() );
newPlan.setDate1( task.getFromDate() );
newPlan.setComment( "Смена тарифа через Web" );
 
ctm.updateContractTariff( "new", newPlan );
 
// передача информации о смене тарифа, для возможности разрыва соединения RADIUS сервером
new ContractManager( con ).updateLastTariffChange( cid );
Личные инструменты