package com.ejie.ab61.dao.terceros;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.springframework.dao.support.DataAccessUtils;
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.ab61.comun.Constantes;
import com.ejie.ab61.model.expedientes.Expedientes;
import com.ejie.ab61.model.terceros.DatosDirecciones;
import com.ejie.ab61.model.terceros.DatosTerceros;
import com.ejie.ab61.model.terceros.TiposDireccion;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridManagerJerarquia;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * DatosDireccionesDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class DatosDireccionesDaoImpl implements DatosDireccionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDDIRECCION", "DIRECCION", "NUMERO", "ESCALERA",
			"ESTABLECIMIENTO", "PISO", "LETRA", "CODIGOPOSTAL", "IDPROVINCIA", "IDMUNICIPIO", "IDLOCALIDAD",
			"FECHAREGISTRO", "USUARIOREGISTRO", "FECHAULTMODIFICACION", "USUARIOULTMODIFICACION",
			"DATOSTERCEROSIDTERCERO", "DATOSTERCEROSDOCUMENTO", "DATOSTERCEROSIDTIPODOCUMENTO", "DATOSTERCEROSNOMBRE",
			"DATOSTERCEROSAPELLIDO1", "DATOSTERCEROSAPELLIDO2", "DATOSTERCEROSIDSEXO", "DATOSTERCEROSTELEFONO",
			"DATOSTERCEROSEMAIL", "DATOSTERCEROSIDIOMA", "DATOSTERCEROSTIPOPARTICIPANTE", "DATOSTERCEROSFECHAREGISTRO",
			"DATOSTERCEROSUSUARIOREGISTRO", "DATOSTERCEROSFULTMOD", "DATOSTERCEROSUULTMOD",
			"TIPOSDIRECCIONIDTIPODIRECCION", "TIPOSDIRECCIONDESCRIPCIONCASTELLANO", "TIPOSDIRECCIONDESCRIPCIONEUSKERA",
			"TIPOSDIRECCIONFECHAREGISTRO", "TIPOSDIRECCIONUSUARIOREGISTRO", "DATOSTERCEROSIDREPRESENTANTE" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<DatosDirecciones> rwMap = new RowMapper<DatosDirecciones>() {
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new DatosDirecciones(resultSet.getInt("IDDIRECCION"), resultSet.getString("ESTABLECIMIENTO"),
					resultSet.getString("DIRECCION"), resultSet.getString("NUMERO"), resultSet.getString("ESCALERA"),
					resultSet.getString("PISO"), resultSet.getString("LETRA"), resultSet.getString("CODIGOPOSTAL"),
					resultSet.getLong("IDPAIS"), resultSet.getLong("IDPROVINCIA"), resultSet.getLong("IDMUNICIPIO"),
					resultSet.getLong("IDLOCALIDAD"), resultSet.getDate("FECHAREGISTRO"),
					resultSet.getString("USUARIOREGISTRO"), resultSet.getDate("FECHAULTMODIFICACION"),
					resultSet.getString("USUARIOULTMODIFICACION"),
					new DatosTerceros(resultSet.getInt("DatosTercerosIDTERCERO"),
							resultSet.getString("DatosTercerosDOCUMENTO"),
							resultSet.getLong("DatosTercerosIDTIPODOCUMENTO"),
							resultSet.getString("DatosTercerosNOMBRE"), resultSet.getString("DatosTercerosAPELLIDO1"),
							resultSet.getString("DatosTercerosAPELLIDO2"), resultSet.getLong("DatosTercerosIDSEXO"),
							resultSet.getLong("DatosTercerosTELEFONO"), resultSet.getString("DatosTercerosEMAIL"),
							resultSet.getInt("DatosTercerosIDIOMA"), resultSet.getInt("DatosTercerosTIPOPARTICIPANTE"),
							resultSet.getDate("DatosTercerosFECHAREGISTRO"),
							resultSet.getString("DatosTercerosUSUARIOREGISTRO"),
							resultSet.getDate("DATOSTERCEROSFULTMOD"), resultSet.getString("DATOSTERCEROSUULTMOD")),
					new TiposDireccion(resultSet.getLong("TiposDireccionIDTIPODIRECCION"),
							resultSet.getString("TiposDireccionDESCRIPCIONCASTELLANO"),
							resultSet.getString("TiposDireccionDESCRIPCIONEUSKERA"),
							resultSet.getDate("TiposDireccionFECHAREGISTRO"),
							resultSet.getString("TiposDireccionUSUARIOREGISTRO")));
		}
	};

	private RowMapper<DatosDirecciones> rwMapDatosDireccion = new RowMapper<DatosDirecciones>() {
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new DatosDirecciones(resultSet.getInt("IDDIRECCION"), null, resultSet.getString("DIRECCION"),
					resultSet.getString("NUMERO"), resultSet.getString("ESCALERA"), resultSet.getString("PISO"),
					resultSet.getString("LETRA"), resultSet.getString("CODIGOPOSTAL"), resultSet.getLong("IDPAIS"),
					resultSet.getLong("IDPROVINCIA"), resultSet.getLong("IDMUNICIPIO"),
					resultSet.getLong("IDLOCALIDAD"), resultSet.getDate("FECHAREGISTRO"),
					resultSet.getString("USUARIOREGISTRO"), resultSet.getDate("FECHAULTMODIFICACION"),
					resultSet.getString("USUARIOULTMODIFICACION"), new DatosTerceros(null), new TiposDireccion(null));
		}
	};

	private RowMapper<DatosDirecciones> rwMapByExpediente = new RowMapper<DatosDirecciones>() {
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			DatosDirecciones datosDirecciones = new DatosDirecciones();
			datosDirecciones.setIdDireccion(resultSet.getInt("IDDIRECCION"));
			datosDirecciones.setIdProvincia(resultSet.getLong("IDPROVINCIA"));
			datosDirecciones.setIdMunicipio(resultSet.getLong("IDMUNICIPIO"));
			datosDirecciones.setIdLocalidad(resultSet.getLong("IDLOCALIDAD"));

			return datosDirecciones;
		}
	};

	private RowMapper<DatosDirecciones> rwMapUbicacionTerceroId = new RowMapper<DatosDirecciones>() {
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new DatosDirecciones(null, resultSet.getString("ESTABLECIMIENTO"), resultSet.getString("DIRECCION"),
					resultSet.getString("NUMERO"), resultSet.getString("ESCALERA"), resultSet.getString("PISO"),
					resultSet.getString("LETRA"), resultSet.getString("CODIGOPOSTAL"), resultSet.getLong("IDPROVINCIA"),
					null, resultSet.getLong("IDMUNICIPIO"), resultSet.getLong("IDLOCALIDAD"), null, null, null, null,
					new DatosTerceros(resultSet.getInt("IDTERCERO"), null, null, null, null, null, null, null, null,
							null, null, null, null, null, null),
					new TiposDireccion(resultSet.getLong("IDTIPODIRECCION"), resultSet.getString("DESCASTELLANO"),
							resultSet.getString("DESEUSKERA"), null, null));
		}
	};
	private RowMapper<DatosDirecciones> rwMapPK = new RowMapper<DatosDirecciones>() {
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new DatosDirecciones(resultSet.getInt("IDDIRECCION"));
		}
	};

	/**
	 * Rowmapper para JerarquÃ­a
	 *
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	private RowMapper<JerarquiaDto<DatosDirecciones>> rwMapJerarquia = new RowMapper<JerarquiaDto<DatosDirecciones>>() {
		public JerarquiaDto<DatosDirecciones> mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DatosDirecciones datosdirecciones = new DatosDirecciones(resultSet.getInt("IDDIRECCION"),
					resultSet.getString("ESTABLECIMIENTO"), resultSet.getString("DIRECCION"),
					resultSet.getString("NUMERO"), resultSet.getString("ESCALERA"), resultSet.getString("PISO"),
					resultSet.getString("LETRA"), resultSet.getString("CODIGOPOSTAL"), resultSet.getLong("IDPROVINCIA"),
					null, resultSet.getLong("IDMUNICIPIO"), resultSet.getLong("IDLOCALIDAD"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getString("USUARIOREGISTRO"),
					resultSet.getDate("FECHAULTMODIFICACION"), resultSet.getString("USUARIOULTMODIFICACION"),
					new DatosTerceros(resultSet.getInt("DatosTercerosIDTERCERO"),
							resultSet.getString("DatosTercerosDOCUMENTO"),
							resultSet.getLong("DatosTercerosIDTIPODOCUMENTO"),
							resultSet.getString("DatosTercerosNOMBRE"), resultSet.getString("DatosTercerosAPELLIDO1"),
							resultSet.getString("DatosTercerosAPELLIDO2"), resultSet.getLong("DatosTercerosIDSEXO"),
							resultSet.getLong("DatosTercerosTELEFONO"), resultSet.getString("DatosTercerosEMAIL"),
							resultSet.getInt("DatosTercerosIDIOMA"), resultSet.getInt("DatosTercerosTIPOPARTICIPANTE"),
							resultSet.getDate("DatosTercerosFECHAREGISTRO"),
							resultSet.getString("DatosTercerosUSUARIOREGISTRO"),
							resultSet.getDate("DATOSTERCEROSFULTMOD"), resultSet.getString("DATOSTERCEROSUULTMOD")),
					new TiposDireccion(resultSet.getLong("TiposDireccionIDTIPODIRECCION"),
							resultSet.getString("TiposDireccionDESCRIPCIONCASTELLANO"),
							resultSet.getString("TiposDireccionDESCRIPCIONEUSKERA"),
							resultSet.getDate("TiposDireccionFECHAREGISTRO"),
							resultSet.getString("TiposDireccionUSUARIOREGISTRO")));

			JerarquiaDto<DatosDirecciones> jerarquia = new JerarquiaDto<DatosDirecciones>();
			jerarquia.setModel(datosdirecciones);
			jerarquia.setLevel(resultSet.getBigDecimal("LEVEL").intValue());
			jerarquia.setParentNodes(resultSet.getString("PARENTNODES"));
			jerarquia.setIsLeaf(Boolean.parseBoolean(resultSet.getString("ISLEAF")));
			jerarquia.setFilter(Boolean.parseBoolean(resultSet.getString("FILTER")));
			return jerarquia;
		}
	};

	/**
	 * Method use to set the datasource.
	 *
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Inserts a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	public DatosDirecciones add(DatosDirecciones datosdirecciones) {
		String query = "INSERT INTO DATOS_DIRECCIONES (ID_DIRECCION, ID_TERCERO, ID_TIPO_DIRECCION, DIRECCION, NUMERO, ESCALERA, PISO, LETRA, CODIGO_POSTAL, ID_PROVINCIA, ID_MUNICIPIO, ID_LOCALIDAD, FECHA_REGISTRO, USUARIO_REGISTRO) VALUES (AB61.S_AB6135T00.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Object getDatosTercerosIdTerceroAux = null;
		if (datosdirecciones.getDatosTerceros() != null && datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			getDatosTercerosIdTerceroAux = datosdirecciones.getDatosTerceros().getIdTercero();
		}
		Object getTiposDireccionIdTipoDireccionAux = null;
		if (datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			getTiposDireccionIdTipoDireccionAux = datosdirecciones.getTiposDireccion().getIdTipoDireccion();
		}
		this.jdbcTemplate.update(query, getDatosTercerosIdTerceroAux, getTiposDireccionIdTipoDireccionAux,
				datosdirecciones.getDireccion(), datosdirecciones.getNumero(), datosdirecciones.getEscalera(),
				datosdirecciones.getPiso(), datosdirecciones.getLetra(), datosdirecciones.getCodigoPostal(),
				datosdirecciones.getIdProvincia(), datosdirecciones.getIdMunicipio(), datosdirecciones.getIdLocalidad(),
				datosdirecciones.getFechaRegistro(), datosdirecciones.getUsuarioRegistro());
		return datosdirecciones;
	}

	/**
	 * Updates a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	public DatosDirecciones update(DatosDirecciones datosdirecciones) {
		String query = "UPDATE AB61.DATOS_DIRECCIONES SET  DIRECCION=?, NUMERO=?, ESTABLECIMIENTO=?, ESCALERA=?,   PISO=?,  LETRA=?,   CODIGO_POSTAL=?,   ID_PROVINCIA=?,  ID_MUNICIPIO=?,   ID_LOCALIDAD=?,   FECHA_ULTMODIFICACION=?,  USUARIO_ULTMODIFICACION=?   WHERE ID_TERCERO=?  AND ID_TIPO_DIRECCION=?";
		Object getDatosTercerosIdTerceroAux = null;
		if (datosdirecciones.getDatosTerceros() != null && datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			getDatosTercerosIdTerceroAux = datosdirecciones.getDatosTerceros().getIdTercero();
		}
		Object getTiposDireccionIdTipoDireccionAux = null;
		if (datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			getTiposDireccionIdTipoDireccionAux = datosdirecciones.getTiposDireccion().getIdTipoDireccion();
		}

		this.jdbcTemplate.update(query, datosdirecciones.getDireccion(), datosdirecciones.getNumero(),
				datosdirecciones.getEstablecimiento(), datosdirecciones.getEscalera(), datosdirecciones.getPiso(),
				datosdirecciones.getLetra(), datosdirecciones.getCodigoPostal(), datosdirecciones.getIdProvincia(),
				datosdirecciones.getIdMunicipio(), datosdirecciones.getIdLocalidad(),
				datosdirecciones.getFechaUltmodificacion(), datosdirecciones.getUsuarioUltmodificacion(),
				getDatosTercerosIdTerceroAux, getTiposDireccionIdTipoDireccionAux);

		return datosdirecciones;
	}

	/**
	 * Finds a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	@Transactional(readOnly = true)
	public DatosDirecciones find(DatosDirecciones datosdirecciones) {
		String query = "SELECT t1.ID_DIRECCION IDDIRECCION, t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA, t1.PISO PISO, t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL, t1.ID_PAIS IDPAIS ,t1.ID_PROVINCIA IDPROVINCIA, t1.ID_MUNICIPIO IDMUNICIPIO, t1.ID_LOCALIDAD IDLOCALIDAD, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t2.ID_TERCERO DATOSTERCEROSIDTERCERO, t2.DOCUMENTO DATOSTERCEROSDOCUMENTO, t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO, t2.NOMBRE DATOSTERCEROSNOMBRE, t2.APELLIDO1 DATOSTERCEROSAPELLIDO1, t2.APELLIDO2 DATOSTERCEROSAPELLIDO2, t2.ID_SEXO DATOSTERCEROSIDSEXO, t2.TELEFONO DATOSTERCEROSTELEFONO, t2.EMAIL DATOSTERCEROSEMAIL, t2.IDIOMA DATOSTERCEROSIDIOMA, t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE, t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO, t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO, t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD, t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD, t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO, t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA, t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO, t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO, t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE FROM DATOS_DIRECCIONES t1 , DATOS_TERCEROS t2 , TIPOS_DIRECCION t3  WHERE t1.ID_DIRECCION = ?   AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+)";

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMap,
				datosdirecciones.getIdDireccion());
		return (DatosDirecciones) DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	/**
	 * Finds las ubicaciones del terceros solicitante
	 *
	 * @param idTercero
	 *            Integer
	 * @return DatosDirecciones
	 */
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findUbicacionTerceroId(Integer idTercero) {
		String query = "SELECT t1.ID_TERCERO IDTERCERO,  t1.ESTABLECIMIENTO ESTABLECIMIENTO,  t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA, t1.PISO PISO,  t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL,  t1.ID_PROVINCIA IDPROVINCIA,  t1.ID_MUNICIPIO IDMUNICIPIO, t1.ID_LOCALIDAD IDLOCALIDAD,t3.ID_TIPO_DIRECCION IDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO DESCASTELLANO,  t3.DESCRIPCION_EUSKERA DESEUSKERA FROM  DATOS_DIRECCIONES t1 ,  TIPOS_DIRECCION t3  WHERE t1.ID_TERCERO = ?  AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+)";

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMapUbicacionTerceroId,
				idTercero);
		return datosdireccionesList;
	}

	@Override
	public DatosDirecciones findDireccionByExpediente(Expedientes expediente) {
		String query = "SELECT t3.ID_DIRECCION IDDIRECCION, t3.ID_PROVINCIA IDPROVINCIA, t3.ID_MUNICIPIO IDMUNICIPIO, t3.ID_LOCALIDAD IDLOCALIDAD FROM REL_EXP_TER t1, DATOS_TERCEROS t2, DATOS_DIRECCIONES t3 WHERE t1.ID_TERCERO = t2.ID_TERCERO AND t2.ID_TERCERO = t3.ID_TERCERO AND t1.ID_EXPEDIENTE = ? AND t3.ID_TIPO_DIRECCION = ?";

		List<DatosDirecciones> datosDireccionesList = this.jdbcTemplate.query(query, this.rwMapByExpediente,
				expediente.getIdExpediente(), Constantes.TiposDirecciones.UBICACION_INVERSION);

		if (datosDireccionesList.isEmpty()) {
			return null;
		} else {
			return (DatosDirecciones) DataAccessUtils.uniqueResult(datosDireccionesList);
		}
	}

	/**
	 * Removes a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return
	 */
	public void remove(DatosDirecciones datosdirecciones) {
		String query = "DELETE FROM DATOS_DIRECCIONES WHERE ID_DIRECCION=?";
		this.jdbcTemplate.update(query, datosdirecciones.getIdDireccion());
	}

	/**
	 * Borrar los direciones de un tercero
	 *
	 * @param idTercero
	 *            Integer
	 * @return
	 */
	public void removeDireccionesTercero(Integer idTercero) {
		String query = "DELETE FROM DATOS_DIRECCIONES WHERE ID_TERCERO=?";
		this.jdbcTemplate.update(query, idTercero);
	}

	/**
	 * Finds a list of rows in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<DatosDirecciones>
	 */
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findAll(DatosDirecciones datosdirecciones, JQGridRequestDto jqGridRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL, t1.ID_PAIS IDPAIS, t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		query.append("FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(datosdirecciones);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query,
					DatosDireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		return (List<DatosDirecciones>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/**
	 * Finds a list of rows in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<DatosDirecciones>
	 */
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findDatosDireccion(DatosDirecciones datosdirecciones,
			JQGridRequestDto jqGridRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION IDDIRECCION, t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA, t1.PISO PISO, t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL, t1.ID_PAIS IDPAIS, t1.ID_PROVINCIA IDPROVINCIA, t1.ID_MUNICIPIO IDMUNICIPIO, t1.ID_LOCALIDAD IDLOCALIDAD, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");
		query.append("FROM DATOS_DIRECCIONES t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMapDatosDireccion(datosdirecciones);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query,
					DatosDireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		return (List<DatosDirecciones>) this.jdbcTemplate.query(query.toString(), this.rwMapDatosDireccion,
				params.toArray());
	}

	/**
	 * Finds rows in the DatosDirecciones table using like.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<DatosDirecciones>
	 */
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findAllLike(DatosDirecciones datosdirecciones, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL,t1.ID_PAIS IDPAIS,t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		query.append("FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(datosdirecciones, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query,
					DatosDireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		return (List<DatosDirecciones>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(DatosDirecciones datosdirecciones) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM DATOS_DIRECCIONES t1 , DATOS_TERCEROS t2 , TIPOS_DIRECCION t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(datosdirecciones);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	/**
	 * Counts rows in the DatosDirecciones table using like.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(DatosDirecciones datosdirecciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(datosdirecciones, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	/**
	 * Reorder the data list of DatosDirecciones selected for rup_table
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<DatosDirecciones>>
	 */
	@Override
	public List<TableRowDto<DatosDirecciones>> reorderSelection(DatosDirecciones datosdirecciones,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL,t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		// FROM
		query.append("FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(datosdirecciones, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		// ParÃ¡metros de filtrado
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhere.get("params");

		// SQL para la reordenaciÃ³n
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				DatosDirecciones.class, filterParamList, "ID_DIRECCION");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<DatosDirecciones>(this.rwMapPK, jqGridRequestDto),
				filterParamList.toArray());
	}

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            DatosDirecciones
	 * @param searchParams
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<DatosDirecciones>>
	 */
	@Override
	public List<TableRowDto<DatosDirecciones>> search(DatosDirecciones filterParams, DatosDirecciones searchParams,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL,t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		// FROM
		query.append("FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+) ");
		where.append(mapaWhereFilter.get("query"));
		query.append(where);
		// Filter params
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhereFilter.get("params");

		// BUSQUEDA
		Map<String, Object> mapaWhereSearch = this.getWhereLikeMap(searchParams, startsWith);
		String searchSQL = ((StringBuilder) mapaWhereSearch.get("query")).toString();
		// Search params
		@SuppressWarnings("unchecked")
		List<Object> searchParamList = (List<Object>) mapaWhereSearch.get("params");

		// SQL
		StringBuilder sbReorderSelectionSQL = JQGridManager.getSearchQuery(query, jqGridRequestDto,
				DatosDirecciones.class, filterParamList, searchSQL, searchParamList, from_alias, "ID_DIRECCION");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<DatosDirecciones>(this.rwMapPK, jqGridRequestDto),
				filterParamList.toArray());
	}

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterdatosdirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(DatosDirecciones filterdatosdirecciones, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL,t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		// FROM
		query.append("FROM DATOS_DIRECCIONES t1 ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");

		// WHERE
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterdatosdirecciones, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		@SuppressWarnings("unchecked")
		List<Object> params = (List<Object>) mapaWhere.get("params");

		StringBuilder sbRemoveMultipleSQL = JQGridManager.getRemoveMultipleQuery(jqGridRequestDto,
				DatosDirecciones.class, query, params, "ID_DIRECCION");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical DatosDirecciones table.
	 *
	 * @param filterDatosDirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<JerarquiaDto<DatosDirecciones>>
	 */
	@Override
	public List<JerarquiaDto<DatosDirecciones>> findAllLikeJerarquia(DatosDirecciones filterDatosDirecciones,
			JQGridRequestDto jqGridRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION IDDIRECCION,t1.DIRECCION DIRECCION,t1.NUMERO NUMERO,t1.ESCALERA ESCALERA,t1.PISO PISO,t1.LETRA LETRA,t1.CODIGO_POSTAL CODIGOPOSTAL,t1.ID_PROVINCIA IDPROVINCIA,t1.ID_MUNICIPIO IDMUNICIPIO,t1.ID_LOCALIDAD IDLOCALIDAD,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t2.ID_TERCERO DATOSTERCEROSIDTERCERO,t2.DOCUMENTO DATOSTERCEROSDOCUMENTO,t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO,t2.NOMBRE DATOSTERCEROSNOMBRE,t2.APELLIDO1 DATOSTERCEROSAPELLIDO1,t2.APELLIDO2 DATOSTERCEROSAPELLIDO2,t2.ID_SEXO DATOSTERCEROSIDSEXO,t2.TELEFONO DATOSTERCEROSTELEFONO,t2.EMAIL DATOSTERCEROSEMAIL,t2.IDIOMA DATOSTERCEROSIDIOMA,t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE,t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO,t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO,t2.FECHA_ULTMODIFICACION DATOSTERCEROSFULTMOD,t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUULTMOD,t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION,t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONCASTELLANO,t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEUSKERA,t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO,t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO,t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM DATOS_DIRECCIONES t1
		// ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");
		List<String> from = new ArrayList<String>();
		from.add("DATOS_DIRECCIONES");
		from.add("DATOS_TERCEROS");
		from.add("TIPOS_DIRECCION");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquÃ­a
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterDatosDirecciones, false);

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		query = JQGridManagerJerarquia.getQuery(jqGridRequestDto, query, mapaWhere, "ID_DIRECCION", "ID_PADRE",
				"NOMBRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// query = JQGridManagerJerarquia.getQuery(jqGridRequestDto, query,
		// mapaWhere, "ID", "ID_PADRE", "NOMBRE", from, from_alias, joins,
		// businessFilters, businessParams);

		// PAGINACION
		if (jqGridRequestDto != null) {
			query = JQGridManagerJerarquia.getPaginationQuery(jqGridRequestDto, query,
					DatosDireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.query(query.toString(), this.rwMapJerarquia, params.toArray());
	}

	/**
	 * Count rows in hierarchy
	 *
	 * @param filterDatosDirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(DatosDirecciones filterDatosDirecciones, JQGridRequestDto jqGridRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM DATOS_DIRECCIONES t1
		// ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");
		List<String> from = new ArrayList<String>();
		from.add("DATOS_DIRECCIONES");
		from.add("DATOS_TERCEROS");
		from.add("TIPOS_DIRECCION");

		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquÃ­a
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterDatosDirecciones, false);

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = JQGridManagerJerarquia.getQueryCount(jqGridRequestDto, mapaWhere, "ID_DIRECCION",
				"ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// JQGridManagerJerarquia.getQueryCount(jqGridRequestDto, mapaWhere,
		// "ID", "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForLong(query.toString(), params.toArray());
	}

	/**
	 * Find dependent hierarchical rows
	 *
	 * @param filterDatosDirecciones
	 *            DatosDirecciones
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<TableRowDto<DatosDirecciones>>
	 */
	@Override
	public List<TableRowDto<DatosDirecciones>> findAllChild(DatosDirecciones filterDatosDirecciones,
			JQGridRequestDto jqGridRequestDto) {

		// FROM
		// StringBuilder from = new StringBuilder("FROM DATOS_DIRECCIONES t1
		// ,DATOS_TERCEROS t2 ,TIPOS_DIRECCION t3 ");
		List<String> from = new ArrayList<String>();
		from.add("DATOS_DIRECCIONES");
		from.add("DATOS_TERCEROS");
		from.add("TIPOS_DIRECCION");

		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquÃ­a
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterDatosDirecciones, false);

		// MULTISELECCION
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = JQGridManagerJerarquia.getQueryChildren(jqGridRequestDto, mapaWhere, "ID_DIRECCION",
				"ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// JQGridManagerJerarquia.getQueryChildren(jqGridRequestDto, mapaWhere,
		// "ID", "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

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

		return this.jdbcTemplate.query(query.toString(),
				new RowNumResultSetExtractor<DatosDirecciones>(this.rwMapPK, "ID_DIRECCION"), params.toArray());
	}

	/*
	 * MÃ‰TODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the DatosDirecciones entity
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones Bean with the criteria values to filter by.
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - GeneraciÃ³n de cÃ³digo de UDA
	private Map<String, ?> getWhereMap(DatosDirecciones datosdirecciones) {

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

		if (datosdirecciones != null && datosdirecciones.getIdDireccion() != null) {
			where.append(" AND t1.ID_DIRECCION = ?");
			params.add(datosdirecciones.getIdDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			where.append(" AND t2.ID_TERCERO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTercero());
		}

		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getDocumento() != null) {
			where.append(" AND t2.DOCUMENTO = ?");
			params.add(datosdirecciones.getDatosTerceros().getDocumento());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTipoDocumento() != null) {
			where.append(" AND t2.ID_TIPO_DOCUMENTO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTipoDocumento());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getNombre() != null) {
			where.append(" AND t2.NOMBRE = ?");
			params.add(datosdirecciones.getDatosTerceros().getNombre());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getApellido1() != null) {
			where.append(" AND t2.APELLIDO1 = ?");
			params.add(datosdirecciones.getDatosTerceros().getApellido1());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getApellido2() != null) {
			where.append(" AND t2.APELLIDO2 = ?");
			params.add(datosdirecciones.getDatosTerceros().getApellido2());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdSexo() != null) {
			where.append(" AND t2.ID_SEXO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdSexo());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getTelefono() != null) {
			where.append(" AND t2.TELEFONO = ?");
			params.add(datosdirecciones.getDatosTerceros().getTelefono());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getEmail() != null) {
			where.append(" AND t2.EMAIL = ?");
			params.add(datosdirecciones.getDatosTerceros().getEmail());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdioma() != null) {
			where.append(" AND t2.IDIOMA = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdioma());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getTipoParticipante() != null) {
			where.append(" AND t2.TIPO_PARTICIPANTE = ?");
			params.add(datosdirecciones.getDatosTerceros().getTipoParticipante());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getDatosTerceros().getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getUsuarioRegistro() != null) {
			where.append(" AND t2.USUARIO_REGISTRO = ?");
			params.add(datosdirecciones.getDatosTerceros().getUsuarioRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getFechaUltmodificacion() != null) {
			where.append(" AND t2.FECHA_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getDatosTerceros().getFechaUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getUsuarioUltmodificacion() != null) {
			where.append(" AND t2.USUARIO_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getDatosTerceros().getUsuarioUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			where.append(" AND t3.ID_TIPO_DIRECCION = ?");
			params.add(datosdirecciones.getTiposDireccion().getIdTipoDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getDescripcionCastellano() != null) {
			where.append(" AND t3.DESCRIPCION_CASTELLANO = ?");
			params.add(datosdirecciones.getTiposDireccion().getDescripcionCastellano());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getDescripcionEuskera() != null) {
			where.append(" AND t3.DESCRIPCION_EUSKERA = ?");
			params.add(datosdirecciones.getTiposDireccion().getDescripcionEuskera());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getFechaRegistro() != null) {
			where.append(" AND t3.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getTiposDireccion().getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getUsuarioRegistro() != null) {
			where.append(" AND t3.USUARIO_REGISTRO = ?");
			params.add(datosdirecciones.getTiposDireccion().getUsuarioRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getDireccion() != null) {
			where.append(" AND t1.DIRECCION = ?");
			params.add(datosdirecciones.getDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getNumero() != null) {
			where.append(" AND t1.NUMERO = ?");
			params.add(datosdirecciones.getNumero());
		}
		if (datosdirecciones != null && datosdirecciones.getEscalera() != null) {
			where.append(" AND t1.ESCALERA = ?");
			params.add(datosdirecciones.getEscalera());
		}
		if (datosdirecciones != null && datosdirecciones.getPiso() != null) {
			where.append(" AND t1.PISO = ?");
			params.add(datosdirecciones.getPiso());
		}
		if (datosdirecciones != null && datosdirecciones.getLetra() != null) {
			where.append(" AND t1.LETRA = ?");
			params.add(datosdirecciones.getLetra());
		}
		if (datosdirecciones != null && datosdirecciones.getCodigoPostal() != null) {
			where.append(" AND t1.CODIGO_POSTAL = ?");
			params.add(datosdirecciones.getCodigoPostal());
		}
		if (datosdirecciones != null && datosdirecciones.getIdProvincia() != null) {
			where.append(" AND t1.ID_PROVINCIA = ?");
			params.add(datosdirecciones.getIdProvincia());
		}
		if (datosdirecciones != null && datosdirecciones.getIdMunicipio() != null) {
			where.append(" AND t1.ID_MUNICIPIO = ?");
			params.add(datosdirecciones.getIdMunicipio());
		}
		if (datosdirecciones != null && datosdirecciones.getIdLocalidad() != null) {
			where.append(" AND t1.ID_LOCALIDAD = ?");
			params.add(datosdirecciones.getIdLocalidad());
		}
		if (datosdirecciones != null && datosdirecciones.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(datosdirecciones.getUsuarioRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getFechaUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND t1.USUARIO_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getUsuarioUltmodificacion());
		}

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

		return mapWhere;
	}

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the DatosDirecciones entity
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones Bean with the criteria values to filter by.
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - GeneraciÃ³n de cÃ³digo de UDA
	private Map<String, ?> getWhereMapDatosDireccion(DatosDirecciones datosdirecciones) {

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

		if (datosdirecciones != null && datosdirecciones.getIdDireccion() != null) {
			where.append(" AND t1.ID_DIRECCION = ?");
			params.add(datosdirecciones.getIdDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			where.append(" AND t1.ID_TERCERO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTercero());
		}

		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTipoDocumento() != null) {
			where.append(" AND t1.ID_TIPO_DOCUMENTO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTipoDocumento());
		}

		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			where.append(" AND t1.ID_TIPO_DIRECCION = ?");
			params.add(datosdirecciones.getTiposDireccion().getIdTipoDireccion());
		}

		if (datosdirecciones != null && datosdirecciones.getDireccion() != null) {
			where.append(" AND t1.DIRECCION = ?");
			params.add(datosdirecciones.getDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getNumero() != null) {
			where.append(" AND t1.NUMERO = ?");
			params.add(datosdirecciones.getNumero());
		}
		if (datosdirecciones != null && datosdirecciones.getEscalera() != null) {
			where.append(" AND t1.ESCALERA = ?");
			params.add(datosdirecciones.getEscalera());
		}
		if (datosdirecciones != null && datosdirecciones.getPiso() != null) {
			where.append(" AND t1.PISO = ?");
			params.add(datosdirecciones.getPiso());
		}
		if (datosdirecciones != null && datosdirecciones.getLetra() != null) {
			where.append(" AND t1.LETRA = ?");
			params.add(datosdirecciones.getLetra());
		}
		if (datosdirecciones != null && datosdirecciones.getCodigoPostal() != null) {
			where.append(" AND t1.CODIGO_POSTAL = ?");
			params.add(datosdirecciones.getCodigoPostal());
		}
		if (datosdirecciones != null && datosdirecciones.getIdProvincia() != null) {
			where.append(" AND t1.ID_PROVINCIA = ?");
			params.add(datosdirecciones.getIdProvincia());
		}
		if (datosdirecciones != null && datosdirecciones.getIdMunicipio() != null) {
			where.append(" AND t1.ID_MUNICIPIO = ?");
			params.add(datosdirecciones.getIdMunicipio());
		}
		if (datosdirecciones != null && datosdirecciones.getIdLocalidad() != null) {
			where.append(" AND t1.ID_LOCALIDAD = ?");
			params.add(datosdirecciones.getIdLocalidad());
		}
		if (datosdirecciones != null && datosdirecciones.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(datosdirecciones.getUsuarioRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getFechaUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND t1.USUARIO_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getUsuarioUltmodificacion());
		}

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

		return mapWhere;
	}
	// CHECKSTYLE:ON CyclomaticComplexity - GeneraciÃ³n de cÃ³digo de UDA

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the DatosDirecciones entity
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones Bean with the criteria values to filter by.
	 * @param startsWith
	 *            Boolean
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - GeneraciÃ³n de cÃ³digo de UDA
	private Map<String, Object> getWhereLikeMap(DatosDirecciones datosdirecciones, Boolean startsWith) {

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

		if (datosdirecciones != null && datosdirecciones.getIdDireccion() != null) {
			where.append(" AND t1.ID_DIRECCION = ?");
			params.add(datosdirecciones.getIdDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			where.append(" AND t2.ID_TERCERO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTercero());
		}

		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getDocumento() != null) {
			where.append(" AND UPPER(t2.DOCUMENTO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getDocumento().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getDocumento().toUpperCase() + "%");
			}
			where.append(" AND t2.DOCUMENTO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdTipoDocumento() != null) {
			where.append(" AND t2.ID_TIPO_DOCUMENTO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdTipoDocumento());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getNombre() != null) {
			where.append(" AND UPPER(t2.NOMBRE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getNombre().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getNombre().toUpperCase() + "%");
			}
			where.append(" AND t2.NOMBRE IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getApellido1() != null) {
			where.append(" AND UPPER(t2.APELLIDO1) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getApellido1().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getApellido1().toUpperCase() + "%");
			}
			where.append(" AND t2.APELLIDO1 IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getApellido2() != null) {
			where.append(" AND UPPER(t2.APELLIDO2) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getApellido2().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getApellido2().toUpperCase() + "%");
			}
			where.append(" AND t2.APELLIDO2 IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdSexo() != null) {
			where.append(" AND t2.ID_SEXO = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdSexo());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getTelefono() != null) {
			where.append(" AND t2.TELEFONO = ?");
			params.add(datosdirecciones.getDatosTerceros().getTelefono());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getEmail() != null) {
			where.append(" AND UPPER(t2.EMAIL) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getEmail().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getEmail().toUpperCase() + "%");
			}
			where.append(" AND t2.EMAIL IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getIdioma() != null) {
			where.append(" AND t2.IDIOMA = ?");
			params.add(datosdirecciones.getDatosTerceros().getIdioma());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getTipoParticipante() != null) {
			where.append(" AND t2.TIPO_PARTICIPANTE = ?");
			params.add(datosdirecciones.getDatosTerceros().getTipoParticipante());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getDatosTerceros().getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t2.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t2.USUARIO_REGISTRO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getFechaUltmodificacion() != null) {
			where.append(" AND t2.FECHA_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getDatosTerceros().getFechaUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getDatosTerceros() != null
				&& datosdirecciones.getDatosTerceros().getUsuarioUltmodificacion() != null) {
			where.append(" AND UPPER(t2.USUARIO_ULTMODIFICACION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDatosTerceros().getUsuarioUltmodificacion().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDatosTerceros().getUsuarioUltmodificacion().toUpperCase() + "%");
			}
			where.append(" AND t2.USUARIO_ULTMODIFICACION IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			where.append(" AND t3.ID_TIPO_DIRECCION = ?");
			params.add(datosdirecciones.getTiposDireccion().getIdTipoDireccion());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t3.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getTiposDireccion().getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getTiposDireccion().getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t3.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t3.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getTiposDireccion().getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getTiposDireccion().getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t3.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getFechaRegistro() != null) {
			where.append(" AND t3.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getTiposDireccion().getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t3.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getTiposDireccion().getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getTiposDireccion().getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t3.USUARIO_REGISTRO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getDireccion() != null) {
			where.append(" AND UPPER(t1.DIRECCION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getDireccion().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getDireccion().toUpperCase() + "%");
			}
			where.append(" AND t1.DIRECCION IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getNumero() != null) {
			where.append(" AND UPPER(t1.NUMERO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getNumero().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getNumero().toUpperCase() + "%");
			}
			where.append(" AND t1.NUMERO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getEscalera() != null) {
			where.append(" AND UPPER(t1.ESCALERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getEscalera().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getEscalera().toUpperCase() + "%");
			}
			where.append(" AND t1.ESCALERA IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getPiso() != null) {
			where.append(" AND UPPER(t1.PISO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getPiso().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getPiso().toUpperCase() + "%");
			}
			where.append(" AND t1.PISO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getLetra() != null) {
			where.append(" AND UPPER(t1.LETRA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getLetra().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getLetra().toUpperCase() + "%");
			}
			where.append(" AND t1.LETRA IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getCodigoPostal() != null) {
			where.append(" AND UPPER(t1.CODIGO_POSTAL) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getCodigoPostal().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getCodigoPostal().toUpperCase() + "%");
			}
			where.append(" AND t1.CODIGO_POSTAL IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getIdProvincia() != null) {
			where.append(" AND t1.ID_PROVINCIA = ?");
			params.add(datosdirecciones.getIdProvincia());
		}
		if (datosdirecciones != null && datosdirecciones.getIdMunicipio() != null) {
			where.append(" AND t1.ID_MUNICIPIO = ?");
			params.add(datosdirecciones.getIdMunicipio());
		}
		if (datosdirecciones != null && datosdirecciones.getIdLocalidad() != null) {
			where.append(" AND t1.ID_LOCALIDAD = ?");
			params.add(datosdirecciones.getIdLocalidad());
		}
		if (datosdirecciones != null && datosdirecciones.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(datosdirecciones.getFechaRegistro());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}
		if (datosdirecciones != null && datosdirecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(datosdirecciones.getFechaUltmodificacion());
		}
		if (datosdirecciones != null && datosdirecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND UPPER(t1.USUARIO_ULTMODIFICACION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(datosdirecciones.getUsuarioUltmodificacion().toUpperCase() + "%");
			} else {
				params.add("%" + datosdirecciones.getUsuarioUltmodificacion().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_ULTMODIFICACION IS NOT NULL");
		}

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

		return mapWhere;
	}
	// CHECKSTYLE:ON CyclomaticComplexity - GeneraciÃ³n de cÃ³digo de UDA

	/**
	 * StringBuilder initilization value
	 */
	public static final int STRING_BUILDER_INIT = 4096;
}
