/**
 * 
 */
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.HashMap;
import java.util.Map;

import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
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.web.utilerias.NamedParameterStatement;

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

	private Map<String, HashMap<String, Object>> mapCacheConfigComissao;

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

		super(parametros, conexao);

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

		this.setCustomDataSource(new ArrayDataSource(this) {

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

			@Override
			public Object valueCustomFields(String fieldName) throws Exception {
				if (fieldName.equals("RECEITA_TOTAL")) {
					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")).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("NUMPUNTOVENTA") != null) {
					StringBuilder strNumPuntoVenta = new StringBuilder();

					for (PuntoVenta s : (ArrayList<PuntoVenta>) parametros.get("NUMPUNTOVENTA")) {
						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);

				stmt.setDate("DATA_INICIO", (java.sql.Date) parametros.get("DATA_INICIO"));
				stmt.setDate("DATA_FINAL", (java.sql.Date) parametros.get("DATA_FINAL"));
				stmt.setString("ISNUMPUNTOVENTATODOS", (String) parametros.get("ISNUMPUNTOVENTATODOS"));

				this.resultSet = stmt.executeQuery();
			}

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

				// Busca as configurações de comissão
				HashMap<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;

				// 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("SEGURORECEITA") && this.resultSet.getBigDecimal("IMPORTESEGURO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
					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"));

					// 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"))) &&
							rowOrigem.get("IMPOSTOS") != null)
						baseCalculo = baseCalculo.subtract((BigDecimal) rowOrigem.get("IMPOSTOS"));

				}
				else {
					if ((Boolean) configComissao.get("TARIFADEV") && this.resultSet.getBigDecimal("PRECIOPAGADO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("PRECIOPAGADO"));
					if ((Boolean) configComissao.get("SEGURO_DEV") && this.resultSet.getBigDecimal("IMPORTESEGURO") != null)
						baseCalculo = baseCalculo.add(this.resultSet.getBigDecimal("IMPORTESEGURO"));
					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"));
				}

				// 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");

				if (percComissao == null)
					return;
				// VALOR COMISSAO = BASE DE CALCULO * (PERCENTUAL COMISSAO / 100)
				valorComissao = baseCalculo.multiply(percComissao.divide(BigDecimal.valueOf(100)));

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

				// Deduz os royatiles
				if (royatilesComissao != null && !royatilesComissao.equals(BigDecimal.ZERO)) {
					BigDecimal fator = BigDecimal.ONE.subtract(royatilesComissao.divide(BigDecimal.valueOf(100)));
					valorComissao = valorComissao.multiply(fator);
				}

				rowDestino.put("VALOR_COMISSAO", ((BigDecimal) rowDestino.get("VALOR_COMISSAO")).add(!tipoVentaId.equals(18) ? valorComissao : BigDecimal.ZERO));

				// 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("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"), (HashMap<String, Object>) rowDestino);
				}
			}

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

				Map<String, Object> row;
				if (mapDados.containsKey(puntoVentaId.toString() + "-" + empresaId.toString())) {
					row = mapDados.get(puntoVentaId.toString() + "-" + empresaId.toString());
				}
				else
				{
					row = new HashMap<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"));

						// 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 {

				this.prepareQuery();
				this.mapDados = new HashMap<String, HashMap<String, Object>>();

				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
					Map<String, Object> row = this.getRow(puntoVentaId, empresaId, this.resultSet);

					this.mapDados.put(row.get("PUNTOVENTA_ID") + "-" + empresaId.toString(), (HashMap<String, Object>) row);

					row.put("TOTAL_BILHETES", ((BigDecimal) row.get("TOTAL_BILHETES")).add(motivoCancelacionId == 0 && !tipoVentaId.equals(18) ? BigDecimal.ONE : BigDecimal.ZERO));
					row.put("TOTAL_BILHETES_GAP", ((BigDecimal) row.get("TOTAL_BILHETES_GAP")).add(motivoCancelacionId == 0 && tipoVentaId.equals(18) && 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 não seja uma impressão de pré 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 comissão 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);
					}

					// 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
					if (motivoCancelacionId == 31 || motivoCancelacionId == 10) {

						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));

					}
					// Aumenta devolução
					if (motivoCancelacionId == 32) {

						// Verificia se a devolução é pra ser contabilizada na agência 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) ? 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) ? 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 HashMap<String, Object> getConfigComissao(Integer puntoVentaId, Integer empresaId) throws Exception {

		HashMap<String, Object> cacheConfig = null;

		// Verifica se já existe configuração 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.CVEPTOVTA 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  ");
			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.EMPRESA_ID = :EMPRESA_ID ");
			sql.append("    AND PC.PUNTOVENTA_ID = :PUNTOVENTA_ID ");

			NamedParameterStatement stmt = new NamedParameterStatement(this.getConexao(), sql.toString());
			stmt.setInt("PUNTOVENTA_ID", puntoVentaId);
			stmt.setInt("EMPRESA_ID", empresaId);

			ResultSet rs = stmt.executeQuery();

			if (rs.next()) {
				cacheConfig = new HashMap<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("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 ");
				sqlParam.append("   FROM EMPRESA 	 EM, ");
				sqlParam.append("        PUNTO_VENTA PV ");
				sqlParam.append("  WHERE EM.EMPRESA_ID = :EMPRESA_ID ");
				sqlParam.append("    AND PV.PUNTOVENTA_ID = :PUNTOVENTA_ID ");

				NamedParameterStatement stmtParam = new NamedParameterStatement(this.getConexao(), sqlParam.toString());
				stmtParam.setInt("PUNTOVENTA_ID", puntoVentaId);
				stmtParam.setInt("EMPRESA_ID", empresaId);

				ResultSet rsParam = stmtParam.executeQuery();

				if (rsParam.next())
					this.addInfoMsg("Não foi possivel obter a configuração de comissão do ponto de venda: " + rsParam.getString("NOMBPUNTOVENTA") + " empresa: " + rsParam.getString("NOMBEMPRESA") + " .");

				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", (java.sql.Date) this.getParametros().get("DATA_INICIO"));
		stmt.setDate("DATA_FINAL", (java.sql.Date) this.getParametros().get("DATA_FINAL"));

		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", (java.sql.Date) this.getParametros().get("DATA_INICIO"));
		stmt.setDate("DATA_FINAL", (java.sql.Date) this.getParametros().get("DATA_FINAL"));

		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, ");
		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.CVEPTOVTA  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     EM, ");
		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 ");
		sql.append("  WHERE CJ.PUNTOVENTA_ID = PV.PUNTOVENTA_ID ");
		sql.append("    AND TRUNC(CJ.FECHORVENTA) BETWEEN :DATA_INICIO AND ");
		sql.append("        :DATA_FINAL ");
		sql.append("    AND PR.PARADA_ID = PV.PARADA_ID ");
		sql.append("    AND CJ.EMPRESAPUNTOVENTA_ID = EM.EMPRESA_ID ");
		sql.append("    AND CJ.MARCA_ID = MC.MARCA_ID ");
		sql.append("    AND MC.EMPRESA_ID = EC.EMPRESA_ID ");
		sql.append("    AND EM.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 ((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	EC.NOMBEMPRESA, ES.CVEESTADO  ");

		return sql.toString();
	}

}
