From 083ec07dcdd0b36d99562a627154cb518057e076 Mon Sep 17 00:00:00 2001 From: rodrigo Date: Fri, 26 Jul 2013 21:50:21 +0000 Subject: [PATCH] git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@29503 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../impl/RelatorioLinhaOperacional.java | 103 +++++-- .../render/RenderRelatorioJasper.java | 17 +- .../RelatorioLinhaOperacional.jasper | Bin 31466 -> 36992 bytes .../templates/RelatorioLinhaOperacional.jrxml | 263 ++++++++++++------ .../RelatorioLinhaOperacionalController.java | 132 +++++---- web/WEB-INF/i3-label_pt_BR.label | 7 +- .../filtroRelatorioLinhaOperacional.zul | 21 +- 7 files changed, 371 insertions(+), 172 deletions(-) diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhaOperacional.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhaOperacional.java index 1d35f1e60..9a6d6ab5f 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhaOperacional.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhaOperacional.java @@ -33,57 +33,106 @@ public class RelatorioLinhaOperacional extends Relatorio { EnumEspecie especie = (EnumEspecie) parametros.get("ESPECIE"); String dataDe = (String) parametros.get("DATA_DE"); + dataDe = dataDe + " 00:00:00"; String dataAte = (String) parametros.get("DATA_ATE"); + dataAte = dataAte + " 23:59:59"; + String linhasIds = (String) parametros.get("LINHAS"); String empresaId = (String) parametros.get("EMPRESA_IDS"); - String sql = getSql(especie, dataDe, dataAte, linhasIds, empresaId); + Boolean agruparPorDia = (Boolean) parametros.get("agruparPorDia"); + Boolean agruparPorMes = (Boolean) parametros.get("agruparPorMes"); + Boolean agruparPorAno = (Boolean) parametros.get("agruparPorAno"); + + Boolean desconsiderarBilhetesDevolvidos = (Boolean) parametros.get("desconsiderarBilhetesDevolvidos"); + + String sql = getSql(especie, dataDe, dataAte, linhasIds, empresaId, agruparPorDia, agruparPorMes, agruparPorAno, desconsiderarBilhetesDevolvidos); parametros.put("SQL", sql); parametros.put("STR_ESPECIE", especie.toString()); } - private String getSql(EnumEspecie especie, String dataDe, String dataAte, String linhasIds, String empresaId) { + private String getSql(EnumEspecie especie, String dataDe, String dataAte, String linhasIds, + String empresaId, Boolean agruparPorDia, Boolean agruparPorMes, Boolean agruparPorAno, + Boolean desconsiderarBilhetesDevolvidos) { StringBuilder sql = new StringBuilder(); - sql.append(" SELECT c.feccorrida data_corrida, "); - sql.append(" c.fechorsalida hora_saida, "); - sql.append(" r.descruta linha, "); - sql.append(" o.descparada origem, "); - sql.append(" d.descparada destino, "); - sql.append(" e.empresa_id empresaId, "); - sql.append(" e.nombempresa empresa, "); - sql.append(" Count(*) qtde_boletos "); + sql.append(" SELECT "); + sql.append(" ca.fechorventa data_venda, "); + sql.append(" c.corrida_id corrida_id, "); + sql.append(" c.feccorrida data_corrida, "); + sql.append(" r.NUMRUTA codigo, "); + sql.append(" r.PREFIXO prefixo, "); + sql.append(" c.fechorsalida hora_saida, "); + sql.append(" r.descruta linha, "); + sql.append(" o.descparada origem, "); + sql.append(" d.descparada destino, "); + sql.append(" e.empresa_id empresaId, "); + sql.append(" e.nombempresa empresa, "); + sql.append(" COUNT(*) qtde_boletos "); switch (especie) { case BILHETE: - sql.append(" FROM caja ca "); - sql.append(" INNER JOIN corrida c ON ( c.corrida_id = ca.corrida_id AND c.feccorrida = ca.feccorrida ) "); - sql.append(" INNER JOIN empresa e ON e.empresa_id = c.empresacorrida_id "); - sql.append(" INNER JOIN ruta r ON r.ruta_id = c.ruta_id "); - sql.append(" INNER JOIN parada o ON o.parada_id = ca.origen_id "); - sql.append(" INNER JOIN parada d ON d.parada_id = ca.destino_id "); - sql.append(" WHERE ca.fechorventa BETWEEN To_date('").append(dataDe).append("', 'dd/mm/yyyy') "); - sql.append(" AND To_date('").append(dataAte).append("', 'dd/mm/yyyy') "); - sql.append(" AND c.ruta_id IN (").append(linhasIds).append(") "); - sql.append(" AND ca.empresacorrida_id IN (").append(empresaId).append(") "); + sql.append(" FROM "); + sql.append(" ( SELECT "); + sql.append(" corrida_id, "); + sql.append(" origen_id, "); + sql.append(" destino_id, "); + sql.append(" feccorrida, "); + sql.append(" empresacorrida_id, "); + sql.append(" MOTIVOCANCELACION_ID, "); + if (agruparPorDia) { + sql.append(" TO_CHAR(fechorventa, 'dd/MM/yyyy') fechorventa "); + } else if (agruparPorMes) { + sql.append(" TO_CHAR(fechorventa, 'MM/yyyy') fechorventa "); + } else if (agruparPorAno) { + sql.append(" TO_CHAR(fechorventa, 'yyyy') fechorventa "); + } + sql.append(" FROM caja "); + sql.append(" WHERE fechorventa BETWEEN To_date('").append(dataDe).append("', 'dd/mm/yyyy HH24:mi:ss') "); + sql.append(" AND To_date('").append(dataAte).append("', 'dd/mm/yyyy HH24:mi:ss') "); + sql.append(" AND empresacorrida_id IN (").append(empresaId).append(") "); + sql.append(" )ca "); + sql.append(" INNER JOIN corrida c ON (c.corrida_id = ca.corrida_id AND c.feccorrida = ca.feccorrida) "); + sql.append(" INNER JOIN empresa e ON e.empresa_id = c.empresacorrida_id "); + sql.append(" INNER JOIN ruta r ON r.ruta_id = c.ruta_id "); + sql.append(" INNER JOIN parada o ON o.parada_id = ca.origen_id "); + sql.append(" INNER JOIN parada d ON d.parada_id = ca.destino_id "); break; case EXCESSO_BAGAGEM: - sql.append(" FROM caja_diversos ca "); + sql.append(" FROM "); + sql.append(" ( SELECT "); + sql.append(" eventoextra_id, "); + sql.append(" MOTIVOCANCELACION_ID, "); + if (agruparPorDia) { + sql.append(" TO_CHAR(FECHORVTA, 'dd/MM/yyyy') fechorventa "); + } else if (agruparPorMes) { + sql.append(" TO_CHAR(FECHORVTA, 'MM/yyyy') fechorventa "); + } else if (agruparPorAno) { + sql.append(" TO_CHAR(FECHORVTA, 'yyyy') fechorventa "); + } + sql.append(" FROM caja_diversos "); + sql.append(" WHERE FECHORVTA BETWEEN To_date('").append(dataDe).append("', 'dd/mm/yyyy HH24:mi:ss') "); + sql.append(" AND To_date('").append(dataAte).append("', 'dd/mm/yyyy HH24:mi:ss') "); + sql.append(" )ca "); sql.append(" INNER JOIN evento_extra ex ON ex.eventoextra_id = ca.eventoextra_id "); sql.append(" INNER JOIN corrida c ON ( c.corrida_id = ex.corrida_id AND c.feccorrida = ex.feccorrida ) "); sql.append(" INNER JOIN empresa e ON e.empresa_id = c.empresacorrida_id "); sql.append(" INNER JOIN ruta r ON r.ruta_id = c.ruta_id "); sql.append(" INNER JOIN parada o ON o.parada_id = c.origen_id "); sql.append(" INNER JOIN parada d ON d.parada_id = c.destino_id "); - sql.append(" WHERE ca.fechorvta BETWEEN To_date('").append(dataDe).append("', 'dd/mm/yyyy') "); - sql.append(" AND To_date('").append(dataAte).append("', 'dd/mm/yyyy') "); - sql.append(" AND c.ruta_id IN (").append(linhasIds).append(") "); - sql.append(" AND ex.empresa_id IN (").append(empresaId).append(") "); break; } - sql.append(" GROUP BY c.feccorrida, c.fechorsalida, r.descruta, o.descparada, d.descparada, e.empresa_id, e.nombempresa "); - sql.append(" ORDER BY c.feccorrida, e.nombempresa ASC "); + sql.append(" WHERE 1 = 1 "); + if (!linhasIds.equals("0")) { + sql.append(" AND c.ruta_id IN (").append(linhasIds).append(") "); + } + + if (desconsiderarBilhetesDevolvidos) { + sql.append(" AND ca.MOTIVOCANCELACION_ID IS NULL "); + } + sql.append("GROUP BY ca.fechorventa, c.corrida_id, c.feccorrida, r.NUMRUTA, r.PREFIXO, c.fechorsalida, r.descruta, o.descparada, d.descparada, e.empresa_id, e.nombempresa "); + sql.append("ORDER BY ca.fechorventa, e.nombempresa ASC "); return sql.toString(); } diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java index 6107b91cb..5da96b083 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java @@ -69,8 +69,7 @@ public class RenderRelatorioJasper { String diretorio = "/com/rjconsultores/ventaboletos/relatorios/templates/" + this.relatorio.getNome() + ".jasper"; InputStream iStemplate = this.getClass().getResourceAsStream(diretorio); - if (iStemplate == null) - { + if (iStemplate == null) { throw new Exception("Não foi possivel localizar o template do relátorio no diretorio a seguir: " + diretorio); } @@ -83,10 +82,10 @@ public class RenderRelatorioJasper { * * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.IRenderRelatorio#render() */ - + public byte[] render(SaidaRelatorio saida) throws Exception { this.preRender(); - + byte[] conteudo = null; if (this.jasperPrint == null) { @@ -115,17 +114,17 @@ public class RenderRelatorioJasper { protected byte[] renderXls() throws Exception { - JExcelApiExporter exporterXLS = new JExcelApiExporter(); + JExcelApiExporter exporterXLS = new JExcelApiExporter(); ByteArrayOutputStream output = new ByteArrayOutputStream(); exporterXLS.setParameter(JExcelApiExporterParameter.JASPER_PRINT, this.jasperPrint); exporterXLS.setParameter(JExcelApiExporterParameter.OUTPUT_STREAM, output); - exporterXLS.setParameter(JExcelApiExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); + 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); - - //collapseRowSpan - //JRXlsExporterParameter. + + // collapseRowSpan + // JRXlsExporterParameter. exporterXLS.exportReport(); return output.toByteArray(); diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jasper index 94f50186aa9a460ac0ccede05fc34165ece1271c..e8bc61233d68af42dd4851cbee11569415d149de 100644 GIT binary patch literal 36992 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 M2zzzy%J(SwKYB}H5C8xG literal 31466 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 W|FJ-!v*F&^gbqXu2J{Jn^#2F-)&*w( diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jrxml index 1799504a7..04ab7d458 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jrxml +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhaOperacional.jrxml @@ -1,8 +1,8 @@ - - - + + + @@ -10,6 +10,7 @@ + @@ -21,7 +22,14 @@ - + + + + + + + + @@ -29,80 +37,123 @@ + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + @@ -139,13 +190,6 @@ - - - - - - - @@ -161,6 +205,11 @@ + + + + + @@ -178,32 +227,84 @@ - + - - + + + + - - + + + + - - - - - - - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhaOperacionalController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhaOperacionalController.java index 0eb0984b5..b74eabb5c 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhaOperacionalController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhaOperacionalController.java @@ -19,10 +19,13 @@ import org.zkoss.util.resource.Labels; import org.zkoss.zhtml.Messagebox; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; +import org.zkoss.zul.Bandbox; +import org.zkoss.zul.Checkbox; import org.zkoss.zul.Combobox; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Datebox; import org.zkoss.zul.Paging; +import org.zkoss.zul.Radio; import org.zkoss.zul.Textbox; import com.rjconsultores.ventaboletos.entidad.Empresa; @@ -57,6 +60,11 @@ public class RelatorioLinhaOperacionalController extends MyGenericForwardCompose private Combobox cmbEmpresa; private Combobox cmbEspecie; private EnumSet lsEspecie; + private Bandbox bbPesquisaPuntoVenta; + private Radio rdAgruparPorDia; + private Radio rdAgruparPorMes; + private Radio rdAgruparPorAno; + private Checkbox chkBilhetesDevolvidos; public List getLsEmpresa() { return lsEmpresa; @@ -85,6 +93,8 @@ public class RelatorioLinhaOperacionalController extends MyGenericForwardCompose private void limparPesquisa() { rutaList.setData(new ArrayList()); + + bbPesquisaPuntoVenta.setText(getDescRutasSelecionadas()); } private void executarPesquisa() { @@ -117,64 +127,80 @@ public class RelatorioLinhaOperacionalController extends MyGenericForwardCompose executarPesquisa(); } + private String getDescRutasSelecionadas() { + List lsRutasSelecionadas = new ArrayList(Arrays.asList(rutaList.getSelectedsItens().toArray(new Ruta[rutaList.getSelectedsItens().size()]))); + StringBuilder selecionadas = new StringBuilder(""); + if (!lsRutasSelecionadas.isEmpty()) { + for (Ruta ruta : lsRutasSelecionadas) { + selecionadas.append(ruta.getDescruta()).append(", "); + } + } + + return selecionadas.toString(); + } + + public void onClick$bbPesquisaPuntoVenta(Event ev) { + bbPesquisaPuntoVenta.setText(getDescRutasSelecionadas()); + } + public void onClick$btnExecutarRelatorio(Event ev) throws InterruptedException, SQLException { List lsRutasSelecionadas = new ArrayList(Arrays.asList(rutaList.getSelectedsItens().toArray(new Ruta[rutaList.getSelectedsItens().size()]))); - if (!lsRutasSelecionadas.isEmpty()) { - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); - Date dataDe = datInicial.getValue(); - Date dataAte = datFinal.getValue(); + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + Date dataDe = datInicial.getValue(); + Date dataAte = datFinal.getValue(); - if (dataAte.after(dataDe)) { - Map parametros = new HashMap(); - parametros.put("DATA_DE", sdf.format(dataDe)); - parametros.put("DATA_ATE", sdf.format(dataAte)); + Map parametros = new HashMap(); + parametros.put("DATA_DE", sdf.format(dataDe)); + parametros.put("DATA_ATE", sdf.format(dataAte)); - String linhasIds = "0"; - for (int i = 0; i < lsRutasSelecionadas.size(); i++) { - Ruta ruta = lsRutasSelecionadas.get(i); - linhasIds = linhasIds + "," + ruta.getRutaId(); - } - parametros.put("LINHAS", linhasIds); - - Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem(); - String empresaId; - if (cbiEmpresa != null) { - Empresa empresa = (Empresa) cbiEmpresa.getValue(); - empresaId = empresa.getEmpresaId().toString(); - } else { - empresaId = "0"; - for (int i = 0; i < lsEmpresa.size(); i++) { - Empresa empresa = lsEmpresa.get(i); - empresaId = empresaId + "," + empresa.getEmpresaId(); - } - } - parametros.put("EMPRESA_IDS", empresaId); - - Comboitem cbiEspecie = cmbEspecie.getSelectedItem(); - if (cbiEspecie != null) { - EnumEspecie especie = (EnumEspecie) cbiEspecie.getValue(); - parametros.put("ESPECIE", especie); - } else { - parametros.put("ESPECIE", EnumEspecie.BILHETE); - } - - Relatorio relatorio = new RelatorioLinhaOperacional(parametros, dataSource.getConnection()); - - Map args = new HashMap(); - args.put("relatorio", relatorio); - - openWindow("/component/reportView.zul", - Labels.getLabel("relatorioLinhaOperacionalController.window.title"), args, MODAL); - } else { - Messagebox.show(Labels.getLabel("relatorioLinhaOperacionalController.MSG.datainvalida"), - Labels.getLabel("relatorioLinhaOperacionalController.window.title"), - Messagebox.OK, Messagebox.EXCLAMATION); - } - } else { - Messagebox.show(Labels.getLabel("relatorioLinhaOperacionalController.MSG.selecionarlinha"), - Labels.getLabel("relatorioLinhaOperacionalController.window.title"), - Messagebox.OK, Messagebox.INFORMATION); + String linhasIds = "0"; + for (int i = 0; i < lsRutasSelecionadas.size(); i++) { + Ruta ruta = lsRutasSelecionadas.get(i); + linhasIds = linhasIds + "," + ruta.getRutaId(); } + parametros.put("LINHAS", linhasIds); + parametros.put("DESC_LINHAS_SELECIONADAS", getDescRutasSelecionadas()); + + Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem(); + String empresaId; + if (cbiEmpresa != null) { + Empresa empresa = (Empresa) cbiEmpresa.getValue(); + empresaId = empresa.getEmpresaId().toString(); + } else { + empresaId = "0"; + for (int i = 0; i < lsEmpresa.size(); i++) { + Empresa empresa = lsEmpresa.get(i); + empresaId = empresaId + "," + empresa.getEmpresaId(); + } + } + parametros.put("EMPRESA_IDS", empresaId); + + Comboitem cbiEspecie = cmbEspecie.getSelectedItem(); + if (cbiEspecie != null) { + EnumEspecie especie = (EnumEspecie) cbiEspecie.getValue(); + parametros.put("ESPECIE", especie); + } else { + parametros.put("ESPECIE", EnumEspecie.BILHETE); + } + + Boolean agruparPorDia = rdAgruparPorDia.isSelected(); + Boolean agruparPorMes = rdAgruparPorMes.isSelected(); + Boolean agruparPorAno = rdAgruparPorAno.isSelected(); + + parametros.put("agruparPorDia", agruparPorDia); + parametros.put("agruparPorMes", agruparPorMes); + parametros.put("agruparPorAno", agruparPorAno); + + Boolean desconsiderarBilhetesDevolvidos = chkBilhetesDevolvidos.isChecked(); + parametros.put("desconsiderarBilhetesDevolvidos", desconsiderarBilhetesDevolvidos); + + Relatorio relatorio = new RelatorioLinhaOperacional(parametros, dataSource.getConnection()); + + Map args = new HashMap(); + args.put("relatorio", relatorio); + + openWindow("/component/reportView.zul", + Labels.getLabel("relatorioLinhaOperacionalController.window.title"), args, MODAL); } } diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 6a4ebfc79..9537606b5 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -7,7 +7,7 @@ # . . = XXX #Versao do VentaBoleto: -versao = ADM_20130726_1RC182 +versao = ADM_20130726_1RC183 # MSG Defaut: MSG.CONSTRAINT.PORCENTAGEM = Os valores devem estar entre 0 e 100 @@ -4349,6 +4349,11 @@ relatorioLinhaOperacionalController.chkAgruparAno.value = Ano relatorioLinhaOperacionalController.MSG.selecionarlinha = Selecione alguma linha para gerar o relatório. relatorioLinhaOperacionalController.MSG.datainvalida = Data de inicio não pode ser maior que final. relatorioLinhaOperacionalController.lblEmpresa.value = Empresa +relatorioLinhaOperacionalController.lblBilhetesDevolvidos.value = Desconsiderar bilhetes devolvidos +relatorioLinhaOperacionalController.lblAgrupar.value = Agrupar por +relatorioLinhaOperacionalController.rdAgruparPorDia.value = Dia +relatorioLinhaOperacionalController.rdAgruparPorMes.value = Mês +relatorioLinhaOperacionalController.rdAgruparPorAno.value = Ano relatorioLinhaOperacionalController.lblEspecie.value = Espécie #Relatorio Pasajeiros Viajar diff --git a/web/gui/relatorios/filtroRelatorioLinhaOperacional.zul b/web/gui/relatorios/filtroRelatorioLinhaOperacional.zul index ec1ae4603..87d45aa78 100644 --- a/web/gui/relatorios/filtroRelatorioLinhaOperacional.zul +++ b/web/gui/relatorios/filtroRelatorioLinhaOperacional.zul @@ -48,7 +48,7 @@ value="${c:l('relatorioLinhaOperacionalController.lblEmpresa.value')}" /> @@ -61,6 +61,20 @@ model="@{winFiltroRelatorioLinhaOperacional$composer.lsEspecie}" /> + + + + + + +