Включение должников по приходу платежа

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

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

Работает в 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);
}



В версии 5.1 изменили метод getStatusList. Теперь его необходимо использовать без указания даты. В вышенаписанном скрипте необходимо изменить строку

List statusList =  cstm.getStatusList(cid, now);

на

List statusList =  cstm.getStatusList(cid);
Личные инструменты