package com.ejie.ad74a.dao;

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;
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.Direcciones;
import com.ejie.ad74a.model.comun.Portal;
import com.ejie.ad74a.util.UtilSQL;

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

@Repository
@Transactional
public class DireccionesDaoImpl implements DireccionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDDIRECCION06", "CALLE06", "CP06", "IDCALLE06",
			"IDLOCALIDAD06", "IDMUNICIPIO06", "IDPAIS06", "IDPORTAL06", "IDPROVINCIA06", "LETRA06", "LOCALIDAD06",
			"MUNICIPIO06", "PAIS06", "PISO06", "PORTAL06", "ESCALERA06", "PROVINCIA06", "IDSOLICITANTE06",
			"USUHISTORICO06", "FHISTORICO06", "FALTA06", "USUALTA06" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_DIRECCION = "SEQ_DIRECCIONES";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Direcciones> rwMap = new RowMapper<Direcciones>() {
		public Direcciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Direcciones(UtilSQL.getLong(resultSet, "IDDIRECCION06"), resultSet.getString("CALLE06"),
					resultSet.getString("CP06"), UtilSQL.getLong(resultSet, "IDCALLE06"),
					UtilSQL.getLong(resultSet, "IDLOCALIDAD06"), resultSet.getString("IDMUNICIPIO06"),
					resultSet.getString("IDPAIS06"), UtilSQL.getLong(resultSet, "IDPORTAL06"),
					resultSet.getString("IDPROVINCIA06"), resultSet.getString("LETRA06"),
					resultSet.getString("LOCALIDAD06"), resultSet.getString("MUNICIPIO06"),
					resultSet.getString("PAIS06"), resultSet.getString("PISO06"), resultSet.getString("PORTAL06"),
					resultSet.getString("ESCALERA06"), resultSet.getString("PROVINCIA06"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE06"), resultSet.getString("USUHISTORICO06"),
					resultSet.getDate("FHISTORICO06"), resultSet.getDate("FALTA06"), resultSet.getString("USUALTA06"));
		}
	};

	private RowMapper<Direcciones> rwMapHistorico = new RowMapper<Direcciones>() {
		public Direcciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Direcciones(UtilSQL.getLong(resultSet, "IDDIRECCION06"), resultSet.getString("CALLE06"),
					resultSet.getString("CP06"), UtilSQL.getLong(resultSet, "IDCALLE06"),
					UtilSQL.getLong(resultSet, "IDLOCALIDAD06"), resultSet.getString("IDMUNICIPIO06"),
					resultSet.getString("IDPAIS06"), UtilSQL.getLong(resultSet, "IDPORTAL06"),
					resultSet.getString("IDPROVINCIA06"), resultSet.getString("LETRA06"),
					resultSet.getString("LOCALIDAD06"), resultSet.getString("MUNICIPIO06"),
					resultSet.getString("PAIS06"), resultSet.getString("PISO06"), resultSet.getString("PORTAL06"),
					resultSet.getString("ESCALERA06"), resultSet.getString("PROVINCIA06"),
					resultSet.getString("USUHISTORICO06"), resultSet.getDate("FHISTORICO06"),
					resultSet.getString("provincianoradesces"), resultSet.getString("provincianoradesceu"),
					resultSet.getString("municipionoradesc"), resultSet.getString("localidadNORADesc"),
					resultSet.getString("calleDescripcion"), resultSet.getString("calleTipoVia"),
					new Portal(UtilSQL.getLong(resultSet, "codportal"), resultSet.getString("bloque"),
							UtilSQL.getLong(resultSet, "numero"), resultSet.getString("bis"),
							UtilSQL.getLong(resultSet, "idcalleportal"), UtilSQL.getLong(resultSet, "idlocalidadcalle"),
							resultSet.getString("codigopostalcalle"), resultSet.getBigDecimal("idtramocalle")));
		}
	};

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

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

			Direcciones direcciones = new Direcciones(UtilSQL.getLong(resultSet, "IDDIRECCION06"),
					resultSet.getString("CALLE06"), resultSet.getString("CP06"),
					UtilSQL.getLong(resultSet, "IDCALLE06"), UtilSQL.getLong(resultSet, "IDLOCALIDAD06"),
					resultSet.getString("IDMUNICIPIO06"), resultSet.getString("IDPAIS06"),
					UtilSQL.getLong(resultSet, "IDPORTAL06"), resultSet.getString("IDPROVINCIA06"),
					resultSet.getString("LETRA06"), resultSet.getString("LOCALIDAD06"),
					resultSet.getString("MUNICIPIO06"), resultSet.getString("PAIS06"), resultSet.getString("PISO06"),
					resultSet.getString("PORTAL06"), resultSet.getString("ESCALERA06"),
					resultSet.getString("PROVINCIA06"), UtilSQL.getLong(resultSet, "IDSOLICITANTE06"),
					resultSet.getString("USUHISTORICO06"), resultSet.getDate("FHISTORICO06"),
					resultSet.getDate("FALTA06"), resultSet.getString("USUALTA06"));

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

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO DIRECCIONES (ID_DIRECCION_06, CALLE_06, CP_06, ID_CALLE_06, ID_LOCALIDAD_06, ID_MUNICIPIO_06, ID_PAIS_06, ID_PORTAL_06, ID_PROVINCIA_06, LETRA_06, LOCALIDAD_06, MUNICIPIO_06, PAIS_06, PISO_06, PORTAL_06, ESCALERA_06, PROVINCIA_06, ID_SOLICITANTE_06, USU_HISTORICO_06, F_HISTORICO_06, F_ALTA_06, USU_ALTA_06) "
				+ "VALUES (" + SEQUENCE_DIRECCION
				+ ".NEXTVAL,:calle,:cp,:idCalle,:idLocalidad,:idMunicipio,:idPais,:idPortal,:idProvincia,:letra,:localidad,:municipio,:pais,:piso,:portal,:escalera,:provincia,:idSolicitante, :usuHistorico, :fHistorico, SYSDATE,:usuAlta)";

		MapSqlParameterSource parameters = new MapSqlParameterSource().addValue("calle", direcciones.getCalle06())
				.addValue("cp", direcciones.getCp06()).addValue("idCalle", direcciones.getIdCalle06())
				.addValue("idLocalidad", direcciones.getIdLocalidad06())
				.addValue("idMunicipio", direcciones.getIdMunicipio06()).addValue("idPais", direcciones.getIdPais06())
				.addValue("idPortal", direcciones.getIdPortal06())
				.addValue("idProvincia", direcciones.getIdProvincia06()).addValue("letra", direcciones.getLetra06())
				.addValue("localidad", direcciones.getLocalidad06()).addValue("municipio", direcciones.getMunicipio06())
				.addValue("pais", direcciones.getPais06()).addValue("idProvincia", direcciones.getIdProvincia06())
				.addValue("piso", direcciones.getPiso06()).addValue("portal", direcciones.getPortal06())
				.addValue("escalera", direcciones.getEscalera06()).addValue("provincia", direcciones.getProvincia06())
				.addValue("idSolicitante", direcciones.getIdSolicitante06())
				.addValue("usuHistorico", direcciones.getUsuHistorico06())
				.addValue("fHistorico", direcciones.getfHistorico06()).addValue("usuAlta", direcciones.getUsuAlta06());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_DIRECCION_06" });
		direcciones.setIdDireccion06(generatedKeyHolder.getKey().longValue());

		return direcciones;
	}

	/**
	 * Updates a single row in the Direcciones table.
	 *
	 * @param direcciones Direcciones
	 * @return Direcciones
	 */
	public Direcciones update(Direcciones direcciones) {
		String query = "UPDATE DIRECCIONES SET USU_HISTORICO_06 = ? , F_HISTORICO_06 =  ? ,CALLE_06=?, CP_06=?, ID_CALLE_06=?, ID_LOCALIDAD_06=?, ID_MUNICIPIO_06=?, ID_PAIS_06=?, ID_PORTAL_06=?, ID_PROVINCIA_06=?, LETRA_06=?, LOCALIDAD_06=?, MUNICIPIO_06=?, PAIS_06=?, PISO_06=?, PORTAL_06=?, ESCALERA_06 = ?, PROVINCIA_06=?, ID_SOLICITANTE_06 = ? WHERE ID_DIRECCION_06=?";
		this.jdbcTemplate.update(query, direcciones.getUsuHistorico06(), direcciones.getfHistorico06(),
				direcciones.getCalle06(), direcciones.getCp06(), direcciones.getIdCalle06(),
				direcciones.getIdLocalidad06(), direcciones.getIdMunicipio06(), direcciones.getIdPais06(),
				direcciones.getIdPortal06(), direcciones.getIdProvincia06(), direcciones.getLetra06(),
				direcciones.getLocalidad06(), direcciones.getMunicipio06(), direcciones.getPais06(),
				direcciones.getPiso06(), direcciones.getPortal06(), direcciones.getEscalera06(),
				direcciones.getProvincia06(), direcciones.getIdSolicitante06(), direcciones.getIdDireccion06());
		return direcciones;
	}

	/**
	 * Finds a single row in the Direcciones table.
	 *
	 * @param direcciones Direcciones
	 * @return Direcciones
	 */
	@Transactional(readOnly = true)
	public Direcciones find(Direcciones direcciones) {
		String query = "SELECT t1.ID_DIRECCION_06 IDDIRECCION06, t1.CALLE_06 CALLE06, t1.CP_06 CP06, t1.ID_CALLE_06 IDCALLE06, t1.ID_LOCALIDAD_06 IDLOCALIDAD06, t1.ID_MUNICIPIO_06 IDMUNICIPIO06, t1.ID_PAIS_06 IDPAIS06, t1.ID_PORTAL_06 IDPORTAL06, t1.ID_PROVINCIA_06 IDPROVINCIA06, t1.LETRA_06 LETRA06, t1.LOCALIDAD_06 LOCALIDAD06, t1.MUNICIPIO_06 MUNICIPIO06, t1.PAIS_06 PAIS06, t1.PISO_06 PISO06, t1.PORTAL_06 PORTAL06, t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06, t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06, t1.F_ALTA_06 FALTA06, t1.USU_ALTA_06 USUALTA06 FROM DIRECCIONES t1  WHERE t1.ID_DIRECCION_06 = ?  ";

		List<Direcciones> direccionesList = this.jdbcTemplate.query(query, this.rwMap, direcciones.getIdDireccion06());
		return (Direcciones) DataAccessUtils.uniqueResult(direccionesList);
	}

	/**
	 * Removes a single row in the Direcciones table.
	 *
	 * @param direcciones Direcciones
	 * @return
	 */
	public void remove(Direcciones direcciones) {
		String query = "DELETE FROM DIRECCIONES WHERE ID_DIRECCION_06=?";
		this.jdbcTemplate.update(query, direcciones.getIdDireccion06());
	}

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

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION_06 IDDIRECCION06, t1.CALLE_06 CALLE06, t1.CP_06 CP06, t1.ID_CALLE_06 IDCALLE06, t1.ID_LOCALIDAD_06 IDLOCALIDAD06, t1.ID_MUNICIPIO_06 IDMUNICIPIO06, t1.ID_PAIS_06 IDPAIS06, t1.ID_PORTAL_06 IDPORTAL06, t1.ID_PROVINCIA_06 IDPROVINCIA06, t1.LETRA_06 LETRA06, t1.LOCALIDAD_06 LOCALIDAD06, t1.MUNICIPIO_06 MUNICIPIO06, t1.PAIS_06 PAIS06, t1.PISO_06 PISO06, t1.PORTAL_06 PORTAL06, t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06, t1.ID_SOLICITANTE_06, t1.USU_HISTORICO_06, t1.F_HISTORICO_06, t1.F_ALTA_06 FALTA06, t1.USU_ALTA_06 USUALTA06");
		query.append(" FROM DIRECCIONES t1  ");
		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterDirecciones, 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, Direcciones.class, params,
				"ID_DIRECCION_06");
		where.append(sbMultipleSQL);

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

	/**
	 * Finds a list of rows in the Direcciones table.
	 *
	 * @param direcciones     Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @return List<Direcciones>
	 */
	@Transactional(readOnly = true)
	public List<Direcciones> findAll(Direcciones direcciones, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06,t1.ID_MUNICIPIO_06 IDMUNICIPIO06,t1.ID_PAIS_06 IDPAIS06,t1.ID_PORTAL_06 IDPORTAL06,t1.ID_PROVINCIA_06 IDPROVINCIA06,t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06,t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06, t1.F_ALTA_06 FALTA06,t1.USU_ALTA_06 USUALTA06 ");
		query.append("FROM DIRECCIONES t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(direcciones);
		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, DireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Finds rows in the Direcciones table using like.
	 *
	 * @param direcciones     Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Direcciones>
	 */
	@Transactional(readOnly = true)
	public List<Direcciones> findAllLike(Direcciones direcciones, TableRequestDto tableRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06,t1.ID_MUNICIPIO_06 IDMUNICIPIO06,t1.ID_PAIS_06 IDPAIS06,t1.ID_PORTAL_06 IDPORTAL06,t1.ID_PROVINCIA_06 IDPROVINCIA06,t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06,t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06, t1.F_ALTA_06 FALTA06,t1.USU_ALTA_06 USUALTA06 ");
		query.append("FROM DIRECCIONES t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(direcciones, 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, DireccionesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Finds rows in the Direcciones table using like.
	 *
	 * @param direcciones     Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Direcciones>
	 */
	@Transactional(readOnly = true)
	public List<Direcciones> findAllLikeHistorico(Direcciones direcciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06, t1.ID_MUNICIPIO_06 IDMUNICIPIO06, t1.ID_PAIS_06 IDPAIS06, t1.ID_PORTAL_06 IDPORTAL06, t1.ID_PROVINCIA_06 IDPROVINCIA06, t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06, t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06 ");
		query.append(", t2.ds_e provincianoradesceu, t2.ds_c provincianoradesces");
		query.append(", t3.DS_O municipionoradesc ");
		query.append(", t4.TIPO_VIA calleTipoVia,t4.ds_o calleDescripcion ");
		query.append(", t5.DS_O localidadNORADesc ");
		query.append(
				", T6.ID codportal, T6.BLOQUE bloque, T6.NUMERO numero, T6.BIS bis, T6.CALLE_ID idcalleportal, T6.LOCALIDAD_ID idlocalidadcalle, T6.CODIGO_POSTAL codigopostalcalle, T6.TRAMO_ID idtramocalle ");
		query.append("FROM DIRECCIONES t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t2 ON (t1.ID_PROVINCIA_06 = t2.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t3 ON (t1.ID_MUNICIPIO_06= t3.ID AND t1.id_provincia_06 = t3.PROVINCIA_ID) ");
		query.append(
				"LEFT JOIN T17_CALLE t4 ON (t1.ID_CALLE_06 = t4.id AND t1.id_provincia_06 = t4.provincia_id AND t1.id_municipio_06 = t4.municipio_id) ");
		query.append(
				"LEFT JOIN T17_LOCALIDAD t5 ON ( t1.ID_LOCALIDAD_06 = t5.id AND t1.id_provincia_06 = t5.PROVINCIA_ID AND t1.id_municipio_06 = t5.MUNICIPIO_ID) ");
		query.append("LEFT JOIN T17_PORTAL T6 ON (t1.ID_PORTAL_06 = t6.ID) ");

		// Where clause & Params
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(" AND t1.F_HISTORICO_06 IS NOT NULL AND t1.ID_SOLICITANTE_06 = ?");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add(direcciones.getIdSolicitante06());

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(direcciones);
		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 Direcciones table using like.
	 *
	 * @param direcciones Direcciones
	 * @param startsWith  Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Direcciones direcciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM DIRECCIONES t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(direcciones, 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);
	}

	/**
	 * Counts rows in the Direcciones table using like.
	 *
	 * @param direcciones Direcciones
	 * @param startsWith  Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountHistorico(Direcciones direcciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM DIRECCIONES t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t2 ON (t1.ID_PROVINCIA_06 = t2.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t3 ON (t1.ID_MUNICIPIO_06= t3.ID AND t1.id_provincia_06 = t3.PROVINCIA_ID) ");
		query.append(
				"LEFT JOIN T17_CALLE t4 ON (t1.ID_CALLE_06 = t4.id AND t1.id_provincia_06 = t4.provincia_id AND t1.id_municipio_06 = t4.municipio_id) ");
		query.append(
				"LEFT JOIN T17_LOCALIDAD t5 ON ( t1.ID_LOCALIDAD_06 = t5.id AND t1.id_provincia_06 = t5.PROVINCIA_ID AND t1.id_municipio_06 = t5.MUNICIPIO_ID) ");

		// Where clause & Params
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append("AND t1.F_HISTORICO_06 IS NOT NULL AND t1.ID_SOLICITANTE_06 = ?");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add(direcciones.getIdSolicitante06());

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

	/**
	 * Reorder the data list of Direcciones selected for rup_table
	 *
	 * @param direcciones     Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Direcciones>>
	 */
	@Override
	public List<TableRowDto<Direcciones>> reorderSelection(Direcciones direcciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06,t1.ID_MUNICIPIO_06 IDMUNICIPIO06,t1.ID_PAIS_06 IDPAIS06,t1.ID_PORTAL_06 IDPORTAL06,t1.ID_PROVINCIA_06 IDPROVINCIA06,t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06,t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06,t1.F_ALTA_06 FALTA06,t1.USU_ALTA_06 USUALTA06 ");
		// FROM
		query.append("FROM DIRECCIONES t1 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(direcciones, 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, Direcciones.class,
				filterParamList, "IDDIRECCION06");

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

	/**
	 * Reorder the data list of Direcciones selected for rup_table
	 *
	 * @param direcciones     Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Direcciones>>
	 */
	@Override
	public List<TableRowDto<Direcciones>> reorderSelectionHistorico(Direcciones direcciones,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06, t1.ID_MUNICIPIO_06 IDMUNICIPIO06, t1.ID_PAIS_06 IDPAIS06, t1.ID_PORTAL_06 IDPORTAL06, t1.ID_PROVINCIA_06 IDPROVINCIA06, t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06, t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06 ");
		query.append(", t2.ds_e provincianoradesceu, t2.ds_c provincianoradesces");
		query.append(", t3.DS_O municipionoradesc ");
		query.append(", t4.TIPO_VIA calleTipoVia,t4.ds_o calleDescripcion ");
		query.append(", t5.DS_O localidadNORADesc ");

		// FROM
		query.append("FROM DIRECCIONES t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t2 ON (t1.ID_PROVINCIA_06 = t2.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t3 ON (t1.ID_MUNICIPIO_06= t3.ID AND t1.id_provincia_06 = t3.PROVINCIA_ID) ");
		query.append(
				"LEFT JOIN T17_CALLE t4 ON (t1.ID_CALLE_06 = t4.id AND t1.id_provincia_06 = t4.provincia_id AND t1.id_municipio_06 = t4.municipio_id) ");
		query.append(
				"LEFT JOIN T17_LOCALIDAD t5 ON ( t1.ID_LOCALIDAD_06 = t5.id AND t1.id_provincia_06 = t5.PROVINCIA_ID AND t1.id_municipio_06 = t5.MUNICIPIO_ID) ");

		// FILTRADO
		// Where clause & Params
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append("AND t1.F_HISTORICO_06 IS NOT NULL AND t1.ID_SOLICITANTE_06 = ?");
		query.append(where);

		// Parámetros de filtrado
		List<Object> filterParamList = new ArrayList<Object>();
		filterParamList.add(direcciones.getIdSolicitante06());

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto, Direcciones.class,
				filterParamList, "IDDIRECCION06");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Direcciones
	 * @param searchParams    Direcciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Direcciones>>
	 */
	@Override
	public List<TableRowDto<Direcciones>> search(Direcciones filterParams, Direcciones searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06,t1.ID_MUNICIPIO_06 IDMUNICIPIO06,t1.ID_PAIS_06 IDPAIS06,t1.ID_PORTAL_06 IDPORTAL06,t1.ID_PROVINCIA_06 IDPROVINCIA06,t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06,t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06,t1.F_ALTA_06 FALTA06,t1.USU_ALTA_06 USUALTA06 ");
		// FROM
		query.append("FROM DIRECCIONES t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

		// 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, Direcciones.class,
				filterParamList, searchSQL, searchParamList, from_alias, "IDDIRECCION06");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<Direcciones>(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, Direcciones.class,
				"DIRECCIONES", new String[] { "IDDIRECCION06" });

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

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

	/**
	 * Filter in the hierarchical Direcciones table.
	 *
	 * @param filterDirecciones Direcciones
	 * @param tableRequestDto   TableRequestDto
	 * @return List<JerarquiaDto<Direcciones>>
	 */
	@Override
	public List<JerarquiaDto<Direcciones>> findAllLikeJerarquia(Direcciones filterDirecciones,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_DIRECCION_06 IDDIRECCION06,t1.CALLE_06 CALLE06,t1.CP_06 CP06,t1.ID_CALLE_06 IDCALLE06,t1.ID_LOCALIDAD_06 IDLOCALIDAD06,t1.ID_MUNICIPIO_06 IDMUNICIPIO06,t1.ID_PAIS_06 IDPAIS06,t1.ID_PORTAL_06 IDPORTAL06,t1.ID_PROVINCIA_06 IDPROVINCIA06,t1.LETRA_06 LETRA06,t1.LOCALIDAD_06 LOCALIDAD06,t1.MUNICIPIO_06 MUNICIPIO06,t1.PAIS_06 PAIS06,t1.PISO_06 PISO06,t1.PORTAL_06 PORTAL06,t1.ESCALERA_06 ESCALERA06, t1.PROVINCIA_06 PROVINCIA06,t1.ID_SOLICITANTE_06 IDSOLICITANTE06, t1.USU_HISTORICO_06 USUHISTORICO06, t1.F_HISTORICO_06 FHISTORICO06,t1.F_ALTA_06 FALTA06,t1.USU_ALTA_06 USUALTA06 ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM DIRECCIONES t1 ");
		List<String> from = new ArrayList<String>();
		from.add("DIRECCIONES");
		// 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(filterDirecciones, false);

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada por
		// defecto (ID_PADRE)
		query = TableManagerJerarquia.getQuery(tableRequestDto, query, mapaWhere, "IDDIRECCION06", "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,
					DireccionesDaoImpl.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 filterDirecciones Direcciones
	 * @param tableRequestDto   TableRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(Direcciones filterDirecciones, TableRequestDto tableRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM DIRECCIONES t1 ");
		List<String> from = new ArrayList<String>();
		from.add("DIRECCIONES");

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

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada por
		// defecto (ID_PADRE)
		StringBuilder query = TableManagerJerarquia.getQueryCount(tableRequestDto, mapaWhere, "IDDIRECCION06",
				"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 filterDirecciones Direcciones
	 * @param tableRequestDto   TableRequestDto
	 * @return List<TableRowDto<Direcciones>>
	 */
	@Override
	public List<TableRowDto<Direcciones>> findAllChild(Direcciones filterDirecciones, TableRequestDto tableRequestDto) {

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

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

		// MULTISELECCION
		// Especificar la columna padre correspondiente en lugar de la generada por
		// defecto (ID_PADRE)
		StringBuilder query = TableManagerJerarquia.getQueryChildren(tableRequestDto, mapaWhere, "IDDIRECCION06",
				"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<Direcciones>(this.rwMapPK, "IDDIRECCION06"), params.toArray());
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (direcciones != null && direcciones.getIdDireccion06() != null) {
			where.append(" AND t1.ID_DIRECCION_06 = ?");
			params.add(direcciones.getIdDireccion06());
		}
		if (direcciones != null && direcciones.getCalle06() != null) {
			where.append(" AND t1.CALLE_06 = ?");
			params.add(direcciones.getCalle06());
		}
		if (direcciones != null && direcciones.getCp06() != null) {
			where.append(" AND t1.CP_06 = ?");
			params.add(direcciones.getCp06());
		}
		if (direcciones != null && direcciones.getIdCalle06() != null) {
			where.append(" AND t1.ID_CALLE_06 = ?");
			params.add(direcciones.getIdCalle06());
		}
		if (direcciones != null && direcciones.getIdLocalidad06() != null) {
			where.append(" AND t1.ID_LOCALIDAD_06 = ?");
			params.add(direcciones.getIdLocalidad06());
		}
		if (direcciones != null && direcciones.getIdMunicipio06() != null) {
			where.append(" AND t1.ID_MUNICIPIO_06 = ?");
			params.add(direcciones.getIdMunicipio06());
		}
		if (direcciones != null && direcciones.getIdPais06() != null) {
			where.append(" AND t1.ID_PAIS_06 = ?");
			params.add(direcciones.getIdPais06());
		}
		if (direcciones != null && direcciones.getIdPortal06() != null) {
			where.append(" AND t1.ID_PORTAL_06 = ?");
			params.add(direcciones.getIdPortal06());
		}
		if (direcciones != null && direcciones.getIdProvincia06() != null) {
			where.append(" AND t1.ID_PROVINCIA_06 = ?");
			params.add(direcciones.getIdProvincia06());
		}
		if (direcciones != null && direcciones.getLetra06() != null) {
			where.append(" AND t1.LETRA_06 = ?");
			params.add(direcciones.getLetra06());
		}
		if (direcciones != null && direcciones.getLocalidad06() != null) {
			where.append(" AND t1.LOCALIDAD_06 = ?");
			params.add(direcciones.getLocalidad06());
		}
		if (direcciones != null && direcciones.getMunicipio06() != null) {
			where.append(" AND t1.MUNICIPIO_06 = ?");
			params.add(direcciones.getMunicipio06());
		}
		if (direcciones != null && direcciones.getPais06() != null) {
			where.append(" AND t1.PAIS_06 = ?");
			params.add(direcciones.getPais06());
		}
		if (direcciones != null && direcciones.getPiso06() != null) {
			where.append(" AND t1.PISO_06 = ?");
			params.add(direcciones.getPiso06());
		}
		if (direcciones != null && direcciones.getPortal06() != null) {
			where.append(" AND t1.PORTAL_06 = ?");
			params.add(direcciones.getPortal06());
		}
		if (direcciones != null && direcciones.getEscalera06() != null) {
			where.append(" AND t1.ESCALERA_06 = ?");
			params.add(direcciones.getEscalera06());
		}
		if (direcciones != null && direcciones.getProvincia06() != null) {
			where.append(" AND t1.PROVINCIA_06 = ?");
			params.add(direcciones.getProvincia06());
		}

		if (direcciones != null && direcciones.getIdSolicitante06() != null) {
			where.append(" AND t1.ID_SOLICITANTE_06 = ?");
			params.add(direcciones.getIdSolicitante06());
		}
		if (direcciones != null && direcciones.getUsuHistorico06() != null) {
			where.append(" AND t1.USU_HISTORICO_06 = ?");
			params.add(direcciones.getUsuHistorico06());
		}
		if (direcciones != null && direcciones.getfHistorico06() != null) {
			where.append(" AND t1.F_HISTORICO_06 = ?");
			params.add(direcciones.getfHistorico06());
		}

		if (direcciones != null && direcciones.getfAlta06() != null) {
			where.append(" AND t1.F_ALTA_06 = ?");
			params.add(direcciones.getfAlta06());
		}
		if (direcciones != null && direcciones.getUsuAlta06() != null) {
			where.append(" AND t1.USU_ALTA_06 = ?");
			params.add(direcciones.getUsuAlta06());
		}

		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
	 * Direcciones entity
	 *
	 * @param direcciones Direcciones 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(Direcciones direcciones, Boolean startsWith) {

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

		if (direcciones != null && direcciones.getIdDireccion06() != null) {
			where.append(" AND t1.ID_DIRECCION_06 = ?");
			params.add(direcciones.getIdDireccion06());
		}
		if (direcciones != null && direcciones.getCalle06() != null) {
			where.append(" AND UPPER(t1.CALLE_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getCalle06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getCalle06().toUpperCase() + "%");
			}
			where.append(" AND t1.CALLE_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getCp06() != null) {
			where.append(" AND UPPER(t1.CP_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getCp06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getCp06().toUpperCase() + "%");
			}
			where.append(" AND t1.CP_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getIdCalle06() != null) {
			where.append(" AND t1.ID_CALLE_06 = ?");
			params.add(direcciones.getIdCalle06());
		}
		if (direcciones != null && direcciones.getIdLocalidad06() != null) {
			where.append(" AND t1.ID_LOCALIDAD_06 = ?");
			params.add(direcciones.getIdLocalidad06());
		}
		if (direcciones != null && direcciones.getIdMunicipio06() != null) {
			where.append(" AND UPPER(t1.ID_MUNICIPIO_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getIdMunicipio06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getIdMunicipio06().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_MUNICIPIO_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getIdPais06() != null) {
			where.append(" AND UPPER(t1.ID_PAIS_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getIdPais06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getIdPais06().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_PAIS_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getIdPortal06() != null) {
			where.append(" AND UPPER(t1.ID_PORTAL_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getIdPortal06() + "%");
			} else {
				params.add("%" + direcciones.getIdPortal06() + "%");
			}
			where.append(" AND t1.ID_PORTAL_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getIdProvincia06() != null) {
			where.append(" AND UPPER(t1.ID_PROVINCIA_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getIdProvincia06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getIdProvincia06().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_PROVINCIA_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getLetra06() != null) {
			where.append(" AND UPPER(t1.LETRA_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getLetra06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getLetra06().toUpperCase() + "%");
			}
			where.append(" AND t1.LETRA_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getLocalidad06() != null) {
			where.append(" AND UPPER(t1.LOCALIDAD_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getLocalidad06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getLocalidad06().toUpperCase() + "%");
			}
			where.append(" AND t1.LOCALIDAD_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getMunicipio06() != null) {
			where.append(" AND UPPER(t1.MUNICIPIO_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getMunicipio06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getMunicipio06().toUpperCase() + "%");
			}
			where.append(" AND t1.MUNICIPIO_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getPais06() != null) {
			where.append(" AND UPPER(t1.PAIS_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getPais06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getPais06().toUpperCase() + "%");
			}
			where.append(" AND t1.PAIS_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getPiso06() != null) {
			where.append(" AND UPPER(t1.PISO_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getPiso06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getPiso06().toUpperCase() + "%");
			}
			where.append(" AND t1.PISO_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getPortal06() != null) {
			where.append(" AND UPPER(t1.PORTAL_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getPortal06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getPortal06().toUpperCase() + "%");
			}
			where.append(" AND t1.PORTAL_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getEscalera06() != null) {
			where.append(" AND UPPER(t1.ESCALERA_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getEscalera06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getEscalera06().toUpperCase() + "%");
			}
			where.append(" AND t1.ESCALERA_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getProvincia06() != null) {
			where.append(" AND UPPER(t1.PROVINCIA_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getProvincia06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getProvincia06().toUpperCase() + "%");
			}
			where.append(" AND t1.PROVINCIA_06 IS NOT NULL");
		}

		if (direcciones != null && direcciones.getIdSolicitante06() != null) {
			where.append(" AND t1.ID_SOLICITANTE_06 = ?");
			params.add(direcciones.getIdSolicitante06());
		}
		if (direcciones != null && direcciones.getUsuHistorico06() != null) {
			where.append(" AND UPPER(t1.USU_HISTORICO_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getUsuHistorico06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getUsuHistorico06().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_HISTORICO_06 IS NOT NULL");
		}
		if (direcciones != null && direcciones.getfHistorico06() != null) {
			where.append(" AND t1.F_HISTORICO_06 = ?");
			params.add(direcciones.getfHistorico06());
		}

		if (direcciones != null && direcciones.getfAlta06() != null) {
			where.append(" AND t1.F_ALTA_06 = ?");
			params.add(direcciones.getfAlta06());
		}
		if (direcciones != null && direcciones.getUsuAlta06() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_06) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(direcciones.getUsuAlta06().toUpperCase() + "%");
			} else {
				params.add("%" + direcciones.getUsuAlta06().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_06 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

	public Direcciones updateHistorico(Direcciones direcciones) {
		String query = "UPDATE DIRECCIONES SET ID_SOLICITANTE_06 = ?, USU_HISTORICO_06=?, F_HISTORICO_06=sysdate WHERE ID_DIRECCION_06=?";
		this.jdbcTemplate.update(query, direcciones.getIdSolicitante06(), direcciones.getUsuHistorico06(),
				direcciones.getIdDireccion06());
		return direcciones;
	}

	public Direcciones updateDireccion(Direcciones direcciones) {
		String query = "UPDATE DIRECCIONES SET CALLE_06=?, CP_06=?, ID_CALLE_06=?, ID_LOCALIDAD_06=?, ID_MUNICIPIO_06=?, ID_PAIS_06=?, "
				+ " ID_PORTAL_06=?, ID_PROVINCIA_06=?, LETRA_06=?, LOCALIDAD_06=?, MUNICIPIO_06=?, PAIS_06=?, PISO_06=?, PORTAL_06=?, ESCALERA_06 = ?, PROVINCIA_06=?, ID_SOLICITANTE_06 = ?"
				+ " WHERE ID_DIRECCION_06=?";
		this.jdbcTemplate.update(query, direcciones.getCalle06(), direcciones.getCp06(), direcciones.getIdCalle06(),
				direcciones.getIdLocalidad06(), direcciones.getIdMunicipio06(), direcciones.getIdPais06(),
				direcciones.getIdPortal06(), direcciones.getIdProvincia06(), direcciones.getLetra06(),
				direcciones.getLocalidad06(), direcciones.getMunicipio06(), direcciones.getPais06(),
				direcciones.getPiso06(), direcciones.getPortal06(), direcciones.getEscalera06(),
				direcciones.getProvincia06(), direcciones.getIdSolicitante06(), direcciones.getIdDireccion06());
		return direcciones;
	}

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