package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioCancelamentoVendaCartao extends Relatorio {
	
	private ConstanteService constanteService;

	public RelatorioCancelamentoVendaCartao(Map<String, Object> parametros, Connection conexao, ConstanteService constanteService) throws Exception {
		super(parametros, conexao);
		this.constanteService = constanteService;

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				final Integer CARTAO_CREDITO = 2;
				String sql = getSql();

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				stmt.setTimestamp("data_inicial", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime()));
				stmt.setTimestamp("data_final", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));
				stmt.setInt("formaPago1", CARTAO_CREDITO);
				stmt.setInt("empresaId", Integer.valueOf(parametros.get("EMPRESA_ID")+""));
				
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("estabelecimento", rset.getString("nombpuntoventa"));
					dataResult.put("cartao", rset.getString("numtarjeta").replace('*', ' ').trim());
					dataResult.put("datavenda", rset.getDate("fechorventa"));
					dataResult.put("datadevolucao", rset.getDate("datadevolucao"));
					dataResult.put("valor_total_compra", rset.getBigDecimal("valor_cesta"));
					dataResult.put("valorvenda", rset.getBigDecimal("valor_venda"));
					dataResult.put("valorcancelar", rset.getBigDecimal("valor_cancelar"));
					dataResult.put("autorizacao", rset.getString("numautorizacion"));
					dataResult.put("motivo", rset.getString("descmotivo"));
					dataResult.put("numerositef", rset.getString("numsitef"));
					dataResult.put("nsu", rset.getString("nsu"));
					dataResult.put("numfoliosistema", rset.getString("numfoliosistema") != null ? rset.getString("numfoliosistema") : "");
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	private String getSql() {
		StringBuilder sql = new StringBuilder();
		
		/* Boletos apenas com venda e cancelamento direto com corrida */
		sql.append("SELECT DISTINCT C.CAJA_ID, B.BOLETO_ID, P.NOMBPUNTOVENTA, CTJ.NUMTARJETA, C.FECHORVENTA, PTOVTA.NUMSITEF, ")
		   .append("'OCD' AS DESCMOTIVO, CTJ.NUMAUTORIZACION, CTJ.NSU, C.NUMFOLIOSISTEMA, O.FECINC AS DATADEVOLUCAO, C.NUMOPERACION, ")
		   .append("(COALESCE(C.PRECIOPAGADO,0) + COALESCE(C.IMPORTEOUTROS,0)+ COALESCE(C.IMPORTEPEDAGIO,0)+ COALESCE(C.IMPORTESEGURO,0) + COALESCE(C.IMPORTETAXAEMBARQUE,0)) AS VALOR_VENDA, ")
		   .append("TO_CHAR(COALESCE(O.VALOR_TARJETA,0),'FM9999999.90') AS VALOR_CANCELAR, ")
		   .append("(SELECT SUM(COALESCE(B1.PRECIOPAGADO,0) + COALESCE(B1.IMPORTEOUTROS,0) + COALESCE(B1.IMPORTEPEDAGIO,0) + COALESCE(B1.IMPORTESEGURO,0) + COALESCE(B1.IMPORTETAXAEMBARQUE,0)) ")
		   .append(" FROM BOLETO B1 ")
		   .append(" WHERE B1.NUMOPERACION = B.NUMOPERACION ")
		   .append(" AND B1.BOLETOORIGINAL_ID IS NULL ")
		   .append(") AS VALOR_CESTA ")
		   .append("FROM OCD O ")
		   .append("INNER JOIN BOLETO B ON O.BOLETO_ID = B.BOLETO_ID ")
		   .append("                    AND B.BOLETOORIGINAL_ID IS NULL ")
		   .append("                    AND B.CORRIDA_ID IS NOT NULL ")
		   .append("                    AND B.FECCORRIDA IS NOT NULL ")
		   .append("INNER JOIN CAJA C ON C.NUMOPERACION = B.NUMOPERACION ")
		   .append("                  AND B.NUMASIENTO = C.NUMASIENTO ")
		   .append("INNER JOIN CAJA_DET_PAGO CDT ON CDT.CAJA_ID = C.CAJA_ID AND CDT.FORMAPAGO_ID = :formaPago1 ")
		   .append("INNER JOIN CAJA_TARJETA CTJ ON CDT.CAJADETPAGO_ID = CTJ.CAJADETPAGO_ID ")
		   .append("INNER JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = B.PUNTOVENTA_ID ")
		   .append("INNER JOIN PTOVTA_EMPRESA PTOVTA ON B.PUNTOVENTA_ID = PTOVTA.PUNTOVENTA_ID ")
		   .append("INNER JOIN MARCA M ON M.MARCA_ID = B.MARCA_ID AND M.EMPRESA_ID = PTOVTA.EMPRESA_ID ")
		   .append("WHERE O.FECINC BETWEEN :data_inicial AND :data_final ")
		   .append("AND B.MARCA_ID = :empresaId ");
		
		if(parametros.get("NUMPUNTOVENTA") != null) {
			sql.append("AND P.PUNTOVENTA_ID IN (")
			   .append(parametros.get("NUMPUNTOVENTA"))
			   .append(") ");
		}
		   
		sql.append("UNION ALL ");
		
		/* Boletos com entrega/transferencia/troca antes do cancelamento com corrida */
		sql.append("SELECT DISTINCT C.CAJA_ID, B.BOLETO_ID, P.NOMBPUNTOVENTA, CTJ.NUMTARJETA, C.FECHORVENTA, PTOVTA.NUMSITEF, ")
		   .append("'OCD' AS DESCMOTIVO, CTJ.NUMAUTORIZACION, CTJ.NSU, C.NUMFOLIOSISTEMA, O.FECINC AS DATADEVOLUCAO, C.NUMOPERACION, ")
		   .append("(COALESCE(C.PRECIOPAGADO,0) + COALESCE(C.IMPORTEOUTROS,0)+ COALESCE(C.IMPORTEPEDAGIO,0)+ COALESCE(C.IMPORTESEGURO,0) + COALESCE(C.IMPORTETAXAEMBARQUE,0)) AS VALOR_VENDA, ")
		   .append("TO_CHAR(COALESCE(O.VALOR_TARJETA,0),'FM9999999.90') AS VALOR_CANCELAR, ")
		   .append("(SELECT SUM(COALESCE(B1.PRECIOPAGADO,0) + COALESCE(B1.IMPORTEOUTROS,0) + COALESCE(B1.IMPORTEPEDAGIO,0) + COALESCE(B1.IMPORTESEGURO,0) + COALESCE(B1.IMPORTETAXAEMBARQUE,0)) ")
		   .append(" FROM BOLETO B1 ")
		   .append(" WHERE B1.NUMOPERACION = BR.NUMOPERACION ")
		   .append(" AND B1.BOLETOORIGINAL_ID IS NULL ")
		   .append(") AS VALOR_CESTA ")
		   .append("FROM OCD O ")
		   .append("INNER JOIN BOLETO B ON O.BOLETO_ID = B.BOLETO_ID ")
		   .append("INNER JOIN BOLETO BR ON BR.BOLETO_ID = B.BOLETOORIGINAL_ID ")
		   .append("                     AND BR.CORRIDA_ID IS NOT NULL ")
		   .append("                     AND BR.FECCORRIDA IS NOT NULL ")
		   .append("INNER JOIN CAJA C ON C.NUMOPERACION = BR.NUMOPERACION ")
		   .append("                  AND BR.NUMASIENTO = C.NUMASIENTO ")
		   .append("INNER JOIN CAJA_DET_PAGO CDT ON CDT.CAJA_ID = C.CAJA_ID AND CDT.FORMAPAGO_ID = :formaPago1 ")
		   .append("INNER JOIN CAJA_TARJETA CTJ ON CDT.CAJADETPAGO_ID = CTJ.CAJADETPAGO_ID ")
		   .append("INNER JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = BR.PUNTOVENTA_ID ")
		   .append("INNER JOIN PTOVTA_EMPRESA PTOVTA ON BR.PUNTOVENTA_ID = PTOVTA.PUNTOVENTA_ID ")
		   .append("INNER JOIN MARCA M ON M.MARCA_ID = BR.MARCA_ID AND M.EMPRESA_ID = PTOVTA.EMPRESA_ID ")
		   .append("WHERE O.FECINC BETWEEN :data_inicial AND :data_final ")
		   .append("AND BR.MARCA_ID = :empresaId ");
		
		if(parametros.get("NUMPUNTOVENTA") != null) {
			sql.append("AND P.PUNTOVENTA_ID IN (")
			   .append(parametros.get("NUMPUNTOVENTA"))
			   .append(") ");
		}
		
		sql.append("UNION ALL ");
		
		/* Boletos apenas com venda e cancelamento direto sem corrida */
		sql.append("SELECT DISTINCT C.CAJA_ID, B.BOLETO_ID, P.NOMBPUNTOVENTA, CTJ.NUMTARJETA, C.FECHORVENTA, PTOVTA.NUMSITEF, ")
		   .append("'OCD' AS DESCMOTIVO, CTJ.NUMAUTORIZACION, CTJ.NSU, C.NUMFOLIOSISTEMA, O.FECINC AS DATADEVOLUCAO, C.NUMOPERACION, ")
		   .append("(COALESCE(C.PRECIOPAGADO,0) + COALESCE(C.IMPORTEOUTROS,0)+ COALESCE(C.IMPORTEPEDAGIO,0)+ COALESCE(C.IMPORTESEGURO,0) + COALESCE(C.IMPORTETAXAEMBARQUE,0)) AS VALOR_VENDA, ")
		   .append("TO_CHAR(COALESCE(O.VALOR_TARJETA,0),'FM9999999.90') AS VALOR_CANCELAR, ")
		   .append("(SELECT SUM(COALESCE(B1.PRECIOPAGADO,0) + COALESCE(B1.IMPORTEOUTROS,0) + COALESCE(B1.IMPORTEPEDAGIO,0) + COALESCE(B1.IMPORTESEGURO,0) + COALESCE(B1.IMPORTETAXAEMBARQUE,0)) ")
		   .append(" FROM BOLETO B1 ")
		   .append(" WHERE B1.NUMOPERACION = B.NUMOPERACION ")
		   .append(" AND B1.BOLETOORIGINAL_ID IS NULL ")
		   .append(") AS VALOR_CESTA ")
		   .append("FROM OCD O ")
		   .append("INNER JOIN BOLETO B ON O.BOLETO_ID = B.BOLETO_ID ")
		   .append("                    AND B.BOLETOORIGINAL_ID IS NULL ")
		   .append("                    AND B.CORRIDA_ID IS NULL ")
		   .append("                    AND B.FECCORRIDA IS NULL ")
		   .append("INNER JOIN CAJA C ON C.NUMOPERACION = B.NUMOPERACION ")
		   .append("                  AND B.NUMFOLIOSISTEMA = C.NUMFOLIOSISTEMA ")
		   .append("INNER JOIN CAJA_DET_PAGO CDT ON CDT.CAJA_ID = C.CAJA_ID AND CDT.FORMAPAGO_ID = :formaPago1 ")
		   .append("INNER JOIN CAJA_TARJETA CTJ ON CDT.CAJADETPAGO_ID = CTJ.CAJADETPAGO_ID ")
		   .append("INNER JOIN PUNTO_VENTA P ON P.PUNTOVENTA_ID = B.PUNTOVENTA_ID ")
		   .append("INNER JOIN PTOVTA_EMPRESA PTOVTA ON B.PUNTOVENTA_ID = PTOVTA.PUNTOVENTA_ID ")
		   .append("INNER JOIN MARCA M ON M.MARCA_ID = B.MARCA_ID AND M.EMPRESA_ID = PTOVTA.EMPRESA_ID ")
		   .append("WHERE O.FECINC BETWEEN :data_inicial AND :data_final ")
		   .append("AND B.MARCA_ID = :empresaId ");
		
		if(parametros.get("NUMPUNTOVENTA") != null) {
			sql.append("AND P.PUNTOVENTA_ID IN (")
			   .append(parametros.get("NUMPUNTOVENTA"))
			   .append(") ");
		}
		
		sql.append("ORDER BY 3, 5 ");
		
		return sql.toString();
	}

	/*private String getSql() {
		StringBuilder sql = new StringBuilder();
		//Busca os boletos originais dos boletos que foram geradas OCDS
		//Esses boletos sofreram transferência.
		//O intuito dessa query é recuperar os dados originais de cartões de crédito
		sql.append(" WITH boletos_originais AS ");
		sql.append(" (SELECT distinct b.boleto_id as boleto_id_bo, ctj.numtarjeta as numtarjeta_bo, ptovta.numsitef as numsitef_bo, c.caja_id, c.fechorventa AS fechorventa_bo, ");
		sql.append(" CASE WHEN ctj.numautorizacion IS NULL THEN '-' ELSE ctj.numautorizacion END AS numautorizacion_bo, ");
		sql.append(" ctj.nsu as nsu_bo, c.numoperacion AS numoperacion ");		
		sql.append(" FROM boleto b, caja_det_pago cdt, caja c, caja_tarjeta ctj, ptovta_empresa ptovta ");
		sql.append(" WHERE b.boleto_id IN ");
		sql.append(" ( SELECT b.boletooriginal_id FROM OCD o	");
		sql.append(" INNER JOIN boleto b ON o.BOLETO_ID = b.BOLETO_ID ");
		sql.append(" INNER JOIN caja c ON c.numoperacion = b.numoperacion ");
		sql.append(" AND b.numfoliosistema = c.numfoliosistema ");
		sql.append(" AND o.fecinc between :data_inicial and :data_final ");
		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" INNER JOIN marca ma on ma.marca_id = b.marca_id");
			sql.append(" AND ma.empresa_id = " + parametros.get("EMPRESA_ID"));
		}
		if (parametros.get("NUMPUNTOVENTA") != null) {
			sql.append(" AND o.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
		}
		sql.append(" AND b.boletooriginal_id IS NOT NULL ");
		sql.append(")");

		sql.append(" AND c.numoperacion = b.numoperacion ");	
		//Para venda pela internet aparecer é preciso descomentar a linha abaixo
		sql.append(" AND b.numfoliosistema = c.numfoliosistema ");
		sql.append(" AND cdt.caja_id = c.caja_id ");
		sql.append(" AND cdt.cajadetpago_id = ctj.cajadetpago_id ");
		sql.append(" AND cdt.formapago_id IN (2) ");
		sql.append(" AND b.puntoventa_id = ptovta.puntoventa_id ");
		if (parametros.get("EMPRESA_ID") != null) {
			//Para venda pela internet aparecer é preciso descomentar a linha abaixo
			sql.append(" AND ptovta.empresa_id = " + parametros.get("EMPRESA_ID"));		
		}				
		sql.append("), ");
		//Busca os boletos que foram vendidos pela internet(boleto originais)
		sql.append(" boletos_o_venda_internet AS( ");
		sql.append(" SELECT DISTINCT b.boleto_id AS boleto_id_bo_vi, ctj.numtarjeta AS numtarjeta_bo_vi, ");
		sql.append(" ptovta.numsitef AS numsitef_bo_vi,  c.caja_id,  c.fechorventa AS fechorventa_bo_vi, ");
		sql.append(" CASE WHEN ctj.numautorizacion IS NULL THEN '-' ELSE ctj.numautorizacion END AS numautorizacion_bo_vi, ");
		sql.append(" ctj.nsu AS nsu_bo_vi, c.numoperacion AS numoperacion FROM boleto b, caja_det_pago cdt, caja c, ");
		sql.append(" caja_tarjeta ctj, ptovta_empresa ptovta WHERE b.boleto_id IN(SELECT b.boletooriginal_id ");
		sql.append(" FROM OCD o INNER JOIN boleto b ON o.BOLETO_ID = b.BOLETO_ID ");
		sql.append(" inner join caja c on c.numoperacion = b.numoperacion ");
		sql.append(" 				   and c.feccorrida = b.feccorrida ");
		sql.append(" 				   and c.corrida_id = b.corrida_id ");
		sql.append(" 				   and c.numasiento = b.numasiento ");
		sql.append(" AND o.fecinc between :data_inicial and :data_final ");
		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" INNER JOIN marca ma on ma.marca_id = b.marca_id");
			sql.append(" AND ma.empresa_id = " + parametros.get("EMPRESA_ID"));
		}
		if (parametros.get("NUMPUNTOVENTA") != null) {
			sql.append(" AND o.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
		}
		sql.append(" AND b.boletooriginal_id IS NOT NULL ");
		sql.append(")");
		sql.append(" AND c.numoperacion = b.numoperacion ");
		sql.append(" AND cdt.caja_id = c.caja_id ");
		sql.append(" AND cdt.cajadetpago_id = ctj.cajadetpago_id ");
		sql.append(" AND cdt.formapago_id IN (2) ");
		sql.append(" AND b.puntoventa_id = ptovta.puntoventa_id ");
		sql.append(" AND b.feccorrida = c.feccorrida "); 
		sql.append(" AND b.corrida_id = c.corrida_id "); 
		sql.append(" AND b.numasiento = c.numasiento "); 
		sql.append(" AND b.puntoventa_id = ");
		
		 //Pega o ponto de venda 
		Constante constante = constanteService.buscarPorNomeConstante("PUNTO_VENTA_INTERNET");
		if(constante != null) {
			sql.append(constante.getValorconstante());
		} else {
			sql.append("99999");
		}
		sql.append(" ),"); //É o código do puntoventa de compras pela internet
		
		//Busca os boletos novos após a transferência e geração de OCD
		sql.append(" boletos_novos AS( ");
		sql.append(" SELECT c.caja_id as caja_id_bn, b.boleto_id as boleto_id_bn, b.boletooriginal_id as boleto_id_original_bn,	");
		sql.append(" b.puntoventa_id as puntoventa_id_bn, p.nombpuntoventa as nombpuntoventa_bn, c.fechorventa as fechorventa_bn, ");
		sql.append(" (coalesce(c.preciopagado,0) + coalesce(c.importeoutros,0)+ coalesce(c.importepedagio,0)+ ");
		sql.append(" coalesce(c.importeseguro,0) + coalesce(c.importetaxaembarque,0)) as valor_venda_bn, ");
		sql.append(" CASE WHEN  o.VALOR_TARJETA is null OR o.VALOR_TARJETA = 0 THEN TO_CHAR(COALESCE(o.VALOR_PAGAR,0),'FM9999999.90')ELSE TO_CHAR(COALESCE(o.VALOR_TARJETA,0),'FM9999999.90') END as valor_cancelar_bn, ");
		sql.append(" c.numfoliosistema as numfoliosistema_bn, o.fecinc as datadevolucao_bn ");
		sql.append(" FROM OCD o	");
		sql.append(" INNER JOIN boleto b ON o.BOLETO_ID = b.BOLETO_ID ");
		sql.append(" INNER JOIN caja c ON c.numoperacion = b.numoperacion ");
		sql.append(" AND b.numfoliosistema = c.numfoliosistema ");
		sql.append(" INNER JOIN punto_venta p ");
		sql.append(" ON p.puntoventa_id = b.puntoventa_id ");
		//sql.append(" AND o.VALOR_TARJETA <> 0 ");
		sql.append(" AND o.fecinc between :data_inicial and :data_final ");
		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" INNER JOIN marca ma on ma.marca_id = b.marca_id");
			sql.append(" AND ma.empresa_id = " + parametros.get("EMPRESA_ID"));
		}
		if (parametros.get("NUMPUNTOVENTA") != null) {
			sql.append(" and p.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
		}

		sql.append("),");
		//Busca todas as OCD's exceto os boletos que foram transferidos antes da geração da OCD
		sql.append(" ocds AS(select distinct c.caja_id, b.boleto_id, p.nombpuntoventa, ctj.numtarjeta, c.fechorventa, ptovta.numsitef,");
		sql.append(" (coalesce(c.preciopagado,0) + coalesce(c.importeoutros,0)+ coalesce(c.importepedagio,0)+ coalesce(c.importeseguro,0) + coalesce(c.importetaxaembarque,0)) as valor_venda,");
		sql.append(" TO_CHAR(coalesce(o.VALOR_TARJETA,0),'FM9999999.90') as valor_cancelar,");
		sql.append(" 'OCD' as descmotivo, ctj.numautorizacion, ctj.nsu, c.numfoliosistema, o.fecinc as datadevolucao, c.numoperacion ");
		sql.append(" from OCD o");
		sql.append(" inner join boleto b on o.BOLETO_ID = b.BOLETO_ID");
		sql.append(" inner join caja c on c.numoperacion = b.numoperacion ");
		//sql.append(" 				  and c.numfoliosistema = b.numfoliosistema ");
		sql.append(" inner join caja_det_pago cdt ON cdt.caja_id = c.caja_id and cdt.formapago_id in (:formaPago1)");
		sql.append(" inner join caja_tarjeta ctj on cdt.cajadetpago_id = ctj.cajadetpago_id");
		sql.append(" inner join punto_venta p on p.puntoventa_id = b.puntoventa_id");
		sql.append(" inner join ptovta_empresa ptovta on b.puntoventa_id = ptovta.puntoventa_id");
		sql.append(" inner join marca m on m.marca_id =  b.marca_id ");
		sql.append(" and m.EMPRESA_ID = ptovta.EMPRESA_ID ");
		if (parametros.get("EMPRESA_ID") != null) {
			sql.append(" inner join empresa e on e.empresa_id = m.empresa_id and  m.empresa_id = " + parametros.get("EMPRESA_ID"));
		}
		sql.append(" AND o.fecinc between :data_inicial and :data_final ");
		if (parametros.get("NUMPUNTOVENTA") != null) {
			sql.append(" and p.puntoventa_id IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
		}
		//sql.append(" order by c.fechorventa, o.fecinc ),");	
		sql.append(" ),");
		sql.append(" ocds_total_compra AS ");
		//Busca com base no numoperacion da consulta "ocds" os valores totais da compra(Cesta de compras)
		sql.append(" (SELECT c.numoperacion  AS numoperacion_cc,");
		sql.append(" SUM((COALESCE(c.preciopagado,0) + COALESCE(c.importeoutros,0)+ COALESCE(c.importepedagio,0)+ COALESCE(c.importeseguro,0) + COALESCE(c.importetaxaembarque,0) + COALESCE(e.impingreso,0)))AS valor_cesta ");
		sql.append(" FROM CAJA c INNER JOIN ocds o on c.caja_id = o.caja_id ");
		sql.append(" LEFT JOIN evento_extra e on e.boleto_id = o.boleto_id ");
		sql.append(" GROUP BY c.numoperacion),");
		sql.append(" total_compra_bo_originais AS");
		//Busca com base no numoperacion da consulta "boletos_originais" os valores totais da compra(Cesta de compras)
		sql.append(" (SELECT c.numoperacion AS numoperacion_cc, ");
		sql.append(" SUM((COALESCE(c.preciopagado,0) + COALESCE(c.importeoutros,0)+ COALESCE(c.importepedagio,0)+ COALESCE(c.importeseguro,0) + COALESCE(c.importetaxaembarque,0) + COALESCE(e.impingreso,0)))AS valor_cesta ");
		sql.append(" FROM CAJA c");
		sql.append(" INNER JOIN boletos_originais bo on c.caja_id = bo.caja_id ");
		sql.append(" LEFT JOIN evento_extra e on e.boleto_id = bo.boleto_id_bo ");
		sql.append(" GROUP BY c.numoperacion), ");				  
		//Busca com base no numoperacion da consulta "boletos_o_venda_internet" os valores totais da compra(Cesta de compras)
		sql.append(" total_compra_bo_internet AS ");
		sql.append(" (SELECT c.numoperacion  AS numoperacion_cc, SUM((COALESCE(c.preciopagado,0) + COALESCE(c.importeoutros,0)+ COALESCE(c.importepedagio,0)+  ");
		sql.append(" COALESCE(c.importeseguro,0) + COALESCE(c.importetaxaembarque,0) + COALESCE(e.impingreso,0)))AS valor_cesta ");
		sql.append(" FROM CAJA c INNER JOIN boletos_o_venda_internet bo ON c.caja_id = bo.caja_id LEFT JOIN evento_extra e");
		sql.append(" ON e.boleto_id = bo.boleto_id_bo_vi GROUP BY c.numoperacion)");
		
		sql.append(" SELECT nombpuntoventa, fechorventa, datadevolucao, numtarjeta, numsitef, valor_venda, valor_cancelar, ");
		sql.append(" descmotivo, numautorizacion, nsu, numfoliosistema, valor_cesta ");
		sql.append(" FROM ( ");
     
		//Realiza o join entre as Views 'ocds' e ocds_total_compra afim de obter o total da cesta de compras
		sql.append(" SELECT caja_id, nombpuntoventa, numtarjeta, fechorventa, numsitef, valor_venda, valor_cancelar, ");
		sql.append(" descmotivo, numautorizacion, nsu, numfoliosistema, datadevolucao, valor_cesta ");
		sql.append(" FROM ocds ");
		sql.append(" INNER JOIN ocds_total_compra ocdst ");
		sql.append(" ON ocds.numoperacion = ocdst.numoperacion_cc ");
		
		sql.append(" UNION ");				
		//Realiza o join entre as Views 'boletos_originais' e total_compra_bo_originais afim de obter o total da cesta de compras
		//Realiza também o join com as Views boletos_novos com o intuito de exibir os boletos transferidos os quais foram
		//geradas OCD´s
		sql.append(" SELECT bn.caja_id_bn, bn.nombpuntoventa_bn as nombpuntoventa, bo.numtarjeta_bo  as numtarjeta, bo.fechorventa_bo as fechorventa, ");
		sql.append(" bo.numsitef_bo as numsitef,  bn.valor_venda_bn as valor_venda, bn.valor_cancelar_bn as valor_cancelar, 'OCD' AS descmotivo, ");
		sql.append(" bo.numautorizacion_bo as numautorizacion, bo.nsu_bo as nsu, numfoliosistema_bn as numfoliosistema, datadevolucao_bn as datadevolucao, total_c_bo_originais.valor_cesta");
		sql.append(" FROM boletos_originais bo ");
		sql.append(" INNER JOIN total_compra_bo_originais total_c_bo_originais ");
		sql.append(" ON total_c_bo_originais.numoperacion_cc = bo.numoperacion ");
		sql.append(" INNER JOIN boletos_novos bn ");
		sql.append(" ON bo.boleto_id_bo = bn.boleto_id_original_bn ");
		
		sql.append(" UNION ");	
		
		//Realiza o join entre as Views 'boletos_o_venda_internet' e total_compra_bo_internet afim de obter o total da cesta de compras
		//Realiza também o join com as Views boletos_novos com o intuito de exibir os boletos novos os quais foram
		//geradas OCD´s 
		sql.append(" SELECT bn.caja_id_bn, bn.nombpuntoventa_bn as nombpuntoventa, bo.numtarjeta_bo_vi as numtarjeta, bo.fechorventa_bo_vi as fechorventa,  bo.numsitef_bo_vi as numsitef, ");
		sql.append(" bn.valor_venda_bn as valor_venda,  bn.valor_cancelar_bn as valor_cancelar, 'OCD' AS descmotivo, bo.numautorizacion_bo_vi as numautorizacion, bo.nsu_bo_vi as nsu, ");
		sql.append(" numfoliosistema_bn as numfoliosistema, datadevolucao_bn as datadevolucao, total_c_bo_internet.valor_cesta FROM boletos_o_venda_internet bo ");
		sql.append(" INNER JOIN total_compra_bo_internet total_c_bo_internet ON total_c_bo_internet.numoperacion_cc = bo.numoperacion ");
		sql.append(" INNER JOIN boletos_novos bn ON bo.boleto_id_bo_vi = bn.boleto_id_original_bn ");
		
		sql.append(") ORDER BY  datadevolucao ");	
			
		return sql.toString();
		
	}*/

}
