Цитата:
Т.е если он перейдет с ТП1 на ТП2 он ежемесячно будет доплачивать 500руб, а при переходе с ТП1 на ТП3 1000руб. С ТП2 он может переходить только на ТП3.
Он в любом случае будет оплачивать эту разницу. Она же списывается как абонплата.
На вики есть пример
http://wiki.bgbilling.ru/index.php/Смена_тарифного_плана_по_заданию_пользователя
У меня работает вот так вот, но в течении недели - двух буду переделывать, т.к. поменял логику.
Да и топорно у меня и было сработано на скорую руку
Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.common.TimeUtils.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.util.*;
import java.util.*;
import java.math.*;
cid = event.getContractId();
cm = new ContractManager( con );
contract = cm.getContractById( cid );
fromDate = event.getFromDate();
event.setProcessed( true );
ctm = new ContractTariffManager( con );
cgm = new ContractTariffGroupManager ( con );
chm = new ChargeManager( con );
csm = new ContractServiceManager( con );
bu = new BalanceUtils( con );
endDate = new GregorianCalendar();
int[] tparray = { 0 };
int[][] tpmatrix = { { 0, 0 }, };
if ( cgm.isExistsContractTariffGroup(cid, 6) == true)
{
tparray = new int[]{ 54, 58, 5, 101, 191, 192, 193, 59, 103, 6, 194, 104, 2, 60, 105, 195, 106, 61, 13, 196, 63, 127, 22, 197, 149, 198, 129 };
tpmatrix = new int[][]{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},};
}
else if ( cgm.isExistsContractTariffGroup(cid, 8) == true)
{
tparray = new int[]{ 76, 77, 130, 131, 79, 132, 133, 78, 134, 80, 135, 81, 136, 137 };
tpmatrix = new int[][] { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},};
}
else if ( cgm.isExistsContractTariffGroup(cid, 9) == true)
{
tparray = new int[]{ 76, 77, 139, 142, 79, 144, 145, 78, 138, 80, 140, 81, 141, 143 };
tpmatrix = new int[][]{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},};
}
else if ( cgm.isExistsContractTariffGroup(cid, 10) == true)
{
tparray = new int[]{ 76, 77, 139, 142, 79, 144, 145, 78, 138, 80, 140, 81, 141, 143 };
tpmatrix = new int[][]{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},};
}
else if ( cgm.isExistsContractTariffGroup(cid, 11) == true)
{
tparray = new int[]{ 76, 58, 77, 191, 103, 108, 131, 194, 104, 237, 132, 110, 105, 195, 106, 134, 239, 196, 241, 243, 197 };
tpmatrix = new int[][]{ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},};
}
// текущий тарифный план
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!" );
print ("Тарифная группа = " + tarifgrp);
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;
}
//Подготавливаем дату
fromDate = event.getFromDate();
Calendar fromDateCal = new GregorianCalendar();
fromDateCal.setTime(fromDate);
int monthBegin = fromDateCal.get(GregorianCalendar.DATE);
// если переход на более дешевый тариф. проверяем дату
print("tpmatrix[" + tpIndex + "][" + ntpIndex + "]= " + tpmatrix[tpIndex][ntpIndex]);
if(contract.getFc() == 0)
{
if( tpmatrix[tpIndex][ntpIndex] > 0 )
{
if (monthBegin != 01)
{
event.setError( "Переход на тарифный план с меньшей абонплатой возможен ТОЛЬКО с начала месяца" );
}
else if (monthBegin == 01 )
{
// закрываем старый тариф днем ранее
endDate.setTime( fromDate);
print( "endDate: " + TimeUtils.formatDate( endDate ) );
endDate.add( Calendar.DAY_OF_MONTH, -1 );
currentTariff.setDate2( endDate );
ctm.updateContractTariff( currentTariff );
// устанавливаем новый тарифный план
newPlan = new ContractTariff();
newPlan.setContractId( cid );
newPlan.setTariffPlanId( ntpid );
newPlan.setDate1( TimeUtils.convertDateToCalendar( fromDate ) );
newPlan.setComment( "Смена тарифа через личный кабинет" );
ctm.updateContractTariff( newPlan );
event.setMessage( "Тарифный план был успешно изменен");
}
}
//Если же tpmatrix возвращает 0
else if( tpmatrix[tpIndex][ntpIndex] == 0 )
{
// закрываем старый тариф днем ранее
endDate.setTime( fromDate);
print( "endDate: " + TimeUtils.formatDate( endDate ) );
endDate.add( Calendar.DAY_OF_MONTH, -1 );
currentTariff.setDate2( endDate );
ctm.updateContractTariff(currentTariff);
// устанавливаем новый тарифный план
newPlan = new ContractTariff();
newPlan.setContractId( cid );
newPlan.setTariffPlanId( ntpid );
newPlan.setDate1( TimeUtils.convertDateToCalendar( fromDate ) );
newPlan.setComment( "Смена тарифа через личный кабинет" );
ctm.updateContractTariff( newPlan );
event.setMessage( "Тарифный план был успешно изменен");
}
}
else if(contract.getFc() == 1)
{
event.setError( "Смена тарифного плана через личный кабинет доступна только для физических лиц" );
}
У меня другая логика.
Запрещено переходить с более дорогого тарифного плана на более дешевый НЕ с начала месяца.
Но можете взять за основу. И полностью запрещать переход на более дешевый тариф