package com.ejie.ad74a.dao;

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.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableManagerJerarquia;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ContactosDaoImpl generated by UDA, 10-feb-2023 12:13:19.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class ContactosDaoImpl implements ContactosDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDCONTACTO03", "TIPOCONTACTO03",
			"TIPOIDENTIFICADOR03", "IDENTIFICADOR03", "NOMBRE03", "APELLIDO103", "APELLIDO203", "SEXO03",
			"RAZONSOCIAL03", "CONTACTOINST03", "PARENTESCO03", "POSEELLAVES03", "TLFNO03", "TLFNO203", "TLFNO303",
			"IDSOLICITANTE03", "IDEXPEDIENTE03", "ORDEN03", "USUHISTORICO03", "FHISTORICO03", "FALTA03", "USUALTA03" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_CONTACTO = "SEQ_CONTACTOS";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Contactos> rwMap = new RowMapper<Contactos>() {
		public Contactos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Contactos(UtilSQL.getLong(resultSet, "IDCONTACTO03"),
					UtilSQL.getInt(resultSet, "TIPOCONTACTO03"), resultSet.getString("TIPOIDENTIFICADOR03"),
					resultSet.getString("IDENTIFICADOR03"), resultSet.getString("NOMBRE03"),
					resultSet.getString("APELLIDO103"), resultSet.getString("APELLIDO203"),
					resultSet.getString("SEXO03"), resultSet.getString("RAZONSOCIAL03"),
					UtilSQL.getInt(resultSet, "CONTACTOINST03") == null ? 0
							: UtilSQL.getInt(resultSet, "CONTACTOINST03"),
					resultSet.getString("PARENTESCO03"),
					UtilSQL.getInt(resultSet, "POSEELLAVES03") == null ? 0 : UtilSQL.getInt(resultSet, "POSEELLAVES03"),
					resultSet.getString("TLFNO03"), resultSet.getString("TLFNO203"), resultSet.getString("TLFNO303"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE03"), UtilSQL.getLong(resultSet, "IDEXPEDIENTE03"),
					UtilSQL.getInt(resultSet, "ORDEN03"), resultSet.getString("USUHISTORICO03"),
					resultSet.getDate("FHISTORICO03"), resultSet.getString("USUALTA03"), resultSet.getDate("FALTA03"));
		}
	};

	private RowMapper<Contactos> rwMapPK = new RowMapper<Contactos>() {
		public Contactos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Contactos(UtilSQL.getLong(resultSet, "IDCONTACTO03"));
		}
	};

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

			Contactos contactos = new Contactos(UtilSQL.getLong(resultSet, "IDCONTACTO03"),
					UtilSQL.getInt(resultSet, "TIPOCONTACTO03"), resultSet.getString("TIPOIDENTIFICADOR03"),
					resultSet.getString("IDENTIFICADOR03"), resultSet.getString("NOMBRE03"),
					resultSet.getString("APELLIDO103"), resultSet.getString("APELLIDO203"),
					resultSet.getString("SEXO03"), resultSet.getString("RAZONSOCIAL03"),
					UtilSQL.getInt(resultSet, "CONTACTOINST03") == null ? 0
							: UtilSQL.getInt(resultSet, "CONTACTOINST03"),
					resultSet.getString("PARENTESCO03"),
					UtilSQL.getInt(resultSet, "POSEELLAVES03") == null ? 0 : UtilSQL.getInt(resultSet, "POSEELLAVES03"),
					resultSet.getString("TLFNO03"), resultSet.getString("TLFNO203"), resultSet.getString("TLFNO303"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE03"), UtilSQL.getLong(resultSet, "IDEXPEDIENTE03"),
					UtilSQL.getInt(resultSet, "ORDEN03"), resultSet.getString("USUHISTORICO03"),
					resultSet.getDate("FHISTORICO03"), resultSet.getString("USUALTA03"), resultSet.getDate("FALTA03"));

			JerarquiaDto<Contactos> jerarquia = new JerarquiaDto<Contactos>();
			jerarquia.setModel(contactos);
			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 Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	public Contactos add(Contactos contactos) {
		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO CONTACTOS (ID_CONTACTO_03, TIPO_CONTACTO_03, TIPO_IDENTIFICADOR_03, IDENTIFICADOR_03, NOMBRE_03, APELLIDO1_03, APELLIDO2_03, SEXO_03, RAZON_SOCIAL_03, CONTACTO_INST_03, PARENTESCO_03, POSEE_LLAVES_03, TLFNO_03, TLFNO2_03, TLFNO3_03, ID_SOLICITANTE_03, ID_EXPEDIENTE_03, ORDEN_03, USU_HISTORICO_03, F_HISTORICO_03, F_ALTA_03, USU_ALTA_03 ) "
				+ "VALUES (" + SEQUENCE_CONTACTO
				+ ".NEXTVAL,:tipoContacto,:tipoIdentificador,:identificador,:nombre,:apellido1,:apellido2,:sexo,:razonSocial,:contactoInst,:parentesco,:poseeLlaves, :tlfno, :tlfno2, :tlfno3, :idSolicitante, :idExpediente, :orden, :usuHistorico, :fHistorico, sysdate, :usuAlta)";
		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("tipoContacto", contactos.getTipoContacto03())
				.addValue("tipoIdentificador", contactos.getTipoIdentificador03())
				.addValue("identificador", contactos.getIdentificador03()).addValue("nombre", contactos.getNombre03())
				.addValue("apellido1", contactos.getApellido103()).addValue("apellido2", contactos.getApellido203())
				.addValue("sexo", contactos.getSexo03()).addValue("razonSocial", contactos.getRazonSocial03())
				.addValue("contactoInst", contactos.getContactoInst03() == null ? 0 : contactos.getContactoInst03())
				.addValue("parentesco", contactos.getParentesco03())
				.addValue("poseeLlaves", contactos.getPoseeLlaves03() == null ? 0 : contactos.getPoseeLlaves03())//
				.addValue("tlfno", contactos.getTlfno03()).addValue("tlfno2", contactos.getTlfno203())
				.addValue("tlfno3", contactos.getTlfno303()).addValue("idSolicitante", contactos.getIdSolicitante03())
				.addValue("idExpediente", contactos.getIdExpediente03()).addValue("orden", contactos.getOrden03())
				.addValue("usuHistorico", contactos.getUsuHistorico03())
				.addValue("fHistorico", contactos.getfHistorico()).addValue("usuAlta", contactos.getUsuAlta03());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_CONTACTO_03" });
		contactos.setIdContacto03(generatedKeyHolder.getKey().longValue());

		return contactos;
	}

	/**
	 * Updates a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	public Contactos update(Contactos contactos) {
		String query = "UPDATE CONTACTOS SET TIPO_CONTACTO_03=?, TIPO_IDENTIFICADOR_03=?, IDENTIFICADOR_03= UPPER(?), NOMBRE_03=?, APELLIDO1_03=?, APELLIDO2_03=?, SEXO_03=?, RAZON_SOCIAL_03=?, CONTACTO_INST_03=?, PARENTESCO_03=?, POSEE_LLAVES_03=?, TLFNO_03 = ?, TLFNO2_03 = ?, TLFNO3_03 = ?, ID_SOLICITANTE_03 = ?, ID_EXPEDIENTE_03 = ?, ORDEN_03 = ?, USU_HISTORICO_03 = ?, F_HISTORICO_03 = ?, F_ALTA_03 = ?, USU_ALTA_03 = ? WHERE ID_CONTACTO_03=?";

		this.jdbcTemplate.update(query, contactos.getTipoContacto03(), contactos.getTipoIdentificador03(),
				contactos.getIdentificador03(), contactos.getNombre03(), contactos.getApellido103(),
				contactos.getApellido203(), contactos.getSexo03(), contactos.getRazonSocial03(),
				contactos.getContactoInst03() == null ? 0 : contactos.getContactoInst03(), contactos.getParentesco03(),
				contactos.getPoseeLlaves03() == null ? 0 : contactos.getPoseeLlaves03(), contactos.getTlfno03(),
				contactos.getTlfno203(), contactos.getTlfno303(), contactos.getIdSolicitante03(),
				contactos.getIdExpediente03(), contactos.getOrden03(), contactos.getUsuHistorico03(),
				contactos.getfHistorico(), contactos.getUsuAlta03(), contactos.getfAlta03(),
				contactos.getIdContacto03());
		return contactos;
	}

	/**
	 * Updates a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	public Contactos pasarHistorico(Contactos contactos) {
		String query = "UPDATE CONTACTOS SET USU_HISTORICO_03 = ?, F_HISTORICO_03 = sysdate  WHERE ID_CONTACTO_03=?";

		this.jdbcTemplate.update(query, contactos.getUsuHistorico03(), contactos.getIdContacto03());
		return contactos;
	}

	/**
	 * Finds a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	@Transactional(readOnly = true)
	public Contactos find(Contactos contactos) {
		String query = "SELECT t1.ID_CONTACTO_03 IDCONTACTO03, t1.TIPO_CONTACTO_03 TIPOCONTACTO03, t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03, t1.IDENTIFICADOR_03 IDENTIFICADOR03, t1.NOMBRE_03 NOMBRE03, t1.APELLIDO1_03 APELLIDO103, t1.APELLIDO2_03 APELLIDO203, t1.SEXO_03 SEXO03, t1.RAZON_SOCIAL_03 RAZONSOCIAL03, t1.CONTACTO_INST_03 CONTACTOINST03, t1.PARENTESCO_03 PARENTESCO03, t1.POSEE_LLAVES_03 POSEELLAVES03, t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 FROM CONTACTOS t1 WHERE t1.ID_CONTACTO_03 = ? ";

		List<Contactos> contactosList = this.jdbcTemplate.query(query, this.rwMap, contactos.getIdContacto03());
		return (Contactos) DataAccessUtils.uniqueResult(contactosList);
	}

	/**
	 * Removes a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return
	 */
	public void remove(Contactos contactos) {
		String query = "DELETE FROM CONTACTOS WHERE ID_CONTACTO_03=?";
		this.jdbcTemplate.update(query, contactos.getIdContacto03());
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	public List<Contactos> getMultiple(Contactos filterContactos, TableRequestDto tableRequestDto, Boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_CONTACTO_03 IDCONTACTO03, t1.TIPO_CONTACTO_03 TIPOCONTACTO03, t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03, t1.IDENTIFICADOR_03 IDENTIFICADOR03, t1.NOMBRE_03 NOMBRE03, t1.APELLIDO1_03 APELLIDO103, t1.APELLIDO2_03 APELLIDO203, t1.SEXO_03 SEXO03, t1.RAZON_SOCIAL_03 RAZONSOCIAL03, t1.CONTACTO_INST_03 CONTACTOINST03, t1.PARENTESCO_03 PARENTESCO03, t1.POSEE_LLAVES_03 POSEELLAVES03, t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		query.append(" FROM CONTACTOS t1 ");
		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterContactos, startsWith);
		StringBuilder where = new StringBuilder(query + " WHERE 1=1 ");
		where.append(mapaWhere.get("query"));

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

		StringBuilder sbMultipleSQL = TableManager.getSelectMultipleQuery(tableRequestDto, Contactos.class, params,
				"ID_CONTACTO_03");
		where.append(sbMultipleSQL);

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

	/**
	 * Finds a list of rows in the Contactos table.
	 *
	 * @param contactos       Contactos
	 * @param tableRequestDto TableRequestDto
	 * @return List<Contactos>
	 */
	@Transactional(readOnly = true)
	public List<Contactos> findAll(Contactos contactos, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_CONTACTO_03 IDCONTACTO03,t1.TIPO_CONTACTO_03 TIPOCONTACTO03,t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03,t1.IDENTIFICADOR_03 IDENTIFICADOR03,t1.NOMBRE_03 NOMBRE03,t1.APELLIDO1_03 APELLIDO103,t1.APELLIDO2_03 APELLIDO203,t1.SEXO_03 SEXO03,t1.RAZON_SOCIAL_03 RAZONSOCIAL03,t1.CONTACTO_INST_03 CONTACTOINST03,t1.PARENTESCO_03 PARENTESCO03,t1.POSEE_LLAVES_03 POSEELLAVES03, t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		query.append("FROM CONTACTOS t1 ");

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

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

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

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

	/**
	 * Finds rows in the Contactos table using like.
	 *
	 * @param contactos       Contactos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Contactos>
	 */
	@Transactional(readOnly = true)
	public List<Contactos> findAllLike(Contactos contactos, TableRequestDto tableRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_CONTACTO_03 IDCONTACTO03,t1.TIPO_CONTACTO_03 TIPOCONTACTO03,t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03,t1.IDENTIFICADOR_03 IDENTIFICADOR03,t1.NOMBRE_03 NOMBRE03,t1.APELLIDO1_03 APELLIDO103,t1.APELLIDO2_03 APELLIDO203,t1.SEXO_03 SEXO03,t1.RAZON_SOCIAL_03 RAZONSOCIAL03,t1.CONTACTO_INST_03 CONTACTOINST03,t1.PARENTESCO_03 PARENTESCO03,t1.POSEE_LLAVES_03 POSEELLAVES03,t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		query.append("FROM CONTACTOS t1 ");

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

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

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(Contactos contactos) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM CONTACTOS t1 ");

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

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

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

	/**
	 * Counts rows in the Contactos table using like.
	 *
	 * @param contactos  Contactos
	 * @param startsWith Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Contactos contactos, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM CONTACTOS t1 ");

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

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

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

	/**
	 * Reorder the data list of Contactos selected for rup_table
	 *
	 * @param contactos       Contactos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Contactos>>
	 */
	@Override
	public List<TableRowDto<Contactos>> reorderSelection(Contactos contactos, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_CONTACTO_03 IDCONTACTO03,t1.TIPO_CONTACTO_03 TIPOCONTACTO03, t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03,t1.IDENTIFICADOR_03 IDENTIFICADOR03,t1.NOMBRE_03 NOMBRE03,t1.APELLIDO1_03 APELLIDO103,t1.APELLIDO2_03 APELLIDO203,t1.SEXO_03 SEXO03,t1.RAZON_SOCIAL_03 RAZONSOCIAL03,t1.CONTACTO_INST_03 CONTACTOINST03,t1.PARENTESCO_03 PARENTESCO03,t1.POSEE_LLAVES_03 POSEELLAVES03,t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		// FROM
		query.append("FROM CONTACTOS t1 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(contactos, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		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 = TableManager.getReorderQuery(query, tableRequestDto, Contactos.class,
				filterParamList, "IDCONTACTO03");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Contactos
	 * @param searchParams    Contactos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Contactos>>
	 */
	@Override
	public List<TableRowDto<Contactos>> search(Contactos filterParams, Contactos searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_CONTACTO_03 IDCONTACTO03,t1.TIPO_CONTACTO_03 TIPOCONTACTO03,t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03,t1.IDENTIFICADOR_03 IDENTIFICADOR03,t1.NOMBRE_03 NOMBRE03,t1.APELLIDO1_03 APELLIDO103,t1.APELLIDO2_03 APELLIDO203,t1.SEXO_03 SEXO03,t1.RAZON_SOCIAL_03 RAZONSOCIAL03,t1.CONTACTO_INST_03 CONTACTOINST03,t1.PARENTESCO_03 PARENTESCO03,t1.POSEE_LLAVES_03 POSEELLAVES03,t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		// FROM
		query.append("FROM CONTACTOS t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		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 = TableManager.getSearchQuery(query, tableRequestDto, Contactos.class,
				filterParamList, searchSQL, searchParamList, from_alias, "IDCONTACTO03");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param tableRequestDto TableRequestDto
	 */
	@Override
	public void removeMultiple(TableRequestDto tableRequestDto) {
		StringBuilder sbRemoveMultipleSQL = TableManager.getRemoveMultipleQuery(tableRequestDto, Contactos.class,
				"CONTACTOS", new String[] { "IDCONTACTO03" });

		List<String> params = tableRequestDto.getMultiselection().getSelectedIds();

		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical Contactos table.
	 *
	 * @param filterContactos Contactos
	 * @param tableRequestDto TableRequestDto
	 * @return List<JerarquiaDto<Contactos>>
	 */
	@Override
	public List<JerarquiaDto<Contactos>> findAllLikeJerarquia(Contactos filterContactos,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_CONTACTO_03 IDCONTACTO03,t1.TIPO_CONTACTO_03 TIPOCONTACTO03, t1.TIPO_IDENTIFICADOR_03 TIPOIDENTIFICADOR03,t1.IDENTIFICADOR_03 IDENTIFICADOR03,t1.NOMBRE_03 NOMBRE03,t1.APELLIDO1_03 APELLIDO103,t1.APELLIDO2_03 APELLIDO203,t1.SEXO_03 SEXO03,t1.RAZON_SOCIAL_03 RAZONSOCIAL03,t1.CONTACTO_INST_03 CONTACTOINST03,t1.PARENTESCO_03 PARENTESCO03,t1.POSEE_LLAVES_03 POSEELLAVES03, t1.TLFNO_03 TLFNO03, t1.TLFNO2_03 TLFNO203, t1.TLFNO3_03 TLFNO303, t1.ID_SOLICITANTE_03 IDSOLICITANTE03, t1.ID_EXPEDIENTE_03 IDEXPEDIENTE03, t1.ORDEN_03 ORDEN03, t1.USU_HISTORICO_03 USUHISTORICO03, t1.F_HISTORICO_03 FHISTORICO03, t1.F_ALTA_03 FALTA03, t1.USU_ALTA_03 USUALTA03 ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM CONTACTOS t1 ");
		List<String> from = new ArrayList<String>();
		from.add("CONTACTOS");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

		// 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(filterContactos, false);

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

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

		// PAGINACION
		if (tableRequestDto != null) {
			query = TableManagerJerarquia.getPaginationQuery(tableRequestDto, query,
					ContactosDaoImpl.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 filterContactos Contactos
	 * @param tableRequestDto TableRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(Contactos filterContactos, TableRequestDto tableRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM CONTACTOS t1 ");
		List<String> from = new ArrayList<String>();
		from.add("CONTACTOS");

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

		// 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(filterContactos, false);

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

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

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

	/**
	 * Find dependent hierarchical rows
	 *
	 * @param filterContactos Contactos
	 * @param tableRequestDto TableRequestDto
	 * @return List<TableRowDto<Contactos>>
	 */
	@Override
	public List<TableRowDto<Contactos>> findAllChild(Contactos filterContactos, TableRequestDto tableRequestDto) {

		// FROM
		// StringBuilder from = new StringBuilder("FROM CONTACTOS t1 ");
		List<String> from = new ArrayList<String>();
		from.add("CONTACTOS");

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

		// 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(filterContactos, false);

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

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

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

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

	/**
	 * Busca el orden mas alto de los contactos de un expediente.
	 * 
	 * @param contactos Contactos
	 * @return Integer
	 */
	public Integer findLastOrdenContactoExpediente(Contactos contactos) {
		String query = "SELECT MAX(ORDEN_03) FROM CONTACTOS WHERE ID_EXPEDIENTE_03=?";
		return this.jdbcTemplate.queryForObject(query, new Object[] { contactos.getIdExpediente03() }, Integer.class);
	}

	/**
	 * Busca el orden mas alto de los contactos de un solicitante.
	 * 
	 * @param contactos Contactos
	 * @return Integer
	 */
	public Integer findLastOrdenContactoSolicitante(Contactos contactos) {
		String query = "SELECT MAX(ORDEN_03) FROM CONTACTOS WHERE ID_SOLICITANTE_03=?";
		return this.jdbcTemplate.queryForObject(query, new Object[] { contactos.getIdSolicitante03() }, Integer.class);
	}

	/**
	 * Inserts a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	public Contactos addContactoExpediente(Contactos contactos) {
		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO CONTACTOS (ID_CONTACTO_03, TIPO_CONTACTO_03, TIPO_IDENTIFICADOR_03, IDENTIFICADOR_03, NOMBRE_03, APELLIDO1_03, APELLIDO2_03, CONTACTO_INST_03, PARENTESCO_03, SEXO_03, POSEE_LLAVES_03, TLFNO_03, TLFNO2_03, TLFNO3_03, ID_SOLICITANTE_03, ID_EXPEDIENTE_03, ORDEN_03, F_ALTA_03, USU_ALTA_03 ) "
				+ "VALUES (" + SEQUENCE_CONTACTO
				+ ".NEXTVAL,:tipoContacto,:tipoIdentificador,UPPER(:identificador),:nombre,:apellido1,:apellido2,:contactoInst,:parentesco,:sexo,:poseeLlaves, :tlfno, :tlfno2, :tlfno3, :idSolicitante, :idExpediente, :orden, sysdate, :usuAlta)";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("tipoContacto", contactos.getTipoContacto03())
				.addValue("tipoIdentificador", contactos.getTipoIdentificador03())
				.addValue("identificador", contactos.getIdentificador03()).addValue("nombre", contactos.getNombre03())
				.addValue("apellido1", contactos.getApellido103()).addValue("apellido2", contactos.getApellido203())
				.addValue("contactoInst", contactos.getContactoInst03())
				.addValue("parentesco", contactos.getParentesco03()).addValue("sexo", contactos.getSexo03())
				.addValue("poseeLlaves", contactos.getPoseeLlaves03()).addValue("tlfno", contactos.getTlfno03())
				.addValue("tlfno2", contactos.getTlfno203()).addValue("tlfno3", contactos.getTlfno303())
				.addValue("idSolicitante", contactos.getIdSolicitante03())
				.addValue("idExpediente", contactos.getIdExpediente03()).addValue("orden", contactos.getOrden03())
				.addValue("usuAlta", contactos.getUsuAlta03());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_CONTACTO_03" });
		contactos.setIdContacto03(generatedKeyHolder.getKey().longValue());

		return contactos;
	}

	/**
	 * Updates a single row in the Contactos table.
	 *
	 * @param contactos Contactos
	 * @return Contactos
	 */
	public Contactos updateContactoExpediente(Contactos contactos) {
		String query = "UPDATE CONTACTOS SET TIPO_CONTACTO_03=?, TIPO_IDENTIFICADOR_03=UPPER(?), IDENTIFICADOR_03=?, NOMBRE_03=?, APELLIDO1_03=?, APELLIDO2_03=?, CONTACTO_INST_03=?, PARENTESCO_03=?, SEXO_03=?, POSEE_LLAVES_03=?, TLFNO_03 = ?, TLFNO2_03 = ?, TLFNO3_03 = ?, ID_SOLICITANTE_03 = ?, ID_EXPEDIENTE_03 = ?, ORDEN_03 = ? WHERE ID_CONTACTO_03=?";
		this.jdbcTemplate.update(query, contactos.getTipoContacto03(), contactos.getTipoIdentificador03(),
				contactos.getIdentificador03(), contactos.getNombre03(), contactos.getApellido103(),
				contactos.getApellido203(),
				null != contactos.getContactoInst03() ? contactos.getContactoInst03() : new Integer(0),
				contactos.getParentesco03(), contactos.getSexo03(), contactos.getPoseeLlaves03(),
				contactos.getTlfno03(), contactos.getTlfno203(), contactos.getTlfno303(),
				contactos.getIdSolicitante03(), contactos.getIdExpediente03(), contactos.getOrden03(),
				contactos.getIdContacto03());
		return contactos;
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * Contactos entity
	 *
	 * @param contactos Contactos 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(Contactos contactos) {

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

		if (contactos != null && contactos.getIdContacto03() != null) {
			where.append(" AND t1.ID_CONTACTO_03 = ?");
			params.add(contactos.getIdContacto03());
		}

		if (contactos != null && contactos.getTipoContacto03() != null) {
			where.append(" AND t1.TIPO_CONTACTO_03 = ?");
			params.add(contactos.getTipoContacto03());
		}

		if (contactos != null && contactos.getTipoIdentificador03() != null) {
			where.append(" AND t1.TIPO_IDENTIFICADOR_03 = ?");
			params.add(contactos.getTipoIdentificador03());
		}
		if (contactos != null && contactos.getIdentificador03() != null) {
			where.append(" AND UPPER(t1.IDENTIFICADOR_03) = UPPER(?)");
			params.add(contactos.getIdentificador03());
		}
		if (contactos != null && contactos.getNombre03() != null) {
			where.append(" AND t1.NOMBRE_03 = ?");
			params.add(contactos.getNombre03());
		}
		if (contactos != null && contactos.getApellido103() != null) {
			where.append(" AND t1.APELLIDO1_03 = ?");
			params.add(contactos.getApellido103());
		}
		if (contactos != null && contactos.getApellido203() != null) {
			where.append(" AND t1.APELLIDO2_03 = ?");
			params.add(contactos.getApellido203());
		}
		if (contactos != null && contactos.getSexo03() != null) {
			where.append(" AND t1.SEXO_03 = ?");
			params.add(contactos.getSexo03());
		}
		if (contactos != null && contactos.getRazonSocial03() != null) {
			where.append(" AND t1.RAZON_SOCIAL_03 = ?");
			params.add(contactos.getRazonSocial03());
		}
		if (contactos != null && contactos.getContactoInst03() != null) {
			where.append(" AND t1.CONTACTO_INST_03 = ?");
			params.add(contactos.getContactoInst03());
		}
		if (contactos != null && contactos.getParentesco03() != null) {
			where.append(" AND t1.PARENTESCO_03 = ?");
			params.add(contactos.getParentesco03());
		}
		if (contactos != null && contactos.getPoseeLlaves03() != null) {
			where.append(" AND t1.POSEE_LLAVES_03 = ?");
			params.add(contactos.getPoseeLlaves03());
		}

		if (contactos != null && contactos.getTlfno03() != null) {
			where.append(" AND t1.TLFNO_03 = ?");
			params.add(contactos.getTlfno03());
		}
		if (contactos != null && contactos.getTlfno203() != null) {
			where.append(" AND t1.TLFNO2_03 = ?");
			params.add(contactos.getTlfno203());
		}
		if (contactos != null && contactos.getTlfno303() != null) {
			where.append(" AND t1.TLFNO3_03 = ?");
			params.add(contactos.getTlfno303());
		}

		if (contactos != null && contactos.getIdSolicitante03() != null) {
			where.append(" AND t1.ID_SOLICITANTE_03 = ?");
			params.add(contactos.getIdSolicitante03());
		}
		if (contactos != null && contactos.getIdExpediente03() != null) {
			where.append(" AND t1.ID_EXPEDIENTE_03 = ?");
			params.add(contactos.getIdExpediente03());
		}
		if (contactos != null && contactos.getUsuHistorico03() != null) {
			where.append(" AND t1.USU_HISTORICO_03 = ?");
			params.add(contactos.getUsuHistorico03());
		}
		if (contactos != null && contactos.getfHistorico() != null) {
			where.append(" AND t1.F_HISTORICO_03 = ?");
			params.add(contactos.getfHistorico());
		}
		if (contactos != null && contactos.getUsuAlta03() != null) {
			where.append(" AND t1.USU_ALTA_03 = ?");
			params.add(contactos.getUsuAlta03());
		}
		if (contactos != null && contactos.getfAlta03() != null) {
			where.append(" AND t1.F_ALTA_03 = ?");
			params.add(contactos.getfAlta03());
		}
		if (contactos != null && contactos.getOrden03() != null) {
			where.append(" AND t1.ORDEN_03 = ?");
			params.add(contactos.getOrden03());
		}

		// Para mostrar únicamente los contactos activos
		if (contactos != null && contactos.getActivos() != null && contactos.getActivos()) {
			where.append(" AND t1.F_HISTORICO_03 IS 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

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * Contactos entity
	 *
	 * @param contactos  Contactos 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(Contactos contactos, Boolean startsWith) {

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

		if (contactos != null && contactos.getIdContacto03() != null) {
			where.append(" AND t1.ID_CONTACTO_03 = ?");
			params.add(contactos.getIdContacto03());
		}

		if (contactos != null && contactos.getTipoContacto03() != null) {
			where.append(" AND t1.TIPO_CONTACTO_03 = ?");
			params.add(contactos.getTipoContacto03());
		}

		if (contactos != null && contactos.getTipoIdentificador03() != null) {
			where.append(" AND UPPER(t1.TIPO_IDENTIFICADOR_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getTipoIdentificador03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getTipoIdentificador03().toUpperCase() + "%");
			}
			where.append(" AND t1.TIPO_IDENTIFICADOR_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getIdentificador03() != null) {
			where.append(" AND UPPER(t1.IDENTIFICADOR_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getIdentificador03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getIdentificador03().toUpperCase() + "%");
			}
			where.append(" AND t1.IDENTIFICADOR_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getNombre03() != null) {
			where.append(" AND UPPER(t1.NOMBRE_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getNombre03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getNombre03().toUpperCase() + "%");
			}
			where.append(" AND t1.NOMBRE_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getApellido103() != null) {
			where.append(" AND UPPER(t1.APELLIDO1_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getApellido103().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getApellido103().toUpperCase() + "%");
			}
			where.append(" AND t1.APELLIDO1_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getApellido203() != null) {
			where.append(" AND UPPER(t1.APELLIDO2_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getApellido203().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getApellido203().toUpperCase() + "%");
			}
			where.append(" AND t1.APELLIDO2_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getSexo03() != null) {
			where.append(" AND UPPER(t1.SEXO_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getSexo03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getSexo03().toUpperCase() + "%");
			}
			where.append(" AND t1.SEXO_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getRazonSocial03() != null) {
			where.append(" AND UPPER(t1.RAZON_SOCIAL_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getRazonSocial03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getRazonSocial03().toUpperCase() + "%");
			}
			where.append(" AND t1.RAZON_SOCIAL_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getContactoInst03() != null) {
			where.append(" AND t1.CONTACTO_INST_03 = ?");
			params.add(contactos.getContactoInst03());
		}
		if (contactos != null && contactos.getParentesco03() != null) {
			where.append(" AND UPPER(t1.PARENTESCO_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getParentesco03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getParentesco03().toUpperCase() + "%");
			}
			where.append(" AND t1.PARENTESCO_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getPoseeLlaves03() != null) {
			where.append(" AND t1.POSEE_LLAVES_03 = ?");
			params.add(contactos.getPoseeLlaves03());
		}

		if (contactos != null && contactos.getTlfno03() != null) {
			where.append(" AND UPPER(t1.TLFNO_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getTlfno03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getTlfno03().toUpperCase() + "%");
			}
			where.append(" AND t1.TLFNO_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getTlfno203() != null) {
			where.append(" AND UPPER(t1.TLFNO2_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getTlfno203().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getTlfno203().toUpperCase() + "%");
			}
			where.append(" AND t1.TLFNO2_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getTlfno303() != null) {
			where.append(" AND UPPER(t1.TLFNO3_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getTlfno303().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getTlfno303().toUpperCase() + "%");
			}
			where.append(" AND t1.TLFNO3_03 IS NOT NULL");
		}

		if (contactos != null && contactos.getIdSolicitante03() != null) {
			where.append(" AND t1.ID_SOLICITANTE_03 = ?");
			params.add(contactos.getIdSolicitante03());
		}

		if (contactos != null && contactos.getIdExpediente03() != null) {
			where.append(" AND t1.ID_EXPEDIENTE_03 = ?");
			params.add(contactos.getIdExpediente03());
		}
		if (contactos != null && contactos.getUsuHistorico03() != null) {
			where.append(" AND UPPER(t1.USU_HISTORICO_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getUsuHistorico03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getUsuHistorico03().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_HISTORICO_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getUsuAlta03() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_03) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(contactos.getUsuAlta03().toUpperCase() + "%");
			} else {
				params.add("%" + contactos.getUsuAlta03().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_03 IS NOT NULL");
		}
		if (contactos != null && contactos.getfHistorico() != null) {
			where.append(" AND t1.F_HISTORICO_03 = ?");
			params.add(contactos.getfHistorico());
		}
		if (contactos != null && contactos.getfAlta03() != null) {
			where.append(" AND t1.F_ALTA_03 = ?");
			params.add(contactos.getfAlta03());
		}
		if (contactos != null && contactos.getOrden03() != null) {
			where.append(" AND t1.ORDEN_03 = ?");
			params.add(contactos.getOrden03());
		}

		// Para mostrar únicamente los contactos activos
		if (contactos != null && contactos.getActivos() != null && contactos.getActivos()) {
			where.append(" AND t1.F_HISTORICO_03 IS 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;
}
