Дебетовые абонплаты. Снятие штрафа за разблокировку.
Материал из BiTel WiKi
Версия от 11:29, 20 апреля 2010; Admin (Обсуждение | вклад)
Разработано для версии 5.0.
Ставятся задачи:
- Списание доп. расхода (штрафа) при автоматической разблокировке статуса дебетового договора по достаточному платежу. Стоимость штрафа запрашивается как стоимость RSCM услуги.
- Запрещение разблокировки в случае, если после разблокировки превышение остатка над лимитом составит менее определённой суммы, привязанной к конкретному тарифу (минимальный остаток).
При разблокировке снимается штраф, начисляется абонплата.
1. Создайте библиотеку скриптов с именем npay_debet и кодом, приведённым ниже. Скорректируйте константы с кодом экземпляра модуля RSCM и услугой, определяющей стоимость разблокировки.
import java.util.*; import java.math.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.tariff.*; // код экземпляра модуля RSCM RSCM_MID = 60; // код услуги модуля RSCM стоимость которой в тарифном плане задаёт штраф за разблокировку UNLOCK_RSCM_SERVICE = 118; class UnlockInfo { BigDecimal summa; int treeId; } public UnlockInfo getUnlockInfo( cid, conSlave ) { UnlockInfo result = null; contractManager = new ContractManager( conSlave ); contract = contractManager.getContractByID( cid ); if( contract == null ) { error( "Contract not found " + cid ); return result; } if( !contract.isIndepend() ) { error( "Supported only independ contracts" ); return result; } now = new GregorianCalendar(); tts = contractManager.getRealtimeTariffTreeSet( cid, now, "rscm", RSCM_MID, true ); tree = tts.getTree( now ); if( tree == null ) { error( "Not found RSCM tariff" ); return result; } req = new TariffRequest(); req.setRequestParam( "sid", UNLOCK_RSCM_SERVICE ); req.setRequestParam( "time", now ); tree.processRequest( req ); cost = req.getResponseParam( "cost" ); divisor = req.getResponseParam( "divisor" ); if( !req.wasAccepted() || cost == null || divisor == null || divisor <= 0 ) { error( "Incorrect result tariff RSCM request. cost: " + cost + "; devisor: " + devisor ); return result; } result = new UnlockInfo(); result.summa = new BigDecimal( cost / divisor ); result.treeId = tree.getTreeId(); return result; }
2. В скрипте поведения создайте функцию, обрабатывающую событие Запрос доп. расхода для открытия договора. Определите сумму минимальной предоплаты для каждого из тарифов.
import java.math.*; includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/npay_debet" ); public void onEvent( event, setup, con, conSlave ) { unlockInfo = getUnlockInfo( event.getContractID(), conSlave ); if( unlockInfo == null ) { error( "Error take unlock info" ); return; } summa = unlockInfo.summa; print( "Cost for unlock: " + summa ); // здесь можно определить "довесок" в зависимости от кода тарифного дерева // код дерева можно получить выбором любого узла тарифного дерева и нажатием Ctrl+i, tree => <код дерева> if( unlockInfo.treeId == 226 ) { summa = summa.add( new BigDecimal( "11.20" ) ); print( "Add summa to " + summa + " by tariffTreeId" ); } else if ( unlockInfo.treeId == 15 ) { // } else if ( unlockInfo.treeId == 16 ) { // } event.setSumma( summa ); }
3. В скрипте поведения создайте функцию, обрабатывающую событие После открытия договора по платежу. Скорректируйте константу с типами расхода.
import java.util.*; import java.math.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.tariff.*; // тип расхода, которым заносится списание-штраф за разблокировку UNLOCK_CHARGE_TYPE_ID = 38; includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/npay_debet" ); public void onEvent( event, setup, con, conSlave ) { cid = event.getContractID(); unlockInfo = getUnlockInfo( cid, conSlave ); if( unlockInfo == null ) { error( "Error take unlock info" ); return; } summa = unlockInfo.summa; print( "Cost for unlock: " + summa ); bu = new BalanceUtils( con ); chm = new ChargeManager( con ); curdate = new Date(); // внесение расхода за разблокировку, полученного из RSCM тарифа charge = new Charge(); charge.setContractID( cid ); charge.setChargeTypeID( UNLOCK_CHARGE_TYPE_ID ); charge.setComment( "За разблокировку" ); charge.setChargeDate( curdate ); charge.setSumma( summa ); chm.updateCharge( charge ); bu.updateBalance( curdate, cid ); }
Ссылки: