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: открытие договора после платежа |
![]() |
Автор: | 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: открытие договора после платежа |
Ага, а расскажи-ка какие стоят балансы и лимиты перед добавлением этого платежа. |
Автор: | 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/ |