From db7effa143fb8b0336eb74f3904aae780afced47 Mon Sep 17 00:00:00 2001 From: "gleison.cruz" Date: Tue, 26 Mar 2024 10:10:05 -0300 Subject: [PATCH] fixes bug#AL-3765 --- pom.xml | 2 +- ...sHorarioSimpDataConsiderarTaxaPedagio.java | 660 +++++++++++ ...arioSimplificadoConsiderarTaxaPedagio.java | 741 ++++++++++++ ...impDataConsiderarTaxaPedagio_es.properties | 61 + ...DataConsiderarTaxaPedagio_pt_BR.properties | 61 + ...ificadoConsiderarTaxaPedagio_es.properties | 61 + ...cadoConsiderarTaxaPedagio_pt_BR.properties | 61 + ...orarioSimpDataConsiderarTaxaPedagio.jasper | Bin 0 -> 96765 bytes ...HorarioSimpDataConsiderarTaxaPedagio.jrxml | 1039 +++++++++++++++++ ...ioSimplificadoConsiderarTaxaPedagio.jasper | Bin 0 -> 96050 bytes ...rioSimplificadoConsiderarTaxaPedagio.jrxml | 1027 ++++++++++++++++ .../render/RenderRelatorioLinhaHorario.java | 6 + web/WEB-INF/i3-label_en.label | 3 + web/WEB-INF/i3-label_es_MX.label | 5 +- web/WEB-INF/i3-label_pt_BR.label | 6 +- .../filtroRelatorioLinhasHorario.zul | 32 +- 16 files changed, 3751 insertions(+), 14 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.java create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_es.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_es.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_pt_BR.properties create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.jrxml create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jasper create mode 100644 src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jrxml diff --git a/pom.xml b/pom.xml index 0147ec705..2a9ce9b16 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 br.com.rjconsultores ventaboletosadm - 1.60.1 + 1.61.0 war diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.java new file mode 100644 index 000000000..58653d49e --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.java @@ -0,0 +1,660 @@ +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.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.GrupoRuta; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioLinhasHorarioBean; +import com.rjconsultores.ventaboletos.service.ConstanteService; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; +import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +@SuppressWarnings({"unused", "unchecked"}) +public class RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio extends Relatorio { + + private static Logger log = LogManager.getLogger(RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.class); + private List lsDadosRelatorio; + private static String CONSTANTE_GRATUIDADE_CRIANCA; + + public RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio(Map parametros, Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new DataSource(this) { + @Override + public void initDados() throws Exception { + + CONSTANTE_GRATUIDADE_CRIANCA = buscarConstante("GRATUIDADE_CRIANCA"); + Connection conexao = this.relatorio.getConexao(); + Map parametros = this.relatorio.getParametros(); + + ArrayList lsNumLinha = (ArrayList) parametros.get("lsNumLinha"); + ArrayList lsNumServico = (ArrayList) parametros.get("lsNumServico"); + parametros.put("SERVICO_FILTRO", retornaFiltro(lsNumServico, null)); + parametros.put("LINHA_FILTRO", retornaFiltro(null, lsNumLinha)); + + Empresa empresa = (Empresa) parametros.get("EMPRESA"); + String corridaIds = "", rutaIds = ""; + GrupoRuta grupoRuta = (GrupoRuta) parametros.get("GRUPORUTA"); + Integer tipoServico = (Integer) parametros.get("TIPOSERVICIO_ID"); + if (lsNumServico != null && !lsNumServico.isEmpty()) { + corridaIds = retornaFiltro(lsNumServico, null); + } + if (lsNumLinha != null && !lsNumLinha.isEmpty()) { + rutaIds = retornaFiltro(null, lsNumLinha); + } + String sql = getSql(corridaIds, rutaIds, empresa, tipoServico, grupoRuta, (Boolean)parametros.get("ISSENTIDOIDA"), (Boolean)parametros.get("ISSENTIDOVOLTA")); + + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); + ResultSet rset = null; + stmt.setString("CRIANCA_ID",CONSTANTE_GRATUIDADE_CRIANCA); + + if (empresa != null) { + stmt.setInt("EMPRESA_ID", empresa.getEmpresaId()); + } + if (parametros.get("HORA_INICIAL") == null) { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + if (parametros.get("DATA_INICIO") != null) { + Date dataInicio = (Date) parametros.get("DATA_INICIO"); + stmt.setString("DATA_INICIO", sdf.format(dataInicio)); + } + + if (parametros.get("DATA_FINAL") != null) { + Date dataFinal = (Date) parametros.get("DATA_FINAL"); + stmt.setString("DATA_FINAL", sdf.format(dataFinal)); + } + }else { + setaParametroDataHora(parametros, stmt); + } + if (grupoRuta != null) { + stmt.setInt("GRUPORUTA_ID", grupoRuta.getGrupoRutaId()); + } + if (tipoServico > 0) { + stmt.setInt("TIPOSERVICIO_ID", tipoServico); + } + + rset = stmt.executeQuery(); + + lsDadosRelatorio = new ArrayList(); + + BigDecimal totalPassagens = BigDecimal.ZERO; + BigDecimal totalSeguro = BigDecimal.ZERO; + BigDecimal totalBagagens = BigDecimal.ZERO; + BigDecimal totalSeuroOpcional = BigDecimal.ZERO; + BigDecimal totalTotal = BigDecimal.ZERO; + BigDecimal totalOrdinario = BigDecimal.ZERO; + BigDecimal totalExtra = BigDecimal.ZERO; + BigDecimal totalViagem = BigDecimal.ZERO; + BigDecimal totalKmRodado = BigDecimal.ZERO; + BigDecimal totalAbsoluto = BigDecimal.ZERO; + BigDecimal totalEquivalente = BigDecimal.ZERO; + BigDecimal mediaMPA = BigDecimal.ZERO; + BigDecimal mediaMPE = BigDecimal.ZERO; + BigDecimal mediaRsPorKm = BigDecimal.ZERO; + BigDecimal totalEQ = BigDecimal.ZERO; + BigDecimal mediaRSPorViagem = BigDecimal.ZERO; + BigDecimal totalPaxKMOfertado = BigDecimal.ZERO; + BigDecimal totalPaxKMTransportado = BigDecimal.ZERO; + BigDecimal totalIAP = BigDecimal.ZERO; + + BigDecimal totalTxEmbarque = BigDecimal.ZERO; + BigDecimal totalPedagio = BigDecimal.ZERO; + + String group = null; + while (rset.next()) { + RelatorioLinhasHorarioBean horarioBean = new RelatorioLinhasHorarioBean(); + + group = ((String) rset.getObject("GRUPO_RUTA")); + horarioBean.setGrupoRuta(group); + horarioBean.setTipoLinha((String) rset.getObject("TIPO_LINHA")); + horarioBean.setHora((String) rset.getObject("HORA")); + horarioBean.setDataCorrida((String) rset.getObject("DATA_CORRIDA")); + + 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.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.setTxEmbarque((BigDecimal) rset.getObject("TX_EMBARQUE")); + horarioBean.setPedagio((BigDecimal) rset.getObject("PEDAGIO")); + + // Substituir a coluna Seg. Opcional por Tx. Embarque + horarioBean.setSegOpc(horarioBean.getTxEmbarque()); + + horarioBean.setOrd((BigDecimal) rset.getObject("ORD")); + horarioBean.setExtra((BigDecimal) rset.getObject("EXTRA")); + horarioBean.setAbsol((BigDecimal) rset.getObject("ABSOL")); + + horarioBean.setOrigem((String) rset.getObject("ORIGEM")); + horarioBean.setDestino((String) rset.getObject("DESTINO")); + horarioBean.setSomaExtensaoTrecho((BigDecimal) rset.getObject("EXTENSAO_TRECHO")); + horarioBean.setPaxKmTransportado((BigDecimal) rset.getObject("KM_REAL")); + horarioBean.setDescRuta((String) rset.getObject("DESCRUTA")); + 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 = calcIap(horarioBean); + + lsDadosRelatorio.add(horarioBean); + + totalPassagens = totalPassagens.add(horarioBean.getPassagens() != null ? horarioBean.getPassagens() : BigDecimal.ZERO); + totalSeguro = totalSeguro.add(horarioBean.getSeguro() != null ? horarioBean.getSeguro() : BigDecimal.ZERO); + totalBagagens = totalBagagens.add(horarioBean.getBagagens() != null ? horarioBean.getBagagens() : BigDecimal.ZERO); + totalSeuroOpcional = totalSeuroOpcional.add(horarioBean.getSegOpc() != null ? horarioBean.getSegOpc() : BigDecimal.ZERO); + totalTotal = totalTotal.add(horarioBean.getTotal() != null ? horarioBean.getTotal() : BigDecimal.ZERO); + totalOrdinario = totalOrdinario.add(horarioBean.getOrd() != null ? horarioBean.getOrd() : BigDecimal.ZERO); + totalExtra = totalExtra.add(horarioBean.getExtra() != null ? horarioBean.getExtra() : BigDecimal.ZERO); + totalViagem = totalViagem.add(horarioBean.getTotalViagem() != null ? horarioBean.getTotalViagem() : BigDecimal.ZERO); + totalKmRodado = totalKmRodado.add(horarioBean.getKmRodado() != null ? horarioBean.getKmRodado() : BigDecimal.ZERO); + totalAbsoluto = totalAbsoluto.add(horarioBean.getAbsol() != null ? horarioBean.getAbsol() : BigDecimal.ZERO); + totalEquivalente = totalEquivalente.add(horarioBean.getEquivalente() != null ? horarioBean.getEquivalente() : BigDecimal.ZERO); + + totalTxEmbarque = totalTxEmbarque.add(horarioBean.getTxEmbarque() != null ? horarioBean.getTxEmbarque() : BigDecimal.ZERO); + totalPedagio = totalPedagio.add(horarioBean.getPedagio() != null ? horarioBean.getPedagio() : BigDecimal.ZERO); + + mediaMPA = mediaMPA.add(horarioBean.getMpa() != null ? horarioBean.getMpa() : BigDecimal.ZERO); + mediaMPE = mediaMPE.add(horarioBean.getMpe() != null ? horarioBean.getMpe() : BigDecimal.ZERO); + + mediaRsPorKm = mediaRsPorKm.add(horarioBean.getRsKm() != null ? horarioBean.getRsKm() : BigDecimal.ZERO); + + totalEQ = totalEQ.add(horarioBean.getEq() != null ? horarioBean.getEq() : BigDecimal.ZERO); + + mediaRSPorViagem = mediaRSPorViagem.add(horarioBean.getRsViagem() != null ? horarioBean.getRsViagem() : BigDecimal.ZERO); + + totalPaxKMOfertado = totalPaxKMOfertado.add(horarioBean.getPaxKmOfertado() != null ? horarioBean.getPaxKmOfertado() : BigDecimal.ZERO); + totalPaxKMTransportado = totalPaxKMTransportado.add(horarioBean.getPaxKmTransportado() != null ? horarioBean.getPaxKmTransportado() : BigDecimal.ZERO); + + totalIAP = totalIAP.add(horarioBean.getIap()); + + } + + BigDecimal qtdeRegistros = new BigDecimal(lsDadosRelatorio.size()); + + if (lsDadosRelatorio.size() > 0) { + + setLsDadosRelatorio(lsDadosRelatorio); + parametros.put("TOTAL_PASSAGENS", totalPassagens); + parametros.put("TOTAL_SEGURO", totalSeguro); + parametros.put("TOTAL_BAGAGENS", totalBagagens); + parametros.put("TOTAL_SEURO_OPCIONAL", totalSeuroOpcional); + parametros.put("TOTAL_TOTAL", totalTotal); + parametros.put("TOTAL_ORDINARIO", totalOrdinario); + parametros.put("TOTAL_EXTRA", totalExtra); + parametros.put("TOTAL_VIAGEM", totalViagem); + parametros.put("TOTAL_KM_RODADO", totalKmRodado); + parametros.put("TOTAL_ABSOLUTO", totalAbsoluto); + parametros.put("TOTAL_EQUIVALENTE", totalEquivalente); + parametros.put("MEDIA_MPA", mediaMPA); + parametros.put("MEDIA_MPE", mediaMPE); + parametros.put("MEDIA_RS_POR_KM", mediaRsPorKm); + parametros.put("TOTAL_EQ", totalEQ); + parametros.put("TOTAL_TX_EMBARQUE", totalTxEmbarque); + parametros.put("TOTAL_PEDAGIO", totalPedagio); + parametros.put("MEDIA_RS_POR_VIAGEM", mediaRSPorViagem); + parametros.put("TOTAL_PAX_KM_OFERTADO", totalPaxKMOfertado); + parametros.put("TOTAL_PAX_KM_TRANSPORTADO", totalPaxKMTransportado); + parametros.put("TOTAL_IAP", totalIAP); + + } + } + + private String retornaFiltro(ArrayList lsNumServico, ArrayList lsNumLinha) { + String filtro = "TODOS"; + if (lsNumServico != null && !lsNumServico.isEmpty()) { + for (Corrida corrida : lsNumServico) { + if (lsNumServico.indexOf(corrida) == 0) { + filtro = "'" + corrida.getId().getCorridaId(); + } else { + filtro += "','" + corrida.getId().getCorridaId(); + } + } + return filtro.concat("'"); + } else if (lsNumLinha != null && !lsNumLinha.isEmpty()) { + for (Ruta ruta : lsNumLinha) { + if (lsNumLinha.indexOf(ruta) == 0) { + filtro = "'" + ruta.getRutaId(); + } else { + filtro += "','" + ruta.getRutaId(); + } + } + return filtro.concat("'"); + } else { + return filtro; + } + } + + }); + + } + + private void setaParametroDataHora(Map parametros, NamedParameterStatement stmt) throws SQLException { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + Calendar dataInicial = Calendar.getInstance(); + dataInicial.setTime((Date) parametros.get("DATA_INICIO")); + Calendar horaInicialCal = Calendar.getInstance(); + horaInicialCal.setTime((Date) parametros.get("HORA_INICIAL")); + mesclarDataHora(dataInicial, horaInicialCal); + stmt.setString("DATA_INICIO", sdf.format(dataInicial.getTime())); + if (parametros.get("HORA_FINAL") != null) { + Calendar dataFinal = Calendar.getInstance(); + dataFinal.setTime((Date) parametros.get("DATA_FINAL")); + Calendar horaFinalCal = Calendar.getInstance(); + horaFinalCal.setTime((Date) parametros.get("HORA_FINAL")); + mesclarDataHora(dataFinal, horaFinalCal); + stmt.setString("DATA_FINAL", sdf.format(dataFinal.getTime())); + }else { + Date dataFinal = (Date) parametros.get("DATA_FINAL"); + stmt.setString("DATA_FINAL", sdf.format(dataFinal)); + } + + } + + public List getLsDadosRelatorio() { + + return lsDadosRelatorio; + } + + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + this.lsDadosRelatorio = lsDadosRelatorio; + } + + private RelatorioLinhasHorarioBean trecho(RelatorioLinhasHorarioBean horarioBean) { + horarioBean.setTrecho(horarioBean.getOrigem() + " - " + horarioBean.getDestino()); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal total = horarioBean.getPassagens(); + total = total.add(horarioBean.getSeguro()); + total = total.add(horarioBean.getTxEmbarque()); + total = total.add(horarioBean.getPedagio()); + horarioBean.setTotal(total); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMediaReceitaTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mediaTotal = horarioBean.getPassagens(); + 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.getSomaExtensaoTrecho().divide(horarioBean.getExtensao(), 2, RoundingMode.HALF_UP); + } catch (ArithmeticException e) { + equivalente = BigDecimal.ZERO; + } catch (NullPointerException nex) { + equivalente = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setEquivalente(equivalente); + + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpa(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpa = new BigDecimal(0); + try { + mpa = horarioBean.getAbsol().divide(horarioBean.getTotalViagem(), 2, 4); + } catch (ArithmeticException e) { + mpa = BigDecimal.ZERO; + } catch (NullPointerException nex) { + mpa = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setMpa(mpa); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpe(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpe = horarioBean.getEquivalente().divide(horarioBean.getTotalViagem(), 2, 4); + horarioBean.setMpe(mpe); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsKm(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal rsKm = horarioBean.getTotal().divide(horarioBean.getKmRodado(), 2, 4); + horarioBean.setRsKm(rsKm); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcEq(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal eq = null; + try { + eq = horarioBean.getMediaReceitaViagem().divide(horarioBean.getTarifa(), 2, 4); + } catch (ArithmeticException e) { + eq = BigDecimal.ZERO; + } catch (NullPointerException nex) { + eq = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setEq(eq); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsViagem(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal RSViagem = horarioBean.getPassagens().divide(horarioBean.getTotalViagem(), 2, 4); + 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 calcIap(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal iap = null; + BigDecimal CENTO = BigDecimal.TEN.multiply(BigDecimal.TEN); + try { + iap = (horarioBean.getPaxKmTransportado().multiply(CENTO)).divide(horarioBean.getPaxKmOfertado(), 2, 4); + } catch (ArithmeticException e) { + iap = BigDecimal.ZERO; + } catch (NullPointerException nex) { + iap = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setIap(iap); + return horarioBean; + } + + private BigDecimal calcTotalIap(BigDecimal totalPaxKMTransportado, BigDecimal totalPaxKMOfertado) { + BigDecimal iap = null; + BigDecimal CENTO = BigDecimal.TEN.multiply(BigDecimal.TEN); + try { + iap = (totalPaxKMTransportado.multiply(CENTO)).divide(totalPaxKMOfertado, 2, 4); + } catch (ArithmeticException e) { + iap = BigDecimal.ZERO; + } catch (NullPointerException nex) { + iap = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + return iap; + } + + @Override + protected void processaParametros() throws Exception { + } + + private String getSql(String corridaIds, String rutaIds, Empresa empresa, Integer tipoServico, + GrupoRuta grupoRuta, Boolean isSentidoIda, Boolean isSentidoVolta) { + + StringBuilder sql = new StringBuilder(); + sql.append(" SELECT "); + sql.append(" GRUPO_RUTA, "); + sql.append(" HORA, "); + sql.append(" DATA_CORRIDA,"); + sql.append(" DESCRUTA, "); + sql.append(" SERVICO, "); + sql.append(" SENTIDO , "); + sql.append(" LOT, "); + sql.append(" CLA, "); + sql.append(" ORIGEM, "); + sql.append(" DESTINO, "); + sql.append(" EXTENSAO, "); + sql.append(" COALESCE(SUM(EQUIVALENTE * EXTENSAO) ,0) AS EXTENSAO_TRECHO, "); + sql.append(" COALESCE(BAGAGENS, 0) AS BAGAGENS, "); + sql.append(" COALESCE(SUM(SEGURO), 0) AS SEGURO, "); + sql.append(" COALESCE(SUM(TX_EMBARQUE), 0) AS TX_EMBARQUE, "); + sql.append(" COALESCE(SUM(PEDAGIO), 0) AS PEDAGIO, "); + sql.append(" COALESCE(SUM(PASSAGENS), 0) AS PASSAGENS, "); + sql.append(" ORD, "); + sql.append(" EXTRA, "); + sql.append(" TIPO_LINHA, "); + sql.append(" ABSOL, "); + sql.append(" COALESCE(SUM(KM_REAL), 0) AS KM_REAL "); + sql.append(" FROM "); + sql.append(" (SELECT "); + sql.append(" R.RUTA_ID, "); + sql.append(" R.DESCRUTA AS DESCRUTA, "); + sql.append(" NVL(GR.DESCGRUPO, 'Não Definido') AS GRUPO_RUTA, "); + sql.append(" TO_CHAR(C.FECHORSALIDA, 'HH24:MI') AS HORA, "); + sql.append(" TO_CHAR(C.feccorrida,'dd/mm/yyyy') AS DATA_CORRIDA, "); + sql.append(" C.CORRIDA_ID AS SERVICO, "); + sql.append(" R.INDSENTIDOIDA AS SENTIDO, "); + sql.append(" DA.CANTASIENTOS AS LOT, "); + sql.append(" NVL(CS.DESCCLASE, '') AS CLA, "); + sql.append(" MAX(NVL(TF.PRECIOORIGINAL, 0)) AS TARIFA, "); + sql.append(" ORIGEM.CVEPARADA AS ORIGEM, "); + sql.append(" DESTINO.CVEPARADA AS DESTINO, "); + sql.append(" EXTENSAO AS EXTENSAO, "); + sql.append(" CJ.EQUIVALENTE AS EQUIVALENTE, "); + sql.append(" SUM(EE.IMPINGRESO) AS BAGAGENS, "); + sql.append(" CJ.IMPORTESEGURO AS SEGURO, "); + sql.append(" CJ.IMPORTETAXAEMBARQUE AS TX_EMBARQUE, "); + sql.append(" CJ.IMPORTEPEDAGIO AS PEDAGIO, "); + sql.append(" CJ.PRECIOPAGADO AS PASSAGENS, "); + sql.append(" CJ.BOLETO_ID, "); + sql.append(" TB2.ORD, "); + sql.append(" TB2.EXTRA, "); + sql.append(" CASE WHEN CO.ESTADO_ID <> CD.ESTADO_ID THEN 'INTERESTADUAL' ELSE 'INTERMUNICIPAL' END TIPO_LINHA, "); + sql.append(" ABSOL, "); + sql.append(" CJ.KM_REAL AS KM_REAL "); + sql.append(" FROM CORRIDA C "); + sql.append(" INNER JOIN ("); + sql.append(" SELECT "); + sql.append(" C.CORRIDA_ID, "); + sql.append(" C.ruta_id as c_ruta_id, "); + sql.append(" Destino.Cveparada AS DESTINO, "); + sql.append(" ORIGEM.CVEPARADA AS ORIGEM, "); + sql.append(" C.ROLOPERATIVO_ID, "); + sql.append(" C.feccorrida, "); + sql.append(" TO_CHAR(C.FECHORSALIDA, 'HH24:MI') AS HORASALIDA, "); + sql.append(" COUNT(CASE WHEN C.TIPOSERVICIO_ID = 1 THEN 1 ELSE NULL END) AS ORD, "); + sql.append(" COUNT(CASE WHEN C.TIPOSERVICIO_ID = 2 THEN 1 ELSE NULL END) AS EXTRA "); + sql.append(" FROM CORRIDA C "); + sql.append(" INNER JOIN PARADA ORIGEM ON C.Origen_Id = ORIGEM.PARADA_ID "); + sql.append(" INNER JOIN PARADA DESTINO ON C.DESTINO_ID = DESTINO.PARADA_ID "); + + sql.append(empresa == null ? "" : " INNER JOIN MARCA M ON (C.MARCA_ID = M.MARCA_ID AND M.EMPRESA_ID= :EMPRESA_ID)"); + + sql.append(" WHERE "); + sql.append(" EXISTS (SELECT 1 FROM CAJA CA WHERE CA.CORRIDA_ID = C.CORRIDA_ID AND CA.FECCORRIDA = C.FECCORRIDA AND CA.MOTIVOCANCELACION_ID IS NULL) "); + sql.append(" AND C.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + + sql.append(" GROUP BY C.CORRIDA_ID, "); + sql.append(" C.ROLOPERATIVO_ID, "); + sql.append(" C.ruta_id, "); + sql.append(" Destino.Cveparada, "); + sql.append(" ORIGEM.CVEPARADA, "); + sql.append(" C.feccorrida, "); + sql.append(" TO_CHAR(C.FECHORSALIDA, 'HH24:MI') "); + sql.append(" ) TB2 ON ((TB2.CORRIDA_ID = C.CORRIDA_ID and tb2.c_ruta_id = c.ruta_id ) "); + sql.append(" AND TB2.ROLOPERATIVO_ID = C.ROLOPERATIVO_ID "); + sql.append(" AND TB2.feccorrida = c.feccorrida "); + sql.append(" AND TB2.HORASALIDA = TO_CHAR(C.FECHORSALIDA, 'HH24:MI')) "); + sql.append(rutaIds.isEmpty() ? "" : " and c.RUTA_ID IN (" + rutaIds + ") "); + sql.append(corridaIds.isEmpty() ? "" : " and c.CORRIDA_ID IN (" + corridaIds + ") "); + sql.append(" INNER JOIN ("); + sql.append(" SELECT "); + sql.append(" C.CORRIDA_ID, "); + sql.append(" c.ruta_id as c_ruta_id, "); + sql.append(" C.ROLOPERATIVO_ID, "); + sql.append(" C.DESTINO_ID, "); + sql.append(" C.ORIGEN_ID, "); + sql.append(" C.feccorrida, "); + sql.append(" TO_CHAR(C.FECHORSALIDA, 'HH24:MI') AS HORASALIDA, "); + sql.append(" COUNT(b.boleto_id) AS ABSOL "); + sql.append(" FROM CORRIDA C "); + + sql.append(empresa == null ? "" : " INNER JOIN MARCA M ON (C.MARCA_ID = M.MARCA_ID AND M.EMPRESA_ID= :EMPRESA_ID)"); + + sql.append(" LEFT JOIN BOLETO B ON (B.CORRIDA_ID = C.CORRIDA_ID AND B.FECCORRIDA = C.FECCORRIDA AND B.ACTIVO = 1 AND B.MOTIVOCANCELACION_ID IS NULL "); + sql.append(" AND B.CATEGORIA_ID <> :CRIANCA_ID ) "); + sql.append(" WHERE C.ACTIVO NOT IN (0,2) "); + sql.append(" AND C.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + + sql.append(corridaIds.isEmpty() ? "" : " AND B.CORRIDA_ID IN ("+corridaIds+") "); + + sql.append(" GROUP BY C.CORRIDA_ID, C.ruta_id, C.ROLOPERATIVO_ID, C.DESTINO_ID, C.feccorrida, C.ORIGEN_ID, TO_CHAR(C.FECHORSALIDA, 'HH24:MI') "); + sql.append(" ) TB4 ON ((TB4.CORRIDA_ID = C.CORRIDA_ID and tb4.c_ruta_id = c.ruta_id) "); + sql.append(" AND c.DESTINO_ID = TB4.DESTINO_ID "); + sql.append(" AND c.ORIGEN_ID = TB4.ORIGEN_ID "); + sql.append(" AND TB4.ROLOPERATIVO_ID = C.ROLOPERATIVO_ID "); + sql.append(" AND TB4.feccorrida = c.feccorrida "); + sql.append(" AND TB4.HORASALIDA = TO_CHAR(C.FECHORSALIDA, 'HH24:MI')) "); + + sql.append("LEFT JOIN "); + sql.append(" (SELECT CO.FECCORRIDA, "); + sql.append(" CO.CORRIDA_ID, "); + sql.append(" CO.ROLOPERATIVO_ID, "); + sql.append(" CO.RUTA_ID, "); + sql.append(" CO.EMPRESACORRIDA_ID, "); + sql.append(" BO.BOLETO_ID, "); + sql.append(" BO.NUMKMVIAJE * COUNT(1) AS KM_REAL, "); + sql.append(" CASE "); + sql.append(" WHEN T.CANTKMREAL<>0 AND BO.NUMKMVIAJE<>0 "); + sql.append(" THEN ROUND(BO.NUMKMVIAJE * COUNT(1) / T.CANTKMREAL, 3) "); + sql.append(" ELSE 0 "); + sql.append(" END AS EQUIVALENTE, "); + sql.append(" NVL(BO.IMPORTESEGURO, 0) AS IMPORTESEGURO, "); + sql.append(" NVL(BO.IMPORTETAXAEMBARQUE, 0) AS IMPORTETAXAEMBARQUE, "); + sql.append(" NVL(BO.IMPORTEPEDAGIO, 0) AS IMPORTEPEDAGIO, "); + sql.append(" NVL(BO.PRECIOPAGADO, 0) AS PRECIOPAGADO "); + sql.append(" FROM CORRIDA CO "); + sql.append(empresa == null ? "" : " INNER JOIN MARCA M ON (CO.MARCA_ID = M.MARCA_ID AND M.EMPRESA_ID= :EMPRESA_ID)"); + sql.append(" INNER JOIN BOLETO BO ON CO.CORRIDA_ID = BO.CORRIDA_ID AND CO.FECCORRIDA = BO.FECCORRIDA AND BO.ACTIVO = 1 "); + sql.append(" INNER JOIN RUTA_COMBINACION RC ON RC.RUTA_ID = CO.RUTA_ID "); + sql.append(" INNER JOIN TRAMO T ON RC.TRAMO_ID = T.TRAMO_ID AND T.ORIGEN_ID = BO.ORIGEN_ID AND T.DESTINO_ID = BO.DESTINO_ID "); + sql.append(" WHERE CO.ACTIVO NOT IN (0,2) "); + sql.append(" AND RC.ACTIVO = 1"); + sql.append(" AND T.ACTIVO = 1"); + sql.append(" AND BO.INDSTATUSBOLETO != 'S' AND BO.MOTIVOCANCELACION_ID IS NULL "); + sql.append(" AND BO.CATEGORIA_ID <> :CRIANCA_ID"); + sql.append(" AND BO.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + + sql.append(corridaIds.isEmpty() ? "" : " AND BO.CORRIDA_ID IN ("+corridaIds+") "); + + sql.append(" GROUP BY CO.FECCORRIDA, CO.CORRIDA_ID, CO.ROLOPERATIVO_ID, CO.RUTA_ID, CO.EMPRESACORRIDA_ID, BO.NUMKMVIAJE, BO.BOLETO_ID, T.CANTKMREAL, "); + sql.append(" NVL(BO.IMPORTESEGURO, 0), NVL(BO.IMPORTETAXAEMBARQUE, 0), NVL(BO.IMPORTEPEDAGIO, 0), NVL(BO.PRECIOPAGADO, 0) "); + sql.append(" ) CJ ON (CJ.CORRIDA_ID = C.CORRIDA_ID AND CJ.FECCORRIDA = C.FECCORRIDA AND CJ.ROLOPERATIVO_ID = C.ROLOPERATIVO_ID "); + sql.append(" AND CJ.RUTA_ID = C.RUTA_ID AND CJ.EMPRESACORRIDA_ID = C.EMPRESACORRIDA_ID) "); + sql.append("INNER JOIN PARADA ORIGEM ON (C.ORIGEN_ID = ORIGEM.PARADA_ID ) "); + sql.append("INNER JOIN PARADA DESTINO ON ( C.DESTINO_ID = DESTINO.PARADA_ID ) "); + sql.append("INNER JOIN CIUDAD CO ON (CO.CIUDAD_ID = ORIGEM.CIUDAD_ID ) "); + sql.append("INNER JOIN CIUDAD CD ON (CD.CIUDAD_ID = DESTINO.CIUDAD_ID ) "); + sql.append("INNER JOIN RUTA R ON (C.RUTA_ID = R.RUTA_ID ) "); + sql.append("LEFT JOIN GRUPO_RUTA GR ON (R.GRUPORUTA_ID = GR.GRUPORUTA_ID ) "); + sql.append("LEFT JOIN ROL_OPERATIVO RO ON (C.ROLOPERATIVO_ID = RO.ROLOPERATIVO_ID ) "); + sql.append("LEFT JOIN DIAGRAMA_AUTOBUS DA ON (DA.DIAGRAMAAUTOBUS_ID = RO.DIAGRAMAAUTOBUS_ID ) "); + sql.append("LEFT JOIN CLASE_SERVICIO CS ON (CS.CLASESERVICIO_ID = C.CLASESERVICIO_ID ) "); + sql.append("LEFT JOIN EVENTO_EXTRA EE ON (EE.CORRIDA_ID = C.CORRIDA_ID AND EE.FECCORRIDA = C.FECCORRIDA AND EE.TIPOEVENTOEXTRA_ID = 1 ) "); + sql.append("LEFT JOIN TARIFA TF ON (TF.CLASESERVICIO_ID = C.CLASESERVICIO_ID AND TF.DESTINO_ID = C.DESTINO_ID AND TF.ORIGEN_ID = C.ORIGEN_ID AND TF.MARCA_ID = C.MARCA_ID AND TF.RUTA_ID = C.RUTA_ID AND R.ORGAOCONCEDENTE_ID= TF.ORGAOCONCEDENTE_ID) "); + sql.append("LEFT JOIN VIGENCIA_TARIFA VTF ON (TF.VIGENCIATARIFA_ID = VTF.VIGENCIATARIFA_ID ) "); + sql.append("INNER JOIN "); + sql.append("( "); + sql.append("SELECT RC.RUTA_ID, T.ORIGEN_ID, T.DESTINO_ID, NVL(T.CANTKMREAL,0) AS EXTENSAO "); + sql.append("FROM RUTA_COMBINACION RC "); + sql.append("INNER JOIN TRAMO T ON RC.TRAMO_ID = T.TRAMO_ID "); + sql.append("WHERE RC.ACTIVO = 1 "); + sql.append(") TB5 ON (TB5.RUTA_ID = C.RUTA_ID "); + sql.append("AND TB5.ORIGEN_ID = ORIGEM.PARADA_ID "); + sql.append("AND TB5.DESTINO_ID = DESTINO.PARADA_ID) "); + sql.append(" WHERE C.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" AND (TF.TARIFA_ID IS NULL OR (TF.TARIFA_ID IS NOT NULL AND C.FECCORRIDA BETWEEN VTF.FECINICIOVIGENCIA AND VTF.FECFINVIGENCIA )) "); + sql.append(" "); + + sql.append(corridaIds.isEmpty() ? "" : " AND C.CORRIDA_ID IN ("+corridaIds+") "); + sql.append(grupoRuta == null ? "" : " AND R.GRUPORUTA_ID IN (:GRUPORUTA_ID) "); + sql.append(rutaIds.isEmpty() ? "" : " AND R.RUTA_ID IN ("+rutaIds+") "); + sql.append(tipoServico == 0 ? "" : " AND C.TIPOSERVICIO_ID = :TIPOSERVICIO_ID" ); + + if(Boolean.TRUE.equals(isSentidoIda)) { + sql.append(" AND R.INDSENTIDOIDA =1 "); + } + + if(Boolean.TRUE.equals(isSentidoVolta)) { + sql.append(" AND R.INDSENTIDOIDA = 0 "); + } + + sql.append(" AND C.ACTIVO <> 0 AND ORIGEM.ACTIVO = 1 AND DESTINO.ACTIVO = 1 AND TB2.ORIGEM = ORIGEM.CVEPARADA AND TB2.DESTINO = DESTINO.CVEPARADA "); + sql.append("AND R.ACTIVO = 1 AND RO.ACTIVO = 1 AND DA.ACTIVO = 1 AND CS.ACTIVO = 1 AND (cj.boleto_id is not null ) "); + sql.append("GROUP BY R.RUTA_ID, R.DESCRUTA, NVL(GR.DESCGRUPO, 'Não Definido'), TO_CHAR(C.FECHORSALIDA, 'HH24:MI'),"); + sql.append(" TO_CHAR(C.feccorrida ,'dd/mm/yyyy'), "); + sql.append(" C.CORRIDA_ID, R.INDSENTIDOIDA, "); + sql.append(" DA.CANTASIENTOS, CS.DESCCLASE, TB5.EXTENSAO, TB2.ORD, TB2.EXTRA, ABSOL, "); + sql.append(" CO.ESTADO_ID, CD.ESTADO_ID, ORIGEM.CVEPARADA, DESTINO.CVEPARADA, CJ.PRECIOPAGADO, "); + sql.append(" CJ.IMPORTESEGURO, CJ.IMPORTETAXAEMBARQUE, CJ.IMPORTEPEDAGIO, "); + sql.append(" CJ.EQUIVALENTE, CJ.KM_REAL , CJ.BOLETO_ID ) "); + sql.append("GROUP BY GRUPO_RUTA, HORA, "); + sql.append(" DATA_CORRIDA, "); + sql.append(" DESCRUTA, SERVICO, SENTIDO, LOT, CLA, ORIGEM, DESTINO, "); + sql.append(" EXTENSAO, BAGAGENS, ORD, EXTRA, TIPO_LINHA, ABSOL "); + sql.append("ORDER BY TIPO_LINHA, GRUPO_RUTA, DESCRUTA, SERVICO, ORIGEM, DESTINO "); + return sql.toString(); + } + + + private String buscarConstante(String nomeConstante) { + ConstanteService constanteService = (ConstanteService) AppContext.getApplicationContext().getBean("constanteService"); + return constanteService.buscarPorNomeConstante(nomeConstante).getValorconstante(); + } + + protected void mesclarDataHora(Calendar pData, Calendar pHora) { + pData.set(Calendar.HOUR_OF_DAY, pHora.get(Calendar.HOUR_OF_DAY)); + pData.set(Calendar.MINUTE, pHora.get(Calendar.MINUTE)); + pData.set(Calendar.SECOND, pHora.get(Calendar.SECOND)); + + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.java b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.java new file mode 100644 index 000000000..377f305e7 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/impl/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.java @@ -0,0 +1,741 @@ +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.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.GrupoRuta; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio; +import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioLinhasHorarioBean; +import com.rjconsultores.ventaboletos.service.ConstanteService; +import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement; +import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext; + +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; + +@SuppressWarnings({"unused", "unchecked"}) +public class RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio extends Relatorio { + + private static Logger log = LogManager.getLogger(RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.class); + private List lsDadosRelatorio; + private static String CONSTANTE_GRATUIDADE_CRIANCA; + + public RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio(Map parametros, Connection conexao) throws Exception { + super(parametros, conexao); + + this.setCustomDataSource(new DataSource(this) { + @Override + public void initDados() throws Exception { + + CONSTANTE_GRATUIDADE_CRIANCA = buscarConstante("GRATUIDADE_CRIANCA"); + Connection conexao = this.relatorio.getConexao(); + Map parametros = this.relatorio.getParametros(); + + ArrayList lsNumLinha = (ArrayList) parametros.get("lsNumLinha"); + ArrayList lsNumServico = (ArrayList) parametros.get("lsNumServico"); + parametros.put("SERVICO_FILTRO", retornaFiltro(lsNumServico, null)); + parametros.put("LINHA_FILTRO", retornaFiltro(null, lsNumLinha)); + + Empresa empresa = (Empresa) parametros.get("EMPRESA"); + String corridaIds = "", rutaIds = ""; + GrupoRuta grupoRuta = (GrupoRuta) parametros.get("GRUPORUTA"); + Integer tipoServico = (Integer) parametros.get("TIPOSERVICIO_ID"); + if (lsNumServico != null && !lsNumServico.isEmpty()) { + corridaIds = retornaFiltro(lsNumServico, null); + } + if (lsNumLinha != null && !lsNumLinha.isEmpty()) { + rutaIds = retornaFiltro(null, lsNumLinha); + } + String sql = getSql(corridaIds, rutaIds, empresa, tipoServico, grupoRuta, (Boolean)parametros.get("ISSENTIDOIDA"), (Boolean)parametros.get("ISSENTIDOVOLTA")); + + NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql); + ResultSet rset = null; + stmt.setString("CRIANCA_ID",CONSTANTE_GRATUIDADE_CRIANCA); + + if (empresa != null) { + stmt.setInt("EMPRESA_ID", empresa.getEmpresaId()); + } + if (parametros.get("HORA_INICIAL") == null) { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + if (parametros.get("DATA_INICIO") != null) { + Date dataInicio = (Date) parametros.get("DATA_INICIO"); + stmt.setString("DATA_INICIO", sdf.format(dataInicio)); + } + + if (parametros.get("DATA_FINAL") != null) { + Date dataFinal = (Date) parametros.get("DATA_FINAL"); + stmt.setString("DATA_FINAL", sdf.format(dataFinal)); + } + }else { + setaParametroDataHora(parametros, stmt); + } + if (grupoRuta != null) { + stmt.setInt("GRUPORUTA_ID", grupoRuta.getGrupoRutaId()); + } + if (tipoServico > 0) { + stmt.setInt("TIPOSERVICIO_ID", tipoServico); + } + + rset = stmt.executeQuery(); + + lsDadosRelatorio = new ArrayList(); + + BigDecimal totalPassagens = BigDecimal.ZERO; + BigDecimal totalSeguro = BigDecimal.ZERO; + BigDecimal totalBagagens = BigDecimal.ZERO; + BigDecimal totalSeuroOpcional = BigDecimal.ZERO; + BigDecimal totalTotal = BigDecimal.ZERO; + BigDecimal totalOrdinario = BigDecimal.ZERO; + BigDecimal totalExtra = BigDecimal.ZERO; + BigDecimal totalViagem = BigDecimal.ZERO; + BigDecimal totalKmRodado = BigDecimal.ZERO; + BigDecimal totalAbsoluto = BigDecimal.ZERO; + BigDecimal totalEquivalente = BigDecimal.ZERO; + BigDecimal mediaMPA = BigDecimal.ZERO; + BigDecimal mediaMPE = BigDecimal.ZERO; + BigDecimal mediaRsPorKm = BigDecimal.ZERO; + BigDecimal totalEQ = BigDecimal.ZERO; + BigDecimal mediaRSPorViagem = BigDecimal.ZERO; + BigDecimal totalPaxKMOfertado = BigDecimal.ZERO; + BigDecimal totalPaxKMTransportado = BigDecimal.ZERO; + BigDecimal totalIAP = BigDecimal.ZERO; + + BigDecimal totalTxEmbarque = BigDecimal.ZERO; + BigDecimal totalPedagio = BigDecimal.ZERO; + + String group = null; + while (rset.next()) { + RelatorioLinhasHorarioBean horarioBean = new RelatorioLinhasHorarioBean(); + + group = ((String) rset.getObject("GRUPO_RUTA")); + horarioBean.setGrupoRuta(group); + horarioBean.setTipoLinha((String) rset.getObject("TIPO_LINHA")); + 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.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.setTxEmbarque((BigDecimal) rset.getObject("TX_EMBARQUE")); + horarioBean.setPedagio((BigDecimal) rset.getObject("PEDAGIO")); + + // Substituir a coluna Seg. Opcional por Tx. Embarque + horarioBean.setSegOpc(horarioBean.getTxEmbarque()); + + horarioBean.setOrd((BigDecimal) rset.getObject("ORD")); + horarioBean.setExtra((BigDecimal) rset.getObject("EXTRA")); + horarioBean.setAbsol((BigDecimal) rset.getObject("ABSOL")); + + horarioBean.setOrigem((String) rset.getObject("ORIGEM")); + horarioBean.setDestino((String) rset.getObject("DESTINO")); + horarioBean.setSomaExtensaoTrecho((BigDecimal) rset.getObject("EXTENSAO_TRECHO")); + horarioBean.setPaxKmTransportado((BigDecimal) rset.getObject("KM_REAL")); + horarioBean.setDescRuta((String) rset.getObject("DESCRUTA")); + 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 = calcIap(horarioBean); + + lsDadosRelatorio.add(horarioBean); + + totalPassagens = totalPassagens.add(horarioBean.getPassagens() != null ? horarioBean.getPassagens() : BigDecimal.ZERO); + totalSeguro = totalSeguro.add(horarioBean.getSeguro() != null ? horarioBean.getSeguro() : BigDecimal.ZERO); + totalBagagens = totalBagagens.add(horarioBean.getBagagens() != null ? horarioBean.getBagagens() : BigDecimal.ZERO); + totalSeuroOpcional = totalSeuroOpcional.add(horarioBean.getSegOpc() != null ? horarioBean.getSegOpc() : BigDecimal.ZERO); + totalTotal = totalTotal.add(horarioBean.getTotal() != null ? horarioBean.getTotal() : BigDecimal.ZERO); + totalOrdinario = totalOrdinario.add(horarioBean.getOrd() != null ? horarioBean.getOrd() : BigDecimal.ZERO); + totalExtra = totalExtra.add(horarioBean.getExtra() != null ? horarioBean.getExtra() : BigDecimal.ZERO); + totalViagem = totalViagem.add(horarioBean.getTotalViagem() != null ? horarioBean.getTotalViagem() : BigDecimal.ZERO); + totalKmRodado = totalKmRodado.add(horarioBean.getKmRodado() != null ? horarioBean.getKmRodado() : BigDecimal.ZERO); + totalAbsoluto = totalAbsoluto.add(horarioBean.getAbsol() != null ? horarioBean.getAbsol() : BigDecimal.ZERO); + totalEquivalente = totalEquivalente.add(horarioBean.getEquivalente() != null ? horarioBean.getEquivalente() : BigDecimal.ZERO); + + totalTxEmbarque = totalTxEmbarque.add(horarioBean.getTxEmbarque() != null ? horarioBean.getTxEmbarque() : BigDecimal.ZERO); + totalPedagio = totalPedagio.add(horarioBean.getPedagio() != null ? horarioBean.getPedagio() : BigDecimal.ZERO); + + mediaMPA = mediaMPA.add(horarioBean.getMpa() != null ? horarioBean.getMpa() : BigDecimal.ZERO); + mediaMPE = mediaMPE.add(horarioBean.getMpe() != null ? horarioBean.getMpe() : BigDecimal.ZERO); + + mediaRsPorKm = mediaRsPorKm.add(horarioBean.getRsKm() != null ? horarioBean.getRsKm() : BigDecimal.ZERO); + + totalEQ = totalEQ.add(horarioBean.getEq() != null ? horarioBean.getEq() : BigDecimal.ZERO); + + mediaRSPorViagem = mediaRSPorViagem.add(horarioBean.getRsViagem() != null ? horarioBean.getRsViagem() : BigDecimal.ZERO); + + totalPaxKMOfertado = totalPaxKMOfertado.add(horarioBean.getPaxKmOfertado() != null ? horarioBean.getPaxKmOfertado() : BigDecimal.ZERO); + totalPaxKMTransportado = totalPaxKMTransportado.add(horarioBean.getPaxKmTransportado() != null ? horarioBean.getPaxKmTransportado() : BigDecimal.ZERO); + + totalIAP = totalIAP.add(horarioBean.getIap()); + + } + + BigDecimal qtdeRegistros = new BigDecimal(lsDadosRelatorio.size()); + + if (lsDadosRelatorio.size() > 0) { + + setLsDadosRelatorio(lsDadosRelatorio); + parametros.put("TOTAL_PASSAGENS", totalPassagens); + parametros.put("TOTAL_SEGURO", totalSeguro); + parametros.put("TOTAL_BAGAGENS", totalBagagens); + parametros.put("TOTAL_SEURO_OPCIONAL", totalSeuroOpcional); + parametros.put("TOTAL_TOTAL", totalTotal); + parametros.put("TOTAL_ORDINARIO", totalOrdinario); + parametros.put("TOTAL_EXTRA", totalExtra); + parametros.put("TOTAL_VIAGEM", totalViagem); + parametros.put("TOTAL_KM_RODADO", totalKmRodado); + parametros.put("TOTAL_ABSOLUTO", totalAbsoluto); + parametros.put("TOTAL_EQUIVALENTE", totalEquivalente); + parametros.put("MEDIA_MPA", mediaMPA); + parametros.put("MEDIA_MPE", mediaMPE); + parametros.put("MEDIA_RS_POR_KM", mediaRsPorKm); + parametros.put("TOTAL_EQ", totalEQ); + parametros.put("TOTAL_TX_EMBARQUE", totalTxEmbarque); + parametros.put("TOTAL_PEDAGIO", totalPedagio); + parametros.put("MEDIA_RS_POR_VIAGEM", mediaRSPorViagem); + parametros.put("TOTAL_PAX_KM_OFERTADO", totalPaxKMOfertado); + parametros.put("TOTAL_PAX_KM_TRANSPORTADO", totalPaxKMTransportado); + parametros.put("TOTAL_IAP", totalIAP); + + } + } + + private String retornaFiltro(ArrayList lsNumServico, ArrayList lsNumLinha) { + String filtro = "TODOS"; + if (lsNumServico != null && !lsNumServico.isEmpty()) { + for (Corrida corrida : lsNumServico) { + if (lsNumServico.indexOf(corrida) == 0) { + filtro = "'" + corrida.getId().getCorridaId(); + } else { + filtro += "','" + corrida.getId().getCorridaId(); + } + } + return filtro.concat("'"); + } else if (lsNumLinha != null && !lsNumLinha.isEmpty()) { + for (Ruta ruta : lsNumLinha) { + if (lsNumLinha.indexOf(ruta) == 0) { + filtro = "'" + ruta.getRutaId(); + } else { + filtro += "','" + ruta.getRutaId(); + } + } + return filtro.concat("'"); + } else { + return filtro; + } + } + + }); + + } + + private void setaParametroDataHora(Map parametros, NamedParameterStatement stmt) throws SQLException { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + Calendar dataInicial = Calendar.getInstance(); + dataInicial.setTime((Date) parametros.get("DATA_INICIO")); + Calendar horaInicialCal = Calendar.getInstance(); + horaInicialCal.setTime((Date) parametros.get("HORA_INICIAL")); + mesclarDataHora(dataInicial, horaInicialCal); + stmt.setString("DATA_INICIO", sdf.format(dataInicial.getTime())); + if (parametros.get("HORA_FINAL") != null) { + Calendar dataFinal = Calendar.getInstance(); + dataFinal.setTime((Date) parametros.get("DATA_FINAL")); + Calendar horaFinalCal = Calendar.getInstance(); + horaFinalCal.setTime((Date) parametros.get("HORA_FINAL")); + mesclarDataHora(dataFinal, horaFinalCal); + stmt.setString("DATA_FINAL", sdf.format(dataFinal.getTime())); + }else { + Date dataFinal = (Date) parametros.get("DATA_FINAL"); + stmt.setString("DATA_FINAL", sdf.format(dataFinal)); + } + + } + + public List getLsDadosRelatorio() { + + return lsDadosRelatorio; + } + + public void setLsDadosRelatorio(List lsDadosRelatorio) { + this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio)); + this.lsDadosRelatorio = lsDadosRelatorio; + } + + private RelatorioLinhasHorarioBean trecho(RelatorioLinhasHorarioBean horarioBean) { + horarioBean.setTrecho(horarioBean.getOrigem() + " - " + horarioBean.getDestino()); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal total = horarioBean.getPassagens(); + total = total.add(horarioBean.getSeguro()); + total = total.add(horarioBean.getTxEmbarque()); + total = total.add(horarioBean.getPedagio()); + horarioBean.setTotal(total); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMediaReceitaTotal(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mediaTotal = horarioBean.getPassagens(); + 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.getSomaExtensaoTrecho().divide(horarioBean.getExtensao(), 2, RoundingMode.HALF_UP); + } catch (ArithmeticException e) { + equivalente = BigDecimal.ZERO; + } catch (NullPointerException nex) { + equivalente = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setEquivalente(equivalente); + + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpa(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpa = new BigDecimal(0); + try { + mpa = horarioBean.getAbsol().divide(horarioBean.getTotalViagem(), 2, 4); + } catch (ArithmeticException e) { + mpa = BigDecimal.ZERO; + } catch (NullPointerException nex) { + mpa = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setMpa(mpa); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcMpe(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal mpe = horarioBean.getEquivalente().divide(horarioBean.getTotalViagem(), 2, 4); + horarioBean.setMpe(mpe); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsKm(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal rsKm = horarioBean.getTotal().divide(horarioBean.getKmRodado(), 2, 4); + horarioBean.setRsKm(rsKm); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcEq(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal eq = null; + try { + eq = horarioBean.getMediaReceitaViagem().divide(horarioBean.getTarifa(), 2, 4); + } catch (ArithmeticException e) { + eq = BigDecimal.ZERO; + } catch (NullPointerException nex) { + eq = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setEq(eq); + return horarioBean; + } + + private RelatorioLinhasHorarioBean calcRsViagem(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal RSViagem = horarioBean.getPassagens().divide(horarioBean.getTotalViagem(), 2, 4); + 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 calcIap(RelatorioLinhasHorarioBean horarioBean) { + BigDecimal iap = null; + BigDecimal CENTO = BigDecimal.TEN.multiply(BigDecimal.TEN); + try { + iap = (horarioBean.getPaxKmTransportado().multiply(CENTO)).divide(horarioBean.getPaxKmOfertado(), 2, 4); + } catch (ArithmeticException e) { + iap = BigDecimal.ZERO; + } catch (NullPointerException nex) { + iap = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + horarioBean.setIap(iap); + return horarioBean; + } + + private BigDecimal calcTotalIap(BigDecimal totalPaxKMTransportado, BigDecimal totalPaxKMOfertado) { + BigDecimal iap = null; + BigDecimal CENTO = BigDecimal.TEN.multiply(BigDecimal.TEN); + try { + iap = (totalPaxKMTransportado.multiply(CENTO)).divide(totalPaxKMOfertado, 2, 4); + } catch (ArithmeticException e) { + iap = BigDecimal.ZERO; + } catch (NullPointerException nex) { + iap = BigDecimal.ZERO; + } catch (Exception ex) { + log.error("", ex); + } + return iap; + } + + @Override + protected void processaParametros() throws Exception { + } + + private String getSql(String corridaIds, String rutaIds, Empresa empresa, Integer tipoServico, + GrupoRuta grupoRuta, Boolean isSentidoIda, Boolean isSentidoVolta) { + + StringBuilder sql = new StringBuilder(); + sql.append("with tb2 as ( "); + sql.append(" select /*+ materialize */ "); + sql.append(" c.corrida_id, "); + sql.append(" c.ruta_id as c_ruta_id, "); + sql.append(" destino.cveparada as destino, "); + sql.append(" origem.cveparada as origem, "); + sql.append(" c.roloperativo_id, "); + sql.append(" to_char(c.fechorsalida, 'HH24:MI') as horasalida, "); + sql.append(" count(case when c.tiposervicio_id = 1 then 1 else null end) as ord, "); + sql.append(" count(case when c.tiposervicio_id = 2 then 1 else null end) as extra "); + sql.append(" from corrida c "); + sql.append(" inner join parada origem on c.origen_id = origem.parada_id "); + sql.append(" inner join parada destino on c.destino_id = destino.parada_id "); + sql.append(empresa == null ? "" : "inner join marca m on (c.marca_id = m.marca_id and m.empresa_id = :EMPRESA_ID) "); + sql.append(" where "); + sql.append(" exists (select 1 from caja ca where ca.corrida_id = c.corrida_id "); + sql.append(" and ca.feccorrida = c.feccorrida "); + sql.append(" and ca.motivocancelacion_id is null) "); + sql.append(" and c.feccorrida between to_date(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" and to_date(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(tipoServico == 0 ? "" : " and c.TIPOSERVICIO_ID = :TIPOSERVICIO_ID "); + sql.append(rutaIds.isEmpty() ? "" : " and c.RUTA_ID IN (" + rutaIds + ") "); + sql.append(corridaIds.isEmpty() ? "" : " and c.CORRIDA_ID IN (" + corridaIds + ") "); + sql.append(" group by "); + sql.append(" c.corrida_id, "); + sql.append(" c.roloperativo_id, "); + sql.append(" c.ruta_id, "); + sql.append(" destino.cveparada, "); + sql.append(" origem.cveparada, "); + sql.append(" to_char(c.fechorsalida, 'HH24:MI') "); + sql.append(" ), "); + sql.append("tb4 as ( "); + sql.append(" select /*+ materialize */ "); + sql.append(" c.corrida_id, "); + sql.append(" c.ruta_id as c_ruta_id, "); + sql.append(" c.roloperativo_id, "); + sql.append(" c.destino_id, "); + sql.append(" c.origen_id, "); + sql.append(" to_char(c.fechorsalida, 'HH24:MI') as horasalida, "); + sql.append(" count(b.boleto_id) as absol "); + sql.append(" from corrida c "); + sql.append(empresa == null ? "" : " inner join marca m on ( c.marca_id = m.marca_id and m.empresa_id = :EMPRESA_ID)"); + sql.append(" left join boleto b on ( b.corrida_id = c.corrida_id "); + sql.append(" and b.feccorrida = c.feccorrida "); + sql.append(" and b.activo = 1 "); + sql.append(" and b.motivocancelacion_id is null "); + sql.append(" and b.categoria_id <> :CRIANCA_ID ) "); + sql.append(" where "); + sql.append(" c.activo not in ( 0, 2 ) "); + sql.append(" and c.feccorrida between to_date(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" and to_date(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(corridaIds.isEmpty() ? "" : " AND b.CORRIDA_ID IN (" + corridaIds + ") "); + sql.append(" group by "); + sql.append(" c.corrida_id, "); + sql.append(" c.ruta_id, "); + sql.append(" c.roloperativo_id, "); + sql.append(" c.destino_id, "); + sql.append(" c.origen_id, "); + sql.append(" to_char(c.fechorsalida, 'HH24:MI') "); + sql.append(" ), "); + sql.append(" cj as ( "); + sql.append(" select /*+ materialize */ "); + sql.append(" co.feccorrida, "); + sql.append(" co.corrida_id, "); + sql.append(" co.roloperativo_id, "); + sql.append(" co.ruta_id, "); + sql.append(" co.empresacorrida_id, "); + sql.append(" bo.boleto_id, "); + sql.append(" bo.numkmviaje * count(1) as km_real, "); + sql.append(" case when t.cantkmreal <> 0 and bo.numkmviaje <> 0 then "); + sql.append(" round(bo.numkmviaje * count(1) / t.cantkmreal, 3) "); + sql.append(" else 0 end as equivalente, "); + sql.append(" nvl(bo.importeseguro, 0) as importeseguro, "); + sql.append(" nvl(bo.importetaxaembarque, 0) as importetaxaembarque, "); + sql.append(" nvl(bo.importepedagio, 0) as importepedagio, "); + sql.append(" nvl(bo.preciopagado, 0) as preciopagado "); + sql.append(" from corrida co "); + sql.append(empresa == null ? "" : " inner join marca m on (co.marca_id = m.marca_id and m.empresa_id = :EMPRESA_ID) "); + sql.append(" inner join boleto bo on co.corrida_id = bo.corrida_id "); + sql.append(" and co.feccorrida = bo.feccorrida "); + sql.append(" and bo.activo = 1 "); + sql.append(" inner join ruta_combinacion rc on rc.ruta_id = co.ruta_id "); + sql.append(" inner join tramo t on rc.tramo_id = t.tramo_id "); + sql.append(" and t.origen_id = bo.origen_id "); + sql.append(" and t.destino_id = bo.destino_id "); + sql.append(" where "); + sql.append(" co.activo not in ( 0, 2 ) "); + sql.append(corridaIds.isEmpty() ? "" : " AND bo.CORRIDA_ID IN (" + corridaIds + ") "); + sql.append(" and rc.activo = 1 "); + sql.append(" and t.activo = 1 "); + sql.append(" and bo.indstatusboleto != 'S' "); + sql.append(" and bo.motivocancelacion_id is null "); + sql.append(" and bo.categoria_id <> :CRIANCA_ID "); + sql.append(" and bo.feccorrida between to_date(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" and to_date(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" group by "); + sql.append(" co.feccorrida, "); + sql.append(" co.corrida_id, "); + sql.append(" co.roloperativo_id, "); + sql.append(" co.ruta_id, "); + sql.append(" co.empresacorrida_id, "); + sql.append(" bo.numkmviaje, "); + sql.append(" bo.boleto_id, "); + sql.append(" t.cantkmreal, "); + sql.append(" nvl(bo.importeseguro, 0), "); + sql.append(" nvl(bo.importetaxaembarque, 0), "); + sql.append(" nvl(bo.importepedagio, 0), "); + sql.append(" nvl(bo.preciopagado, 0) "); + sql.append(" ), "); + sql.append(" tb5 as ( "); + sql.append(" select /*+ materialize */ "); + sql.append(" rc.ruta_id, "); + sql.append(" t.origen_id, "); + sql.append(" t.destino_id, "); + sql.append(" nvl(t.cantkmreal, 0) as extensao "); + sql.append(" from ruta_combinacion rc "); + sql.append(" inner join tramo t on rc.tramo_id = t.tramo_id "); + sql.append(" where "); + sql.append(" rc.activo = 1 "); + sql.append(" ) "); + sql.append("select "); + sql.append(" grupo_ruta, "); + sql.append(" hora, "); + sql.append(" descruta, "); + sql.append(" servico, "); + sql.append(" sentido, "); + sql.append(" lot, "); + sql.append(" cla, "); + sql.append(" origem, "); + sql.append(" destino, "); + sql.append(" extensao, "); + sql.append(" coalesce(sum(equivalente * extensao), 0) as extensao_trecho, "); + sql.append(" coalesce(bagagens, 0) as bagagens, "); + sql.append(" coalesce(sum(seguro), 0) as seguro, "); + sql.append(" coalesce(sum(tx_embarque), 0) as tx_embarque, "); + sql.append(" coalesce(sum(pedagio), 0) as pedagio, "); + sql.append(" coalesce(sum(passagens), 0) as passagens, "); + sql.append(" ord, "); + sql.append(" extra, "); + sql.append(" tipo_linha, "); + sql.append(" absol, "); + sql.append(" coalesce(sum(km_real), 0) as km_real "); + sql.append("from "); + sql.append(" ( "); + sql.append(" select "); + sql.append(" r.ruta_id, "); + sql.append(" r.descruta as descruta, "); + sql.append(" nvl(gr.descgrupo, 'Não Definido') as grupo_ruta, "); + sql.append(" to_char(c.fechorsalida, '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(" nvl(cs.descclase, '') as cla, "); + sql.append(" max(nvl(tf.preciooriginal, 0)) as tarifa, "); + sql.append(" origem.cveparada as origem, "); + sql.append(" destino.cveparada as destino, "); + sql.append(" extensao as extensao, "); + sql.append(" cj.equivalente as equivalente, "); + sql.append(" sum(ee.impingreso) as bagagens, "); + sql.append(" cj.importeseguro as seguro, "); + sql.append(" cj.importetaxaembarque as tx_embarque, "); + sql.append(" cj.importepedagio as pedagio, "); + sql.append(" cj.preciopagado as passagens, "); + sql.append(" cj.boleto_id, "); + sql.append(" tb2.ord, "); + sql.append(" tb2.extra, "); + sql.append(" case when co.estado_id <> cd.estado_id then "); + sql.append(" 'INTERESTADUAL' else 'INTERMUNICIPAL' end as tipo_linha, "); + sql.append(" absol, "); + sql.append(" cj.km_real as km_real "); + sql.append(" from corrida c "); + sql.append(" inner join tb2 on ( ( tb2.corrida_id = c.corrida_id "); + sql.append(" and tb2.c_ruta_id = c.ruta_id ) "); + sql.append(" and tb2.roloperativo_id = c.roloperativo_id "); + sql.append(" and tb2.horasalida = to_char(c.fechorsalida, 'HH24:MI') ) "); + sql.append(" inner join tb4 on ( ( tb4.corrida_id = c.corrida_id "); + sql.append(" and tb4.c_ruta_id = c.ruta_id ) "); + sql.append(" and c.destino_id = tb4.destino_id "); + sql.append(" and c.origen_id = tb4.origen_id "); + sql.append(" and tb4.roloperativo_id = c.roloperativo_id "); + sql.append(" and tb4.horasalida = to_char(c.fechorsalida, 'HH24:MI') ) "); + sql.append(" left join cj on ( cj.corrida_id = c.corrida_id "); + sql.append(" and cj.feccorrida = c.feccorrida "); + sql.append(" and cj.roloperativo_id = c.roloperativo_id "); + sql.append(" and cj.ruta_id = c.ruta_id "); + sql.append(" and cj.empresacorrida_id = c.empresacorrida_id ) "); + sql.append(" inner join parada origem on ( c.origen_id = origem.parada_id ) "); + sql.append(" inner join parada destino on ( c.destino_id = destino.parada_id ) "); + sql.append(" inner join ciudad co on ( co.ciudad_id = origem.ciudad_id ) "); + sql.append(" inner join ciudad cd on ( cd.ciudad_id = destino.ciudad_id ) "); + sql.append(" inner join ruta r on ( c.ruta_id = r.ruta_id ) "); + sql.append(" left join grupo_ruta gr on ( r.gruporuta_id = gr.gruporuta_id ) "); + sql.append(" left join rol_operativo ro on ( c.roloperativo_id = ro.roloperativo_id ) "); + sql.append(" left join diagrama_autobus da on ( da.diagramaautobus_id = ro.diagramaautobus_id ) "); + sql.append(" left join clase_servicio cs on ( cs.claseservicio_id = c.claseservicio_id ) "); + sql.append(" left join evento_extra ee on ( ee.corrida_id = c.corrida_id "); + sql.append(" and ee.feccorrida = c.feccorrida "); + sql.append(" and ee.tipoeventoextra_id = 1 ) "); + sql.append(" left join tarifa tf on ( tf.claseservicio_id = c.claseservicio_id "); + sql.append(" and tf.destino_id = c.destino_id "); + sql.append(" and tf.origen_id = c.origen_id "); + sql.append(" and tf.marca_id = c.marca_id "); + sql.append(" and tf.ruta_id = c.ruta_id "); + sql.append(" and r.orgaoconcedente_id = tf.orgaoconcedente_id ) "); + sql.append(" left join vigencia_tarifa vtf on ( tf.vigenciatarifa_id = vtf.vigenciatarifa_id ) "); + sql.append(" inner join tb5 on ( tb5.ruta_id = c.ruta_id "); + sql.append(" and tb5.origen_id = origem.parada_id "); + sql.append(" and tb5.destino_id = destino.parada_id ) "); + sql.append(" where "); + sql.append(" c.feccorrida between to_date(:DATA_INICIO, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" and to_date(:DATA_FINAL, 'DD/MM/YYYY hh24:mi:ss') "); + sql.append(" and ( tf.tarifa_id is null "); + sql.append(" or ( tf.tarifa_id is not null "); + sql.append(" and c.feccorrida between vtf.feciniciovigencia and vtf.fecfinvigencia ) ) "); + sql.append(" and c.activo <> 0 "); + sql.append(corridaIds.isEmpty() ? "" : " AND c.CORRIDA_ID IN (" + corridaIds + ") "); + sql.append(grupoRuta == null ? "" : " AND r.GRUPORUTA_ID IN ( :GRUPORUTA_ID ) "); + sql.append(rutaIds.isEmpty() ? "" : " AND r.RUTA_ID IN (" + rutaIds + ") "); + sql.append(tipoServico == 0 ? "" : " AND c.TIPOSERVICIO_ID = :TIPOSERVICIO_ID "); + if(Boolean.TRUE.equals(isSentidoIda)) { + sql.append(" AND R.INDSENTIDOIDA =1 "); + } + + if(Boolean.TRUE.equals(isSentidoVolta)) { + sql.append(" AND R.INDSENTIDOIDA = 0 "); + } + sql.append(" and origem.activo = 1 "); + sql.append(" and destino.activo = 1 "); + sql.append(" and tb2.origem = origem.cveparada "); + sql.append(" and tb2.destino = destino.cveparada "); + sql.append(" and r.activo = 1 "); + sql.append(" and ro.activo = 1 "); + sql.append(" and da.activo = 1 "); + sql.append(" and cs.activo = 1 "); + sql.append(" and ( cj.boleto_id is not null ) "); + sql.append(" group by "); + sql.append(" r.ruta_id, "); + sql.append(" r.descruta, "); + sql.append(" nvl(gr.descgrupo, 'Não Definido'), "); + sql.append(" to_char(c.fechorsalida, 'HH24:MI'), "); + sql.append(" c.corrida_id, "); + sql.append(" r.indsentidoida, "); + sql.append(" da.cantasientos, "); + sql.append(" cs.descclase, "); + sql.append(" tb5.extensao, "); + sql.append(" tb2.ord, "); + sql.append(" tb2.extra, "); + sql.append(" absol, "); + sql.append(" co.estado_id, "); + sql.append(" cd.estado_id, "); + sql.append(" origem.cveparada, "); + sql.append(" destino.cveparada, "); + sql.append(" cj.preciopagado, "); + sql.append(" cj.importeseguro, "); + sql.append(" cj.importetaxaembarque, "); + sql.append(" cj.importepedagio, "); + sql.append(" cj.equivalente, "); + sql.append(" cj.km_real, "); + sql.append(" cj.boleto_id "); + sql.append(" ) "); + sql.append("group by "); + sql.append(" grupo_ruta, "); + sql.append(" hora, "); + sql.append(" descruta, "); + sql.append(" servico, "); + sql.append(" sentido, "); + sql.append(" lot, "); + sql.append(" cla, "); + sql.append(" origem, "); + sql.append(" destino, "); + sql.append(" extensao, "); + sql.append(" bagagens, "); + sql.append(" ord, "); + sql.append(" extra, "); + sql.append(" tipo_linha, "); + sql.append(" absol "); + sql.append("order by "); + sql.append(" tipo_linha, "); + sql.append(" grupo_ruta, "); + sql.append(" descruta, "); + sql.append(" servico, "); + sql.append(" origem, "); + sql.append(" destino "); + + return sql.toString(); + } + + + private String buscarConstante(String nomeConstante) { + ConstanteService constanteService = (ConstanteService) AppContext.getApplicationContext().getBean("constanteService"); + return constanteService.buscarPorNomeConstante(nomeConstante).getValorconstante(); + } + + protected void mesclarDataHora(Calendar pData, Calendar pHora) { + pData.set(Calendar.HOUR_OF_DAY, pHora.get(Calendar.HOUR_OF_DAY)); + pData.set(Calendar.MINUTE, pHora.get(Calendar.MINUTE)); + pData.set(Calendar.SECOND, pHora.get(Calendar.SECOND)); + + } +} diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_es.properties new file mode 100644 index 000000000..4aa58b3dc --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_es.properties @@ -0,0 +1,61 @@ +#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\u00EDodo\: +header.data.hora=Data/Hora\: +header.pagina=P\u00E1gina\: +header.filtro=Filtro\: +header.filtro.servico=Servi\u00E7o\: +header.filtro.linha=Linha\: +header.filtro.grupo=Grupo de Linhas\: +cabecalho.impressorPor=Impresso por + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂM. OPERACIONAIS +detail.hora=Hora +detail.data=Data +detail.servico=Serviço +detail.trecho=Trecho +detail.setido=Sentido +detail.lot=Lot. +detail.cal=Classe +detail.extensao=Extensão +detail.tarifa=Tarifa +detail.passagens=Passagens +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Tx. Embarque +detail.total=Total +detail.ord=Ord. +detail.extra=Extra +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.absol=Passag.Trasnsportados +detail.equivalente=Equivalente +detail.mpa=MPA +detail.mpe=MPE +detail.rsKm=R$/Km +detail.eq=Eq. +detail.rsViagem=R$/Viagem +detail.paxOfer=Pax.Km Ofer. +detail.paxTrans=Pax.Km Transportado +detail.iap=IAP% +detail.pedagio=Pedágio +detail.linha=Linha + +#Group +ruta.total= Total Linha +group.total=Total do Grupo +sub.total=Sub Total +total.geral=Total Geral + +linhas=Linhas + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_pt_BR.properties new file mode 100644 index 000000000..4aa58b3dc --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio_pt_BR.properties @@ -0,0 +1,61 @@ +#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\u00EDodo\: +header.data.hora=Data/Hora\: +header.pagina=P\u00E1gina\: +header.filtro=Filtro\: +header.filtro.servico=Servi\u00E7o\: +header.filtro.linha=Linha\: +header.filtro.grupo=Grupo de Linhas\: +cabecalho.impressorPor=Impresso por + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂM. OPERACIONAIS +detail.hora=Hora +detail.data=Data +detail.servico=Serviço +detail.trecho=Trecho +detail.setido=Sentido +detail.lot=Lot. +detail.cal=Classe +detail.extensao=Extensão +detail.tarifa=Tarifa +detail.passagens=Passagens +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Tx. Embarque +detail.total=Total +detail.ord=Ord. +detail.extra=Extra +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.absol=Passag.Trasnsportados +detail.equivalente=Equivalente +detail.mpa=MPA +detail.mpe=MPE +detail.rsKm=R$/Km +detail.eq=Eq. +detail.rsViagem=R$/Viagem +detail.paxOfer=Pax.Km Ofer. +detail.paxTrans=Pax.Km Transportado +detail.iap=IAP% +detail.pedagio=Pedágio +detail.linha=Linha + +#Group +ruta.total= Total Linha +group.total=Total do Grupo +sub.total=Sub Total +total.geral=Total Geral + +linhas=Linhas + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_es.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_es.properties new file mode 100644 index 000000000..4d73187e9 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_es.properties @@ -0,0 +1,61 @@ +#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\u00EDodo\: +header.data.hora=Data/Hora\: +header.pagina=P\u00E1gina\: +header.filtro=Filtro\: +header.filtro.servico=Servi\u00E7o\: +header.filtro.linha=Linha\: +header.filtro.grupo=Grupo de Linhas\: +cabecalho.impressorPor=Impresso por + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂM. OPERACIONAIS +detail.hora=Hora +detail.data=Data +detail.servico=Serviço +detail.trecho=Trecho +detail.setido=Sentido +detail.lot=Lot. +detail.cal=Classe +detail.extensao=Extensão +detail.tarifa=Tarifa +detail.passagens=Tarifa +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Tx. Embarque +detail.total=Total +detail.ord=Ord. +detail.extra=Extra +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.absol=Passag.Trasnsportados +detail.equivalente=Equivalente +detail.mpa=MPA +detail.mpe=MPE +detail.rsKm=R$/Km +detail.eq=Eq. +detail.rsViagem=R$/Viagem +detail.paxOfer=Pax.Km Ofer. +detail.paxTrans=Pax.Km Transportado +detail.iap=IAP% +detail.pedagio=Pedágio +detail.linha=Linha + +#Group +ruta.total= Total Linha +group.total=Total do Grupo +sub.total=Sub Total +total.geral=Total Geral + +linhas=Linhas + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_pt_BR.properties b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_pt_BR.properties new file mode 100644 index 000000000..4d73187e9 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/internacionalizacao/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio_pt_BR.properties @@ -0,0 +1,61 @@ +#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\u00EDodo\: +header.data.hora=Data/Hora\: +header.pagina=P\u00E1gina\: +header.filtro=Filtro\: +header.filtro.servico=Servi\u00E7o\: +header.filtro.linha=Linha\: +header.filtro.grupo=Grupo de Linhas\: +cabecalho.impressorPor=Impresso por + +#Labels detail + +detail.receita=RECEITA +detail.viagens=VIAGENS +detail.passageiros=PASSAGEIROS +detail.parametrosOperacionais=PARÂM. OPERACIONAIS +detail.hora=Hora +detail.data=Data +detail.servico=Serviço +detail.trecho=Trecho +detail.setido=Sentido +detail.lot=Lot. +detail.cal=Classe +detail.extensao=Extensão +detail.tarifa=Tarifa +detail.passagens=Tarifa +detail.seguro=Seguro +detail.bagagens=Bagagens +detail.segOpc=Tx. Embarque +detail.total=Total +detail.ord=Ord. +detail.extra=Extra +detail.totalViagem=Total +detail.km.rodad=Km Rodad. +detail.absol=Passag.Trasnsportados +detail.equivalente=Equivalente +detail.mpa=MPA +detail.mpe=MPE +detail.rsKm=R$/Km +detail.eq=Eq. +detail.rsViagem=R$/Viagem +detail.paxOfer=Pax.Km Ofer. +detail.paxTrans=Pax.Km Transportado +detail.iap=IAP% +detail.pedagio=Pedágio +detail.linha=Linha + +#Group +ruta.total= Total Linha +group.total=Total do Grupo +sub.total=Sub Total +total.geral=Total Geral + +linhas=Linhas + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio.jasper new file mode 100644 index 0000000000000000000000000000000000000000..d868856a0f5e37cb8a8b48e98798dd7a1dca98a7 GIT binary patch literal 96765 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

cDx5;A?e`6K zlkG-&b;>O*4F~Phv(J%7{Pybse||Ibh)$qR*MkMQVYr7(Fmep23ugw@RfdMTWVC^L z%G=12P(RFodQXYEcPzG7X2`;GU2<1^U%>ui+L`_A9tW*`G^6WYu_;vpF8$w(VV!_| zAA+45dyBZKI!wXX#{j!BVm4@FHc zr(g5aSD&t*d(@Nnv}AlaziY`mCdhA2uYQ?DkaJ_E0dm1LK&~>hI$dRGkV^)@;1GCi z=S&SAdPxQL5eBf`nq_%IPOPae%zgGeZ3Az2xRV~<*FVshcl_1?cl`cWL)rAV%@@L? ziT6Chn;UZscnhupZNDp?T0dKdjLYqBYKlqbe zB@Zn<_0xj1dWM@%sW`C5mWKx3^}zQPzn)jJa~oaK;NteXq!2RO55M$;y!l@r=T@G- zcJQy)?reuKS~1k4R_N|81JCKz&pMxB4w7@B~Ee?o|wfF+}iIxM0| zhF+4ytaM3_GKkr&!?+qt^Gz#L-a-*??s41aps$(McvXn#F6`{?!`IHLuj%o{k!;S|uSyT=Ap9o~{M1Ya?%(UVDJ5@b zU;EUXJ&TvBm;+DLUG86-+5TL@of~Hva2H$y?kYpWU1eyvONI-Fm+jATqv$J*B}d(p~*sJXtI!uHfsMXRD8HSl|+v7B;sq7 zyT~3a>LSfAE)OHv*7EehzIWcn?q984)_8i!!wqkg6efbrGd>w!h0239)%lwVaBkdU z09aE&EbYi|74AZx)j$XaD+ zvQ`uf1%`t1oXJ@?@>u zd_?_mrC3s@&mW|xipb6Y(87?nj;iWZ$xQ}YW2iuD3>9dXVQx0E9UmQOO9l6-2Dsh1 zZn@w^^G^fZ&)q!$_Sb0xe&McHY@Be7BX(mTP1bfKtJH zx&dZan@X$A6>kz$4t~ZSg2|a%(#HAR<6pY-_w<8;jDbzArs| z#hcU5zwD7~1|PHUyA9=2I{`XPRAqC+Fe4@yh8Z!9p@A;^6VlK?my9+*@7RpknFi36 z;VrH&(lGZnC@!=>r_8t$Hu$By>w|CbtB6G#^yIKS zg}3+H@_Io-CuFdkWWbH6Kve6y3a&v0DnpZj%FtvW8A&pTy0CfARAu2RgA5YSKy^Lp zP+5?LuShKT~8!HVm5L|-{ zRE8!4m7&Q%GLmGl(uK@>Dl$k~|8jMr46r0$oW+x~6pNu#=&}7e$6Xg-#5t+%zxv{< z%l=q-_ft=;zw!0l=9!Z;oD&Acz|s~2&o+BlClTJyd@(E z?-M+nU5kQuQvH8TBHq{&qaK?m{pe73mrXFL9X_3qo*3@BV*4?#eRs;yv!*`O|AIe? zhM2^VW+!(oiGUmD8nV3L8bqKnG!du_O$3sWB!Y8Y3%Fu)$ z8A(Fe;DPU2QVC(BK?t($_b(#S<&ZGC^XngXiXlDBFF54Yq2D!Sug`vHaMprD^1F2c z^IHgWZro(RTyPDTs|*cum7!rS8A+Jmn7 z3Ay`yb;N#G6qY~T3B2zoyt#3&0dK)I;H@$=yj6yVw`3&YeXobJYe|Lo^#;84Gi%cX z+|@d#2lz#AY(Dq%U4MCUb8T^O{

5O@QA_HB0-QnWqVGZairKTyPD5s|*crm7xJH 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band splitType="Stretch"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jasper b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jasper new file mode 100644 index 0000000000000000000000000000000000000000..aee3b60ad2f7109f0a4b6efc71a4b4950be81755 GIT binary patch literal 96050 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 literal 0 HcmV?d00001 diff --git a/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jrxml b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jrxml new file mode 100644 index 000000000..27181ec6d --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio.jrxml @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band splitType="Stretch"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaHorario.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaHorario.java index b9caaa479..b333daf14 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaHorario.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/render/RenderRelatorioLinhaHorario.java @@ -31,6 +31,12 @@ public class RenderRelatorioLinhaHorario implements ListitemRenderer { lc = new Listcell("-"); } lc.setParent(lstm); + + lc = new Listcell(ruta.getRutaId().toString()); + lc.setParent(lstm); + + lc = new Listcell(ruta.getIndSentidoIda() == true ? "IDA" : "VOLTA" ); + lc.setParent(lstm); Button btn = new Button(); diff --git a/web/WEB-INF/i3-label_en.label b/web/WEB-INF/i3-label_en.label index 321854e4d..fb8e80297 100644 --- a/web/WEB-INF/i3-label_en.label +++ b/web/WEB-INF/i3-label_en.label @@ -739,6 +739,9 @@ relatorioLinhasHorarioController.lbHoraSaidaInicial.value = Departure Time relatorioLinhasHorarioController.lbHoraSaidaFinal.value = to relatorioLinhasHorarioController.chKIda.value = Outbound Line relatorioLinhasHorarioController.chKVolta.value = Return Line +relatorioLinhasHorarioController.lbSentido.label = Sentido +relatorioLinhasHorarioController.lbId.label = Id +relatorioLinhasHorarioController.chkConsiderarTXPedagio.value = Considerar TX e Pedágio #Relatório Indice IRK relatorioIndiceIRKController.window.title = Relatório Indice IRK diff --git a/web/WEB-INF/i3-label_es_MX.label b/web/WEB-INF/i3-label_es_MX.label index c296d00e4..3f08a3887 100644 --- a/web/WEB-INF/i3-label_es_MX.label +++ b/web/WEB-INF/i3-label_es_MX.label @@ -734,6 +734,9 @@ relatorioLinhasHorarioController.lbHoraSaidaInicial.value = Hora Salida relatorioLinhasHorarioController.lbHoraSaidaFinal.value = a relatorioLinhasHorarioController.chKIda.value = Línea Ida relatorioLinhasHorarioController.chKVolta.value = Línea Vuelta +relatorioLinhasHorarioController.lbSentido.label = Sentido +relatorioLinhasHorarioController.lbId.label = Id +relatorioLinhasHorarioController.chkConsiderarTXPedagio.value = Considerar TX e Pedágio #Relatorio Tramo Vendido relatorioTrechoVendidoController.lbDataIni.value = Fecha inicial @@ -8963,8 +8966,6 @@ editarEmpresaController.configuracaoRede.label= eRede editarEmpresaController.lblProducao.value=Ambiente Produção? editarEmpresaController.lblToken.value=Token editarEmpresaController.lblFiliation.value=Filiation -editarEmpresaController.indImpressaoAposConfAberto=Bloquear Impressão de Passagem em Aberto -editarEmpresaController.indImpressaoAposConfAberto.help=Ventas realizadas a través del menú Abrir Boleto con Impresión Posterior, se debe realizar la Confirmación de Abrir y luego imprimir el boleto # Reporte Operacional Financeiro relatorioOperacionalFinanceiroController.window.title = Reporte Operacional Financiero diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 758987614..f19034770 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -739,7 +739,11 @@ relatorioLinhasHorarioController.lblSimplificadoData.value = Emite Simplificado relatorioLinhasHorarioController.lbHoraSaidaInicial.value = Hora Saída relatorioLinhasHorarioController.lbHoraSaidaFinal.value = à relatorioLinhasHorarioController.chKIda.value = Linha Ida -relatorioLinhasHorarioController.chKVolta.value = Linha Volta +relatorioLinhasHorarioController.chKVolta.value = Linha Volta +relatorioLinhasHorarioController.lbSentido.label = Sentido +relatorioLinhasHorarioController.lbId.label = Id +relatorioLinhasHorarioController.chkConsiderarTXPedagio.value = Considerar TX e Pedágio + #Relatório Indice IRK relatorioIndiceIRKController.window.title = Relatório Indice IRK diff --git a/web/gui/relatorios/filtroRelatorioLinhasHorario.zul b/web/gui/relatorios/filtroRelatorioLinhasHorario.zul index 7c8a6e474..e5cf72b82 100644 --- a/web/gui/relatorios/filtroRelatorioLinhasHorario.zul +++ b/web/gui/relatorios/filtroRelatorioLinhasHorario.zul @@ -163,19 +163,24 @@ use="com.rjconsultores.ventaboletos.web.utilerias.MyListbox" vflex="true" multiple="false" height="60%" width="410px"> - - + width="15%" /> + label="${c:l('lb.dec')}" + width="30%" /> + width="20%" /> + + @@ -196,16 +201,22 @@ + width="15%" /> + label="${c:l('lb.dec')}" + width="30%" /> - + width="20%" /> + + @@ -253,8 +264,9 @@ + + -