forum.bitel.ru
http://forum.bitel.ru/

Активация кредитного договора, по платежу после начисления
http://forum.bitel.ru/viewtopic.php?f=19&t=10387
Страница 1 из 1

Автор:  SeGa [ 08 апр 2015, 12:58 ]
Заголовок сообщения:  Активация кредитного договора, по платежу после начисления

Имеем кредитный способ расчета с абонентами, отключение производится после 20 числа, если абонент покрывал долг прошлого месяца - договор не активировался т.к. ему не хватало денег для покрытия полного долга(до 20 числа текущего месяца абонент может заплатить долг за прошлый месяц и должен начать работать до следующего отключения)
Написал скрипт поведения(Функции скриптов поведения) который висит на событии приход платежа:
Код:
import java.sql.*;
import java.util.*;
import java.math.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.util.*;
import ru.bitel.bgbilling.kernel.event.*;
import bitel.billing.server.script.bean.event.*;

public void onEvent( event, setup, con, conSlave )
{
   int cid = event.getContractId();
   ContractStatusManager contract_status_manager  = new ContractStatusManager( con );
   Contract contract = new ContractManager(con).getContractById(cid);
   Calendar DateNow = Calendar.getInstance();
   BalanceUtils bu = new BalanceUtils( con );
   //Получаю текущий день месяца
   int schDate = DateNow.get(Calendar.DAY_OF_MONTH); 
   //Получаю первый день предыдущего месяца
   month=bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.getPrevDay(bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.convertCalendarToDate(DateNow))));
   //Абонент должне заплатить абонплату до 20 числа, поэтому проверяем что текущий день месяца меньше или равен 20 числу
   if (schDate<21)
   {
      //Получаю Входящий остаток на начало прошлого месяца
      contract_balance = bu.getBalanceSumma1 (month, cid);
      bu.close();
      // Получаю платежи с 1 числа прошлого месяца по текущее число
      String sql = " SELECT sum(cp.summa) FROM contract_payment as cp left join contract on contract.id=cp.cid where cp.dt > \""+bitel.billing.common.TimeUtils.formatSQLDate(month)+"\" and cp.dt < \""+bitel.billing.common.TimeUtils.formatSQLDate(DateNow)+"\" and cp.cid="+cid;
      PreparedStatement ps = con.prepareStatement( sql );
      ResultSet rs = ps.executeQuery();
      while(rs.next())
      {
         int pm = rs.getInt( 1 );
         BigDecimal sum = new BigDecimal(pm.toString());
         //Складываем Входящий остаток и платежи
         BigDecimal balance=contract_balance.add(sum);
         //Если  Входящий остаток + платежи больше либо равен и договор не активен - активируем его
         if (balance.compareTo( new BigDecimal("0.00") )>= 0 && contract.getStatus()!=0)
         {
            // активируем договор
            ContractStatus status = new ContractStatus();
            status.setContractId( cid );
            status.setDateFrom( DateNow.getTime() );
            status.setDateTo( null );
            status.setStatus(0);
            status.setComment( "Активировано скриптом 1-20" );
            contract_status_manager.changeStatus( status, 0 );
         }
      }
   }
}
Меня тут сильно смущает вот этот кусок.Может есть способ попроще получить первый день прошлого месяца?
Код:
month=bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.getPrevDay(bitel.billing.common.TimeUtils.getStartMonth(bitel.billing.common.TimeUtils.convertCalendarToDate(DateNow))));

Ну и может кто какую ошибку увидит....

Автор:  skyb [ 08 апр 2015, 13:17 ]
Заголовок сообщения:  Re: Активация кредитного договора, по платежу после начислен

Код:
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
Calendar firstDayOfPrevMonth = TimeUtils.getStartMonth(c);

если я правильно понял задачу

Автор:  skn [ 08 апр 2015, 13:22 ]
Заголовок сообщения:  Re: Активация кредитного договора, по платежу после начислен

skyb писал(а):
Код:
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
Calendar firstDayOfPrevMonth = TimeUtils.getStartMonth(c);

если я правильно понял задачу


интересно, если из 31 марта вычесть 1 месяц, какую дата получим ;-)

Автор:  stark [ 08 апр 2015, 13:47 ]
Заголовок сообщения:  Re: Активация кредитного договора, по платежу после начислен

skn писал(а):
skyb писал(а):
Код:
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
Calendar firstDayOfPrevMonth = TimeUtils.getStartMonth(c);

если я правильно понял задачу


интересно, если из 31 марта вычесть 1 месяц, какую дата получим ;-)

28 или 29 - зависит от того високосный год или нет.

Автор:  skyb [ 08 апр 2015, 14:07 ]
Заголовок сообщения:  Re: Активация кредитного договора, по платежу после начислен

кстати, тут можно
Код:
String sql = " SELECT sum(cp.summa) FROM contract_payment as cp left join contract on contract.id=cp.cid where cp.dt > \""+bitel.billing.common.TimeUtils.formatSQLDate(month)+"\" and cp.dt < \""+bitel.billing.common.TimeUtils.formatSQLDate(DateNow)+"\" and cp.cid="+cid;

использовать одинарные кавычки и не экранировать
Код:
String sql = " SELECT sum(cp.summa) FROM contract_payment as cp left join contract on contract.id=cp.cid where cp.dt > '"+bitel.billing.common.TimeUtils.formatSQLDate(month)+"' and cp.dt < '"+bitel.billing.common.TimeUtils.formatSQLDate(DateNow)+"' and cp.cid="+cid;

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/