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

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.EnumTipoVenda;
import com.rjconsultores.ventaboletos.relatorios.negocio.CalculoImposto;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ExceptionConfiguracao;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 * @author Bruno H. G. Gouvea <bruno@rjconsultores.com.br>
 * 
 */
public class RelatorioReceitaDiariaAgencia extends Relatorio  {

	private LinkedHashMap<String, LinkedHashMap<String, Object>> mapCacheConfigComissao;
	//Mantis 16390
	//As vendas com impressão posterior não estavam sendo exibidas como pré venda pois só estavam sendo validados os tipoVendaId 18 e 39.
	//Verifiquei a classe RelatorioImpressaoPosterior e adicionei os tipoVendaId faltantes de acordo com sua regra de negócio.
	private List<Integer> listaTipoVentaIdPreVenda = Arrays.asList(EnumTipoVenda.TPV_CENTRAL_TELEFONICA.getId(), 
																   EnumTipoVenda.TPV_POR_INTERNET.getId(), 
																   EnumTipoVenda.TPV_BOLETO_REMOTO.getId(), 
																   EnumTipoVenda.TPV_CHECKIN_VIAGEM.getId(), 
																   EnumTipoVenda.TPV_BOLETO_ABERTO_PREPAGADO.getId(), 
																   EnumTipoVenda.TPV_VENDA_BOLETO_ABERTO_MANUAL.getId());
	private Set<PuntoVenta> pontoVendaConfiguracao; 
	

	public RelatorioReceitaDiariaAgencia(final Map<String, Object> parametros, Connection conexao) throws Exception {

		super(parametros, conexao);

		CalculoImposto.limpaCache();
		this.mapCacheConfigComissao = new LinkedHashMap<String, LinkedHashMap<String, Object>>();

		this.setCustomDataSource(new ArrayDataSource(this) {

			protected LinkedHashMap<String, LinkedHashMap<String, Object>> mapDados;

			@Override
			public Object valueCustomFields(String fieldName) throws Exception {
				if (fieldName.equals("RECEITA_TOTAL")) {
					BigDecimal gap = BigDecimal.ZERO;
					if( this.getByName("RECEITA_TARIFA_GAP")!=null) {
						gap = ((BigDecimal) this.getByName("RECEITA_TARIFA_GAP"));
					}
					if(this.getByName("RECEITA_SEGURO_GAP") !=null) {
						gap = gap.add((BigDecimal) this.getByName("RECEITA_SEGURO_GAP"));
					}
					
					if(this.getByName("RECEITA_EMBARQUE_GAP")!=null) {
						gap = gap.add((BigDecimal) this.getByName("RECEITA_EMBARQUE_GAP"));	
					}
					if(this.getByName("RECEITA_PEDAGIO_GAP")!=null) {
						gap = gap.add((BigDecimal) this.getByName("RECEITA_PEDAGIO_GAP"));						
					}
					if(getByName("TOTAL_DEVOL_GAP") !=null) {
						gap = gap.subtract((BigDecimal) this.getByName("TOTAL_DEVOL_GAP"));						
					}

					return ((BigDecimal) this.getByName("RECEITA_TARIFA"))
							.add((BigDecimal) this.getByName("RECEITA_SEGURO"))
							.add((BigDecimal) this.getByName("RECEITA_BAGAGEM"))
							.add((BigDecimal) this.getByName("RECEITA_EMBARQUE"))
							.add((BigDecimal) this.getByName("RECEITA_PEDAGIO"))
							.subtract((BigDecimal) this.getByName("TOTAL_DEVOL"))
							.add(gap);
				}
				else if (fieldName.equals("RECEITA_LIQUIDA")) {
					BigDecimal gap = BigDecimal.ZERO;

					gap = ((BigDecimal) this.getByName("RECEITA_TARIFA_GAP")).add((BigDecimal) this.getByName("RECEITA_SEGURO_GAP")).add((BigDecimal) this.getByName("RECEITA_EMBARQUE_GAP")).add((BigDecimal) this.getByName("RECEITA_PEDAGIO_GAP")).subtract((BigDecimal) this.getByName("TOTAL_DEVOL_GAP"));

					return ((BigDecimal) this.getByName("RECEITA_TARIFA")).add((BigDecimal) this.getByName("RECEITA_SEGURO")).add((BigDecimal) this.getByName("RECEITA_BAGAGEM")).add((BigDecimal) this.getByName("RECEITA_EMBARQUE")).add((BigDecimal) this.getByName("RECEITA_PEDAGIO")).subtract((BigDecimal) this.getByName("TOTAL_DEVOL")).subtract((BigDecimal) this.getByName("IMPOSTOS")).add(gap);
				}
				else if (fieldName.equals("DIFERENCA_COMISSAO")) {
					return ((BigDecimal) this.getByName("VALOR_COMISSAO")).subtract((BigDecimal) this.getByName("ANTECIPACAO"));
				}

				return null;
			}

			protected void prepareQuery() throws SQLException {

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();
				String sql = getSql();
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				
				if (parametros.get("GRUPO_RUTA") != null) {
					stmt.setString("GRUPO_RUTA", parametros.get("GRUPO_RUTA").toString());
				}

				if (parametros.get("NUMPUNTOVENTA") != null) {
					StringBuilder strNumPuntoVenta = new StringBuilder();

					for (PuntoVenta s : (ArrayList<PuntoVenta>) parametros.get("NUMPUNTOVENTA")) {
						if(s!=null && s.getNumPuntoVenta()!=null) {
							strNumPuntoVenta.append("," + s.getNumPuntoVenta() + ",");							
						}
					}
					stmt.setString("NUMPUNTOVENTA", strNumPuntoVenta.toString());
				}
				else
					stmt.setString("NUMPUNTOVENTA", null);

				if (parametros.get("ESTADO_ID") != null) {
					StringBuilder strEstadoList = new StringBuilder();

					for (Estado s : (ArrayList<Estado>) parametros.get("ESTADO_ID")) {
						strEstadoList.append("," + s.getEstadoId() + ",");
					}
					stmt.setString("ESTADO_ID", strEstadoList.toString());
					stmt.setString("ISESTADOTODOS", "N");
				}
				else {
 					stmt.setNull("ESTADO_ID", java.sql.Types.INTEGER);
					stmt.setString("ISESTADOTODOS", "S");
				}

				if (parametros.get("EMPRESA_ID") != null)
					stmt.setInt("EMPRESA_ID", (Integer) parametros.get("EMPRESA_ID"));
				else
					stmt.setNull("EMPRESA_ID", java.sql.Types.INTEGER);
				
				if (parametros.get("TIPOPTOVTA_ID") != null)
					stmt.setInt("TIPOPTOVTA_ID", (Integer) parametros.get("TIPOPTOVTA_ID"));
				else
					stmt.setNull("TIPOPTOVTA_ID", java.sql.Types.INTEGER);

				if (parametros.get("MOEDA_ID") != null)
					stmt.setInt("MOEDA_ID", (Integer) parametros.get("MOEDA_ID"));
				else
					stmt.setNull("MOEDA_ID", java.sql.Types.INTEGER);
				
				if ((Boolean) parametros.get("B_DATA_FECHAMENTO")){
					stmt.setDate("DATA_INICIO", new java.sql.Date(((java.util.Date) parametros.get("DATA_INICIO")).getTime()));
					stmt.setDate("DATA_FINAL", new java.sql.Date(((java.util.Date) parametros.get("DATA_FINAL")).getTime()));	
				}else{
					stmt.setTimestamp("DATA_INICIO", new java.sql.Timestamp(((java.util.Date) parametros.get("DATA_INICIO")).getTime()));
					stmt.setTimestamp("DATA_FINAL", new java.sql.Timestamp(((java.util.Date) parametros.get("DATA_FINAL")).getTime()));	
				}
				
				
				stmt.setString("ISNUMPUNTOVENTATODOS", (String) parametros.get("ISNUMPUNTOVENTATODOS"));

				this.resultSet = stmt.executeQuery();
			}

			public void setRowComissao(LinkedHashMap<String, Object> rowOrigem) throws Exception {
				LinkedHashMap<String, Object> rowDestino = rowOrigem;

				// Busca as configurações de comissão
				LinkedHashMap<String, Object> configComissao = getConfigComissao((Integer) rowOrigem.get("PUNTOVENTA_ID"), (Integer) rowOrigem.get("EMPRESAPUNTOVENTA_ID"));
				if (configComissao == null) {
					return;
				}

				// Verifica se existe agência de destino da comissão e atualiza a row se necessario
				if ((Integer) configComissao.get("PUNTOVENTA_ID") != 0 && !((Integer) configComissao.get("PUNTOVENTA_ID")).equals(this.resultSet.getInt("PUNTOVENTA_ID")))
					rowDestino = this.getRow((Integer) configComissao.get("PUNTOVENTA_ID"), (Integer) rowOrigem.get("EMPRESA_ID"), null);

				Integer puntoVentaId = (Integer) rowDestino.get("PUNTOVENTA_ID");
				BigDecimal motivoCancelacionId = this.resultSet.getBigDecimal("MOTIVOCANCELACION_ID");
				Integer tipoVentaId = this.resultSet.getInt("TIPOVENTA_ID");

				Integer estadoId = this.resultSet.getInt("ORIGEM_ESTADO_ID");

				HashMap<String, Object> configImposto = getConfigImposto((Integer) rowOrigem.get("EMPRESA_ID"), estadoId);
				if (configImposto == null) {
					return;
				}

				BigDecimal baseCalculo = BigDecimal.ZERO;
				BigDecimal valorComissao = BigDecimal.ZERO;
				BigDecimal percComissao = BigDecimal.ZERO;
				BigDecimal issComissao = configComissao.get("ISSRETIDO") != null ? (BigDecimal) configComissao.get("ISSRETIDO") : BigDecimal.ZERO;
				BigDecimal royatilesComissao = configComissao.get("ROYALTIES") != null ? (BigDecimal) configComissao.get("ROYALTIES") : BigDecimal.ZERO;
				
				BigDecimal baseCalculoSeguro = BigDecimal.ZERO;
				BigDecimal percComissaoSeguro = BigDecimal.ZERO;
				BigDecimal valorComissaoSeguro = BigDecimal.ZERO;
				
				boolean isSeguroObrigatorioReceitaBPR = (Boolean) configComissao.get("SEGURORECEITA") || (Boolean) configComissao.get("SEGURO_DEV");
				// Defini a base de calculo da comissão
				if (motivoCancelacionId == null) {
					if ((Boolean) configComissao.get("TARIFARECEITA") && this.resultSet.getBigDecimal("PRECIOPAGADO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("PRECIOPAGADO") );
					if ((Boolean) configComissao.get("TAXARECEITA") && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE"));
					if ((Boolean) configComissao.get("PEDAGIORECEITA") && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTEPEDAGIO"));
					
					if(this.resultSet.getBigDecimal("IMPORTESEGURO") != null) {
						if (isSeguroObrigatorioReceitaBPR) {
							if((Boolean) configComissao.get("SEGURORECEITA")) {
								baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
							}
						} else {
							baseCalculoSeguro = baseCalculoSeguro.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
						}
					}

				} else {
					if ((Boolean) configComissao.get("TARIFADEV") && this.resultSet.getBigDecimal("PRECIOPAGADO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("PRECIOPAGADO"));
					if ((Boolean) configComissao.get("TAXADEV") && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE"));
					if ((Boolean) configComissao.get("PEDAGIODEV") && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTEPEDAGIO"));
					
					if(this.resultSet.getBigDecimal("IMPORTESEGURO") != null) {
						if (isSeguroObrigatorioReceitaBPR) {
							if((Boolean) configComissao.get("SEGURO_DEV")) {
								baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
							}
						} else {
							baseCalculoSeguro = baseCalculoSeguro.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
						}
					}
					
				}
				
				BigDecimal imposto = getValorImposto(this.resultSet.getInt("ORIGEM_ESTADO_ID"),
						this.resultSet.getInt("EMPRESA_ID"), this.resultSet.getString("INTERESTADUAL"),
						this.resultSet.getBigDecimal("PRECIOPAGADO"), this.resultSet.getBigDecimal("IMPORTESEGURO"),
						this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE"),
						this.resultSet.getBigDecimal("IMPORTEPEDAGIO"), BigDecimal.ZERO);

				// Caso esteje setado na configuração de comissão que o calculo deve ser sobre o liquido, deduz o imposto.
				if (configComissao.get("RECEITA") != null && ((String) configComissao.get("RECEITA")).equals("RL")
						&& (!tipoVentaId.equals(18) || (tipoVentaId.equals(18)
								&& (Boolean) this.relatorio.getParametros().get("B_CONTEMPLAR_GAP")))
						&& imposto != null) {
					baseCalculo = baseCalculo.subtract(imposto);
					baseCalculoSeguro = baseCalculoSeguro.subtract(imposto);
				}

				if (MoneyHelper.isMenorIgual(baseCalculo, BigDecimal.ZERO) && MoneyHelper.isMenorIgual(baseCalculoSeguro, BigDecimal.ZERO)) {
					return;					
				}
				
				// Verifica se na tabela de impostos por empresa, o mes da corrida esta marcado como alta ou baixa temporada

				Boolean isAltaTemporada = false;
				Date fecCorrida = this.resultSet.getDate("FECCORRIDA");
				if(fecCorrida != null) {
					String mes = new SimpleDateFormat("M").format(fecCorrida);
					isAltaTemporada = ((mes.equals("1") && (Boolean) configImposto.get("INDJANEIRO")) || (mes.equals("2") && (Boolean) configImposto.get("INDFEVEREIRO"))
							|| (mes.equals("3") && (Boolean) configImposto.get("INDMARCO")) || (mes.equals("4") && (Boolean) configImposto.get("INDABRIL"))
							|| (mes.equals("5") && (Boolean) configImposto.get("INDMAIO")) || (mes.equals("6") && (Boolean) configImposto.get("INDJUNHO"))
							|| (mes.equals("7") && (Boolean) configImposto.get("INDJULHO")) || (mes.equals("8") && (Boolean) configImposto.get("INDAGOSTO"))
							|| (mes.equals("9") && (Boolean) configImposto.get("INDSETEMBRO")) || (mes.equals("10") && (Boolean) configImposto.get("INDOUTUBRO"))
							|| (mes.equals("11") && (Boolean) configImposto.get("INDNOVEMBRO")) || (mes.equals("12") && (Boolean) configImposto.get("INDDEZEMBRO"))) ? true : false;
				}

				percComissao = isAltaTemporada ? (BigDecimal) configComissao.get("PASSAGEMALTA") : (BigDecimal) configComissao.get("PASSAGEMBAIXA");
				percComissaoSeguro = isAltaTemporada ? (BigDecimal) configComissao.get("SEGUROOBRIGATORIOALTA") : (BigDecimal) configComissao.get("SEGUROOBRIGATORIOBAIXA");

				if(percComissao == null) {
					percComissao = BigDecimal.ZERO;
				}
				
				if(percComissaoSeguro == null) {
					percComissaoSeguro = BigDecimal.ZERO;
				}
				
				// VALOR COMISSAO = BASE DE CALCULO * (PERCENTUAL COMISSAO / 100)
				valorComissao = baseCalculo.multiply(MoneyHelper.dividir(percComissao, MoneyHelper.HUNDRED, 4));
				valorComissaoSeguro = baseCalculoSeguro.multiply(MoneyHelper.dividir(percComissaoSeguro, MoneyHelper.HUNDRED, 4));

				// Deduz o ISS: VALOR COMISSAO = VALOR COMISSAO * (PERCENTUAL ISS / 100) - 1
				if (issComissao != null && !issComissao.equals(BigDecimal.ZERO)) {
					BigDecimal fator = BigDecimal.ONE.subtract(MoneyHelper.dividir(issComissao, MoneyHelper.HUNDRED, 4));
					valorComissao = valorComissao.multiply(fator);
					valorComissaoSeguro = valorComissaoSeguro.multiply(fator);
				}

				// Deduz os royatiles
				if (royatilesComissao != null && !royatilesComissao.equals(BigDecimal.ZERO)) {
					BigDecimal fator = BigDecimal.ONE.subtract(MoneyHelper.dividir(royatilesComissao, MoneyHelper.HUNDRED, 4));
					valorComissao = valorComissao.multiply(fator);
					valorComissaoSeguro = valorComissaoSeguro.multiply(fator);
				}

				rowDestino.put("VALOR_COMISSAO", ((BigDecimal) rowDestino.get("VALOR_COMISSAO")).add(valorComissao).add(valorComissaoSeguro));

				// Se a agencia de destino não estiver na listagem, finaliza o preenchimento do map e adiciona na listagem
				if (!mapDados.containsKey(puntoVentaId)) {

					rowDestino.put("PUNTOVENTA_ID", configComissao.get("PUNTOVENTA_ID"));
					rowDestino.put("CVEESTADO", configComissao.get("CVEESTADO"));
					rowDestino.put("NUMPUNTOVENTA", configComissao.get("NUMPUNTOVENTA"));
					rowDestino.put("NOMBPUNTOVENTA", configComissao.get("NOMBPUNTOVENTA"));
					rowDestino.put("EMPRESAPUNTOVENTA_ID", rowOrigem.get("EMPRESAPUNTOVENTA_ID"));
					rowDestino.put("EMPRESA", rowOrigem.get("EMPRESA"));
					rowDestino.put("GRUPO_RUTA", rowOrigem.get("GRUPO_RUTA"));
					rowDestino.put("EMPRESA_ID", rowOrigem.get("EMPRESA_ID"));
					rowDestino.put("ESTADO_ID", configComissao.get("ESTADO_ID"));
					rowDestino.put("TIPO_AGENCIA", configComissao.get("TIPO_AGENCIA"));

					mapDados.put(puntoVentaId + "-" + rowOrigem.get("EMPRESA_ID"), (LinkedHashMap<String, Object>) rowDestino);
				}
			}

			protected LinkedHashMap<String, Object> getRow(Integer puntoVentaId, Integer empresaId, ResultSet rs) throws SQLException {

				LinkedHashMap<String, Object> row;
				if (mapDados.containsKey(puntoVentaId.toString() + "-" + empresaId.toString())) {
					row = mapDados.get(puntoVentaId.toString() + "-" + empresaId.toString());
				}
				else
				{
					row = new LinkedHashMap<String, Object>();
					row.put("TOTAL_BILHETES", BigDecimal.ZERO);
					row.put("TOTAL_BILHETES_CANC", BigDecimal.ZERO);
					row.put("TOTAL_BILHETES_GAP", BigDecimal.ZERO);
					row.put("RECEITA_TARIFA", BigDecimal.ZERO);
					row.put("RECEITA_TARIFA_GAP", BigDecimal.ZERO);
					row.put("RECEITA_SEGURO", BigDecimal.ZERO);
					row.put("RECEITA_SEGURO_GAP", BigDecimal.ZERO);
					row.put("RECEITA_EMBARQUE", BigDecimal.ZERO);
					row.put("RECEITA_EMBARQUE_GAP", BigDecimal.ZERO);
					row.put("RECEITA_OUTROS", BigDecimal.ZERO);
					row.put("RECEITA_OUTROS_GAP", BigDecimal.ZERO);
					row.put("RECEITA_PEDAGIO", BigDecimal.ZERO);
					row.put("RECEITA_PEDAGIO_GAP", BigDecimal.ZERO);
					row.put("IMPOSTOS", BigDecimal.ZERO);
					row.put("TOTAL_DEVOL", BigDecimal.ZERO);
					row.put("TOTAL_DEVOL_GAP", BigDecimal.ZERO);
					row.put("VALOR_COMISSAO", BigDecimal.ZERO);
					row.put("RECEITA_BAGAGEM", BigDecimal.ZERO);

					row.put("ANTECIPACAO", getValorAntecipacaoComissao(puntoVentaId));

					if (rs != null) {
						row.put("PUNTOVENTA_ID", rs.getInt("PUNTOVENTA_ID"));
						row.put("CVEESTADO", rs.getString("CVEESTADO"));
						row.put("NUMPUNTOVENTA", rs.getString("NUMPUNTOVENTA"));
						row.put("EMPRESA", rs.getString("NOMBEMPRESA"));
						row.put("EMPRESA_ID", rs.getInt("EMPRESA_ID"));
						row.put("NOMBPUNTOVENTA", rs.getString("NOMBPUNTOVENTA"));
						row.put("EMPRESAPUNTOVENTA_ID", rs.getInt("EMPRESAPUNTOVENTA_ID"));
						row.put("ESTADO_ID", rs.getBigDecimal("ESTADO_ID"));
						row.put("TIPO_AGENCIA", rs.getString("TIPO_AGENCIA"));
						if (this.relatorio.getParametros().get("GRUPO_RUTA") != null) {
							row.put("GRUPO_RUTA", rs.getString("GRUPO_RUTA"));					
						} else {
							row.put("GRUPO_RUTA", " ----- ");							
						}

						// Como a receita de bagagem é obtida por agencia, já calcula o valor
						if (!(Boolean) this.relatorio.getParametros().get("B_EXCLUI_BAGAGEM"))
						{
							BigDecimal receitaBagagem = getValorReceitaBagagem(puntoVentaId, empresaId);
							try {
								row.put("IMPOSTOS", getValorImposto(rs.getInt("ORIGEM_ESTADO_ID"), rs.getInt("EMPRESA_ID"), rs.getString("INTERESTADUAL"), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, receitaBagagem));
							} catch (Exception e) {
								// Este erro não é tratado pois existem demais pontos no relatorio que fazem esta chamada com os mesmos parametros e fazer o tratamento correto.

							}
							row.put("RECEITA_BAGAGEM", receitaBagagem);

						}
					}
				}
				return row;
			}

			@Override
			public void initDados() throws Exception {
				pontoVendaConfiguracao = new HashSet<PuntoVenta>();
				this.prepareQuery();
				this.mapDados = new LinkedHashMap<String, LinkedHashMap<String, Object>>();

				this.resultSet.setFetchSize(1000);
				while (this.resultSet.next()) {

					Integer puntoVentaId = this.resultSet.getInt("PUNTOVENTA_ID");
					Integer empresaId = this.resultSet.getInt("EMPRESA_ID");
					Integer motivoCancelacionId = this.resultSet.getInt("MOTIVOCANCELACION_ID");
					Integer tipoVentaId = this.resultSet.getInt("TIPOVENTA_ID");
					Integer idEstado = this.resultSet.getInt("ORIGEM_ESTADO_ID");

					// Inicializa a row atual
					LinkedHashMap<String, Object> row = this.getRow(puntoVentaId, empresaId, this.resultSet);

					this.mapDados.put(row.get("PUNTOVENTA_ID") + "-" + empresaId.toString(), (LinkedHashMap<String, Object>) row);
					
					boolean preVenda = isTipoVentaIdPreVenda(tipoVentaId);
				
					if ((Boolean) getParametros().get("TRANSFERENCIA_PASSAGENS")) {
						// Utiliza o -1 para retirar as transferencias
						row.put("TOTAL_BILHETES", ((BigDecimal) row.get("TOTAL_BILHETES")).add(motivoCancelacionId == 23 ? new BigDecimal(-1) : motivoCancelacionId == 0 && !preVenda ? BigDecimal.ONE : BigDecimal.ZERO));
					} else {
						row.put("TOTAL_BILHETES", ((BigDecimal) row.get("TOTAL_BILHETES")).add(motivoCancelacionId == 0 && !preVenda ? BigDecimal.ONE : BigDecimal.ZERO));
					}
					row.put("TOTAL_BILHETES_GAP", ((BigDecimal) row.get("TOTAL_BILHETES_GAP")).add(motivoCancelacionId == 0 && preVenda && this.resultSet.getInt("INDREIMPRESION") == 0 ? BigDecimal.ONE : BigDecimal.ZERO));
					row.put("TOTAL_BILHETES_CANC", ((BigDecimal) row.get("TOTAL_BILHETES_CANC")).add(motivoCancelacionId == 31 ? BigDecimal.ONE : BigDecimal.ZERO));

					
					
					// Aumenta receita
					// Não se trate de cancelamento e  seja uma impressao de pre venda
					if (motivoCancelacionId == 0 && !((tipoVentaId.equals(18) && this.resultSet.getInt("INDREIMPRESION") == 1))) {

						/*row.put("RECEITA_TARIFA", ((BigDecimal) row.get("RECEITA_TARIFA")).add(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_TARIFA_GAP", ((BigDecimal) row.get("RECEITA_TARIFA_GAP")).add((tipoVentaId.equals(18) || tipoVentaId.equals(39)) ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO", ((BigDecimal) row.get("RECEITA_SEGURO")).add(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO_GAP", ((BigDecimal) row.get("RECEITA_SEGURO_GAP")).add(((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTESEGURO") != null) ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE", ((BigDecimal) row.get("RECEITA_EMBARQUE")).add(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE_GAP", ((BigDecimal) row.get("RECEITA_EMBARQUE_GAP")).add((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS", ((BigDecimal) row.get("RECEITA_OUTROS")).add(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS_GAP", ((BigDecimal) row.get("RECEITA_OUTROS_GAP")).add((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO", ((BigDecimal) row.get("RECEITA_PEDAGIO")).add(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO_GAP", ((BigDecimal) row.get("RECEITA_PEDAGIO_GAP")).add((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));

						// Realiza os calculos de comissao se o tipo de venda não for "EM ABERTO" e se for venda normal, ou se for GAP e o check estiver marcado
						if (!tipoVentaId.equals(9) && ((!tipoVentaId.equals(18) && !tipoVentaId.equals(39)) || ((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && (Boolean) this.relatorio.getParametros().get("B_CONTEMPLAR_GAP"))))
							this.setRowComissao(row);*/
						
						//Mantis 16390
						//As vendas com impressao posterior não estavam sendo exibidas como pre venda pois so estavam sendo validados os tipoVendaId 18 e 39.
						//Verifiquei a classe RelatorioImpressaoPosterior e adicionei os tipoVendaId faltantes de acordo com sua regra de negocio.
						
						row.put("RECEITA_TARIFA", ((BigDecimal) row.get("RECEITA_TARIFA")).add(!preVenda ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_TARIFA_GAP", ((BigDecimal) row.get("RECEITA_TARIFA_GAP")).add(preVenda ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO", ((BigDecimal) row.get("RECEITA_SEGURO")).add(!preVenda && this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO_GAP", ((BigDecimal) row.get("RECEITA_SEGURO_GAP")).add((preVenda && this.resultSet.getBigDecimal("IMPORTESEGURO") != null) ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE", ((BigDecimal) row.get("RECEITA_EMBARQUE")).add(!preVenda && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE_GAP", ((BigDecimal) row.get("RECEITA_EMBARQUE_GAP")).add(preVenda && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS", ((BigDecimal) row.get("RECEITA_OUTROS")).add(!preVenda && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS_GAP", ((BigDecimal) row.get("RECEITA_OUTROS_GAP")).add(preVenda && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO", ((BigDecimal) row.get("RECEITA_PEDAGIO")).add(!preVenda && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO_GAP", ((BigDecimal) row.get("RECEITA_PEDAGIO_GAP")).add(preVenda && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
						
						// Realiza os calculos de comissao se o tipo de venda não for "EM ABERTO" e se for venda normal, ou se for GAP e o check estiver marcado
						if (!tipoVentaId.equals(9) && (!preVenda || (preVenda && (Boolean) this.relatorio.getParametros().get("B_CONTEMPLAR_GAP"))))
							this.setRowComissao(row);
					}

					// Aumenta imposto
					if ((motivoCancelacionId == 0 && tipoVentaId != 18) || ((tipoVentaId == 18 && this.resultSet.getInt("INDREIMPRESION") == 1))) {
						row.put("IMPOSTOS", ((BigDecimal) row.get("IMPOSTOS")).add(getValorImposto(idEstado, empresaId, this.resultSet.getString("INTERESTADUAL"), this.resultSet.getBigDecimal("PRECIOPAGADO"), this.resultSet.getBigDecimal("IMPORTESEGURO"), this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE"), this.resultSet.getBigDecimal("IMPORTEPEDAGIO"), BigDecimal.ZERO)));
					}

					// Deduz imposto
					if ((tipoVentaId != 18 && motivoCancelacionId != 0) || (tipoVentaId == 18 && this.resultSet.getInt("INDREIMPRESION") == 1 && this.resultSet.getInt("POSSUI_CANC") == 1)) {
						row.put("IMPOSTOS", ((BigDecimal) row.get("IMPOSTOS")).subtract(getValorImposto(idEstado, empresaId, this.resultSet.getString("INTERESTADUAL"), this.resultSet.getBigDecimal("PRECIOPAGADO"), this.resultSet.getBigDecimal("IMPORTESEGURO"), this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE"), this.resultSet.getBigDecimal("IMPORTEPEDAGIO"), BigDecimal.ZERO)));

					}
					
					// Deduz os cancelamentos e trocas e transferencias
					if (motivoCancelacionId == 31 || motivoCancelacionId == 10 || (motivoCancelacionId == 23 && (Boolean) getParametros().get("TRANSFERENCIA_PASSAGENS"))) {

						/*row.put("RECEITA_TARIFA", ((BigDecimal) row.get("RECEITA_TARIFA")).subtract(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_TARIFA_GAP", ((BigDecimal) row.get("RECEITA_TARIFA_GAP")).subtract((tipoVentaId.equals(18) || tipoVentaId.equals(39)) ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO", ((BigDecimal) row.get("RECEITA_SEGURO")).subtract(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO_GAP", ((BigDecimal) row.get("RECEITA_SEGURO_GAP")).subtract(((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTESEGURO") != null) ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE", ((BigDecimal) row.get("RECEITA_EMBARQUE")).subtract(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE_GAP", ((BigDecimal) row.get("RECEITA_EMBARQUE_GAP")).subtract((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS", ((BigDecimal) row.get("RECEITA_OUTROS")).subtract(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS_GAP", ((BigDecimal) row.get("RECEITA_OUTROS_GAP")).subtract((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO", ((BigDecimal) row.get("RECEITA_PEDAGIO")).subtract(!tipoVentaId.equals(18) && !tipoVentaId.equals(39) && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO_GAP", ((BigDecimal) row.get("RECEITA_PEDAGIO_GAP")).subtract((tipoVentaId.equals(18) || tipoVentaId.equals(39)) && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));*/
						
						//Mantis 16390
						//As vendas com impressao posterior não estavam sendo exibidas como pre venda pois so estavam sendo validados os tipoVendaId 18 e 39.
						//Verifiquei a classe RelatorioImpressaoPosterior e adicionei os tipoVendaId faltantes de acordo com sua regra de negocio.
						
						row.put("RECEITA_TARIFA", ((BigDecimal) row.get("RECEITA_TARIFA")).subtract(!preVenda ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_TARIFA_GAP", ((BigDecimal) row.get("RECEITA_TARIFA_GAP")).subtract(preVenda ? this.resultSet.getBigDecimal("PRECIOPAGADO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO", ((BigDecimal) row.get("RECEITA_SEGURO")).subtract(!preVenda && this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_SEGURO_GAP", ((BigDecimal) row.get("RECEITA_SEGURO_GAP")).subtract((preVenda && this.resultSet.getBigDecimal("IMPORTESEGURO") != null) ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE", ((BigDecimal) row.get("RECEITA_EMBARQUE")).subtract(!preVenda && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_EMBARQUE_GAP", ((BigDecimal) row.get("RECEITA_EMBARQUE_GAP")).subtract(preVenda && this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS", ((BigDecimal) row.get("RECEITA_OUTROS")).subtract(!preVenda && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_OUTROS_GAP", ((BigDecimal) row.get("RECEITA_OUTROS_GAP")).subtract(preVenda && this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO", ((BigDecimal) row.get("RECEITA_PEDAGIO")).subtract(!preVenda && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
						row.put("RECEITA_PEDAGIO_GAP", ((BigDecimal) row.get("RECEITA_PEDAGIO_GAP")).subtract(preVenda && this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO));
					}
					// Aumenta devolucao
					if (motivoCancelacionId == 32) {

						// Verificia se a devolucao e pra ser contabilizada na agencia de destino ou de origem da venda
						// if (((Integer) this.relatorio.getParametros().get("ISDEVOLUCAODESTINO") == 1) || (((Integer) this.relatorio.getParametros().get("ISDEVOLUCAODESTINO")).equals(0) && this.resultSet.getInt("POSSUI_CANC") == 1)) {
						row.put("TOTAL_DEVOL", ((BigDecimal) row.get("TOTAL_DEVOL")).add(!(tipoVentaId.equals(18) || tipoVentaId.equals(5))? this.resultSet.getBigDecimal("PRECIOPAGADO").add(this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO) : BigDecimal.ZERO));
						row.put("TOTAL_DEVOL_GAP", ((BigDecimal) row.get("TOTAL_DEVOL_GAP")).add(tipoVentaId.equals(18) || tipoVentaId.equals(5) ? this.resultSet.getBigDecimal("PRECIOPAGADO").add(this.resultSet.getBigDecimal("IMPORTESEGURO") != null ? this.resultSet.getBigDecimal("IMPORTESEGURO") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") != null ? this.resultSet.getBigDecimal("IMPORTETAXAEMBARQUE") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTEPEDAGIO") != null ? this.resultSet.getBigDecimal("IMPORTEPEDAGIO") : BigDecimal.ZERO).add(this.resultSet.getBigDecimal("IMPORTEOUTROS") != null ? this.resultSet.getBigDecimal("IMPORTEOUTROS") : BigDecimal.ZERO) : BigDecimal.ZERO));

						// }
					}
				}
				this.dados = new ArrayList<Map<String, Object>>(this.mapDados.values());
				
			}
		});

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio#processaParametros()
	 */
	@Override
	public void processaParametros() throws Exception {
	}

	public LinkedHashMap<String, Object> getConfigComissao(Integer puntoVentaId, Integer empresaId) throws Exception {

		LinkedHashMap<String, Object> cacheConfig = null;

		// Verifica se ja existe configuracao na memoria, caso não exista, realiza busca no banco
		if (!mapCacheConfigComissao.containsKey(puntoVentaId.toString() + "_" + empresaId.toString())) {
			StringBuilder sql = new StringBuilder();

			sql.append(" SELECT PC.ISSRETIDO, PC.ROYALTIES, PC.ENVIARRECIBO, PC.RECEITA, PC.CODAG, PC.PASSAGEMALTA, PC.PASSAGEMBAIXA,  ");
			sql.append("        PC.SEGUROALTA, PC.SEGUROBAIXA, PC.OUTROSBAIXA, PC.OUTROSALTA, PC.EXCESSOALTA, PC.EXCESSOBAIXA, ");
			sql.append("        PC.TARIFARECEITA, PC.SEGURORECEITA, PC.TAXARECEITA, PC.PEDAGIORECEITA, TP.DESCTIPO AS TIPO_AGENCIA,  ");
			sql.append("        PC.TARIFADEV, PC.SEGURO_DEV, PC.TAXADEV, PC.PEDAGIODEV, PV.PUNTOVENTA_ID, PV.NUMPUNTOVENTA, PV.NOMBPUNTOVENTA,  ");
			sql.append("        ES.CVEESTADO, ES.ESTADO_ID, PC.SEGUROOBRIGATORIOALTA, PC.SEGUROOBRIGATORIOBAIXA  ");
			sql.append("   FROM PTOVTA_COMISSAO PC ");
			sql.append("   INNER JOIN PUNTO_VENTA     PV ON PV.PUNTOVENTA_ID = PC.PUNTOVENTA_ID AND PC.PTOVTADESCOMISSAO_ID = PV.PUNTOVENTA_ID ");
			sql.append("   INNER JOIN PARADA          PR ON PR.PARADA_ID = PV.PARADA_ID ");
			sql.append("   INNER JOIN CIUDAD          CD ON CD.CIUDAD_ID = PR.CIUDAD_ID ");
			sql.append("   INNER JOIN ESTADO          ES ON ES.ESTADO_ID = CD.ESTADO_ID ");
			sql.append("   INNER JOIN TIPO_PTOVTA     TP ON TP.TIPOPTOVTA_ID = PV.TIPOPTOVTA_ID");
			sql.append("  WHERE PC.ACTIVO = 1 ");
			sql.append("    AND PC.PUNTOVENTA_ID = :PUNTOVENTA_ID ");
			if (empresaId > 0)
				sql.append("    AND PC.EMPRESA_ID = :EMPRESA_ID ");
			NamedParameterStatement stmt = new NamedParameterStatement(this.getConexao(), sql.toString());
			stmt.setInt("PUNTOVENTA_ID", puntoVentaId);
			if (empresaId > 0)
				stmt.setInt("EMPRESA_ID", empresaId);

			ResultSet rs = stmt.executeQuery();

			if (rs.next()) {
				cacheConfig = new LinkedHashMap<String, Object>();

				cacheConfig.put("ISSRETIDO", rs.getBigDecimal("ISSRETIDO"));
				cacheConfig.put("ROYALTIES", rs.getBigDecimal("ROYALTIES"));
				cacheConfig.put("PASSAGEMALTA", rs.getBigDecimal("PASSAGEMALTA"));
				cacheConfig.put("PASSAGEMBAIXA", rs.getBigDecimal("PASSAGEMBAIXA"));
				cacheConfig.put("SEGUROALTA", rs.getBigDecimal("SEGUROALTA"));
				cacheConfig.put("SEGUROBAIXA", rs.getBigDecimal("SEGUROBAIXA"));
				cacheConfig.put("OUTROSALTA", rs.getBigDecimal("OUTROSALTA"));
				cacheConfig.put("OUTROSBAIXA", rs.getBigDecimal("OUTROSBAIXA"));
				cacheConfig.put("EXCESSOALTA", rs.getBigDecimal("EXCESSOALTA"));
				cacheConfig.put("EXCESSOBAIXA", rs.getBigDecimal("EXCESSOBAIXA"));
				cacheConfig.put("SEGUROOBRIGATORIOBAIXA", rs.getBigDecimal("SEGUROOBRIGATORIOBAIXA"));
				cacheConfig.put("SEGUROOBRIGATORIOALTA", rs.getBigDecimal("SEGUROOBRIGATORIOALTA"));

				cacheConfig.put("TARIFARECEITA", rs.getBoolean("TARIFARECEITA"));
				cacheConfig.put("SEGURORECEITA", rs.getBoolean("SEGURORECEITA"));
				cacheConfig.put("TAXARECEITA", rs.getBoolean("TAXARECEITA"));
				cacheConfig.put("PEDAGIORECEITA", rs.getBoolean("PEDAGIORECEITA"));
				cacheConfig.put("TARIFADEV", rs.getBoolean("TARIFADEV"));
				cacheConfig.put("SEGURO_DEV", rs.getBoolean("SEGURO_DEV"));
				cacheConfig.put("TAXADEV", rs.getBoolean("TAXADEV"));
				cacheConfig.put("PEDAGIODEV", rs.getBoolean("PEDAGIODEV"));

				cacheConfig.put("RECEITA", rs.getString("RECEITA"));
				cacheConfig.put("TIPO_AGENCIA", rs.getString("TIPO_AGENCIA"));
				cacheConfig.put("NUMPUNTOVENTA", rs.getString("NUMPUNTOVENTA"));
				cacheConfig.put("NOMBPUNTOVENTA", rs.getString("NOMBPUNTOVENTA"));
				cacheConfig.put("CVEESTADO", rs.getString("CVEESTADO"));

				cacheConfig.put("ESTADO_ID", rs.getInt("ESTADO_ID"));
				cacheConfig.put("PUNTOVENTA_ID", rs.getInt("PUNTOVENTA_ID"));

				mapCacheConfigComissao.put(puntoVentaId.toString() + "_" + empresaId.toString(), cacheConfig);

			}
			else {
				StringBuilder sqlParam = new StringBuilder();

				sqlParam.append(" SELECT EM.NOMBEMPRESA, PV.NOMBPUNTOVENTA, PV.PUNTOVENTA_ID, PV.NUMPUNTOVENTA ");
				sqlParam.append("   FROM EMPRESA 	 EM, ");
				sqlParam.append("        PUNTO_VENTA PV ");
				sqlParam.append("  WHERE PV.PUNTOVENTA_ID = :PUNTOVENTA_ID ");
				if (empresaId > 0)
					sqlParam.append("    AND EM.EMPRESA_ID = :EMPRESA_ID ");
				NamedParameterStatement stmtParam = new NamedParameterStatement(this.getConexao(), sqlParam.toString());
				stmtParam.setInt("PUNTOVENTA_ID", puntoVentaId);
				if (empresaId > 0)
					stmtParam.setInt("EMPRESA_ID", empresaId);

				ResultSet rsParam = stmtParam.executeQuery();

				if (rsParam.next()){
					pontoVendaConfiguracao.add(new PuntoVenta(new Integer (rsParam.getString("PUNTOVENTA_ID")), rsParam.getString("NOMBPUNTOVENTA"), rsParam.getString("NUMPUNTOVENTA")));
				}
				rsParam.close();
				stmtParam.close();
			}

			rs.close();
			stmt.close();

		}
		else
			cacheConfig = mapCacheConfigComissao.get(puntoVentaId.toString() + "_" + empresaId.toString());

		return cacheConfig;

	}

	public HashMap<String, Object> getConfigImposto(Integer empresaId, Integer estadoId) throws Exception {
		HashMap<String, Object> cacheConfig = null;

		try {
			cacheConfig = (HashMap<String, Object>) CalculoImposto.getConfigImpostoByEstadoOrigem(this.getConexao(), estadoId, empresaId);
		} catch (Exception e) {
			if (e instanceof ExceptionConfiguracao)
				this.addInfoMsg(e.getMessage());
			else
				throw e;
		}

		return cacheConfig;
	}

	public BigDecimal getValorImposto(Integer estadoId, Integer empresaId, String indInterestadual, BigDecimal tarifa, BigDecimal seguro, BigDecimal embarque, BigDecimal pedagio, BigDecimal bagagem) throws Exception {
		try {
			Integer tipoBaseCalculo = (Integer) this.getParametros().get("BASE_CALCULO_IMPOSTO");
			Boolean indBaseTarifa = (tipoBaseCalculo == 1 || tipoBaseCalculo == 2 ? true : false);
			Boolean indBaseSeguro = (tipoBaseCalculo == 1 || tipoBaseCalculo == 3 ? true : false);
			Boolean indBaseEmbarque = (tipoBaseCalculo == 1 || tipoBaseCalculo == 4 ? true : false);
			Boolean indBasePedagio = (tipoBaseCalculo == 1 || tipoBaseCalculo == 5 ? true : false);
			Boolean indBaseBagagem = (tipoBaseCalculo == 1 || tipoBaseCalculo == 6 ? true : false);

			return CalculoImposto.getValorImpostoRelatorioReceitaDiaria(this.getConexao(), estadoId, empresaId, indInterestadual, tarifa, seguro, embarque, pedagio, bagagem, indBaseTarifa, indBaseSeguro, indBaseEmbarque, indBasePedagio, indBaseBagagem);
		} catch (Exception e) {
			if (e instanceof ExceptionConfiguracao)
				this.addInfoMsg(e.getMessage());
			else
				throw e;
		}
		return BigDecimal.ZERO;
	}

	public BigDecimal getValorReceitaBagagem(Integer puntoVentaId, Integer empresaId) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT nvl(SUM(CASE ");
		sql.append("         WHEN EE.TIPOEVENTOEXTRA_ID = 1 AND EE.ACTIVO = 1 THEN ");
		sql.append("         EE.IMPINGRESO ");
		sql.append("       END),0) RECEITA_BAGAGEM ");
		sql.append(" FROM EVENTO_EXTRA EE  ");
		sql.append(" WHERE TRUNC(EE.FECHORINGRESO) BETWEEN :DATA_INICIO AND ");
		sql.append("        :DATA_FINAL ");
		sql.append("   AND EE.PUNTOVENTA_ID = :PUNTOVENTA_ID  ");
		sql.append("   AND EE.EMPRESA_ID = :EMPRESA_ID  ");

		NamedParameterStatement stmt = new NamedParameterStatement(this.getConexao(), sql.toString());
		stmt.setInt("PUNTOVENTA_ID", puntoVentaId);
		stmt.setInt("EMPRESA_ID", empresaId);
		stmt.setDate("DATA_INICIO",  new java.sql.Date(((java.util.Date) this.getParametros().get("DATA_INICIO")).getTime()));
		stmt.setDate("DATA_FINAL", new java.sql.Date(((java.util.Date) this.getParametros().get("DATA_FINAL")).getTime()));

		ResultSet rs = stmt.executeQuery();
		if (rs.next()) {
			BigDecimal receitaBagagem = rs.getBigDecimal("RECEITA_BAGAGEM");

			rs.close();
			stmt.close();

			return receitaBagagem;
		}
		else {
			rs.close();
			stmt.close();
			return BigDecimal.ZERO;
		}

	}

	public BigDecimal getValorAntecipacaoComissao(Integer puntoVentaId) throws SQLException {
		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT SUM(PA.RETEM) TOTAL_ANTECIPACAO ");
		sql.append("   FROM PTOVTA_ANTECIPACOMISSAO PA ");
		sql.append(" WHERE PA.ACTIVO = 1 ");
		sql.append("   AND PA.DATA BETWEEN  :DATA_INICIO AND ");
		sql.append("        :DATA_FINAL ");
		sql.append("  AND PA.PUNTOVENTA_ID = :PUNTOVENTA_ID  ");

		NamedParameterStatement stmt = new NamedParameterStatement(this.getConexao(), sql.toString());
		stmt.setInt("PUNTOVENTA_ID", puntoVentaId);
		
		stmt.setDate("DATA_INICIO",  new java.sql.Date(((java.util.Date) this.getParametros().get("DATA_INICIO")).getTime()));
		stmt.setDate("DATA_FINAL", new java.sql.Date(((java.util.Date) this.getParametros().get("DATA_FINAL")).getTime()));

		ResultSet rs = stmt.executeQuery();
		if (rs.next()) {
			BigDecimal antecipacaoComissao = rs.getBigDecimal("TOTAL_ANTECIPACAO");
			rs.close();
			stmt.close();
			return (antecipacaoComissao == null) ? BigDecimal.ZERO : antecipacaoComissao;
		}
		else {
			rs.close();
			stmt.close();
			return BigDecimal.ZERO;
		}

	}

	private String getSql() {

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT ES.CVEESTADO, ");
		sql.append("        PV.PUNTOVENTA_ID, ");
		sql.append("        PV.NUMPUNTOVENTA, ");
		sql.append("        PV.NOMBPUNTOVENTA, ");
		if (this.getParametros().get("GRUPO_RUTA") != null) {
			sql.append("        GR.DESCGRUPO as GRUPO_RUTA, ");			
		}
		sql.append("        CJ.EMPRESAPUNTOVENTA_ID, ");
		sql.append("        CE.ESTADO_ID, ");
		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("        CO.ESTADO_ID ORIGEM_ESTADO_ID, ");
		sql.append("        CD.ESTADO_ID DESTINO_ESTADO_ID, ");
		sql.append("        CJ.PRECIOPAGADO, ");
		sql.append("        CJ.MOTIVOCANCELACION_ID, ");
		sql.append("        CJ.TIPOVENTA_ID, ");
		sql.append("        CJ.IMPORTESEGURO, ");
		sql.append("        CJ.IMPORTETAXAEMBARQUE, ");
		sql.append("        CJ.IMPORTEOUTROS, ");
		sql.append("        CJ.IMPORTEPEDAGIO, ");
		sql.append("        CJ.INDREIMPRESION, ");
		sql.append("        CJ.FECCORRIDA, ");
		sql.append("        (SELECT 1 ");
		sql.append("          FROM CAJA CJD ");
		sql.append("        WHERE CJD.FECCORRIDA = CJ.FECCORRIDA ");
		sql.append("          AND CJD.CORRIDA_ID = CJ.CORRIDA_ID ");
		sql.append("          AND CJD.NUMFOLIOSISTEMA = CJ.NUMFOLIOSISTEMA ");
		sql.append("          AND CJD.NUMASIENTO = CJ.NUMASIENTO ");
		sql.append("          AND CJD.CAJA_ID <> CJ.CAJA_ID ");
		sql.append("          AND CJD.INDSTATUSOPERACION = 'F' ");
		sql.append("          AND CJD.INDREIMPRESION = 0 ");
		sql.append("          AND CJD.PUNTOVENTA_ID = CJ.PUNTOVENTA_ID");
		sql.append("          AND ROWNUM = 1) POSSUI_CANC, ");
		sql.append("          TP.DESCTIPO AS TIPO_AGENCIA, ");
		sql.append("          EC.NOMBEMPRESA, ");
		sql.append("          EC.EMPRESA_ID ");
		sql.append("   FROM CAJA        CJ, ");
		sql.append("        PUNTO_VENTA PV, ");
		sql.append("        MARCA       MC, ");
		sql.append("        EMPRESA     EC, ");
		sql.append("        PARADA      PR, ");
		sql.append("        CIUDAD      CX, ");
		sql.append("        CIUDAD      CE, ");
		sql.append("        ESTADO      ES, ");
		sql.append("        PARADA      PO, ");
		sql.append("        PARADA      PD, ");
		sql.append("        CIUDAD      CO, ");
		sql.append("        CIUDAD      CD, ");
		sql.append("       	TIPO_PTOVTA TP ");
		if (this.getParametros().get("GRUPO_RUTA") != null) {
			sql.append(",        RUTA        RU, ");
	        sql.append("        GRUPO_RUTA  GR ");
		}
		sql.append("  WHERE CJ.PUNTOVENTA_ID = PV.PUNTOVENTA_ID ");
		
		if (this.getParametros().get("GRUPO_RUTA") != null) {
			sql.append(" AND CJ.RUTA_ID = RU.RUTA_ID ");
			sql.append(" AND RU.GRUPORUTA_ID = GR.GRUPORUTA_ID ");
		}
				
		if ((Boolean) this.getParametros().get("SOMENTE_CANCELADOS")) {
			sql.append(" AND CJ.MOTIVOCANCELACION_ID is not null ");
		}
		
		if (this.getParametros().get("GRUPO_RUTA") != null) {
			sql.append(" AND GR.GRUPORUTA_ID = :GRUPO_RUTA" );
		}
		
		if ((Boolean) this.getParametros().get("B_DATA_FECHAMENTO")){
			sql.append("    AND CJ.FECCORTE BETWEEN :DATA_INICIO AND :DATA_FINAL ");	
		}else{
			sql.append("    AND CJ.FECHORVENTA BETWEEN cast(:DATA_INICIO as DATE) AND cast(:DATA_FINAL AS DATE)  ");			
		}

		sql.append("    AND CJ.ACTIVO = 1 ");
		sql.append("    AND PR.PARADA_ID = PV.PARADA_ID ");
		sql.append("    AND CJ.MARCA_ID = MC.MARCA_ID ");
		sql.append("    AND MC.EMPRESA_ID = EC.EMPRESA_ID ");
		sql.append("    AND EC.CIUDAD_ID = CE.CIUDAD_ID ");
		sql.append("    AND CX.CIUDAD_ID = PR.CIUDAD_ID ");
		sql.append("    AND CX.ESTADO_ID = ES.ESTADO_ID ");
		sql.append("    AND CJ.ORIGEN_ID = PO.PARADA_ID ");
		sql.append("    AND CJ.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 CJ.INDSTATUSOPERACION = 'F' ");
		sql.append("    AND NVL(CJ.MONEDA_ID, 1) = :MOEDA_ID ");
		sql.append("    AND ((CJ.TIPOVENTA_ID <> 18 AND CJ.INDREIMPRESION = 0) OR (CJ.TIPOVENTA_ID = 18)) ");
		sql.append("    AND PV.TIPOPTOVTA_ID = NVL(:TIPOPTOVTA_ID, PV.TIPOPTOVTA_ID) ");
		sql.append("    AND TP.TIPOPTOVTA_ID = PV.TIPOPTOVTA_ID ");
		sql.append("    AND EC.EMPRESA_ID = NVL(:EMPRESA_ID, EC.EMPRESA_ID) ");
		sql.append("    AND ((INSTR(:NUMPUNTOVENTA, ',' || TRIM(PV.NUMPUNTOVENTA) || ',') > 0 AND ");
		sql.append("        :ISNUMPUNTOVENTATODOS = 'N') OR (:ISNUMPUNTOVENTATODOS = 'S')) ");
		sql.append("    AND ((INSTR(:ESTADO_ID, ',' || TRIM(ES.ESTADO_ID) || ',') > 0 AND ");
		sql.append("        :ISESTADOTODOS = 'N') OR (:ISESTADOTODOS = 'S')) ");
		sql.append("    ORDER BY lpad(to_number(regexp_substr(PV.NUMPUNTOVENTA, '\\d+')), 6), EC.NOMBEMPRESA, ES.CVEESTADO  ");
		return sql.toString();
	}
	
	private boolean isTipoVentaIdPreVenda(Integer tipoVentaId) {
		return listaTipoVentaIdPreVenda.contains(tipoVentaId);
	}
	public Set<PuntoVenta> getPontoVendaConfiguracao() {
		return pontoVendaConfiguracao;
	}

	public void setPontoVendaConfiguracao(Set<PuntoVenta> pontoVendaConfiguracao) {
		this.pontoVendaConfiguracao = pontoVendaConfiguracao;
	}

}