From b51a3e8447396eecaca4ed945cf0b6d0c48ba419 Mon Sep 17 00:00:00 2001 From: julio Date: Thu, 1 Aug 2013 14:44:56 +0000 Subject: [PATCH] RELATORIO LINHA POR HORARIO git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@29651 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../impl/RelatorioLinhasHorario.java | 371 +++++++++++ .../RelatorioLinhasHorario_pt_BR.properties | 49 ++ .../templates/RelatorioLinhasHorario.jasper | Bin 0 -> 63477 bytes .../templates/RelatorioLinhasHorario.jrxml | 577 ++++++++++++++++++ .../templates/RelatorioTrechoVendido.jrxml | 2 +- .../RelatorioLinhasHorarioBean.java | 317 ++++++++++ .../RelatorioLinhasHorarioController.java | 298 +++++++++ .../ItemMenuRelatorioLinhasHorario.java | 25 + .../render/RenderCorridaOrigemDestino.java | 57 ++ .../RenderRelatorioLinhaOperacionalRuta.java | 24 + web/WEB-INF/i3-label_pt_BR.label | 23 +- .../filtroRelatorioLinhasHorario.zul | 222 +++++++ 12 files changed, 1963 insertions(+), 2 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorario.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorario_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioLinhasHorarioBean.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhasHorarioController.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioLinhasHorario.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaOrigemDestino.java create mode 100644 web/gui/relatorios/filtroRelatorioLinhasHorario.zul diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorario.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorario.java new file mode 100644 index 000000000..11324cf29 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorario.java @@ -0,0 +1,371 @@ +package com.rjconsultores.ventaboletos.relatorios.impl; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.ProcessadorParametros; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioLinhasHorarioBean; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; + +public class RelatorioLinhasHorario extends Relatorio { + + public RelatorioLinhasHorario(Map parametros, Connection conexao) { + super(parametros, conexao); + + this.setProcessadorParametros(new ProcessadorParametros(this) { + @Override + public void processaParametros() throws Exception { + + Connection conexao = this.relatorio.getConexao(); + + Map parametros = this.relatorio.getParametros(); + + @SuppressWarnings("unchecked") + ArrayList lsNumLinha = (ArrayList) parametros.get("lsNumLinha"); + @SuppressWarnings("unchecked") + ArrayList lsNumServico = (ArrayList) parametros.get("lsNumServico"); + + String servicoFiltro = ""; + if (lsNumServico.size() > 0) { + for (Corrida corrida : lsNumServico) { + if (lsNumServico.indexOf(corrida) == 0) { + servicoFiltro = "" + corrida.getId().getCorridaId(); + } else { + servicoFiltro += ", " + corrida.getId().getCorridaId(); + } + } + } else { + servicoFiltro = "TODOS"; + } + parametros.put("SERVICO_FILTRO", servicoFiltro); + + String linhaFiltro = ""; + if (lsNumLinha.size() > 0) { + for (Ruta ruta : lsNumLinha) { + if (lsNumLinha.indexOf(ruta) == 0) { + linhaFiltro = "" + ruta.getRutaId(); + } else { + linhaFiltro += ", " + ruta.getRutaId(); + } + } + } else { + linhaFiltro = "TODOS"; + } + parametros.put("LINHA_FILTRO", linhaFiltro); + + Empresa empresa = (Empresa) parametros.get("EMPRESA"); + + Integer tipoServico = (Integer) parametros.get("TIPOSERVICIO_ID"); + String sql = getSql(lsNumLinha, lsNumServico, empresa, tipoServico); + + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); + ResultSet rset = null; + + stmt.setTimestamp("DATA_INICIO", (Timestamp) parametros.get("DATA_INICIO")); + stmt.setTimestamp("DATA_FINAL", (Timestamp) parametros.get("DATA_FINAL")); + + rset = stmt.executeQuery(); + + List lsDadosRelatorio = new ArrayList(); + + while (rset.next()) { + + RelatorioLinhasHorarioBean horarioBean = new RelatorioLinhasHorarioBean(); + + horarioBean.setGrupoRuta((String) rset.getObject("GRUPO_RUTA")); + horarioBean.setHora((String) rset.getObject("HORA")); + horarioBean.setServico((BigDecimal) rset.getObject("SERVICO")); + + if (rset.getObject("SENTIDO") != null) + horarioBean.convetSentido((BigDecimal) rset.getObject("SENTIDO")); + else + horarioBean.convetSentido(null); + horarioBean.setLot((BigDecimal) rset.getObject("LOT")); + horarioBean.setCla((String) rset.getObject("CLA")); + horarioBean.setExtensaoTrecho((BigDecimal) rset.getObject("EXTENSAO_TRECHO")); + horarioBean.setExtensao((BigDecimal) rset.getObject("EXTENSAO")); + horarioBean.setTarifa((BigDecimal) rset.getObject("TARIFA")); + horarioBean.setPassagens((BigDecimal) rset.getObject("PASSAGENS")); + horarioBean.setSeguro((BigDecimal) rset.getObject("SEGURO")); + horarioBean.setBagagens((BigDecimal) rset.getObject("BAGAGENS")); + + horarioBean.setOrd((BigDecimal) rset.getObject("ORD")); + horarioBean.setExtra((BigDecimal) rset.getObject("EXTRA")); + horarioBean.setAbsol((BigDecimal) rset.getObject("ABSOL")); + horarioBean.setQuanPasTrecho((BigDecimal) rset.getObject("QUAN_PAS_TRECHO")); + + horarioBean.setOrigem((String) rset.getObject("ORIGEM")); + horarioBean.setDestino((String) rset.getObject("DESTINO")); + + horarioBean.setSegOpc((BigDecimal) rset.getObject("SEGURO")); + + horarioBean = trecho(horarioBean); + + horarioBean = calcTotal(horarioBean); + horarioBean = calcMediaReceitaTotal(horarioBean); + + horarioBean = calcTotalViagem(horarioBean); + horarioBean = calcKmRodado(horarioBean); + horarioBean = calcEquivalente(horarioBean); + horarioBean = calcMpa(horarioBean); + horarioBean = calcMpe(horarioBean); + horarioBean = calcRsKm(horarioBean); + horarioBean = calcEq(horarioBean); + horarioBean = calcRsViagem(horarioBean); + horarioBean = calcPaxKmOfertado(horarioBean); + horarioBean = calcPaxKmTransportado(horarioBean); + horarioBean = calcIap(horarioBean); + + lsDadosRelatorio.add(horarioBean); + } + parametros.put("lsDadosRelatorio", lsDadosRelatorio); + + } + }); + + } + + private RelatorioLinhasHorarioBean trecho(RelatorioLinhasHorarioBean horarioBean) { + horarioBean.setTrecho(horarioBean.getOrigem() + " - " + horarioBean.getDestino()); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal total = horarioBean.getPassagens().add(horarioBean.getSeguro()); + total = total.add(horarioBean.getBagagens()); + horarioBean.setTotal(total); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMediaReceitaTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mediaTotal = horarioBean.getPassagens().add(horarioBean.getSeguro()); + mediaTotal = mediaTotal.add(horarioBean.getBagagens()); + mediaTotal = mediaTotal.divide(new BigDecimal(3), RoundingMode.CEILING); + horarioBean.setMediaReceitaViagem(mediaTotal); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcTotalViagem(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal totalViagem = horarioBean.getOrd().add(horarioBean.getExtra()); + horarioBean.setTotalViagem(totalViagem); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcKmRodado(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal kmRodado = horarioBean.getTotalViagem().multiply(horarioBean.getExtensao()); + horarioBean.setKmRodado(kmRodado); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcEquivalente(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal equivalente = new BigDecimal(0); + try { + equivalente = horarioBean.getExtensao().divide(horarioBean.getExtensaoTrecho(), RoundingMode.CEILING); + equivalente = equivalente.multiply(horarioBean.getQuanPasTrecho()); + + } catch (ArithmeticException e) { + equivalente = new BigDecimal(0); + } catch (NullPointerException nex) { + equivalente = new BigDecimal(0); + } catch (Exception ex) { + ex.printStackTrace(); + } + horarioBean.setEquivalente(equivalente); + + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpa(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpa = horarioBean.getAbsol().divide(horarioBean.getTotalViagem(), RoundingMode.CEILING); + horarioBean.setMpa(mpa); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpe(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpe = horarioBean.getEquivalente().divide(horarioBean.getTotalViagem(), RoundingMode.CEILING); + horarioBean.setMpe(mpe); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsKm(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal rsKm = horarioBean.getTotal().divide(horarioBean.getTotalViagem(), RoundingMode.CEILING); + rsKm = rsKm.multiply(horarioBean.getExtensao()); + horarioBean.setRsKm(rsKm); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcEq(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal eq = null; + try { + eq = horarioBean.getMediaReceitaViagem().divide(horarioBean.getTarifa(), RoundingMode.CEILING); + } catch (ArithmeticException e) { + eq = new BigDecimal(0); + } catch (NullPointerException nex) { + eq = new BigDecimal(0); + } catch (Exception ex) { + ex.printStackTrace(); + } + horarioBean.setEq(eq); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsViagem(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal RSViagem = horarioBean.getTotal().divide(horarioBean.getTotalViagem(), RoundingMode.CEILING); + horarioBean.setRsViagem(RSViagem); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcPaxKmOfertado(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal paxKmOfertado = horarioBean.getLot().multiply(horarioBean.getTotalViagem()); + paxKmOfertado = paxKmOfertado.multiply(horarioBean.getExtensao()); + horarioBean.setPaxKmOfertado(paxKmOfertado); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcPaxKmTransportado(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal paxKmTransportado = horarioBean.getExtensao().multiply(horarioBean.getEquivalente()); + horarioBean.setPaxKmTransportado(paxKmTransportado); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcIap(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal iap = null; + try { + iap = horarioBean.getPaxKmOfertado().divide(horarioBean.getPaxKmTransportado(), 4, RoundingMode.HALF_EVEN); + } catch (ArithmeticException e) { + iap = new BigDecimal(0); + } catch (NullPointerException nex) { + iap = new BigDecimal(0); + } catch (Exception ex) { + ex.printStackTrace(); + } + horarioBean.setIap(iap); + return horarioBean; + } + + @Override + protected void processaParametros() throws Exception { + this.getProcessadorParametros().processaParametros(); + } + + private String getSql(ArrayList lsNumLinha, ArrayList lsNumServico, Empresa empresa, Integer tipoServico) { + StringBuffer sql = new StringBuffer(); + + sql.append(" SELECT "); + sql.append(" NVL(GR.DESCGRUPO, 'Não Informado') AS GRUPO_RUTA, "); + sql.append(" TO_CHAR(CJ.FECHORVIAJE, 'HH24:MI') AS HORA, "); + sql.append(" C.CORRIDA_ID AS SERVICO, "); + sql.append(" R.INDSENTIDOIDA AS SENTIDO, "); + sql.append(" DA.CANTASIENTOS AS LOT, "); + sql.append(" CS.CVECLASE AS CLA, "); + sql.append(" CJ.NUMKMVIAJE AS EXTENSAO_TRECHO, "); + sql.append(" EXTENSAO, "); + sql.append(" NVL(CJ.PRECIOBASE, 0) AS TARIFA, "); + sql.append(" ORIGEM.CVEPARADA AS ORIGEM, "); + sql.append(" DESTINO.CVEPARADA AS DESTINO, "); + sql.append(" SUM(NVL(EE.IMPINGRESO, 0)) AS BAGAGENS, "); + sql.append(" SUM(NVL(CJ.PRECIOBASE, 0)) AS PASSAGENS, "); + sql.append(" SUM(NVL(CJ.IMPORTETAXAEMBARQUE, 0)) AS SEGURO, "); + sql.append(" COUNT(CASE "); + sql.append(" WHEN C.TIPOSERVICIO_ID = 1 "); + sql.append(" OR C.TIPOSERVICIO_ID IS NULL THEN 1 "); + sql.append(" ELSE NULL "); + sql.append(" END) AS ORD, "); + sql.append(" COUNT(CASE "); + sql.append(" WHEN C.TIPOSERVICIO_ID = 2 "); + sql.append(" OR C.TIPOSERVICIO_ID IS NULL THEN 1 "); + sql.append(" ELSE NULL "); + sql.append(" END) AS EXTRA, "); + sql.append(" COUNT(CASE "); + sql.append(" WHEN CJ.FECCORRIDA > :DATA_INICIO "); + sql.append(" AND CJ.FECCORRIDA < :DATA_FINAL THEN 1 "); + sql.append(" ELSE NULL "); + sql.append(" END) AS ABSOL, "); + sql.append(" COUNT(CJ.CORRIDA_ID) AS QUAN_PAS_TRECHO "); + sql.append(" FROM (SELECT RS.RUTA_ID, "); + sql.append(" SUM(NVL(T.CANTKMREAL, 0)) AS EXTENSAO "); + sql.append(" FROM RUTA_SECUENCIA RS "); + sql.append(" LEFT JOIN TRAMO T "); + sql.append(" ON ( RS.TRAMO_ID = T.TRAMO_ID ) "); + sql.append(" GROUP BY RS.RUTA_ID) TB1, "); + sql.append(" CORRIDA C "); + sql.append(" LEFT JOIN CAJA CJ "); + sql.append(" ON ( CJ.CORRIDA_ID = C.CORRIDA_ID "); + sql.append(" AND CJ.FECCORRIDA = C.FECCORRIDA ) "); + sql.append(" LEFT JOIN PARADA ORIGEM "); + sql.append(" ON ( CJ.ORIGEN_ID = ORIGEM.PARADA_ID ) "); + sql.append(" LEFT JOIN PARADA DESTINO "); + sql.append(" ON ( CJ.DESTINO_ID = DESTINO.PARADA_ID ) "); + sql.append(" LEFT JOIN RUTA R "); + sql.append(" ON ( C.RUTA_ID = R.RUTA_ID ) "); + sql.append(" LEFT OUTER JOIN GRUPO_RUTA GR "); + sql.append(" ON ( R.GRUPORUTA_ID = GR.GRUPORUTA_ID ) "); + sql.append(" LEFT JOIN ROL_OPERATIVO RO "); + sql.append(" ON ( C.ROLOPERATIVO_ID = RO.ROLOPERATIVO_ID ) "); + sql.append(" LEFT OUTER JOIN DIAGRAMA_AUTOBUS DA "); + sql.append(" ON ( DA.DIAGRAMAAUTOBUS_ID = RO.DIAGRAMAAUTOBUS_ID ) "); + sql.append(" LEFT JOIN CLASE_SERVICIO CS "); + sql.append(" ON ( CS.CLASESERVICIO_ID = C.CLASESERVICIO_ID ) "); + sql.append(" LEFT JOIN EVENTO_EXTRA EE "); + sql.append(" ON ( EE.CORRIDA_ID = C.CORRIDA_ID "); + sql.append(" AND EE.FECCORRIDA = C.FECCORRIDA "); + sql.append(" AND EE.TIPOEVENTOEXTRA_ID = 1 ) "); + sql.append(" WHERE CJ.FECCORRIDA BETWEEN :DATA_INICIO AND :DATA_FINAL "); + sql.append(" AND TB1.RUTA_ID = C.RUTA_ID "); + + if (empresa != null) { + sql.append(" AND C.EMPRESACORRIDA_ID IN ( " + empresa.getEmpresaId() + " ) "); + } + + if (lsNumServico.size() > 0) { + for (Corrida corrida : lsNumServico) { + if (lsNumServico.indexOf(corrida) == 0) { + sql.append(" AND C.CORRIDA_ID IN ( " + corrida.getId().getCorridaId()); + } else { + sql.append(" , " + corrida.getId().getCorridaId() + " "); + } + } + sql.append(" ) "); + } + + if (lsNumLinha.size() > 0) { + for (Ruta ruta : lsNumLinha) { + if (lsNumLinha.indexOf(ruta) == 0) { + sql.append(" AND R.RUTA_ID IN ( " + ruta.getRutaId()); + } else { + sql.append(" , " + ruta.getRutaId() + " "); + } + } + sql.append(" ) "); + } + + if (tipoServico > 0) { + sql.append(" AND C.TIPOSERVICIO_ID = " + tipoServico + " "); + } + + sql.append(" GROUP BY "); + sql.append(" NVL(GR.DESCGRUPO, 'Não Informado'), "); + sql.append(" TO_CHAR(CJ.FECHORVIAJE, 'HH24:MI'), "); + sql.append(" C.CORRIDA_ID, "); + sql.append(" R.INDSENTIDOIDA, "); + sql.append(" CJ.PRECIOBASE, "); + sql.append(" DA.CANTASIENTOS, "); + sql.append(" CS.CVECLASE, "); + sql.append(" CJ.NUMKMVIAJE, "); + sql.append(" EXTENSAO, "); + sql.append(" ORIGEM.CVEPARADA, "); + sql.append(" DESTINO.CVEPARADA "); + sql.append(" ORDER BY C.CORRIDA_ID "); + return sql.toString(); + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorario_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorario_pt_BR.properties new file mode 100644 index 000000000..490339664 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorario_pt_BR.properties @@ -0,0 +1,49 @@ +#geral +msg.noData=Não foi possivel obter dados com os parâmetros informados. +msg.a=à + +#Labels header +header.titulo.relatorio=Resumo de Linhas por Horário - RLH +header.periodo=Período: +header.data.hora=Data/Hora: +header.pagina=Página: +header.filtro=Filtro: +header.filtro.servico=Serviço: +header.filtro.linha=Linha: + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂMETROS OPERACIONAIS +detail.hora=Hora +detail.servico=Serviço +detail.trecho=Trecho +detail.setido=Sentido +detail.lot=Lot. +detail.cal=Cla. +detail.extensao=Extensão +detail.tarifa=Tarifa +detail.passagens=Passagens +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Seg.Opc. +detail.total=Total +detail.ord=Ord. +detail.extra=Extra +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.absol=Absol. +detail.equivalente=Equivalente +detail.mpa=MPA +detail.mpe=MPE +detail.rsKm=R$/Km +detail.eq=Eq. +detail.rsViagem=R$/Viagem +detail.paxOfer=Pax.Km Ofertado +detail.paxTrans=Pax.Km Transportado +detail.iap=IAP% + + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jasper new file mode 100644 index 0000000000000000000000000000000000000000..e1455b707a1320cb6487ca83061b52cecdd639d3 GIT binary patch literal 63477 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

)D};SSpq(DePPGLBno3-mJ%ftI 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 literal 0 HcmV?d00001 diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jrxml new file mode 100644 index 000000000..77ba87fc8 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorario.jrxml @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band splitType="Stretch"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioTrechoVendido.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioTrechoVendido.jrxml index 382112e02..b96704dfc 100644 --- a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioTrechoVendido.jrxml +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioTrechoVendido.jrxml @@ -1,7 +1,7 @@ - + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioLinhasHorarioBean.java b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioLinhasHorarioBean.java new file mode 100644 index 000000000..32396ecf7 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/utilitarios/RelatorioLinhasHorarioBean.java @@ -0,0 +1,317 @@ +package com.rjconsultores.ventaboletos.relatorios.utilitarios; + +import java.math.BigDecimal; + +public class RelatorioLinhasHorarioBean { + + private String grupoRuta; + private String origem; + private String destino; + private String hora; + private BigDecimal servico; + private String trecho; + private String sentido; + private BigDecimal lot; + private String cla; + private BigDecimal extensaoTrecho; + private BigDecimal extensao; + private BigDecimal tarifa; + private BigDecimal passagens; + private BigDecimal seguro; + private BigDecimal bagagens; + private BigDecimal segOpc; + private BigDecimal total; + private BigDecimal ord; + private BigDecimal extra; + private BigDecimal absol; + private BigDecimal quanPasTrecho; + private BigDecimal mediaReceitaViagem; + private BigDecimal totalViagem; + private BigDecimal kmRodado; + private BigDecimal equivalente; + private BigDecimal mpa; + private BigDecimal mpe; + private BigDecimal rsKm; + private BigDecimal eq; + private BigDecimal rsViagem; + private BigDecimal paxKmOfertado; + private BigDecimal paxKmTransportado; + private BigDecimal iap; + + public RelatorioLinhasHorarioBean() { + } + + public String getSentido() { + return sentido; + } + + public void convetSentido(BigDecimal sen) { + + if (sen == null) { + this.sentido = ""; + } else { + if (sen.intValue() == 1) { + this.sentido = "ida"; + } else { + this.sentido = "volta"; + } + } + } + + public String getGrupoRuta() { + return grupoRuta; + } + + public void setGrupoRuta(String grupoRuta) { + this.grupoRuta = grupoRuta; + } + + 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 getHora() { + return hora; + } + + public void setHora(String hora) { + this.hora = hora; + } + + public BigDecimal getServico() { + return servico; + } + + public void setServico(BigDecimal servico) { + this.servico = servico; + } + + public String getTrecho() { + return trecho; + } + + public void setTrecho(String trecho) { + this.trecho = trecho; + } + + public BigDecimal getLot() { + return lot; + } + + public void setLot(BigDecimal lot) { + this.lot = lot; + } + + public String getCla() { + return cla; + } + + public void setCla(String cla) { + this.cla = cla; + } + + public BigDecimal getExtensaoTrecho() { + return extensaoTrecho; + } + + public void setExtensaoTrecho(BigDecimal extensaoTrecho) { + this.extensaoTrecho = extensaoTrecho; + } + + public BigDecimal getExtensao() { + return extensao; + } + + public void setExtensao(BigDecimal extensao) { + this.extensao = extensao; + } + + public BigDecimal getTarifa() { + return tarifa; + } + + public void setTarifa(BigDecimal tarifa) { + this.tarifa = tarifa; + } + + public BigDecimal getPassagens() { + return passagens; + } + + public void setPassagens(BigDecimal passagens) { + this.passagens = passagens; + } + + public BigDecimal getSeguro() { + return seguro; + } + + public void setSeguro(BigDecimal seguro) { + this.seguro = seguro; + } + + public BigDecimal getBagagens() { + return bagagens; + } + + public void setBagagens(BigDecimal bagagens) { + this.bagagens = bagagens; + } + + public BigDecimal getSegOpc() { + return segOpc; + } + + public void setSegOpc(BigDecimal segOpc) { + this.segOpc = segOpc; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getOrd() { + return ord; + } + + public void setOrd(BigDecimal ord) { + this.ord = ord; + } + + public BigDecimal getExtra() { + return extra; + } + + public void setExtra(BigDecimal extra) { + this.extra = extra; + } + + public BigDecimal getAbsol() { + return absol; + } + + public void setAbsol(BigDecimal absol) { + this.absol = absol; + } + + public BigDecimal getQuanPasTrecho() { + return quanPasTrecho; + } + + public void setQuanPasTrecho(BigDecimal quanPasTrecho) { + this.quanPasTrecho = quanPasTrecho; + } + + public BigDecimal getMediaReceitaViagem() { + return mediaReceitaViagem; + } + + public void setMediaReceitaViagem(BigDecimal mediaReceitaViagem) { + this.mediaReceitaViagem = mediaReceitaViagem; + } + + public BigDecimal getTotalViagem() { + return totalViagem; + } + + public void setTotalViagem(BigDecimal totalViagem) { + this.totalViagem = totalViagem; + } + + public BigDecimal getKmRodado() { + return kmRodado; + } + + public void setKmRodado(BigDecimal kmRodado) { + this.kmRodado = kmRodado; + } + + public BigDecimal getEquivalente() { + return equivalente; + } + + public void setEquivalente(BigDecimal equivalente) { + this.equivalente = equivalente; + } + + public BigDecimal getMpa() { + return mpa; + } + + public void setMpa(BigDecimal mpa) { + this.mpa = mpa; + } + + public BigDecimal getMpe() { + return mpe; + } + + public void setMpe(BigDecimal mpe) { + this.mpe = mpe; + } + + public BigDecimal getRsKm() { + return rsKm; + } + + public void setRsKm(BigDecimal rsKm) { + this.rsKm = rsKm; + } + + public BigDecimal getEq() { + return eq; + } + + public void setEq(BigDecimal eq) { + this.eq = eq; + } + + public BigDecimal getRsViagem() { + return rsViagem; + } + + public void setRsViagem(BigDecimal rsViagem) { + this.rsViagem = rsViagem; + } + + public BigDecimal getPaxKmOfertado() { + return paxKmOfertado; + } + + public void setPaxKmOfertado(BigDecimal paxKmOfertado) { + this.paxKmOfertado = paxKmOfertado; + } + + public BigDecimal getPaxKmTransportado() { + return paxKmTransportado; + } + + public void setPaxKmTransportado(BigDecimal paxKmTransportado) { + this.paxKmTransportado = paxKmTransportado; + } + + public BigDecimal getIap() { + return iap; + } + + public void setIap(BigDecimal iap) { + this.iap = iap; + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhasHorarioController.java b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhasHorarioController.java new file mode 100644 index 000000000..40117db93 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/gui/controladores/relatorios/RelatorioLinhasHorarioController.java @@ -0,0 +1,298 @@ +package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; +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.Combobox; +import org.zkoss.zul.Datebox; +import org.zkoss.zul.Paging; +import org.zkoss.zul.Radio; +import org.zkoss.zul.Textbox; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorario; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.service.CorridaService; +import com.rjconsultores.ventaboletos.service.EmpresaService; +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.RenderCorridaOrigemDestino; +import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioLinhaOperacionalRuta; +import com.trg.search.Filter; + +@Controller("relatorioLinhasHorarioController") +@Scope("prototype") +public class RelatorioLinhasHorarioController extends MyGenericForwardComposer { + + private static final long serialVersionUID = 1L; + private static Logger log = Logger.getLogger(RelatorioLinhasHorarioController.class); + + @Autowired + private DataSource dataSource; + + @Autowired + private EmpresaService empresaService; + + @Autowired + private CorridaService corridaService; + + private Datebox datInicial; + private Datebox datFinal; + + private Combobox cmbEmpresa; + private List lsEmpresa; + + @Autowired + private transient PagedListWrapper plwLinha; + private MyListbox linhaList; + private MyListbox linhaListSelList; + private Paging pagingLinha; + private Textbox txtPalavraPesquisaLinha; + + private ArrayList lsNumLinha = new ArrayList(); + + @Autowired + private transient PagedListWrapper plwServico; + private MyListbox servicoList; + private MyListbox servicoListSelList; + private Textbox txtCorridaId; + + private ArrayList lsNumServico = new ArrayList(); + + private Radio rdOrdinario; + private Radio rdExtraOrdinario; + private Radio rdTodos; + + private void executarRelatorio() throws Exception { + + Map parametros = new HashMap(); + + Integer tipoServico = null; + try { + if (rdOrdinario.isSelected()) { + tipoServico = Integer.parseInt(rdOrdinario.getValue()); + } + if (rdExtraOrdinario.isSelected()) { + tipoServico = Integer.parseInt(rdExtraOrdinario.getValue()); + } + if (rdTodos.isSelected()) { + tipoServico = Integer.parseInt(rdTodos.getValue()); + } + } catch (Exception e) { + log.debug(e.getMessage()); + } + + parametros.put("TIPOSERVICIO_ID", tipoServico); + + Timestamp dataInicio = new Timestamp(((java.util.Date) this.datInicial.getValue()).getTime()); + Timestamp dataFinal = new Timestamp(((java.util.Date) this.datFinal.getValue()).getTime()); + + GregorianCalendar auxDataInicio = (GregorianCalendar) GregorianCalendar.getInstance(); + auxDataInicio.setTimeInMillis(dataInicio.getTime()); + + int year = auxDataInicio.get(Calendar.YEAR); + int month = auxDataInicio.get(Calendar.MONTH); + int date = auxDataInicio.get(Calendar.DATE); + + int hourOfDay = 00; + int minute = 00; + int second = 00; + + auxDataInicio.set(year, month, date, hourOfDay, minute, second); + dataInicio = new Timestamp(auxDataInicio.getTimeInMillis()); + + GregorianCalendar auxDataFinal = (GregorianCalendar) GregorianCalendar.getInstance(); + auxDataFinal.setTimeInMillis(dataFinal.getTime()); + + year = auxDataFinal.get(Calendar.YEAR); + month = auxDataFinal.get(Calendar.MONTH); + date = auxDataFinal.get(Calendar.DATE); + + hourOfDay = 23; + minute = 59; + second = 59; + + auxDataFinal.set(year, month, date, hourOfDay, minute, second); + dataFinal = new Timestamp(auxDataFinal.getTimeInMillis()); + + parametros.put("DATA_INICIO", dataInicio); + parametros.put("DATA_FINAL", dataFinal); + + Empresa empresa = null; + try { + empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue(); + } catch (Exception e) { + log.debug(e.getMessage()); + } + parametros.put("EMPRESA", empresa); + + if (empresa != null) { + parametros.put("NOMBEMPRESA", empresa.getNombempresa()); + } else { + parametros.put("NOMBEMPRESA", "TODOS"); + } + + lsNumLinha = new ArrayList(Arrays.asList(linhaListSelList.getData())); + lsNumServico = new ArrayList(Arrays.asList(servicoListSelList.getData())); + + parametros.put("lsNumLinha", lsNumLinha); + parametros.put("lsNumServico", lsNumServico); + + Relatorio relatorio = new RelatorioLinhasHorario(parametros, dataSource.getConnection()); + + Map args = new HashMap(); + args.put("relatorio", relatorio); + + openWindow("/component/reportView.zul", + Labels.getLabel("relatorioLinhasHorarioController.window.title"), args, MODAL); + + } + + public void onClick$btnExecutarRelatorio(Event ev) throws Exception { + executarRelatorio(); + } + + public void onClick$btnPesquisaLinha(Event ev) { + executarPesquisaLinha(); + } + + public void onClick$btnLimparLinha(Event ev) { + + linhaList.clearSelection(); + lsNumLinha.clear(); + } + + public void onDoubleClick$servicoList(Event ev) { + + Corrida corridaAux = (Corrida) servicoList.getSelected(); + Boolean bExiste = false; + + for (Corrida c : lsNumServico) { + if (c.equals(corridaAux)) + bExiste = true; + } + + if (!bExiste) { + lsNumServico.add(corridaAux); + servicoListSelList.setData(lsNumServico); + } + } + + public void onDoubleClick$servicoListSelList(Event ev) { + Corrida corridaSel = (Corrida) servicoListSelList.getSelected(); + servicoListSelList.removeItem(corridaSel); + lsNumServico.remove(corridaSel); + + } + + public void onDoubleClick$linhaList(Event ev) { + Ruta rutaAux = (Ruta) linhaList.getSelected(); + Boolean bExiste = false; + + for (Ruta r : lsNumLinha) { + if (r.equals(rutaAux)) + bExiste = true; + } + + if (!bExiste) { + lsNumLinha.add(rutaAux); + linhaListSelList.setData(lsNumLinha); + } + } + + public void onDoubleClick$linhaListSelList(Event ev) { + Ruta rutaSel = (Ruta) linhaListSelList.getSelected(); + linhaListSelList.removeItem(rutaSel); + lsNumLinha.remove(rutaSel); + } + + private void executarPesquisaLinha() { + HibernateSearchObject linhaBusqueda = + new HibernateSearchObject(Ruta.class, pagingLinha.getPageSize()); + + linhaBusqueda.addFilterOr(Filter.like("descruta", "%" + txtPalavraPesquisaLinha.getText().trim().toUpperCase().concat("%")), Filter.like("prefixo", "%" + txtPalavraPesquisaLinha.getText().trim().toUpperCase().concat("%"))); + linhaBusqueda.addSortAsc("descruta"); + linhaBusqueda.addFilterEqual("activo", Boolean.TRUE); + + plwLinha.init(linhaBusqueda, linhaList, pagingLinha); + + if (linhaList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioLinhasHorarioController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + private void executarPesquisaServico() { + + Integer corridaId = 0; + try { + corridaId = Integer.parseInt(txtCorridaId.getValue()); + } catch (Exception e) { + log.debug(e.getMessage()); + } + + servicoList.setData(corridaService.buscarGroupCorrridaId(corridaId, datInicial.getValue(), datFinal.getValue())); + + if (servicoList.getData().length == 0) { + try { + Messagebox.show(Labels.getLabel("MSG.ningunRegistro"), + Labels.getLabel("relatorioLinhasHorarioController.window.title"), + Messagebox.OK, Messagebox.INFORMATION); + } catch (InterruptedException ex) { + } + } + } + + public void onClick$btnLimparServico(Event ev) { + servicoList.clearSelection(); + lsNumServico.clear(); + } + + public void onClick$btnPesquisaServico(Event ev) { + executarPesquisaServico(); + } + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + lsEmpresa = empresaService.obtenerTodos(); + + linhaList.setItemRenderer(new RenderRelatorioLinhaOperacionalRuta()); + linhaListSelList.setItemRenderer(new RenderRelatorioLinhaOperacionalRuta()); + + servicoList.setItemRenderer(new RenderCorridaOrigemDestino()); + servicoListSelList.setItemRenderer(new RenderCorridaOrigemDestino()); + } + + public List getLsEmpresa() { + return lsEmpresa; + } + + public void setLsEmpresa(List lsEmpresa) { + this.lsEmpresa = lsEmpresa; + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioLinhasHorario.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioLinhasHorario.java new file mode 100644 index 000000000..237220acf --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/relatorios/ItemMenuRelatorioLinhasHorario.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 ItemMenuRelatorioLinhasHorario extends DefaultItemMenuSistema { + + public ItemMenuRelatorioLinhasHorario() { + super("indexController.mniRelatorioLinhasHorario.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.RELATORIOS.MENU.RELATORIOLINHASHORARIO"; + } + + @Override + public void ejecutar() { + PantallaUtileria.openWindow("/gui/relatorios/filtroRelatorioLinhasHorario.zul", + Labels.getLabel("relatorioLinhasHorarioController.window.title"), null, desktop); + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaOrigemDestino.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaOrigemDestino.java new file mode 100644 index 000000000..a62bf9aa5 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderCorridaOrigemDestino.java @@ -0,0 +1,57 @@ +package com.rjconsultores.ventaboletos.web.utilerias.render; + +import java.text.SimpleDateFormat; + +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.entidad.Corrida; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; + +public class RenderCorridaOrigemDestino implements ListitemRenderer { + + private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + + public void render(Listitem lstm, Object o) throws Exception { + Corrida corrida = (Corrida) o; + + Listcell lc = new Listcell(corrida.getId().getCorridaId().toString()); + lc.setParent(lstm); + + lc = new Listcell(sdf.format(corrida.getFechorsalida())); + lc.setParent(lstm); + + lc = new Listcell(corrida.getRuta().getRutaId().toString()); + lc.setParent(lstm); + + lc = new Listcell(corrida.getRuta().getDescruta()); + 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((Corrida) listItem.getAttribute("data")); + } + }); + + lc.appendChild(btn); + + lstm.setAttribute("data", corrida); + } + +} \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaOperacionalRuta.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaOperacionalRuta.java index c5f7efe00..fb901caee 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaOperacionalRuta.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaOperacionalRuta.java @@ -1,11 +1,15 @@ 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.entidad.OrgaoConcedente; import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.web.utilerias.MyListbox; public class RenderRelatorioLinhaOperacionalRuta implements ListitemRenderer { @@ -29,6 +33,26 @@ public class RenderRelatorioLinhaOperacionalRuta implements ListitemRenderer { } 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((Ruta) 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 4ad7eda97..2f0b47ada 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -220,6 +220,7 @@ indexController.mniRelatorioOrigemDestino.label = Relatório de Origem e Destino indexController.mniRelatorioPassageirosViajar.label = Passageiros a Viajar indexController.mniRelatorioResumoLinhas.label = Relatório Resumo de Linhas indexController.mniRelatorioAcompanhamentoEquivalentes.label = Relatório Acompanhamento Equivalentes +indexController.mniRelatorioLinhasHorario.label = Relatório de Linhas por Horário #PARTE REALIZADA POR MANUEL indexController.mnCortesias.label = Cortesias Para Funcionários @@ -280,7 +281,6 @@ relatorioAproveitamentoController.window.title = Relatório de Aproveitamento relatorioAproveitamentoController.lbFecCorrida.value = Data Serviço relatorioAproveitamentoController.lbServico.value = N. Serviço - relatorioAproveitamentoController.lhDesc.label = Descrição relatorioAproveitamentoController.Origem.label = Origem relatorioAproveitamentoController.Destino.label = Destino @@ -290,6 +290,27 @@ relatorioAproveitamentoController.HoraServico.label = Hora Serviço relatorioAproveitamentoController.Classe.label = Classe relatorioAproveitamentoController.btnBuscarServico.label = Buscar Serviço +#Relatorio Linhas Horario +relatorioLinhasHorarioController.window.title = Relatório de Linhas por Horário +relatorioLinhasHorarioController.lbDataIni.value = Data Inicial +relatorioLinhasHorarioController.lbDataFin.value = Data Final +relatorioLinhasHorarioController.lbEmpresa.label = Empresa +relatorioLinhasHorarioController.lbLote.label = Lote +relatorioLinhasHorarioController.lbLinha.label = Linha +relatorioLinhasHorarioController.lbServico.label = Servico +relatorioLinhasHorarioController.lbPrefixo.label = Prefixo +relatorioLinhasHorarioController.lbOrgao.label = Orgão Concedente +relatorioLinhasHorarioController.lbDataCorrida.value = Data +relatorioLinhasHorarioController.btnPesquisa.label = Pesquisar +relatorioLinhasHorarioController.btnLimpar.label = Limpar +relatorioLinhasHorarioController.horaSaida.label = Hora +relatorioLinhasHorarioController.origem.destino.label = Origem x Destino +relatorioLinhasHorarioController.rutaId.label = Cód Linha +relatorioLinhasHorarioController.rdTipoServico.label = Tipos de Serviços +relatorioLinhasHorarioController.rdOrdinario.label = Ordinários +relatorioLinhasHorarioController.rdExtraOrdinario.label = Extraordinários +relatorioLinhasHorarioController.rdTodos.label = Todos + #Relatorio Trecho Vendido relatorioTrechoVendidoController.lbDataIni.value = Data Inicial relatorioTrechoVendidoController.lbDataFin.value = Data Final diff --git a/web/gui/relatorios/filtroRelatorioLinhasHorario.zul b/web/gui/relatorios/filtroRelatorioLinhasHorario.zul new file mode 100644 index 000000000..cdcf7356a --- /dev/null +++ b/web/gui/relatorios/filtroRelatorioLinhasHorario.zul @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +