Не могу добить код, вроде все есть, но выставляется счет со всеми услугами всех договоров и их суммами, тоесть есть 1 договор, на нем счет, а там все услуги и сумма предпологаемой наработки по ним
Код:
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 = "6"; //коды групп договоров через запятую
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();
print("planAccountMap " + planAccountMap);
}
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 ));
log("Получаем наработку за будущий месяц по договору, если она есть");
BigDecimal summ = Utils.maskNull( planAccountMap.get( templateBill.getContractId() ) );
fillBillData( row, templateBill, summ, costSumList, con );
}
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, Connection con ) throws SQLException
{
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() );
List<PositionValue> valList = new ArrayList<PositionValue>();
BigDecimal totalSum = BigDecimal.ZERO;
for( CostSum costSum : costSumList )
{
String query = " select title from service where id = " + costSum.sid ;
PreparedStatement contractPs = con.prepareStatement( query );
ResultSet contractRs = contractPs.executeQuery();
while ( contractRs.next() )
{
String title = contractRs.getString( 1 );
log("title " + title + " costSum.cid " + costSum.cid );
PositionValue value = new PositionValue();
value.setSumma( costSum.cost.abs() );
value.setSumScaled( costSum.cost.abs() );
value.setSumUnscaled( costSum.cost.abs() );
value.setName(title);
totalSum = totalSum.add( costSum.cost );
Element posEl = XMLUtils.createElement( row, "pos" );
value.toElement( posEl );
templateBill.setPositionList(valList);
row.setAttribute( "summ", Utils.formatBigDecimalSumm( totalSum.abs() ) );
}
contractRs.close();
contractPs.close();
}
}
/**
* Вывод сообщений и в лог-файл и в клиентский лог.
* @param msg текст сообщения.
*/
private void log( String msg )
{
print( msg );
logger.info( msg );
}
}
понимаю что проблема в каком то из циклов, а не могу найти
_________________
Код:
Клиент: вер. 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Стиль программирования - пьяный мастерстер
Разработка мобильных приложений