From 21f233dcb216232a9b9777e2d3a85e4c9cae6018 Mon Sep 17 00:00:00 2001 From: bruno Date: Fri, 28 Jun 2013 22:11:42 +0000 Subject: [PATCH] =?UTF-8?q?-=20Altera=C3=A7=C3=A3o=20na=20formula=20do=20c?= =?UTF-8?q?alculo=20do=20cabe=C3=A7alho=20do=20relat=C3=B3rio=20de=20rendi?= =?UTF-8?q?mento=20-=20Altera=C3=A7=C3=A3o=20dos=20filtros=20-=20Outras=20?= =?UTF-8?q?modifica=C3=A7=C3=B5es=20reat=C3=B3rio=20de=20receita?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@28380 d1611594-4594-4d17-8e1d-87c2c4800839 --- ...torioReceitaDiariaAgencia_pt_BR.properties | 10 + .../parametros/RendimentoParamsImpl.java | 4 +- .../render/RenderRelatorioAbstract.java | 14 +- .../render/RenderRelatorioJasper.java | 81 +- .../RelatorioReceitaDiariaAgencia.jasper | Bin 0 -> 69794 bytes .../RelatorioReceitaDiariaAgencia.jrxml | 799 ++++++++++++++++++ .../relatorios/utilitarios/Relatorio.java | 4 +- .../RelatorioAproveitamentoController.java | 172 +++- ...latorioReceitaDiariaAgenciaController.java | 276 ++++++ .../web/utilerias/MyComboboxParada.java | 11 +- .../web/utilerias/MyComboboxParadaCve.java | 145 ++++ ...ItemMenuRelatorioReceitaDiariaAgencia.java | 25 + .../render/RenderCorridaAproveitamento.java | 65 ++ .../render/RenderPuntoVentaSimple.java | 33 + web/WEB-INF/i3-label_pt_BR.label | 24 + .../filtroRelatorioAproveitamento.zul | 105 ++- .../filtroRelatorioReceitaDiariaAgencia.zul | 86 ++ 17 files changed, 1780 insertions(+), 74 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioReceitaDiariaAgencia_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioReceitaDiariaAgenciaController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParadaCve.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioReceitaDiariaAgencia.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaAproveitamento.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderPuntoVentaSimple.java create mode 100644 web/gui/relatorios/filtroRelatorioReceitaDiariaAgencia.zul diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioReceitaDiariaAgencia_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioReceitaDiariaAgencia_pt_BR.properties new file mode 100644 index 000000000..735c7ea62 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioReceitaDiariaAgencia_pt_BR.properties @@ -0,0 +1,10 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + +#Labels cabeçalho +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à + +rodape.pagina=Página +rodape.de=de \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/parametros/RendimentoParamsImpl.java b/src/java/com/rjconsultores/ventaboletos/relatorios/parametros/RendimentoParamsImpl.java index 64dc0b6ff..ce9b3f682 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/parametros/RendimentoParamsImpl.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/parametros/RendimentoParamsImpl.java @@ -57,7 +57,7 @@ public class RendimentoParamsImpl implements IParametros { StringBuilder sql = new StringBuilder(); sql.append("SELECT round(NVL(TAB.TOTAL_ARRECADADO,0),2) TOTAL_ARRECADADO, "); - sql.append(" round(NVL(TAB.TOTAL_ARRECADADO / TAB.KM_OCUPADA,0),2) ARRECADADO_KM, "); + sql.append(" round(NVL(TAB.TOTAL_ARRECADADO / TAB.KM_NOMINAL,0),2) ARRECADADO_KM, "); sql.append(" round(NVL(TAB.TOTAL_NOMINAL,0),2) TOTAL_NOMINAL, "); sql.append(" round(TAB.TOTAL_NOMINAL / TAB.KM_NOMINAL,2) NOMINAL_KM,"); sql.append(" (TAB.TOTAL_OCUPADOS/TAB.TOTAL_ACENTOS) OCUPACAO, "); @@ -73,7 +73,7 @@ public class RendimentoParamsImpl implements IParametros { sql.append(" AND (BO.MOTIVOCANCELACION_ID IS NULL OR "); sql.append(" BO.MOTIVOCANCELACION_ID = 0)) TOTAL_ARRECADADO, "); sql.append(" "); - sql.append(" (SELECT SUM(TR.CANTKMREAL * DA.CANTASIENTOS) "); + sql.append(" (SELECT SUM(TR.CANTKMREAL) "); sql.append(" FROM CORRIDA_TRAMO CT, "); sql.append(" TRAMO TR, "); sql.append(" ROL_OPERATIVO RO, "); diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioAbstract.java b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioAbstract.java index 5fd231e11..12b59c2c0 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioAbstract.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioAbstract.java @@ -1,5 +1,6 @@ package com.rjconsultores.ventaboletos.relatorios.render; +import java.io.InputStream; import java.sql.Connection; import java.util.HashMap; import java.util.Map; @@ -43,6 +44,14 @@ public abstract class RenderRelatorioAbstract implements IRenderRelatorio { * Excessão durante a renderização do relatório */ protected abstract byte[] render(SaidaRelatorio saida) throws Exception; + + + protected abstract InputStream getTemplateInputStream() throws Exception; + + protected abstract byte[] renderPdf() throws Exception; + + protected abstract byte[] renderXls() throws Exception; + /** * @param relatorio @@ -66,8 +75,7 @@ public abstract class RenderRelatorioAbstract implements IRenderRelatorio { public void initParametros(){ this.parametros.put("NOME_RELATORIO", this.relatorio.getDescricao()); - this.parametros.put("MSG_NO_DATA", this.relatorio.getNome()); - + } /* @@ -81,5 +89,7 @@ public abstract class RenderRelatorioAbstract implements IRenderRelatorio { return this.render(saida); } + + } diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java index f1f7a3d46..26c4b7411 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/render/RenderRelatorioJasper.java @@ -7,6 +7,7 @@ import java.util.Locale; import java.util.ResourceBundle; import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRParameter; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; @@ -56,20 +57,43 @@ public class RenderRelatorioJasper extends RenderRelatorioAbstract { throw new Exception("Este relatório esta configurado para utilizar uma conexão direta com banco de dados, utilize o construtor com a passagem de parametros correta."); } - + @Override - public void preRender(){ + public void preRender() { super.preRender(); this.initBundler(); - + this.initLocale(); + } - - private void initBundler(){ + + private void initBundler() { // TODO Alterar para injeção de acordo com usuário logado ou outro meio para obter o Locale correto Locale locale = new Locale("pt", "BR"); - ResourceBundle resource = ResourceBundle.getBundle("com.rjconsultores.ventaboletos.relatorios.internacionalizacao."+this.relatorio.getNome(), locale); - - this.parametros.put(JRParameter.REPORT_RESOURCE_BUNDLE, resource); + try { + + ResourceBundle resource = ResourceBundle.getBundle("com.rjconsultores.ventaboletos.relatorios.internacionalizacao." + this.relatorio.getNome(), locale); + this.parametros.put(JRParameter.REPORT_RESOURCE_BUNDLE, resource); + } catch (Exception e) { + } + } + + private void initLocale() { + // TODO Alterar para injeção de acordo com usuário logado ou outro meio para obter o Locale correto + Locale locale = new Locale("pt", "BR"); + this.parametros.put(JRParameter.REPORT_LOCALE, locale); + } + + protected InputStream getTemplateInputStream() throws Exception { + String diretorio = "/com/rjconsultores/ventaboletos/relatorios/templates/" + this.relatorio.getNome() + ".jasper"; + InputStream iStemplate = this.getClass().getResourceAsStream(diretorio); + + if (iStemplate == null) + { + throw new Exception("Não foi possivel localizar o template do relátorio no diretorio a seguir: " + diretorio); + } + + return iStemplate; + } /* @@ -86,36 +110,47 @@ public class RenderRelatorioJasper extends RenderRelatorioAbstract { if (this.relatorio.getParametros() != null) this.relatorio.getParametros().processaParametros(this.parametros, this.connection); - InputStream iStemplate = this.getClass().getResourceAsStream("/com/rjconsultores/ventaboletos/relatorios/templates/" + this.relatorio.getNome()+".jasper"); - if (this.relatorio.getDatasource() != null) - this.jasperPrint = JasperFillManager.fillReport(iStemplate, this.getParametros(), (JRDataSource) this.datasource); + this.jasperPrint = JasperFillManager.fillReport(this.getTemplateInputStream(), this.getParametros(), (JRDataSource) this.datasource); else - this.jasperPrint = JasperFillManager.fillReport(iStemplate, this.getParametros(), this.connection); + this.jasperPrint = JasperFillManager.fillReport(this.getTemplateInputStream(), this.getParametros(), this.connection); } + switch (saida) { case PDF: - conteudo = JasperExportManager.exportReportToPdf(this.jasperPrint); + conteudo = this.renderPdf(); break; case XLS: - JRXlsExporter exporterXLS = new JRXlsExporter(); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, this.jasperPrint); - exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output); - exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); - exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); - exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); - exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); - exporterXLS.exportReport(); - conteudo = output.toByteArray(); + conteudo = this.renderXls(); break; } return conteudo; } + + protected byte[] renderXls() throws Exception { + + JRXlsExporter exporterXLS = new JRXlsExporter(); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, this.jasperPrint); + exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output); + exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE); + exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); + exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); + exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); + exporterXLS.exportReport(); + return output.toByteArray(); + + } + + protected byte[] renderPdf() throws Exception { + + return JasperExportManager.exportReportToPdf(this.jasperPrint); + + } } diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jasper new file mode 100644 index 0000000000000000000000000000000000000000..4c13e2f8824a96c57e7dc11c1e2d20f474c60211 GIT binary patch literal 69794 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 D5-LD% literal 0 HcmV?d00001 diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jrxml new file mode 100644 index 000000000..c2d3c0214 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioReceitaDiariaAgencia.jrxml @@ -0,0 +1,799 @@ + + + + + + + + + + + + + + + + + 18 THEN + 1 + ELSE + 0 + END) total_bilhetes, + + sum(CASE + WHEN cj.motivocancelacion_id is not null THEN + 1 + ELSE + 0 + END) total_bilhetes_canc, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + 1 + ELSE + 0 + END) total_bilhetes_gap, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id <> 18 THEN + cj.preciopagado + ELSE + 0 + END) receita_tarifa, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + cj.preciopagado + ELSE + 0 + END) receita_tarifa_gap, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id <> 18 THEN + cj.importeseguro + ELSE + 0 + END) receita_seguro, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + cj.importeseguro + ELSE + 0 + END) receita_seguro_gap, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id <> 18 THEN + cj.importetaxaembarque + ELSE + 0 + END) receita_embarque, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + cj.importetaxaembarque + ELSE + 0 + END) receita_embarque_gap, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id <> 18 THEN + cj.importeoutros + ELSE + 0 + END) receita_outros, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + cj.importeoutros + ELSE + 0 + END) receita_outros_gap, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id <> 18 THEN + cj.importepedagio + ELSE + 0 + END) receita_pedagio, + sum(CASE + WHEN cj.motivocancelacion_id is null and + cj.tipoventa_id = 18 THEN + cj.importepedagio + ELSE + 0 + END) receita_pedagio_gap, + + sum(CASE + WHEN cj.motivocancelacion_id in (31, 32) and + cj.tipoventa_id <> 18 THEN + cj.preciopagado + ELSE + 0 + END) total_devol, + sum(CASE + WHEN cj.motivocancelacion_id in (31, 32) and + cj.tipoventa_id = 18 THEN + cj.preciopagado + ELSE + 0 + END) total_devol_gap + from vtabol.caja cj, + vtabol.punto_venta pv, + vtabol.parada pr, + vtabol.ciudad cd, + vtabol.estado es + where cj.puntoventa_id = pv.puntoventa_id + and trunc(cj.fechorventa) between $P{DATA_INICIO} and $P{DATA_FINAL} + and pr.parada_id = pv.parada_id + and cd.ciudad_id = pr.ciudad_id + and cd.estado_id = es.estado_id + and es.estado_id = nvl($P{ESTADO_ID}, es.estado_id) + and (($X{IN, numpuntoventa, NUMPUNTOVENTA} and $P{ISNUMPUNTOVENTATODOS} = 'N')or($P{ISNUMPUNTOVENTATODOS} = 'S')) + group by es.cveestado, pv.puntoventa_id, pv.numpuntoventa, pv.nombpuntoventa) tab, + vtabol.evento_extra ee + where trunc(ee.fechoringreso(+)) between $P{DATA_INICIO} and $P{DATA_FINAL} + and ee.puntoventa_id(+) = tab.puntoventa_id + + group by tab.cveestado, + tab.puntoventa_id, + tab.numpuntoventa, + tab.nombpuntoventa, + tab.total_bilhetes, + tab.total_bilhetes_gap, + tab.receita_tarifa, + tab.receita_seguro, + tab.total_devol, + tab.receita_tarifa_gap, + tab.receita_seguro_gap, + tab.total_devol_gap, + tab.total_bilhetes_canc) tab1]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="74" splitType="Stretch"> + <rectangle> + <reportElement uuid="40951cf0-f721-444c-937e-a529296c7cc5" x="1" y="0" width="800" height="30"/> + </rectangle> + <textField pattern="" isBlankWhenNull="false"> + <reportElement uuid="51724883-07e3-4d85-9d83-8e4fb54a369f" mode="Transparent" x="71" y="0" width="369" height="15" forecolor="#000000" backcolor="#FFFFFF"/> + <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" markup="none"> + <font fontName="SansSerif" size="9" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false"/> + <paragraph lineSpacing="Single"/> + </textElement> + <textFieldExpression><![CDATA[$P{NOME_RELATORIO}]]></textFieldExpression> + </textField> + <textField> + <reportElement uuid="9ab65a31-d370-435c-9797-bf9d01f7db8e" x="6" y="0" width="65" height="15"/> + <textElement> + <font size="9" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$R{cabecalho.relatorio}]]></textFieldExpression> + </textField> + <textField pattern="" isBlankWhenNull="false"> + <reportElement uuid="3df44bfd-0b0d-408a-b69d-ce5a91fac303" mode="Transparent" x="6" y="15" width="65" height="15" forecolor="#000000" backcolor="#FFFFFF"/> + <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" markup="none"> + <font fontName="SansSerif" size="9" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false"/> + <paragraph lineSpacing="Single"/> + </textElement> + <textFieldExpression><![CDATA[$R{cabecalho.periodo}]]></textFieldExpression> + </textField> + <textField pattern="dd/MM/yyyy" isBlankWhenNull="false"> + <reportElement uuid="2d8e8bb8-83e9-4e1b-87dc-60f3aa339144" mode="Transparent" x="71" y="15" width="53" height="15" forecolor="#000000" backcolor="#FFFFFF"/> + <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" markup="none"> + <font fontName="SansSerif" size="9" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false"/> + <paragraph lineSpacing="Single"/> + </textElement> + <textFieldExpression><![CDATA[$P{DATA_INICIO}]]></textFieldExpression> + </textField> + <textField pattern="dd/MM/yyyy" isBlankWhenNull="false"> + <reportElement uuid="c29183cc-bb62-4ac1-b880-a218e54be0c0" mode="Transparent" x="137" y="15" width="59" height="15" forecolor="#000000" backcolor="#FFFFFF"/> + <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" markup="none"> + <font fontName="SansSerif" size="9" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false"/> + <paragraph lineSpacing="Single"/> + </textElement> + <textFieldExpression><![CDATA[$P{DATA_FINAL}]]></textFieldExpression> + </textField> + <textField pattern="" isBlankWhenNull="false"> + <reportElement uuid="66de0d17-aaae-4bc7-97fc-c642bbcdf2fa" mode="Transparent" x="124" y="15" width="13" height="15" forecolor="#000000" backcolor="#FFFFFF"/> + <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" markup="none"> + <font fontName="SansSerif" size="9" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfEncoding="Cp1252" isPdfEmbedded="false"/> + <paragraph lineSpacing="Single"/> + </textElement> + <textFieldExpression><![CDATA[$R{cabecalho.periodoA}]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/Relatorio.java b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/Relatorio.java index f56f26e5c..af7c909ab 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/Relatorio.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/Relatorio.java @@ -20,8 +20,8 @@ import com.rjconsultores.ventaboletos.relatorios.parametros.*; public enum Relatorio { RELATORIO_APROVEITAMENTO(1, "RelatorioAproveitamento", "Relatório de Aproveitamento",new RendimentoParamsImpl(), null), - RELATORIO_SERVICOS(2, "Servicosr", "Relatório de Serviços", null, new Vendas2CustomDS()), - RELATORIO_EXEMPLO(3, "ExemploFoo", "Relatório Foo", null, null); + RELATORIO_RECEITA_DIARIA_AGENCIA(2, "RelatorioReceitaDiariaAgencia", "Relatório de Receita Diária por Agência", null, null), + RELATORIO_EXEMPLO(99, "ExemploFoo", "Relatório Foo", null, null); private int codigo; private String nome; diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoController.java index 5b6f59e5c..15ac0289e 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoController.java @@ -4,6 +4,7 @@ */ package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -12,17 +13,30 @@ import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; +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.Button; +import org.zkoss.zul.Comboitem; +import org.zkoss.zul.ComboitemRenderer; import org.zkoss.zul.Datebox; -import org.zkoss.zul.Div; -import org.zkoss.zul.Iframe; +import org.zkoss.zul.Paging; +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Parada; import com.rjconsultores.ventaboletos.relatorios.render.RenderRelatorioJasper; import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada; +import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve; import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCorrida; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCorridaAproveitamento; /** * @@ -33,28 +47,22 @@ import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox; public class RelatorioAproveitamentoController extends MyGenericForwardComposer { private Datebox fecCorrida; - private Div divResultadoRelatorio; - private Iframe iframeRelatorio; private MyTextbox txtCorridaId; + private MyComboboxParada cmbParadaOrigem; + private MyComboboxParadaCve cmbParadaOrigemCve; + private MyComboboxParada cmbParadaDestino; + private MyComboboxParadaCve cmbParadaDestinoCve; + private Button btnExecutarRelatorio; + + private MyListbox corridaList; + private Paging pagingCorrida; + @Autowired private DataSource dataSource; - public Iframe getIframeRelatorio() { - return iframeRelatorio; - } - - public void setIframeRelatorio(Iframe iframeRelatorio) { - this.iframeRelatorio = iframeRelatorio; - } - - public Div getDivResultadoRelatorio() { - return divResultadoRelatorio; - } - - public void setDivResultadoRelatorio(Div divResultadoRelatorio) { - this.divResultadoRelatorio = divResultadoRelatorio; - } + @Autowired + private transient PagedListWrapper plwCorrida; public Datebox getFecCorrida() { return fecCorrida; @@ -68,10 +76,132 @@ public class RelatorioAproveitamentoController extends MyGenericForwardComposer public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); + corridaList.setItemRenderer(new RenderCorridaAproveitamento()); + + btnExecutarRelatorio.setDisabled(true); + + cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() { + + @Override + public void render(Comboitem cmbtm, Object o) throws Exception { + Parada parada = (Parada) o; + + cmbtm.setLabel(parada.getCveparada()); + cmbtm.setValue(parada); + + } + }); + + cmbParadaDestinoCve.setItemRenderer(new ComboitemRenderer() { + + @Override + public void render(Comboitem cmbtm, Object o) throws Exception { + Parada parada = (Parada) o; + + cmbtm.setLabel(parada.getCveparada()); + cmbtm.setValue(parada); + + } + }); + } + public void onClick$btnBuscarServico(Event ev) throws Exception { + refreshLista(); + } + + public void onClick$btnExecutarRelatorio(Event ev) throws Exception { - executarRelatorio(); + executarRelatorio(); + } + + public void onSelect$cmbParadaOrigemCve(Event ev) { + if (cmbParadaOrigemCve.getSelectedItem() != null) { + cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue()); + } + + } + + public void onSelect$cmbParadaOrigem(Event ev) { + + if (cmbParadaOrigem.getSelectedItem() != null) + cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue()); + + } + + public void onSelect$cmbParadaDestinoCve(Event ev) { + + if (cmbParadaDestinoCve.getSelectedItem() != null) + cmbParadaDestino.setComboItemByParada((Parada) cmbParadaDestinoCve.getSelectedItem().getValue()); + + } + + public void onSelect$cmbParadaDestino(Event ev) { + + if (cmbParadaDestino.getSelectedItem() != null) + cmbParadaDestinoCve.setComboItemByParada((Parada) cmbParadaDestino.getSelectedItem().getValue()); + + } + public void onSelect$corridaList(Event ev) { + txtCorridaId.setValue(((Corrida)corridaList.getSelected()).getId().getCorridaId().toString()); + btnExecutarRelatorio.setDisabled(false); + + } + + + + private void refreshLista() { + btnExecutarRelatorio.setDisabled(true); + HibernateSearchObject corridaBusqueda = + new HibernateSearchObject(Corrida.class, + pagingCorrida.getPageSize()); + + + Comboitem cbiOrigem = cmbParadaOrigem.getSelectedItem(); + if (cbiOrigem != null) { + Parada origem = (Parada) cbiOrigem.getValue(); + corridaBusqueda.addFilterEqual("origem", origem); + } + + Comboitem cbiDestino = cmbParadaDestino.getSelectedItem(); + if (cbiDestino != null) { + Parada destino = (Parada) cbiDestino.getValue(); + corridaBusqueda.addFilterEqual("destino", destino); + } + + if (fecCorrida.getValue() != null) { + Date data = fecCorrida.getValue(); + data.setHours(00); + data.setMinutes(00); + data.setSeconds(00); + corridaBusqueda.addFilterEqual("id.feccorrida", data); + } + + + if(txtCorridaId.getValue() != null && !txtCorridaId.getValue().isEmpty()){ + corridaBusqueda.addFilterEqual("id.corridaId", new Integer(txtCorridaId.getValue())); + } + + + corridaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + plwCorrida.init(corridaBusqueda, corridaList, + pagingCorrida); + + if (corridaList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioAproveitamentoController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + + if (corridaList.getData().length == 1) { + corridaList.setSelectedIndex(0); + btnExecutarRelatorio.setDisabled(false); + } + } /** @@ -94,7 +224,7 @@ public class RelatorioAproveitamentoController extends MyGenericForwardComposer args.put("renderRelatorio", render); openWindow("/component/reportView.zul", - Relatorio.RELATORIO_APROVEITAMENTO.getNome(), args, MODAL); + Relatorio.RELATORIO_APROVEITAMENTO.getDescricao(), args, MODAL); } diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioReceitaDiariaAgenciaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioReceitaDiariaAgenciaController.java new file mode 100644 index 000000000..55fdd5696 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioReceitaDiariaAgenciaController.java @@ -0,0 +1,276 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Controller; +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.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.ForwardEvent; +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.Div; +import org.zkoss.zul.Iframe; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Textbox; +import org.zkoss.zul.event.PagingEvent; + +import com.rjconsultores.ventaboletos.entidad.Articulo; +import com.rjconsultores.ventaboletos.entidad.Estado; +import com.rjconsultores.ventaboletos.entidad.Pais; +import com.rjconsultores.ventaboletos.entidad.PuntoVenta; +import com.rjconsultores.ventaboletos.relatorios.render.RenderRelatorioJasper; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.service.EstadoService; +import com.rjconsultores.ventaboletos.service.PaisService; +import com.rjconsultores.ventaboletos.service.PuntoVentaService; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; +import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderArticulo; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPuntoVenta; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPuntoVentaSimple; +import com.trg.search.Filter; + +/** + * + * @author Administrador + */ +@Controller("relatorioReceitaDiariaAgenciaController") +@Scope("prototype") +public class RelatorioReceitaDiariaAgenciaController extends MyGenericForwardComposer { + + @Autowired + private EstadoService estadoService; + @Autowired + private PuntoVentaService puntoVentaService; + @Autowired + private DataSource dataSource; + private List lsEstado; + + private ArrayList lsNumPuntoVenta = new ArrayList(); + + @Autowired + private transient PagedListWrapper plwPuntoVenta; + private MyListbox puntoVentaList; + private Paging pagingPuntoVenta; + + private Bandbox bbPesquisaPuntoVenta; + + private Textbox txtPalavraPesquisa; + private Combobox cmbEstado; + private Combobox cmbPuntoVenta; + private Datebox datInicial; + private Datebox datFinal; + private Checkbox chkExcessoBagagem; + + public Datebox getDatInicial() { + return datInicial; + } + + public void setDatInicial(Datebox datInicial) { + this.datInicial = datInicial; + } + + public Datebox getDatFinal() { + return datFinal; + } + + public void setDatFinal(Datebox datFinal) { + this.datFinal = datFinal; + } + + public List getLsEstado() { + return lsEstado; + } + + public void setLsEstado(List lsEstado) { + this.lsEstado = lsEstado; + } + + public Combobox getCmbEstado() { + return cmbEstado; + } + + public void setCmbEstado(Combobox cmbEstado) { + this.cmbEstado = cmbEstado; + } + + public Combobox getCmbPuntoVenta() { + return cmbPuntoVenta; + } + + public void setCmbPuntoVenta(Combobox cmbPuntoVenta) { + this.cmbPuntoVenta = cmbPuntoVenta; + } + + public MyListbox getPuntoVentaList() { + return puntoVentaList; + } + + public void setPuntoVentaList(MyListbox puntoVentaList) { + this.puntoVentaList = puntoVentaList; + } + + public Paging getPagingPuntoVenta() { + return pagingPuntoVenta; + } + + public void setPagingPuntoVenta(Paging pagingPuntoVenta) { + this.pagingPuntoVenta = pagingPuntoVenta; + } + + public Textbox getTxtPalavraPesquisa() { + return txtPalavraPesquisa; + } + + public void setTxtPalavraPesquisa(Textbox txtPalavraPesquisa) { + this.txtPalavraPesquisa = txtPalavraPesquisa; + } + + public Bandbox getBbPesquisaPuntoVenta() { + return bbPesquisaPuntoVenta; + } + + public void setBbPesquisaPuntoVenta(Bandbox bbPesquisaPuntoVenta) { + this.bbPesquisaPuntoVenta = bbPesquisaPuntoVenta; + } + + public Checkbox getChkExcessoBagagem() { + return chkExcessoBagagem; + } + + public void setChkExcessoBagagem(Checkbox chkExcessoBagagem) { + this.chkExcessoBagagem = chkExcessoBagagem; + } + + public void onClick$btnExecutarRelatorio(Event ev) throws Exception { + executarRelatorio(); + } + + public void onSelect$puntoVentaList(Event ev) { + + String strListPuntoVenta = new String(); + ArrayList lsSelecionados = (ArrayList) puntoVentaList.getSelectedsItens(); + + lsNumPuntoVenta.clear(); + for (Object objPuntoVenta : lsSelecionados) { + strListPuntoVenta = ((PuntoVenta) objPuntoVenta).getNombpuntoventa() + " " + strListPuntoVenta; + lsNumPuntoVenta.add(((PuntoVenta) objPuntoVenta).getNumPuntoVenta()); + } + this.bbPesquisaPuntoVenta.setValue(strListPuntoVenta); + + } + + public void onClick$btnLimpar(Event ev) { + limparPesquisaAgencia(); + } + + public void onClick$btnPesquisa(Event ev) { + executarPesquisa(); + } + + /** + * + */ + private void limparPesquisaAgencia() { + puntoVentaList.clearSelection(); + + lsNumPuntoVenta.clear(); + this.bbPesquisaPuntoVenta.setValue(""); + } + + /** + * + */ + private void executarPesquisa() { + HibernateSearchObject puntoVentaBusqueda = + new HibernateSearchObject(PuntoVenta.class, + pagingPuntoVenta.getPageSize()); + + puntoVentaBusqueda.addFilterOr(Filter.like("nombpuntoventa", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%")), Filter.like("numPuntoVenta", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%"))); + + puntoVentaBusqueda.addSortAsc("nombpuntoventa"); + + puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta); + + if (puntoVentaList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioReceitaDiariaAgenciaController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + /** + * @throws Exception + * + */ + private void executarRelatorio() throws Exception { + + Map parametros = new HashMap(); + + RenderRelatorioJasper render = new RenderRelatorioJasper(Relatorio.RELATORIO_RECEITA_DIARIA_AGENCIA, dataSource.getConnection()); + + parametros.put("DATA_INICIO", new java.sql.Date(((java.util.Date) this.datInicial.getValue()).getTime())); + parametros.put("DATA_FINAL", new java.sql.Date(((java.util.Date) this.datFinal.getValue()).getTime())); + + parametros.put("B_EXCLUI_BAGAGEM", chkExcessoBagagem.isChecked()); + + if (lsNumPuntoVenta.size() > 0) { + parametros.put("NUMPUNTOVENTA", lsNumPuntoVenta); + parametros.put("ISNUMPUNTOVENTATODOS", "N"); + } + else + parametros.put("ISNUMPUNTOVENTATODOS", "S"); + + Comboitem itemEstado = cmbEstado.getSelectedItem(); + if (itemEstado != null) { + Estado estado = (Estado) itemEstado.getValue(); + parametros.put("ESTADO_ID", estado.getEstadoId()); + } + + render.setParametros(parametros); + + Map args = new HashMap(); + args.put("renderRelatorio", render); + + openWindow("/component/reportView.zul", + Relatorio.RELATORIO_RECEITA_DIARIA_AGENCIA.getDescricao(), args, MODAL); + + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + lsEstado = estadoService.obtenerTodos(); + super.doAfterCompose(comp); + + puntoVentaList.setItemRenderer(new RenderPuntoVentaSimple()); + + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParada.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParada.java index db9ede2f2..0dae96c5b 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParada.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParada.java @@ -36,7 +36,7 @@ public class MyComboboxParada extends Combobox { public MyComboboxParada() { super(); - + paradaService = (ParadaService) SpringUtil.getBean("paradaService"); lsParadas = new ArrayList(); @@ -132,4 +132,13 @@ public class MyComboboxParada extends Combobox { public void setSinTodos(boolean sinTodos) { this.sinTodos = sinTodos; } + + public void setComboItemByParada(Parada parada) { + + List ls = new ArrayList(); + ls.add(parada); + + this.setModel(new BindingListModelList(ls, false)); + this.setText(parada.getDescparada()); + } } diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParadaCve.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParadaCve.java new file mode 100644 index 000000000..17cbf9ebe --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/MyComboboxParadaCve.java @@ -0,0 +1,145 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.web.utilerias; + +import com.rjconsultores.ventaboletos.entidad.Parada; +import com.rjconsultores.ventaboletos.service.ParadaService; +import java.util.ArrayList; +import java.util.List; +import org.apache.log4j.Logger; +import org.zkoss.util.resource.Labels; +import org.zkoss.zk.ui.WrongValueException; +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.InputEvent; +import org.zkoss.zkplus.databind.BindingListModel; +import org.zkoss.zkplus.databind.BindingListModelList; +import org.zkoss.zkplus.spring.SpringUtil; +import org.zkoss.zul.Combobox; + +/** + * + * @author Administrador + */ +public class MyComboboxParadaCve extends Combobox { + + private static Logger log = Logger.getLogger(MyComboboxParadaCve.class); + public final static int minLength = 2; + private ParadaService paradaService; + private List lsParadas; + private Parada initialValue; + private Integer indiceSelected = null; + private boolean sinTodos = false; + private Integer ID_TODOS = -1; + + public MyComboboxParadaCve() { + super(); + + paradaService = (ParadaService) SpringUtil.getBean("paradaService"); + lsParadas = new ArrayList(); + + this.setAutodrop(false); + this.setAutocomplete(false); + + this.addEventListener("onOK", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + String strParada = MyComboboxParadaCve.this.getText().toUpperCase(); + if (strParada.length() < MyComboboxParadaCve.minLength) { + return; + } + if (!strParada.isEmpty()) { + lsParadas = paradaService.buscarCVE(strParada); + + if (sinTodos) { + log.debug("Sin todos"); + Parada p = paradaService.obtenerID(ID_TODOS); + lsParadas.remove(p); + } + + BindingListModel listModelParada = new BindingListModelList(lsParadas, true); + MyComboboxParadaCve.this.setModel(listModelParada); + indiceSelected = null; + if (!lsParadas.isEmpty()) { + indiceSelected = 0; + } + + MyComboboxParadaCve.this.open(); + } else { + lsParadas.clear(); + + BindingListModel listModelParada = new BindingListModelList(lsParadas, true); + MyComboboxParadaCve.this.setModel(listModelParada); + } + } + }); + + this.addEventListener("onChanging", new EventListener() { + + @Override + public void onEvent(Event event) throws Exception { + InputEvent ev = (InputEvent) event; + String strParada = ev.getValue(); + if (strParada.length() < 2) { + lsParadas.clear(); + + BindingListModel listModelParada = new BindingListModelList(lsParadas, true); + MyComboboxParadaCve.this.setModel(listModelParada); + + MyComboboxParadaCve.this.close(); + } + } + }); + } + + public Parada getInitialValue() { + return initialValue; + } + + public void setInitialValue(Parada initialValue) { + if (initialValue == null) { + return; + } + List ls = new ArrayList(); + ls.add(initialValue); + + this.setModel(new BindingListModelList(ls, false)); + this.setText(initialValue.getDescparada()); + } + + /** + * + * @param checaBusqueda + * @throws WrongValueException + */ + public String getValue(boolean checaBusqueda) throws WrongValueException { + if (checaBusqueda) { + if (this.getSelectedItem() == null) { + throw new WrongValueException(this, Labels.getLabel("MSG.Error.combobox.hacerBusqueda")); + } + } + + return super.getValue(); + } + + public boolean isSinTodos() { + return sinTodos; + } + + public void setSinTodos(boolean sinTodos) { + this.sinTodos = sinTodos; + } + + public void setComboItemByParada(Parada parada) { + + List ls = new ArrayList(); + ls.add(parada); + + this.setModel(new BindingListModelList(ls, false)); + this.setText(parada.getCveparada()); + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioReceitaDiariaAgencia.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioReceitaDiariaAgencia.java new file mode 100644 index 000000000..882c37753 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioReceitaDiariaAgencia.java @@ -0,0 +1,25 @@ +package com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios; + +import org.zkoss.util.resource.Labels; + +import com.rjconsultores.ventaboletos.web.utilerias.PantallaUtileria; +import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; + +public class ItemMenuRelatorioReceitaDiariaAgencia extends DefaultItemMenuSistema { + + public ItemMenuRelatorioReceitaDiariaAgencia() { + super("indexController.mniRelatorioReceitaDiariaAgencia.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.RELATORIOS.MENU.RELATORIORECEITADIARIAAGENCIA"; + } + + @Override + public void ejecutar() { + PantallaUtileria.openWindow("/gui/relatorios/filtroRelatorioReceitaDiariaAgencia.zul", + Labels.getLabel("relatorioReceitaDiariaAgenciaController.window.title"), null,desktop); + + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaAproveitamento.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaAproveitamento.java new file mode 100644 index 000000000..3a2eacdad --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaAproveitamento.java @@ -0,0 +1,65 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.web.utilerias.render; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import java.text.SimpleDateFormat; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; + +/** + * + * @author Administrador + */ +public class RenderCorridaAproveitamento implements ListitemRenderer { + + public void render(Listitem lstm, Object o) throws Exception { + Corrida corrida = (Corrida) o; + + Listcell lc = new Listcell(); + + lc = new Listcell(corrida.getId().getCorridaId().toString()); + lc.setParent(lstm); + + SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy"); + lc = new Listcell(formatData.format(corrida.getFechorsalida())); + lc.setParent(lstm); + + SimpleDateFormat formatHora = new SimpleDateFormat("KK:mm"); + lc = new Listcell(formatHora.format(corrida.getFechorsalida())); + lc.setParent(lstm); + + if (corrida.getOrigem() != null) { + lc = new Listcell(corrida.getOrigem().getDescparada()); + } else { + lc = new Listcell(""); + } + lc.setParent(lstm); + + if (corrida.getDestino() != null) { + lc = new Listcell(corrida.getDestino().getDescparada()); + } else { + lc = new Listcell(""); + } + lc.setParent(lstm); + + if (corrida.getRuta() != null) { + lc = new Listcell(corrida.getRuta().getDescruta()); + } else { + lc = new Listcell(""); + } + lc.setParent(lstm); + + if (corrida.getClaseServicio() != null) { + lc = new Listcell(corrida.getClaseServicio().getDescclase()); + } else { + lc = new Listcell(""); + } + lc.setParent(lstm); + + lstm.setAttribute("data", corrida); + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderPuntoVentaSimple.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderPuntoVentaSimple.java new file mode 100644 index 000000000..2b033c782 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderPuntoVentaSimple.java @@ -0,0 +1,33 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.web.utilerias.render; + +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; + +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.PuntoVenta; + +/** + * + * @author Administrador + */ +public class RenderPuntoVentaSimple implements ListitemRenderer { + + public void render(Listitem lstm, Object o) throws Exception { + PuntoVenta puntoVenta = (PuntoVenta) o; + + Listcell lc = new Listcell(puntoVenta.getNumPuntoVenta()); + lc.setParent(lstm); + + + + lc = new Listcell(puntoVenta.getNombpuntoventa()); + lc.setParent(lstm); + + lstm.setAttribute("data", puntoVenta); + } +} diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 84656fb6c..e03e764c7 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -211,6 +211,7 @@ indexController.mniCliente.label = Cliente indexController.mniTarjetaCredito.label = Cartão de Crédito indexController.mniRelatorios.label = Relatórios indexController.mniRelatorioAproveitamento.label = Relatório de Aproveitamento +indexController.mniRelatorioReceitaDiariaAgencia.label = Relatório de Receita Diária por Agência #PARTE REALIZADA POR MANUEL indexController.mnCortesias.label = Cortesias Para Funcionários @@ -235,10 +236,33 @@ busquedaClaseServicioController.lhDesc.label = Descrição busquedaClaseServicioController.lhId.label = ID #Relatórios + +#Aproveitamento relatorioAproveitamentoController.window.title = Relatório de Aproveitamento relatorioAproveitamentoController.lbFecCorrida.value = Data Serviço relatorioAproveitamentoController.lbServico.value = N. Serviço + +relatorioAproveitamentoController.lhDesc.label = Descrição +relatorioAproveitamentoController.Origem.label = Origem +relatorioAproveitamentoController.Destino.label = Destino +relatorioAproveitamentoController.Servico.label = Serviço +relatorioAproveitamentoController.DataServico.label = Data Serviço +relatorioAproveitamentoController.HoraServico.label = Data Serviço +relatorioAproveitamentoController.Classe.label = Classe +relatorioAproveitamentoController.btnBuscarServico.label = Buscar Serviço + + +#Receita Diária por Agência +relatorioReceitaDiariaAgenciaController.window.title = Relatório de Receita Diária por Agência +relatorioReceitaDiariaAgenciaController.lbDataIni.value = Data Inicial +relatorioReceitaDiariaAgenciaController.lbDataFin.value = Data Final +relatorioReceitaDiariaAgenciaController.lbEstado.value = Estado +relatorioReceitaDiariaAgenciaController.lbPuntoVenta.value = Agência +relatorioReceitaDiariaAgenciaController.btnPesquisa.label = Pesquisar +relatorioReceitaDiariaAgenciaController.btnLimpar.label = Limpar Seleção + + # Pantalla Editar Classe editarClaseServicioController.window.title = Tipo de Classe editarClaseServicioController.btnApagar.tooltiptext = Eliminar diff --git a/web/gui/relatorios/filtroRelatorioAproveitamento.zul b/web/gui/relatorios/filtroRelatorioAproveitamento.zul index a22c450d5..566abde40 100644 --- a/web/gui/relatorios/filtroRelatorioAproveitamento.zul +++ b/web/gui/relatorios/filtroRelatorioAproveitamento.zul @@ -5,28 +5,87 @@ - - - - - - - - - - - - - - -