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

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

(Различия между версиями)
Перейти к: навигация, поиск
Строка 47: Строка 47:
event.setMessage( "За смену тарифного плана с вас было удержано " + changeCost.toPlainString() + " руб." );
event.setMessage( "За смену тарифного плана с вас было удержано " + changeCost.toPlainString() + " руб." );
 +
</source>
 +
 +
Еще один пример. Имеется линейка тарифов с увеличивающейся абонплатой и снижающейся стоимостью мегабайта. Расход заносится только при переходе на тариф с меньшей абонплатой.
 +
В начале скрипта - выборка из таблицы tariff_plan с кодами тарифов. Также необходимо указывать свой код типа расхода.
 +
 +
<source lang="java">
 +
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 );
</source>
</source>

Версия 17:49, 4 октября 2008

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