/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioResumoLinhasBean;
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;

/**
 * @author valdevir_rj
 * 
 */
public class RelatorioResumoLinhasAnaliticoSimplificadoSumarizado extends Relatorio {

	private List<RelatorioResumoLinhasBean> lsDadosRelatorio;
	private static String CONSTANTE_GRATUIDADE_CRIANCA;

	/**
	 * @param parametros
	 * @param conexao
	 */
	public RelatorioResumoLinhasAnaliticoSimplificadoSumarizado(final Map<String, Object> parametros, final Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {
				Integer rutaId = parametros.get("RUTA_ID") != null ? Integer.valueOf(parametros.get("RUTA_ID").toString()) : null;
				Integer empresaId = parametros.get("EMPRESA_ID") != null ? Integer.valueOf(parametros.get("EMPRESA_ID").toString()) : null;
				Integer grupoRutaId = parametros.get("GRUPORUTA_ID") != null ? Integer.valueOf(parametros.get("GRUPORUTA_ID").toString()) : null;
				CONSTANTE_GRATUIDADE_CRIANCA = buscarConstante("GRATUIDADE_CRIANCA");
				String sql = getSql(rutaId, grupoRutaId);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = null;

				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
				if (parametros.get("DATA_INICIAL") != null) {
					Date dataInicio = (Date) parametros.get("DATA_INICIAL");
					stmt.setString("DATA_INICIAL", sdf.format(dataInicio));
				}

				if (parametros.get("DATA_FINAL") != null) {
					Date dataFinal = (Date) parametros.get("DATA_FINAL");
					stmt.setString("DATA_FINAL", sdf.format(dataFinal));
				}

				if (rutaId != null) {
					stmt.setInt("RUTA_ID", rutaId);
				}
				if (grupoRutaId != null) {
					stmt.setInt("GRUPORUTA_ID", grupoRutaId);
				}
				stmt.setInt("EMPRESA_ID", empresaId.intValue());
				stmt.setString("CRIANCA_ID",CONSTANTE_GRATUIDADE_CRIANCA);
				rset = stmt.executeQuery();

				lsDadosRelatorio = new ArrayList<RelatorioResumoLinhasBean>();

				RelatorioResumoLinhasBean relatorioBean = null;		
				Boolean isMesmaLinhaIdaVolta =false;				
				
				while (rset.next()) {
					

					 isMesmaLinhaIdaVolta = relatorioBean !=null && rset.getString("PREFIXO") != null &&
							rset.getString("PREFIXO").equals(relatorioBean.getPREFIXO()) ? Boolean.TRUE : Boolean.FALSE;

					if (!isMesmaLinhaIdaVolta) {
						if(relatorioBean !=null) {
							lsDadosRelatorio.add(relatorioBean);
						}
						relatorioBean = preencheAgrupaRelatorioBeanPorIdaVolta(rset, isMesmaLinhaIdaVolta, null);
					} else {
						relatorioBean= preencheAgrupaRelatorioBeanPorIdaVolta(rset, isMesmaLinhaIdaVolta, relatorioBean);
					}

				}
				Collections.sort(lsDadosRelatorio, new Comparator<RelatorioResumoLinhasBean>() {
					  @Override
					  public int compare(RelatorioResumoLinhasBean rel1, RelatorioResumoLinhasBean rel2) {
					    return rel1.getDESCRUTA().compareTo(rel2.getDESCRUTA());
					  }
				});
				if (lsDadosRelatorio.size() > 0) {
					if (isMesmaLinhaIdaVolta) {
						lsDadosRelatorio.add(relatorioBean);
					}
					setLsDadosRelatorio(lsDadosRelatorio);
				}else {
					//tratado caso onde filtra a linha (apenas uma linha)
					if(rset.getRow() ==0 && rutaId !=null && relatorioBean!=null) {
						lsDadosRelatorio.add(relatorioBean);
						setLsDadosRelatorio(lsDadosRelatorio);
					}
				}
			}

		});
	}

	public void setLsDadosRelatorio(List<RelatorioResumoLinhasBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	public void processaParametros() throws Exception {
	}

	/**
	 * Obtem SQL, necessario ordenar por prefixo.
	 * Obs.: Não deve sera alterado ordenacao pois impactara na logica de agrupamento por ida/volta
	 * 
	 * @param rutaId
	 * @param grupoRutaId
	 * @return
	 */
	private String getSql(Integer rutaId, Integer grupoRutaId) {
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ");
		sql.append(" subnivel2.*, ");
		sql.append(" ( nvl(subnivel2.passageiros, 0) / decode(nvl(subnivel2.viagens_total, 0), 0, 1, nvl(subnivel2.viagens_total, 0)) ) AS passageiros_mpa, ");
		sql.append(" ( round(nvl(subnivel2.passageiros_equivalente, 0), 2) / decode(nvl(subnivel2.viagens_total, 0), 0, 1, nvl(subnivel2.viagens_total, ");
		sql.append(" 0)) )                         AS passageiros_mpe, ");
		sql.append(" ( nvl(subnivel2.receita_total, 0) / decode(nvl(subnivel2.km_rodado, 0), 0, 1, nvl(subnivel2.km_rodado, 0)) ) receita_km,          ");
		sql.append(" ( nvl(subnivel2.receita_total, 0) / decode(nvl(subnivel2.viagens_total, 0), 0, 1, nvl(subnivel2.viagens_total, 0)) ) AS receita_viagem, ");
		sql.append(" ( nvl(subnivel2.assentos, 0) * nvl(subnivel2.km_rodado, 0) ) AS pax_ofertado ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT");
		sql.append(" subnivel3.*,");
		sql.append(" ( round(nvl(subnivel3.passageiros_equivalente, 0), 2) * nvl(subnivel3.extensao_km, 0) ) AS pax_km, ");
		sql.append(" ( nvl(subnivel3.viagens, 0) + nvl(subnivel3.viagens_extra, 0) ) viagens_total,");
		sql.append(" ( ( nvl(subnivel3.viagens, 0) + nvl(subnivel3.viagens_extra, 0) ) * nvl(subnivel3.extensao_km, 0) ) km_rodado ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT");
		sql.append(" subnivel4.indsentidoida, ");
		sql.append(" subnivel4.prefixo, ");
		sql.append(" subnivel4.descruta,");
		sql.append(" subnivel4.ruta_id, ");
		sql.append(" subnivel4.numruta, ");
		sql.append(" subnivel4.interestadual,");
		sql.append(" subnivel4.grupo_linha, ");
		sql.append(" COALESCE(subnivel4.extensao_km,0) as extensao_km, ");
		sql.append(" subnivel4.cve_clase_servicio, ");
		sql.append(" subnivel4.desc_clase_servicio,");
		sql.append(" SUM(nvl(subnivel4.receita_seguro, 0)) AS receita_seguro, ");
		sql.append(" SUM(nvl(subnivel4.receita_bagagem, 0)) AS receita_bagagem, ");
		sql.append(" SUM(nvl(subnivel4.receita_seguro_outros, 0)) AS receita_seguro_outros, ");
		sql.append(" SUM(nvl(subnivel4.receita_tarifa, 0)) AS receita_tarifa, ");
		sql.append(" SUM(nvl(subnivel4.receita_pedagio, 0)) AS receita_pedagio, ");
		sql.append(" SUM(nvl(subnivel4.receita_embarque, 0)) AS receita_embarque, ");
		sql.append(" SUM(nvl(subnivel4.passageiros, 0)) AS passageiros,");
		sql.append(" SUM(nvl(subnivel4.receita_total, 0)) AS receita_total,");
		sql.append(" SUM(nvl(subnivel4.passageiros_equivalente, 0)) AS passageiros_equivalente, ");
		sql.append(" subnivel4.assentos AS assentos, ");
		sql.append(" COUNT(DISTINCT ");
		sql.append(" CASE ");
		sql.append(" WHEN subnivel4.tiposervicio_id = 2 THEN ");
		sql.append(" subnivel4.feccorrida || subnivel4.corrida_id ");
		sql.append(" ELSE ");
		sql.append(" NULL ");
		sql.append(" END ");
		sql.append(" ) viagens_extra, ");
		sql.append(" COUNT(DISTINCT ");
		sql.append(" CASE ");
		sql.append(" WHEN subnivel4.tiposervicio_id <> 2 THEN ");
		sql.append(" subnivel4.feccorrida || subnivel4.corrida_id ");
		sql.append(" ELSE ");
		sql.append(" NULL ");
		sql.append(" END ");
		sql.append(" ) viagens ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" subnivel5.*, ");
		sql.append(" ( subnivel5.receita_tarifa + receita_seguro + receita_embarque + receita_pedagio ) receita_total, ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" SUM(nvl(pe.equivalente, 0)) ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" co.feccorrida, ");
		sql.append(" co.ruta_id, ");
		sql.append(" bo.preciobase, ");
		sql.append(" round((bo.numkmviaje * COUNT(1) /( ");
		sql.append(" SELECT ");
		sql.append(" SUM(nvl(tr.cantkmreal, 0)) ");
		sql.append(" FROM ");
		sql.append(" ruta_combinacion  rs, ");
		sql.append(" tramo             tr ");
		sql.append(" WHERE ");
		sql.append(" rs.ruta_id = co.ruta_id ");
		sql.append(" AND rs.tramo_id = tr.tramo_id ");
		sql.append(" )), ");
		sql.append(" 2) equivalente ");
		sql.append(" FROM ");
		sql.append(" corrida  co, ");
		sql.append(" boleto   bo ");
		sql.append(" WHERE ");
		sql.append(" co.corrida_id = bo.corrida_id ");
		sql.append(" AND co.feccorrida = bo.feccorrida ");
		sql.append(" AND bo.activo = 1 ");
		sql.append(" AND ( bo.motivocancelacion_id IS NULL ");
		sql.append(" OR bo.motivocancelacion_id = 0  AND bo.CATEGORIA_ID <> :CRIANCA_ID ) ");
		sql.append(" GROUP BY ");
		sql.append(" co.feccorrida, ");
		sql.append(" co.ruta_id, ");
		sql.append(" bo.preciobase, ");
		sql.append(" bo.numkmviaje ");
		sql.append(" ) pe ");
		sql.append(" WHERE ");
		sql.append(" pe.feccorrida = subnivel5.feccorrida ");
		sql.append(" AND pe.ruta_id = subnivel5.ruta_id ");
		sql.append(" ) passageiros_equivalente, ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" SUM(nvl(da.cantasientos, 0)) ");
		sql.append(" FROM ");
		sql.append(" diagrama_autobus da ");
		sql.append(" INNER JOIN rol_operativo  ro ON ( da.diagramaautobus_id = ro.diagramaautobus_id ) ");
		sql.append(" INNER JOIN corrida        co ON ( ro.roloperativo_id = co.roloperativo_id ) ");
		sql.append(" INNER JOIN ruta           ru ON ( ru.ruta_id = co.ruta_id ) ");
		sql.append(" WHERE ");
		sql.append(" co.feccorrida BETWEEN TO_DATE(:DATA_INICIAL, 'DD/MM/YY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YY hh24:mi:ss') ");
		sql.append(" AND ru.ruta_id = subnivel5.ruta_id ");
		sql.append(" AND da.activo = 1 ");
		sql.append(" AND ro.activo = 1 ");
		sql.append(" AND co.activo = 1 ");
		sql.append(" AND ru.activo = 1 ");
		sql.append(" ) assentos ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" ruta_id, ");
		sql.append(" indsentidoida, ");
		sql.append(" numruta, ");
		sql.append(" prefixo, ");
		sql.append(" feccorrida, ");
		sql.append(" corrida_id, ");
		sql.append(" tiposervicio_id, ");
		sql.append(" descruta, ");
		sql.append(" interestadual, ");
		sql.append(" grupo_linha, ");
		sql.append(" extensao_km, ");
		sql.append(" receita_seguro, ");
		sql.append(" receita_bagagem, ");
		sql.append(" receita_seguro_outros, ");
		sql.append(" receita_pedagio, ");
		sql.append(" receita_embarque, ");
		sql.append(" SUM(passageiros)      AS passageiros, ");
		sql.append(" cve_clase_servicio, ");
		sql.append(" desc_clase_servicio, ");
		sql.append(" SUM(preciopagado) AS receita_tarifa ");
		sql.append(" FROM ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		sql.append(" rt.ruta_id, ");
		sql.append(" bl.boleto_id, ");
		sql.append(" SUM(bl.preciopagado) AS preciototal, ");
		sql.append(" bl.preciopagado AS preciopagado, ");
		sql.append(" rt.indsentidoida, ");
		sql.append(" rt.numruta, ");
		sql.append(" rt.prefixo, ");
		sql.append(" cr.feccorrida, ");
		sql.append(" cr.corrida_id, ");
		sql.append(" cr.tiposervicio_id, ");
		sql.append(" rt.descruta, ");
		sql.append(" CASE ");
		sql.append(" WHEN co.estado_id <> cd.estado_id THEN ");
		sql.append(" 'S' ");
		sql.append(" ELSE ");
		sql.append(" 'N' ");
		sql.append(" END interestadual, ");
		sql.append(" nvl(gr.descgrupo, 'Não Definido') grupo_linha, ");
		sql.append(" ( ");
		sql.append(" SELECT ");
		if (parametros.get("SOMAR_KM_RODADOS_POR").equals("SEQUENCIA")) { 
			sql.append(" SUM(nvl(rs.kmoriginal, 0)) ");
		}else {
			sql.append(" SUM(nvl(TR.CANTKMREAL, 0)) ");
		}
		sql.append(" FROM ");
		sql.append(" ruta_secuencia  rs, ");
		sql.append(" tramo           tr ");
		sql.append(" WHERE ");
		sql.append(" rs.ruta_id = rt.ruta_id ");
		sql.append(" AND rs.tramo_id = tr.tramo_id ");
		sql.append(" AND rs.activo = 1 ");
		sql.append(" ) extensao_km, ");
		sql.append(" nvl(SUM(nvl(bl.importeseguro, 0)), 0) receita_seguro, ");
		sql.append(" 0 receita_bagagem, ");
		sql.append(" 0 receita_seguro_outros, ");
		sql.append(" SUM(nvl(bl.importepedagio, 0)) receita_pedagio, ");
		sql.append(" SUM(nvl(bl.importetaxaembarque, 0)) receita_embarque, ");
		sql.append(" COUNT(DISTINCT boleto_id) passageiros, ");
		sql.append(" nvl(cs.cveclase, ' ') cve_clase_servicio, ");
		sql.append(" nvl(cs.descclase, ' ') desc_clase_servicio ");
		sql.append(" FROM ");
		sql.append(" ruta             rt, ");
		sql.append(" boleto           bl, ");
		sql.append(" corrida          cr, ");
		sql.append(" tramo            tr, ");
		sql.append(" vigencia_tarifa  vt, ");
		sql.append(" grupo_ruta       gr, ");
		sql.append(" parada           po, ");
		sql.append(" parada           pd, ");
		sql.append(" ciudad           co, ");
		sql.append(" ciudad           cd, ");
		sql.append(" clase_servicio   cs ");
		sql.append(" WHERE ");
		sql.append(" rt.ruta_id = cr.ruta_id ");
		sql.append(" AND cs.claseservicio_id = rt.claseservicio_id ");
		sql.append(" AND cr.feccorrida = bl.feccorrida ");
		if (rutaId != null) {
			sql.append("         AND cr.ruta_id = :RUTA_ID ");
		}
		if (grupoRutaId != null) {
			sql.append("         AND DECODE(:GRUPORUTA_ID, NULL, 1, RT.GRUPORUTA_ID) = DECODE(:GRUPORUTA_ID, NULL, 1, :GRUPORUTA_ID) ");
		}
		
		sql.append(" AND cr.corrida_id = bl.corrida_id ");
		sql.append(" AND cr.empresacorrida_id = :EMPRESA_ID ");
		sql.append(" AND cr.origen_id = po.parada_id ");
		sql.append(" AND cr.destino_id = pd.parada_id ");
		sql.append(" AND po.ciudad_id = co.ciudad_id ");
		sql.append(" AND pd.ciudad_id = cd.ciudad_id ");
		sql.append(" AND rt.gruporuta_id = gr.gruporuta_id (+) ");
		sql.append(" AND tr.origen_id = cr.origen_id ");
		sql.append(" AND tr.destino_id = cr.destino_id ");
		sql.append(" AND bl.motivocancelacion_id IS NULL ");
		sql.append(" AND bl.indstatusoperacion = 'F' ");
		sql.append(" AND vt.activo = 1 ");
		sql.append(" AND cr.feccorrida BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia ");
		sql.append(" AND cr.feccorrida BETWEEN TO_DATE(:DATA_INICIAL, 'DD/MM/YY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, ");
		sql.append(" 'DD/MM/YY hh24:mi:ss') AND bl.CATEGORIA_ID <> :CRIANCA_ID ");
		sql.append(" AND cr.activo = 1 ");
		sql.append(" GROUP BY ");
		sql.append(" rt.ruta_id, ");
		sql.append(" rt.numruta, ");
		sql.append(" rt.prefixo, ");
		sql.append(" cr.feccorrida, ");
		sql.append(" cr.corrida_id, ");
		sql.append(" cr.tiposervicio_id, ");
		sql.append(" rt.descruta, ");
		sql.append(" gr.descgrupo, ");
		sql.append(" co.estado_id, ");
		sql.append(" cd.estado_id, ");
		sql.append(" rt.indsentidoida, ");
		sql.append(" cs.cveclase, ");
		sql.append(" cs.descclase, ");
		sql.append(" bl.boleto_id, ");
		sql.append(" bl.preciopagado ");
		sql.append(" ) sunnivel6 ");
		sql.append(" GROUP BY ");
		sql.append(" ruta_id, ");
		sql.append(" indsentidoida, ");
		sql.append(" numruta, ");
		sql.append(" prefixo, ");
		sql.append(" feccorrida, ");
		sql.append(" corrida_id, ");
		sql.append(" tiposervicio_id, ");
		sql.append(" descruta, ");
		sql.append(" interestadual, ");
		sql.append(" grupo_linha, ");
		sql.append(" extensao_km, ");
		sql.append(" receita_seguro, ");
		sql.append(" receita_bagagem, ");
		sql.append(" receita_seguro_outros, ");
		sql.append(" receita_pedagio, ");
		sql.append(" receita_embarque, ");
		sql.append(" passageiros, ");
		sql.append(" cve_clase_servicio, ");
		sql.append(" desc_clase_servicio ");
		sql.append(" ) subnivel5 ");
		sql.append(" ) subnivel4 ");
		sql.append(" GROUP BY ");
		sql.append(" subnivel4.prefixo, ");
		sql.append(" subnivel4.descruta, ");
		sql.append(" subnivel4.ruta_id, ");
		sql.append(" subnivel4.numruta, ");
		sql.append(" subnivel4.interestadual, ");
		sql.append(" subnivel4.grupo_linha, ");
		sql.append(" subnivel4.extensao_km, ");
		sql.append(" subnivel4.cve_clase_servicio, ");
		sql.append(" subnivel4.desc_clase_servicio, ");
		sql.append(" subnivel4.indsentidoida, ");
		sql.append(" subnivel4.assentos ");
		sql.append(" ) subnivel3 ");
		sql.append(" ORDER BY ");
		sql.append(" subnivel3.prefixo, ");
		sql.append(" subnivel3.indsentidoida DESC ");
		sql.append(" ) subnivel2 ");
		return sql.toString();

	}

	/**
	 * Preenche objeto de relatorio caso seja Ida criar novo objeto e preenche com dados, caso seja Volta concantena/agrupa com o objeto de linha da Ida.
	 * Obs.: Não deve sera alterado ordenacao pois impactara na logica abaixo.
	 * 
	 * @param rset
	 * @param relatorioBean
	 * @return
	 * @throws SQLException
	 */
	private RelatorioResumoLinhasBean preencheAgrupaRelatorioBeanPorIdaVolta(ResultSet rset, Boolean isMesmaLinhaIdaVolta, RelatorioResumoLinhasBean relatorioBean) throws SQLException {
		//Ida
		if (!isMesmaLinhaIdaVolta) {
			relatorioBean = new RelatorioResumoLinhasBean();
			relatorioBean.setINDSENTIDOIDA(rset.getInt("INDSENTIDOIDA"));
			relatorioBean.setRUTA_ID(rset.getBigDecimal("RUTA_ID"));
			relatorioBean.setNUMRUTA(rset.getString("NUMRUTA"));
			relatorioBean.setPREFIXO(rset.getString("PREFIXO"));
			relatorioBean.setDESCRUTA(rset.getString("DESCRUTA"));
			relatorioBean.setINTERESTADUAL(rset.getString("INTERESTADUAL"));
			relatorioBean.setGRUPO_LINHA(rset.getString("GRUPO_LINHA"));
			relatorioBean.setEXTENSAO_KM(rset.getBigDecimal("EXTENSAO_KM"));
			relatorioBean.setRECEITA_SEGURO(rset.getBigDecimal("RECEITA_SEGURO"));
			relatorioBean.setRECEITA_BAGAGEM(rset.getBigDecimal("RECEITA_BAGAGEM"));
			relatorioBean.setRECEITA_SEGURO_OUTROS(rset.getBigDecimal("RECEITA_SEGURO_OUTROS"));
			relatorioBean.setRECEITA_TARIFA(rset.getBigDecimal("RECEITA_TARIFA"));
			relatorioBean.setRECEITA_TARIFA_SEGURO(rset.getBigDecimal("RECEITA_SEGURO") !=null ? 
					rset.getBigDecimal("RECEITA_TARIFA").add(rset.getBigDecimal("RECEITA_SEGURO")) : rset.getBigDecimal("RECEITA_TARIFA") );
			relatorioBean.setRECEITA_PEDAGIO(rset.getBigDecimal("RECEITA_PEDAGIO"));
			relatorioBean.setRECEITA_EMBARQUE(rset.getBigDecimal("RECEITA_EMBARQUE"));
			relatorioBean.setPASSAGEIROS(rset.getBigDecimal("PASSAGEIROS"));
			relatorioBean.setVIAGENS_EXTRA(rset.getBigDecimal("VIAGENS_EXTRA"));
			relatorioBean.setVIAGENS(rset.getBigDecimal("VIAGENS"));
			relatorioBean.setCVE_CLASE_SERVICIO(rset.getString("CVE_CLASE_SERVICIO"));
			relatorioBean.setDESC_CLASE_SERVICIO(rset.getString("DESC_CLASE_SERVICIO"));
			relatorioBean.setRECEITA_TOTAL(rset.getBigDecimal("RECEITA_TOTAL"));
			relatorioBean.setVIAGENS_TOTAL(rset.getBigDecimal("VIAGENS_TOTAL"));
			relatorioBean.setKM_RODADO(rset.getBigDecimal("KM_RODADO"));
			relatorioBean.setPASSAGEIROS_EQUIVALENTE(rset.getBigDecimal("PASSAGEIROS_EQUIVALENTE"));
			relatorioBean.setPASSAGEIROS_MPA(rset.getBigDecimal("PASSAGEIROS_MPA"));
			relatorioBean.setPASSAGEIROS_MPE(rset.getBigDecimal("PASSAGEIROS_MPE"));
			relatorioBean.setRECEITA_KM(rset.getBigDecimal("RECEITA_KM"));
			relatorioBean.setRECEITA_VIAGEM(rset.getBigDecimal("RECEITA_VIAGEM"));
			relatorioBean.setPAX_KM(rset.getBigDecimal("PAX_KM"));
			relatorioBean.setPAX_OFERTADO(rset.getBigDecimal("PAX_OFERTADO"));
			relatorioBean.setASSENTOS(rset.getBigDecimal("ASSENTOS"));
		} else {
			//Volta
			relatorioBean.setRUTA_ID(rset.getBigDecimal("RUTA_ID"));
			relatorioBean.setNUMRUTA(relatorioBean.getNUMRUTA() + rset.getString("NUMRUTA"));
			relatorioBean.setPREFIXO(rset.getString("PREFIXO"));
			relatorioBean.setDESCRUTA(relatorioBean.getDESCRUTA());
			relatorioBean.setINTERESTADUAL(rset.getString("INTERESTADUAL"));
			relatorioBean.setGRUPO_LINHA(rset.getString("GRUPO_LINHA"));
			relatorioBean.setEXTENSAO_KM(relatorioBean.getEXTENSAO_KM().add(rset.getBigDecimal("EXTENSAO_KM")));
			relatorioBean.setRECEITA_SEGURO(relatorioBean.getRECEITA_SEGURO().add(rset.getBigDecimal("RECEITA_SEGURO")));
			relatorioBean.setRECEITA_BAGAGEM(relatorioBean.getRECEITA_BAGAGEM().add(rset.getBigDecimal("RECEITA_BAGAGEM")));
			relatorioBean.setRECEITA_SEGURO_OUTROS(relatorioBean.getRECEITA_SEGURO_OUTROS().add(rset.getBigDecimal("RECEITA_SEGURO_OUTROS")));
			relatorioBean.setRECEITA_TARIFA(relatorioBean.getRECEITA_TARIFA().add(rset.getBigDecimal("RECEITA_TARIFA")));
			if(relatorioBean.getRECEITA_TARIFA_SEGURO() !=null) {
				relatorioBean.setRECEITA_TARIFA_SEGURO(relatorioBean.getRECEITA_TARIFA_SEGURO().add(rset.getBigDecimal("RECEITA_TARIFA").add(rset.getBigDecimal("RECEITA_SEGURO"))));
			}else {
				relatorioBean.setRECEITA_TARIFA_SEGURO(relatorioBean.getRECEITA_TARIFA_SEGURO().add(rset.getBigDecimal("RECEITA_TARIFA")));
			}
			relatorioBean.setRECEITA_PEDAGIO(relatorioBean.getRECEITA_PEDAGIO().add(rset.getBigDecimal("RECEITA_PEDAGIO")));
			relatorioBean.setRECEITA_EMBARQUE(relatorioBean.getRECEITA_EMBARQUE().add(rset.getBigDecimal("RECEITA_EMBARQUE")));
			relatorioBean.setPASSAGEIROS(relatorioBean.getPASSAGEIROS().add(rset.getBigDecimal("PASSAGEIROS")));
			relatorioBean.setVIAGENS_EXTRA(relatorioBean.getVIAGENS_EXTRA().add(rset.getBigDecimal("VIAGENS_EXTRA")));
			relatorioBean.setVIAGENS(relatorioBean.getVIAGENS().add(rset.getBigDecimal("VIAGENS")));
			relatorioBean.setCVE_CLASE_SERVICIO(rset.getString("CVE_CLASE_SERVICIO"));
			relatorioBean.setDESC_CLASE_SERVICIO(rset.getString("DESC_CLASE_SERVICIO"));
			relatorioBean.setRECEITA_TOTAL(relatorioBean.getRECEITA_TOTAL().add(rset.getBigDecimal("RECEITA_TOTAL")));
			relatorioBean.setVIAGENS_TOTAL(relatorioBean.getVIAGENS_TOTAL().add(rset.getBigDecimal("VIAGENS_TOTAL")));
			relatorioBean.setKM_RODADO(relatorioBean.getKM_RODADO().add(rset.getBigDecimal("KM_RODADO")));
			relatorioBean.setPASSAGEIROS_EQUIVALENTE(relatorioBean.getPASSAGEIROS_EQUIVALENTE().add(rset.getBigDecimal("PASSAGEIROS_EQUIVALENTE")));
			relatorioBean.setPASSAGEIROS_MPA(relatorioBean.getPASSAGEIROS_MPA().add(rset.getBigDecimal("PASSAGEIROS_MPA")));
			relatorioBean.setPASSAGEIROS_MPE(relatorioBean.getPASSAGEIROS_MPE().add(rset.getBigDecimal("PASSAGEIROS_MPE")));
			relatorioBean.setRECEITA_KM(relatorioBean.getRECEITA_KM().add(rset.getBigDecimal("RECEITA_KM")));
			relatorioBean.setRECEITA_VIAGEM(relatorioBean.getRECEITA_VIAGEM().add(rset.getBigDecimal("RECEITA_VIAGEM")));
			relatorioBean.setPAX_KM(relatorioBean.getPAX_KM().add(rset.getBigDecimal("PAX_KM")));
			relatorioBean.setPAX_OFERTADO(relatorioBean.getPAX_OFERTADO().add(rset.getBigDecimal("PAX_OFERTADO")));
			relatorioBean.setASSENTOS(relatorioBean.getASSENTOS().add(rset.getBigDecimal("ASSENTOS")));
			
		}
		return relatorioBean;
	}
	
	private String buscarConstante(String nomeConstante) {
		ConstanteService constanteService = (ConstanteService) AppContext.getApplicationContext().getBean("constanteService");
		return constanteService.buscarPorNomeConstante(nomeConstante).getValorconstante();
	}
}
