Снижение лимита при внесении расхода
Материал из BiTel WiKi
Версия от 08:12, 15 апреля 2010; Cromeshnic (Обсуждение | вклад)
Работает в 4.6, 5.0
При внесении некоторых типов расходов снижаем лимит на 30 дней.
1. В библиотеке скриптов "limit_manage":
public void my_setLimitPeriod(Contract c, int uid, BigDecimal limit, int period){ int cid = c.getID(); LimitManager limitManager = new LimitManager(con); BigDecimal current_limit = c.getBalanceLimit(); BigDecimal new_limit = current_limit.add(limit); //меняем лимит: limitManager.updateContractLimit(0, new_limit, cid, "внесен расход "+t+" "+ p.getComment(), String.valueOf(period)); //добавляем задание на возвращение лимита: Calendar dt = new GregorianCalendar(); dt.add(6, period); task = new LimitChangeTask(); task.setContractId(cid); task.setDate(dt); task.setUserId(uid); task.setSubSumm(limit); limitManager.addMoveTask(task); //гененрируем событие изменения лимита: Payment fakePayment = new Payment(); fakePayment.setContractID(cid); fakePayment.setPaymentTypeID(-1); fakePayment.setDate(new Date()); fakePayment.setUserID(-1); EventProcessor.getProcessor().addEvent(new PaymentEvent(fakePayment)); return; }
2. Событие "Занесение расхода"
import bitel.billing.server.contract.bean.*; import java.util.*; import bitel.billing.server.util.*; import bitel.billing.common.TimeUtils; import bitel.billing.server.script.bean.event.EventProcessor; import bitel.billing.server.script.bean.event.PaymentEvent; import java.math.BigDecimal; int cid = event.getContractID(); cm = new ContractManager( con ); c = cm.getContractByID( cid ); if( c == null ) { error( "Contract with ID:" + cid + " not found!" ); return; } p = event.getCharge(); //Берём название типа платежа: t=""; ps = con.prepareStatement("select title from contract_charge_types where id=?"); ps.setInt(1, p.getChargeTypeID()); rs = ps.executeQuery(); if(rs.next()) { t=rs.getString(1); } ps.close(); m = c.getTitle() + " " + c.getComment() + "\n"; m = m + "Занесен расход "+p.getSumma()+ "руб от "+TimeUtils.format(p.getChargeDate(),"dd.MM.yyyy")+"\n"; m = m + t + " " + p.getComment() + "\n"; //уменьшаем лимит для некоторых типов расходов: if(p.getChargeTypeID() == 3) { BigDecimal limit=p.getSumma().negate(); period=30; ccid=cid; cc=c; //подключаем библиотеку: includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/limit_manage"); if(c.isDependSub()){ ccid=c.getSuperId(); cc=cm.getContractByID(ccid); } my_setLimitPeriod(cc, 0, limit, period); //перебираем все зависимые субдоговора ps = con.prepareStatement("select id from contract where scid=? and sub_mode=0"); ps.setInt(1, ccid); rs = ps.executeQuery(); while(rs.next()){ subcid=rs.getInt(1); scc=cm.getContractByID(subcid); my_setLimitPeriod(scc, 0, limit, period); } ps.close(); m = m + "лимит снижен на "+ period + " дней"; } print( "расход "+c.getTitle() + " " + p.getSumma()+ "р " + t+" "+ c.getComment() + "\n" + m);