From 3bcdaf96f8023300b0e69b8ec5caf528e9b25b9f Mon Sep 17 00:00:00 2001 From: fabio Date: Wed, 6 Sep 2017 20:55:03 +0000 Subject: [PATCH] Fixes bug #9448 git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@73580 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../impl/RelatorioVendasParcelamento.java | 180 +++++++ .../RelatorioVendasParcelamento_es.properties | 39 ++ ...latorioVendasParcelamento_pt_BR.properties | 39 ++ .../RelatorioAgenciaFechamento.jasper | Bin 52668 -> 52668 bytes .../RelatorioVendasParcelamento.jasper | Bin 0 -> 50674 bytes .../RelatorioVendasParcelamento.jrxml | 461 ++++++++++++++++++ .../RelatorioVendasParcelamentoBean.java | 234 +++++++++ ...RelatorioVendasParcelamentoController.java | 190 ++++++++ .../ItemMenuRelatorioVendasParcelamento.java | 25 + .../utilerias/menu/menu_original.properties | 1 + web/WEB-INF/i3-label_es_MX.label | 14 +- web/WEB-INF/i3-label_pt_BR.label | 15 +- .../filtroRelatorioVendasParcelamento.zul | 109 +++++ 13 files changed, 1305 insertions(+), 2 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasParcelamento.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_es.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasParcelamento.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasParcelamento.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasParcelamentoBean.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasParcelamentoController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioVendasParcelamento.java create mode 100644 web/gui/relatorios/filtroRelatorioVendasParcelamento.zul diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasParcelamento.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasParcelamento.java new file mode 100644 index 000000000..c7f60ba72 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasParcelamento.java @@ -0,0 +1,180 @@ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.ResultSet; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; + +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasParcelamentoBean; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +public class RelatorioVendasParcelamento extends Relatorio { + + private static Logger log = org.slf4j.LoggerFactory.getLogger(RelatorioVendasParcelamento.class); + + private List lsDadosRelatorio; + + public RelatorioVendasParcelamento(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(); + + Map parametros = this.relatorio.getParametros(); + + String fecInicio = parametros.get("fecInicio").toString() + " 00:00:00"; + String fecFinal = parametros.get("fecFinal").toString() + " 23:59:59"; + String parcInicio = parametros.get("parInicial").toString(); + String parcFinal = parametros.get("parFinal").toString(); + String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "-1"; + String empresaNome = parametros.get("empresaNome") != null ? parametros.get("empresaNome").toString() : ""; + String puntoVenta = parametros.get("NUMPUNTOVENTA") != null ? parametros.get("NUMPUNTOVENTA").toString() : null; + + lsDadosRelatorio = new ArrayList(); + + String sql = carregarVendasComParcelamento(puntoVenta, empresa); + + log.debug(sql); + + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); + ResultSet rset1 = null; + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); + + stmt.setTimestamp("de", new java.sql.Timestamp(sdf.parse(fecInicio).getTime())); + stmt.setTimestamp("ate", new java.sql.Timestamp(sdf.parse(fecFinal).getTime())); + + stmt.setInt("parcIni", Integer.parseInt(parcInicio)); + stmt.setInt("parcFim", Integer.parseInt(parcFinal)); + + if (empresa != null && !empresa.equals("-1")) { + stmt.setInt("empresaId", Integer.parseInt(empresa)); + } + + rset1= stmt.executeQuery(); + + while (rset1.next()) { + + RelatorioVendasParcelamentoBean vendasParcelamento = new RelatorioVendasParcelamentoBean(); + BigDecimal percentual = BigDecimal.ZERO; + + vendasParcelamento.setEmpresaNome(empresaNome); + vendasParcelamento.setEmpresa(rset1.getString("empresa")); + vendasParcelamento.setAgencia(rset1.getString("agencia")); + vendasParcelamento.setBilheteiro(rset1.getString("bilheteiro")); + vendasParcelamento.setDataVenda((Date)rset1.getObject("dataVenda")); + vendasParcelamento.setDataServico((Date) rset1.getObject("dataServico")); + vendasParcelamento.setLinha(rset1.getString("linha")); + vendasParcelamento.setServico(rset1.getString("servico")); + vendasParcelamento.setOrigem(rset1.getString("origem")); + vendasParcelamento.setDestino(rset1.getString("destino")); + vendasParcelamento.setBilhete(rset1.getString("bilhete")); + vendasParcelamento.setPreImpresso(rset1.getString("preImpresso")); + vendasParcelamento.setPoltrona(rset1.getString("poltrona")); + vendasParcelamento.setTarifa(rset1.getBigDecimal("tarifa")); + vendasParcelamento.setSeguro(rset1.getBigDecimal("seguro")); + vendasParcelamento.setPedagio(rset1.getBigDecimal("pedagio")); + vendasParcelamento.setTaxa(rset1.getBigDecimal("taxa")); + vendasParcelamento.setOutros(rset1.getBigDecimal("outros")); + vendasParcelamento.setTotal(rset1.getBigDecimal("total")); + vendasParcelamento.setFormaPagamento(rset1.getString("formaPagamento")); + vendasParcelamento.setAutorizacao(rset1.getString("autorizacao")); + vendasParcelamento.setNsu(rset1.getString("nsu")); + vendasParcelamento.setParcelas(rset1.getString("parcelas")); + vendasParcelamento.setValor(rset1.getBigDecimal("valor")); + + percentual = (vendasParcelamento.getValor().multiply( new BigDecimal("100") )); + percentual = (percentual.divide(vendasParcelamento.getTotal(), BigDecimal.ROUND_HALF_UP)); + vendasParcelamento.setPercentual(percentual.setScale(2)); + + lsDadosRelatorio.add(vendasParcelamento); + } + + rset1.close(); + + if (lsDadosRelatorio.size() > 0) { + setLsDadosRelatorio(lsDadosRelatorio); + } + + } + }); + } + + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + this.lsDadosRelatorio = lsDadosRelatorio; + } + + @Override + protected void processaParametros() throws Exception { + } + + private String carregarVendasComParcelamento(String puntoVenta, String empresa) { + + StringBuilder sql = new StringBuilder(); + sql.append(" SELECT m.DESCMARCA AS empresa, "); + sql.append(" pv.PUNTOVENTA_ID AS agencia, "); + sql.append(" u.CVEUSUARIO AS bilheteiro, "); + sql.append(" c.FECHORVENTA AS dataVenda, "); + sql.append(" co.FECCORRIDA AS dataServico, "); + sql.append(" r.NUMRUTA AS linha, "); + sql.append(" co.corrida_id AS servico, "); + sql.append(" orig.DESCPARADA AS origem, "); + sql.append(" dest.DESCPARADA AS destino, "); + sql.append(" c.NUMFOLIOSISTEMA AS bilhete, "); + sql.append(" c.NUMFOLIOPREIMPRESO AS preImpresso, "); + sql.append(" c.NUMASIENTO AS poltrona, "); + sql.append(" COALESCE(c.PRECIOPAGADO,0) AS tarifa, "); + sql.append(" COALESCE(c.IMPORTESEGURO,0) AS seguro, "); + sql.append(" COALESCE(c.IMPORTEPEDAGIO,0) AS pedagio, "); + sql.append(" COALESCE(c.IMPORTETAXAEMBARQUE,0) AS taxa, "); + sql.append(" COALESCE(c.IMPORTEOUTROS,0) AS outros, "); + sql.append(" ( COALESCE(c.IMPORTESEGURO,0)+ COALESCE(c.IMPORTEOUTROS,0) + COALESCE(c.IMPORTEPEDAGIO,0) +COALESCE(IMPORTETAXAEMBARQUE ,0)+COALESCE(c.PRECIOPAGADO,0)) AS total, "); + sql.append(" ct.tipotarjeta AS formaPagamento, "); + sql.append(" ct.numautorizacion AS autorizacao, "); + sql.append(" ct.NSU AS nsu, "); + sql.append(" ct.cantparcelas AS parcelas, "); + sql.append(" ct.importe AS valor "); + sql.append(" FROM caja c "); + sql.append(" INNER JOIN PUNTO_VENTA pv ON c.PUNTOVENTA_ID = pv.PUNTOVENTA_ID "); + sql.append(" INNER JOIN marca m ON m.marca_id = c.marca_id "); + sql.append(" INNER JOIN usuario u ON c.USUARIO_ID = u.USUARIO_ID "); + sql.append(" INNER JOIN ruta r ON c.RUTA_ID = r.RUTA_ID "); + sql.append(" INNER JOIN corrida co ON co.corrida_id = c.corrida_id AND co.feccorrida = c.feccorrida "); + sql.append(" INNER JOIN parada orig ON orig.PARADA_ID = co.ORIGEN_ID "); + sql.append(" INNER JOIN parada dest ON dest.PARADA_ID = co.DESTINO_ID "); + sql.append(" INNER JOIN caja_formapago cfp ON cfp.caja_id = c.caja_id "); + sql.append(" INNER JOIN caja_det_pago cdp ON cdp.cajaformapago_id = cfp.cajaformapago_id "); + sql.append(" INNER JOIN caja_tarjeta ct ON ct.cajadetpago_id = cdp.cajadetpago_id "); + sql.append(" WHERE "); + sql.append(" fechorventa BETWEEN :de AND :ate "); + sql.append(" AND ct.CANTPARCELAS BETWEEN :parcIni AND :parcFim "); + if (puntoVenta != null && !puntoVenta.equals("-1")) { + sql.append(" AND c.PUNTOVENTA_ID in (" + puntoVenta + ") "); + } + + if (empresa != null && !empresa.equals("-1")) { + sql.append(" AND m.empresa_id = :empresaId "); + } + sql.append(" AND c.motivocancelacion_id IS NULL "); + sql.append(" ORDER BY m.DESCMARCA, "); + sql.append(" pv.PUNTOVENTA_ID, "); + sql.append(" c.fechorventa ASC "); + + return sql.toString(); + + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_es.properties new file mode 100644 index 000000000..c5b9d9943 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_es.properties @@ -0,0 +1,39 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) +#geral + +detail.agencia = AG\u00CANCIA +detail.autorizacao = Autorizaci\u00F3n +detail.bilhete = Billete +detail.bilheteiro = Billetero +detail.dataservico = Fecha Servicio +detail.datavenda = Fecha Venta +detail.destino = Destino +detail.empresa = Empresa +detail.formapagamento = Forma pgto. +detail.linha = L\u00EDnea +detail.nsu = Nsu +detail.origem = Origem +detail.outros = Otros +detail.parcelas = Parcelas +detail.pedagio = Peaje +detail.percentual = Porcentaje +detail.poltrona = Sill\u00F3n +detail.preimpresso = Pre-Impreso +detail.seguro = Seguro +detail.servico = Servicio +detail.tarifa = Tarifa +detail.taxa = Tasa +detail.total = Total +detail.valor = Valor + +#Labels header +header.data = Data : +header.data.hora = Fecha / Hora: +header.descricao = Descri\u00E7\u00E3o +header.empresa = Empresa : +header.pagina = P\u00E1gina + +linhas = Linhas + +msg.a = a +msg.noData = No se pudo obtener datos con los par\u00E1metros reportados. diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_pt_BR.properties new file mode 100644 index 000000000..396684b5a --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasParcelamento_pt_BR.properties @@ -0,0 +1,39 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) +#geral + +detail.agencia = Ag\u00EAncia +detail.autorizacao = Autoriza\u00E7\u00E3o +detail.bilhete = Bilhete +detail.bilheteiro = Bilheteiro +detail.dataservico = Data Servi\u00E7o +detail.datavenda = Data Venda +detail.destino = Destino +detail.empresa = Empresa +detail.formapagamento = Forma pgto. +detail.linha = Linha +detail.nsu = Nsu +detail.origem = Origem +detail.outros = Outros +detail.parcelas = Parcelas +detail.pedagio = Ped\u00E1gio +detail.percentual = Percentual +detail.poltrona = Poltrona +detail.preimpresso = Pr\u00E9 Impresso +detail.seguro = Seguro +detail.servico = Servi\u00E7o +detail.tarifa = Tarifa +detail.taxa = Taxa +detail.total = Total +detail.valor = Valor + +#Labels header +header.data = Data : +header.data.hora = Data/Hora: +header.descricao = Descri\u00E7\u00E3o +header.empresa = Empresa : +header.pagina = P\u00E1gina + +linhas = Linhas + +msg.a = a +msg.noData = No se pudo obtener datos con los par\u00E1metros reportados. diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAgenciaFechamento.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAgenciaFechamento.jasper index 5b96925c3173ac4d4a4490c3fd1b05668513466b..ef60d8b67837f992eb2fae2f3a0902504bd77206 100644 GIT binary patch delta 73 zcmdlpn|aS{<_$lmiJO=i8JQZH8(WyfTbh`dnH#V(FfuaeOfF=V*{n0&%S;GELCNHU PvT~ETr*TeRf0h>j6mb<9 delta 73 zcmdlpn|aS{<_$lmi5pv*niyD^8e1C08=IRO85*)PFfuaeOfF=V*{n0&%S;GELCNHU PvT~ETr*TeRf0h>j6X_KZ diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasParcelamento.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasParcelamento.jasper new file mode 100644 index 0000000000000000000000000000000000000000..cc49e28e537f15339d667d63b17bb88fbb146096 GIT binary patch literal 50674 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasParcelamentoBean.java b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasParcelamentoBean.java new file mode 100644 index 000000000..3b7b57a1a --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasParcelamentoBean.java @@ -0,0 +1,234 @@ +package com.rjconsultores.ventaboletos.relatorios.utilitarios; + +import java.math.BigDecimal; +import java.util.Date; + +public class RelatorioVendasParcelamentoBean { + private String empresaNome; + private String empresa; + private String agencia; + private String bilheteiro; + private Date dataVenda; + private Date dataServico; + private String linha; + private String servico; + private String origem; + private String destino; + private String bilhete; + private String preImpresso; + private String poltrona; + private BigDecimal tarifa; + private BigDecimal seguro; + private BigDecimal pedagio; + private BigDecimal taxa; + private BigDecimal outros; + private BigDecimal total; + private BigDecimal percentual; + private String formaPagamento; + private String autorizacao; + private String nsu; + private String parcelas; + private BigDecimal valor; + + public String getEmpresaNome() { + return empresaNome; + } + + public void setEmpresaNome(String empresaNome) { + this.empresaNome = empresaNome; + } + + public String getEmpresa() { + return empresa; + } + + public void setEmpresa(String empresa) { + this.empresa = empresa; + } + + public String getAgencia() { + return agencia; + } + + public void setAgencia(String agencia) { + this.agencia = agencia; + } + + public String getBilheteiro() { + return bilheteiro; + } + + public void setBilheteiro(String bilheteiro) { + this.bilheteiro = bilheteiro; + } + + public Date getDataVenda() { + return dataVenda; + } + + public void setDataVenda(Date dataVenda) { + this.dataVenda = dataVenda; + } + + public Date getDataServico() { + return dataServico; + } + + public void setDataServico(Date dataServico) { + this.dataServico = dataServico; + } + + public String getLinha() { + return linha; + } + + public void setLinha(String linha) { + this.linha = linha; + } + + public String getServico() { + return servico; + } + + public void setServico(String servico) { + this.servico = servico; + } + + public String getOrigem() { + return origem; + } + + public void setOrigem(String origem) { + this.origem = origem; + } + + public String getDestino() { + return destino; + } + + public void setDestino(String destino) { + this.destino = destino; + } + + public String getBilhete() { + return bilhete; + } + + public void setBilhete(String bilhete) { + this.bilhete = bilhete; + } + + public String getPreImpresso() { + return preImpresso; + } + + public void setPreImpresso(String preImpresso) { + this.preImpresso = preImpresso; + } + + public String getPoltrona() { + return poltrona; + } + + public void setPoltrona(String poltrona) { + this.poltrona = poltrona; + } + + public BigDecimal getTarifa() { + return tarifa; + } + + public void setTarifa(BigDecimal tarifa) { + this.tarifa = tarifa; + } + + public BigDecimal getSeguro() { + return seguro; + } + + public void setSeguro(BigDecimal seguro) { + this.seguro = seguro; + } + + public BigDecimal getPedagio() { + return pedagio; + } + + public void setPedagio(BigDecimal pedagio) { + this.pedagio = pedagio; + } + + public BigDecimal getTaxa() { + return taxa; + } + + public void setTaxa(BigDecimal taxa) { + this.taxa = taxa; + } + + public BigDecimal getOutros() { + return outros; + } + + public void setOutros(BigDecimal outros) { + this.outros = outros; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getPercentual() { + return percentual; + } + + public void setPercentual(BigDecimal percentual) { + this.percentual = percentual; + } + + public String getFormaPagamento() { + return formaPagamento; + } + + public void setFormaPagamento(String formaPagamento) { + this.formaPagamento = formaPagamento; + } + + public String getAutorizacao() { + return autorizacao; + } + + public void setAutorizacao(String autorizacao) { + this.autorizacao = autorizacao; + } + + public String getNsu() { + return nsu; + } + + public void setNsu(String nsu) { + this.nsu = nsu; + } + + public String getParcelas() { + return parcelas; + } + + public void setParcelas(String parcelas) { + this.parcelas = parcelas; + } + + public BigDecimal getValor() { + return valor; + } + + public void setValor(BigDecimal valor) { + this.valor = valor; + } + + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasParcelamentoController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasParcelamentoController.java new file mode 100644 index 000000000..5555c7189 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasParcelamentoController.java @@ -0,0 +1,190 @@ +package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.log4j.Logger; +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.Bandbox; +import org.zkoss.zul.Datebox; +import org.zkoss.zul.Intbox; +import org.zkoss.zul.Paging; + +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.PuntoVenta; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasParcelamento; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.service.EmpresaService; +import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar; +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.RenderRelatorioVendasBilheteiro; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSelecionados; + +@Controller("relatorioVendasParcelamentoController") +@Scope("prototype") +public class RelatorioVendasParcelamentoController extends MyGenericForwardComposer { + private static final long serialVersionUID = 1L; + private static Logger log = Logger.getLogger(RelatorioVendasParcelamentoController.class); + + @Autowired + private DataSource dataSourceRead; + @Autowired + private EmpresaService empresaService; + + private Datebox datInicial; + private Datebox datFinal; + private Intbox parInicial; + private Intbox parFinal; + private MyComboboxEstandar cmbEmpresa; + private Bandbox bbPesquisaPuntoVenta; + @Autowired + private transient PagedListWrapper plwPuntoVenta; + private MyTextbox txtNombrePuntoVenta; + private MyListbox puntoVentaList; + private MyListbox puntoVentaSelList; + private Paging pagingPuntoVenta; + + private List lsEmpresas; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void executarRelatorio() throws Exception { + try { + Map parametros = new HashMap(); + + Empresa empresa = cmbEmpresa.getSelectedItem() != null ? (Empresa)cmbEmpresa.getSelectedItem().getValue() : null; + + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + parametros.put("fecInicio", sdf.format(this.datInicial.getValue())); + parametros.put("fecFinal", sdf.format(this.datFinal.getValue())); + parametros.put("parInicial", this.parInicial.getValue()); + parametros.put("parFinal", this.parFinal.getValue()); + if (empresa != null){ + parametros.put("empresa", empresa.getEmpresaId()); + parametros.put("empresaNome", empresa.getNombempresa()); + } + parametros.put("TITULO", Labels.getLabel("indexController.mniRelatorioVendasParcelamento.label")); + + String puntoVentaIds = ""; + String puntoVentas = ""; + List lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData())); + if (lsPuntoVentaSelecionados.isEmpty()) { + puntoVentas = "Todas"; + } else { + for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) { + PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i); + puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ","; + + puntoVentaIds = puntoVentaIds + puntoVenta.getPuntoventaId() + ","; + } + + // removendo ultima virgula + puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1); + puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1); + parametros.put("NUMPUNTOVENTA", puntoVentaIds); + } + + Relatorio relatorio = new RelatorioVendasParcelamento(parametros, dataSourceRead.getConnection()); + + Map args = new HashMap(); + args.put("relatorio", relatorio); + + openWindow("/component/reportView.zul", + Labels.getLabel("indexController.mniRelatorioVendasParcelamento.label"), args, MODAL); + }catch (Exception e) { + log.error(e); + throw e; + } + + } + + public void onClick$btnExecutarRelatorio(Event ev) throws Exception { + executarRelatorio(); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + lsEmpresas = empresaService.obtenerTodos(); + super.doAfterCompose(comp); + puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro()); + puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados()); + } + + private void executarPesquisa() { + HibernateSearchObject puntoVentaBusqueda = + new HibernateSearchObject(PuntoVenta.class, pagingPuntoVenta.getPageSize()); + + puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%"); + puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + 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("relatorioVendasBilheteiroController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + public void onClick$btnPesquisa(Event ev) { + executarPesquisa(); + } + + public void onDoubleClick$puntoVentaSelList(Event ev) { + PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected(); + puntoVentaSelList.removeItem(puntoVenta); + } + + public void onDoubleClick$puntoVentaList(Event ev) { + PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected(); + puntoVentaSelList.addItemNovo(puntoVenta); + } + + public void onClick$btnLimpar(Event ev) { + puntoVentaList.setData(new ArrayList()); + + bbPesquisaPuntoVenta.setText(""); + } + + + public MyComboboxEstandar getCmbEmpresa() { + return cmbEmpresa; + } + + public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) { + this.cmbEmpresa = cmbEmpresa; + } + + public List getLsEmpresas() { + return lsEmpresas; + } + + public void setLsEmpresas(List lsEmpresas) { + this.lsEmpresas = lsEmpresas; + } + + + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioVendasParcelamento.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioVendasParcelamento.java new file mode 100644 index 000000000..ce077d0f7 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioVendasParcelamento.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 ItemMenuRelatorioVendasParcelamento extends DefaultItemMenuSistema { + + public ItemMenuRelatorioVendasParcelamento() { + super("indexController.mniRelatorioVendasParcelamento.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.RELATORIOS.MENU.RELATORIOVENDASPARCELAMENTO"; + } + + @Override + public void ejecutar() { + PantallaUtileria.openWindow("/gui/relatorios/filtroRelatorioVendasParcelamento.zul", + Labels.getLabel("relatorioVendasParcelamentoController.window.title"), getArgs() ,desktop); + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties index 3dd664715..f90ed5257 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties @@ -181,6 +181,7 @@ analitico.gerenciais.financeiro.relatorioPosicaoCaixaAnalitico=com.rjconsultores analitico.gerenciais.financeiro.relatorioFormaPagamentoAgencia=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioFormaPagamentoAgencia analitico.gerenciais.financeiro.relatorioFinanceiroGrupoLinhas=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioFinanceiroGrupoLinhas analitico.gerenciais.financeiro.relatorioVendasPTA=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioVendasPTA +analitico.gerenciais.financeiro.relatorioVendasParcelamento=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioVendasParcelamento analitico.gerenciais.financeiro.relatorioServicoBloqueadoVendaInternet=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioServicoBloqueadoVendaInternet analitico.gerenciais.financeiro.relatorioDocumentosFiscais=com.rjconsultores.ventaboletos.web.utilerias.menu.item.relatorios.ItemMenuRelatorioDocumentosFiscais analitico.gerenciais.pacote=com.rjconsultores.ventaboletos.web.utilerias.menu.item.analitico.gerenciais.pacote.SubMenuRelatorioPacote diff --git a/web/WEB-INF/i3-label_es_MX.label b/web/WEB-INF/i3-label_es_MX.label index a2179e13f..2bad94665 100644 --- a/web/WEB-INF/i3-label_es_MX.label +++ b/web/WEB-INF/i3-label_es_MX.label @@ -288,6 +288,7 @@ indexController.mniRecebimentoMalote.label = Recibimiento Maleta indexController.mniRelatorioObservacaoConferenciaMovimento.label = Observación conferencia movimientos indexController.mniRelatorioErrosIntegracaoBGMController.label = Listar errores BGM indexController.mniRelatorioVendasPTAController.label = Ventas PTA +indexController.mniRelatorioVendasParcelamento.label=Ventas con Parcelamiento indexController.mniRelatorioServicoBloqueadoVendaInternet.label = Corrida bloqueada en venta internet indexController.mniRelatorioDocumentosFiscais.label = Report Documentos Fiscais @@ -7125,4 +7126,15 @@ relatorioFinanceiroReceitasDespesasController.lb.detalhado = Detalhado relatorioFinanceiroReceitasDespesasController.lb.sintetico = Sintético relatorioFinanceiroReceitasDespesasController.lb.agencia = Por Agência relatorioFinanceiroReceitasDespesasController.lb.evento = Por Evento -relatorioFinanceiroReceitasDespesasController.lbEventoExtra.value = Evento \ No newline at end of file +relatorioFinanceiroReceitasDespesasController.lbEventoExtra.value = Evento + +# Relatório Vendas com Parcelamento +relatorioVendasParcelamentoController.window.title = Ventas con Parcelamiento +relatorioVendasParcelamentoController.lbDataFin.value = Fecha Final +relatorioVendasParcelamentoController.lbDataIni.value = Fecha Inicio +relatorioVendasParcelamentoController.lbParcelas.value = Parcelas +relatorioVendasParcelamentoController.lbate.value = Hasta +relatorioVendasParcelamentoController.lbEmpresa.value = Empresa +relatorioVendasParcelamentoController.lbOnibus.value = Autobus +relatorioVendasParcelamentoController.lbPuntoVenta.value = Agência +relatorioVendasParcelamentoController.lbResumo.value = Resumo \ No newline at end of file diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 8e804dbaa..8c2510a8d 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -305,6 +305,7 @@ indexController.mniRecebimentoMalote.label = Recebimento Malote indexController.mniRelatorioObservacaoConferenciaMovimento.label = Movimentos com Observação indexController.mniRelatorioErrosIntegracaoBGMController.label = Listar Erros BGM indexController.mniRelatorioVendasPTA.label = Vendas PTA +indexController.mniRelatorioVendasParcelamento.label=Vendas com Parcelamento indexController.mniRelatorioServicoBloqueadoVendaInternet.label = Serviço Bloqueado na Venda Internet indexController.mniRelatorioDocumentosFiscais.label = Relatório Documentos Fiscais @@ -7619,4 +7620,16 @@ indexController.mniRelatorioBaixasVendasInternet.label=Baixas Vendas Internet relatorioBaixasVendasInternetController.window.title=Relatório de Baixas Vendas Internet relatorioBaixasVendasInternetController.lbFecInicio.value=Data Início relatorioBaixasVendasInternetController.lbFecFinal.value=Data Fim -relatorioBaixasVendasInternetController.lbPuntoVenta.value=Ponto de Venda \ No newline at end of file +relatorioBaixasVendasInternetController.lbPuntoVenta.value=Ponto de Venda + +# Relatório Vendas com Parcelamento + +relatorioVendasParcelamentoController.window.title = Vendas com Parcelamento +relatorioVendasParcelamentoController.lbDataFin.value = Data Final +relatorioVendasParcelamentoController.lbDataIni.value = Data Inicial +relatorioVendasParcelamentoController.lbParcelas.value = Parcelas +relatorioVendasParcelamentoController.lbate.value = até +relatorioVendasParcelamentoController.lbEmpresa.value = Empresa +relatorioVendasParcelamentoController.lbOnibus.value = Ônibus +relatorioVendasParcelamentoController.lbPuntoVenta.value = Agência +relatorioVendasParcelamentoController.lbResumo.value = Resumo \ No newline at end of file diff --git a/web/gui/relatorios/filtroRelatorioVendasParcelamento.zul b/web/gui/relatorios/filtroRelatorioVendasParcelamento.zul new file mode 100644 index 000000000..6dc091fc5 --- /dev/null +++ b/web/gui/relatorios/filtroRelatorioVendasParcelamento.zul @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + +