Скрипт старый и довольно странный, сейчас я бы написал его постройнее. Но работает.
Код:
package ru.dsi.bgbilling.kernel.scripts;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;
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 bitel.billing.server.contract.bean.*;
import java.sql.Connection;
import java.util.*;
public class MyCreditOpenLogic
extends EventScriptBase<Event>
{
@Override
public void onEvent( Event event, Setup setup, ConnectionSet connectionSet )
throws Exception
{
Connection con = connectionSet.getConnection();
int cid = event.getContractId();
Calendar now = Calendar.getInstance();
Date d_now = new Date();
if(event instanceof PaymentEvent){
Payment p = ((PaymentEvent)event).getPayment();
print("Сумма платежа" + p.getSumma()+"\n");
}
ContractManager cm = new ContractManager( con );
ContractStatusManager cstm = new ContractStatusManager( con );
BalanceUtils bu = new BalanceUtils( con );
Contract c = cm.getContractById( cid );
print("Текущий статус: " + c.getStatus()+"\n");
if((c.getBalanceMode()==Contract.DEBET_BALANCE_MODE) &&(c.getStatus()==3)){
print("debet + статус=3 => выходим");
return;//Для дебета не обрабатываем
}
// Если мы - субдоговор с зависимым балансом - ничего не делаем
// Вообще, на зависимые субдоговора не должны приходить платежи. Это ненормальная ситуация. При приходе платежа на субдоговор не генерируется евент прихода платежа для основного, поэтому основной не откроется, хотя должен. Но мы не будем обрабатывать подобные ситуации, т.к. это исключение.
if (c.getSuperId()>0 && c.getSubMode()==0){
print("Договор является субдоговором с зависимым балансом => ничего не делаем");
return;
}
//Если баланс больше лимита, то выполняем далее, иначе не выполняем
Float balance_limit = c.getBalanceLimit().floatValue();
Float current_balance = bu.getBalance(new Date(), c).floatValue();
print("Баланс: "+current_balance);
if(current_balance < balance_limit){
print("Баланс меньше лимита. Пропускаем договор\n");
return;
}else{
print("Баланс ОК\n");
}
//Проверка сальдо для кредитных договоров:
//Если в текущем месяце при разблокировании смотреть на :
//1. Лимит - остаток должен быть больше лимита
//2. до 25 проверять чтобы оплата была >= остатку на 1-е число предыдущего месяца, после 26 числа оплата должна быть >= остатку на 1-е число текущего месяца
if(c.getBalanceMode()==Contract.CREDIT_BALANCE_MODE){
float saldo = 0;
float debt = 0;
if((new GregorianCalendar()).get(Calendar.DAY_OF_MONTH)<25){
Calendar last_month = (Calendar)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<ContractStatus> statusList = cstm.getStatusList(cid, d_now);
if(statusList.size() == 0){
print("Список изменений статусов пуст, ничего не делаем - видимо договор и так активен\n");
return;
}
int lastStatus = ((ContractStatus)statusList.get(0)).getStatus();
if(statusList.size() == 1 && lastStatus == 0){
print("Договор и так активен\n");
return;
}
// Если последний и единственный на текущее время статус договора приостановить.
// пропускаем выполнение.
if(statusList.size() == 1 && lastStatus == 4){
print("Договору не нужен статус = АКТИВЕН. Последний статус договора = Приостановить.\n");
return;
}
ContractStatus s = new ContractStatus();
s.setContractId(cid);
s.setDateFrom(new Date());
s.setDateTo(null);
s.setStatus(0);
s.setComment("Статус изменен по приходу платежа");
cstm.changeStatus(s,0,true);
cstm.recycle();
}
}