BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: 31 янв 2014, 10:48 
Добрый день.
Пытаюсь создать счет-фактуры через шедулер, получаю исключение:
Код:
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.

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


Вернуться к началу
  
 
СообщениеДобавлено: 31 янв 2014, 11:05 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Ага, я тоже пытался шедулером делать счета в скрипте - получал какие-то проблемы.
В итоге запускаю глобальный скрипт руками кнопкой "Выполнить скрипт" - тогда он выполняется в контексте сервера.
Если нужно именно по расписанию.. Ну, можно в crontab http-запрос к биллингу вбить, например.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 31 янв 2014, 11:27 
Глобальный скрипт и http-запрос это не вариант.
В общем у меня задача стоит так:
1. Требуется добавить таб в модель bill для автоматизированного создания счет-фактур.
2. При создании счет-фактур должен определяться платежно-расчетный документ и автоматически подставляться в документ.
3. Должна быть автоматическая проверка дубликатов.
4. Требуется реализация механизма обновления документов.
5. Задача создания документов должна выполняться в асинхронном режиме.


Проблема возникла в 5-м пункте. Получается что шедулер не может создать документы.
Придется думать как выполнить асинхронную задачу не в шедулере а на сервере.

Если кто знает как это сделать, прошу подсказать.


Вложения:
Управление счет-фактурами.jpg
Управление счет-фактурами.jpg [ 60.08 КБ | Просмотров: 6126 ]
Вернуться к началу
  
 
СообщениеДобавлено: 31 янв 2014, 11:41 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Запускать кнопкой?
Тогда в глобальном скрипте можно просто создавать отдельный тред и создавать фактуры в нём, а сам скрипт сразу завершать.
У меня сейчас так и делается, причём счета создаются в несколько потоков.
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)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 31 янв 2014, 11:45 
Спасибо. Попробую.


Вернуться к началу
  
 
СообщениеДобавлено: 03 фев 2014, 16:23 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
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. Будет в следующем обновлении.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 фев 2014, 16:31 
Спасибо!


Вернуться к началу
  
 
СообщениеДобавлено: 04 фев 2014, 06:57 
Не в сети
Клиент

Зарегистрирован: 09 фев 2011, 15:28
Сообщения: 1092
Карма: 135
lda писал(а):
В общем у меня задача стоит так:
1. Требуется добавить таб в модель bill для автоматизированного создания счет-фактур.


О, это чё уже в клиента свои примочки встраиваете ? Поделитесь опытом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 фев 2014, 09:58 
Примочки давно встраиваем.
viewtopic.php?f=19&t=7857&hilit=setup_user.properties


Вернуться к началу
  
 
СообщениеДобавлено: 13 фев 2014, 12:06 
Не в сети

Зарегистрирован: 10 апр 2013, 13:29
Сообщения: 36
Карма: 1
Подскажите, как реализовали:
Цитата:
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 - исправление ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 фев 2014, 12:24 
Примерно так:
Код:
                        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();



Вернуться к началу
  
 
СообщениеДобавлено: 13 фев 2014, 14:28 
Не в сети

Зарегистрирован: 10 апр 2013, 13:29
Сообщения: 36
Карма: 1
Большое спасибо! Отличный способ и самое главное работает! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 окт 2014, 15:03 
Не в сети

Зарегистрирован: 10 апр 2013, 13:29
Сообщения: 36
Карма: 1
Забыл поделиться :D

Вот что в итоге получилось:

Код:
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;
}


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

Зарегистрирован: 27 янв 2010, 16:12
Сообщения: 941
Откуда: Уфа
Карма: 124
Если не затруднит, добавьте пример в вики.

_________________
С уважением, Гареев Артур. Вежливый разработчик ООО "Бител".


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

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


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

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


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

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