BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 18 июн 2025, 02:06

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
СообщениеДобавлено: 30 июн 2015, 15:53 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
Надоело руками переносить баланс при переоформлении договора. Поэтому пытаюсь написать скрипт. Логика такая пересчитать абонентскую плату, а затем перенести баланс. Вроде бы все просто, но не тут то было. Баланс переносится, но не с учетом обновленной наработки. Видимо потому, как задача на перерасчет обрабатывается асинхронно.
Может уже кто делал что то подобное. Готов поделится готовым скриптом :)
Код:
package ru.borin.action;

import bitel.billing.server.npay.Recalculator;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.kernel.contract.balance.common.BalanceService;
import ru.bitel.bgbilling.kernel.contract.balance.common.ChargeService;
import ru.bitel.bgbilling.kernel.contract.balance.common.PaymentService;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Charge;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.ContractBalance;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;
import ru.bitel.common.XMLUtils;

import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class ActionWrapContract extends bitel.billing.server.contract.action.ActionWrapContract {
    public void doAction() throws SQLException, BGException {
        ServerContext context = ServerContext.get();
        BalanceService balanceService = context.getService(BalanceService.class, 0);
        ChargeService chargeService = context.getService(ChargeService.class, 0);
        PaymentService paymentService = context.getService(PaymentService.class, 0);

        Calendar calendar = new GregorianCalendar();

        super.doAction();

        int mid = 1;
        int oldCid = this.cid;
        int newCid = Integer.valueOf(XMLUtils.selectText(rootNode, "contract/@id"));

        Recalculator recalculator = new Recalculator(mid, calendar, null, 0, String.valueOf(oldCid), null);
        recalculator.executeTask();

        ContractBalance balance = balanceService.contractBalanceGet(oldCid, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH)+1);
        Charge charge = new Charge(0, this.userID, oldCid, 21, calendar.getTime(), "", balance.toBalance(), calendar.getTime());
        chargeService.chargeUpdate(charge);
        Payment payment = new Payment(0, this.userID, newCid, 12, calendar.getTime(), "", balance.toBalance(), calendar.getTime());
        paymentService.paymentUpdate(payment, null);
    }
}

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 июн 2015, 15:56 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
А разве при переоформлении сейчас баланс сам автоматом не пересчитывается ? Абонплаты вроде точно пересчитываются при переоформлении. Модуль inet пересчитывается и остальные модули вроде тоже должны.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 июн 2015, 16:29 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
stark писал(а):
А разве при переоформлении сейчас баланс сам автоматом не пересчитывается ? Абонплаты вроде точно пересчитываются при переоформлении. Модуль inet пересчитывается и остальные модули вроде тоже должны.

А у меня на 6.2 не работает, на 6.0 пересчитывает.

Код:
recalculate.on.service.change=2

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 июн 2015, 16:51 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
borin писал(а):
stark писал(а):
А разве при переоформлении сейчас баланс сам автоматом не пересчитывается ? Абонплаты вроде точно пересчитываются при переоформлении. Модуль inet пересчитывается и остальные модули вроде тоже должны.

А у меня на 6.2 не работает, на 6.0 пересчитывает.

Код:
recalculate.on.service.change=2


Только что проверил, не понял почему , но заработало, но стало пересчитывать. Нооо опять же это происходит позже после переоформления договора. И в расходе эти средства не отобразятся.

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 июн 2015, 17:03 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
borin писал(а):
borin писал(а):
stark писал(а):
А разве при переоформлении сейчас баланс сам автоматом не пересчитывается ? Абонплаты вроде точно пересчитываются при переоформлении. Модуль inet пересчитывается и остальные модули вроде тоже должны.

А у меня на 6.2 не работает, на 6.0 пересчитывает.

Код:
recalculate.on.service.change=2


Только что проверил, не понял почему , но заработало, но стало пересчитывать. Нооо опять же это происходит позже после переоформления договора. И в расходе эти средства не отобразятся.


Да АП пересчитывается, только при переоформлении договора. При закрытии договора АП не начисляется. Опять же это не решает проблемы с переносом средств. :(

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 июл 2015, 12:30 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
Уважаемые разработчики подскажите, как отследить завершение начисления АП?
Еще заметил что при переоформлении АП начисляется всегда, при любых настройках модуля npay. Причем начисляется даже на новом договоре (хотя планировали делать начисления 1-го числа месяца).

PS. Хотелось бы услышать хоть какой-нибудь ответ :)
База планируется большая, и вручную переносить не вариант. Операторы все напутают. Хотелось бы автоматизировать.

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 июл 2015, 19:07 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
Нашел проблема в классе npay.jar!\bitel\billing\server\npay\Recalculator.class в методе public void executeTask()
Код:
this.log.info("PaymentRecalculator time: " + TimeUtils.format(this.dt, "dd.MM.yyyy HH"));

Выпадает в NullPointerException.
Сделал с вызовом сразу класса Calculator и все заработало.
Осталось найти чтоб на новом договоре не пересчитывалась абонентка при переоформлении договора.

PS. Оказалось Recalculator просто не запускался.

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 06:50 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 05 сен 2012, 18:20
Сообщения: 457
Карма: 27
borin писал(а):
Причем начисляется даже на новом договоре (хотя планировали делать начисления 1-го числа месяца).

PS. Хотелось бы услышать хоть какой-нибудь ответ :)
База планируется большая, и вручную переносить не вариант. Операторы все напутают. Хотелось бы автоматизировать.


Периодом услуги, стутусом договора или тарифом.

borin писал(а):
PS. Оказалось Recalculator просто не запускался.


Планировщик должен быть запущен.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 10:36 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
Ildar писал(а):
Периодом услуги, стутусом договора или тарифом.

????
borin писал(а):
PS. Оказалось Recalculator просто не запускался.

Ildar писал(а):
Планировщик должен быть запущен.

Я про bitel.billing.server.npay.Recalculator, при использовании данного класса, он валится в NullPointerException, проблема в методе public void executeTask()
Код:
this.log.info("PaymentRecalculator time: " + TimeUtils.format(this.dt, "dd.MM.yyyy HH"));


Пока сделал минуя класс Recalculator, используя класс ru.bitel.bgbilling.modules.npay.server.Calculator (в документации про него ни слова, почему-то)
Код:
Calculator calculator = new Calculator();
calculator.setExecutingTime(calendar);
calculator.initTask(setup, 0, "mid=" + mid + "\nservice.set=" + 0 + "\ncomment=");
calculator.setCids(String.valueOf(cid1));
calculator.startTask();


А можно пожелайку? В конфигурацию добавить пару параметров npay.contract.wrap.recalculate.old и npay.contract.wrap.recalculate.new, проводить перерасчет АП при переоформлении договора у старого и у нового договора. Тогда бы была возможность производить перерасчет из ActionWrapContract, если есть необходимость. А то он все равно перерасчет АП работает, как то не корректно при переоформлении договора.

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 15:37 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
borin писал(а):
Ildar писал(а):
Периодом услуги, стутусом договора или тарифом.

????
borin писал(а):
PS. Оказалось Recalculator просто не запускался.

Ildar писал(а):
Планировщик должен быть запущен.

Я про bitel.billing.server.npay.Recalculator, при использовании данного класса, он валится в NullPointerException, проблема в методе public void executeTask()
Код:
this.log.info("PaymentRecalculator time: " + TimeUtils.format(this.dt, "dd.MM.yyyy HH"));



Покажите stacktrace. Оно там почему падает то ? dt никак не может быть null , если вы туда calendar передали..

borin писал(а):
А можно пожелайку? В конфигурацию добавить пару параметров npay.contract.wrap.recalculate.old и npay.contract.wrap.recalculate.new, проводить перерасчет АП при переоформлении договора у старого и у нового договора. Тогда бы была возможность производить перерасчет из ActionWrapContract, если есть необходимость. А то он все равно перерасчет АП работает, как то не корректно при переоформлении договора.


Пока не ясно что именно не правильно то? Вроде бы оно сейчас переобсчет на старом и на новом должно запускать и должно все корректно работать.. И с балансом я не понял пока что не так, надо проверить .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 17:23 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
stark писал(а):
Покажите stacktrace. Оно там почему падает то ? dt никак не может быть null , если вы туда calendar передали..

Код:
Recalculator recalculator = new Recalculator(1, new GregorianCalendar(), null, 0, String.valueOf(oldCid), 0, "");
recalculator.executeTask();

Код:
07-09/15:55:32  INFO [http-bio-0.0.0.0-8080-exec-6] CommonKernelEventProcessor - Process event cid:36; event:Event[ru.bitel.bgbilling.kernel.event.events.system.ContractWrapEvent] moduleId: 0; pluginId: no; cid: 36; scid: -1; userId: 1;
07-09/15:55:32  INFO [http-bio-0.0.0.0-8080-exec-6] CommonKernelEventProcessor - Process event cid:36; event:Event[ru.bitel.bgbilling.kernel.event.events.system.ContractWrapEvent] moduleId: 0; pluginId: no; cid: 36; scid: -1; userId: 1;
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - java.lang.NullPointerException
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at bitel.billing.server.npay.Recalculator.executeTask(Recalculator.java:75)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at ru.borin.action.ActionWrapContract.doAction(ActionWrapContract.java:23)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at bitel.billing.server.Executer.doModule(SourceFile:600)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at bitel.billing.server.Executer$1.run(SourceFile:199)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at java.security.AccessController.doPrivileged(Native Method)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at javax.security.auth.Subject.doAs(Subject.java:422)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at bitel.billing.server.Executer.doPost(SourceFile:193)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at ru.bitel.common.server.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:50)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
07-09/15:55:33 ERROR [http-bio-0.0.0.0-8080-exec-6] LoggingPrintStream - <----->at java.lang.Thread.run(Thread.java:745)

borin писал(а):
А можно пожелайку? В конфигурацию добавить пару параметров npay.contract.wrap.recalculate.old и npay.contract.wrap.recalculate.new, проводить перерасчет АП при переоформлении договора у старого и у нового договора. Тогда бы была возможность производить перерасчет из ActionWrapContract, если есть необходимость. А то он все равно перерасчет АП работает, как то не корректно при переоформлении договора.


Пока не ясно что именно не правильно то? Вроде бы оно сейчас переобсчет на старом и на новом должно запускать и должно все корректно работать.. И с балансом я не понял пока что не так, надо проверить .[/quote]
Да переобсчитывает, нооо, с зажержкой.
Например:
Код:
public class ActionWrapContract extends bitel.billing.server.contract.action.ActionWrapContract {
    public void doAction() throws SQLException, BGException {
        super.doAction();

        int mid = 1;
        int oldCid = this.cid;
        int newCid = Integer.valueOf(XMLUtils.selectText(rootNode, "contract/@id"));

        Calendar calendar = new GregorianCalendar();

        BalanceService balanceService = context.getService(BalanceService.class, 0);
        ContractBalance balance1 = balanceService.contractBalanceGet(oldCid, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);

        Calculator calculator = new Calculator();
        calculator.setExecutingTime(calendar);
        calculator.initTask(Setup.getSetup(), 0, "mid=" + mid + "\nservice.set=" + 0 + "\ncomment=");
        calculator.setCids(String.valueOf(oldCid));
        calculator.startTask();

        ContractBalance balance2 = balanceService.contractBalanceGet(oldCid, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);

        throw new BGMessageException(balance1.toBalance().toString() + " - " + balance2.toBalance().toString());
    }
}

Т.е. вроде бы после super.doAction(); баланс должен быть уже новый и значения должны совпасть и вызов калькулятора вроде как бы тут бессмыслен, но не тут то было. Если калькулятор убрать и вывод ошибки. То после переоформления договора баланс изменится, ноо с задержкой.
Вложение:
balance-err.png
balance-err.png [ 182.68 КБ | Просмотров: 8365 ]


PS: т.е. второе число верное -425+145-(145/31*8) = -317.42

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 18:16 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
borin писал(а):
stark писал(а):
borin писал(а):
А можно пожелайку? В конфигурацию добавить пару параметров npay.contract.wrap.recalculate.old и npay.contract.wrap.recalculate.new, проводить перерасчет АП при переоформлении договора у старого и у нового договора. Тогда бы была возможность производить перерасчет из ActionWrapContract, если есть необходимость. А то он все равно перерасчет АП работает, как то не корректно при переоформлении договора.


Пока не ясно что именно не правильно то? Вроде бы оно сейчас переобсчет на старом и на новом должно запускать и должно все корректно работать.. И с балансом я не понял пока что не так, надо проверить .

Да переобсчитывает, нооо, с зажержкой.
Например:
Код:
public class ActionWrapContract extends bitel.billing.server.contract.action.ActionWrapContract {
    public void doAction() throws SQLException, BGException {
        super.doAction();

        int mid = 1;
        int oldCid = this.cid;
        int newCid = Integer.valueOf(XMLUtils.selectText(rootNode, "contract/@id"));

        Calendar calendar = new GregorianCalendar();

        BalanceService balanceService = context.getService(BalanceService.class, 0);
        ContractBalance balance1 = balanceService.contractBalanceGet(oldCid, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);

        Calculator calculator = new Calculator();
        calculator.setExecutingTime(calendar);
        calculator.initTask(Setup.getSetup(), 0, "mid=" + mid + "\nservice.set=" + 0 + "\ncomment=");
        calculator.setCids(String.valueOf(oldCid));
        calculator.startTask();

        ContractBalance balance2 = balanceService.contractBalanceGet(oldCid, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1);

        throw new BGMessageException(balance1.toBalance().toString() + " - " + balance2.toBalance().toString());
    }
}

Т.е. вроде бы после super.doAction(); баланс должен быть уже новый и значения должны совпасть и вызов калькулятора вроде как бы тут бессмыслен, но не тут то было. Если калькулятор убрать и вывод ошибки. То после переоформления договора баланс изменится, ноо с задержкой.
Вложение:
balance-err.png


PS: т.е. второе число верное -425+145-(145/31*8) = -317.42


Так проблема что пересчитывает правильно, но задержкой ? Так логично что с задержкой, Calculator - работает в отдельном потоке и запускается вооьще на планировщике . И вообще в чем проблема задержки ? Чем она мешает? Вообще что вы хотите получить ? зачем вам в этом месте нужно чтобы баланс уже был пересчитан ? Какая вообще цель всего этого ??


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 18:21 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
stark писал(а):
Я так и не понял. Так проблема что пересчитывает правильно, но задержкой ? Так логично что с задержкой, Calculator - работает в отдельном потоке . И вообще в чем проблема задержки ? Чем она мешает?
Я не понимаю зачем вы вообще это переобсчет в сервер запускаете? Чем вас штатный код не устраивает, в котором кидается событие ContractWrapEvent и все модули делают все что нужно, в том числе и переобсчет абонплат(его запускают на планировщике). Какая вообще цель всего этого ??


Если посмотреть в начало темы, собственно требуется перенести средства с одного договора на другой при переоформлении. Но этого нельзя сделать так как, перерасчет происходит с задержкой и переносится не правильный баланс(без перерасчета).

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 18:24 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
borin писал(а):
stark писал(а):
Я так и не понял. Так проблема что пересчитывает правильно, но задержкой ? Так логично что с задержкой, Calculator - работает в отдельном потоке . И вообще в чем проблема задержки ? Чем она мешает?
Я не понимаю зачем вы вообще это переобсчет в сервер запускаете? Чем вас штатный код не устраивает, в котором кидается событие ContractWrapEvent и все модули делают все что нужно, в том числе и переобсчет абонплат(его запускают на планировщике). Какая вообще цель всего этого ??


Если посмотреть в начало темы, собственно требуется перенести средства с одного договора на другой при переоформлении. Но этого нельзя сделать так как, перерасчет происходит с задержкой и переносится не правильный баланс(без перерасчета).



а что значит перенести средсвта? все платежи и расходы до даты перефомления - на старом договоре остаются, а те кто после даты (включая ее) - на новый ? Этого разве нет в штатной логике ?

Или у вам какая-то своя кастомная логика распределения средств?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 18:28 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
stark писал(а):
borin писал(а):
stark писал(а):
Я так и не понял. Так проблема что пересчитывает правильно, но задержкой ? Так логично что с задержкой, Calculator - работает в отдельном потоке . И вообще в чем проблема задержки ? Чем она мешает?
Я не понимаю зачем вы вообще это переобсчет в сервер запускаете? Чем вас штатный код не устраивает, в котором кидается событие ContractWrapEvent и все модули делают все что нужно, в том числе и переобсчет абонплат(его запускают на планировщике). Какая вообще цель всего этого ??


Если посмотреть в начало темы, собственно требуется перенести средства с одного договора на другой при переоформлении. Но этого нельзя сделать так как, перерасчет происходит с задержкой и переносится не правильный баланс(без перерасчета).



а что значит перенести средсвта? все платежи и расходы до даты перефомления - на старом договоре остаются, а те кто после даты (включая ее) - на новый ? Этого разве нет в штатной логике ?

Или у вам какая-то своя кастомная логика распределения средств?

Все проще взять остаток средств(с учетом перерасчета АП), сделать расход на старом договоре, и сделать приход на новом. Но пока перерасчет не произойдет, остаток на старом договоре не правильный.

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 июл 2015, 19:43 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
borin писал(а):
stark писал(а):
borin писал(а):
stark писал(а):
Я так и не понял. Так проблема что пересчитывает правильно, но задержкой ? Так логично что с задержкой, Calculator - работает в отдельном потоке . И вообще в чем проблема задержки ? Чем она мешает?
Я не понимаю зачем вы вообще это переобсчет в сервер запускаете? Чем вас штатный код не устраивает, в котором кидается событие ContractWrapEvent и все модули делают все что нужно, в том числе и переобсчет абонплат(его запускают на планировщике). Какая вообще цель всего этого ??


Если посмотреть в начало темы, собственно требуется перенести средства с одного договора на другой при переоформлении. Но этого нельзя сделать так как, перерасчет происходит с задержкой и переносится не правильный баланс(без перерасчета).



а что значит перенести средсвта? все платежи и расходы до даты перефомления - на старом договоре остаются, а те кто после даты (включая ее) - на новый ? Этого разве нет в штатной логике ?

Или у вам какая-то своя кастомная логика распределения средств?

Все проще взять остаток средств(с учетом перерасчета АП), сделать расход на старом договоре, и сделать приход на новом. Но пока перерасчет не произойдет, остаток на старом договоре не правильный.


А расход и приход как считаются ? Я к тому что вроде как это должно итак все автоматом считаться (и расходы и платежи и наработка и баланс ).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 июл 2015, 10:24 
Не в сети
Аватара пользователя

Зарегистрирован: 12 июл 2010, 21:22
Сообщения: 319
Карма: 11
stark писал(а):
А расход и приход как считаются ? Я к тому что вроде как это должно итак все автоматом считаться (и расходы и платежи и наработка и баланс ).


Вот так, если б все автоматом считалось, яп не поднимал тему :) Если не использовать калькулятор, переносится не корректная сумма.
Код:
ContractBalance balance = balanceService.contractBalanceGet(cid1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH)+1);
Charge charge = new Charge(0, uid, cid1, chargeId, calendar.getTime(), "Перенос средств на договор №" + cm.getContractById(cid2).getTitle(), balance.toBalance(), calendar.getTime());
chargeService.chargeUpdate(charge);
Payment payment = new Payment(0, uid, cid2, paymentId, calendar.getTime(), "Перенесено с договора №" + cm.getContractById(cid1).getTitle(), balance.toBalance(), calendar.getTime());
paymentService.paymentUpdate(payment, null);

где cid1 - старый договор, cid2 - новый.

Код:
package ru.borin.action;

import ru.bitel.bgbilling.common.BGException;
import ru.bitel.common.XMLUtils;

import java.sql.SQLException;

public class ActionWrapContract extends bitel.billing.server.contract.action.ActionWrapContract {
    public void doAction() throws SQLException, BGException {
        super.doAction();

        int uid = this.userID;
        int oldCid = this.cid;
        int newCid = Integer.valueOf(XMLUtils.selectText(rootNode, "contract/@id"));

        ActionUtils actionUtils = new ActionUtils(this.setup, this.con);
        actionUtils.moveBalance(oldCid, newCid, uid);
    }
}


Код:
package ru.borin.action;

import bitel.billing.server.contract.bean.ContractManager;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.common.BGMessageException;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.kernel.contract.balance.common.BalanceService;
import ru.bitel.bgbilling.kernel.contract.balance.common.ChargeService;
import ru.bitel.bgbilling.kernel.contract.balance.common.PaymentService;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Charge;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.ContractBalance;
import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;
import ru.bitel.bgbilling.modules.npay.server.Calculator;
import ru.bitel.bgbilling.server.util.Setup;

import java.sql.*;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class ActionUtils {
    protected Setup setup;
    protected Connection connection;

    public ActionUtils (Setup setup, Connection connection){
        this.setup = setup;
        this.connection = connection;
    }

    public void moveBalance(int cid1, int cid2, int uid) throws BGException {
        ServerContext context = ServerContext.get();
        BalanceService balanceService = context.getService(BalanceService.class, 0);
        ChargeService chargeService = context.getService(ChargeService.class, 0);
        PaymentService paymentService = context.getService(PaymentService.class, 0);

        ContractManager cm = new ContractManager(connection);

        Calendar calendar = new GregorianCalendar();

        String mid = setup.get("custom.npay.mid");
        if (mid == null || mid.equals("")) throw new BGMessageException("Параметр custom.npay.mid не определен в конфигурации.");

        String setupChargeId = setup.get("custom.contract.wrap.charge.id");
        if (setupChargeId == null || setupChargeId.equals("")) throw new BGMessageException("Параметр custom.contract.wrap.charge.id не определен в конфигурации.");

        String setupPaymentId = setup.get("custom.contract.wrap.payment.id");
        if (setupPaymentId == null || setupPaymentId.equals("")) throw new BGMessageException("Параметр custom.contract.wrap.charge.id не определен в конфигурации.");

        int chargeId = Integer.parseInt(setupChargeId);
        int paymentId = Integer.parseInt(setupPaymentId);

        Calculator calculator = new Calculator();
        calculator.setExecutingTime(calendar);
        calculator.initTask(setup, 0, "mid=" + mid + "\nservice.set=" + 0 + "\ncomment=");
        calculator.setCids(String.valueOf(cid1));
        calculator.startTask();

        ContractBalance balance = balanceService.contractBalanceGet(cid1, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH)+1);
        Charge charge = new Charge(0, uid, cid1, chargeId, calendar.getTime(), "Перенос средств на договор №" + cm.getContractById(cid2).getTitle(), balance.toBalance(), calendar.getTime());
        chargeService.chargeUpdate(charge);
        Payment payment = new Payment(0, uid, cid2, paymentId, calendar.getTime(), "Перенесено с договора №" + cm.getContractById(cid1).getTitle(), balance.toBalance(), calendar.getTime());
        paymentService.paymentUpdate(payment, null);
    }
}

_________________
Код:
    Клиент: вер. 6.2.874 / 05.02.2018 12:48:36
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_151
  Сервер: вер. 6.2.1203 / 05.02.2018 12:50:34
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 авг 2015, 18:53 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 05 сен 2012, 18:20
Сообщения: 457
Карма: 27
В 6.2 теперь Npay пересчитывает в том же потоке. Можете обновиться.
По этому если повеситься на событие переоформление договора( или переопределить акшен ), то баланс должен отражать пересчитанную сумму.

Нативная возможность переноса баланса при переоформлении договора, скорее всего, появится в следующей версии( 6.3 )


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.055s | 54 Queries | GZIP : On ]