From 7a6dc963484ee81320f61b5710d47d3a5708dab4 Mon Sep 17 00:00:00 2001 From: walace Date: Thu, 27 May 2021 21:00:03 +0000 Subject: [PATCH] fixes bug#22386 qua:juliane dev: git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@106920 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../impl/RelatorioVendasConexaoRuta.java | 130 +++-- .../RelatorioVendasConexaoRuta_es.properties | 32 +- ...elatorioVendasConexaoRuta_pt_BR.properties | 16 +- .../RelatorioVendasConexaoRuta.jasper | Bin 48826 -> 53235 bytes .../RelatorioVendasConexaoRuta.jrxml | 484 ++++++++++-------- .../RelatorioVendasConexaoRutaBean.java | 36 ++ .../RelatorioVendasConexaoRutaController.java | 233 +++++++-- web/WEB-INF/i3-label_pt_BR.label | 13 + .../filtroRelatorioVendasConexao.zul | 6 +- .../filtroRelatorioVendasConexaoRuta.zul | 140 +++-- 10 files changed, 739 insertions(+), 351 deletions(-) diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasConexaoRuta.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasConexaoRuta.java index 1e6512192..b9aee4593 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasConexaoRuta.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioVendasConexaoRuta.java @@ -15,6 +15,7 @@ import org.apache.log4j.Logger; import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasConexaoRutaBean; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; @@ -27,8 +28,8 @@ public class RelatorioVendasConexaoRuta extends Relatorio { private Timestamp fecInicio; private Timestamp fecFinal; - private Integer empresaId; - private Integer puntoventaId; + + private static final String FILTRO_POR_TODOS = "-1"; public RelatorioVendasConexaoRuta(Map parametros, Connection conexao) throws Exception { super(parametros, conexao); @@ -38,17 +39,14 @@ public class RelatorioVendasConexaoRuta extends Relatorio { @Override public void initDados() throws Exception { Map parametros = this.relatorio.getParametros(); - fecInicio = (Timestamp) parametros.get("dataFiltroInicial"); - fecFinal = (Timestamp) parametros.get("dataFiltroFinal"); - if(parametros.get("EMPRESA_ID")!=null){ - empresaId = Integer.valueOf(parametros.get("EMPRESA_ID").toString()); - } - if(parametros.get("PUNTOVENTA_ID")!=null){ - puntoventaId = Integer.valueOf(parametros.get("PUNTOVENTA_ID").toString()); - } - + fecInicio = new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime()); + fecFinal = new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_FINAL")).getTime()); + +// fecInicio = (Timestamp) parametros.get("DATA_INICIAL"); +// fecFinal = (Timestamp) parametros.get("DATA_INICIAL"); + Connection conexao = this.relatorio.getConexao(); - processarVendasConexao(conexao); + processarVendasConexao(conexao, parametros); setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); } @@ -56,13 +54,13 @@ public class RelatorioVendasConexaoRuta extends Relatorio { }); } - private void processarVendasConexao(Connection conexao) { + private void processarVendasConexao(Connection conexao, Map parametros) { ResultSet rset = null; NamedParameterStatement stmt = null; try { - stmt = carregarNamedParameterStatement(conexao); + stmt = carregarNamedParameterStatement(conexao, parametros); rset = stmt.executeQuery(); processarResultado(rset); fecharConexaoBanco(conexao, stmt, rset); @@ -100,7 +98,7 @@ public class RelatorioVendasConexaoRuta extends Relatorio { RelatorioVendasConexaoRutaBean bean = new RelatorioVendasConexaoRutaBean(); - bean.setServico((Integer) rset.getInt("numBPE")); + bean.setNumBpe((Integer) rset.getInt("numBPE")); bean.setPreco((BigDecimal) rset.getObject("preco")); bean.setTaxaEmbarque((BigDecimal) rset.getObject("taxaEmbarque")); bean.setPedagio((BigDecimal) rset.getBigDecimal("pedagio")); @@ -121,10 +119,14 @@ public class RelatorioVendasConexaoRuta extends Relatorio { bean.setCveusuario((String) rset.getObject("cveusuario")); bean.setNumoperacion((String) rset.getObject("numoperacion")); bean.setClasseServico((String) rset.getObject("classeServico")); - - total = total.add(bean.getPreco() != null ? bean.getPreco() : BigDecimal.ZERO); - - + bean.setSubSerie((String) rset.getObject("subSerie")); + bean.setDescricaoConexao((String) rset.getObject("descricaoConexao")); + bean.setIdCadastroConexao((Integer) rset.getInt("IdCadastroConexao")); + bean.setDescuento((String) rset.getObject("descuento")); + total = total.add(bean.getPreco() != null ? bean.getPreco() : BigDecimal.ZERO); + total = total.add(bean.getTaxaEmbarque() != null ? bean.getTaxaEmbarque() : BigDecimal.ZERO); + total = total.add(bean.getPedagio() != null ? bean.getPedagio() : BigDecimal.ZERO); + total = total.add(bean.getSeguro() != null ? bean.getSeguro() : BigDecimal.ZERO); lsDadosRelatorio.add(bean); } @@ -135,8 +137,8 @@ public class RelatorioVendasConexaoRuta extends Relatorio { } - private NamedParameterStatement carregarNamedParameterStatement(Connection conexao) throws SQLException { - String sql = getSql(); + private NamedParameterStatement carregarNamedParameterStatement(Connection conexao, Map parametros) throws SQLException { + String sql = getSql(parametros); log.info(sql); NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); @@ -147,27 +149,21 @@ public class RelatorioVendasConexaoRuta extends Relatorio { if(fecFinal != null) { stmt.setTimestamp("fecFinal", fecFinal); } - if(empresaId != null) { - stmt.setInt("EMPRESA_ID", empresaId); - } - if(puntoventaId != null && puntoventaId > -1) { - stmt.setInt("PUNTOVENTA_ID", puntoventaId); - } - + return stmt; } - protected String getSql() { + protected String getSql(Map parametros) { StringBuilder sb = new StringBuilder(); sb.append("SELECT c.numfoliosistema as bilhete,"); sb.append(" b.num_bpe as numBpe,"); - sb.append(" c.origen_id as codOrigem,"); + sb.append(" origen.cveparada as codOrigem,"); sb.append(" origen.descparada as descricaoOrigem,"); sb.append(" destino.descparada as descricaoDestino ,"); - sb.append(" c.destino_id as codDestino,"); + sb.append(" destino.cveparada as codDestino,"); sb.append(" r.numruta as numLinha, "); sb.append(" r.descruta as descricaoLinha, "); sb.append(" c.corrida_id as servico,"); @@ -175,14 +171,18 @@ public class RelatorioVendasConexaoRuta extends Relatorio { sb.append(" c.fechorviaje as dataEmbarque,"); sb.append(" c.fechorventa dataVenda,"); sb.append(" c.numasiento as poltrona,"); - sb.append(" tar.precio AS preco,"); + sb.append(" c.preciopagado AS preco,"); sb.append(" c.importetaxaembarque as taxaEmbarque,"); sb.append(" c.importeseguro as seguro,"); sb.append(" c.importepedagio as pedagio,"); sb.append(" pv.numpuntoventa as numeroAgencia, "); sb.append(" pv.nombpuntoventa as nomeAgencia, "); sb.append(" u.cveusuario as cveusuario, "); - sb.append(" c.numoperacion as numoperacion "); + sb.append(" c.numoperacion as numoperacion, "); + sb.append(" 'BPe' as subSerie, "); + sb.append(" conf.descricao descricaoConexao, "); + sb.append(" conf.conexionrutaconf_id IdCadastroConexao, "); + sb.append(" CONV.descconvenio as descuento "); sb.append("FROM caja c "); sb.append("JOIN boleto b on (c.transacao_id = b.boleto_id) "); sb.append("JOIN caja_formapago cfp ON cfp.caja_id = c.caja_id "); @@ -197,15 +197,14 @@ public class RelatorioVendasConexaoRuta extends Relatorio { sb.append("JOIN ruta r ON (r.ruta_id = c.ruta_id) "); sb.append("JOIN clase_servicio cs ON (c.claseservicio_id = cs.claseservicio_id) "); sb.append("INNER JOIN vigencia_tarifa vt ON c.fechorventa BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia "); - sb.append("AND vt.activo = 1"); - sb.append("INNER JOIN tarifa tar ON (tar.ruta_id = c.ruta_id"); - sb.append(" AND tar.marca_id = m.marca_id"); - sb.append(" AND tar.claseservicio_id = c.claseservicio_id "); - sb.append(" AND tar.vigenciatarifa_id = vt.vigenciatarifa_id "); - sb.append(" AND tar.origen_id = c.origen_id "); - sb.append(" AND tar.destino_id = c.destino_id "); - sb.append(" AND tar.activo = 1)"); + sb.append("AND vt.activo = 1 "); sb.append("INNER JOIN usuario u ON (c.usuario_id = u.usuario_id) "); + sb.append("join conexion cc on cc.conexionctrl_id = c.conexionctrl_id and cc.activo =1 "); + sb.append("join conexion_ruta_tramo_ctrl ctr on ctr.conexionrutatramoctrl_id = cc.conexionrutatramoctrl_id and ctr.activo = 1 "); + sb.append("join conexion_ruta_ctrl ctrl on ctrl.conexionrutactrl_id = ctr.conexionrutactrl_id and ctrl.activo =1 "); + sb.append("join conexion_ruta_conf conf on conf.conexionrutaconf_id = ctrl.conexionrutaconf_id and conf.activo =1 "); + sb.append("left JOIN CONVENIO_DET CONV_D ON CONV_D.CONVENIODET_ID = c.CONVENIODET_ID "); + sb.append(" left join CONVENIO CONV ON CONV.CONVENIO_ID = CONV_D.CONVENIO_ID "); sb.append("WHERE c.indconexion = 1"); sb.append(" AND c.indreimpresion = 0"); sb.append(" AND c.tipoventa_id <> 6"); @@ -218,25 +217,64 @@ public class RelatorioVendasConexaoRuta extends Relatorio { sb.append(" JOIN punto_venta pv ON pv.puntoventa_id = c.puntoventa_id"); sb.append(" WHERE c.indconexion = 1"); sb.append(" AND c.indreimpresion = 0 and (c.indstatusboleto = 'V' or c.indstatusboleto = 'T' ) and c.motivocancelacion_id is null "); - sb.append(" AND c.tipoventa_id <> 6"); + sb.append(" AND c.tipoventa_id <> 6 "); + if(fecInicio != null) { sb.append("AND COALESCE(C.FECHORVENTA_H,C.FECHORVENTA) >= :fecInicio "); } if(fecFinal != null) { sb.append("AND COALESCE(C.FECHORVENTA_H,C.FECHORVENTA) <= :fecFinal "); } - if(empresaId != null) { - sb.append("AND E.EMPRESA_ID = :EMPRESA_ID "); + if ((String)parametros.get("EMPRESA_ID") != null && !filtrarTodos("EMPRESA_ID")) { + sb.append(" AND e.empresa_id IN ("+parametros.get("EMPRESA_ID")+")"); } - if(puntoventaId != null && puntoventaId > -1) { - sb.append("AND C.PUNTOVENTA_ID = :PUNTOVENTA_ID "); + if ((String)parametros.get("PUNTOVENTA_ID") != null && !filtrarTodos("PUNTOVENTA_ID")) { + sb.append(" AND b.puntoventa_id IN ("+parametros.get("PUNTOVENTA_ID")+")"); } + sb.append(") "); + sb.append(" group by "); + sb.append(" c.numfoliosistema ,"); + sb.append(" b.num_bpe ,"); + sb.append(" origen.cveparada ,"); + sb.append(" origen.descparada,"); + sb.append(" destino.descparada ,"); + sb.append(" destino.cveparada ,"); + sb.append(" r.numruta ,"); + sb.append(" r.descruta ,"); + sb.append(" c.corrida_id ,"); + sb.append(" cs.descclase ,"); + sb.append(" c.fechorviaje, "); + sb.append(" c.fechorventa , "); + sb.append(" c.numasiento , "); + sb.append(" c.preciopagado ,"); + sb.append(" c.importetaxaembarque ,"); + sb.append(" c.importeseguro, "); + sb.append(" c.importepedagio ,"); + sb.append(" pv.numpuntoventa ,"); + sb.append(" pv.nombpuntoventa ,"); + sb.append(" u.cveusuario ,"); + sb.append(" c.numoperacion ,"); + sb.append(" conf.descricao ,"); + sb.append(" conf.conexionrutaconf_id, CONV.descconvenio "); + sb.append(" order by c.fechorventa, c.numoperacion "); + + return sb.toString(); } + private boolean filtrarTodos(String parametro) { + String ids = (String)parametros.get(parametro); + for (int i = 0; i < ids.split(", ").length; i++) { + if (FILTRO_POR_TODOS.equals(ids.split(", ")[i])) { + return true; + } + } + return false; + } + @Override protected void processaParametros() throws Exception { } diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_es.properties index 1fbd2fb26..eb80f96d2 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_es.properties +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_es.properties @@ -2,8 +2,8 @@ msg.noData=Não foi possivel obter dados com os parâmetros informados. #Labels cabeçalho -cabecalho.nome=Relatório Vendas Conexão por Linha -cabecalho.relatorio=Relatório: +cabecalho.nome=Repoert Vendas Conexion por Ruta +cabecalho.relatorio=Report: cabecalho.periodo=Período: cabecalho.periodoA=à cabecalho.dataHora=Data/Hora: @@ -11,31 +11,35 @@ cabecalho.impressorPor=Impressor por: cabecalho.pagina=Página cabecalho.de=de cabecalho.filtros=Filtros: -cabecalho.puntoventa=Agência: +cabecalho.puntoventa=Punto Venta: cabecalho.usuario=Usuário: -label.bpe=Nº BPE -label.nomeAgencia=Pnuto Venta +label.bpe=BPE +label.subSerie=SubSerie +label.nomeAgencia=Punto Venta label.numeroAgencia=Nº Punto Venta -label.dataVenda=Fechor Venta -label.dataEmbarque=Fechor Embarque -label.bilhete=Folio -label.dataEmissao=Fechor Emissão -label.preco=Preço +label.dataVenda=Dt.Venda +label.dataEmbarque=Dt.Embarque +label.bilhete=Bilhete +label.dataEmissao=Dt.Emissão +label.preco=Tarifa label.taxaEmbarque=Taxa Emb. label.seguro=Seguro label.pedagio=Pedágio label.origem= Origem label.destino=Destino -label.numLinha=Nº Linha -label.descricaoLinha=Linha -label.servico=Servicio +label.numLinha=Nº Ruta +label.descricaoLinha=Ruta +label.servico=Corrida label.classeServico=Clase label.poltrona= Asiento label.dataInicial=Fechor Inicial: label.dataFinal=Fechor Final: label.cveusuario=Usuário label.empresa=Empresa: - +label.IDCesta=ID Cesta: +label.IDCadastroConexao=ID Conex. +label.descricaoDesconto=Desconto. +label.descricaoConexao=Nombre Conexion label.total=Total R$: \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_pt_BR.properties index 0e4b0e40a..909022d36 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_pt_BR.properties +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioVendasConexaoRuta_pt_BR.properties @@ -15,14 +15,15 @@ cabecalho.puntoventa=Ag cabecalho.usuario=Usuário: -label.bpe=Nº BPE +label.bpe=BPE +label.subSerie=SubSerie label.nomeAgencia=Agência label.numeroAgencia=Nº Agência -label.dataVenda=Data Venda -label.dataEmbarque=Data Embarque +label.dataVenda=Dt.Venda +label.dataEmbarque=Dt.Embarque label.bilhete=Bilhete -label.dataEmissao=Data Emissão -label.preco=Preço +label.dataEmissao=Dt.Emissão +label.preco=Tarifa label.taxaEmbarque=Taxa Emb. label.seguro=Seguro label.pedagio=Pedágio @@ -37,5 +38,8 @@ label.dataInicial=Data Inicial: label.dataFinal=Data Final: label.cveusuario=Usuário label.empresa=Empresa: - +label.IDCesta=ID Cesta: +label.IDCadastroConexao=ID Conex. +label.descricaoDesconto=Desconto +label.descricaoConexao=Conexão label.total=Total R$: \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jasper index fba184a1e8dc91aa4fc42435ee32f4bfcdb2074a..31fb61b2c4b1d8606faf3fccd50fa24fbbf94582 100644 GIT binary patch literal 53235 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 R>+0;yENp?S(dTCp{~uYkFmC_= literal 48826 zcmeHwd3;sH`S;A63%P^~gs_VsZk07*cSo~9g4s+0C}_h?azm~p_r{wW2&lLfw1T)> zK-?FswNe$qy49+cR$G^F-V!T_x5tttR1L$!I*bkPV8q&2El|lLa!}?07sGNl?VL>h_kF zaAHMyWI3Wo7P2u;(1K{PiNcB_;f6>eFVK|>Zi6)yPI!y`7Y>qT0RYmhz-*_S# zi2>m#7ob*|Lv%?KYTbukWF7MX08*0`31p4xCn$p5)IQ00tDRf_KD0$_E-bxHb7ykFq(+eQ?-(8ns34+O3JNj zk2wj7V(l%+C#3RGcp&lzoG^tX8McT88&KW0NU|--#xC+LX>Jv@3{fffhDc+$y*XK( zT+tj!vO{}FD5D`+?}kV+9BtOs>8IYR?S>xKQ!XkZ^2u(DCtAYE+2Q(RJh39x!-4W> ziyUv&kz|q$Py?eq8EwWmqIw5ukhFucazK=_{umrd>Np0T`nH6lG2PfC>#15PtOQ~h zl{)9%G1(DxQ?pzhZGO199XOln+geH1id65^RFz%SsH^U@)a`Xy15&+J7d55lqAHyp zE=yX(dbbg2(JOw?Q?Iazo6)9*r>w>z)+ZThX>ATCDUaNq@=*MyMyCLwdL?Pp>J|+$ z2bONtjGkMyz!;FSWgV@IJzfLOI~YH%Sg>`Fda6KC&6qWpLMX~$29`b{O}0s6SY<_A zJ;R@A_HK$0Ct1kAqpDk*qshGH=J@hRLn#|1DM*zs>S#?w+S()^81LKOxmBsSz+b=C zL>#kEG8$@IU7?XYTm%UlGk#baY zNU&*XVzsC_(gH3$2aFWNqd&r~z-X>-iZ(YS0JG~Thk9wWP4cLSD_xRJ^sOP#=ZbxF zM=Pj4i00rN$}%S}kqED#d^^tlZOFJiswFrdIc4(*A5$jP&#wLPJu zb}xUadG@NmtomTxQ>$kPMKi`bHE6JG`CwFkvL9|;)vt+kBxgq>&93o3#DDzvtBc2% zLY`S#8d(-;&S(82%P=!YS)?Y~63J%+n$STK&C%G>8VFXAWIpSc3IS*#8v@ReOhl6P zO(XzSEQ=%>!9q&e;Bc(IDV`u9F~t>#aM=(rQpLy-)${BvqhZhwN~NRA>;6t& zRguOBSWJEA@=Do$PMn%}yg3dYo`iwc#vO6S_EyRj{T=;V5?Nq&v%Z;VC2icuEO# zgydluEu^EA#AZjq))zE^Int~zCqW5;4iSO6(I8vWwvg?oQxJD8lzOK~=GvntXO zUlyUBM=>NL&S#<4cw3b8ZW2_nK+vY9S9&X9y_VCOMG4~__^p7DO!|F2F*qVMxYS^` zS`3kTSrp?l2?)5ZkLq9OQl{-x#30=QER`@EMMCq9xQn!wMpo#q9B7F*NKSxZ*oXX@ zrW1UNmmRJQv2|zbi?Ic^DA^5VoKeb#yMlLMQ$z&LC|SSR!5iQN0V)HS>Kkp^VZRN?(VO)?0%y0!4XF;E&O)Bxi=D` zsFqT@7?{$Lv>1^6_6@guaqb02K!L!BT}F#7;7?hpc;)SwauaLrylPb6EC0II)&Md{ zU7PMF9m!UEO!OWt?_E$-UQ<-1YN;xkE`ua~gjrZ+N@`Hw&cY875A$^&EfJCS>p#Lt zOQ8kEct>S~#7PKV9R(x=p(t>to)lxGb7IpR>LogmG!c=~XLXm!+G=$m-qR(mf}~P+ zoyB_7yr%Q$kW^21%v1pfv$s?&U%muwSaWR*C|wgYsHna{(vgd989X@C2l<_n^co-5=8` zGW`Vt5r&*YvKLQ=UDP!dq7 zznnhh{)$Vh&Q66^MZ(PvM6QG$iZwV@lFu4k=aO1Ze)f&%2{+HPCu5Gb&rFl8cFHS- z0FloEgz-{5wAL&-TCF7O-whc6^n}}Fcc7l>mfGmOh*FZLSa#I8s~=gpH1_0qCtkk!7eAl1x?qOQ z)l{T%8MTtq$Um8;N|ij{j!L;n4L~}}74+1uP!IN~k}1IA?o!lw08krQmj+eOCRxwr zx|XR2rBw8w(LohmDwEMT`$0Rs)7rUOdrg2aA=-0N`4>>$(pjzQ zWguTc6~LIA+Y~j}STnUVpsGl`2M?Zj z@WGRFCQt4T>!TSHL;BmJg}~y z9$0q+46M5W2G%ve6YE#l$a0>3SRdO?bvCY&{A_@REh2kL{Z*eFTFW6q?Tevc>KPQUcH%#N$?IpFp`jXM4Gj04X< z@U-&(?j_oPMfH=;!yaf?P!F`b0S4OL00ZqB;EDE!ZEQPFKeSKqKznbC$=H1L+Ftfpj;(K)M@XAYB7Ik^Z!U zY}@09^obrw?}L2?oZwl4LoNEx>Fi8ZzpDUqC~zH3AKx2i?;Q0td*sE(M1IH5i{pEV z@7Jkb(s|Vb-wNu1Z#Tfew;N#KTLXZNuF~VHHj(PX3>Fn=;YX$YdwHsjI+6^#ptpT36-rvEo?eW9)R1aMDt0%L8 z2&@nG1mjo*;IE{O@t-%mep77pbJ>6Cm$>?zH;#XFFEKuWFfN^O9vD|p4~)A32FBe0 z1LGRtiScnZqMfH7#;18;ybmpY&5y(yy6Q%0tbEaWKqPIz`Pq^VBQTdFs}igm_OXXxb5-7{B#e@XS7BdV1CkBZb@VM zB&?s8HrDT4T7J4)_h9$4?)7Fp7cQ|I~*jY@O5k=9?XPaElLv#yNiUpzjX+_~o7aU=8E_7dsy z2N&uk~0n#+y-AhSdg@w_EC&>HQ^ zXnK?v3HLkG#{H$a4Hs8Tn)&Lpf7@{BN3oLRUgExp4dthEc zJuvSE7?^hh49shQC*~a%krw8U@W6a#{jx}VTYEUsg~!tfd8O4keAS<$3W0EvdoQC3bHc z$)*6iw>_F+N#g_T*=99Ho3VkO+7_kuWFw~~WIvNmPWE~KlsVfXvW-j~sUP3dPBI-x zkmv7FAJY8_}>7kjTl0Ev2#x!>Qo@w2j*eJF#TS1Q1nq zLebbBt6FVmaWtjGQFV#Ov{KrUQ9pUCkJ^?G!?$JVXk@O7Ovd$usrfoC^4PzdPN2{C z%%$9eGT_;G{tT8mZ~nyu>*9xMt9c! z`Wz{2>Bt0(LWgy(v1x1ylRF%M!XFMB$b*OS*dy3OL~=|1V*rfJZkp@)I{yUr2CXZu z>r^9-V}fa&IufA|Sf>x~^nCjqkEDmR>UV z44qzzl+xyk-z~}2X0I#eVA(lf$=sBaA6-%ysgJgVn^X8THY(Fk=4`ULlK3ENAP&5@ zhjALF09Ip>=5Rwiy>zB5=}P0*W%N!|nz5ZFwlw3Ls}`s~j(pN5zW~;j%lHo)Ww>IDqEG~~w zM$$TnVlHH%rIAQ$O&oTSO>`~8u$E}7SQ=E<#H(Eq!Kmx$9twM+#We@M6Y1P4J0_;& zt~QE;%%Si$!{{GF3D&C7Sbaj8Zj&s#kdbZMiZ)ye0DBjl zN^QtzeIV9Fq?I}3R##e$)-)_E3Q`4XoOY#If2SUENCYNy!ek`d38mWU68$Z8=rmz& ziMvs{%#luBk%aqF3g>8KDLbH>D8>oOQZ_UigZWXoS=OhM3~x$InG$#I7Lkywu&G;< z#*uJ2^augEC3`Az!AATeEc&vvPTO`Omg-i`}74yn#i0d&rBpB?h%<&`}9*Zm= zld|T}Ldn=Ev;vD-_!_tp0du+#(4!uK@``dSaXA&~lYT`eqawJI$33gm%2ttx_aSQN zYY8H2Xb{DtcD?3QRm`iznf)$kNYyyAbB*bIrMpsT9#`(lw>&D;yS$>REU#3RewfCa zI%Fsh21-1p?iH}D>xsh`Pbm}i(6~k_I|ec|t|!YpWo}Hir4eX&eHs%>>XxYsSj3{)q+iQ7)IUqK$2=9DOVt_L!?32xwt2d_6QHh8nynEQiYe)ZZ(sRrH-cb10jUWB2aEMJs zP^kMJM)|3(C4D{jubC82I#WFQmx6lqFE_yGUv7ZWzcj$7e@*e|UsSuX6iy!O&38}J zkOxisDVlm8oJNkF$(iDD_L1qpJ|pLbIUk%nZsp`JANlyR8{e8yfn|SvG-jWYvzYKC z9oTVE3k`OmpdRFO0}OJy0R}lWz=xd57{_E6RJ-)Z+0TQVeHA&qPGtKMlXd~=EcU)5 z=GyF2icVj!z5KG25tC9kmu{4p0U4 zps5>R(9{huXsQ7|G+pwYXga`yri1ky>S?}3CK~*=vpsE{SP*nqbsJh}iQ8mkhsv$*H+@RC- zsI>1GB}&q9-F-*RD<(X7!g<#`G3oXG5B_&%R#ETohnklXHKnsw5zU~cf_hNX4KS$b z1{l=T03T|u{Z7;z=s`^_6JfU}y`#XX!AWNe#6BhG`CET-Q~SBEjC*3&aStB4C?Be5 zw=B0+vJWE69*MU%Q3~l?>p@Bd^&q7iV35)cFi5EZKBT<%JCQQmgOs=&l~k5)Om+xi zIM&_69-GTboouZ^Ui{J4xaGfu+^50502kZ5j$f~9rLjs!g_&34;--cfemc9WrgP|K zsc3zdyNY`G)fuaE*mk&Lw;Rd|Jyl8h0UFf*m?y{-ou5f6q4-V9u}$*32W5$ z^%{fay$Cp4EOi*(fi7GBOaO*+~)eDS;zaUiV+QNzjDJTBx6It$nS@qyNI6B zdCP;I3hF^mH^88$8(`2=1AOTD)_0=k5D$84`On)_!*_Vv<{JBsoR>d!*l9!SUW-3f z^l1IZqg^+L?bG4;C6QA)pL&o}K|RRn1{maY0}OI%fDbu8{Z8Z@>Osyyiqra8gZL8F zwg}mGME%JTj~%<}g3}J}JM;5jmekGp>Gv{5txU8^Ila0PRYSWH)d0AOY5?3swE^7| z)#~+~h&s%Jr~?#HX)nUd;KY}pwAe{v{JtaT!^f0AaZaD>#%w)x=)aCWtLVP(hoJit zL8UXygP;oPK~OiqAgCK)5L5$v2s-RL5p=i*K{eC$wqxm$oagORa&Eh7+WxUG|Ml#L zz5d#M(dshn=60)eQ_U*LSq5j16mKgBDU{=3^rfL56Cd8RY5(7>IN7@bps5dYJd+>%f1s)M|u!-pqfIvH|gn- zq-4yq?@0QyDVLYcdx?Lrx~1>?f4;i#i|>b|bW6P@omvl)DyRoZ-2j86Zh%2j4e%jp z?RO&S{vIUF(xPsfwn9V5RtOa|4pk-D;3^!U##gDL@i9`iY8z8olZQjP$`HlJ=ptn^ za}Wz%JpS>;2MTR?F%pZczE@egmM)!K(7W(QE3JLx;n~^o1gsreV1E%?()B1N4j$^O z%jKG7QRh!{^kBWwKZfOge4GGFnXV&`o|Zp*dccqa&9I`VDypogs=+}z+^c+2jqGFE zUc&bvmin#~T|9~#AZ046UFA4L=ZHgCd1Xbothu_jEU(g?ale%12JAVE#Qo;xRaX{O z;qGjzl{-<|AOAD*8<=Wdc~Lm0yPry}6ODxYCR2Nj0RMwOh894DhZalXt zuMT&s<4bOiC6iPbZLH0oS6*ml zFg!(IoVawEml+w^$gL?UE2>>c$3k6o$WCQJpTt>cpKP;{ZTGU-bUw1Cc6MGtO-0qo z?i_qigUZHXTk?i_d3Zb<5Us5Fo(jnil1j4bxkSKn(?6uBX5TsMP-$^xV}i4W9u%Vj4EUXI4|1lF;x0i6C0UbQdC-Kq;%Qrkd2p7 zWN);CZgY2G)|ctP&Wk>ih&>(HVH!EvV{d**Rn5G-(vpRHkSh!mq6rx4;9H=bavfY! zU0X5-M{tX3EA!@*l;b*olYzL-3F~WZ?ONeDE7rmqBlRV*DC}R{P4qUILC2P9f=DwP zU+mP@O3HN2KMB4H+E5>lEsMnVq@WDjaMy)>|8n|~Q0C0S={G5}6=ouFOxj6hW^S+< z`4u*ojh&5$Ue$S}g%$2Xx;N}`($rMc=)=-RzxA{OTPO2o^f@+5ew2*Pabs_kzH*tf zG9GUM{p?qKyT|db=z!Fq2rtJ&ak#As(^#*J*M9x@(8bSNOw7hr;9v;KUI8CGO*SPW zZTPH8Lr3dz$CL1Y0)uer%XStCet*M9;-=4-Ox|~J_e#Fd~ zQwZ>GlJUvX^ikD&?u{Spo_+X$A6;8<$ybm5ZAHcV5QUUctdA&U+npR;x9j{fH%#17 zXiGx9Wha2afi^mz$>39H-qj~p*Azj>r}wY*cBQ<`yR(?*Z$AL@Q4FA>+VXj2`52k< zFpNO>Alr$C1E^_M{TywXzmt%U4IDf0|2 z`HZ@j+ujf#(d9e=Bb-VTiNL{97nARu&l6lf<@^iBU;4NY>QVcprKAxAG&?4cA@ z3dw|(lpD_PsXtjGHRCe(P3M8Jh^CxFRSxd6QyQuOZhHj-u-LAHlhs(2!mWYYDZ1A{ z1Bcp`b)J+lA({Tvq5G6gz|oz125bT{TiTZ7sP6F+qD@^-t0scV5!W zMV5DTkVI9&pm(2A$amERd6h+-=-v457F<2AId=bBq zGHn)N_ej+&%Byq7SeI8Z>bGZJ6kC+PY}tneg}2y5(cGIlMy9NVv|o|=blWLrQCZUQ zSUyyMSstB2B~yUKcKJ?LI)%|GbPCi)*2QhU5>N|=q^lN3AhptG*Cx@|{}c+y_3Iv^ zJ-UZ$n?{LRsjPGbx)OoTMABb+M7ZVM-q#-Tw`ZQX^5$EQ_~6a5!)zo-#0QQ|7yraX z0@9hQ5MvBV1@*wc8?e|e+Q~{=lNtEeDS(Hr_@Aq=vzPckzytq!jgPj;q<9Qr*ZtRd z7-$RIRr-d<^eAxmmw6A&uWww#7jJs^$?Iq5+i2KB3eXArfOJmspn!sUP{0i^DBuPd z6wm-q3Y_G|j`aKW_%WR^4oNGeRiv`=`S1gHk4Abix;%CL^pO6mSMR=M?0wf(e>-N= z&XPqZOxjDNHxbgM)98V81@%C>8(<*a4KR?d0iH;2Okqm<{E&X22hv^YUn(yjtivb` zn5MsH(bdn#v-@T2z>zdcI$2LrNH<1lSCmY-`=S@}|1op+@^6>_{)AsTl<9P01H5S! zvSAfT)~l*yPH_#r?C~yQ;0z>Fj?(xIYY7eYprA^o0E_J^I$52e00sqh3Lj}ADRIBI zyNCxlbd?5zECJ~P2K99jtcx|pb6Rn|VJs{eRst$epD`209E5)p#;Bk`C&fp11GI=H zUqWrC9miA`sK<_D6?K8MCjA?;)~p_o;7xB74?ORpw~PAQxU;z(;cx|&*RvqFp5jVJ zYski&qo5w7a{~<0xd8_0Gyph}$TH@9TJ|vhs8fpZpki4`A=c9ThT_2v$@B+sK(g!< z$!ONW#|E+R?D~^6uqXW#5g_de?9A@Nad^vT=Vw(UGJf#d+s{7z>yL}xbO_aT9HwYS zZQqmA^MM;Et#qzY$TeuFpdK`I0}L9v0R{~6#TNd3*UzQ!FTa0VK_B1lM)nV40k)U16A z_o_HRFpobX0{zk>!tGc8>!jW5{<4@I{MsESe_48< zjR3`B?^F0!ZL-_zh5IK6Vbam3#Eqe;pdPq)0~XswJ6S#9fqR|8u8YB5A9Lzydnikw zLjI|lDWzc_)fv|iD0``;Ry#R8iNvCN0|V7Vv#8EKUHzxe-1X(`fBxXu`MmZHsUa2a+q)-YpbzuV!tod}y@f)nC4%sy6oDc7;c+~C&dUO#R$d(yZ zQtF;(`qzjS(s@}`+vti4ssP54j~lSqu7i`+Ybu4o26PJDM~urU0xzrfrd-O&cTO19 zxjSO$_fO65v`LZ54L*lTV{E?P^S2~v!LK|{`%Sd<-VN^`fX^_i&0e*&jC}#$Z!5xd zFS;a_Gq=j#Ja1{mW*ilwx`DLbDrJM}6Y;h-e0H+{rwVigAcbFytCdK2!46ng$j}zt zcS>1xf#Rd;k|fryM?%Acd0dMCv;9)p>2-Ez@0qiKDWKjN zb+wDp$1yk?)g?Rk zo-}9scY(W(A8>X^7qG{Ew9!tlEl-Yb#5;&^Z8maz3El~J_By@r>>Qx*0%C_r?KpGw z9b9?AZLPfzYV-n)Qgvp*tM#r8V9o}oYM0uAG#caDwDzi*bLxU)0mNykvqw{|&y;YM zm4d20ZKKx4zNuFiF;6jYHYSywF09jO3t*~|?k}!&U&Fvzj;~>(YgDLNL7(jcT8iD>S9tCegn}etjlGaP9?R;3}+!7Q{Ip76pA`K*Hk)j5Qy)( zIa%nNXq*bDiptAy(alu04%(!>mD70Sqyy~sINx(}&}LYHIOujhbA}?8>FbQ?AcDP* z%Gs23>FsR%g2+x*#?~lk;{covj!j6^(Fsp&`?+JgH`*{xoY-!>s?$@P^*)BK;hV*o zHFn&5&H@GThDeAV&+;;{8(t7%y;$!)Ot7L5%TT^KAr@4=k`U{od?$ohrt+1ASYPF< z2(ggzofu;Ml&?C(`YYeO5F4O;3qmYQ`A!b8fy%cigxxz??x`U*Ncn0*Y_Rf$Lu`oh z)rZ(nD;4-C zn29081leNc zOVg0A43Q{m|el*Y)dFX_C5%y>!d`JAp0OyeV0rUWFMi+ zq=bpl0t&)U#apO@gvAS!_;G=slt{!g6wm!R3&f(*_Wt79C)919s-fb3GN2=V}0%hKt4^QQlJQO zlwn`y9ORkQ6t`JNkcWV9TaF0w{uugBmP&{S@+?%_EkOi%HjteXAA)=^kWDDk9}5Zc zp+IXF!6C?pqcU1*2=e`aV`VWE18%x!7q=O(I4>TB}L6A=b))2*Rat;b{Nd!SYnafLvds4HAP~cAT zYYG{BD#|g0fgqobhC2NXVnC43MCDQfK#(7S81AV*$d5vocOyql`aymS8X2M6K(SJb z4mq~OgO4HeqK^8A{E7jXt~{BYD;Zr)QzE{cczXuV1GOZ-lmLA}Z3ZuZAc0K5mXGH} znY@tCMuA|W^29y3!B~&-LcExlWO9qoMdwWAsSYA$@KQ7-Wy@)cq(NQ|_S}|CbYjmc zmBF5MP>5IZ6ERcpDxg?p=yZ@8&`t&EaWda2)Es;#p$)n+w%n{c%tFvWLE`d~ryxJY zDFSPg74A+PNp>w>LIM5*hp~6q_nQ?fM1z*%1Zr1p?0R25vQFQL?zVl*Xj^*enAqw{ET8g)6pg5q9@E}X&>;h47Cg8XU_C?)9> zf)Ql!4Vio+!`PMQdUNTFZf@#Z4H^6zXL!g3{UE;i?Gy^$(G3Mcs z!#>1sQset(YWvL~yB)O%!vcjxkYFGZIIlX{7D_ga-;TnRIR;o|1d_Or$90du6FLf( zzyxV1@(KM!KB1k+Cv+3}gk~b2&`abKT8Vr@Cy`HRB=QM;L_VR7$R~6W`Gh7SpU^|( z6IzITLI;sgXdv4<~bPf50 zrXiouGvpImhI~TDkWXkB@(KMyKA~O6Cv*$>gk~Y1&@1E8!twk*Hk+Jca^{j#N=`XBmE=^BQ$x;ta!w*=Avvdz^FwkLlT$}d z138W4G?8-}InCt6$Y~`fK~9pKW#n{_vyz-M$yr6tIpmy2&X34hL(YZdTtv<~a@Lb` zDLI#ub0s-fle2-GP2_AQ=Q?t3Am=7>ZXxG3a&9N*4sz}!=Pq)7LC!toY`Yt1Rdo8 zpqkb|DLonL=ntWY)+2Tkl+PBZo%n(RTMkw8Or$;+>g5_JmTRF>UJ7OMD&)2a3gq=r z9dCis_*2y7F64eMl*Rj@CO!-W@iC}|J5k#2LEz^>;6Jef_BtzMe?{qk!#Sq+*&OyU zD`uau680a|=D+L&Zn07xWM#Y`E9cp)f)8Vre19wmaJHT8P~8MIP{TiK{Dd9s!SNG! zut&yE+QELE!VKYru~WbtPQ~KH53$@(i!@LZRSse)gJA&B`1kP>vLF8?`<-BqvZwK% zdfbHUKNum!2zk~BnTwF;jgV4=ykLZsBjhC`q!J-78zEH)dDRH1LCEVy$b5wS#RxeG zA#WNX3lZ{`5poJb-Z4Uch>*V-A&U|6cO#?@A@3O>4G8&%5z>f|4~>u}gnVp-oQ9B3 zjF4u8d}@Tm5b|#$q!l4w7$FIS{Kp7MBIIi$WEn!fH9|TNvfBt*nd%q`3=hVZphGob zAVkrLPeTV>$`-O_{AcSbd@AeU zg=__%&sOp#b_QR`&gARZS^PTe4E=(g%^zdu@E6&+d>1bzp!Ovr^pBTFWj$ zkGYhsW|y%I>~i)qb_IKcT?zJg6?>Om&Awni;hAg$AH_EE$!rrZVAr4zZRSySEkBc8 z$1h>m^PAWW;PW@4-(amuv%H&CzhP}ut0}rx(;ns1Xr@5W3?t}H3Od{fx{HF2G=hFX zK}Q=w_fXKWMv!a184V$efzuCScc9TfL!<9RqkoP@--SkR#irscejK!`;}I)>w|tt^ zdqW*W-g=$?-TsKfiQu(3YdY2QTUC;ZyJ8H@GHR&hbu%aey8Er zf!`YZKwR+?!_{BWqudLO?pALNB62X^o|Wn08oF8@a^|J&rZRGdG#!k==5KjI3%#}$5? zD}0kHeEs-sY{Pbb!lS$lC7&~X5U<$ItKn^jcb@W|2JZspt%dhw<*k8tk@A+nd#duz zg11(Ar@2i2Z|mgS zM!?44ZLi1R*ttd z@{MYCJl-yqZ|F^ID&E#RZ-)R|*GX)#5dc(4j8lev0RY0P%O?H;gI)@+{C&0({vF_Q zzl6yDFxbE&JcKp)A?$HJob3cV_$@yKYu}UDAHXS}2V3|fKL%^oMeJo>%w7k3_%pA; zBJ!#1Exwrj4Qyf;Z)Wdj&1p>{p{H@}Si2W;ajz8Pz&x3JxO3s#!8 zVj=V%taCoV`|yW(KmHr6V*VCOl+W=&`~^OYzm8?cH?YFEi;v>(@dNoMSVH^^D}>+h z!}xAKL1gfWB9l)R*?fu^!e@w4e5M$~j}l|~(P9EWPE6y+iUc6xSKbLZM<1L#9PF#_~~LN zPl%`ZGVu~$E?(hhhu|owI*MOs74hq>Vt%t#&2O>h^V_X3|Ebl$e{RM3T~>nMW1YqCwa(!?thM}p zYdwF++Q=WaHuGOwTlizv9sEh_KEBhspFeFq&VO$`$)B^H=g(U&@|UbP`Jb$}`D@nu z{B`R?{-*UM|Eu*ie>Y(94=@$n_`iwa|JRA(mj6u*dYbT`7;a5_Vo(^hCkDK^CI$`D z69e8{6N7rQCk7SMo*3}vni%w(o)~mYJuzsQo)|PtPYfESCkFkdCk7o;PYif-O$>N* zO$_=?PYif-O$>N*O$_>N&nE`{Z^)5fV8!)ou;*`hNI*suoDUbh_<^D~KLo6IlIRQe zJAfZ4viLD#Fxc!6UMxoN6UBaDt)szG58#W%!8|Gs0UI65+r>EEAtv$jMGjvhrt_u ztHexko|q-h7kT0WQ6erBrDC0^5f_UE;xbVyE*Ev;YUJ`0(IT!v%FW^oaf4VRZWKQj zw~D*PZDO0aLp&sYCVnNhik;#Y;wgl@B<>Thh+m3#!~c-cB!ykZ?C{%jSAzgWfMEvs6*ZOs?Etg!gI)gb<1 z#l;6!Lj2P@OMGITBmQlz6`xz{#aGrw@wK&C?6$U8%(}x0Soc}ItoyA#*5g*D^`zC` zdfpmfy=V=x-n0f=Z(GBy_pK4uht??TOKY_CwRKRyvc_X#xb1%v!~d@n!~Zk}TYvDM z7=D`e#Go*0PYif-O$-|LKaD}oG~H?p)-)!p8QAwdlJ|i;8?t8cA=YtxxK+RpvlA*fbt+#Bxi@On@n)-$w_8hihqaWS zZ#6@PZsqH()A?n%#Ac(ljBmD9LQXz|Z?VqiTOk+UWBrIfV6BEs{A2zb>mvSJ$jHxG zm+%*?DTnw@97Ne|t z#29P47;Ehi6RZctH0vQT(|T0QvVJY{tlx+d>q${+Jtb0tMFnfjQRWfnw{)K&kb7pv-zPaH92QpvrnXFyDGVu)z8-u*mu{aEkSH pU~#|-G+|=EQW11R7?=(5Ji?yz{~!mp+tuOzxj4{OuMg-a{vXiZ*!KVc diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jrxml index 9c786ca59..0b60b9981 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jrxml +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioVendasConexaoRuta.jrxml @@ -1,10 +1,10 @@ - - - - - - + + + + + + @@ -34,145 +34,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -188,9 +53,9 @@ - + - + @@ -204,208 +69,411 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + - + - + - + - + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasConexaoRutaBean.java b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasConexaoRutaBean.java index 6f89fa66f..0de842ea6 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasConexaoRutaBean.java +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioVendasConexaoRutaBean.java @@ -29,6 +29,10 @@ public class RelatorioVendasConexaoRutaBean { private String classeServico; private String numoperacion; private String cveusuario; + private String subSerie; + private String descricaoConexao; + private Integer idCadastroConexao; + private String descuento; public BigDecimal getPreco() { return preco; @@ -222,4 +226,36 @@ public class RelatorioVendasConexaoRutaBean { this.numoperacion = numoperacion; } + public String getSubSerie() { + return subSerie; + } + + public void setSubSerie(String subSerie) { + this.subSerie = subSerie; + } + + public String getDescricaoConexao() { + return descricaoConexao; + } + + public void setDescricaoConexao(String descricaoConexao) { + this.descricaoConexao = descricaoConexao; + } + + public Integer getIdCadastroConexao() { + return idCadastroConexao; + } + + public void setIdCadastroConexao(Integer idCadastroConexao) { + this.idCadastroConexao = idCadastroConexao; + } + + public String getDescuento() { + return descuento; + } + + public void setDescuento(String descuento) { + this.descuento = descuento; + } + } diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasConexaoRutaController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasConexaoRutaController.java index f0909f307..4f155a36d 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasConexaoRutaController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioVendasConexaoRutaController.java @@ -3,6 +3,8 @@ package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -14,14 +16,17 @@ 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.Comboitem; import org.zkoss.zul.Datebox; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Textbox; import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.PuntoVenta; -import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasConexao; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDiferencasTransferencias; import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasConexaoRuta; import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; import com.rjconsultores.ventaboletos.utilerias.DateUtil; @@ -29,6 +34,12 @@ import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar; import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta; import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject; +import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPuntoVentaSimple; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioGenericoEmpresasSel; +import com.trg.search.Filter; @Controller("relatorioVendasConexaoRutaController") @Scope("prototype") @@ -44,67 +55,203 @@ public class RelatorioVendasConexaoRutaController extends MyGenericForwardCompos private Datebox dataInicial; private Datebox dataFinal; + private Textbox txtNombreEmpresa; + private Paging pagingEmpresa; + private Paging pagingEmpresaSel; + private MyListbox empresaList; + private MyListbox empresaSelList; + private MyListbox puntoVentaList; + private MyListbox puntoVentaSelectedList; + private Textbox txtNomeAgencia; + private Paging pagingPuntoVenta; + private static final String LIKE = "%"; + + @Autowired + private transient PagedListWrapper plwEmpresa; - private MyComboboxPuntoVenta cmbPuntoVenta; - + @Autowired + private transient PagedListWrapper plwPuntoVenta; + @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); - this.lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa(); + empresaList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel()); + empresaSelList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel()); + puntoVentaList.setItemRenderer(new RenderPuntoVentaSimple()); + puntoVentaSelectedList.setItemRenderer(new RenderPuntoVentaSimple()); } - public void onClick$btnExecutarRelatorio(Event ev) throws Exception { excutarRelatorios(); } + @SuppressWarnings({ "unchecked" }) public void excutarRelatorios() throws SQLException, Exception { - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); - Date dataDe = dataInicial.getValue(); - Date dataAte = dataFinal.getValue(); - - Timestamp fecVentaInicial = new Timestamp(DateUtil.inicioFecha(dataDe).getTime()); - Timestamp fecVentaFinal = new Timestamp(DateUtil.fimFecha(dataAte).getTime()); - - Map parametros = new HashMap(); - parametros.put("fecInicio", sdf.format(dataDe)); - parametros.put("fecFinal", sdf.format(dataAte)); - - parametros.put("dataFiltroInicial", fecVentaInicial); - parametros.put("dataFiltroFinal", fecVentaFinal); - - Comboitem itemEmpresa = cmbEmpresa.getSelectedItem(); - if (itemEmpresa != null) { - Empresa empresa = (Empresa) itemEmpresa.getValue(); - parametros.put("EMPRESA_ID", empresa.getEmpresaId()); - parametros.put("empresa", empresa.getNombempresa()); - } else { - parametros.put("empresa", "Todas;"); - } - - Comboitem itemPuntoventa = cmbPuntoVenta.getSelectedItem(); - if(itemPuntoventa != null) { - PuntoVenta puntoVenta = (PuntoVenta) itemPuntoventa.getValue(); - if(puntoVenta.getPuntoventaId() > -1) { - parametros.put("PUNTOVENTA_ID", puntoVenta.getPuntoventaId()); - parametros.put("puntoventa", puntoVenta.getNombpuntoventa()); - } else { - parametros.put("puntoventa", "Todas;"); + if (!isPeriodoValido()) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioVendaConexaoRuta.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + ex.printStackTrace(); } } else { - parametros.put("puntoventa", "Todas;"); + Relatorio relatorio; + + Map parametros = new HashMap(); + StringBuilder filtro = new StringBuilder(); + + parametros.put("DATA_INICIAL", (java.util.Date) dataInicial.getValue()); + parametros.put("DATA_FINAL", (java.util.Date) dataFinal.getValue()); + List listaEmpresa = (List)(Object)Arrays.asList(empresaSelList.getData()); + if (!listaEmpresa.isEmpty()) { + parametros.put("EMPRESA_ID", getIdsEmpresa(listaEmpresa)); + } + + List listaPontosVenda = (List)(Object)Arrays.asList(puntoVentaSelectedList.getData()); + if (!listaPontosVenda.isEmpty()) { + parametros.put("PUNTOVENTA_ID", getIdsPontoVenda(listaPontosVenda)); + configuraFiltroAgencia(filtro, listaPontosVenda); + } else { + filtro.append(" Agências: TODAS"); + } + + parametros.put("FILTROS", filtro.toString()); + + parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioVendaConexaoRuta.window.title")); + parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario()); + + relatorio = new RelatorioDiferencasTransferencias(parametros, dataSourceRead.getConnection()); + + Map args = new HashMap(); + relatorio = new RelatorioVendasConexaoRuta(parametros, dataSourceRead.getConnection()); + args.put("relatorio", relatorio); + + openWindow("/component/reportView.zul", + Labels.getLabel("indexController.mniRelatorioVendasConexao.label"), args, MODAL); } - Map args = new HashMap(); - Relatorio relatorio = new RelatorioVendasConexaoRuta(parametros, dataSourceRead.getConnection()); - args.put("relatorio", relatorio); - - openWindow("/component/reportView.zul", - Labels.getLabel("indexController.mniRelatorioVendasConexao.label"), args, MODAL); } + public void onClick$btnPesquisaEmpresa(Event ev) { + HibernateSearchObject empresaBusqueda = + new HibernateSearchObject(Empresa.class, pagingEmpresa.getPageSize()); + + empresaBusqueda.addFilterILike("nombempresa", obtemFiltroLike(txtNombreEmpresa)); + empresaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + empresaBusqueda.addSortAsc("nombempresa"); + + plwEmpresa.init(empresaBusqueda, empresaList, pagingEmpresa); + + validaPesquisaSemRegistro(empresaList); + } + + public void onClick$btnLimparEmpresa(Event ev) { + empresaList.setData(new ArrayList()); + txtNombreEmpresa.setText(""); + } + + public void onDoubleClick$empresaList(Event ev) { + Empresa empresa = (Empresa) empresaList.getSelected(); + if (empresa!= null && + !Arrays.asList(empresaSelList.getData()).contains(empresa)) { + empresaSelList.addItemNovo(empresa); + } + } + + public void onDoubleClick$empresaSelList(Event ev) { + Empresa empresa = (Empresa) empresaSelList.getSelected(); + empresaSelList.removeItem(empresa); + } + + public void onClick$btnPesquisaAgencia(Event ev) { + HibernateSearchObject puntoVentaBusqueda = + new HibernateSearchObject(PuntoVenta.class, pagingPuntoVenta.getPageSize()); + + puntoVentaBusqueda.addFilterOr(Filter.like("nombpuntoventa", obtemFiltroLike(txtNomeAgencia)), + Filter.like("numPuntoVenta", obtemFiltroLike(txtNomeAgencia))); + puntoVentaBusqueda.addSortAsc("nombpuntoventa"); + puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta); + + validaPesquisaSemRegistro(puntoVentaList); + + } + + public void onClick$btnLimparAgencia(Event ev) { + puntoVentaList.setData(new ArrayList()); + txtNomeAgencia.setText(""); + } + + public void onDoubleClick$puntoVentaList(Event ev) { + PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected(); + if (puntoVenta != null + && !Arrays.asList(puntoVentaSelectedList.getData()).contains(puntoVenta)) { + puntoVentaSelectedList.addItemNovo(puntoVenta); + } + } + + public void onDoubleClick$puntoVentaSelectedList(Event ev) { + PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaSelectedList.getSelected(); + puntoVentaSelectedList.removeItem(puntoVentaSel); + } + private void configuraFiltroAgencia(StringBuilder filtro, List lista) { + filtro.append(" Agências: "); + for (PuntoVenta pontoVenda : lista) { + filtro.append(pontoVenda.getNombpuntoventa()); + filtro.append(", "); + } + filtro.delete(filtro.length()-2, filtro.length()); + } + + private String getIdsEmpresa(List lista) { + String ids = ""; + for (Empresa empresa : lista) { + ids += empresa.getEmpresaId() +", "; + } + return ids.substring(0, ids.length()-2); + } + + private String getIdsPontoVenda(List lista) { + StringBuilder ids = new StringBuilder(); + for (PuntoVenta pontoVenda : lista) { + ids.append(pontoVenda.getPuntoventaId()); + ids.append(", "); + } + return ids.substring(0, ids.length()-2); + } + + private boolean isPeriodoValido() { + return dataFinal.getValue().compareTo(dataInicial.getValue()) >= 0; + } + + private void validaPesquisaSemRegistro(MyListbox listBox) { + if (listBox.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioVendaConexaoRuta.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + } + + private String obtemFiltroLike(Textbox filtro) { + return LIKE.concat(filtro.getText().trim().toUpperCase().concat(LIKE)) ; + } + + public Paging getPagingEmpresaSel() { + return pagingEmpresaSel; + } + + public void setPagingEmpresaSel(Paging pagingEmpresaSel) { + this.pagingEmpresaSel = pagingEmpresaSel; + } public List getLsEmpresa() { return lsEmpresa; } diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index fe1e31661..e270949b9 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -874,6 +874,19 @@ relatorioDiferencasTransferenciasController.puntoVentaSelectedList.codigo = Cód relatorioDiferencasTransferenciasController.puntoVentaSelectedList.nome = Nome relatorioDiferencasTransferenciasController.lbAgencia.value = Agência +#Relatorio de Vendas conexao por Linha + +relatorioVendaConexaoRuta.window.title = Relatório Vendas Conexão Por Linha +relatorioVendaConexaoRuta.lbDePeriodoTransferencia.value = Data inicial +relatorioVendaConexaoRuta.lbAtePeriodoTransferencia.value = Data final +relatorioVendaConexaoRuta.lbEmpresa.value = Empresa +relatorioVendaConexaoRuta.btnPesquisa.label = Buscar +relatorioVendaConexaoRuta.btnLimpar.label = Limpar +relatorioVendaConexaoRuta.lbIdEmpresa.value = Id +relatorioVendaConexaoRuta.puntoVentaSelectedList.codigo = Código +relatorioVendaConexaoRuta.puntoVentaSelectedList.nome = Nome +relatorioVendaConexaoRuta.lbAgencia.value = Agência + # Relatorio Sisdap relatorioSisdapController.window.title=Relatório SISDAP relatorioSisdapController.lbDatInicio.value=Data Inicio diff --git a/web/gui/relatorios/filtroRelatorioVendasConexao.zul b/web/gui/relatorios/filtroRelatorioVendasConexao.zul index 27f06c9aa..f25af7b97 100644 --- a/web/gui/relatorios/filtroRelatorioVendasConexao.zul +++ b/web/gui/relatorios/filtroRelatorioVendasConexao.zul @@ -1,11 +1,11 @@ - + - @@ -22,7 +22,7 @@ diff --git a/web/gui/relatorios/filtroRelatorioVendasConexaoRuta.zul b/web/gui/relatorios/filtroRelatorioVendasConexaoRuta.zul index 83725c47f..8670b6e62 100644 --- a/web/gui/relatorios/filtroRelatorioVendasConexaoRuta.zul +++ b/web/gui/relatorios/filtroRelatorioVendasConexaoRuta.zul @@ -10,47 +10,125 @@ contentStyle="overflow:auto" width="700px" border="normal"> - - - - + + - + + -