За что именно берется абонплата - прописывается в договоре. Это может быть предоставление канала/ip адреса и т.п.
То что описывается в данной ветке возможно реализовать в биллинге через учетные периоды модуля dialup.
Организация_семейства_UNLIMIT_тарифов_на_базе_FreeBSD_MPD
Цитата:
Скрипт на событие запроса учетного периода:
Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.util.*;
import java.util.*;
import java.math.*;
VPN_MID = 3;
CHARGE_TYPE = 21;
bu = new BalanceUtils( con ) ;
cm = new ContractManager( con );
chm = new ChargeManager( con );
ctm = new ContractTariffManager( con );
event.setProcessed( true );
if( event.getRequestDate() == null ) {
error( "event.requestDate() == null" );
return;
}
cid = event.getContractID();
contract = cm.getContractByID( cid );
if( contract == null ) {
error( "Contract with ID " + cid + " was not found!" );
return;
}
date_clndr = (Calendar)event.getRequestDate();
date = date_clndr.getTime();
currentTariff = ctm.getContractTariff( cid, date_clndr );
if( currentTariff == null ) {
error( "Current tariff was not found!" );
return;
}
PAY = 0;
tpid = currentTariff.getTariffPlanID();
if( tpid == 53 ) {
PAY = 290;
}
else if ( tpid == 66 ) {
PAY = 360;
}
else if ( tpid == 67 ) {
PAY = 660;
}
else if ( tpid == 68 ) {
PAY = 960;
}
else if ( tpid == 69 ) {
PAY = 1660;
}
else {
error( "Incorrect current tariff!" );
return;
}
balance = bu.getBalance( date, cid );
if( balance.intValue() < PAY ) {
error( "Not enough money to open a period!!" );
return;
}
charge = new Charge();
charge.setContractID( cid );
charge.setDate( date_clndr );
charge.setChargeTypeID( CHARGE_TYPE );
charge.setComment( "Активация периода UNLIM" );
charge.setSumma( PAY );
chm.updateCharge( "new", charge );
// обновляем баланс
bu.updateBalance( date, cid );
date_start = new GregorianCalendar();
date_start.setTime( date );
date_end = (Calendar)date_start.clone();
date_end.add( Calendar.DAY_OF_YEAR, 30 );
event.setPeriodStart( date_start );
event.setPeriodEnd( date_end );
Принцип такой же, только в конце создавать учетный период не на 30 дней вперед, а на текущий месяц.
Код:
date_start = new GregorianCalendar();
date_start.setTime( date );
date_end = (Calendar)date_start.clone();
date_start.set( Calendar.DATE, 1 );
date_end.add( Calendar.DATE, date_end.getActualMaximum( Calendar.DATE ) );
event.setPeriodStart( date_start );
event.setPeriodEnd( date_end );
Клиент подключился в этом месяце - деньги снялись. Не подключался - ничего не снималось.
Если скрипт установил event.setProcessed( true ); но хоть одна дата учетного периода null - клиент не подключится. Если во время переобсчета обнаружилось, что учетный период закончился - пытается запросить новый через скрипт. Если event.setProcessed( true ); и хотя бы один из периодов null - клиента отключит.