package com.ejie.ab79.dao.AB63;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.AB63.EstablecimientosRegistrados;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.DatosTerceros;
import com.ejie.ab79.model.expedientes.Sexo;
import com.ejie.ab79.model.expedientes.TiposDocumento;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableRequestDto;

/**
 * EstablecimientosRegistradosDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class EstablecimientosRegistradosDaoImpl implements EstablecimientosRegistradosDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDESTABLECIMIENTO",
			"IDENTIFICADORESTABLECIMIENTO", "ESTABLECIMIENTO", "DIRECCION", "FECHAAPERTURA", "DOCUMENTO", "NOMBRE",
			"APELLIDO1", "APELLIDO2" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<EstablecimientosRegistrados> rwMap = new RowMapper<EstablecimientosRegistrados>() {
		public EstablecimientosRegistrados mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			EstablecimientosRegistrados establecimiento = new EstablecimientosRegistrados();

			establecimiento.setIdEstablecimiento(resultSet.getInt("IDESTABLECIMIENTO"));
			establecimiento.setIdentificadorEstablecimiento(resultSet.getString("IDENTIFICADORESTABLECIMIENTO"));
			establecimiento.setFechaApertura(resultSet.getDate("FECHAAPERTURA"));

			DatosDirecciones datosDireccion = new DatosDirecciones();
			datosDireccion.setEstablecimiento(resultSet.getString("ESTABLECIMIENTO"));
			datosDireccion.setDireccion(resultSet.getString("DIRECCION"));
			datosDireccion.setNumero(resultSet.getString("NUMERO"));
			datosDireccion.setEscalera(resultSet.getString("ESCALERA"));
			datosDireccion.setPiso(resultSet.getString("PISO"));
			datosDireccion.setLetra(resultSet.getString("LETRA"));
			datosDireccion.setCodigoPostal(resultSet.getString("CODIGOPOSTAL"));
			datosDireccion.setIdProvincia(resultSet.getLong("IDPROVINCIA"));
			if (resultSet.wasNull()) {
				datosDireccion.setIdProvincia(null);
			}
			datosDireccion.setIdMunicipio(resultSet.getLong("IDMUNICIPIO"));
			if (resultSet.wasNull()) {
				datosDireccion.setIdMunicipio(null);
			}
			datosDireccion.setIdLocalidad(resultSet.getLong("IDLOCALIDAD"));
			if (resultSet.wasNull()) {
				datosDireccion.setIdLocalidad(null);
			}
			datosDireccion.setIdentificadorEstablecimiento(resultSet.getString("DIRECCIONIDENTESTABLECIMIENTO"));
			datosDireccion.setComplementoDireccion(resultSet.getString("COMPLEMENTODIRECCION"));

			establecimiento.setDatosDireccion(datosDireccion);

			TiposDocumento tipoDocumento = new TiposDocumento();
			tipoDocumento.setIdTipoDocumento(resultSet.getLong("IDTIPODOCUMENTO"));

			DatosTerceros datosTercero = new DatosTerceros();
			datosTercero.setDocumento(resultSet.getString("DOCUMENTO"));
			datosTercero.setNombre(resultSet.getString("NOMBRE"));
			if (resultSet.wasNull()) {
				datosTercero.setNombre("");
			}
			datosTercero.setApellido1(resultSet.getString("APELLIDO1"));
			if (resultSet.wasNull()) {
				datosTercero.setApellido1("");
			}
			datosTercero.setApellido2(resultSet.getString("APELLIDO2"));
			if (resultSet.wasNull()) {
				datosTercero.setApellido2("");
			}

			Sexo sexo = new Sexo();
			sexo.setIdSexo(resultSet.getLong("IDSEXO"));
			if (resultSet.wasNull()) {
				sexo.setIdSexo(null);
			}
			datosTercero.setSexo(sexo);

			datosTercero.setTelefono(resultSet.getLong("TELEFONO"));
			if (resultSet.wasNull()) {
				datosTercero.setTelefono(null);
			}
			datosTercero.setEmail(resultSet.getString("EMAIL"));
			if (resultSet.wasNull()) {
				datosTercero.setEmail(null);
			}
			datosTercero.setIdioma(resultSet.getInt("IDIOMA"));
			if (resultSet.wasNull()) {
				datosTercero.setIdioma(null);
			}

			datosTercero.setTipoDocumento(tipoDocumento);
			establecimiento.setDatosTercero(datosTercero);

			return establecimiento;
		}
	};

	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Transactional(readOnly = true)
	public List<EstablecimientosRegistrados> findAllLike(EstablecimientosRegistrados establecimientosregistrados,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ESTABLECIMIENTO IDESTABLECIMIENTO,  t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO,  t1.FECHA_APERTURA FECHAAPERTURA,  t3.DOCUMENTO DOCUMENTO,  "
				+ " t3.ID_TIPO_DOCUMENTO IDTIPODOCUMENTO,  t3.NOMBRE NOMBRE,  t3.APELLIDO1 APELLIDO1,  t3.APELLIDO2 APELLIDO2,  t3.ID_SEXO IDSEXO,  t3.TELEFONO TELEFONO,  t3.EMAIL EMAIL, "
				+ " t3.IDIOMA IDIOMA,  t4.ESTABLECIMIENTO ESTABLECIMIENTO,  t4.DIRECCION DIRECCION,  t4.NUMERO NUMERO,  t4.ESCALERA ESCALERA,  t4.PISO PISO,  t4.LETRA LETRA, "
				+ " t4.CODIGO_POSTAL CODIGOPOSTAL,  t4.ID_PROVINCIA IDPROVINCIA,  t4.ID_MUNICIPIO IDMUNICIPIO,  t4.ID_LOCALIDAD IDLOCALIDAD, "
				+ " t4.IDENTIFICADOR_ESTABLECIMIENTO DIRECCIONIDENTESTABLECIMIENTO, t4.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION ");
		query.append(
				"FROM ESTABLECIMIENTOS_REGISTRADOS t1,  REL_EST_TER t2,  DATOS_TERCEROS t3,  (SELECT * FROM DATOS_DIRECCIONES WHERE ID_TIPO_DIRECCION = "
						+ Constantes.ID_UBICACION_INVERSION + "  ) t4,  TIPOS_TERCERO t5,  REL_EST_DIR T6 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(establecimientosregistrados, startsWith);
		StringBuilder where = new StringBuilder(
				"  WHERE 1 = 1 AND t1.ID_ESTABLECIMIENTO = t2.ID_ESTABLECIMIENTO AND t2.ID_TERCERO = t3.ID_TERCERO "
				+ " AND t1.ID_ESTABLECIMIENTO = t6.ID_ESTABLECIMIENTO AND t6.ID_DIRECCION = t4.ID_DIRECCION AND t2.ID_TIPO_TERCERO = t5.ID_TIPO_TERCERO AND t1.TIPO_REGISTRO = '"
						+ Constantes.TIPO_REGISTRO_D + "' ");

		if (establecimientosregistrados.getCampaina() != null) {
			where.append(
					" AND t1.IDENTIFICADOR_ESTABLECIMIENTO NOT IN (SELECT t8.IDENTIFICADOR_ESTABLECIMIENTO FROM INSPECCIONES t6, REL_EST_INS t7, DATOS_DIRECCIONES t8 "
					+ " WHERE t6.ID_INSPECCION = t7.ID_INSPECCION  AND t7.ID_DIRECCION = t8.ID_DIRECCION  AND t8.IDENTIFICADOR_ESTABLECIMIENTO IS NOT NULL  AND t6.ID_CAMPAINA = ?  )");
		}

		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query);
		}

		return this.jdbcTemplate.query(query.toString(), this.rwMap,
				params.toArray());
	}

	@Transactional(readOnly = true)
	public Long findAllLikeCount(EstablecimientosRegistrados establecimientosregistrados, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) ");
		query.append(
				"FROM ESTABLECIMIENTOS_REGISTRADOS t1,  REL_EST_TER t2,  DATOS_TERCEROS t3,  (SELECT * FROM DATOS_DIRECCIONES WHERE ID_TIPO_DIRECCION = "
						+ Constantes.ID_UBICACION_INVERSION + "  ) t4,  TIPOS_TERCERO t5,  REL_EST_DIR T6 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(establecimientosregistrados, startsWith);
		StringBuilder where = new StringBuilder(
				"  WHERE 1 = 1 AND t1.ID_ESTABLECIMIENTO = t2.ID_ESTABLECIMIENTO AND t2.ID_TERCERO = t3.ID_TERCERO AND t1.ID_ESTABLECIMIENTO = t6.ID_ESTABLECIMIENTO "
				+ " AND t6.ID_DIRECCION = t4.ID_DIRECCION AND t2.ID_TIPO_TERCERO = t5.ID_TIPO_TERCERO AND t1.TIPO_REGISTRO = '"
						+ Constantes.TIPO_REGISTRO_D + "' ");

		if (establecimientosregistrados.getCampaina() != null) {
			where.append(
					" AND t1.IDENTIFICADOR_ESTABLECIMIENTO NOT IN  (SELECT t8.IDENTIFICADOR_ESTABLECIMIENTO  FROM INSPECCIONES t6, REL_EST_INS t7, DATOS_DIRECCIONES t8 "
					+ " WHERE t6.ID_INSPECCION = t7.ID_INSPECCION  AND t7.ID_DIRECCION = t8.ID_DIRECCION  AND t8.IDENTIFICADOR_ESTABLECIMIENTO IS NOT NULL  AND t6.ID_CAMPAINA = ?  )");
		}

		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	private Map<String, Object> getWhereLikeMap(EstablecimientosRegistrados establecimientosregistrados,
			Boolean startsWith) {

		StringBuilder where = new StringBuilder(EstablecimientosRegistradosDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (establecimientosregistrados != null && establecimientosregistrados.getCampaina() != null
				&& establecimientosregistrados.getCampaina().getIdCampaina() != null) {
			params.add(establecimientosregistrados.getCampaina().getIdCampaina());
		}

		if (establecimientosregistrados != null && establecimientosregistrados.getIdEstablecimiento() != null) {
			where.append(" AND t1.ID_ESTABLECIMIENTO = ?");
			params.add(establecimientosregistrados.getIdEstablecimiento());
		}
		if (establecimientosregistrados != null
				&& establecimientosregistrados.getIdentificadorEstablecimiento() != null) {
			where.append(" AND UPPER(t1.IDENTIFICADOR_ESTABLECIMIENTO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getIdentificadorEstablecimiento().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getIdentificadorEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t1.IDENTIFICADOR_ESTABLECIMIENTO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getEstablecimiento() != null) {
			where.append(" AND UPPER(t4.ESTABLECIMIENTO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getEstablecimiento().toUpperCase() + "%");
			} else {
				params.add(
						"%" + establecimientosregistrados.getDatosDireccion().getEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t4.ESTABLECIMIENTO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getTipoEstablecimiento() != null) {
			where.append(" AND UPPER(t1.ID_TIPO_ESTABLECIMIENTO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getTipoEstablecimiento().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getTipoEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_TIPO_ESTABLECIMIENTO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getCategoriaEstablecimiento() != null) {
			where.append(" AND UPPER(t1.ID_CATEGORIAS) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getCategoriaEstablecimiento().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getCategoriaEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_CATEGORIAS IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getModalidadEstablecimiento() != null) {
			where.append(" AND UPPER(t1.ID_MODALIDAD) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getModalidadEstablecimiento().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getModalidadEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_MODALIDAD IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getEspecialidad() != null) {
			where.append(" AND UPPER(t1.ID_ESPECIALIDAD) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getEspecialidad().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getEspecialidad() + "%");
			}
			where.append(" AND t1.ID_ESPECIALIDAD IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getGrupo() != null) {
			where.append(" AND UPPER(t1.ID_GRUPO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getGrupo().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getGrupo() + "%");
			}
			where.append(" AND t1.ID_GRUPO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getFechaAperturaDesde() != null
				&& establecimientosregistrados.getFechaAperturaHasta() != null) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(establecimientosregistrados.getFechaAperturaHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_APERTURA BETWEEN TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(
							establecimientosregistrados.getFechaAperturaDesde())
					+ "','" + Constantes.FORMATO_FECHA_ES + "') AND TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "')");
		} else if (establecimientosregistrados != null && establecimientosregistrados.getFechaAperturaDesde() != null
				&& establecimientosregistrados.getFechaAperturaHasta() == null) {
			where.append(" AND t1.FECHA_APERTURA > TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES)
							.format(establecimientosregistrados.getFechaAperturaDesde())
					+ "','" + Constantes.FORMATO_FECHA_ES + "')");
		} else if (establecimientosregistrados != null && establecimientosregistrados.getFechaAperturaDesde() == null
				&& establecimientosregistrados.getFechaAperturaHasta() != null) {

			Calendar calendar = Calendar.getInstance();
			calendar.setTime(establecimientosregistrados.getFechaAperturaHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_APERTURA < TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "')");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getFechaUltinspeccionDesde() != null
				&& establecimientosregistrados.getFechaUltinspeccionHasta() != null) {
			where.append(
					" AND (SELECT MAX(t43.FECHA_FIN_INSPECCION) FROM REL_EXP_INS t43, DATOS_DIRECCIONES t36, REL_EXP_DIR t51 "
					+ " WHERE t43.id_expediente = t51.id_expediente AND t36.identificador_establecimiento = t1.identificador_establecimiento AND t51.id_direccion = t36.id_direccion) BETWEEN ? AND ? ");
			params.add(establecimientosregistrados.getFechaUltinspeccionDesde());
			params.add(establecimientosregistrados.getFechaUltinspeccionHasta());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getFechaUltinspeccionDesde() != null
				&& establecimientosregistrados.getFechaUltinspeccionHasta() == null) {
			where.append(
					" AND (SELECT MAX(t43.FECHA_FIN_INSPECCION) FROM REL_EXP_INS t43, DATOS_DIRECCIONES t36, REL_EXP_DIR t51 "
					+ " WHERE t43.id_expediente = t51.id_expediente AND t36.identificador_establecimiento = t1.identificador_establecimiento AND t51.id_direccion = t36.id_direccion) >= ? ");
			params.add(establecimientosregistrados.getFechaUltinspeccionDesde());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getFechaUltinspeccionHasta() != null
				&& establecimientosregistrados.getFechaUltinspeccionDesde() == null) {
			where.append(
					" AND (SELECT MAX(t43.FECHA_FIN_INSPECCION) FROM REL_EXP_INS t43, DATOS_DIRECCIONES t36, REL_EXP_DIR t51 "
					+ " WHERE t43.id_expediente = t51.id_expediente AND t36.identificador_establecimiento = t1.identificador_establecimiento AND t51.id_direccion = t36.id_direccion) <= ? ");
			params.add(establecimientosregistrados.getFechaUltinspeccionHasta());
		}
		
		
		if (establecimientosregistrados != null && establecimientosregistrados.getFechaUltmodificacionDesde() != null
				&& establecimientosregistrados.getFechaUltmodificacionHasta() != null) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(establecimientosregistrados.getFechaUltmodificacionHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_ULT_MODIFICACION BETWEEN TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES)
							.format(establecimientosregistrados.getFechaUltmodificacionDesde())
					+ "','" + Constantes.FORMATO_FECHA_ES + "') AND TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "')");
		} else if (establecimientosregistrados != null
				&& establecimientosregistrados.getFechaUltmodificacionDesde() != null
				&& establecimientosregistrados.getFechaUltmodificacionHasta() == null) {
			where.append(" AND t1.FECHA_ULT_MODIFICACION > TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES)
							.format(establecimientosregistrados.getFechaUltmodificacionDesde())
					+ "','" + Constantes.FORMATO_FECHA_ES + "')");
		} else if (establecimientosregistrados != null
				&& establecimientosregistrados.getFechaUltmodificacionDesde() == null
				&& establecimientosregistrados.getFechaUltmodificacionHasta() != null) {

			Calendar calendar = Calendar.getInstance();
			calendar.setTime(establecimientosregistrados.getFechaUltmodificacionHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_ULT_MODIFICACION < TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "')");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getCodigoPostal() != null) {
			where.append(" AND UPPER(t4.CODIGO_POSTAL) like ? ESCAPE'\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getCodigoPostal().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getCodigoPostal().toUpperCase() + "%");
			}
			where.append(" AND t4.CODIGO_POSTAL IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getIdProvincia() != null) {
			where.append(" AND t4.ID_PROVINCIA = ?");
			params.add(establecimientosregistrados.getDatosDireccion().getIdProvincia());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getIdMunicipio() != null) {
			where.append(" AND t4.ID_MUNICIPIO = ?");
			params.add(establecimientosregistrados.getDatosDireccion().getIdMunicipio());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getIdLocalidad() != null) {
			where.append(" AND t4.ID_LOCALIDAD = ?");
			params.add(establecimientosregistrados.getDatosDireccion().getIdLocalidad());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getDireccion() != null) {
			where.append(" AND UPPER(t4.DIRECCION) like ? ESCAPE'\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getDireccion().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getDireccion().toUpperCase() + "%");
			}
			where.append(" AND t4.DIRECCION IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getNumero() != null) {
			where.append(" AND UPPER(t4.NUMERO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getNumero().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getNumero().toUpperCase() + "%");
			}
			where.append(" AND t4.NUMERO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getEscalera() != null) {
			where.append(" AND UPPER(t4.ESCALERA) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getEscalera().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getEscalera().toUpperCase() + "%");
			}
			where.append(" AND t4.ESCALERA IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getPiso() != null) {
			where.append(" AND UPPER(t4.PISO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getPiso().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getPiso().toUpperCase() + "%");
			}
			where.append(" AND t4.PISO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosDireccion() != null
				&& establecimientosregistrados.getDatosDireccion().getLetra() != null) {
			where.append(" AND UPPER(t4.LETRA) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosDireccion().getLetra().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosDireccion().getLetra().toUpperCase() + "%");
			}
			where.append(" AND t4.LETRA IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosTercero() != null
				&& establecimientosregistrados.getDatosTercero().getDocumento() != null) {
			where.append(" AND UPPER(t3.DOCUMENTO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosTercero().getDocumento().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosTercero().getDocumento().toUpperCase() + "%");
			}
			where.append(" AND t3.DOCUMENTO IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosTercero() != null
				&& establecimientosregistrados.getDatosTercero().getNombre() != null) {
			where.append(" AND UPPER(t3.NOMBRE) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosTercero().getNombre().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosTercero().getNombre().toUpperCase() + "%");
			}
			where.append(" AND t3.NOMBRE IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosTercero() != null
				&& establecimientosregistrados.getDatosTercero().getTelefono() != null) {
			where.append(" AND t3.TELEFONO = ?");
			params.add(establecimientosregistrados.getDatosTercero().getTelefono());
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getDatosTercero() != null
				&& establecimientosregistrados.getDatosTercero().getEmail() != null) {
			where.append(" AND UPPER(t3.EMAIL) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(establecimientosregistrados.getDatosTercero().getEmail().toUpperCase() + "%");
			} else {
				params.add("%" + establecimientosregistrados.getDatosTercero().getEmail().toUpperCase() + "%");
			}
			where.append(" AND t3.EMAIL IS NOT NULL");
		}
		if (establecimientosregistrados != null && establecimientosregistrados.getMostrar() != null
				&& establecimientosregistrados.getMostrar() == Constantes.ESTABLECIMIENTOS_ACTIVOS) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(new Date());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND (t1.FECHA_BAJA > TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "') OR t1.FECHA_BAJA IS NULL)");
		} else if (establecimientosregistrados != null && establecimientosregistrados.getMostrar() != null
				&& establecimientosregistrados.getMostrar() == Constantes.ESTABLECIMIENTOS_BAJA) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(new Date());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_BAJA < TO_DATE('"
					+ new SimpleDateFormat(Constantes.FORMATO_FECHA_ES).format(calendar.getTime()) + "','"
					+ Constantes.FORMATO_FECHA_ES + "') AND t1.FECHA_BAJA IS NOT NULL");
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

	public static final int STRING_BUILDER_INIT = 4096;

}
