BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 апр 2024, 21:04

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 22 июл 2014, 11:27 
Не в сети

Зарегистрирован: 14 окт 2013, 16:25
Сообщения: 151
Карма: 0
Добрый день.
Сейчас появилась необходимость выставлять счета при помощи модуля Bill. У нас обычно заведена такая процедура:
1. в последний день месяца клиенту выставляется счет по факту. Тут вроде не сложно
Код:
bill.pos.6.title=Абонплата за Интернет
bill.pos.6.name=Абонплата за услуги Интернет за {$month, date, MMMM yyyy г.}
bill.pos.6.summ=SERVICE_ACCOUNT($month,95,96)

2. в начале месяца, а именно 1 числа, необходимо выставить счет на аванс. Делаю так:
Код:
bill.pos.9.title=Абонплата за Интернет(Аванс)
bill.pos.9.name=Абонплата за услуги Интернет за {$nextmonth, date, MMMM yyyy г.}
bill.pos.9.summ=SERVICE_ACCOUNT($nextmonth,95,96)


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


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

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
http://wiki.bitel.ru/index.php/%D0%A1%D ... 1%82%D1%83

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 июл 2014, 14:33 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
Скоро добъю с разбивкой по услугам

_________________
Код:
  Клиент: вер. 6.2.714 / 25.05.2015 17:27:15
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
  Сервер: вер. 6.2.881 / 22.05.2015 17:56:55
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Помощь по администрированию bgbilling в jabber конференции или Группа в telegram
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


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

Зарегистрирован: 14 окт 2013, 16:25
Сообщения: 151
Карма: 0
Phricker писал(а):
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%BE%D0%B2_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D1%83


Не подскажите, зашел в Глобальные скрипты поведения -> Скрипты BGBS создаю скрипт "Создание счетов на предоплату" и добавляю код как из вики:
Код:
import bitel.billing.common.TimeUtils;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.ModuleSetup;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import ru.bitel.common.Utils;
import ru.bitel.common.XMLUtils;
import ru.bitel.bgbilling.modules.npay.server.Calculator;
import bitel.billing.server.bill.bean.*;
import bitel.billing.server.contract.bean.*;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.Date;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.apache.log4j.Logger;
 
public class BillGen
   extends GlobalScriptBase
{
   private static final Logger logger = Logger.getLogger( BillGen.class );
 
   @Override
   public void execute( Setup setup1, ConnectionSet connectionSet2 )
      throws Exception
   {
      log( "Инициализация" );
      //переменные
      int npayMid = 2;  //код модуля Npay
      String groups = "4"; //коды групп договоров через запятую
      Connection con = connectionSet2.getConnection(); //соединение с БД
      int billMid = 6; // код модуля Бухгалтерии
      int accountId = 1; // код счета банка
      String docType = "3"; // ID типа выставляемого документа
      int userId = 0; // ID пользователя, от имени которого выставляется счет
      //получаем список договоров, для которых будем выставлять счета
      log( "Получение списка договоров" );
      StringBuilder cids = new StringBuilder();
      StringBuilder query = new StringBuilder( "SELECT id FROM contract" );
      long groupMask = Utils.enumToMask( groups );
      if( groupMask > 0 )
      {
         query.append( " WHERE gr&?>0" );
      }
      PreparedStatement ps = con.prepareStatement( query.toString() );
      if( groupMask > 0 )
      {
         ps.setLong( 1, groupMask );
      }
      ResultSet rs = ps.executeQuery();
      while( rs.next() )
      {
         cids.append( rs.getInt( "id" ) + "," );
      }
      rs.close();
      ps.close();
      cids.deleteCharAt( cids.lastIndexOf( "," ) );
      log( "Получено " + cids.toString().split( "," ).length + " договоров, которым необходимо выставить авансовые счета" );
      //запускаем калькулятор по всем договорам, полученным выше
      log( "Запуск предначисления наработки для выбранных договоров" );
      Calendar dt = new GregorianCalendar();
      dt.add( Calendar.MONTH, 1 ); //нам нужно, чтобы считался будущий месяц
      dt.set( Calendar.DAY_OF_MONTH, dt.getActualMaximum( Calendar.DAY_OF_MONTH ) ); //выставляем последнее число будущего месяца
 
      Calculator calculator = new Calculator();
      calculator.setExecutingTime( dt );
      calculator.setPreCalc();
      calculator.initTask( setup1, 0, "mid=" + npayMid ); //здесь можно прописывать только конкретные услуги через service.set=<наборы через запятую>
      calculator.setCids( cids.toString() );
      calculator.startTask();
      //после обсчета получаем список наработок с разбивкой по договорам
      Map<Integer, BigDecimal> planAccountMap = new HashMap<Integer, BigDecimal>();
      if( !calculator.isCalcErrors() )
      {
         planAccountMap = calculator.getCostCache().getContractAccounts();
      }
      log( "Подсчет наработки закончен. Формирование документов" );
      //ок, теперь нужно формировать документы
      int mm = dt.get(Calendar.MONTH);
      int yy = dt.get(Calendar.YEAR);
      log("Дата формирования счетов: " + TimeUtils.format( new Date(), TimeUtils.DATE_FORMAT_PATTERN_DDMMYYYY_HHMMSS ) );
      log("Старт генерации документов за год=" + yy + "; месяц=" + mm + "; группы договоров=" + groups);
 
      BalanceUtils bu = new BalanceUtils( con );    
      ModuleSetup moduleSetup = setup1.getModuleSetup( billMid );
      TemplateBillManager man = new TemplateBillManager( moduleSetup, con, billMid, false );
      List<TemplateBill> templateBillList = man.getTemplatePayBillList( moduleSetup, yy, mm, groups, null, docType, null, false );
      log("Число сгенерированных документов = " + templateBillList.size());
      DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = dFactory.newDocumentBuilder();
      Document doc = docBuilder.newDocument();
      Element bills = doc.createElement("bills");
      for( TemplateBill templateBill : templateBillList )
      {
         Element row = XMLUtils.createElement(bills, "bill");
         row.setAttribute( "rest", Utils.formatBigDecimalSumm( bu.getBalance( dt.getTime(), templateBill.getContractId() ) ) );
         row.setAttribute( "account_id",String.valueOf(accountId ));
         //Получаем наработку за будущий месяц по договору, если она есть
         BigDecimal summ = Utils.maskNull( planAccountMap.get( templateBill.getContractId() ) );
         fillBillData( row, templateBill, summ );
      }
      doc.appendChild(bills);
      ByteArrayOutputStream sos = new ByteArrayOutputStream();
      XMLUtils.serialize(bills, sos, "UTF-8");
      String xml = sos.toString();
      log("Полученная сгенерированная xml со счетами: " + xml );
      InputStream is = new ByteArrayInputStream( xml.getBytes( "cp1251" ) );
      BillManager pbm = new BillManager( setup1, con, billMid, moduleSetup );
      pbm.addBillDocs( userId, is, yy, mm, dt.getTime(), false );
   }
 
   private void fillBillData( Element row, TemplateBill templateBill, BigDecimal billSumm )
   {
      row.setAttribute( "id", String.valueOf( templateBill.getContractDocTypeId() ) );
      row.setAttribute( "type", String.valueOf( templateBill.getDocTypeId() ) );
      row.setAttribute( "cid", String.valueOf( templateBill.getContractId() ) );
 
      row.setAttribute( "contract", templateBill.getContractTitle() );
      row.setAttribute( "contract_comment", templateBill.getContractComment() );
 
      for( PositionValue value : templateBill.getPositionList() )
      {
         value.setSumma( billSumm );
         value.setSumScaled( billSumm );
         value.setSumUnscaled( billSumm );
         Element posEl = XMLUtils.createElement( row, "pos" );
         value.toElement( posEl );
 
         Position pos = value.getPosition();
         posEl.setAttribute( "insum", Utils.booleanToStringInt( pos.isInSum() ) );
         posEl.setAttribute( "awlz", Utils.booleanToStringInt( pos.isAddWhenLessZero() ) );
      }
      //предполагается, что на догоовре одна абонка. в итоге получим лишь одну позицию
      row.setAttribute( "summ", Utils.formatBigDecimalSumm( billSumm ) );
   }
 
   /**
    * Вывод сообщений и в лог-файл и в клиентский лог.
    * @param msg текст сообщения.
    */
   private void log( String msg )
   {
      print( msg );
      logger.info( msg );
   }
}


При запуске скрипта получаю такую ошибку:
Код:
GENERATE_TIME: 25.07.14 13:50:07
EXECUTION_STOP_TIME: 25.07.14 13:50:07
PROCESS_TIME: 29

OUT:


EXCEPTIONS:
Sourced file: Создание счетов на предоплату Token Parsing Error: Lexical error at line 32, column 10.  Encountered: "O" (79), after : "@"
Sourced file: Создание счетов на предоплату Token Parsing Error: Lexical error at line 32, column 10.  Encountered: "O" (79), after : "@": <at unknown location>

   at bsh.Interpreter.eval(Interpreter.java:707)
   at ru.bitel.bgbilling.kernel.script.server.bean.ScriptInstance.eval(ScriptInstance.java:322)
   at bitel.billing.server.script.global.bean.GlobalScriptMachine.runScriptImpl(GlobalScriptMachine.java:129)
   at bitel.billing.server.script.global.bean.GlobalScriptMachine.runScript(GlobalScriptMachine.java:73)
   at bitel.billing.server.script.global.bean.GlobalScriptManager.executeGlobalScript(GlobalScriptManager.java:40)
   at bitel.billing.server.script.global.action.ActionExecuteScript.doAction(ActionExecuteScript.java:32)
   at bitel.billing.server.Executer.doModule(Unknown Source)
   at bitel.billing.server.Executer$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at javax.security.auth.Subject.doAs(Subject.java:396)
   at bitel.billing.server.Executer.doPost(Unknown Source)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
   at bitel.billing.server.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:48)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
   at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
   at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
   at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
   at java.lang.Thread.run(Thread.java:662)


Не подскажите в чем причина?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июл 2014, 15:53 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Это
Цитата:
глобальный скрипт на динамическом коде

Помоему с 5.2 версии только
http://bgbilling.ru/v5.2/doc/ch02s02.html

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


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

Зарегистрирован: 14 окт 2013, 16:25
Сообщения: 151
Карма: 0
Phricker писал(а):
Это
Цитата:
глобальный скрипт на динамическом коде

Помоему с 5.2 версии только
http://bgbilling.ru/v5.2/doc/ch02s02.html

Ясно. Подскажите, а как его потом запустить в планировщике заданий ?


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

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
http://bgbilling.ru/v6.1/doc/ch02s05s03.html

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


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

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


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

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


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

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