forum.bitel.ru http://forum.bitel.ru/ |
|
почему нет возможности выставлять счета по тем услугам котор http://forum.bitel.ru/viewtopic.php?f=14&t=9230 |
Страница 1 из 2 |
Автор: | skyb [ 13 май 2014, 16:13 ] |
Заголовок сообщения: | почему нет возможности выставлять счета по тем услугам котор |
почему нет возможности выставлять счета по тем услугам которые навешаны на договор на следующий месяц? мне побольше вариантов, я интуитивно понимаю, но нада ещё и народу объяснить |
Автор: | stark [ 13 май 2014, 16:21 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Потому что нет наработки по этим услугам за следующий месяц . |
Автор: | skyb [ 13 май 2014, 16:27 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
промазал где тему размещать, переместите в бухгалтерию плиз |
Автор: | Artur [ 13 май 2014, 16:39 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Некоторым клиентам мы делали выставление счетов в будущем при использовании npay и режим "начисление без начисления" у калькулятора абонплат. |
Автор: | skyb [ 13 май 2014, 17:16 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
а есть код то? |
Автор: | Artur [ 13 май 2014, 23:03 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Конечно есть. По хорошему, конечно, надо будет на вики выложить. Завтра займусь. |
Автор: | skyb [ 14 май 2014, 02:10 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Artur писал(а): Конечно есть. По хорошему, конечно, надо будет на вики выложить. Завтра займусь. Круто, с меня как всегда ![]() |
Автор: | skyb [ 15 май 2014, 03:34 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Апну чтоль |
Автор: | Artur [ 16 май 2014, 13:55 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Наслаждайтесь =) http://wiki.bitel.ru/index.php/%D0%A1%D ... 1%82%D1%83 |
Автор: | skyb [ 20 май 2014, 04:34 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Возникла пара вопросов Код: calculator.initTask( setup1, 0, "mid=" + npayMid ); //здесь можно прописывать только конкретные услуги через service.set=<наборы через запятую> не понял где и куда прописывать, услуг будет не одна Код: //предполагается, что на догоовре одна абонка. в итоге получим лишь одну позицию row.setAttribute( "summ", Utils.formatBigDecimalSumm( billSumm ) ); а что делать если не одна? |
Автор: | Artur [ 20 май 2014, 11:08 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
skyb писал(а): Возникла пара вопросов Код: calculator.initTask( setup1, 0, "mid=" + npayMid ); //здесь можно прописывать только конкретные услуги через service.set=<наборы через запятую> не понял где и куда прописывать, услуг будет не одна 3й параметр метода initTask - это строка, в которую нужно прописывать параметры задачи. Сейчас там описан код модуля npay. Вот туда и нужно прописывать набор обсчитываемых услуг (не забудьте разделять параметры символом переноса строки) |
Автор: | Artur [ 20 май 2014, 11:17 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
skyb писал(а): Возникла пара вопросов Код: //предполагается, что на догоовре одна абонка. в итоге получим лишь одну позицию row.setAttribute( "summ", Utils.formatBigDecimalSumm( billSumm ) ); а что делать если не одна? А вы хотите каждую услугу как отдельную позицию делать? Можно у калькулятора взять список наработок, разбитый по услугам, и бегать уже по этому списку, создавая для каждой услуги свою позицию. Для примера: Код: for( CostSum costSum : calculator.getCostCache().getAmounts() )
{ ... } |
Автор: | skyb [ 20 май 2014, 11:20 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
ещёб примерчик )) Код: calculator.initTask( setup1, 0, "mid=" + npayMid+"\n"+service.set=5,7,9 ); Причем service.set=<наборы через запятую> это id услуги абонплаты, или то что в настройках абонплат сгрупированные абонки? |
Автор: | Artur [ 20 май 2014, 11:45 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
skyb писал(а): Код: calculator.initTask( setup1, 0, "mid=" + npayMid+"\n"+service.set=5,7,9 ); Причем service.set=<наборы через запятую> это id услуги абонплаты, или то что в настройках абонплат сгрупированные абонки? Это коды НАБОРОВ услуг, которые указываются в конфиге модуля. И чтобы не возникало потом вопросов, почему не работает, не забудьте передвинуть кавычки после символа переноса строки. |
Автор: | skyb [ 03 июн 2014, 06:35 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Artur писал(а): skyb писал(а): Возникла пара вопросов Код: //предполагается, что на догоовре одна абонка. в итоге получим лишь одну позицию row.setAttribute( "summ", Utils.formatBigDecimalSumm( billSumm ) ); а что делать если не одна? А вы хотите каждую услугу как отдельную позицию делать? Можно у калькулятора взять список наработок, разбитый по услугам, и бегать уже по этому списку, создавая для каждой услуги свою позицию. Для примера: Код: for( CostSum costSum : calculator.getCostCache().getAmounts() ) { ... } id так получать Код: for( CostSum costSum : calculator.getCostCache().getAmounts() ) { log ("CostSum " +costSum.sid); } сумму тоже понятно, Код: log ("CostSum " +costSum.cost.abs()); а вот куда подставлять так и не доразабрался. Подскажите |
Автор: | Artur [ 03 июн 2014, 09:47 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
В коде на вики в методе fillBillData() происходит заполнение списка позиций каждого сгенерированного счета. Если вы хотите, чтобы в каждый счет попала полная детализация начислений со всеми услугами, то вам нужно в этот метод передать информацию об этих начислениях - тот же лист CostSum'ов, например. А уже внутри fillBillData() бегать по циклу, который я приводил выше и создавать позиции. |
Автор: | skyb [ 03 июн 2014, 10:04 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Artur писал(а): В коде на вики в методе fillBillData() происходит заполнение списка позиций каждого сгенерированного счета. Если вы хотите, чтобы в каждый счет попала полная детализация начислений со всеми услугами, то вам нужно в этот метод передать информацию об этих начислениях - тот же лист CostSum'ов, например. А уже внутри fillBillData() бегать по циклу, который я приводил выше и создавать позиции. Чтобы передать в метод, необходимо присвоить переменную, я присвоил, но чувствую что то не то Код: Collection<CostSum> costSum = calculator.getCostCache().getAmounts(); Дальше я так понял чтоб пробежаться циклом в методе необходимо ещё передать Код: calculator ? и перебор уже делать такКод: for( CostSum costSum : calculator.getCostCache().getAmounts() ) { row.setAttribute( "summ", Utils.formatBigDecimalSumm( costSum.cost.abs() ) ); } ? |
Автор: | Artur [ 03 июн 2014, 13:48 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Передайте туда вот это skyb писал(а): Код: Collection<CostSum> costSumList = calculator.getCostCache().getAmounts(); И тогда использовать вот так: skyb писал(а): Код: for( CostSum costSum : costSumList ) { row.setAttribute( "summ", Utils.formatBigDecimalSumm( costSum.cost.abs() ) ); } |
Автор: | skyb [ 03 июн 2014, 15:53 ] | ||
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к | ||
рядом ))))) услуги то отдает, но почему то полную сумму а не с разбивкой по услугам (скрин) это полная сумма, а должно быть 15000 и 236 щас так Код: package ru.skyb.scripts.global;
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 = 8; //код модуля Npay String groups = "1"; //коды групп договоров через запятую Connection con = connectionSet2.getConnection(); //соединение с БД int billMid = 9; // код модуля Бухгалтерии int accountId = 1; // код счета банка String docType = "1"; // 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(); } Collection<CostSum> costSumList = calculator.getCostCache().getAmounts(); log( "Подсчет наработки закончен. Формирование документов" ); //for( CostSum costSum : calculator.getCostCache().getAmounts() ) //{ // log ("CostSum " +costSum.cost.abs()); //} //ок, теперь нужно формировать документы dt.add( Calendar.MONTH, -1 ); 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, costSumList ); } 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, Collection<CostSum> costSumList ) { 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() ) ); } //предполагается, что на догоовре одна абонка. в итоге получим лишь одну позицию for( CostSum costSum : costSumList ) { row.setAttribute( "summ", Utils.formatBigDecimalSumm( costSum.cost.abs() ) ); } } /** * Вывод сообщений и в лог-файл и в клиентский лог. * @param msg текст сообщения. */ private void log( String msg ) { print( msg ); logger.info( msg ); } }
|
Автор: | Artur [ 03 июн 2014, 16:02 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Не так немного. внутри fillBillData() нужно бегать по списку costSumList и внутри этого цикла самостоятельно создавть позиции. И вот тогда уже доставать нужные данные. Следовательно, в шаблоне счета позиции настраивать не нужно. |
Автор: | skyb [ 03 июн 2014, 16:05 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
а какие обязательные позиции? |
Автор: | Artur [ 03 июн 2014, 19:24 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
skyb писал(а): а какие обязательные позиции? Это уже вам решать, вы же вручную формируете документ. Если следовать логике, которую я приводил выше, то будут созданы позиции, соответствующие всем начисленным на договор услугам. |
Автор: | skyb [ 03 июн 2014, 19:28 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
да не, я просто думал есть какие то обязательные строки, без которых нельзя |
Автор: | Artur [ 03 июн 2014, 19:28 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
skyb писал(а): да не, я просто думал есть какие то обязательные строки, без которых нельзя Строки там формируются только исходя из конфигурации модуля. |
Автор: | skyb [ 09 июн 2014, 10:28 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Не могу победить. Я правильно понимаю что мне необходимо каждую услугу в коде описать? А обойтись описание в модуле бухгалтерии возможно? и помогите с кодом, а то у меня получается позиции х на их количество Код: private void fillBillData( Element row, TemplateBill templateBill, BigDecimal billSumm, Collection<CostSum> costSumList ) { 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( CostSum costSum : costSumList ) { for( PositionValue value : templateBill.getPositionList() ) { value.setSumma( costSum.cost.abs() ); value.setSumScaled( costSum.cost.abs() ); value.setSumUnscaled( costSum.cost.abs() ); 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( costSum.cost.abs() ) ); print(" costSum.cost.toString " + costSum.cost.toString()); } } как не переставляй циклы, всеравно не то. Почему так происходит понятно, а как починить - нет |
Автор: | skyb [ 09 июн 2014, 15:40 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
хелп ми |
Автор: | Artur [ 09 июн 2014, 16:24 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Зачем вы используете внутренний цикл по позициям из шаблона? |
Автор: | skyb [ 09 июн 2014, 16:53 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Artur писал(а): Зачем вы используете внутренний цикл по позициям из шаблона? Артур, еслиб я знал как правильно) Заводить позиции ещё и в коде тяжело, описывать каждую услугу. Или не избежать этого? |
Автор: | Artur [ 09 июн 2014, 17:40 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Правильно делать цикл по costSumList, в нем на каждую услугу программно создавать PositionVAlue, заполнять его нужными данными и добавлять в отдельный лист PositionValue, который нужно определить ранее. После этого цикла по costSumList нужно в templateBill добавить сформированный лист PositionValue. |
Автор: | skyb [ 09 июн 2014, 17:51 ] |
Заголовок сообщения: | Re: почему нет возможности выставлять счета по тем услугам к |
Artur, а вот бы в коде увидеть такое волшебство )))) |
Страница 1 из 2 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |