From 9c78a30cece3cb4554e4a42d4eaa0a3f9816cf25 Mon Sep 17 00:00:00 2001 From: wilian Date: Tue, 3 Nov 2015 12:28:54 +0000 Subject: [PATCH] fixes bug mantis #6798 git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@49698 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../impl/RelatorioObservacaoBilhetes.java | 143 ++++++++++ ...RelatorioObservacaoEventosFinanceiros.java | 142 ++++++++++ .../RelatorioObservacaoBilhetes_es.properties | 27 ++ ...latorioObservacaoBilhetes_pt_BR.properties | 27 ++ ...ObservacaoEventosFinanceiros_es.properties | 26 ++ ...ervacaoEventosFinanceiros_pt_BR.properties | 26 ++ .../RelatorioObservacaoBilhetes.jasper | Bin 0 -> 37498 bytes .../RelatorioObservacaoBilhetes.jrxml | 265 ++++++++++++++++++ ...latorioObservacaoEventosFinanceiros.jasper | Bin 0 -> 36420 bytes ...elatorioObservacaoEventosFinanceiros.jrxml | 250 +++++++++++++++++ ...RelatorioObservacaoBilhetesController.java | 94 +++++++ ...ObservacaoEventosFinaneirosController.java | 94 +++++++ .../ItemMenuRelatorioObservacaoBilhetes.java | 25 ++ ...RelatorioObservacaoEventosFinanceiros.java | 25 ++ web/WEB-INF/i3-label_es_MX.label | 22 +- web/WEB-INF/i3-label_pt_BR.label | 23 +- .../filtroRelatorioObservacaoBilhetes.zul | 77 +++++ ...oRelatorioObservacaoEventosFinanceiros.zul | 77 +++++ 18 files changed, 1339 insertions(+), 4 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoBilhetes.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoEventosFinanceiros.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_es.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_es.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoBilhetes.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoBilhetes.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoEventosFinanceiros.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoEventosFinanceiros.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioObservacaoBilhetesController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioObservacaoEventosFinaneirosController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioObservacaoBilhetes.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioObservacaoEventosFinanceiros.java create mode 100644 web/gui/relatorios/filtroRelatorioObservacaoBilhetes.zul create mode 100644 web/gui/relatorios/filtroRelatorioObservacaoEventosFinanceiros.zul diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoBilhetes.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoBilhetes.java new file mode 100644 index 000000000..827b205b8 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoBilhetes.java @@ -0,0 +1,143 @@ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.vo.comissao.LogConferenciaVO; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +public class RelatorioObservacaoBilhetes extends Relatorio { + + private static Logger log = Logger.getLogger(RelatorioObservacaoBilhetes.class); + private Integer empresaId; + private Integer puntoventaId; + private Date dataInicial; + private Date dataFinal; + + public RelatorioObservacaoBilhetes(Map parametros, Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new DataSource(this) { + @Override + public void initDados() throws Exception { + Connection conexao = this.relatorio.getConexao(); + definirFiltros(this.relatorio.getParametros()); + List lsDadosRelatorio = processarRelatorio(conexao); + setLsDadosRelatorio(lsDadosRelatorio); + } + }); + } + + private List processarRelatorio(Connection conexao) throws ParseException { + List lsDadosRelatorio = new ArrayList(); + ResultSet rset = null; + NamedParameterStatement stmt = null; + try { + StringBuilder sQuery = new StringBuilder(); + sQuery.append("SELECT PV.NOMBPUNTOVENTA, C.DATAMOVIMENTO, LOG.STATUS, LOG.OBSERVACAO, B.NUMFOLIOSISTEMA, CAT.DESCCATEGORIA, LOG.PRECO, LOG.FECMODIF, LOG.INDCREDITO, B.TIPOVENTA_ID, U.NOMBUSUARIO ") + .append("FROM LOG_CONFERENCIA LOG ") + .append("INNER JOIN CONFERENCIA C ON C.CONFERENCIA_ID = LOG.CONFERENCIA_ID ") + .append("INNER JOIN EMPRESA E ON E.EMPRESA_ID = C.EMPRESA_ID ") + .append("INNER JOIN PUNTO_VENTA PV ON PV.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") + .append("INNER JOIN USUARIO U ON U.USUARIO_ID = LOG.USUARIO_ID ") + .append("INNER JOIN BOLETO B ON B.BOLETO_ID = LOG.BOLETO_ID ") + .append("INNER JOIN CATEGORIA CAT ON CAT.CATEGORIA_ID = B.CATEGORIA_ID ") + .append("WHERE LOG.ACTIVO = 1 ") + .append("AND C.DATAMOVIMENTO BETWEEN :dataInicial AND :dataFinal "); + + if(empresaId != null) { + sQuery.append("AND C.EMPRESA_ID = :empresaId "); + } + + if(puntoventaId != null) { + sQuery.append("AND PV.PUNTOVENTA_ID = :puntoventaId "); + } + + sQuery.append("ORDER BY C.DATAMOVIMENTO"); + + log.info(sQuery.toString()); + + stmt = new NamedParameterStatement(conexao, sQuery.toString()); + if(empresaId != null) { + stmt.setInt("empresaId", empresaId); + } + + if(puntoventaId != null) { + stmt.setInt("puntoventaId", puntoventaId); + } + stmt.setDate("dataInicial", new java.sql.Date(dataInicial.getTime())); + stmt.setDate("dataFinal", new java.sql.Date(dataFinal.getTime())); + + rset = stmt.executeQuery(); + + while (rset.next()) { + LogConferenciaVO logConferencia = new LogConferenciaVO(); + logConferencia.setDatamovimento(rset.getDate("datamovimento")); + logConferencia.setNombpuntoventa(rset.getString("nombpuntoventa")); + logConferencia.setStatus(rset.getInt("status")); + logConferencia.setNumfoliosistema(rset.getString("numfoliosistema")); + logConferencia.setTipoventa(rset.getInt("tipoventa_id")); + logConferencia.setObservacao(rset.getString("observacao")); + logConferencia.setDesccategoria(rset.getString("desccategoria")); + logConferencia.setFecmodif(rset.getDate("fecmodif")); + logConferencia.setIndcredito(rset.getBoolean("indcredito")); + logConferencia.setNombusuario(rset.getString("nombusuario")); + logConferencia.setPreco(rset.getBigDecimal("preco")); + + lsDadosRelatorio.add(logConferencia); + } + + return lsDadosRelatorio; + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + try { + if(rset != null) { + rset.close(); + } + if(stmt != null) { + stmt.close(); + } + } catch (SQLException e) { + log.error(e.getMessage(), e); + } + } + return null; + } + + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + } + + @Override + protected void processaParametros() throws Exception { + } + + private void definirFiltros(Map parametros) throws ParseException { + Integer puntoventaId = (Integer) parametros.get("puntoventaId"); + Integer empresaId = (Integer) parametros.get("empresaId"); + this.dataInicial = (Date) parametros.get("dataFiltroInicial"); + this.dataFinal = (Date) parametros.get("dataFiltroFinal"); + + if(empresaId != null) { + this.empresaId = empresaId; + } + if(puntoventaId != null) { + this.puntoventaId = puntoventaId; + } + + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoEventosFinanceiros.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoEventosFinanceiros.java new file mode 100644 index 000000000..86f866e5f --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioObservacaoEventosFinanceiros.java @@ -0,0 +1,142 @@ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.vo.comissao.LogConferenciaVO; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +public class RelatorioObservacaoEventosFinanceiros extends Relatorio { + + private static Logger log = Logger.getLogger(RelatorioObservacaoEventosFinanceiros.class); + private Integer empresaId; + private Integer puntoventaId; + private Date dataInicial; + private Date dataFinal; + + public RelatorioObservacaoEventosFinanceiros(Map parametros, Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new DataSource(this) { + @Override + public void initDados() throws Exception { + Connection conexao = this.relatorio.getConexao(); + definirFiltros(this.relatorio.getParametros()); + List lsDadosRelatorio = processarRelatorio(conexao); + setLsDadosRelatorio(lsDadosRelatorio); + } + }); + } + + private List processarRelatorio(Connection conexao) throws ParseException { + List lsDadosRelatorio = new ArrayList(); + ResultSet rset = null; + NamedParameterStatement stmt = null; + try { + StringBuilder sQuery = new StringBuilder(); + sQuery.append("SELECT PV.NOMBPUNTOVENTA, C.DATAMOVIMENTO, LOG.STATUS, LOG.OBSERVACAO, EE.DESCINFO, TEE.DESCTIPOEVENTO, LOG.PRECO, LOG.FECMODIF, LOG.INDCREDITO, U.NOMBUSUARIO ") + .append("FROM LOG_CONFERENCIA LOG ") + .append("INNER JOIN CONFERENCIA C ON C.CONFERENCIA_ID = LOG.CONFERENCIA_ID ") + .append("INNER JOIN EMPRESA E ON E.EMPRESA_ID = C.EMPRESA_ID ") + .append("INNER JOIN PUNTO_VENTA PV ON PV.PUNTOVENTA_ID = C.PUNTOVENTA_ID ") + .append("INNER JOIN USUARIO U ON U.USUARIO_ID = LOG.USUARIO_ID ") + .append("INNER JOIN EVENTO_EXTRA EE ON EE.EVENTOEXTRA_ID = LOG.EVENTOEXTRA_ID ") + .append("INNER JOIN TIPO_EVENTO_EXTRA TEE ON TEE.TIPOEVENTOEXTRA_ID = EE.TIPOEVENTOEXTRA_ID ") + .append("WHERE LOG.ACTIVO = 1 ") + .append("AND C.DATAMOVIMENTO BETWEEN :dataInicial AND :dataFinal "); + + if(empresaId != null) { + sQuery.append("AND C.EMPRESA_ID = :empresaId "); + } + + if(puntoventaId != null) { + sQuery.append("AND PV.PUNTOVENTA_ID = :puntoventaId "); + } + + sQuery.append("ORDER BY C.DATAMOVIMENTO"); + + log.info(sQuery.toString()); + + stmt = new NamedParameterStatement(conexao, sQuery.toString()); + if(empresaId != null) { + stmt.setInt("empresaId", empresaId); + } + + if(puntoventaId != null) { + stmt.setInt("puntoventaId", puntoventaId); + } + stmt.setDate("dataInicial", new java.sql.Date(dataInicial.getTime())); + stmt.setDate("dataFinal", new java.sql.Date(dataFinal.getTime())); + + rset = stmt.executeQuery(); + + while (rset.next()) { + LogConferenciaVO logConferencia = new LogConferenciaVO(); + logConferencia.setDatamovimento(rset.getDate("datamovimento")); + logConferencia.setNombpuntoventa(rset.getString("nombpuntoventa")); + logConferencia.setStatus(rset.getInt("status")); + logConferencia.setDescinfoevento(rset.getString("descinfo")); + logConferencia.setDesctipoevento(rset.getString("desctipoevento")); + logConferencia.setObservacao(rset.getString("observacao")); + logConferencia.setFecmodif(rset.getDate("fecmodif")); + logConferencia.setIndcredito(rset.getBoolean("indcredito")); + logConferencia.setNombusuario(rset.getString("nombusuario")); + logConferencia.setPreco(rset.getBigDecimal("preco")); + + lsDadosRelatorio.add(logConferencia); + } + + return lsDadosRelatorio; + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + try { + if(rset != null) { + rset.close(); + } + if(stmt != null) { + stmt.close(); + } + } catch (SQLException e) { + log.error(e.getMessage(), e); + } + } + return null; + } + + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + } + + @Override + protected void processaParametros() throws Exception { + } + + private void definirFiltros(Map parametros) throws ParseException { + Integer puntoventaId = (Integer) parametros.get("puntoventaId"); + Integer empresaId = (Integer) parametros.get("empresaId"); + this.dataInicial = (Date) parametros.get("dataFiltroInicial"); + this.dataFinal = (Date) parametros.get("dataFiltroFinal"); + + if(empresaId != null) { + this.empresaId = empresaId; + } + if(puntoventaId != null) { + this.puntoventaId = puntoventaId; + } + + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_es.properties new file mode 100644 index 000000000..a46a76329 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_es.properties @@ -0,0 +1,27 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + +#Labels cabeçalho +cabecalho.nome=Relatório Observações Bilhetes +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à +cabecalho.dataHora=Data/Hora: +cabecalho.impressorPor=Impressor por: +cabecalho.pagina=Página +cabecalho.de=de +cabecalho.filtros=Filtros: +cabecalho.usuario=Usuário: +cabecalho.puntoventa=Punto Venta: +cabecalho.empresa=Empresa: +label.puntoventa=Punto Venta +label.usuario=Usuário +label.datamovimento=Data Mov. +label.statusDescricao=Situação +label.numfoliosistema=Nº Bilhete +label.desccategoria=Categoria +label.observacao=Observação +label.preco=Valor +label.debitoCredito=D/C +label.fecmodif=Dt. Alt. +label.tipoventa=Tipo Venta \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_pt_BR.properties new file mode 100644 index 000000000..a46a76329 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoBilhetes_pt_BR.properties @@ -0,0 +1,27 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + +#Labels cabeçalho +cabecalho.nome=Relatório Observações Bilhetes +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à +cabecalho.dataHora=Data/Hora: +cabecalho.impressorPor=Impressor por: +cabecalho.pagina=Página +cabecalho.de=de +cabecalho.filtros=Filtros: +cabecalho.usuario=Usuário: +cabecalho.puntoventa=Punto Venta: +cabecalho.empresa=Empresa: +label.puntoventa=Punto Venta +label.usuario=Usuário +label.datamovimento=Data Mov. +label.statusDescricao=Situação +label.numfoliosistema=Nº Bilhete +label.desccategoria=Categoria +label.observacao=Observação +label.preco=Valor +label.debitoCredito=D/C +label.fecmodif=Dt. Alt. +label.tipoventa=Tipo Venta \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_es.properties new file mode 100644 index 000000000..4d272ce34 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_es.properties @@ -0,0 +1,26 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + +#Labels cabeçalho +cabecalho.nome=Relatório Observações Eventos Financeiros +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à +cabecalho.dataHora=Data/Hora: +cabecalho.impressorPor=Impressor por: +cabecalho.pagina=Página +cabecalho.de=de +cabecalho.filtros=Filtros: +cabecalho.usuario=Usuário: +cabecalho.puntoventa=Punto Venta: +cabecalho.empresa=Empresa: +label.puntoventa=Punto Venta +label.usuario=Usuário +label.datamovimento=Data Mov. +label.statusDescricao=Situação +label.desctipoevento=Tipo Evento +label.descinfoevento=Evento Extra +label.observacao=Observação +label.preco=Valor +label.debitoCredito=D/C +label.fecmodif=Dt. Alt. \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_pt_BR.properties new file mode 100644 index 000000000..4d272ce34 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioObservacaoEventosFinanceiros_pt_BR.properties @@ -0,0 +1,26 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + +#Labels cabeçalho +cabecalho.nome=Relatório Observações Eventos Financeiros +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à +cabecalho.dataHora=Data/Hora: +cabecalho.impressorPor=Impressor por: +cabecalho.pagina=Página +cabecalho.de=de +cabecalho.filtros=Filtros: +cabecalho.usuario=Usuário: +cabecalho.puntoventa=Punto Venta: +cabecalho.empresa=Empresa: +label.puntoventa=Punto Venta +label.usuario=Usuário +label.datamovimento=Data Mov. +label.statusDescricao=Situação +label.desctipoevento=Tipo Evento +label.descinfoevento=Evento Extra +label.observacao=Observação +label.preco=Valor +label.debitoCredito=D/C +label.fecmodif=Dt. Alt. \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoBilhetes.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioObservacaoBilhetes.jasper new file mode 100644 index 0000000000000000000000000000000000000000..259598331273031a0d948efdb41d3a410a7af7b5 GIT binary patch literal 37498 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 + + + + +