package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioGratuidadeBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class RelatorioGratuidade extends Relatorio {
	
	private Integer orgaoConcedenteId;

	private List<RelatorioGratuidadeBean> lsDadosRelatorio;
	
	public RelatorioGratuidade(Map<String, Object> parametros, Connection conexao)  throws Exception {
		super(parametros, conexao);
		
		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();

				Map<String, Object> parametros = this.relatorio.getParametros();

				String fecInicioViagem = null;
				if (parametros.get("fecInicioViagem") != null) {
					fecInicioViagem = parametros.get("fecInicioViagem").toString() + " 00:00";
				}
				String fecFinalViagem = null;
				if (parametros.get("fecFinalViagem") != null) {
					fecFinalViagem = parametros.get("fecFinalViagem").toString() + " 23:59";
				}
				String fecInicioVenda = null;
				if (parametros.get("fecInicioVenda") != null) {
					fecInicioVenda = parametros.get("fecInicioVenda").toString() + " 00:00";
				}
				String fecFinalVenda = null;
				if (parametros.get("fecFinalVenda") != null) {
					fecFinalVenda = parametros.get("fecFinalVenda").toString() + " 23:59";
				}
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
				String agencia = parametros.get("agencia") != null ? parametros.get("agencia").toString() : "";
				String ruta = parametros.get("ruta") != null && !parametros.get("ruta").equals(-1) ? parametros.get("ruta").toString() : "";
				String origem = parametros.get("origem") != null ? parametros.get("origem").toString() : "";
				String destino = parametros.get("destino") != null ? parametros.get("destino").toString() : "";
				String categoria = parametros.get("categoria") != null ? parametros.get("categoria").toString() : "";
				orgaoConcedenteId = parametros.get("orgao_concedente_id") != null ? (Integer) parametros.get("orgao_concedente_id") : null;
				Integer mcAlteracaoPoltrona = (Integer) (parametros.get("mcAlteracaoPoltrona") != null ? parametros.get("mcAlteracaoPoltrona") : null);
						
				Boolean isApenasUltimaMovimentacaoBilhete =parametros.get("isApenasUltimaMovimentacaoBilhete")!=null ? (Boolean)parametros.get("isApenasUltimaMovimentacaoBilhete") : Boolean.FALSE;
				String sql = getSql(empresa, agencia, ruta, fecInicioViagem, fecFinalViagem, fecInicioVenda, fecFinalVenda, origem, destino, categoria, mcAlteracaoPoltrona, isApenasUltimaMovimentacaoBilhete);
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				if (fecInicioViagem != null) {
					stmt.setString("fecInicioViagem", fecInicioViagem);
				}
				if (fecFinalViagem != null) {
					stmt.setString("fecFinalViagem", fecFinalViagem);
				}
				if (fecInicioVenda != null) {
					stmt.setString("fecInicioVenda", fecInicioVenda);
				}
				if (fecFinalVenda != null) {
					stmt.setString("fecFinalVenda", fecFinalVenda);
				}
				if(empresa != null && !empresa.equals("")){
					stmt.setInt("empresa_id", Integer.parseInt(empresa));
				}
				if(agencia != null && !agencia.equals("")){
					stmt.setInt("puntoventa_id", Integer.parseInt(agencia));
				}
				if(ruta != null && !ruta.equals("")){
					stmt.setInt("ruta_id", Integer.parseInt(ruta));
				}
				if(StringUtils.isNotBlank(origem) && !origem.equals("-1")){
					stmt.setInt("origem_id", Integer.parseInt(origem));
				}
				if(StringUtils.isNotBlank(destino) && !origem.equals("-1")){
					stmt.setInt("destino_id", Integer.parseInt(destino));
				}
				if(orgaoConcedenteId != null && !orgaoConcedenteId.equals(-1)){
					stmt.setInt("orgao_concedente_id", orgaoConcedenteId);
				}
				if(mcAlteracaoPoltrona != null) {
					stmt.setInt("mcAlteracaoPoltrona", mcAlteracaoPoltrona);
				}
				stmt.setString("bpeEventoAlteracaoPoltrona", Constantes.BPE_ALTERACAO_POLTRONA);
				
				ResultSet rset = null;
		
				rset = stmt.executeQuery();
		
				lsDadosRelatorio = new ArrayList<RelatorioGratuidadeBean>();
				
				SimpleDateFormat hora = new SimpleDateFormat("HH:mm");
				SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");

				while (rset.next()) {
					RelatorioGratuidadeBean gratuidadeBean = new RelatorioGratuidadeBean();
					
					gratuidadeBean.setTarifa(rset.getBigDecimal("precio"));
					gratuidadeBean.setCcf(rset.getString("ccf"));
					gratuidadeBean.setCorridaId(rset.getString("corrida_id"));
					gratuidadeBean.setCveusuario(rset.getString("cveusuario"));
					gratuidadeBean.setDescnumdoc(rset.getString("descnumdoc"));
					gratuidadeBean.setDesctipoventa(rset.getString("desctipoventa"));
					gratuidadeBean.setDestino(rset.getString("destino"));
					gratuidadeBean.setFeccreacion(rset.getDate("feccreacion"));
					gratuidadeBean.setFecdatviaje(rset.getTimestamp("fechorviaje") != null ? data.format(rset.getTimestamp("fechorviaje")) : "");
					gratuidadeBean.setFechorviaje(rset.getTimestamp("fechorviaje") != null ? hora.format(rset.getTimestamp("fechorviaje")) : "");
					gratuidadeBean.setKm(rset.getInt("numkmviaje"));
					gratuidadeBean.setPrefixo(rset.getString("prefixo"));
					gratuidadeBean.setLinha(rset.getString("descruta"));
					gratuidadeBean.setNombpasajero(rset.getString("nombpasajero"));
					gratuidadeBean.setNombpuntoventa(rset.getString("nombpuntoventa"));
					gratuidadeBean.setOrigen(rset.getString("origen"));
					gratuidadeBean.setPorccategoria(rset.getBigDecimal("porccategoria"));
					gratuidadeBean.setPreciooriginal(rset.getBigDecimal("preciooriginal"));
					gratuidadeBean.setPreciopagado(rset.getBigDecimal("preciopagado"));
					gratuidadeBean.setPreciopagadoVendido(rset.getBigDecimal("preciopagadovendido"));					
					gratuidadeBean.setDesctelefono(rset.getString("desctelefono"));
					gratuidadeBean.setNombempresa(rset.getString("nombempresa"));
					gratuidadeBean.setCvecategoria(rset.getString("cvecategoria"));
					gratuidadeBean.setNumasiento(rset.getString("numasiento"));
					gratuidadeBean.setDescorigen(rset.getString("descorigen"));
					gratuidadeBean.setDescdestino(rset.getString("descdestino"));
					gratuidadeBean.setNumfoliosistema(rset.getString("numfoliosistema"));

					gratuidadeBean.setTipoDoc(rset.getString("desctipodoc"));
					gratuidadeBean.setTipo(rset.getString("desccategoria"));
					gratuidadeBean.setSeguro(rset.getBigDecimal("importeseguro"));
					gratuidadeBean.setPedagio(rset.getBigDecimal("importepedagio"));
					gratuidadeBean.setUtr(rset.getBigDecimal("importetaxaembarque"));
					gratuidadeBean.setRg(rset.getString("DESCNUMDOC"));
					gratuidadeBean.setStatus(rset.getString("INDSTATUSBOLETO"));
					gratuidadeBean.setCodOrigem(rset.getString("codOrigem"));
					gratuidadeBean.setCodDestino(rset.getString("codDestino"));
					gratuidadeBean.setDescorgao(rset.getString("descorgao"));
					gratuidadeBean.setChbpe(rset.getString("chbpe"));

					lsDadosRelatorio.add(gratuidadeBean);
				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}
	
	public void setLsDadosRelatorio(List<RelatorioGratuidadeBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	private String getSql(String empresa, String agencia, String ruta, String fecInicioViagem, String fecFinalViagem, String fecInicioVenda, String fecFinalVenda, String origem, String destino, String categoria, Integer mcAlteracaoPoltrona, Boolean isApenasUltimaMovimentacaoBilhete) {
		
		
		StringBuilder sb = new StringBuilder();
	

		sb.append("SELECT * ");
		sb.append(" FROM ");
		sb.append(" (SELECT ");
		//a ordem teve de ser alteradao para o group by funcionar corretamente
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" b.numasiento,");			
		}
		sb.append(" b.boletooriginal_id, ");
		sb.append(" b.boleto_id,");
		sb.append(" b.ccf,");
		sb.append(" og.descorgao,");
		sb.append(" b.feccreacion,");
		sb.append(" ori.cveparada origen,");
		sb.append(" des.cveparada destino,");
		sb.append(" ori.descparada descorigen,");
		sb.append(" des.descparada descdestino,");
		sb.append(" b.numkmviaje,");
		sb.append(" r.prefixo,");
		sb.append(" r.descruta,");
		sb.append(" b.corrida_id,");
		sb.append(" b.fechorviaje,");
		//a ordem teve de ser alteradao para o group by funcionar corretamente
		if(!isApenasUltimaMovimentacaoBilhete) {
			sb.append(" b.numasiento,");			
		}
		sb.append(" b.numfoliosistema,");
		sb.append(" case when b.tipoventa_id in(5,12,18,41,49)  then 'PTA' else tv.desctipoventa end as desctipoventa, ");
		sb.append(" b.nombpasajero,");
		sb.append(" b.descnumdoc,");
		sb.append(" tar.preciooriginal,");
		sb.append(" tar.precio,");
		sb.append(" case when b.PRECIOBASE > 0 then TRUNC(((100 - (b.PRECIOPAGADO * 100) / b.PRECIOBASE)),2) else 0 end as porccategoria, ");
		sb.append(" (select sum(bfpv.importe) from boleto_formapago bfpv where bfpv.boleto_id = b.boleto_id and bfpv.activo = 1) as preciopagado, ");
        sb.append(" nvl((select sum(bfpv.importe) from boleto_formapago bfpv where bfpv.boleto_id = b.boleto_id and bfpv.activo = 1 and b.indstatusboleto = 'V'),0) AS preciopagadovendido, ");        
		sb.append(" u.cveusuario,");
		sb.append(" ag.nombpuntoventa,");
		sb.append(" b.desctelefono,");
		sb.append(" e.nombempresa,");
		sb.append(" ca.cvecategoria,");
		sb.append(" b.desctipodoc,");
		sb.append(" ca.desccategoria,");
		sb.append(" b.importepedagio,");
		sb.append(" b.importeseguro,");
		sb.append(" b.importetaxaembarque, ");
		sb.append(" case ");
		sb.append(" when b.motivocancelacion_id = 11 ");
		sb.append(" and b.indcancelacion = 0 then 'RESERVA' ");
		sb.append(" when b.motivocancelacion_id = 9 then 'CONFIRMA RESERVA' ");
		sb.append(" when b.motivocancelacion_id = 11 ");
		sb.append(" and b.indcancelacion = 1 then 'LIBERA.RESERVA' ");
		sb.append(" when b.motivocancelacion_id = 12 then 'LIBERA.RESERVA AUTO' ");
		sb.append(" when b.indreimpresion = 1 and b.motivoreimpresion_id = 99 then 'REIMPRESSO' ");
		sb.append(" else b.indstatusboleto ");
		sb.append(" end as indstatusboleto, ");
		sb.append(" ori.cveparada codorigem,");
		sb.append(" des.cveparada coddestino,");
		sb.append(" bpe.chbpe chbpe ");
		sb.append("   FROM boleto b");
		sb.append("   JOIN categoria ca ON b.categoria_id = ca.categoria_id");
		sb.append("   JOIN parada ori ON ori.parada_id = b.origen_id");
		sb.append("   JOIN parada des ON des.parada_id = b.destino_id");
		sb.append("   JOIN ruta r ON r.ruta_id = b.ruta_id");
		sb.append("   JOIN tipo_venta tv ON tv.tipoventa_id = b.tipoventa_id");
		sb.append("   JOIN punto_venta ag ON ag.puntoventa_id = b.puntoventa_id");
		sb.append("   JOIN usuario u ON u.usuario_id = b.usuario_id");
		sb.append("   LEFT JOIN vigencia_tarifa vt ON b.fechorventa BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia and vt.activo = 1");
		sb.append("   LEFT JOIN tarifa tar ON (tar.ruta_id = b.ruta_id");
		sb.append("   AND tar.marca_id = b.marca_id");
		sb.append("   AND tar.claseservicio_id = b.claseservicio_id");
		sb.append("   AND tar.vigenciatarifa_id = vt.vigenciatarifa_id");
		sb.append("   AND tar.origen_id = b.origen_id");
		sb.append("   AND tar.destino_id = b.destino_id and tar.activo = 1)");
		sb.append("   JOIN marca m on m.marca_id = b.marca_id");
		sb.append("   JOIN empresa e on e.empresa_id = m.empresa_id");
		sb.append("   JOIN orgao_concedente og ON og.orgaoconcedente_id = r.orgaoconcedente_id");
		sb.append("   LEFT JOIN bpe bpe on bpe.boleto_id = b.boleto_id ");
		sb.append("   WHERE 1=1  and b.tipoventa_id = 15");
		sb.append("   AND b.indstatusboleto = 'S' ");
		
		if (fecInicioViagem != null && fecFinalViagem != null) {
			sb.append(" AND b.feccorrida BETWEEN TO_DATE(:fecInicioViagem,'dd/mm/yyyy hh24:mi') AND TO_DATE(:fecFinalViagem,'dd/mm/yyyy hh24:mi') ");
		}
		if (fecInicioVenda != null && fecFinalVenda != null) {
			sb.append(" AND b.fechorventa BETWEEN TO_DATE(:fecInicioVenda,'dd/mm/yyyy hh24:mi') AND TO_DATE(:fecFinalVenda,'dd/mm/yyyy hh24:mi') ");
		}		
		
		if (!empresa.isEmpty()){
			sb.append("AND e.empresa_id = :empresa_id  ");
		}
		if (!agencia.isEmpty() && !agencia.equals("-1")){
			sb.append("       AND b.puntoventa_id = :puntoventa_id  ");
		}
		if (!ruta.isEmpty() && !ruta.equals("-1")){
			sb.append("       AND b.ruta_id = :ruta_id  ");
		}
		if(!origem.isEmpty() && !origem.equals("-1")){
			sb.append("       AND ori.parada_id = :origem_id   ");
		}
		if(!destino.isEmpty() && !destino.equals("-1")){
			sb.append("       AND des.parada_id = :destino_id   ");
		}
		if(!categoria.isEmpty()){
			sb.append("       AND ca.categoria_id in ("+ categoria +") ");
		}
		if(orgaoConcedenteId != null && !orgaoConcedenteId.equals(-1)){
			sb.append("       AND r.orgaoconcedente_id = :orgao_concedente_id  ");
		}
		sb.append("   ");
		sb.append("   UNION ALL ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" select distinct c.numasiento as numasiento,  q2.* from   ");
			sb.append(" (   ");
			
		}
		sb.append(" select  ");
		sb.append("    transacaooriginal_id, ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(transacao_id) as transacao_id, ");
		}else {
			sb.append(" transacao_id, ");
		}
		
		sb.append(" ccf, ");
		sb.append(" descorgao,");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(feccreacion), ");
		}else {
			sb.append(" feccreacion, ");
		}
		sb.append(" origen, ");
		sb.append(" destino, ");
		sb.append(" descorigen, ");
		sb.append(" descdestino, ");
		sb.append(" numkmviaje, ");
		sb.append(" prefixo, ");
		sb.append(" descruta, ");
		sb.append(" corrida_id, ");
		sb.append(" fechorviaje, ");
		if(!isApenasUltimaMovimentacaoBilhete) {
			sb.append(" numasiento, ");			
		}
		sb.append(" numfoliosistema, ");
		if(!isApenasUltimaMovimentacaoBilhete) {
			sb.append(" desctipoventa, ");
		}else {
			sb.append(" min(desctipoventa), ");
		}
		sb.append(" nombpasajero, ");
		sb.append(" descnumdoc, ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(preciooriginal), ");
		}else {
			sb.append(" preciooriginal, ");
		}
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(precio), ");
		}else {
			sb.append(" precio, ");
		}
		sb.append(" porccategoria, ");
		sb.append(" preciopagado, ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(preciopagadovendido), ");
		}else {
			sb.append(" preciopagadovendido, ");
		}
		sb.append(" cveusuario, ");
		sb.append(" nombpuntoventa, ");
		sb.append(" desctelefono, ");
		sb.append(" nombempresa, ");
		sb.append(" cvecategoria, ");
		sb.append(" desctipodoc, ");
		sb.append(" desccategoria, ");
		sb.append(" importepedagio, ");
		sb.append(" importeseguro, ");
		sb.append(" importetaxaembarque, ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" min(indstatusboleto), ");
		}else {
			sb.append(" indstatusboleto, ");
		}
		sb.append(" codorigem, ");
		sb.append(" coddestino, ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" max(chbpe) ");
		}else {
			sb.append(" chbpe ");			
		}
		sb.append(" ");
		sb.append(" from  ");
		sb.append("(   ");
		sb.append("   SELECT c.transacaooriginal_id, c.transacao_id,");
		sb.append(" c.ccf,");
		sb.append(" og.descorgao,");
		sb.append(" c.feccreacion,");
		sb.append(" ori.cveparada origen,");
		sb.append(" des.cveparada destino,");
		sb.append(" ori.descparada descorigen,");
		sb.append(" des.descparada descdestino,");
		sb.append(" c.numkmviaje,");
		sb.append(" r.prefixo,");
		sb.append(" r.descruta,");
		sb.append(" c.corrida_id,");
		sb.append(" c.fechorviaje,");
		if(!isApenasUltimaMovimentacaoBilhete) {
			sb.append(" c.numasiento,");			
		}
		sb.append(" c.numfoliosistema,");
		sb.append(" case when c.numfoliopreimpreso is null then 'PTA' when c.tipoventa_id = '81' then 'VENDA DE TRANSFERENCIA'  when c.tipoventa_id = '82' then 'CONFIRM.VEND.ABERTO'  when c.tipoventa_id = '8' then 'TROCA' else tv.desctipoventa end as desctipoventa, ");
		sb.append(" c.nombpasajero,");
		sb.append(" c.descnumdoc,");
		sb.append(" tar.preciooriginal,");
		sb.append(" tar.precio,");
		sb.append(" case when c.PRECIOBASE > 0 then TRUNC(((100 - (c.PRECIOPAGADO * 100) / c.PRECIOBASE)),2) else 0 end as  porccategoria, ");
		sb.append("	(select sum(cfpv.importe) from caja_formapago cfpv where cfpv.caja_id = c.caja_id and cfpv.activo = 1) as preciopagado, ");
		sb.append(" nvl((select sum(cfpv.importe) from caja_formapago cfpv where cfpv.caja_id = c.caja_id and cfpv.activo = 1 and c.indstatusboleto = 'V'), 0) as preciopagadovendido, ");
		sb.append(" u.cveusuario,");
		sb.append(" ag.nombpuntoventa,");
		sb.append(" c.desctelefono,");
		sb.append(" e.nombempresa,");
		sb.append(" ca.cvecategoria,");
		sb.append(" c.desctipodoc,");
		sb.append(" ca.desccategoria,");
		sb.append(" c.importepedagio,");
		sb.append(" c.importeseguro,");
		sb.append(" c.importetaxaembarque,");
		sb.append(" case when c.indstatusboleto = 'V' then 'VENDIDO' ");
		sb.append(" when c.indstatusboleto = 'C' and c.motivocancelacion_id = 31 then 'CANCELADO' ");
		sb.append(" when c.indstatusboleto = 'C' and c.motivocancelacion_id = 32 then 'DEVOLVIDO' ");
		sb.append(" when c.indstatusboleto = 'C' and c.motivocancelacion_id = 37 then 'CANCEC. EMERG' ");
		sb.append(" when c.indstatusboleto = 'E' and c.indreimpresion = 1 then  'ENTREGUE' ");
		sb.append(" when (c.indstatusboleto = 'T' and c.tipoventa_id = 8) ");
		sb.append(" or (c.indstatusboleto = 'T' and c.tipoventa_id not in (81,41,82) and ct.cambiotitularidad_id is null and (bpe.tipoevento is null or bpe.tipoevento <> :bpeEventoAlteracaoPoltrona)) ");
		sb.append(" or (c.indstatusboleto = 'T' and c.motivocancelacion_id is null and c.tipoventa_id = 8 and (bpe.tipoevento is null or bpe.tipoevento <> :bpeEventoAlteracaoPoltrona))  ");
		sb.append(" then 'TROCA' ");
		sb.append(" when c.indstatusboleto = 'T' and c.motivocancelacion_id is null and bpe.tipoevento = :bpeEventoAlteracaoPoltrona then 'TROCA POLTRONA' ");
		sb.append(" when c.indstatusboleto = 'T'  and c.tipoventa_id = 81 then 'TRANSFERÊNCIA' " );
		sb.append(" when c.indstatusboleto = 'T'  and c.tipoventa_id = 82 then 'CONFIRM.ABERTO' " );
		sb.append(" when c.indstatusboleto = 'C'  and c.motivocancelacion_id = 10 then 'TROCA PASSAGEM' " );
		
		if(mcAlteracaoPoltrona != null) {
			sb.append(" when c.indstatusboleto = 'C' and c.indreimpresion = 1 and c.motivocancelacion_id = :mcAlteracaoPoltrona then  'POLTRONA ALTERADA' ");
		}
		
		sb.append(" when c.indstatusboleto = 'C' and c.motivocancelacion_id = 27 then 'NO-SHOW' ");
		sb.append(" when ct.cambiotitularidad_id is not null then 'TROCA TITULARIDADE' ");
		sb.append(" when c.indstatusboleto = 'C' and c.motivocancelacion_id = 23 then 'TRANSFERIDO' ");
		sb.append(" when c.indstatusboleto = 'T' and c.tipoventa_id = 41  then 'CHECKIN REATIVADO' ");
		sb.append(" when c.indreimpresion = 1 and c.motivoreimpresion_id = 99 then 'REIMPRESSO' ");
		sb.append(" end as indstatusboleto,");
		sb.append(" ori.cveparada codorigem,");
		sb.append(" des.cveparada coddestino,");
		sb.append(" bpe.chbpe chbpe ");
		sb.append("   FROM caja c");
		sb.append("   JOIN categoria ca ON c.categoria_id = ca.categoria_id");
		sb.append("   JOIN parada ori ON ori.parada_id = c.origen_id");
		sb.append("   JOIN parada des ON des.parada_id = c.destino_id");
		sb.append("   JOIN ruta r ON r.ruta_id = c.ruta_id");
		sb.append("   JOIN tipo_venta tv ON tv.tipoventa_id = c.tipoventa_id");
		sb.append("   JOIN punto_venta ag ON ag.puntoventa_id = c.puntoventa_id");
		sb.append("   JOIN usuario u ON u.usuario_id = c.usuario_id");
		sb.append("   LEFT JOIN vigencia_tarifa vt ON c.fechorventa BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia and vt.activo = 1 ");
		sb.append("   LEFT JOIN tarifa tar ON (tar.ruta_id = c.ruta_id");
		sb.append("   AND tar.marca_id = c.marca_id");
		sb.append("   AND tar.claseservicio_id = c.claseservicio_id");
		sb.append("   AND tar.vigenciatarifa_id = vt.vigenciatarifa_id");
		sb.append("   AND tar.origen_id = c.origen_id");
		sb.append("   AND tar.destino_id = c.destino_id and tar.activo = 1)");
		sb.append("   JOIN marca m on m.marca_id = c.marca_id");
		sb.append("   JOIN empresa e on e.empresa_id = m.empresa_id");
		sb.append("   JOIN orgao_concedente og ON og.orgaoconcedente_id = r.orgaoconcedente_id");
		sb.append("   LEFT JOIN bpe bpe on bpe.boleto_id = c.transacao_id ");
		sb.append("   LEFT JOIN cambio_titularidad ct on ct.boleto_id = c.transacao_id ");
		sb.append("   WHERE 1=1  ");
		sb.append("   and c.motivoreimpresion_id is null ");
		sb.append("   and (c.motivocancelacion_id IN (");
		sb.append(carregarMotivosCancelacion(mcAlteracaoPoltrona));
		sb.append(") OR c.motivocancelacion_id IS NULL) ");
		
		sb.append(" AND (c.indreimpresion = 0 ");
		sb.append(" 	 OR (c.indstatusboleto IN ('E','T') AND c.indreimpresion = 1) ");
		sb.append(" 	 OR (c.indstatusboleto = 'C' AND c.motivocancelacion_id = 27) ");
		sb.append(" 	 OR (c.indstatusboleto = 'C' AND c.motivocancelacion_id = 23) ");
		if(mcAlteracaoPoltrona != null) {
			sb.append("  OR (c.indstatusboleto = 'C' AND c.indreimpresion = 1 AND c.motivocancelacion_id = :mcAlteracaoPoltrona) ");
		}
		sb.append(" ) ");
		
		if (fecInicioViagem != null && fecFinalViagem != null) {
			sb.append(" AND c.feccorrida BETWEEN TO_DATE(:fecInicioViagem,'dd/mm/yyyy hh24:mi') AND TO_DATE(:fecFinalViagem,'dd/mm/yyyy hh24:mi') ");
		}
		if (fecInicioVenda != null && fecFinalVenda != null) {
			sb.append(" AND c.fechorventa BETWEEN TO_DATE(:fecInicioVenda,'dd/mm/yyyy hh24:mi') AND TO_DATE(:fecFinalVenda,'dd/mm/yyyy hh24:mi') ");
		}
		if (!empresa.isEmpty()){
			sb.append("AND e.empresa_id = :empresa_id  ");
		}
		if (!agencia.isEmpty() && !agencia.equals("-1")){
			sb.append("AND c.puntoventa_id = :puntoventa_id  ");
		}
		if (!ruta.isEmpty() && !ruta.equals("-1")){
			sb.append("AND c.ruta_id = :ruta_id  ");
		}
		if(!origem.isEmpty() && !origem.equals("-1")){
			sb.append("AND ori.parada_id = :origem_id   ");
		}
		if(!destino.isEmpty() && !destino.equals("-1")){
			sb.append("AND des.parada_id = :destino_id   ");
		}
		if(!categoria.isEmpty()){
			sb.append("AND ca.categoria_id in ("+ categoria +") ");
		}
		if(orgaoConcedenteId != null && !orgaoConcedenteId.equals(-1)){
			sb.append("AND r.orgaoconcedente_id = :orgao_concedente_id  ");
		}
		sb.append("ORDER BY 5,15");
		sb.append(") q1");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append(" group by ");
			sb.append(" transacaooriginal_id,");
			sb.append(" ccf, ");
			sb.append("     descorgao, ");
			sb.append(" origen, ");
			sb.append(" destino, ");
			sb.append(" descorigen, ");
			sb.append(" descdestino, ");
			sb.append(" numkmviaje, ");
			sb.append(" prefixo, ");
			sb.append(" descruta, ");
			sb.append(" corrida_id, ");
			sb.append(" fechorviaje, ");
			sb.append(" numfoliosistema, ");
			sb.append(" nombpasajero, ");
			sb.append(" descnumdoc, ");
			sb.append(" porccategoria, ");
			sb.append("     preciopagado, ");
			sb.append(" cveusuario, ");
			sb.append(" nombpuntoventa, ");
			sb.append(" desctelefono, ");
			sb.append(" nombempresa, ");
			sb.append(" cvecategoria, ");
			sb.append(" desctipodoc, ");
			sb.append(" desccategoria, ");
			sb.append(" importepedagio, ");
			sb.append(" importeseguro, ");
			sb.append(" importetaxaembarque, ");
			sb.append(" codorigem, ");
			sb.append(" coddestino ");
			sb.append(" )q2 , caja c where q2.transacao_id=c.transacao_id ");
		}else {
			sb.append(" ");
		}
		sb.append(") ");
		if(isApenasUltimaMovimentacaoBilhete) {
			sb.append("ORDER BY 15");
		}else{
			sb.append("ORDER BY 5,15");
		}
		return sb.toString();
	}
	
	public String carregarMotivosCancelacion(Integer mcAlteracaoPoltrona) {
		List<Integer> motivosCancelacion = new ArrayList<Integer>();
		motivosCancelacion.add(31);
		motivosCancelacion.add(32);
		motivosCancelacion.add(37);
		motivosCancelacion.add(10);
		motivosCancelacion.add(27);
		motivosCancelacion.add(23);
		
		if(mcAlteracaoPoltrona != null) {
			motivosCancelacion.add(mcAlteracaoPoltrona);
		}
		
		return motivosCancelacion.toString().replaceAll("[\\[\\]]", "");
	}
}