Начисление абонплат по схеме 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 ); } }