Java tutorial
/* * GovPay - Porta di Accesso al Nodo dei Pagamenti SPC * http://www.gov4j.it/govpay * * Copyright (c) 2014-2017 Link.it srl (http://www.link.it). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package it.govpay.core.business; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.openspcoop2.generic_project.exception.NotFoundException; import org.openspcoop2.generic_project.expression.SortOrder; import org.openspcoop2.utils.csv.Format; import org.openspcoop2.utils.csv.FormatReader; import org.openspcoop2.utils.csv.Printer; import org.openspcoop2.utils.logger.beans.Property; import it.govpay.bd.BasicBD; import it.govpay.bd.FilterSortWrapper; import it.govpay.bd.anagrafica.DominiBD; import it.govpay.bd.anagrafica.filters.DominioFilter; import it.govpay.bd.reportistica.EstrattiContoBD; import it.govpay.core.utils.CSVSerializerProperties; import it.govpay.core.utils.CSVUtils; import it.govpay.core.utils.GovpayConfig; import it.govpay.core.utils.GpContext; import it.govpay.core.utils.GpThreadLocal; import it.govpay.model.Anagrafica; import it.govpay.model.comparator.EstrattoContoComparator; import it.govpay.model.reportistica.EstrattoContoMetadata; import it.govpay.model.reportistica.comparator.EstrattoContoMetadataComparator; import it.govpay.orm.Dominio; import it.govpay.stampe.pdf.Costanti; import it.govpay.stampe.pdf.estrattoConto.EstrattoContoPdf; public class EstrattoConto extends BasicBD { private SimpleDateFormat f3 = new SimpleDateFormat("yyyy/MM"); private static final String CSV_SEPARATOR = "|"; private static Logger log = LogManager.getLogger(); private static final int LIMIT = 50; public static final String PAGAMENTI_SENZA_RPT = Costanti.PAGAMENTI_SENZA_RPT_KEY; public static final String MARCA_DA_BOLLO = Costanti.MARCA_DA_BOLLO_KEY; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); private Format formatW = null; public EstrattoConto(BasicBD bd) { super(bd); try { // Setto le properties di scrittura FormatReader formatWriter = new FormatReader(CSVSerializerProperties.getInstance(log).getProperties()); this.formatW = formatWriter.getFormat(); } catch (Exception e) { log.error("Errore durante l'inizializzazione di EstrattoConto: " + e.getMessage(), e); } } public String creaEstrattiContoSuFileSystem() throws Exception { List<String> response = new ArrayList<String>(); GpContext ctx = GpThreadLocal.get(); FileOutputStream fos; FileOutputStream fosPdf = null; Printer printer = null; int numeroMesi = GovpayConfig.getInstance().getNumeroMesiEstrattoConto(); ctx.getContext().getRequest().addGenericProperty(new Property("numeroMesi", numeroMesi + "")); ctx.log("estrattoConto.inizioProcedura"); String basePdfPath = null; File basePdfDir = null; try { //controllo directory base String basePath = GovpayConfig.getInstance().getPathEstrattoConto(); if (StringUtils.isEmpty(basePath)) { throw new Exception( "Directory di export non impostata, impossibile eseguire la generazione degli Estratti Conto."); } File baseDir = new File(basePath); if (!baseDir.exists()) { throw new Exception("Directory di export (" + basePath + ") non presente, impossibile eseguire la generazione degli Estratti Conto."); } // pdf boolean creaFilePdf = GovpayConfig.getInstance().isBatchEstrattoContoPdf(); String pathLoghi = null; if (creaFilePdf) { //controllo directory base basePdfPath = GovpayConfig.getInstance().getPathEstrattoContoPdf(); if (StringUtils.isEmpty(basePdfPath)) { throw new Exception( "Directory di export PDf non impostata, impossibile eseguire la generazione degli Estratti Conto PDF."); } basePdfDir = new File(basePdfPath); if (!basePdfDir.exists()) { throw new Exception("Directory di export PDF (" + basePdfPath + ") non presente, impossibile eseguire la generazione degli Estratti Conto in formato PDF."); } pathLoghi = GovpayConfig.getInstance().getPathEstrattoContoPdfLoghi(); } // prelevo la lista dei domini registrati DominiBD dominiBD = new DominiBD(this); DominioFilter dominiFilter = dominiBD.newFilter(); List<FilterSortWrapper> filterSortList = new ArrayList<FilterSortWrapper>(); FilterSortWrapper fsw = new FilterSortWrapper(); fsw.setField(Dominio.model().COD_DOMINIO); fsw.setSortOrder(SortOrder.ASC); filterSortList.add(fsw); dominiFilter.setFilterSortList(filterSortList); List<it.govpay.bd.model.Dominio> domini = dominiBD.findAll(dominiFilter); SimpleDateFormat f2 = new SimpleDateFormat("yyyy_MM"); SimpleDateFormat f3 = new SimpleDateFormat("yyyy/MM"); int giornoEsecuzione = GovpayConfig.getInstance().getGiornoEsecuzioneEstrattoConto(); // Controllo se ho passato il giorno di esecuzione, altrimenti il mese scorso non lo voglio. Calendar c = Calendar.getInstance(); boolean ignoraScorsoMese = c.get(Calendar.DAY_OF_MONTH) < giornoEsecuzione; // EstrattiContoBD EstrattiContoBD estrattiContoBD = new EstrattiContoBD(this); for (it.govpay.bd.model.Dominio dominio : domini) { String denominazioneDominio = dominio.getRagioneSociale() + " (" + dominio.getCodDominio() + ")"; ctx.log("estrattoConto.inizioDominio", denominazioneDominio); log.debug("Generazione Estratto Conto per il Dominio [" + denominazioneDominio + "] in corso..."); // 1 controllo esistenza directory con nome codDominio File dominioDir = new File(basePath + File.separator + dominio.getCodDominio()); if (!dominioDir.exists()) { log.debug("creo directory per il dominio [" + denominazioneDominio + "]: " + dominioDir.getAbsolutePath()); dominioDir.mkdir(); } Calendar cf = Calendar.getInstance(); Date df = new Date(); // inizializzazione del contatore mesi cf.setTime(df); cf.set(Calendar.MILLISECOND, 0); cf.set(Calendar.SECOND, 0); cf.set(Calendar.MINUTE, 0); cf.set(Calendar.HOUR_OF_DAY, 0); cf.set(Calendar.DAY_OF_MONTH, 1); cf.add(Calendar.MILLISECOND, -1); Calendar ci = Calendar.getInstance(); Date di = new Date(); // inizializzazione del contatore mesi ci.setTime(di); ci.set(Calendar.MILLISECOND, 0); ci.set(Calendar.SECOND, 0); ci.set(Calendar.MINUTE, 0); ci.set(Calendar.HOUR_OF_DAY, 0); ci.set(Calendar.DAY_OF_MONTH, 1); if (ignoraScorsoMese) { ci.add(Calendar.MONTH, -1); cf.add(Calendar.MONTH, -1); } response.add("Dominio " + denominazioneDominio + "#"); for (int contatoreMese = 0; contatoreMese < numeroMesi; contatoreMese++) { Map<String, Printer> ecPerIban = new HashMap<String, Printer>(); Map<String, List<it.govpay.model.EstrattoConto>> pagamentiPerIban = new HashMap<String, List<it.govpay.model.EstrattoConto>>(); StringBuilder sb = new StringBuilder(); // ad ogni iterazione tolgo un mese Date dataFine = cf.getTime(); ci.add(Calendar.MONTH, -1); Date dataInizio = ci.getTime(); log.debug("Generazione Estratto Conto per il Dominio [" + dominio.getCodDominio() + "] Intervallo Temporale dal [" + dataInizio + "] al [" + dataFine + "] ..."); int offset = 0; try { List<it.govpay.model.EstrattoConto> estrattoConto = estrattiContoBD .estrattoContoFromCodDominioIntervalloDate(dominio.getCodDominio(), dataInizio, dataFine, offset, LIMIT); List<it.govpay.model.EstrattoConto> listaPagamentiDaIncludereNelFileDominio = new ArrayList<it.govpay.model.EstrattoConto>(); while (estrattoConto != null && !estrattoConto.isEmpty()) { //aggiungo tutti i pagamenti per il file del dominio listaPagamentiDaIncludereNelFileDominio.addAll(estrattoConto); // suddivido i pagamenti per iban for (it.govpay.model.EstrattoConto pagamentoExt : estrattoConto) { String ibanAccredito = pagamentoExt.getIbanAccredito(); // l'iban e' null solo se ho una marca da bollo; if (ibanAccredito == null) ibanAccredito = MARCA_DA_BOLLO; // iban e' vuoto se proviene dalla tabella rendicontazioni senza rpt; if (ibanAccredito.isEmpty()) ibanAccredito = PAGAMENTI_SENZA_RPT; if (ibanAccredito != null) { if (creaFilePdf) { List<it.govpay.model.EstrattoConto> listaPagamentiEstrattoContoPerIban = null; if (pagamentiPerIban.containsKey(ibanAccredito)) { listaPagamentiEstrattoContoPerIban = pagamentiPerIban .get(ibanAccredito); } else { listaPagamentiEstrattoContoPerIban = new ArrayList<it.govpay.model.EstrattoConto>(); pagamentiPerIban.put(ibanAccredito, listaPagamentiEstrattoContoPerIban); } listaPagamentiEstrattoContoPerIban.add(pagamentoExt); } } } offset += estrattoConto.size(); estrattoConto = estrattiContoBD.estrattoContoFromCodDominioIntervalloDate( dominio.getCodDominio(), dataInizio, dataFine, offset, LIMIT); } for (String ibanAccredito : pagamentiPerIban.keySet()) { String esitoGenerazione = null; List<it.govpay.model.EstrattoConto> listaPagamentiDaIncludereNelFile = pagamentiPerIban .get(ibanAccredito); //ordinamento dei record Collections.sort(listaPagamentiDaIncludereNelFile, new EstrattoContoComparator()); String dominioPerIbanCsvFileName = dominio.getCodDominio() + "_" + ibanAccredito + "_" + f2.format(dataInizio) + ".csv"; log.debug("Nome del file CSV destinazione: " + dominioPerIbanCsvFileName); File dominioPerIbanFile = new File(basePath + File.separator + dominio.getCodDominio() + File.separator + dominioPerIbanCsvFileName); if (!dominioPerIbanFile.exists()) { sb.append("Generazione estratto conto per il mese " + f3.format(dataInizio) + " e per l'iban accredito [" + ibanAccredito + "] eseguita" + CSV_SEPARATOR); log.debug("creo il file CSV: " + dominioPerIbanFile.getAbsolutePath()); dominioPerIbanFile.createNewFile(); FileOutputStream fosIban = new FileOutputStream(dominioPerIbanFile); try { printer = new Printer(this.formatW, fosIban); printer.printRecord(CSVUtils.getEstrattoContoCsvHeader()); for (it.govpay.model.EstrattoConto pagamento : listaPagamentiDaIncludereNelFile) { printer.printRecord(CSVUtils.getEstrattoContoAsCsvRow(pagamento, this.sdf)); } } finally { try { if (printer != null) { printer.close(); } } catch (Exception e) { throw new Exception("Errore durante la chiusura dello stream ", e); } } } else { sb.append("Generazione estratto conto per il mese " + f3.format(dataInizio) + " e per l'iban accredito [" + ibanAccredito + "] non eseguita in quanto il file [" + dominioPerIbanFile.getPath() + "] esiste gia." + CSV_SEPARATOR); } //creazione pdf if (creaFilePdf) { boolean creaEstrattoContoPdf = true; log.debug("Generazione Estratto Conto in formato PDF per il Dominio [" + dominio.getCodDominio() + "] mese " + f3.format(dataInizio) + " e per l'iban accredito [" + ibanAccredito + "] ..."); // creo nome file csv nel formato codDominio_YYYY_MM.csv String dominioPdfFileName = dominio.getCodDominio() + "_" + ibanAccredito + "_" + f2.format(dataInizio) + ".pdf"; log.debug("Nome del file PDf destinazione: " + dominioPdfFileName); File dominioPdfFile = new File(basePdfPath + File.separator + dominio.getCodDominio() + File.separator + dominioPdfFileName); if (!dominioPdfFile.exists()) { log.debug("creo il file PDf: " + dominioPdfFile.getAbsolutePath()); dominioPdfFile.createNewFile(); fosPdf = new FileOutputStream(dominioPdfFile); Anagrafica anagraficaDominio = dominio.getAnagrafica(this); esitoGenerazione = EstrattoContoPdf.getPdfEstrattoConto(pathLoghi, dominio, anagraficaDominio, dataInizio, dataFine, ibanAccredito, listaPagamentiDaIncludereNelFile, fosPdf, log); } else { creaEstrattoContoPdf = false; } if (creaEstrattoContoPdf) { sb.append("Generazione estratto conto in formato PDF per il mese " + f3.format(dataInizio) + " e per l'iban accredito [" + ibanAccredito + "] eseguita correttamente") .append("#generato file " + dominioPdfFileName + "." + CSV_SEPARATOR); if (esitoGenerazione != null) { sb.append("Attenzione") .append("# " + esitoGenerazione + "." + CSV_SEPARATOR); } ctx.log("estrattoConto.fineDominioMeseOk", denominazioneDominio, f3.format(dataInizio), listaPagamentiDaIncludereNelFile.size() + "", dominioPdfFileName); } else { sb.append("Generazione estratto conto in formato PDF per il mese " + f3.format(dataInizio) + " e per l'iban accredito [" + ibanAccredito + "] non eseguita") .append("#il file " + dominioPdfFileName + " e' gia' presente." + CSV_SEPARATOR); ctx.log("estrattoConto.fineDominioMeseFileGiaPresente", denominazioneDominio, f3.format(dataInizio), dominioPdfFileName); } } } // creo nome file csv nel formato codDominio_YYYY_MM.csv String dominioCsvFileName = dominio.getCodDominio() + "_" + f2.format(dataInizio) + ".csv"; log.debug("Nome del file CSV destinazione: " + dominioCsvFileName); File dominioFile = new File(basePath + File.separator + dominio.getCodDominio() + File.separator + dominioCsvFileName); if (!dominioFile.exists()) { log.debug("creo il file CSV: " + dominioFile.getAbsolutePath()); dominioFile.createNewFile(); // per ogni mese fino al quello indicato nelle properties calcolo l'estratto conto fos = new FileOutputStream(dominioFile); try { printer = new Printer(this.formatW, fos); printer.printRecord(CSVUtils.getEstrattoContoCsvHeader()); for (it.govpay.model.EstrattoConto pagamento : listaPagamentiDaIncludereNelFileDominio) { printer.printRecord(CSVUtils.getEstrattoContoAsCsvRow(pagamento, this.sdf)); } } finally { try { if (printer != null) { printer.close(); } } catch (Exception e) { throw new Exception("Errore durante la chiusura dello stream ", e); } } sb.append("Generazione estratto conto per il mese " + f3.format(dataInizio) + " eseguita correttamente") .append("#serializzati " + offset + " pagamenti sul file " + dominioCsvFileName + "."); ctx.log("estrattoConto.fineDominioMeseOk", denominazioneDominio, f3.format(dataInizio), offset + "", dominioCsvFileName); } else { sb.append("Generazione estratto conto per il mese " + f3.format(dataInizio) + " non eseguita") .append("#il file " + dominioCsvFileName + " e' gia' presente."); ctx.log("estrattoConto.fineDominioMeseFileGiaPresente", denominazioneDominio, f3.format(dataInizio), dominioCsvFileName); } } finally { try { if (printer != null) { printer.close(); } } catch (Exception e) { throw new Exception("Errore durante la chiusura dello stream ", e); } for (Printer printerIban : ecPerIban.values()) try { if (printerIban != null) { printerIban.close(); } } catch (Exception e) { throw new Exception("Errore durante la chiusura dello stream ", e); } try { if (fosPdf != null) { fosPdf.close(); } } catch (Exception e) { throw new Exception("Errore durante la chiusura dello stream ", e); } } log.debug("Estratto Conto per il Dominio [" + denominazioneDominio + "] completato con esito: " + sb.toString()); response.add(sb.toString()); cf.add(Calendar.MONTH, -1); } ctx.log("estrattoConto.fineDominio", denominazioneDominio); } if (response.isEmpty()) { ctx.log("estrattoConto.fineProceduraNoDomini"); return "Estratto Conto completato#Nessun Dominio Registrato."; } else { ctx.log("estrattoConto.fineProceduraOk"); return StringUtils.join(response, CSV_SEPARATOR); } } catch (Exception e) { ctx.log("estrattoConto.erroreProcedura", e.getMessage()); log.error(e, e); throw e; } finally { } } public List<EstrattoContoMetadata> getListaEstrattoConto(String codDominio, String formatoFile) throws Exception { List<EstrattoContoMetadata> response = new ArrayList<EstrattoContoMetadata>(); GpContext ctx = GpThreadLocal.get(); int numeroMesi = GovpayConfig.getInstance().getNumeroMesiEstrattoConto(); ctx.getContext().getRequest().addGenericProperty(new Property("numeroMesi", numeroMesi + "")); ctx.log("estrattoConto.listaEstrattoContoDominio"); try { //controllo directory base String basePath = GovpayConfig.getInstance().getPathEstrattoConto(); if (StringUtils.isEmpty(basePath)) { throw new Exception( "Directory di export non impostata, impossibile trovare la lista degli Estratto Conto per il dominio [" + codDominio + "]."); } File baseDir = new File(basePath); if (!baseDir.exists()) { throw new Exception( "Directory di export non presente, impossibile trovare la lista degli Estratto Conto per il dominio [" + codDominio + "]."); } // controllo esistenza dominio DominiBD dominiBD = new DominiBD(this); it.govpay.model.Dominio dominio = dominiBD.getDominio(codDominio); String denominazioneDominio = dominio.getRagioneSociale() + " (" + dominio.getCodDominio() + ")"; // 1 controllo esistenza directory con nome codDominio File dominioDir = new File(basePath + File.separator + dominio.getCodDominio()); if (!dominioDir.exists()) { log.debug("creo directory per il dominio [" + denominazioneDominio + "]: " + dominioDir.getAbsolutePath()); dominioDir.mkdir(); } for (File file : dominioDir.listFiles()) { EstrattoContoMetadata estrattoContoFromJson = getEstrattoContoFromJson(dominio.getCodDominio(), file.getName()); // restituisco solo quelli del formato scelto if (formatoFile.equals(EstrattoContoMetadata.FORMATO_STAR) || estrattoContoFromJson.getFormato().equals(formatoFile)) response.add(estrattoContoFromJson); } if (response.isEmpty()) { ctx.log("estrattoConto.listaEstrattoContoDominioVuota"); } else { Collections.sort(response, new EstrattoContoMetadataComparator()); ctx.log("estrattoConto.listaEstrattoContoDominioOk"); } return response; } catch (NotFoundException e) { ctx.log("estrattoConto.listaEstrattoContoDominioKo", e.getMessage()); throw new Exception("Dominio [" + codDominio + "] non registrato in GovPay."); } catch (Exception e) { ctx.log("estrattoConto.listaEstrattoContoDominioKo", e.getMessage()); log.error(e, e); throw e; } finally { } } public InputStream scaricaEstrattoConto(String codDominio, String nomeFile, String formatoFile) throws Exception { InputStream response = null; GpContext ctx = GpThreadLocal.get(); int numeroMesi = GovpayConfig.getInstance().getNumeroMesiEstrattoConto(); ctx.getContext().getRequest().addGenericProperty(new Property("numeroMesi", numeroMesi + "")); ctx.log("estrattoConto.scaricaEstrattoContoDominio"); try { //controllo directory base String basePath = GovpayConfig.getInstance().getPathEstrattoConto(); if (StringUtils.isEmpty(basePath)) { throw new Exception("Directory di export non impostata, impossibile scaricare l'Estratto Conto [" + nomeFile + "] per il dominio [" + codDominio + "]."); } File baseDir = new File(basePath); if (!baseDir.exists()) { throw new Exception("Directory di export non impostata, impossibile scaricare l'Estratto Conto [" + nomeFile + "] per il dominio [" + codDominio + "]."); } // controllo esistenza dominio DominiBD dominiBD = new DominiBD(this); it.govpay.model.Dominio dominio = dominiBD.getDominio(codDominio); String denominazioneDominio = dominio.getRagioneSociale() + " (" + dominio.getCodDominio() + ")"; // 1 controllo esistenza directory con nome codDominio File dominioDir = new File(basePath + File.separator + dominio.getCodDominio()); if (!dominioDir.exists()) { throw new Exception("Directory di contenente gli Estratto Conto per il dominio [" + denominazioneDominio + "] non presente."); } String fileToDownload = basePath + File.separator + dominio.getCodDominio() + File.separator + nomeFile; // per ora si gestisce solo il formato CSV // String extension = ".csv"; // if(formatoFile != null && formatoFile.equals(FORMATO_PDF)) // extension = ".pdf"; //+ extension File estrattoConto = new File((fileToDownload)); if (!estrattoConto.exists() || estrattoConto.isDirectory()) { throw new Exception("Il file richiesto [" + nomeFile + "] per il Dominio [" + codDominio + "] non e' disponibile in formato [" + formatoFile + "]."); } response = new FileInputStream(estrattoConto); ctx.log("estrattoConto.scaricaEstrattoContoDominioOk"); return response; } catch (NotFoundException e) { ctx.log("estrattoConto.listaEstrattoContoDominioKo", e.getMessage()); throw new Exception("Dominio [" + codDominio + "] non registrato in GovPay."); } catch (Exception e) { ctx.log("estrattoConto.scaricaEstrattoContoDominioKo", e.getMessage()); log.error(e, e); throw e; } finally { } } private EstrattoContoMetadata getEstrattoContoFromJson(String codDominio, String fileName) { EstrattoContoMetadata estrattoConto = new EstrattoContoMetadata(); estrattoConto.setCodDominio(codDominio); estrattoConto.setNomeFile(fileName); try { // decodificare l'estensione del file String extension = FilenameUtils.getExtension(fileName); estrattoConto.setFormato(extension); fileName = FilenameUtils.removeExtension(fileName); String[] split = fileName.split("_"); if (split != null && split.length > 0) { boolean formatoOk = false; // formato Nome file codDominio_anno_mese if (split.length == 3) { estrattoConto.setAnno(Integer.parseInt(split[1])); estrattoConto.setMese(Integer.parseInt(split[2])); formatoOk = true; } // formato Nome file codDominio_iban_anno_mese if (split.length == 4) { estrattoConto.setIbanAccredito(split[1]); estrattoConto.setAnno(Integer.parseInt(split[2])); estrattoConto.setMese(Integer.parseInt(split[3])); formatoOk = true; } if (formatoOk) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.MILLISECOND, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.MONTH, estrattoConto.getMese() - 1); cal.set(Calendar.YEAR, estrattoConto.getAnno()); estrattoConto.setMeseAnno(this.f3.format(cal.getTime())); } else { log.debug("Formato nome del file [" + fileName + "] non valido, impossibile identificare mese/anno dell'estratto conto."); } } } catch (Exception e) { log.error(e.getMessage(), e); } return estrattoConto; } public List<it.govpay.core.business.model.EstrattoConto> getEstrattoContoVersamenti( List<it.govpay.core.business.model.EstrattoConto> inputEstrattoConto, String pathLoghi) throws Exception { log.debug("Generazione dei PDF estratto Conto in corso..."); try { EstrattiContoBD estrattiContoBD = new EstrattiContoBD(this); for (it.govpay.core.business.model.EstrattoConto estrattoConto : inputEstrattoConto) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] in corso..."); Map<String, List<it.govpay.model.EstrattoConto>> pagamentiPerIban = new HashMap<String, List<it.govpay.model.EstrattoConto>>(); int offset = 0; log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] aggregazione dei dati in corso..."); List<it.govpay.model.EstrattoConto> lstEstrattoConto = estrattiContoBD .estrattoContoFromCodDominioIdVersamenti(estrattoConto.getDominio().getCodDominio(), estrattoConto.getIdVersamenti(), offset, LIMIT); while (lstEstrattoConto != null && !lstEstrattoConto.isEmpty()) { for (it.govpay.model.EstrattoConto pagamentoExt : lstEstrattoConto) { String ibanAccredito = pagamentoExt.getIbanAccredito(); // l'iban e' null solo se ho una marca da bollo; if (ibanAccredito == null) ibanAccredito = MARCA_DA_BOLLO; // iban e' vuoto se proviene dalla tabella rendicontazioni senza rpt; if (ibanAccredito.isEmpty()) ibanAccredito = PAGAMENTI_SENZA_RPT; if (ibanAccredito != null) { List<it.govpay.model.EstrattoConto> estrattoContoPdf = null; if (pagamentiPerIban.containsKey(ibanAccredito)) { estrattoContoPdf = pagamentiPerIban.get(ibanAccredito); } else { estrattoContoPdf = new ArrayList<it.govpay.model.EstrattoConto>(); pagamentiPerIban.put(ibanAccredito, estrattoContoPdf); } estrattoContoPdf.add(pagamentoExt); } } offset += lstEstrattoConto.size(); lstEstrattoConto = estrattiContoBD.estrattoContoFromCodDominioIdVersamenti( estrattoConto.getDominio().getCodDominio(), estrattoConto.getIdVersamenti(), offset, LIMIT); } log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] aggregazione dei dati completata."); for (String ibanAccredito : pagamentiPerIban.keySet()) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF in corso..."); String esitoGenerazione = null; List<it.govpay.model.EstrattoConto> estrattoContoPdf = pagamentiPerIban.get(ibanAccredito); log.debug("Generazione Estratto Conto in formato PDF per il Dominio [" + estrattoConto.getDominio().getCodDominio() + "] Versamenti ID [" + estrattoConto.getIdVersamenti() + " e per l'iban accredito [" + ibanAccredito + "] ..."); // creo nome file csv nel formato codDominio_IbanAccredito.csv String dominioPdfFileName = estrattoConto.getDominio().getCodDominio() + "_" + ibanAccredito + ".pdf"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); Anagrafica anagraficaDominio = estrattoConto.getDominio().getAnagrafica(this); //ordinamento record Collections.sort(estrattoContoPdf, new EstrattoContoComparator()); esitoGenerazione = EstrattoContoPdf.getPdfEstrattoConto(pathLoghi, estrattoConto.getDominio(), anagraficaDominio, null, null, ibanAccredito, estrattoContoPdf, baos, log); // salvo il risultato nella base dati estrattoConto.getOutput().put(dominioPdfFileName, baos); if (esitoGenerazione != null) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF completata con Warning: " + esitoGenerazione + "."); } else { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF completata senza Warning."); } } log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], Versamenti selezionati [" + estrattoConto.getIdVersamenti() + "] completata."); } log.debug("Generazione dei PDF estratto Conto in completata."); return inputEstrattoConto; } catch (Exception e) { log.error(e, e); throw e; } } public List<it.govpay.core.business.model.EstrattoConto> getEstrattoContoPagamenti( List<it.govpay.core.business.model.EstrattoConto> inputEstrattoConto, String pathLoghi) throws Exception { log.debug("Generazione dei PDF estratto Conto in corso..."); try { EstrattiContoBD estrattiContoBD = new EstrattiContoBD(this); for (it.govpay.core.business.model.EstrattoConto estrattoConto : inputEstrattoConto) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] in corso..."); Map<String, List<it.govpay.model.EstrattoConto>> pagamentiPerIban = new HashMap<String, List<it.govpay.model.EstrattoConto>>(); int offset = 0; log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] aggregazione dei dati in corso..."); List<it.govpay.model.EstrattoConto> lstEstrattoConto = estrattiContoBD .estrattoContoFromCodDominioIdSingoliVersamenti(estrattoConto.getDominio().getCodDominio(), estrattoConto.getIdSingoliVersamenti(), offset, LIMIT); while (lstEstrattoConto != null && !lstEstrattoConto.isEmpty()) { for (it.govpay.model.EstrattoConto pagamentoExt : lstEstrattoConto) { String ibanAccredito = pagamentoExt.getIbanAccredito(); // l'iban e' null solo se ho una marca da bollo; if (ibanAccredito == null) ibanAccredito = MARCA_DA_BOLLO; // iban e' vuoto se proviene dalla tabella rendicontazioni senza rpt; if (ibanAccredito.isEmpty()) ibanAccredito = PAGAMENTI_SENZA_RPT; if (ibanAccredito != null) { List<it.govpay.model.EstrattoConto> estrattoContoPdf = null; if (pagamentiPerIban.containsKey(ibanAccredito)) { estrattoContoPdf = pagamentiPerIban.get(ibanAccredito); } else { estrattoContoPdf = new ArrayList<it.govpay.model.EstrattoConto>(); pagamentiPerIban.put(ibanAccredito, estrattoContoPdf); } estrattoContoPdf.add(pagamentoExt); } } offset += lstEstrattoConto.size(); lstEstrattoConto = estrattiContoBD.estrattoContoFromCodDominioIdSingoliVersamenti( estrattoConto.getDominio().getCodDominio(), estrattoConto.getIdSingoliVersamenti(), offset, LIMIT); } log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] aggregazione dei dati completata."); for (String ibanAccredito : pagamentiPerIban.keySet()) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF in corso..."); String esitoGenerazione = null; List<it.govpay.model.EstrattoConto> estrattoContoPdf = pagamentiPerIban.get(ibanAccredito); log.debug("Generazione Estratto Conto in formato PDF per il Dominio [" + estrattoConto.getDominio().getCodDominio() + "] SingoliVersamenti ID [" + estrattoConto.getIdSingoliVersamenti() + " e per l'iban accredito [" + ibanAccredito + "] ..."); // creo nome file csv nel formato codDominio_IbanAccredito.csv String dominioPdfFileName = estrattoConto.getDominio().getCodDominio() + "_" + ibanAccredito + ".pdf"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); Anagrafica anagraficaDominio = estrattoConto.getDominio().getAnagrafica(this); //ordinamento record Collections.sort(estrattoContoPdf, new EstrattoContoComparator()); esitoGenerazione = EstrattoContoPdf.getPdfEstrattoConto(pathLoghi, estrattoConto.getDominio(), anagraficaDominio, null, null, ibanAccredito, estrattoContoPdf, baos, log); // salvo il risultato nella base dati estrattoConto.getOutput().put(dominioPdfFileName, baos); if (esitoGenerazione != null) { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF completata con Warning: " + esitoGenerazione + "."); } else { log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdSingoliVersamenti() + "] IBAN [" + ibanAccredito + "] scrittura PDF completata senza Warning."); } } log.debug("Generazione dei PDF estratto Conto per il dominio [" + estrattoConto.getDominio().getCodDominio() + "], SingoliVersamenti selezionati [" + estrattoConto.getIdVersamenti() + "] completata."); } log.debug("Generazione dei PDF estratto Conto in completata."); return inputEstrattoConto; } catch (Exception e) { log.error(e, e); throw e; } } }