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

открытие договора после платежа
http://forum.bitel.ru/viewtopic.php?f=19&t=8952
Страница 1 из 2

Автор:  Akhmat [ 13 фев 2014, 17:20 ]
Заголовок сообщения:  открытие договора после платежа

Цитата:
Сервер: вер. 5.2 сборка 1496 от 13.05.2013 19:34:01
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_45

Код:
      Payment p = new Payment() ;
         p.setComment("Оплата ");
         p.setSumma(sum) ;
         p.setPaymentDate(dt) ;
         p.setContractId(cid) ;
         p.setUserId(0) ;
         p.setTypeId(PAYMENT_ID) ;
         p.setId(-1) ;
         BalanceUtils bu = new BalanceUtils(con) ;
         PaymentManager cpm = new PaymentManager(con) ;
         cpm.updatePayment(p);
         bu.updateBalance(new Date(), cid) ;
         PaymentEvent pe = new PaymentEvent(0, p) ;
         EventProcessor.getInstance().publish( pe );

после внесения оплаты этим кодом, открытия закрытого договора не происходит, у модуля абонплат светится "0", статус "закрыт". Все скрипты поведения отрабатывают нормально, все как нужно. Что сюда добавить чтобы открывался договор? при внесении платежа через gui открывается же.

Автор:  skyb [ 13 фев 2014, 17:21 ]
Заголовок сообщения:  Re: открытие договора после платежа

а не проще просто статус менять самому при изменении статуса?

Автор:  Akhmat [ 13 фев 2014, 17:24 ]
Заголовок сообщения:  Re: открытие договора после платежа

можно и апи не пользоваться.
ожидаю что этого кода достаточно чтобы биллинг сообразил что делать

Автор:  skyb [ 13 фев 2014, 17:27 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
можно и апи не пользоваться.
ожидаю что этого кода достаточно чтобы биллинг сообразил что делать

ну если б было бы достаточно, то он бы открыл ;-)

Автор:  Akhmat [ 13 фев 2014, 17:34 ]
Заголовок сообщения:  Re: открытие договора после платежа

такой... загадочный. ответ нужен а не разговоры

Автор:  skyb [ 13 фев 2014, 17:52 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
такой... загадочный. ответ нужен а не разговоры

я ответил выше, если нужно сделать абонента активным, я б не парился с EventProcessor.getInstance().publish( pe ); на приход платежа из биллинга, а на просто событие прихода платежа сменил бы статус

Автор:  Akhmat [ 13 фев 2014, 17:57 ]
Заголовок сообщения:  Re: открытие договора после платежа

:) зачем делать то, что биллинг сам делает? Разработчики, биллинг дополнительно выполняет какието действия, когда в в ГУИ добавляешь платеж? если делает, то повторю. тут без самодеятельности

Автор:  skyb [ 13 фев 2014, 18:04 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
:) зачем делать то, что биллинг сам делает?

тут биллинг сделает тоже сам...каждому свое, и то что я предлагаю правильно, и то что ты....но вопрос в желании что то сделать и выбор пути у каждого свой....

Автор:  Akhmat [ 13 фев 2014, 18:11 ]
Заголовок сообщения:  Re: открытие договора после платежа

скайб философ, а философы всегда правы :)
разработчики, отвечайте быстро! хорош керлинг смотреть

Автор:  skyb [ 13 фев 2014, 18:16 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
скайб философ, а философы всегда правы :)
разработчики, отвечайте быстро! хорош керлинг смотреть

там смотрят не на камни, а на шары )))))

Автор:  barguzin2 [ 14 фев 2014, 07:54 ]
Заголовок сообщения:  Re: открытие договора после платежа

Есть вот такой рабочий код. Статус отрабатывает нормально. Из отличий получается нет только выброса события изменения баланса.

Код:
import ru.bitel.bgbilling.kernel.event.EventProcessor;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.ContractBalanceChangedEvent;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;
...
EventProcessor eventProc  = EventProcessor.getInstance();
Connection con = connectionSet.getConnection();
pm = new PaymentManager(con);
bu = new BalanceUtils(con);
...
pm.updatePayment(payment);
bu.updateBalance(date, cid);
eventProc.publishAfterCommit(new PaymentEvent(0, payment));
eventProc.publishAfterCommit( new ContractBalanceChangedEvent(0, payment.getSumma()) );


Автор:  Akhmat [ 14 фев 2014, 14:11 ]
Заголовок сообщения:  Re: открытие договора после платежа

publishAfterCommit выдает nullpointerexception почемуто. паблишем оба евента генерю, статус не открывается.
нет времени возиться, придется самому открывать.

Автор:  barguzin2 [ 14 фев 2014, 19:48 ]
Заголовок сообщения:  Re: открытие договора после платежа

может перед эвентами тогда принудительно con.commit() сделать и вызвать обычные publish ?

Автор:  Akhmat [ 14 фев 2014, 20:00 ]
Заголовок сообщения:  Re: открытие договора после платежа

Код:
...
               EventProcessor.getInstance().publish( pe );
               Contract contract = (new ContractManager(con)).getContractById(cid) ;
               ModuleSetup moduleSetup  = Setup.getSetup().getModuleSetup( ABON_MID );
               DebetStatusManageConfig dsm = new DebetStatusManageConfig(moduleSetup);
               BigDecimal debt = dsm.getSummaForUnlock(con, ABON_MID, contract);
               if (debt == null) { debt = BigDecimal.ZERO; }

               if ( contract.getStatus() >0 && debt.compareTo(p.getSumma())<0){//Открываем договор, если есть задолженность, и задолженность меньше суммы платежа
                  ContractStatus cs = new ContractStatus() ;
                  cs.setComment("Открыт после платежа");
                  cs.setContractId(cid) ;
                  cs.setDateFrom(dt) ;
                  cs.setStatus(0) ;
                  cs.setId(-1) ;
                  ContractStatusManager csm = new ContractStatusManager(con) ;
                  csm.changeStatus(cs,0) ;
               }


уже так сделал. что поделаешь, приходится явно открывать

Автор:  skyb [ 14 фев 2014, 20:14 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
уже так сделал. что поделаешь, приходится явно открывать

а я сразу говорил

Автор:  barguzin2 [ 14 фев 2014, 20:34 ]
Заголовок сообщения:  Re: открытие договора после платежа

странно все это. и костыльно как-то.у меня глобальный скрипт работает без проблем и всё открывает.

Автор:  skyb [ 14 фев 2014, 20:40 ]
Заголовок сообщения:  Re: открытие договора после платежа

почему костыль то? тот же перевод статуса

Автор:  Akhmat [ 14 фев 2014, 20:58 ]
Заголовок сообщения:  Re: открытие договора после платежа

ну, думал раньше что достаточно сгененерить событие, и биллинг все поймет, и даже не проверял этот вариант. ведь после генерации события платежа, поведение такое же, как и когда в клиенте добавляешь платеж. Получается не совсем такое.

Автор:  barguzin2 [ 14 фев 2014, 21:20 ]
Заголовок сообщения:  Re: открытие договора после платежа

Akhmat писал(а):
ну, думал раньше что достаточно сгененерить событие, и биллинг все поймет, и даже не проверял этот вариант. ведь после генерации события платежа, поведение такое же, как и когда в клиенте добавляешь платеж. Получается не совсем такое.


Статус откликается не на событие изменения платежа, а на событие изменения баланса. Платеж это платеж, ведь даже в коде после его добавления вызываешь отдельно метод обновления баланса - вот тут то уже и повод посмотреть нужно ли статус договора поменять.

Автор:  Akhmat [ 17 фев 2014, 14:34 ]
Заголовок сообщения:  Re: открытие договора после платежа

помоему нет. не использую событие изменения баланса, и при приходе через ГУИ договор нормально открывается. метод обновления баланса нужен чтобы contract_balance пересчитать. скорее всего у тебя на событие изменения баланса скрипт висит, потому и работает та схема.

Автор:  barguzin2 [ 17 фев 2014, 15:27 ]
Заголовок сообщения:  Re: открытие договора после платежа

Ну, правильно, чтобы баланс пересчитать. А если его не пересчитать, то встанет только платеж в contract_payment, а баланс (contract_balance) не изменится и, следовательно, статусу не с чего меняться, ибо отключение/включение происходит именно по значению баланса.

У меня это используется не как обработчик, а как глобальный скрипт загрузки платежей.

Автор:  Akhmat [ 17 фев 2014, 15:48 ]
Заголовок сообщения:  Re: открытие договора после платежа

:) у меня не работает. наверно правильная та схема. ContractBalanceChangedEvent в списке событий в ГУИ его вообще нету, 52 версия.

Автор:  barguzin2 [ 17 фев 2014, 19:16 ]
Заголовок сообщения:  Re: открытие договора после платежа

Так мы то его не обрабатываем, а кидаем, поэтому то, что его нет в списке клиента ни о чем не говорит. Мы его генерим, а уже сервер сам разбирается что с ним делать. Правильная схема - у меня, ибо работает, причем также на 5.2. А клиент, так там экшн срабатывает, ActionUpdateContractPayment который, и то, что ваш код соответствует логике этого экшна - вовсе факт, поэтому ГУИ тут примешивать не стоит.

А вообще приведен кусок кода, выдернутый из контекста и непонятно где и как он применяется, оттого может и не работает.

Автор:  Akhmat [ 18 фев 2014, 13:26 ]
Заголовок сообщения:  Re: открытие договора после платежа

:) наверно неправильная схема. Тест, глобальный скрипт полностью:
Код:
import bitel.billing.server.util.*;
import java.math.BigDecimal;
import bitel.billing.server.contract.bean.*;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.ContractBalanceChangedEvent;
import ru.bitel.bgbilling.kernel.event.EventProcessor;

public void main( setup, con, conSlave )
{
      int cid=790985;
       Payment p = new Payment() ;
         p.setComment("Оплата ");
         p.setSumma(new BigDecimal(10)) ;
         p.setPaymentDate(new Date()) ;
         p.setContractId(cid) ;
         p.setUserId(0) ;
         p.setTypeId(22) ;
         p.setId(-1) ;
         BalanceUtils bu = new BalanceUtils(con) ;
         PaymentManager cpm = new PaymentManager(con) ;
         cpm.updatePayment(p);
         bu.updateBalance(new Date(), cid) ;
         PaymentEvent pe = new PaymentEvent(0, p) ;
         EventProcessor.getInstance().publishAfterCommit(pe);
         EventProcessor.getInstance().publishAfterCommit(new ContractBalanceChangedEvent(0, p.getSumma()));
}

результат - платеж есть, статус остался закрытым, задолженность 0.
А так делал в сервлете, там публишафтеркоммит исключение дает, нулпойнтер.

Автор:  barguzin2 [ 18 фев 2014, 15:47 ]
Заголовок сообщения:  Re: открытие договора после платежа

Ага, а расскажи-ка какие стоят балансы и лимиты перед добавлением этого платежа.

Автор:  Akhmat [ 18 фев 2014, 16:26 ]
Заголовок сообщения:  Re: открытие договора после платежа

Настойчивый. пошагово
1. ставлю закрытый статус руками, см скрин1
2. выполняю тот глобальный скрипт, результат, см скрин 2
3. если жму тот же платеж через ГУИ (жму "ок" на платеже), статус открывается. см скрин 3

Вложения:
scrn3.png
scrn3.png [ 14.32 КБ | Просмотров: 17648 ]
scrn2.png
scrn2.png [ 13.2 КБ | Просмотров: 17649 ]
scrn1.png
scrn1.png [ 13.75 КБ | Просмотров: 17649 ]

Автор:  barguzin2 [ 18 фев 2014, 19:57 ]
Заголовок сообщения:  Re: открытие договора после платежа

Все ясно. У меня то кредитовый режим. Начал экспериментировать с дебетовым режимом - если закрываешь договор руками, то через скрипт не открывается, а через клиента открывается (прям как у тебя), если закроется по честному модулем абонплат, то через скрипт открывается, потом еще непонятно что и как реагировало, хотя я пробовал комментить строчку выброса ContractBalanceChangedEvent, без неё все-таки не работает. В общем в конце концов получил устойчивый рабочий вариант (дин.код). В последней строчке небольшие (хотя видимо значительные) изменения - вместо 0 - cid. Проверял на 6.0, но думаю на 5.2 тоже должно работать.

Код:
package ru.test;

import java.math.BigDecimal;
import java.sql.Connection;
import java.util.Date;

import bitel.billing.common.TimeUtils;
import bitel.billing.server.contract.bean.BalanceUtils;
import bitel.billing.server.contract.bean.Payment;
import bitel.billing.server.contract.bean.PaymentManager;

import ru.bitel.bgbilling.kernel.contract.balance.server.event.ContractBalanceChangedEvent;
import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;
import ru.bitel.bgbilling.kernel.event.EventProcessor;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;

public class Test
   extends GlobalScriptBase
{
   @Override
   public  void execute( Setup setup, ConnectionSet connectionSet )
      throws Exception
   {
      int cid = 1145;
      int user = 0;
      Date date = new Date();
      
      print("Add payment");
      EventProcessor eventProc  = EventProcessor.getInstance();
      Connection con = connectionSet.getConnection();
      PaymentManager pm = new PaymentManager(con);
      BalanceUtils bu = new BalanceUtils(con);
      Payment payment = new Payment();
      payment.setTypeId(16);
      payment.setUserId(user);
      payment.setContractId(cid);
      payment.setPaymentDate(date);
      payment.setSumma(new BigDecimal(550));
      payment.setComment("Test");

            
      pm.updatePayment(payment);
      con.commit();
      bu.updateBalance(date, cid);
      con.commit();
      eventProc.publish(new PaymentEvent(user, payment));
      eventProc.publish( new ContractBalanceChangedEvent(cid, payment.getSumma()) );
   }

   
}

Автор:  Akhmat [ 18 фев 2014, 20:18 ]
Заголовок сообщения:  Re: открытие договора после платежа

охохо, там параметр первый cid :)
с cid-ом работает.

Автор:  stark [ 19 фев 2014, 18:00 ]
Заголовок сообщения:  Re: открытие договора после платежа

skyb писал(а):
почему костыль то? тот же перевод статуса


Он прав, это костыль. А если мы там кроме перевода статуса еще 10 действий делаем , тоже будите все руками делать ? Или завтра добавим новое .
Проблема, я так понял, решена уже.

Автор:  skyb [ 19 фев 2014, 18:04 ]
Заголовок сообщения:  Re: открытие договора после платежа

stark писал(а):
skyb писал(а):
почему костыль то? тот же перевод статуса


Он прав, это костыль. А если мы там кроме перевода статуса еще 10 действий делаем , тоже будите все руками делать ? Или завтра добавим новое .
Проблема, я так понял, решена уже.

Так делайте хоть 100, разница в чем, поступил платеж, статус сменился. У меня кое где работает такая схема замечательно. Расчитывается баланс + лимит, если сумма платежа перекрывает эту, то переводим статус в активен. И добавляйте что хотите ;-)

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