Включение должников по приходу платежа
Материал из BiTel WiKi
Версия от 08:10, 15 апреля 2010; Cromeshnic (Обсуждение | вклад)
Работает в 4.6, 5.0
Усовершенствованная логика включения клиентов по приходу платежа:
- Проверяется сальдо в зависимости от числа месяца : до дедлайна закрываем глаза на неоплату предыдущего месяца
- Статус "приостановлен", установленный на будущий период, не перетирается.
import bitel.billing.server.contract.bean.*; import java.util.*; import bitel.billing.server.util.*; import java.math.BigDecimal; import bitel.billing.common.KernelConst; alarm_email = ""; int cid = event.getContractID(); Calendar now = Calendar.getInstance(); p = event.getPayment(); cm = new ContractManager( con ); cstm = new ContractStatusManager( con ); bu = new BalanceUtils( con ); c = cm.getContractByID( event.getContractID() ); print("Сумма платежа" + p.getSumma()+"\n"); print("Текущий статус: " + c.getStatus()+"\n"); // Если мы - субдоговор с зависимым балансом - ничего не делаем. // note: При приходе платежа на субдоговор не генерируется евент прихода платежа для основного, поэтому основной не откроется, хотя должен. Но мы не будем обрабатывать подобные ситуации, т.к. платеж на субдоговор - это ненормальная ситуация для нашей бизнес-логики. if (c.getSuperId()>0 && c.getSubMode()==0){ print("Договор является субдоговором с зависимым балансом => ничего не делаем"); //можно выслать email: //m = c.getTitle() + " " + c.getComment() + "\n"; //m = m+ "Поступил платеж на зависимый субдоговор: "+p.getSumma()+ " руб от "+TimeUtils.format(p.getPaymentDate(),"dd.MM.yyyy")+"\n"; //m = m+ p.getComment()+ "\n"; //subj = "Платеж на зависимый субдоговор "+c.getTitle()+" "+p.getSumma()+"р "+ c.getComment(); //MailMsg msg = new MailMsg(setup); //msg.sendMessage(alarm_email, subj, m); //print("Письмо отправлено"); return; } //Если баланс больше или равен лимиту, то выполняем далее, иначе - ничего не делаем balance_limit = c.getBalanceLimit().floatValue(); current_balance = bu.getBalance(new Date(), c).floatValue(); print("Баланс: "+current_balance); if(current_balance < balance_limit){ print("Баланс меньше лимита. Пропускаем договор\n"); return; }else{ print("Баланс ОК\n"); } //Проверка сальдо для кредитных договоров: //Если в текущем месяце при разблокировании смотреть на : //1. Лимит - остаток должен быть больше лимита //2. до 26 проверять чтобы оплата была >= 95%*остаток на 1-е число предыдущего месяца, после 26 числа оплата должна быть >= 95%*остаток на 1-е число текущего месяца if(c.getBalanceMode()==Contract.CREDIT_BALANCE_MODE){ float saldo = 0; float debt = 0; if((new GregorianCalendar()).get(Calendar.DAY_OF_MONTH)<26){ Calendar last_month = now.clone(); last_month.add(Calendar.MONTH,-1); saldo = bu.getSaldo(last_month.getTime(), c.getID()).floatValue()+ bu.getSaldo(now.getTime(), c.getID()).floatValue() - bu.getBalanceSumma1(now.getTime(), c.getID()).floatValue(); debt = bu.getBalanceSumma1(last_month.getTime(), c.getID()).floatValue(); print("Сальдо за предыдущий месяц + приход в текущем: " + saldo+"\n"); print("Входящий остаток в предыдущем месяце: " + debt+"\n"); }else{ saldo = bu.getSaldo(now.getTime(), c.getID()).floatValue(); debt = bu.getBalanceSumma1(now.getTime(), c.getID()).floatValue(); print("Сальдо за текущий месяц: " + saldo+"\n"); print("Входящий остаток в текущем месяце: " + debt+"\n"); } // if(saldo<0.05*debt){ print("Сальдо < 0.05*(вх. остаток), долг не погашен - не открываем: \n"); print(saldo + " < " + "0.05*"+debt + "\n"); return; } } //Все тесты прошли - можно открывать клиента: //----------------------------------------------------------------------// //Если текущий статус Активен и далее нет никаких статусов в будущем пропускаем скрипт print("Можно открывать!\n"); List statusList = cstm.getStatusList(cid, now); if(statusList.size() == 0){ print("Список изменений статусов пуст, ничего не делаем - видимо договор и так активен\n"); return; } lastStatus = ((ContractStatus)statusList.get(0)).getStatus(); if(statusList.size() == 1 && lastStatus == 0){ print("Договор и так активен\n"); return; } // Если последний и единственный на текущее время статус договора - "приостановить". // пропускаем выполнение. if(statusList.size() == 1 && lastStatus == 4){ print("Договору не нужен статус = АКТИВЕН. Последний статус договора = Приостановить.\n"); return; } //----------------------------------------------------------------------// //Строим список будущих статусов договоора. //Тут будем менять текущий и будущие статусы на активен, а период оставляем тот же. //Не будем изменять статус в этом листе, если статус=приостановлен List newstatusList = new ArrayList(); for (Iterator i = statusList.iterator(); i.hasNext();) { ContractStatus s = (ContractStatus) i.next(); cStatus=s.getStatus(); // Если будущйи статус = ОТКЛЮЧЕН или Закрыт if( cStatus == 2 || cStatus == 3){ s.setStatus(0); if(s.getDate1().before(now)){s.setDate1(now);} s.setComment("Статус изменен скриптом 'Изменение статуса договора по приходу платежа'"); newstatusList.add(s); } print("Статус: "+cStatus+" Будущий статус: "+s.getStatus()+"\nБаланс: "+current_balance+"\nBalMode: "+c.getBalanceMode()+"\n"); } // Меняем статусы в соответствии с новым списком статусов for (Iterator t = newstatusList.iterator(); t.hasNext();){ ContractStatus s2 = (ContractStatus) t.next(); cstm.changeStatus(s2,0,true); }