forum.bitel.ru http://forum.bitel.ru/ |
|
[5.2]Создание документов модуля bill через scheduler http://forum.bitel.ru/viewtopic.php?f=19&t=8900 |
Страница 1 из 1 |
Автор: | lda [ 31 янв 2014, 10:48 ] |
Заголовок сообщения: | [5.2]Создание документов модуля bill через scheduler |
Добрый день. Пытаюсь создать счет-фактуры через шедулер, получаю исключение: Код: 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - java.lang.NullPointerException 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.counter.DialUpCounter.count(DialUpCounter.java:45) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.BillUtil.parsePositionQuantity(BillUtil.java:419) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.BillUtil.parsePosition(BillUtil.java:142) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.BillUtil.getPositionList(BillUtil.java:813) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.TemplateBillManager.getTemplatePositions(TemplateBillManager.java:240) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.TemplateBillManager.getTemplatePayBillList(TemplateBillManager.java:202) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.bill.bean.TemplateBillManager.getTemplatePayBillList(TemplateBillManager.java:59) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at ru.sttk.billing.bill.TTKCreateInvoicesTask.executeTask(TTKCreateInvoicesTask.java:128) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at bitel.billing.server.task.bean.RunTask.run(RunTask.java:41) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 01-31/08:23:25 ERROR [pool-1-thread-5] LoggingPrintStream - at java.lang.Thread.run(Thread.java:662) Стал копать. Проблема возникает при попытке вычистить кол-во в позиции: Код: invoice.pos.5.quantity=DIALUP_SERVICE_AMOUNT(4,$month,1048576,8) Нашел проблемное место: bitel.billing.server.bill.bean.counter.DialUpCounter.count(DialUpCounter.java:45) Код: Conf conf = Server.getSetupData().getConfig( mid, Conf.class, this ); Получается так, что в шедулере Server=null. Ув. разработчики подскажите, правильно ли я понимаю, что создание счет-фактур через шедулер не предусмотрено? |
Автор: | Cromeshnic [ 31 янв 2014, 11:05 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Ага, я тоже пытался шедулером делать счета в скрипте - получал какие-то проблемы. В итоге запускаю глобальный скрипт руками кнопкой "Выполнить скрипт" - тогда он выполняется в контексте сервера. Если нужно именно по расписанию.. Ну, можно в crontab http-запрос к биллингу вбить, например. |
Автор: | Cromeshnic [ 31 янв 2014, 11:41 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Запускать кнопкой? Тогда в глобальном скрипте можно просто создавать отдельный тред и создавать фактуры в нём, а сам скрипт сразу завершать. У меня сейчас так и делается, причём счета создаются в несколько потоков. http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%87%D0%B5%D1%82%D0%B0_%D0%B8_%D1%81%D1%87%D0%B5%D1%82-%D1%84%D0%B0%D0%BA%D1%82%D1%83%D1%80_%D0%B2_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5_Bill(%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D1%85_%D0%B6%D0%B5_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D1%87%D1%82%D0%BE_%D0%B8_%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8) |
Автор: | lda [ 31 янв 2014, 11:45 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Спасибо. Попробую. |
Автор: | stark [ 03 фев 2014, 16:23 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
lda писал(а): Нашел проблемное место: bitel.billing.server.bill.bean.counter.DialUpCounter.count(DialUpCounter.java:45) Код: Conf conf = Server.getSetupData().getConfig( mid, Conf.class, this ); Получается так, что в шедулере Server=null. Ув. разработчики подскажите, правильно ли я понимаю, что создание счет-фактур через шедулер не предусмотрено? И справлено в версиях >=6.0. Будет в следующем обновлении. |
Автор: | lda [ 03 фев 2014, 16:31 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Спасибо! |
Автор: | barguzin2 [ 04 фев 2014, 06:57 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
lda писал(а): В общем у меня задача стоит так: 1. Требуется добавить таб в модель bill для автоматизированного создания счет-фактур. О, это чё уже в клиента свои примочки встраиваете ? Поделитесь опытом. |
Автор: | lda [ 04 фев 2014, 09:58 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Примочки давно встраиваем. viewtopic.php?f=19&t=7857&hilit=setup_user.properties |
Автор: | Cobra57 [ 13 фев 2014, 12:06 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Подскажите, как реализовали: Цитата: 2. При создании счет-фактур должен определяться платежно-расчетный документ и автоматически подставляться в документ. Дело в том что скрипт http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%87%D0%B5%D1%82%D0%B0_%D0%B8_%D1%81%D1%87%D0%B5%D1%82-%D1%84%D0%B0%D0%BA%D1%82%D1%83%D1%80_%D0%B2_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5_Bill(%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D1%85_%D0%B6%D0%B5_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9_%D1%87%D1%82%D0%BE_%D0%B8_%D1%80%D1%83%D0%BA%D0%B0%D0%BC%D0%B8) генерит xml вида: Код: <?xml version="1.0" encoding="utf-8"?><bills><bill account_id="1" cid="1257" contract="13_10-009" contract_comment="Бредихин А.В" correction="100" id="837" payDoc="101010101010" payDocDate="2010-11-11" rest="5600.00" sub_bill_summ="0.00" summ="550.00" type="14"><pos awlz="0" insum="1" name="Оказание услуг проводной телефонии (абонентская плата за январь 2014г.)" position_id="1" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="шт." unitCode="796"/><pos awlz="0" insum="1" name="Услуги Местной связи за январь 2014г." position_id="3" qtynums="0" qtynumsRnd="4" quantity="1" sumUnscaled="0.00000" summ="0.00" unit="-" unitCode="796"/><pos awlz="0" insum="1" name="Плата за подключение" position_id="4" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="подкл." unitCode="796"/><pos awlz="0" insum="1" name="Услуга: Вызов мастера" position_id="5" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="час." unitCode="796"/><pos awlz="0" insum="1" name="Услуга: золотой номер" position_id="7" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="шт." unitCode="796"/><pos awlz="0" insum="1" name="Услуга: серебряный номер" position_id="8" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="шт." unitCode="796"/><pos awlz="0" insum="1" name="Оказание услуг по доступу с сети Интернет (абонентская плата за январь 2014г.)" position_id="9" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="550.00000" summ="550.00" unit="шт." unitCode="796"/><pos awlz="0" insum="1" name="Белый IP-адрес" position_id="10" qtynums="0" qtynumsRnd="4" quantity="0" sumUnscaled="0.00000" summ="0.00" unit="шт." unitCode="796"/></bill></bills> А как вставить скриптом в Счет-фактуру параметры: payDoc - номер платежки payDocDate - дата платежки correction - исправление ? |
Автор: | lda [ 13 фев 2014, 12:24 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Примерно так: Код: InvoiceManager pbm = new InvoiceManager( setup, con, mid, moduleSetup );
String query_update = "UPDATE bill_invoice_data_"+mid+" SET xml=? WHERE id=?"; PreparedStatement ps_update = con.prepareStatement( query_update ); int index = 1; Document doc_update = XMLUtils.parseDocument( new ByteArrayInputStream( pbm.getXMLData( id_new ) ) ); Element bill_update = (Element)doc_update.getDocumentElement().getElementsByTagName( "bill" ).item( 0 ); String PRD = BBM.getRPD(cid, id_new); if (PRD != null && !PRD.equals("")){ bill_update.setAttribute( "payDoc", PRD ); bill_update.setAttribute( "payDocDate", " " ); } ByteArrayOutputStream bos_update = new ByteArrayOutputStream( 4096 ); XMLUtils.serialize( doc_update, bos_update, "windows-1251" ); ps_update.setBytes( index++, bos_update.toByteArray() ); ps_update.setInt(index++, id_new); ps_update.executeUpdate(); ps_update.close(); |
Автор: | Cobra57 [ 13 фев 2014, 14:28 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Большое спасибо! Отличный способ и самое главное работает! ![]() |
Автор: | Cobra57 [ 01 окт 2014, 15:03 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Забыл поделиться ![]() Вот что в итоге получилось: Код: import ru.bitel.common.Utils;
import bitel.billing.common.TimeUtils; import org.apache.log4j.Logger; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.math.BigDecimal; import bitel.billing.server.bill.bean.TemplateBill; import bitel.billing.server.bill.bean.TemplateBillManager; import bitel.billing.server.bill.bean.PositionValue; import bitel.billing.server.bill.bean.Position; import bitel.billing.server.contract.bean.BalanceUtils; import ru.bitel.common.XMLUtils; import java.io.StringWriter; import bitel.billing.server.bill.bean.TemplateBillManager; import bitel.billing.server.bill.bean.InvoiceManager; public void main( setup, con, conSlave ) { int mid = 14; //mid модуля Бухгалтерии Calendar month = new GregorianCalendar(); //корректировка времени month.add( Calendar.MONTH, -1 ); month.set(Calendar.DATE,month.getActualMaximum(Calendar.DATE)); int MM = month.get(Calendar.MONTH); int YY = month.get(Calendar.YEAR); print("Date of bills: " + month.getTime()); String query = "select id from bill_invoice_data_14 where yy=? and mm=?"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt(1, YY); ps.setInt(2, MM); ResultSet rs = ps.executeQuery(); while(rs.next()) { id_new = rs.getInt(1); ModuleSetup moduleSetup = setup.getModuleSetup( mid ); TemplateBillManager man = new TemplateBillManager( moduleSetup, conSlave, mid, true ); // false если надо для счетов InvoiceManager pbm = new InvoiceManager( setup, con, mid, moduleSetup ); String query_update = "UPDATE bill_invoice_data_"+mid+" SET xml=? WHERE id=?"; PreparedStatement ps_update = con.prepareStatement( query_update ); int index = 1; Document doc_update = XMLUtils.parseDocument( new ByteArrayInputStream( pbm.getXMLData( id_new ) ) ); Element bill_update = (Element)doc_update.getDocumentElement().getElementsByTagName( "bill" ).item( 0 ); Float saldo = Float.parseFloat ( bill_update.getAttribute( "saldo_prev" ) ); //Берем сальдо, если положительно или равно нулю, то нужно ставить Платежный документ if (saldo >= 0) { String PRD = getRPD(id_new, saldo, con); print (PRD); if (PRD != null && !PRD.equals("")){ bill_update.setAttribute( "payDoc", PRD ); bill_update.setAttribute( "payDocDate", " " ); } ByteArrayOutputStream bos_update = new ByteArrayOutputStream( 4096 ); XMLUtils.serialize( doc_update, bos_update, "windows-1251" ); ps_update.setBytes( index++, bos_update.toByteArray() ); ps_update.setInt(index++, id_new); ps_update.executeUpdate(); ps_update.close(); } } } private String getRPD( int id_new, Float saldo, con ) { String query = "select CP.id, CP.summa, CP.comment, date_format(CP.dt, '%d.%m.%Y') from bill_invoice_data_14 BL, contract_payment CP where BL.id=? and BL.cid=CP.cid and CP.pt=7 order by CP.dt DESC"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt(1, id_new); ResultSet rs = ps.executeQuery(); String PRD = ""; Float summa = saldo; while(rs.next() && (summa >= 0)){ summa = summa - rs.getFloat(2); print( "ChetF: " + rs.getString(1) + "; Pay:" + rs.getString(2) + "; Saldo:" + saldo + "; Summa:" + summa + "Komm:" + rs.getString(3) ); PRD = PRD + rs.getString(3) + "; "; } ps.close(); return PRD; } |
Автор: | Artur [ 02 окт 2014, 09:51 ] |
Заголовок сообщения: | Re: [5.2]Создание документов модуля bill через scheduler |
Если не затруднит, добавьте пример в вики. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |