package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasPTA.SituacaoBoleto;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasInternetPTABean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioVendasInternetPTA extends Relatorio {

	public RelatorioVendasInternetPTA(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);
	}

	private List<RelatorioVendasInternetPTABean> lsDadosRelatorio;

	@Override
	protected void processaParametros() throws Exception {

		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();

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

				String dataInicial = parametros.get("DATA_INICIAL").toString() + " 00:00:00";
				String dataFinal = parametros.get("DATA_FINAL").toString() + " 23:59:59";
				Empresa empresa = (Empresa) parametros.get("EMPRESA");
				String agencia = (String) parametros.get("PUNTOVENTA");
				SituacaoBoleto situacaoBoleto = (SituacaoBoleto) parametros.get("SITUACAO_BOLETO");

				String sql = getSql(empresa, agencia, dataInicial, dataFinal, situacaoBoleto);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				stmt.setTimestamp("DATA_INICIAL", (Timestamp) parametros.get("DATA_INICIAL"));
				stmt.setTimestamp("DATA_FINAL", (Timestamp) parametros.get("DATA_FINAL"));

				ResultSet rset = null;
				rset = stmt.executeQuery();

				lsDadosRelatorio = new ArrayList<RelatorioVendasInternetPTABean>();
				BigDecimal saldo = BigDecimal.ZERO;
				BigDecimal total = BigDecimal.ZERO;

				while (rset.next()) {

					RelatorioVendasInternetPTABean vendasPTABean = new RelatorioVendasInternetPTABean();

					vendasPTABean.setPreco((BigDecimal) rset.getObject("preco"));
					vendasPTABean.setTaxas((BigDecimal) rset.getObject("taxas"));
					vendasPTABean.setBilhete((String) rset.getObject("bilhete"));
					vendasPTABean.setNomeAgenciaVenda((String) rset.getObject("nomeAgenciaVenda"));
					vendasPTABean.setAgencia((String) rset.getObject("agencia"));
					vendasPTABean.setStatus((String) rset.getObject("status"));
					vendasPTABean.setIndStatusBoleto((String) rset.getObject("indStatusBoleto"));
					vendasPTABean.setServico((BigDecimal) rset.getObject("servico"));
					vendasPTABean.setPoltrona((String) rset.getObject("poltrona"));
					vendasPTABean.setDescricaoLinha((String) rset.getObject("descricaoLinha"));
					vendasPTABean.setDescricaoOrigem((String) rset.getObject("descricaoOrigem"));
					vendasPTABean.setDescricaoDestino((String) rset.getObject("descricaoDestino"));
					vendasPTABean.setDataEmbarque((Date) rset.getObject("dataEmbarque"));
					vendasPTABean.setDataEmissao((Date) rset.getObject("dataEmissao"));
					vendasPTABean.setDataVenda((Date) rset.getObject("dataVenda"));
					vendasPTABean.setTipoVenta((String) rset.getObject("tipoVenta"));

					if (vendasPTABean.getStatus().equals("VENDIDO")) {
						if (vendasPTABean.getIndStatusBoleto() != null) {
							if (vendasPTABean.getIndStatusBoleto().equals("V")) {
								vendasPTABean.setSituacaoVendido("V");
							} else if (vendasPTABean.getIndStatusBoleto().equals("E")) {
								vendasPTABean.setSituacaoVendido("E");
							}
						} else {
							vendasPTABean.setSituacaoVendido("V");
						}
						saldo = saldo.add(vendasPTABean.getPreco() != null ? vendasPTABean.getPreco() : BigDecimal.ZERO);
					} else {
						BigDecimal situacao = (BigDecimal) rset.getObject("situacaoCancelado");
						if (situacao != null) {
							vendasPTABean.setSituacaoCancelado(situacao.toString());
							if (vendasPTABean.getSituacaoCancelado().equals("31")) {
								vendasPTABean.setSituacaoCancelado("A");
							} else if (vendasPTABean.getSituacaoCancelado().equals("32")) {
								vendasPTABean.setSituacaoCancelado("D");
							} else if (vendasPTABean.getSituacaoCancelado().equals("23")) {
								vendasPTABean.setSituacaoCancelado("R");
							} else if (vendasPTABean.getSituacaoCancelado().equals("10")) {
								vendasPTABean.setSituacaoCancelado("TP");
							}
						}

						total = total.add(vendasPTABean.getPreco() != null ? vendasPTABean.getPreco() : BigDecimal.ZERO);
					}

					lsDadosRelatorio.add(vendasPTABean);
				}

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
					parametros.put("SALDO", saldo.subtract(total));
					parametros.put("TOTAL", total);
				}
			}
		});
	}

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

	private String getSql(Empresa empresa, String agencia, String fecInicio, String fecFinal, SituacaoBoleto situacaoBoleto) {

		StringBuilder sql = new StringBuilder();
		String motivoCancelacion = "";

		if (situacaoBoleto.getCodigo().equals(31)) {
			motivoCancelacion = "31";
		} else if (situacaoBoleto.getCodigo().equals(32)) {
			motivoCancelacion = "32";
		} else if (situacaoBoleto.getCodigo().equals(23)) {
			motivoCancelacion = "23";
		} else if (situacaoBoleto.getCodigo().equals(10)) {
			motivoCancelacion = "10";
		} else {
			motivoCancelacion = "31, 32, 23, 10";
		}

		if (situacaoBoleto.getCodigo().equals(1)) { // Somente Vendidos
			sql.append("select * from ( SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'VENDIDO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA'  END tipoVenta, ");
			sql.append("       pv.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pe.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       original.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       utilizado.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       UTILIZADO.FECCREACION AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOPAGADO AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("LEFT JOIN BOLETO UTILIZADO ON (original.boleto_id = UTILIZADO.boletooriginal_id AND utilizado.INDSTATUSBOLETO = 'E') ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pe on(UTILIZADO.PUNTOVENTA_ID = pe.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(ORIGINAL.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('V','T') ");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND ORIGINAL.PUNTOVENTA_ID in (" + agencia + ") ");
			sql.append("AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " ");
			sql.append(") tab order by tab.tipoVenta, tab.status ");
		} else if (situacaoBoleto.getCodigo().equals(-1)) { // Todos (Vendidos e Cancelados)

			sql.append("select * from ( SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'VENDIDO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA' END tipoVenta, ");
			sql.append("       pv.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pe.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       original.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       utilizado.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       UTILIZADO.FECCREACION AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOPAGADO AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("LEFT JOIN BOLETO UTILIZADO ON (original.boleto_id = UTILIZADO.boletooriginal_id AND utilizado.INDSTATUSBOLETO = 'E') ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pe on(UTILIZADO.PUNTOVENTA_ID = pe.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(ORIGINAL.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('V','T') ");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND ORIGINAL.PUNTOVENTA_ID in (" + agencia + ") ");
			sql.append("AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " ");
			sql.append("UNION ALL ");
			sql.append("SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'CANCELADO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA' END tipoVenta, ");
			sql.append("       pc.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pv.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       ORIGINAL.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOPAGADO AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("LEFT JOIN BOLETO UTILIZADO ON (ORIGINAL.BOLETOoriginal_ID = UTILIZADO.BOLETO_ID AND UTILIZADO.INDSTATUSBOLETO IN ('V','T')) ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pc on(UTILIZADO.PUNTOVENTA_ID = pc.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(original.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('C')  AND ORIGINAL.MOTIVOCANCELACION_ID in (" + motivoCancelacion + ") ");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND (utilizado.PUNTOVENTA_ID in (" + agencia + "))  AND ORIGINAL.MOTIVOCANCELACION_ID IN ( " + motivoCancelacion + ") ");

			sql.append("AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " ");
			sql.append(") tab order by tab.tipoVenta, tab.status ");

		} else if (situacaoBoleto.getCodigo().equals(2)) { // Entregue

			sql.append("select * from ( SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'VENDIDO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA' END tipoVenta, ");
			sql.append("       pv.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pe.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       original.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       utilizado.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       UTILIZADO.FECCREACION AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOPAGADO AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("INNER JOIN BOLETO UTILIZADO ON (original.boleto_id = UTILIZADO.boletooriginal_id AND utilizado.INDSTATUSBOLETO = 'E') ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pe on(UTILIZADO.PUNTOVENTA_ID = pe.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(ORIGINAL.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('V','T') ");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND ORIGINAL.PUNTOVENTA_ID in (" + agencia + ") ");
			sql.append("AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " ");
			sql.append(") tab order by tab.tipoVenta, tab.status ");

		} else if (situacaoBoleto.getCodigo().equals(3)) { // Não Entregue

			sql.append("select * from ( SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'VENDIDO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA' END tipoVenta, ");
			sql.append("       pv.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pe.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       original.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       utilizado.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       UTILIZADO.FECCREACION AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOPAGADO AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("LEFT JOIN BOLETO UTILIZADO ON (original.boleto_id = UTILIZADO.boletooriginal_id AND utilizado.INDSTATUSBOLETO = 'E') ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pe on(UTILIZADO.PUNTOVENTA_ID = pe.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(ORIGINAL.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('V','T') ");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND ORIGINAL.PUNTOVENTA_ID in (" + agencia + ") ");
			sql.append("AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " AND utilizado.INDSTATUSBOLETO IS NULL");
			sql.append(") tab order by tab.tipoVenta, tab.status ");

		} else { // somente cancelados

			sql.append("select * from (  SELECT ORIGINAL.BOLETO_ID, ");
			sql.append("       'CANCELADO' AS status, ");
			sql.append("       UTILIZADO.INDSTATUSBOLETO as indStatusBoleto, ");
			sql.append("       case when ORIGINAL.tipoventa_id = 12 then 'INTERNET' WHEN ORIGINAL.tipoventa_id in(5,18,41,49,81)  then 'PTA' END tipoVenta, ");
			sql.append("       pc.NOMBPUNTOVENTA AS nomeAgenciaVenda, ");
			sql.append("       pv.NOMBPUNTOVENTA AS agencia, ");
			sql.append("       ORIGINAL.NUMFOLIOSISTEMA AS bilhete, ");
			sql.append("       original.CORRIDA_ID AS servico, ");
			sql.append("       original.NUMASIENTO AS poltrona, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID AS situacaoCancelado, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataEmissao, ");
			sql.append("       ORIGINAL.FECHORVIAJE AS dataEmbarque, ");
			sql.append("       ORIGINAL.MOTIVOCANCELACION_ID, ");
			sql.append("       ORIGINAL.PRECIOBASE AS preco, ");
			sql.append("       ORIGINAL.FECHORVENTA AS dataVenda, ");
			sql.append("       ORIGINAL.IMPORTEPEDAGIO + original.IMPORTESEGURO + original.IMPORTETAXAEMBARQUE + original.IMPORTEOUTROS AS taxas, ");
			sql.append("       r.DESCRUTA AS descricaoLinha, ");
			sql.append("       po.DESCPARADA AS descricaoOrigem, ");
			sql.append("       pd.DESCPARADA AS descricaoDestino ");
			sql.append("FROM BOLETO ORIGINAL ");
			sql.append("LEFT JOIN BOLETO UTILIZADO ON (ORIGINAL.BOLETOoriginal_ID = UTILIZADO.BOLETO_ID AND UTILIZADO.INDSTATUSBOLETO IN ('V','T')) ");
			sql.append("LEFT JOIN PUNTO_VENTA pv on(ORIGINAL.PUNTOVENTA_ID = pv.PUNTOVENTA_ID) ");
			sql.append("LEFT JOIN PUNTO_VENTA pc on(UTILIZADO.PUNTOVENTA_ID = pc.PUNTOVENTA_ID) ");
			sql.append("INNER JOIN RUTA r on(original.ruta_id = r.ruta_id) ");
			sql.append("INNER JOIN PARADA po ON (ORIGINAL.ORIGEN_ID = po.PARADA_ID) ");
			sql.append("INNER JOIN PARADA pd ON (ORIGINAL.DESTINO_ID = pd.PARADA_ID) ");
			sql.append("WHERE to_date(original.FECHORVENTA,'dd/MM/yy') BETWEEN :DATA_INICIAL AND :DATA_FINAL ");
			sql.append("  AND ORIGINAL.INDSTATUSBOLETO IN('C')  AND ORIGINAL.MOTIVOCANCELACION_ID in (" + motivoCancelacion + ")");
			sql.append("  AND ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49,81) ");
			sql.append(" AND ORIGINAL.EMPRESACORRIDA_ID =" + empresa.getEmpresaId() + " ");
			sql.append(agencia.equals("-1") || agencia.equals("TODAS") ? "" : "  AND (utilizado.PUNTOVENTA_ID in (" + agencia + ")) ");
			sql.append(") tab order by tab.tipoVenta, tab.status ");
		}

		return sql.toString();
	}

}
