From 19f3b81e7ffa699b9fdc91e3f759d3c9563828b8 Mon Sep 17 00:00:00 2001 From: "wallace.henrique" Date: Thu, 6 Jul 2023 17:36:18 -0300 Subject: [PATCH 1/3] fixes bug#AL-2696 --- pom.xml | 4 +- ...latorioAproveitamentoFinanceiroTrecho.java | 375 ++++ ...eitamentoFinanceiroTrecho_pt_BR.properties | 13 + ...torioAproveitamentoFinanceiroTrecho.jasper | Bin 0 -> 128509 bytes ...atorioAproveitamentoFinanceiroTrecho.jrxml | 1552 +++++++++++++++++ ...rioAproveitamentoFinanceiroController.java | 110 +- ...latorioAproveitamentoFinanceiroTrecho.java | 61 + web/WEB-INF/i3-label_pt_BR.label | 8 + ...iltroRelatorioAproveitamentoFinanceiro.zul | 54 +- 9 files changed, 2162 insertions(+), 15 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioAproveitamentoFinanceiroTrecho.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioAproveitamentoFinanceiroTrecho_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAproveitamentoFinanceiroTrecho.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAproveitamentoFinanceiroTrecho.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioAproveitamentoFinanceiroTrecho.java diff --git a/pom.xml b/pom.xml index f7a825f11..396a6d3dc 100644 --- a/pom.xml +++ b/pom.xml @@ -8,8 +8,8 @@ war - 1.6.4 - 1.5.1 + 1.6.5 + 1.5.2 UTF-8 UTF-8 diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioAproveitamentoFinanceiroTrecho.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioAproveitamentoFinanceiroTrecho.java new file mode 100644 index 000000000..f249e156a --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioAproveitamentoFinanceiroTrecho.java @@ -0,0 +1,375 @@ +/** + * + */ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.log4j.Logger; + +import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.vo.parada.ParadaVO; +import com.rjconsultores.ventaboletos.vo.ruta.RutaVO; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + + +public class RelatorioAproveitamentoFinanceiroTrecho extends Relatorio { + + private static Logger log = Logger.getLogger(RelatorioAproveitamentoFinanceiroTrecho.class); + + public RelatorioAproveitamentoFinanceiroTrecho(Map parametros, Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new ArrayDataSource(this) { + @Override + public void initDados() throws Exception { + + Connection conexao = this.relatorio.getConexao(); + Map parametros = this.relatorio.getParametros(); + String sqlCombinacoes = gerarCombinacaoTrechos(parametros); + StringBuilder sql = getSQL(parametros, sqlCombinacoes); + + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString()); + + stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString())); + stmt.setTimestamp("DATA_INICIAL", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime())); + stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime())); + + ResultSet rset = stmt.executeQuery(); + + rset.setFetchSize(500); + + while (rset.next()) { + + Map dataResult = new HashMap(); + + dataResult.put("LINHA", rset.getString("linha")); + dataResult.put("NUMLINHA", rset.getString("numLinha")); + dataResult.put("SENTIDO", rset.getString("sentido")); + dataResult.put("SERVICO", rset.getString("servico")); + dataResult.put("HORARIO", rset.getString("horario")); + dataResult.put("ORIGEM", rset.getString("origem")); + dataResult.put("DESTINO", rset.getString("destino")); + //Quantidade de assentos do diagrana autobus + BigDecimal assentos = limpaNulo(rset.getBigDecimal("assentos")); + BigDecimal tarifa = limpaNulo(rset.getBigDecimal("tarifa")); + BigDecimal totPassageiros = BigDecimal.ZERO; + BigDecimal totReceita = BigDecimal.ZERO; + Integer viagens =0; + + BigDecimal segReceitaOpe = limpaNulo(rset.getBigDecimal("'2'_RECEITA_OPE")); + Integer segQtde = rset.getInt("'2'_QTDE"); + BigDecimal segTot = limpaNulo(rset.getBigDecimal("'2'_TOT")); + totPassageiros = totPassageiros.add(segTot); + totReceita = totReceita.add(segReceitaOpe); + viagens = viagens + segQtde; + + BigDecimal terReceitaOpe = limpaNulo(rset.getBigDecimal("'3'_RECEITA_OPE")); + Integer terQtde = rset.getInt("'3'_QTDE"); + BigDecimal terTot = limpaNulo(rset.getBigDecimal("'3'_TOT")); + totPassageiros = totPassageiros.add(terTot); + totReceita = totReceita.add(terReceitaOpe); + viagens = viagens .intValue() + terQtde.intValue(); + + BigDecimal quaReceitaOpe = limpaNulo(rset.getBigDecimal("'4'_RECEITA_OPE")); + Integer quaQtde = rset.getInt("'4'_QTDE"); + BigDecimal quaTot = limpaNulo(rset.getBigDecimal("'4'_TOT")); + totPassageiros = totPassageiros.add(quaTot); + totReceita = totReceita.add(quaReceitaOpe); + viagens = viagens.intValue() + quaQtde.intValue(); + + BigDecimal quiReceitaOpe = limpaNulo(rset.getBigDecimal("'5'_RECEITA_OPE")); + Integer quiQtde = rset.getInt("'5'_QTDE"); + BigDecimal quiTot = limpaNulo(rset.getBigDecimal("'5'_TOT")); + totPassageiros = totPassageiros.add(quiTot); + totReceita = totReceita.add(quiReceitaOpe); + viagens = viagens.intValue() + quiQtde.intValue(); + + BigDecimal sexReceitaOpe = limpaNulo(rset.getBigDecimal("'6'_RECEITA_OPE")); + Integer sexQtde = rset.getInt("'6'_QTDE"); + BigDecimal sexTot = limpaNulo(rset.getBigDecimal("'6'_TOT")); + totPassageiros = totPassageiros.add(sexTot); + totReceita = totReceita.add(sexReceitaOpe); + viagens = viagens.intValue() + sexQtde.intValue(); + + BigDecimal sabReceitaOpe = limpaNulo(rset.getBigDecimal("'7'_RECEITA_OPE")); + Integer sabQtde = rset.getInt("'7'_QTDE"); + BigDecimal sabTot = limpaNulo(rset.getBigDecimal("'7'_TOT")); + totPassageiros = totPassageiros.add(sabTot); + totReceita = totReceita.add(sabReceitaOpe); + viagens = viagens.intValue() + sabQtde.intValue(); + + BigDecimal domReceitaOpe = limpaNulo(rset.getBigDecimal("'1'_RECEITA_OPE")); + Integer domQtde = rset.getInt("'1'_QTDE"); + BigDecimal domTot = limpaNulo(rset.getBigDecimal("'1'_TOT")); + totPassageiros = totPassageiros.add(domTot); + totReceita = totReceita.add(domReceitaOpe); + viagens = viagens.intValue() + domQtde.intValue(); + dataResult.put("VIAGENS", new BigDecimal(viagens)); + log.info("VIAGENS: " + viagens ); + dataResult.put("ASSENTOS", assentos); + dataResult.put("TARIFA", tarifa); + dataResult.put("TOT_PASSAGEIROS", totPassageiros); + dataResult.put("TOT_RECEITA", totReceita); + + dataResult.put("SEG_RECEITA_OPE", segReceitaOpe); + dataResult.put("SEG_QTDE", new BigDecimal(segQtde)); + dataResult.put("SEG_TOT", segTot); + dataResult.put("SEG_FIN", calculaMedia(segReceitaOpe, tarifa, segQtde, assentos)); + + dataResult.put("TER_RECEITA_OPE", terReceitaOpe); + dataResult.put("TER_QTDE", new BigDecimal(terQtde)); + dataResult.put("TER_TOT", terTot); + dataResult.put("TER_FIN", calculaMedia(terReceitaOpe, tarifa, terQtde, assentos)); + + dataResult.put("QUA_RECEITA_OPE", quaReceitaOpe); + dataResult.put("QUA_QTDE", new BigDecimal(quaQtde)); + dataResult.put("QUA_TOT", quaTot); + dataResult.put("QUA_FIN", calculaMedia(quaReceitaOpe, tarifa, quaQtde, assentos)); + + dataResult.put("QUI_RECEITA_OPE", quiReceitaOpe); + dataResult.put("QUI_QTDE", new BigDecimal(quiQtde)); + dataResult.put("QUI_TOT", quiTot); + dataResult.put("QUI_FIN", calculaMedia(quiReceitaOpe, tarifa, quiQtde, assentos)); + + dataResult.put("SEX_RECEITA_OPE", sexReceitaOpe); + dataResult.put("SEX_QTDE", new BigDecimal(sexQtde)); + dataResult.put("SEX_TOT", sexTot); + dataResult.put("SEX_FIN", calculaMedia(sexReceitaOpe, tarifa, sexQtde, assentos)); + + dataResult.put("SAB_RECEITA_OPE", sabReceitaOpe); + dataResult.put("SAB_QTDE", new BigDecimal(sabQtde)); + dataResult.put("SAB_TOT", sabTot); + dataResult.put("SAB_FIN", calculaMedia(sabReceitaOpe, tarifa, sabQtde, assentos)); + + dataResult.put("DOM_RECEITA_OPE", domReceitaOpe); + dataResult.put("DOM_QTDE", new BigDecimal(domQtde)); + dataResult.put("DOM_TOT", domTot); + dataResult.put("DOM_FIN", calculaMedia(domReceitaOpe, tarifa, domQtde, assentos)); + + this.dados.add(dataResult); + } + + this.resultSet = rset; + } + + private StringBuilder getSQL(Map parametros, String sqlCombinacoes) { + + StringBuilder sql = new StringBuilder(); + sql.append(" select TB.*, "); + sql.append(" (SELECT "); + sql.append(" max (TF.PRECIO) "); + sql.append(" FROM "); + sql.append(" CORRIDA CR, "); + sql.append(" TRAMO TR, "); + sql.append(" RUTA R, "); + sql.append(" RUTA_COMBINACION RC, "); + sql.append(" TARIFA TF, "); + sql.append(" VIGENCIA_TARIFA VT "); + sql.append(" WHERE "); + sql.append(" CR.CORRIDA_ID = TB.SERVICO "); + sql.append(" AND CR.FECCORRIDA BETWEEN :DATA_INICIAL and :DATA_FINAL "); + sql.append(" AND CR.RUTA_ID = TB.RUTAID "); + sql.append(" AND CR.RUTA_ID = R.RUTA_ID AND R.ACTIVO = 1 "); + sql.append(" AND CR.RUTA_ID = RC.RUTA_ID AND RC.ACTIVO = 1 "); + sql.append(" AND RC.TRAMO_ID = TR.TRAMO_ID "); + sql.append(" AND TF.TRAMO_ID = TR.TRAMO_ID "); + sql.append(" AND TF.MARCA_ID = CR.MARCA_ID "); + sql.append(" AND TF.RUTA_ID = CR.RUTA_ID "); + sql.append(" AND TF.STATUSTARIFA = 'A' "); + sql.append(" AND CR.ACTIVO <> 0 "); + sql.append(" AND TF.ACTIVO = 1 "); + sql.append(" AND TR.ORIGEN_ID = CR.ORIGEN_ID "); + sql.append(" AND TR.DESTINO_ID = CR.DESTINO_ID "); + sql.append(" AND TF.VIGENCIATARIFA_ID = VT.VIGENCIATARIFA_ID "); + sql.append(" AND TF.ORGAOCONCEDENTE_ID = R.ORGAOCONCEDENTE_ID "); + sql.append(" AND VT.ACTIVO = 1 "); + sql.append(" AND CR.FECCORRIDA BETWEEN VT.FECINICIOVIGENCIA AND VT.FECFINVIGENCIA "); + sql.append(" AND TF.CLASESERVICIO_ID = CR.CLASESERVICIO_ID "); + sql.append(" ) TARIFA "); + sql.append(" from "); + sql.append(" ( "); + sql.append(" select * from ( "); + sql.append(" SELECT "); + sql.append(" r.DESCRUTA as linha, "); + sql.append(" r.NUMRUTA as numLinha, "); + sql.append(" r.ruta_id as rutaid, "); + sql.append(" count( c.boleto_id) as passageiros, "); + sql.append(" sum( coalesce(c.preciopagado, 0) )as valor, "); + sql.append(" to_char( co.FECCORRIDA, 'D') as dia, "); + // Quantidade de dias da semana diferente vendidas + // "WW" Esse parâmetro para o to_char tras o dia da semana da data + sql.append(" coalesce(count(DISTINCT to_char( co.FECCORRIDA, 'WW')), 0) as qtde, "); + sql.append(" r.indsentidoida as sentido, "); + sql.append(" da.cantasientos as assentos, "); + sql.append(" TO_CHAR(co.fechorsalidaoriginal ,'HH24:mi') as horario, "); + sql.append(" co.CORRIDA_ID as servico, "); + sql.append(" ORI.descparada as origem, "); + sql.append(" DES.descparada as destino "); + sql.append(" FROM boleto c "); + sql.append(" RIGHT OUTER JOIN corrida co "); + sql.append(" on c.CORRIDA_ID = co.CORRIDA_ID "); + sql.append(" and c.FECCORRIDA = co.FECCORRIDA "); + sql.append(" and co.ACTIVO = 1 "); + sql.append(" inner join ruta r "); + sql.append(" on co.RUTA_ID = r.RUTA_ID "); + sql.append(" and r.ACTIVO = 1 "); + sql.append(" inner join MARCA m "); + sql.append(" on m.marca_id = co.marca_id "); + sql.append(" and m.activo = 1 "); + sql.append(" left join rol_operativo ro "); + sql.append(" on ro.roloperativo_id = co.roloperativo_id "); + sql.append(" left join diagrama_autobus da "); + sql.append(" on ro.diagramaautobus_id = da.diagramaautobus_id "); + sql.append(" left join corrida_tramo ct ON ct.corrida_id = co.corrida_id and ct.FECCORRIDA = co.FECCORRIDA and ct.ACTIVO = 1 "); + sql.append(" left join tramo t ON t.TRAMO_ID = ct.TRAMO_ID and t.ACTIVO = 1 "); + sql.append(" left join parada ORI ON ORI.parada_id = c.origen_id "); + sql.append(" left join parada DES ON DES.parada_id = c.destino_id "); + sql.append(" WHERE co.activo = 1 "); + sql.append(" AND c.activo = 1 "); + sql.append(" AND m.EMPRESA_ID = :EMPRESA_ID "); + sql.append(" and co.FECCORRIDA >= :DATA_INICIAL "); + sql.append(" and co.FECCORRIDA <= :DATA_FINAL "); + + if (parametros.get("LINHAS") != null && !possuiFiltroTodos("LINHAS")) { + sql.append(" and co.ruta_id IN (" + parametros.get("LINHAS").toString() + ")"); + } + if (sqlCombinacoes != null && !sqlCombinacoes.isEmpty()) { + sql.append(" " +sqlCombinacoes+ " "); + } + + sql.append(" and c.MOTIVOCANCELACION_ID is null "); + sql.append(" GROUP by r.DESCRUTA, r.ruta_id, r.indsentidoida, r.NUMRUTA, da.cantasientos, "); + sql.append(" to_char( co.FECCORRIDA, 'D'), TO_CHAR(co.fechorsalidaoriginal ,'HH24:mi'), "); + sql.append(" co.CORRIDA_ID, ORI.descparada, DES.descparada "); + sql.append(" ORDER by r.DESCRUTA, r.indsentidoida desc, to_char( co.FECCORRIDA, 'D') "); + sql.append(" ) "); + sql.append("PIVOT "); + sql.append("( "); + sql.append(" max(valor) receita_ope, "); + sql.append(" max(qtde) qtde, "); + sql.append(" max(passageiros) tot "); + sql.append(" for dia in ('1', '2', '3', '4', '5', '6', '7') "); + sql.append(") "); + sql.append(") TB"); + return sql; + } + }); + } + + @Override + protected void processaParametros() throws Exception { + + } + + + private BigDecimal limpaNulo( BigDecimal val ) { + if( val == null ) { + return BigDecimal.ZERO; + }else { + return val; + } + } + + /** + * Faz calculo da media na seguinte formula (Tot. Rceita / (tarifa * qtde * assentos)) + * (1427,17 / (108,30*1*42)) * 100 + * @param totReceita + * @param tarifa + * @param qtde (Quantidade viagens do dia da semana no periodo. + * Ex 01 a 07, sendo 01 Domingo e 07 Sabado, tera sempre quantidade igual a 7 se o servico for executado todo dia) + * @param tot + * @return + */ + private BigDecimal calculaMedia(BigDecimal totReceita, BigDecimal tarifa, Integer qtde, BigDecimal tot) { + if( qtde.intValue() != 0 && tot.intValue() !=0 ) { + //Multiplica a tarifa pela quantidade de viagens no dia da semana (Segunda, terça...) no período + BigDecimal dividendo = tarifa.multiply(new BigDecimal(qtde)); + //Multiplica o dividendo pelo total de passegeiros + dividendo = dividendo.multiply(tot); + + if(dividendo.intValue() == 0 ) { + return BigDecimal.ZERO; + } + + BigDecimal fin = totReceita.divide(dividendo, 4, BigDecimal.ROUND_HALF_UP); + fin = fin.multiply(new BigDecimal(new Long(100L))).setScale(2); + return fin !=null ? fin : BigDecimal.ZERO; + }else{ + return BigDecimal.ZERO; + } + } + + private String gerarCombinacaoTrechos(Map parametros) { + + String linhas = (String) parametros.get("LINHAS"); + String[] arrayLinhas = null; + + if(linhas != null) { + arrayLinhas = linhas.split(";"); + } + + @SuppressWarnings("unchecked") + List trechos = (List) parametros.get("TRECHOS"); + + List listParada1 = new ArrayList<>(); + List listParada2 = new ArrayList<>(); + StringBuilder sql = new StringBuilder(); + + for (RutaVO tramoVO : trechos) { + listParada1.add(new ParadaVO(tramoVO.getOrigenId(), tramoVO.getRutaId().intValue())); + } + + listParada2.addAll(listParada1); + + if (trechos != null) { + + LinkedList> lists = new LinkedList>(); + + lists.add(listParada1); + lists.add(listParada2); + + Set combinacoes = new TreeSet(); + + sql.append("AND ("); + for (ParadaVO s : lists.removeFirst()) + combinacoes.add(s.getParadaId().toString()); + + while (!lists.isEmpty()) { + List next = lists.removeFirst(); + Set novasCombinacoes = new TreeSet(); + for (String s1 : combinacoes) { + for (ParadaVO s2 : next) { + novasCombinacoes.add(s1 + ";" + s2.getParadaId()); + sql.append("(c.origen_id = ").append(s1).append(" AND c.destino_id = ").append(s2.getParadaId()).append(" and c.ruta_id = " + s2.getRutaId() + " ) OR "); + } + } + combinacoes = novasCombinacoes; + } + + // Remover o último " OR " da string + if (combinacoes.size() > 0) { + sql.delete(sql.length() - 4, sql.length()); + } + sql.append(")"); + + } + + return sql.toString(); + + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioAproveitamentoFinanceiroTrecho_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioAproveitamentoFinanceiroTrecho_pt_BR.properties new file mode 100644 index 000000000..2bc62084a --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioAproveitamentoFinanceiroTrecho_pt_BR.properties @@ -0,0 +1,13 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. + + +#Labels cabeçalho +cabecalho.relatorio=Relatório: +cabecalho.periodo=Período: +cabecalho.periodoA=à +cabecalho.dataHora=Data/Hora: +cabecalho.impressorPor=Impresso por: +cabecalho.pagina=Página +cabecalho.de=de +cabecalho.filtros=Filtros: \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAproveitamentoFinanceiroTrecho.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioAproveitamentoFinanceiroTrecho.jasper new file mode 100644 index 0000000000000000000000000000000000000000..668623ee4d50f527863316416c28a6f33e7a1b2a GIT binary patch literal 128509 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoFinanceiroController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoFinanceiroController.java index 1e81c42f5..3442e5159 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoFinanceiroController.java +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioAproveitamentoFinanceiroController.java @@ -19,25 +19,36 @@ import org.zkoss.util.resource.Labels; import org.zkoss.zhtml.Messagebox; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zk.ui.event.Events; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Datebox; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.Radiogroup; +import org.zkoss.zul.Row; import org.zkoss.zul.Textbox; import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.ParadaSecuencia; import com.rjconsultores.ventaboletos.entidad.Ruta; import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAproveitamentoFinanceiro; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioAproveitamentoFinanceiroTrecho; import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; import com.rjconsultores.ventaboletos.service.RutaService; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; +import com.rjconsultores.ventaboletos.vo.ruta.RutaVO; +import com.rjconsultores.ventaboletos.web.gui.controladores.catalogos.EditarLinhaController; 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.render.RenderRelatorioAproveitamentoFinanceiro; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioAproveitamentoFinanceiroTrecho; @Controller("relatorioAproveitamentoFinanceiroController") @Scope("prototype") @SuppressWarnings({ "rawtypes", "unchecked" }) + public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwardComposer { private static final long serialVersionUID = 1L; @@ -48,17 +59,21 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar private Datebox datInicial; private Datebox datFinal; - + @Autowired + private EditarLinhaController editarLinhaController; private MyComboboxEstandar cmbEmpresa; - private List lsEmpresa; - + private List lsEmpresa; + private ArrayList rutaVO = new ArrayList(); @Autowired private RutaService rutaService; private MyListbox linhaList; + private MyListbox trechoList; private MyListbox linhaListSelList; private Textbox txtPalavraPesquisaLinha; private ArrayList lsNumLinha = new ArrayList(); + private Radiogroup rgLayout; + private Row rowTrecho; @Override public void doAfterCompose(Component comp) throws Exception { @@ -67,6 +82,26 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa(); linhaList.setItemRenderer(new RenderRelatorioAproveitamentoFinanceiro()); linhaListSelList.setItemRenderer(new RenderRelatorioAproveitamentoFinanceiro()); + trechoList.setItemRenderer(new RenderRelatorioAproveitamentoFinanceiroTrecho()); + + } + + public void carregarTramos(Ruta rutaSelecionada) { + + List lsRutaVO = rutaService.buscaRutaParadas(rutaSelecionada.getRutaId()); + RutaVO ultimaRuta = lsRutaVO.get(lsRutaVO.size()-1); + RutaVO novaRuta = new RutaVO(ultimaRuta.getRutaId(), ultimaRuta.getNumRuta(), ultimaRuta.getPrefixo(),ultimaRuta.getDescruta(),ultimaRuta.getDescDestino(), ultimaRuta.getNumSecuencia(), ultimaRuta.getDestinoId(), ultimaRuta.getDestinoId()); + novaRuta.setDescOrigem(novaRuta.getDescParada()); + lsRutaVO.add(novaRuta); + List lsRutaVOAux = new ArrayList(); + lsRutaVOAux.addAll(trechoList.getListData()); + lsRutaVOAux.addAll(lsRutaVO); + trechoList.setData(lsRutaVOAux); + + } + + public void actualizarDados(List listaRutaVO) { + } public List getLsEmpresa() { @@ -80,13 +115,14 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar public void onDoubleClick$linhaList(Event ev) { Ruta rutaAux = (Ruta) linhaList.getSelected(); linhaListSelList.addItemNovo(rutaAux); + carregarTramos(rutaAux); } private void executarPesquisaLinha() { String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText(); linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta)); - + if (linhaList.getData().length == 0) { try { Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), @@ -112,7 +148,16 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar } private void executarRelatorio() throws Exception { - Relatorio relatorio; + + if(rgLayout.getSelectedItem().getValue().equals("EMISSAO_LINHA")) { + executarRelatorioLinha(); + }else { + executarRelatorioTrecho(); + } + } + + private void executarRelatorioLinha() throws Exception { + Map parametros = new HashMap(); StringBuilder filtro = new StringBuilder(); @@ -155,7 +200,7 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar } parametros.put("FILTROS", filtro.toString()); - relatorio = new RelatorioAproveitamentoFinanceiro(parametros, dataSourceRead.getConnection()); + Relatorio relatorio = new RelatorioAproveitamentoFinanceiro(parametros, dataSourceRead.getConnection()); Map args = new HashMap(); args.put("relatorio", relatorio); @@ -163,4 +208,57 @@ public class RelatorioAproveitamentoFinanceiroController extends MyGenericForwar openWindow("/component/reportView.zul", Labels.getLabel("relatorioAproveitamentoFinanceiroController.window.title"), args, MODAL); } + private void executarRelatorioTrecho() throws Exception { + Map parametros = new HashMap(); + StringBuilder filtro = new StringBuilder(); + + filtro.append("Linha: "); + String linhaIds = ""; + String linhas = ""; + List lslinhaSelecionados = new ArrayList(Arrays.asList(linhaListSelList.getData())); + if (lslinhaSelecionados.isEmpty()) { + linhas = "Todas"; + } else { + for (int i = 0; i < lslinhaSelecionados.size(); i++) { + Ruta linha = lslinhaSelecionados.get(i); + linhas = linhas + linha.getDescruta() + ", "; + + linhaIds = linhaIds + linha.getRutaId() + ", "; + } + + // removendo ultima virgula + linhaIds = linhaIds.substring(0, linhaIds.length() - 2); + linhas = linhas.substring(0, linhas.length() - 2); + parametros.put("LINHAS", linhaIds); + } + filtro.append(linhas).append(";"); + + parametros.put("DATA_INICIAL", (java.util.Date) this.datInicial.getValue()); + parametros.put("DATA_FINAL", (java.util.Date) this.datFinal.getValue()); + parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioAproveitamentoFinanceiroController.window.title")); + parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario()); + parametros.put("TRECHOS", trechoList.getListData()); + + filtro.append(" Empresa: "); + + Comboitem itemEmpresa = cmbEmpresa.getSelectedItem(); + if (itemEmpresa != null) { + Empresa empresa = (Empresa) itemEmpresa.getValue(); + parametros.put("EMPRESA_ID", empresa.getEmpresaId()); + parametros.put("EMPRESA", empresa.getNombempresa()); + filtro.append(empresa.getNombempresa() + ";"); + } else { + filtro.append(" Todas;"); + } + + parametros.put("FILTROS", filtro.toString()); + Relatorio relatorio = new RelatorioAproveitamentoFinanceiroTrecho(parametros, dataSourceRead.getConnection()); + + Map args = new HashMap(); + args.put("relatorio", relatorio); + + openWindow("/component/reportView.zul", + Labels.getLabel("relatorioAproveitamentoFinanceiroController.window.title"), args, MODAL); + } + } diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioAproveitamentoFinanceiroTrecho.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioAproveitamentoFinanceiroTrecho.java new file mode 100644 index 000000000..6dacec1ec --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioAproveitamentoFinanceiroTrecho.java @@ -0,0 +1,61 @@ +/** + * + */ +package com.rjconsultores.ventaboletos.web.utilerias.render; + +import org.zkoss.zk.ui.event.Event; +import org.zkoss.zk.ui.event.EventListener; +import org.zkoss.zul.Button; +import org.zkoss.zul.Listcell; +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; + +import com.rjconsultores.ventaboletos.vo.ruta.RutaVO; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; + +/** + * @author Wallace + * + */ +public class RenderRelatorioAproveitamentoFinanceiroTrecho implements ListitemRenderer { + + @Override + public void render(Listitem lstm, Object o) throws Exception { + RutaVO ruta = (RutaVO) o; + + Listcell lc = new Listcell(ruta.getNumRuta().toString()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getPrefixo()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getDescruta()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getDescOrigem()); + lc.setParent(lstm); + + Button btn = new Button(); + + lc = new Listcell(); + lc.setParent(lstm); + + btn.setWidth("16"); + btn.setHeight("16"); + btn.setImage("/gui/img/remove.png"); + + btn.addEventListener("onClick", new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + MyListbox listBox = (MyListbox) event.getTarget().getParent().getParent().getParent(); + Listitem listItem = (Listitem) event.getTarget().getParent().getParent(); + listBox.removeItem((RutaVO) listItem.getAttribute("data")); + } + }); + + lc.appendChild(btn); + + lstm.setAttribute("data", ruta); + } + +} diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index e95cb3ff8..edb59c917 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -10421,6 +10421,14 @@ relatorioAproveitamentoFinanceiroController.lbEmpresa.value = Empresa relatorioAproveitamentoFinanceiroController.btnPesquisa.label = Buscar relatorioAproveitamentoFinanceiroController.btnLimpar.label = Limpar relatorioAproveitamentoFinanceiroController.lbNumero.value = Número Agência +relatorioAproveitamentoFinanceiroController.window.title = Relatório de Aproveitamento Financeiro +relatorioAproveitamentoFinanceiroController.linha = Relatório por Linha +relatorioAproveitamentoFinanceiroController.trecho = Relatório por Trecho +relatorioAproveitamentoFinanceiroController.lbOrigem.value = Origem +relatorioAproveitamentoFinanceiroController.lbDestino.value = Destino +relatorioAproveitamentoFinanceiroController.lbNumRuta.label = Num. Linha +relatorioAproveitamentoFinanceiroController.lbPrefixo.label = Prefixo +relatorioLinhasHorarioController.lbOrgao.label = Orgão Concedente #Relatório MMPH - DER-PR relatorioMmphDerController.window.title = Relatório MMPH - DER-PR diff --git a/web/gui/relatorios/filtroRelatorioAproveitamentoFinanceiro.zul b/web/gui/relatorios/filtroRelatorioAproveitamentoFinanceiro.zul index e481fa8c2..d4642234a 100644 --- a/web/gui/relatorios/filtroRelatorioAproveitamentoFinanceiro.zul +++ b/web/gui/relatorios/filtroRelatorioAproveitamentoFinanceiro.zul @@ -6,7 +6,7 @@ @@ -46,10 +46,25 @@ model="@{winFiltroRelatorioAproveitamentoFinanceiro$composer.lsEmpresa}" width="95%" /> + + + +