Начисление абонплат по схеме 15-15

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

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

Доступно с версии 6.1.

Алгоритм распишем на примере. Режим снятия - подневной до текущего дня. Предположим тариф 660 рублей, делим на 30 дней получается 22 руб. в день, списывается ежедневно.

Когда клиент подключается, он должен положить сумму, равную месячной абонплате. Далее, он может пополнять свой баланс любой суммой - хоть 10 руб, хоть 100 руб - не важно. Главное, чтобы у него хватало денег на оплату интернета за день. Когда денег становится недостаточно, статус договора становится закрытый, и абонент должен положить на счет сумму, равную абонплате(660), либо большую. При это учитывается баланс договора(если у него на балансе есть 10 рублей, а абонплата за месяц 660, то клиенту для разблокировки надо заплатить 650).


Это реализовано скриптом на событие ""Запрос доп. расхода для открытия договора". Скрипт берет планируемую наработку ( если отрыть статус с сегодняшнего дня) planAccount, фактическую наработку ( с начала месяца) currentAccount.

Вычисляется разница planAccount - currentAccount = daySumm - это и сумма которая списывается за один день(22 рубля). Далее вы умножаете эту сумму на 30. И получаем summaForUnllock - 660. сумма для разблокировки. При этом еще отнимается баланс, если там есть 10 рублей , то нужно платить 650 рублей.

Это простой вариант решения задачи, тут не учитывается смена тарифов, статусы "приостановлен" в будущем.

Скрипт на событие "Запрос доп. расхода для открытия договора".

package ru.bitel.npay.debet.test;
 
import java.math.BigDecimal;
 
import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import ru.bitel.bgbilling.modules.npay.server.bean.event.DebetStatusManageOpenGetAdditionalCharge;
 
public class GetSummaForUnlock
	extends EventScriptBase<DebetStatusManageOpenGetAdditionalCharge>
{
	@Override
	public void onEvent( DebetStatusManageOpenGetAdditionalCharge event, Setup setup, ConnectionSet connectionSet )
		throws Exception
	{
		print ( "get additional charge" );
 
		BigDecimal planAccount = event.getPlanAccount();
        BigDecimal currentAccount = event.getCurrentAccount();
        BigDecimal balance = event.getCurrentBalance();
        BigDecimal limit  = event.getLimit();       
 
        print( "currentAccount: " + currentAccount + ";  planAccount: " + planAccount +"; currentBalance: " + balance + "; currentLimit: " + limit  );     
 
        BigDecimal result =  planAccount.subtract( currentAccount).multiply( new BigDecimal( 30 )  ).subtract( balance.subtract( limit) ) ; 
        //BigDecimal result =  planAccount.subtract( currentAccount).multiply( new BigDecimal( 29 )  );
 
        print( "result =  " + result  );        
 
        event.setMode( DebetStatusManageOpenGetAdditionalCharge.MODE_REPLACE);
        //event.setMode( DebetStatusManageOpenGetAdditionalCharge.MODE_ADD);
        event.setSumma( result );
	}
 
}
Личные инструменты