From c250a4a548e405b6981b1a3a6d9ae3b7268c38fe Mon Sep 17 00:00:00 2001 From: "luis.espina" Date: Thu, 29 Aug 2024 14:14:49 -0400 Subject: [PATCH 1/5] Se agrega informe PDF a Informe de viajes ocasionales #AL-4555 --- ...meViajesOcasionalesExpresosController.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/expressos/InformeViajesOcasionalesExpresosController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/expressos/InformeViajesOcasionalesExpresosController.java index 9d1848b9e..de592f309 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/expressos/InformeViajesOcasionalesExpresosController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/expressos/InformeViajesOcasionalesExpresosController.java @@ -1,34 +1,38 @@ package com.rjconsultores.ventaboletos.web.gui.controladores.expressos; -import java.util.ArrayList; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; -import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; +import org.zkoss.util.media.AMedia; import org.zkoss.util.resource.Labels; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; +import org.zkoss.zul.Filedownload; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Paging; -import com.rjconsultores.ventaboletos.entidad.SolicitudExpreso; import com.rjconsultores.ventaboletos.entidad.TrayectosExpresos; -import com.rjconsultores.ventaboletos.service.SolicitudExpresosService; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioInformeViajesOcasionalesPdf; import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.web.utilerias.MyDatebox; import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer; import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject; import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper; -import com.rjconsultores.ventaboletos.web.utilerias.render.RenderExpresosPorCotizar; import com.rjconsultores.ventaboletos.web.utilerias.render.RenderInformeViajesOcasionales; @Controller("informeViajesOcasionalesExpresosController") @Scope("prototype") public class InformeViajesOcasionalesExpresosController extends MyGenericForwardComposer{ + private static final String NOME_RELATORIO = "informeViajesOcasionales"; private static final long serialVersionUID = 1L; @Autowired @@ -83,6 +87,26 @@ public class InformeViajesOcasionalesExpresosController extends MyGenericForward public void onClick$btnImprimir(Event ev) throws InterruptedException {} + public void onClick$btnExportarPdf(Event ev) throws SQLException, Exception { + excutarInformeViajes(true); + } + + private void excutarInformeViajes(boolean isPdf)throws SQLException, Exception { + RelatorioInformeViajesOcasionalesPdf r = new RelatorioInformeViajesOcasionalesPdf(expresosList); + InputStream mediais = new ByteArrayInputStream(r.generateReportRender(isPdf)); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm"); + String nomeRelatorioDownload = NOME_RELATORIO + "_" + sdf.format(Calendar.getInstance().getTime()); + + if(isPdf) { + AMedia conteudoRelatorioXLS = new AMedia("relatorio.pdf", "pdf", null, mediais); + Filedownload.save(conteudoRelatorioXLS.getStreamData(), "application/pdf", nomeRelatorioDownload + ".pdf"); + }else { + AMedia conteudoRelatorioXLS = new AMedia("relatorio.xls", "xls", null, mediais); + Filedownload.save(conteudoRelatorioXLS.getStreamData(), "application/xls", nomeRelatorioDownload + ".xls"); + } + + } + public MyListbox getExpresosList() { return expresosList; } From cd6c1571890a2e1f450c837de50aaa11988cf9cf Mon Sep 17 00:00:00 2001 From: "luis.espina" Date: Thu, 29 Aug 2024 14:22:19 -0400 Subject: [PATCH 2/5] Se agrega Clase para generar PDF de informe de viajes ocasionales --- .../impl/RelatorioInformeViajesOcasionalesPdf.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java new file mode 100644 index 000000000..98bf111da --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java @@ -0,0 +1,5 @@ +package com.rjconsultores.ventaboletos.relatorios.impl; + +public class RelatorioInformeViajesOcasionalesPdf { + +} From cd3547bf22c07e75bf3b8ebb01d23ad3f02a94f5 Mon Sep 17 00:00:00 2001 From: "luis.espina" Date: Thu, 29 Aug 2024 14:23:50 -0400 Subject: [PATCH 3/5] Se Agregan funcionalidades --- .../RelatorioInformeViajesOcasionalesPdf.java | 330 +++++++++++++++++- 1 file changed, 329 insertions(+), 1 deletion(-) diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java index 98bf111da..e6a1c5077 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioInformeViajesOcasionalesPdf.java @@ -1,5 +1,333 @@ package com.rjconsultores.ventaboletos.relatorios.impl; -public class RelatorioInformeViajesOcasionalesPdf { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listhead; +import org.zkoss.zul.Listheader; + +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; + +import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRLineBox; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.data.JRMapCollectionDataSource; +import net.sf.jasperreports.engine.design.JRDesignBand; +import net.sf.jasperreports.engine.design.JRDesignConditionalStyle; +import net.sf.jasperreports.engine.design.JRDesignExpression; +import net.sf.jasperreports.engine.design.JRDesignField; +import net.sf.jasperreports.engine.design.JRDesignLine; +import net.sf.jasperreports.engine.design.JRDesignSection; +import net.sf.jasperreports.engine.design.JRDesignStaticText; +import net.sf.jasperreports.engine.design.JRDesignStyle; +import net.sf.jasperreports.engine.design.JRDesignTextField; +import net.sf.jasperreports.engine.design.JRDesignVariable; +import net.sf.jasperreports.engine.design.JasperDesign; +import net.sf.jasperreports.engine.export.JExcelApiExporter; +import net.sf.jasperreports.engine.export.JExcelApiExporterParameter; +import net.sf.jasperreports.engine.export.JRPdfExporter; +import net.sf.jasperreports.engine.export.JRPdfExporterParameter; +import net.sf.jasperreports.engine.export.JRXlsExporterParameter; +import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter; +import net.sf.jasperreports.engine.type.HorizontalAlignEnum; +import net.sf.jasperreports.engine.type.VerticalAlignEnum; +import net.sf.jasperreports.engine.type.WhenNoDataTypeEnum; + +public class RelatorioInformeViajesOcasionalesPdf { + +// private static Logger log = LogManager.getLogger(RelatorioDispositivoEmbarcada.class); + public MyListbox viajeExpresosList; + + public RelatorioInformeViajesOcasionalesPdf(final MyListbox expresosList) throws Exception { + this.viajeExpresosList = expresosList; + + } + + public File generateReport(boolean isPdf) throws JRException, IOException { + + System.setProperty("jasper.reports.compile.class.path", System.getProperty("java.io.tmpdir")); + + JasperDesign jasperDesign = createDesign(); + JasperReport jasperReport = JasperCompileManager + .compileReport(jasperDesign); + + File file = null; + + JRDataSource jrDataSource = prepareDataSource(); + Map params = new HashMap(); + + JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, + params, jrDataSource); + + if (isPdf) { + file = File.createTempFile("pdf", ".pdf"); + + if (!file.exists()) { + file.mkdir(); + file.setWritable(true); + } + + JRPdfExporter exporter = new JRPdfExporter(); + exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRPdfExporterParameter.OUTPUT_FILE_NAME, file.getPath()); + exporter.exportReport(); + } else { + file = File.createTempFile("xlsx", ".xlsx"); + + if (!file.exists()) { + file.mkdir(); + file.setWritable(true); + } + + JRXlsxExporter exporter = new JRXlsxExporter(); + exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); + exporter.setParameter(JRXlsExporterParameter.OUTPUT_FILE_NAME, file.getPath()); + exporter.exportReport(); + } + return file; + + } + + public byte[] generateReportRender(boolean isPdf) throws Exception { + + System.setProperty("jasper.reports.compile.class.path", System.getProperty("java.io.tmpdir")); + System.setProperty("net.sf.jasperreports.compiler.temp.dir", System.getProperty("java.io.tmpdir")); + + JasperDesign jasperDesign = createDesign(); + JasperReport jasperReport = JasperCompileManager + .compileReport(jasperDesign); + + byte[] conteudo = null; + + JRDataSource jrDataSource = prepareDataSource(); + Map params = new HashMap(); + + JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, + params, jrDataSource); + + if (isPdf) { + conteudo = this.renderPdf(jasperPrint); + } else { + conteudo = this.renderXls(false, jasperPrint); + } + return conteudo; + + } + + private JRDataSource prepareDataSource() { + List> preparedData = new ArrayList>(); + Map map; + map = new HashMap(); + Boolean isValid = viajeExpresosList.getPaginal() != null; + Integer paginaActual = isValid ? viajeExpresosList.getPaginal().getActivePage() : null; + + if (isValid) { + for (int i = 0; i < viajeExpresosList.getPaginal().getPageCount(); i++) { + viajeExpresosList.getPaginal().setActivePage(i); + viajeExpresosList.renderAll(); + } + } + + for (Integer i = 0; i < viajeExpresosList.getSize(); i++) { + List list = viajeExpresosList.getItemAtIndex(i).getChildren(); + + map = new HashMap(); + for (Integer j = 0; j < list.size(); j++) { + Listcell linha = (Listcell) list.get(j); + map.put(j.toString(),linha.getLabel()); + } + preparedData.add(map); + } + + if (isValid && paginaActual != null) { + viajeExpresosList.getPaginal().setActivePage(paginaActual); + } + + return new JRMapCollectionDataSource(preparedData); + } + + public JasperDesign createDesign() throws JRException { + + JRDesignStaticText staticText = null; + + JRDesignTextField textField = null; + + JRDesignBand band = null; + + JRDesignExpression expression = null; + + @SuppressWarnings("unused") + JRDesignLine line = null; + + JRDesignField field = null; + + @SuppressWarnings("unused") + JRDesignConditionalStyle conditionalStyle = null; + + JRLineBox lineBox = null; + + JRDesignVariable variable = null; + + int x; + int y; + final int ROW_HEIGHT = 15; + final int COLUMN_WIDTH = 90; + + JasperDesign jasperDesign = new JasperDesign(); + jasperDesign.setName("Aba 1"); + jasperDesign.setPageWidth(1200); + jasperDesign.setPageHeight(800); + jasperDesign.setColumnWidth(COLUMN_WIDTH); + jasperDesign.setColumnSpacing(0); + jasperDesign.setLeftMargin(40); + jasperDesign.setRightMargin(40); + jasperDesign.setTopMargin(40); + jasperDesign.setBottomMargin(40); + jasperDesign.setIgnorePagination(true); + jasperDesign.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL); + + JRDesignStyle normalStyle = new JRDesignStyle(); + normalStyle.setName("normal"); + normalStyle.setDefault(true); + normalStyle.setFontName("SansSerif"); + normalStyle.setFontSize((int) 7.5f); + lineBox = normalStyle.getLineBox(); + lineBox.getTopPen().setLineWidth(0.5f); + lineBox.getRightPen().setLineWidth(0.5f); + lineBox.getBottomPen().setLineWidth(0.5f); + lineBox.getLeftPen().setLineWidth(0.5f); + jasperDesign.addStyle(normalStyle); + + JRDesignStyle headerStyle = new JRDesignStyle(); + headerStyle.setName("header"); + headerStyle.setDefault(true); + headerStyle.setFontName("SansSerif"); + headerStyle.setFontSize((int) 8.5f); + headerStyle.setBold(true); + lineBox = headerStyle.getLineBox(); + lineBox.getTopPen().setLineWidth(0.5f); + lineBox.getRightPen().setLineWidth(0.5f); + lineBox.getBottomPen().setLineWidth(0.5f); + lineBox.getLeftPen().setLineWidth(0.5f); + jasperDesign.addStyle(headerStyle); + + for (Integer i = 0; i < viajeExpresosList.getItemAtIndex(0).getChildren().size(); i++) { + field = new JRDesignField(); + field.setName(i.toString()); + field.setValueClass(java.lang.String.class); + jasperDesign.addField(field); + } + + band = new JRDesignBand(); + + jasperDesign.setTitle(band); + + x = 0; + y = 0; + band = new JRDesignBand(); + band.setHeight(ROW_HEIGHT); + + Listhead listHead = (Listhead) viajeExpresosList.getHeads().iterator().next(); + for (Iterator iterator = listHead.getChildren().iterator(); iterator.hasNext();) { + Listheader child = (Listheader) iterator.next(); + staticText = montaHeader(x, y, ROW_HEIGHT, COLUMN_WIDTH, headerStyle, child.getLabel()); + staticText.setVerticalAlignment(VerticalAlignEnum.JUSTIFIED); + band.addElement(staticText); + x += staticText.getWidth(); + } + + jasperDesign.setColumnHeader(band); + + + band = new JRDesignBand(); + band.setHeight(ROW_HEIGHT); + x = 0; + y = 0; + + + + for (Integer i = 0; i < viajeExpresosList.getItemAtIndex(0).getChildren().size(); i++) { + + textField = new JRDesignTextField(); + textField.setX(x); + textField.setY(y); + textField.setWidth(COLUMN_WIDTH); + textField.setHeight(ROW_HEIGHT); + textField.setStretchWithOverflow(true); + textField.setHorizontalAlignment(HorizontalAlignEnum.CENTER); + textField.setVerticalAlignment(VerticalAlignEnum.MIDDLE); + expression = new JRDesignExpression(); + expression.setText("$F{" + i.toString() + "}"); + textField.setExpression(expression); + textField.setStyle(normalStyle); + band.addElement(textField); + x += textField.getWidth(); + } + + ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band); + + band = new JRDesignBand(); + jasperDesign.setColumnFooter(band); + + band = new JRDesignBand(); + jasperDesign.setPageFooter(band); + + return jasperDesign; + } + + private static JRDesignStaticText montaHeader(int x, int y, final int ROW_HEIGHT, final int COLUMN_WIDTH, JRDesignStyle headerStyle, String nomeColuna) { + JRDesignStaticText staticText; + staticText = new JRDesignStaticText(); + staticText.setX(x); + staticText.setY(y); + staticText.setWidth(COLUMN_WIDTH); + staticText.setHeight(ROW_HEIGHT); + staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER); + staticText.setStyle(headerStyle); + staticText.setText(nomeColuna); + return staticText; + } + + + private byte[] renderXls(boolean isCustomXls, JasperPrint jasperPrint) throws Exception { + JExcelApiExporter exporterXLS = new JExcelApiExporter(); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + // As duas propriedades são para quando o arquivo xls chegar no máximo de linhas pular para a próxima aba do arquivo mantis #11294 + exporterXLS.setParameter(JExcelApiExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); + exporterXLS.setParameter(JExcelApiExporterParameter.MAXIMUM_ROWS_PER_SHEET, 65500); + + exporterXLS.setParameter(JExcelApiExporterParameter.JASPER_PRINT, jasperPrint); + exporterXLS.setParameter(JExcelApiExporterParameter.OUTPUT_STREAM, output); + + if (!isCustomXls) { + exporterXLS.setParameter(JExcelApiExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); + exporterXLS.setParameter(JExcelApiExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); + exporterXLS.setParameter(JExcelApiExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); + exporterXLS.setParameter(JExcelApiExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); + exporterXLS.setParameter(JExcelApiExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE); + } + + // collapseRowSpan + // JRXlsExporterParameter. + exporterXLS.exportReport(); + return output.toByteArray(); + } + + private byte[] renderPdf(JasperPrint jasperPrint) throws Exception { + return JasperExportManager.exportReportToPdf(jasperPrint); + } + } From 33ecf2478ae2195c955abb74ebe745f781d1ccdf Mon Sep 17 00:00:00 2001 From: "luis.espina" Date: Thu, 29 Aug 2024 14:24:59 -0400 Subject: [PATCH 4/5] Se Cambia el tipo de Boton, para generar PDF --- web/gui/expressos/informeViajesOcasionales.zul | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/gui/expressos/informeViajesOcasionales.zul b/web/gui/expressos/informeViajesOcasionales.zul index 42be31dfd..0b784521c 100644 --- a/web/gui/expressos/informeViajesOcasionales.zul +++ b/web/gui/expressos/informeViajesOcasionales.zul @@ -38,8 +38,9 @@