forum.bitel.ru http://forum.bitel.ru/ |
|
Выставить счет на следующий месяц http://forum.bitel.ru/viewtopic.php?f=14&t=9474 |
Страница 1 из 1 |
Автор: | Dipress [ 22 июл 2014, 11:27 ] |
Заголовок сообщения: | Выставить счет на следующий месяц |
Добрый день. Сейчас появилась необходимость выставлять счета при помощи модуля 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) Во втором случае счет получается по нулям. Собственно вопрос, как сделать так, чтобы такой авансовый счет можно было выставлять клиентам? |
Автор: | Phricker [ 22 июл 2014, 11:43 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
http://wiki.bitel.ru/index.php/%D0%A1%D ... 1%82%D1%83 |
Автор: | skyb [ 22 июл 2014, 14:33 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
Скоро добъю с разбивкой по услугам |
Автор: | Dipress [ 25 июл 2014, 15:50 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
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) Не подскажите в чем причина? |
Автор: | Phricker [ 25 июл 2014, 15:53 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
Это Цитата: глобальный скрипт на динамическом коде Помоему с 5.2 версии только http://bgbilling.ru/v5.2/doc/ch02s02.html |
Автор: | Dipress [ 25 июл 2014, 15:55 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
Phricker писал(а): Это Цитата: глобальный скрипт на динамическом коде Помоему с 5.2 версии только http://bgbilling.ru/v5.2/doc/ch02s02.html Ясно. Подскажите, а как его потом запустить в планировщике заданий ? |
Автор: | Phricker [ 25 июл 2014, 16:00 ] |
Заголовок сообщения: | Re: Выставить счет на следующий месяц |
http://bgbilling.ru/v6.1/doc/ch02s05s03.html |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |