/*
* Copyright 2021 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
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.Ayuntamientos;
import com.ejie.ad74a.model.Mancomunidades;
import com.ejie.ad74a.model.UsuariosAyuntamiento;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.model.comun.Provincia;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * AyuntamientosDaoImpl generated by UDA, 22-may-2023 16:38:14.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class AyuntamientosDaoImpl implements AyuntamientosDao {

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

	protected static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDAYUNTAMIENTO31", "CIF31", "DESCES31",
			"DESCEU31", "IDDIRECCION31", "NUMCUENTA31", "PERIODICIDAD31", "CONTACTO31", "TELEFONO31", "FORMAPAGO31",
			"FAUTORIZACION31", "DIAFACTURACION31", "IDMANCOMUNIDAD31", "IDPROVINCIA31", "IDMUNICIPIO31", "CP31",
			"DIRECCION31", "DIR331", "EMAIL31", "FBAJA31", "BAJA31", "USUALTA31", "USUMODIF31", "FALTA31", "FMODIF31",
			"DIRECCIONESIDMUNICIPIO06", "DIRECCIONESIDPROVINCIA06", "DIRECCIONESCP06", "provincianoradesces",
			"provincianoradesceu", "municipionoradesc", "mancomunidadesdesces", "mancomunidadesdesceu" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_AYUNTAMIENTOS = "SEQ_AYUNTAMIENTOS";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Ayuntamientos> rwMap = new RowMapper<Ayuntamientos>() {
		public Ayuntamientos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Ayuntamientos ayuntamientos = new Ayuntamientos(UtilSQL.getLong(resultSet, "IDAYUNTAMIENTO31"));
			ayuntamientos.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamientos.setDescEu31(resultSet.getString("DESCEU31"));
			ayuntamientos.setCif31(resultSet.getString("CIF31"));
			ayuntamientos.setNumCuenta31(resultSet.getString("NUMCUENTA31"));
			ayuntamientos.setPeriodicidad31(UtilSQL.getLong(resultSet, "PERIODICIDAD31"));
			ayuntamientos.setContacto31(resultSet.getString("CONTACTO31"));

			ayuntamientos.setTelefono31(resultSet.getString("TELEFONO31"));
			ayuntamientos.setFormaPago31(UtilSQL.getInt(resultSet, "FORMAPAGO31"));
			ayuntamientos.setfAutorizacion31(resultSet.getDate("FAUTORIZACION31"));
			ayuntamientos.setDiaFacturacion31(UtilSQL.getInt(resultSet, "DIAFACTURACION31"));

			ayuntamientos.setCp31(resultSet.getString("CP31"));
			ayuntamientos.setDireccion31(resultSet.getString("DIRECCION31"));
			ayuntamientos.setDir331(resultSet.getString("DIR331"));
			ayuntamientos.setEmail31(resultSet.getString("EMAIL31"));

			ayuntamientos.setfAlta31(resultSet.getDate("FALTA31"));
			ayuntamientos.setfBaja31(resultSet.getDate("FBAJA31"));
			ayuntamientos.setfModif31(resultSet.getDate("FMODIF31"));
			ayuntamientos.setUsuAlta31(resultSet.getString("USUALTA31"));
			ayuntamientos.setUsuModif31(resultSet.getString("USUMODIF31"));

			Mancomunidades mancomunidades = new Mancomunidades(UtilSQL.getLong(resultSet, "IDMANCOMUNIDAD31"),
					resultSet.getString("mancomunidadesdesces"), resultSet.getString("mancomunidadesdesceu"));
			Provincia provincia = new Provincia(resultSet.getString("IDPROVINCIA31"),
					resultSet.getString("provincianoradesces"), resultSet.getString("provincianoradesceu"), null);
			Municipio municipio = new Municipio(resultSet.getString("IDMUNICIPIO31"),
					resultSet.getString("municipionoradesc"), resultSet.getString("IDPROVINCIA31"));

			ayuntamientos.setMancomunidades(mancomunidades);
			ayuntamientos.setProvincia(provincia);
			ayuntamientos.setMunicipio(municipio);

			return ayuntamientos;
		}
	};

	private RowMapper<Ayuntamientos> rwMapSimple = new RowMapper<Ayuntamientos>() {
		public Ayuntamientos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Ayuntamientos ayuntamientos = new Ayuntamientos(UtilSQL.getLong(resultSet, "IDAYUNTAMIENTO31"));
			ayuntamientos.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamientos.setDescEu31(resultSet.getString("DESCEU31"));
			return ayuntamientos;
		}
	};

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

	/**
	 * 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 Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 *
	 * @return Ayuntamientos
	 */
	public Ayuntamientos add(Ayuntamientos ayuntamientos) {

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO AYUNTAMIENTOS (ID_AYUNTAMIENTO_31, CIF_31, DESC_ES_31, DESC_EU_31, NUM_CUENTA_31, PERIODICIDAD_31, CONTACTO_31, TELEFONO_31, FORMA_PAGO_31, F_AUTORIZACION_31, DIA_FACTURACION_31, ID_MANCOMUNIDAD_31, ID_PROVINCIA_31, ID_MUNICIPIO_31, CP_31, DIRECCION_31, DIR3_31, EMAIL_31, F_BAJA_31, USU_ALTA_31, USU_MODIF_31, F_ALTA_31, F_MODIF_31) "
				+ "VALUES (" + SEQUENCE_AYUNTAMIENTOS
				+ ".NEXTVAL,:cif,:descEs,:descEu,:numCuenta,:periodicidad,:contacto,:telefono,:formaPago,:fAutorizacion,:diaFacturacion,:idMancomunidad,:idProvincia,:idMunicipio,:cp,:direccion,:dir3,:email,:fBaja,:usuAlta,:usuModif,:fAlta,:fModif)";

		Object getMancomunidadesIdMancomunidad = null;
		if (ayuntamientos.getMancomunidades() != null
				&& ayuntamientos.getMancomunidades().getIdMancomunidad49() != null) {
			getMancomunidadesIdMancomunidad = ayuntamientos.getMancomunidades().getIdMancomunidad49();
		}
		Object getProvinciaCodProvincia = null;
		if (ayuntamientos.getProvincia() != null && ayuntamientos.getProvincia().getCodProvincia() != null) {
			getProvinciaCodProvincia = ayuntamientos.getProvincia().getCodProvincia();
		}
		Object getMunicipioCodMunicipio = null;
		if (ayuntamientos.getMunicipio() != null && ayuntamientos.getMunicipio().getCodMunicipio() != null) {
			getMunicipioCodMunicipio = ayuntamientos.getMunicipio().getCodMunicipio();
		}

		MapSqlParameterSource parameters = new MapSqlParameterSource().addValue("cif", ayuntamientos.getCif31())
				.addValue("descEs", ayuntamientos.getDescEs31()).addValue("descEu", ayuntamientos.getDescEu31())
				.addValue("numCuenta", ayuntamientos.getNumCuenta31())
				.addValue("periodicidad", ayuntamientos.getPeriodicidad31())
				.addValue("contacto", ayuntamientos.getContacto31()).addValue("telefono", ayuntamientos.getTelefono31())
				.addValue("formaPago", ayuntamientos.getFormaPago31())
				.addValue("fAutorizacion", ayuntamientos.getfAutorizacion31())
				.addValue("diaFacturacion", ayuntamientos.getDiaFacturacion31())
				.addValue("idMancomunidad", getMancomunidadesIdMancomunidad)
				.addValue("idProvincia", getProvinciaCodProvincia).addValue("idMunicipio", getMunicipioCodMunicipio)
				.addValue("cp", ayuntamientos.getCp31()).addValue("direccion", ayuntamientos.getDireccion31())
				.addValue("dir3", ayuntamientos.getDir331()).addValue("email", ayuntamientos.getEmail31())
				.addValue("fBaja", ayuntamientos.getfBaja31()).addValue("usuAlta", ayuntamientos.getUsuAlta31())
				.addValue("usuModif", ayuntamientos.getUsuModif31()).addValue("fAlta", ayuntamientos.getfAlta31())
				.addValue("fModif", ayuntamientos.getfModif31());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_AYUNTAMIENTO_31" });
		ayuntamientos.setIdAyuntamiento31(generatedKeyHolder.getKey().longValue());

		return ayuntamientos;
	}

	/**
	 * Updates a single row in the Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 *
	 * @return Ayuntamientos
	 */
	public Ayuntamientos update(Ayuntamientos ayuntamientos) {
		String query = "UPDATE AYUNTAMIENTOS SET CIF_31=?, DESC_ES_31=?, DESC_EU_31 = ?, NUM_CUENTA_31=?, PERIODICIDAD_31=?, CONTACTO_31=?, TELEFONO_31 = ?, FORMA_PAGO_31 = ?, F_AUTORIZACION_31 = ?, DIA_FACTURACION_31 = ?, ID_MANCOMUNIDAD_31 = ?, ID_PROVINCIA_31= ?, ID_MUNICIPIO_31= ?, CP_31 = ?, DIRECCION_31 = ?, DIR3_31 = ?, EMAIL_31 = ?, F_BAJA_31=?, USU_MODIF_31=?, F_MODIF_31=? WHERE ID_AYUNTAMIENTO_31=?";
		Object getMancomunidadesIdMancomunidad = null;
		if (ayuntamientos.getMancomunidades() != null
				&& ayuntamientos.getMancomunidades().getIdMancomunidad49() != null) {
			getMancomunidadesIdMancomunidad = ayuntamientos.getMancomunidades().getIdMancomunidad49();
		}
		Object getProvinciaCodProvincia = null;
		if (ayuntamientos.getProvincia() != null && ayuntamientos.getProvincia().getCodProvincia() != null) {
			getProvinciaCodProvincia = ayuntamientos.getProvincia().getCodProvincia();
		}
		Object getMunicipioCodMunicipio = null;
		if (ayuntamientos.getMunicipio() != null && ayuntamientos.getMunicipio().getCodMunicipio() != null) {
			getMunicipioCodMunicipio = ayuntamientos.getMunicipio().getCodMunicipio();
		}
		this.jdbcTemplate.update(query, ayuntamientos.getCif31(), ayuntamientos.getDescEs31(),
				ayuntamientos.getDescEu31(), ayuntamientos.getNumCuenta31(), ayuntamientos.getPeriodicidad31(),
				ayuntamientos.getContacto31(), ayuntamientos.getTelefono31(), ayuntamientos.getFormaPago31(),
				ayuntamientos.getfAutorizacion31(), ayuntamientos.getDiaFacturacion31(),
				getMancomunidadesIdMancomunidad, getProvinciaCodProvincia, getMunicipioCodMunicipio,
				ayuntamientos.getCp31(), ayuntamientos.getDireccion31(), ayuntamientos.getDir331(),
				ayuntamientos.getEmail31(), ayuntamientos.getfBaja31(), ayuntamientos.getUsuModif31(),
				ayuntamientos.getfModif31(), ayuntamientos.getIdAyuntamiento31());
		return ayuntamientos;
	}

	/**
	 * Finds a single row in the Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 *
	 * @return Ayuntamientos
	 */
	@Transactional(readOnly = true)
	public Ayuntamientos find(Ayuntamientos ayuntamientos) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.CIF_31 CIF31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31,t1.NUM_CUENTA_31 NUMCUENTA31,t1.PERIODICIDAD_31 PERIODICIDAD31,t1.CONTACTO_31 CONTACTO31,t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31,t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31,t1.USU_ALTA_31 USUALTA31,t1.USU_MODIF_31 USUMODIF31,t1.F_ALTA_31 FALTA31,t1.F_MODIF_31 FMODIF31, "
						+ "t3.ds_e provincianoradesceu, t3.ds_c provincianoradesces, "//
						+ "t4.DS_O municipionoradesc, "//
						+ "t5.DESC_ES_49 mancomunidadesdesces, t5.DESC_EU_49 mancomunidadesdesceu ");

		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");
		query.append("WHERE t1.ID_AYUNTAMIENTO_31 = ?");

		List<Ayuntamientos> ayuntamientosList = this.jdbcTemplate.query(query.toString(), this.rwMap,
				ayuntamientos.getIdAyuntamiento31());
		return DataAccessUtils.uniqueResult(ayuntamientosList);
	}

	/**
	 * Removes a single row in the Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 */
	public void remove(Ayuntamientos ayuntamientos) {
		String query = "DELETE FROM AYUNTAMIENTOS WHERE ID_AYUNTAMIENTO_31=?";
		this.jdbcTemplate.update(query, ayuntamientos.getIdAyuntamiento31());
	}

	/**
	 * Updates a single row in the Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 *
	 * @return Ayuntamientos
	 */
	public Ayuntamientos darBaja(Ayuntamientos ayuntamientos) {
		String query = "UPDATE AYUNTAMIENTOS SET F_BAJA_31=?, F_MODIF_31=?, USU_MODIF_31=? WHERE ID_AYUNTAMIENTO_31=?";
		this.jdbcTemplate.update(query, ayuntamientos.getfBaja31(), ayuntamientos.getfModif31(),
				ayuntamientos.getUsuModif31(), ayuntamientos.getIdAyuntamiento31());
		return ayuntamientos;
	}

	public List<Ayuntamientos> getMultiple(Ayuntamientos filterAyuntamientos, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t1.CIF_31 CIF31, t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31, t1.NUM_CUENTA_31 NUMCUENTA31, t1.PERIODICIDAD_31 PERIODICIDAD31, t1.CONTACTO_31 CONTACTO31, t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31, t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31, t1.BAJA_31 BAJA31, t1.USU_ALTA_31 USUALTA31, t1.USU_MODIF_31 USUMODIF31, t1.F_ALTA_31 FALTA31, t1.F_MODIF_31 FMODIF31 ");
		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		// WHERE clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterAyuntamientos, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		StringBuilder sbMultipleSQL = query.append(TableManager.getSelectMultipleQuery(tableRequestDto,
				Ayuntamientos.class, params, "id_ayuntamiento_31"));

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

	/**
	 * Finds a list of rows in the Ayuntamientos table.
	 *
	 * @param ayuntamientos   Ayuntamientos
	 * @param tableRequestDto TableRequestDto
	 *
	 * @return List<Ayuntamientos>
	 */
	@Transactional(readOnly = true)
	public List<Ayuntamientos> findAll(Ayuntamientos ayuntamientos, TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.CIF_31 CIF31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31,t1.NUM_CUENTA_31 NUMCUENTA31,t1.PERIODICIDAD_31 PERIODICIDAD31,t1.CONTACTO_31 CONTACTO31,t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31,t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31,t1.USU_ALTA_31 USUALTA31,t1.USU_MODIF_31 USUMODIF31,t1.F_ALTA_31 FALTA31,t1.F_MODIF_31 FMODIF31, "
						+ "t3.ds_e provincianoradesceu, t3.ds_c provincianoradesces, "//
						+ "t4.DS_O municipionoradesc, "//
						+ "t5.DESC_ES_49 mancomunidadesdesces, t5.DESC_EU_49 mancomunidadesdesceu ");

		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");

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

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

	/**
	 * Finds rows in the Ayuntamientos table using like.
	 *
	 * @param ayuntamientos   Ayuntamientos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<Ayuntamientos>
	 */
	@Transactional(readOnly = true)
	public List<Ayuntamientos> findAllLike(Ayuntamientos ayuntamientos, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.CIF_31 CIF31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31,t1.NUM_CUENTA_31 NUMCUENTA31,t1.PERIODICIDAD_31 PERIODICIDAD31,t1.CONTACTO_31 CONTACTO31,t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31,t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31,t1.USU_ALTA_31 USUALTA31,t1.USU_MODIF_31 USUMODIF31,t1.F_ALTA_31 FALTA31,t1.F_MODIF_31 FMODIF31, "
						+ "t3.ds_e provincianoradesceu, t3.ds_c provincianoradesces, "//
						+ "t4.DS_O municipionoradesc, "//
						+ "t5.DESC_ES_49 mancomunidadesdesces, t5.DESC_EU_49 mancomunidadesdesceu ");

		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the Ayuntamientos table.
	 *
	 * @param ayuntamientos Ayuntamientos
	 *
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(Ayuntamientos ayuntamientos) {
		// SELECT
		StringBuilder query = new StringBuilder("SELECT COUNT(1) ");
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");

		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(ayuntamientos);
		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 Ayuntamientos table using like.
	 *
	 * @param ayuntamientos Ayuntamientos
	 * @param startsWith    Boolean
	 *
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Ayuntamientos ayuntamientos, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder("SELECT COUNT(1) ");
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");

		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(ayuntamientos, 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 Ayuntamientos table using like.
	 *
	 * @param ayuntamientos Ayuntamientos
	 * @param startsWith    Boolean
	 *
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountValidarExiteAyuntamiento(Ayuntamientos ayuntamientos, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder("SELECT COUNT(1) ");
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN T17_PROVINCIA t3 ON (t1.ID_PROVINCIA_31 = t3.ID) ");
		query.append(
				"LEFT JOIN T17_MUNICIPIO t4 ON (t1.ID_MUNICIPIO_31= t4.ID AND t1.id_provincia_31 = t4.PROVINCIA_ID) ");
		query.append("LEFT JOIN MANCOMUNIDADES t5 ON (T1.ID_MANCOMUNIDAD_31 = t5.ID_MANCOMUNIDAD_49) ");

		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapExisteAyuntamiento(ayuntamientos, 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 Ayuntamientos selected for rup_table
	 *
	 * @param ayuntamientos   Ayuntamientos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<Ayuntamientos>>
	 */
	@Override
	public List<TableRowDto<Ayuntamientos>> reorderSelection(Ayuntamientos ayuntamientos,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.CIF_31 CIF31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31,t1.NUM_CUENTA_31 NUMCUENTA31,t1.PERIODICIDAD_31 PERIODICIDAD31,t1.CONTACTO_31 CONTACTO31,t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31,t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31,t1.USU_ALTA_31 USUALTA31,t1.USU_MODIF_31 USUMODIF31,t1.F_ALTA_31 FALTA31,t1.F_MODIF_31 FMODIF31 ");
		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		// FILTRADO
		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(ayuntamientos, 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, Ayuntamientos.class,
				filterParamList, "idayuntamiento31");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Ayuntamientos
	 * @param searchParams    Ayuntamientos
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<Ayuntamientos>>
	 */
	@Override
	public List<TableRowDto<Ayuntamientos>> search(Ayuntamientos filterParams, Ayuntamientos searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.CIF_31 CIF31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31,t1.NUM_CUENTA_31 NUMCUENTA31,t1.PERIODICIDAD_31 PERIODICIDAD31,t1.CONTACTO_31 CONTACTO31,t1.TELEFONO_31 TELEFONO31, t1.FORMA_PAGO_31 FORMAPAGO31, t1.F_AUTORIZACION_31 FAUTORIZACION31, t1.DIA_FACTURACION_31 DIAFACTURACION31,t1.ID_MANCOMUNIDAD_31 IDMANCOMUNIDAD31, t1.ID_PROVINCIA_31 IDPROVINCIA31, t1.ID_MUNICIPIO_31 IDMUNICIPIO31, t1.CP_31 CP31, t1.DIRECCION_31 DIRECCION31, t1.DIR3_31 DIR331, t1.EMAIL_31 EMAIL31, t1.F_BAJA_31 FBAJA31,t1.USU_ALTA_31 USUALTA31,t1.USU_MODIF_31 USUMODIF31,t1.F_ALTA_31 FALTA31,t1.F_MODIF_31 FMODIF31 ");
		// FROM
		query.append("FROM AYUNTAMIENTOS 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, Ayuntamientos.class,
				filterParamList, searchSQL, searchParamList, from_alias, "IDAYUNTAMIENTO31");

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

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

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

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

	/**
	 * Busca los ayuntamientos buscando por el usuario XlNets
	 * 
	 * @param usuariosAyuntamiento {@link UsuariosAyuntamiento}
	 * @return {@link List} of {@link Ayuntamientos}
	 */
	@Override
	public List<Ayuntamientos> findComboByUsuarioConectado(UsuariosAyuntamiento usuariosAyuntamiento) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31,t1.DESC_ES_31 DESCES31,t1.DESC_EU_31 DESCEU31 ");

		// FROM
		query.append("FROM AYUNTAMIENTOS t1 ");
		query.append("LEFT JOIN USUARIOS_AYUNTAMIENTO t2 ON (t1.ID_AYUNTAMIENTO_31= t2.ID_AYUNTAMIENTO_81) ");
		query.append("LEFT JOIN USUARIOS t3 ON (t2.ID_USUARIO_81= t3.ID_USUARIO_80) ");

		// WHERE clause & Params
		StringBuilder where = new StringBuilder(" WHERE t1.F_BAJA_31 IS NULL AND t3.F_BAJA_80 IS NULL");
		where.append(" AND UPPER(t3.USU_XLNETS_80) like ? ESCAPE '\\'");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add("%" + usuariosAyuntamiento.getUsuarios().getUsuXlnets80() + "%");

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

	/*
	 * MÉTODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * Ayuntamientos entity
	 *
	 * @param ayuntamientos Ayuntamientos 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.
	 */
	private Map<String, ?> getWhereMap(Ayuntamientos ayuntamientos) {
		StringBuilder where = new StringBuilder(AyuntamientosDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (ayuntamientos != null && ayuntamientos.getIdAyuntamiento31() != null) {
			where.append(" AND t1.ID_AYUNTAMIENTO_31 = ?");
			params.add(ayuntamientos.getIdAyuntamiento31());
		}
		if (ayuntamientos != null && ayuntamientos.getCif31() != null) {
			where.append(" AND t1.CIF_31 = ?");
			params.add(ayuntamientos.getCif31());
		}
		if (ayuntamientos != null && ayuntamientos.getDescEs31() != null) {
			where.append(" AND t1.DESC_ES_31 = ?");
			params.add(ayuntamientos.getDescEs31());
		}
		if (ayuntamientos != null && ayuntamientos.getDescEu31() != null) {
			where.append(" AND t1.DESC_EU_31 = ?");
			params.add(ayuntamientos.getDescEu31());
		}

		if (ayuntamientos != null && ayuntamientos.getNumCuenta31() != null) {
			where.append(" AND t1.NUM_CUENTA_31 = ?");
			params.add(ayuntamientos.getNumCuenta31());
		}
		if (ayuntamientos != null && ayuntamientos.getPeriodicidad31() != null) {
			where.append(" AND t1.PERIODICIDAD_31 = ?");
			params.add(ayuntamientos.getPeriodicidad31());
		}
		if (ayuntamientos != null && ayuntamientos.getContacto31() != null) {
			where.append(" AND t1.CONTACTO_31 = ?");
			params.add(ayuntamientos.getContacto31());
		}
		if (ayuntamientos != null && ayuntamientos.getTelefono31() != null) {
			where.append(" AND t1.TELEFONO_31 = ?");
			params.add(ayuntamientos.getTelefono31());
		}
		if (ayuntamientos != null && ayuntamientos.getFormaPago31() != null) {
			where.append(" AND t1.FORMA_PAGO_31 = ?");
			params.add(ayuntamientos.getFormaPago31());
		}
		if (ayuntamientos != null && ayuntamientos.getfAutorizacion31() != null) {
			where.append(" AND t1.F_AUTORIZACION_31 = ?");
			params.add(ayuntamientos.getfAutorizacion31());
		}
		if (ayuntamientos != null && ayuntamientos.getDiaFacturacion31() != null) {
			where.append(" AND t1.DIA_FACTURACION_31 = ?");
			params.add(ayuntamientos.getDiaFacturacion31());
		}
		if (ayuntamientos != null && ayuntamientos.getMancomunidades() != null
				&& ayuntamientos.getMancomunidades().getIdMancomunidad49() != null) {
			where.append(" AND t1.ID_MANCOMUNIDAD_31 = ?");
			params.add(ayuntamientos.getMancomunidades().getIdMancomunidad49());
		}

		if (ayuntamientos != null && ayuntamientos.getProvincia() != null
				&& ayuntamientos.getProvincia().getCodProvincia() != null) {
			where.append(" AND t1.ID_PROVINCIA_31 = ?");
			params.add(ayuntamientos.getProvincia().getCodProvincia());
		}
		if (ayuntamientos != null && ayuntamientos.getMunicipio() != null
				&& ayuntamientos.getMunicipio().getCodMunicipio() != null) {
			where.append(" AND t1.ID_MUNICIPIO_31 = ?");
			params.add(ayuntamientos.getMunicipio().getCodMunicipio());
		}
		if (ayuntamientos != null && ayuntamientos.getCp31() != null) {
			where.append(" AND t1.CP_31 = ?");
			params.add(ayuntamientos.getCp31());
		}
		if (ayuntamientos != null && ayuntamientos.getDireccion31() != null) {
			where.append(" AND t1.DIRECCION_31 = ?");
			params.add(ayuntamientos.getDireccion31());
		}
		if (ayuntamientos != null && ayuntamientos.getDir331() != null) {
			where.append(" AND t1.DIR3_31 = ?");
			params.add(ayuntamientos.getDir331());
		}
		if (ayuntamientos != null && ayuntamientos.getEmail31() != null) {
			where.append(" AND t1.EMAIL_31 = ?");
			params.add(ayuntamientos.getEmail31());
		}

		if (ayuntamientos != null && ayuntamientos.getfBaja31() != null) {
			where.append(" AND t1.F_BAJA_31 = ?");
			params.add(ayuntamientos.getfBaja31());
		}
		if (ayuntamientos != null && ayuntamientos.getUsuAlta31() != null) {
			where.append(" AND t1.USU_ALTA_31 = ?");
			params.add(ayuntamientos.getUsuAlta31());
		}
		if (ayuntamientos != null && ayuntamientos.getUsuModif31() != null) {
			where.append(" AND t1.USU_MODIF_31 = ?");
			params.add(ayuntamientos.getUsuModif31());
		}
		if (ayuntamientos != null && ayuntamientos.getfAlta31() != null) {
			where.append(" AND t1.F_ALTA_31 = ?");
			params.add(ayuntamientos.getfAlta31());
		}
		if (ayuntamientos != null && ayuntamientos.getfModif31() != null) {
			where.append(" AND t1.F_MODIF_31 = ?");
			params.add(ayuntamientos.getfModif31());
		}
		if (ayuntamientos != null && ayuntamientos.getBaja() != null) {
			if ("0".equals(ayuntamientos.getBaja())) {
				where.append(" AND t1.F_BAJA_31 IS NULL");
			} else {
				where.append(" AND t1.F_BAJA_31 IS NOT NULL");
			}
		}

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

		return mapWhere;
	}

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * Ayuntamientos entity
	 *
	 * @param ayuntamientos Ayuntamientos 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.
	 */
	private Map<String, Object> getWhereLikeMap(Ayuntamientos ayuntamientos, Boolean startsWith) {
		StringBuilder where = new StringBuilder(AyuntamientosDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (ayuntamientos != null && ayuntamientos.getIdAyuntamiento31() != null) {
			where.append(" AND t1.ID_AYUNTAMIENTO_31 = ?");
			params.add(ayuntamientos.getIdAyuntamiento31());
		}
		if (ayuntamientos != null && ayuntamientos.getCif31() != null) {
			where.append(" AND UPPER(t1.CIF_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getCif31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getCif31().toUpperCase() + "%");
			}
			where.append(" AND t1.CIF_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getDescEs31() != null) {
			where.append(" AND UPPER(t1.DESC_ES_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getDescEs31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getDescEs31().toUpperCase() + "%");
			}
			where.append(" AND t1.DESC_ES_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getDescEu31() != null) {
			where.append(" AND UPPER(t1.DESC_EU_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getDescEu31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getDescEu31().toUpperCase() + "%");
			}
			where.append(" AND t1.DESC_EU_31 IS NOT NULL");
		}

		if (ayuntamientos != null && ayuntamientos.getNumCuenta31() != null) {
			where.append(" AND UPPER(t1.NUM_CUENTA_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getNumCuenta31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getNumCuenta31().toUpperCase() + "%");
			}
			where.append(" AND t1.NUM_CUENTA_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getPeriodicidad31() != null) {
			where.append(" AND t1.PERIODICIDAD_31 = ?");
			params.add(ayuntamientos.getPeriodicidad31());
		}
		if (ayuntamientos != null && ayuntamientos.getContacto31() != null) {
			where.append(" AND UPPER(t1.CONTACTO_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getContacto31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getContacto31().toUpperCase() + "%");
			}
			where.append(" AND t1.CONTACTO_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getTelefono31() != null) {
			where.append(" AND UPPER(t1.TELEFONO_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getTelefono31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getTelefono31().toUpperCase() + "%");
			}
			where.append(" AND t1.TELEFONO_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getFormaPago31() != null) {
			where.append(" AND t1.FORMA_PAGO_31 = ?");
			params.add(ayuntamientos.getFormaPago31());
		}
		if (ayuntamientos != null && ayuntamientos.getfAutorizacion31() != null) {
			where.append(" AND t1.F_AUTORIZACION_31 = ?");
			params.add(ayuntamientos.getfAutorizacion31());
		}
		if (ayuntamientos != null && ayuntamientos.getDiaFacturacion31() != null) {
			where.append(" AND t1.DIA_FACTURACION_31 = ?");
			params.add(ayuntamientos.getDiaFacturacion31());
		}

		if (ayuntamientos != null && ayuntamientos.getMancomunidades() != null
				&& ayuntamientos.getMancomunidades().getIdMancomunidad49() != null) {
			where.append(" AND t1.ID_MANCOMUNIDAD_31 = ?");
			params.add(ayuntamientos.getMancomunidades().getIdMancomunidad49());
		}
		if (ayuntamientos != null && ayuntamientos.getProvincia() != null
				&& ayuntamientos.getProvincia().getCodProvincia() != null) {
			where.append(" AND UPPER(t1.ID_PROVINCIA_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getProvincia().getCodProvincia().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getProvincia().getCodProvincia().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_PROVINCIA_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getMunicipio() != null
				&& ayuntamientos.getMunicipio().getCodMunicipio() != null) {
			where.append(" AND UPPER(t1.ID_MUNICIPIO_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getMunicipio().getCodMunicipio().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getMunicipio().getCodMunicipio().toUpperCase() + "%");
			}
			where.append(" AND t1.ID_MUNICIPIO_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getCp31() != null) {
			where.append(" AND UPPER(t1.CP_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getCp31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getCp31().toUpperCase() + "%");
			}
			where.append(" AND t1.CP_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getDireccion31() != null) {
			where.append(" AND UPPER(t1.DIRECCION_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getDireccion31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getDireccion31().toUpperCase() + "%");
			}
			where.append(" AND t1.DIRECCION_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getDir331() != null) {
			where.append(" AND UPPER(t1.DIR3_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getDir331().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getDir331().toUpperCase() + "%");
			}
			where.append(" AND t1.DIR3_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getEmail31() != null) {
			where.append(" AND UPPER(t1.EMAIL_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getEmail31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getEmail31().toUpperCase() + "%");
			}
			where.append(" AND t1.EMAIL_31 IS NOT NULL");
		}

		if (ayuntamientos != null && ayuntamientos.getfBaja31() != null) {
			where.append(" AND t1.F_BAJA_31 = ?");
			params.add(ayuntamientos.getfBaja31());
		}
		if (ayuntamientos != null && ayuntamientos.getUsuAlta31() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getUsuAlta31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getUsuAlta31().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getUsuModif31() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_31) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(ayuntamientos.getUsuModif31().toUpperCase() + "%");
			} else {
				params.add("%" + ayuntamientos.getUsuModif31().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_MODIF_31 IS NOT NULL");
		}
		if (ayuntamientos != null && ayuntamientos.getfAlta31() != null) {
			where.append(" AND t1.F_ALTA_31 = ?");
			params.add(ayuntamientos.getfAlta31());
		}
		if (ayuntamientos != null && ayuntamientos.getfModif31() != null) {
			where.append(" AND t1.F_MODIF_31 = ?");
			params.add(ayuntamientos.getfModif31());
		}
		if (ayuntamientos != null && ayuntamientos.getBaja() != null) {
			if ("0".equals(ayuntamientos.getBaja())) {
				where.append(" AND t1.F_BAJA_31 IS NULL");
			} else {
				where.append(" AND t1.F_BAJA_31 IS NOT NULL");
			}
		}

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

		return mapWhere;
	}

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * Ayuntamientos entity
	 *
	 * @param ayuntamientos Ayuntamientos 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.
	 */
	private Map<String, Object> getWhereLikeMapExisteAyuntamiento(Ayuntamientos ayuntamientos, Boolean startsWith) {
		StringBuilder where = new StringBuilder(AyuntamientosDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (ayuntamientos != null && ayuntamientos.getProvincia() != null
				&& ayuntamientos.getProvincia().getCodProvincia() != null) {
			where.append(" AND t1.ID_PROVINCIA_31 = ?");
			params.add(ayuntamientos.getProvincia().getCodProvincia());
		}

		if (ayuntamientos != null && ayuntamientos.getMunicipio() != null
				&& ayuntamientos.getMunicipio().getCodMunicipio() != null) {
			where.append(" AND t1.ID_MUNICIPIO_31 = ?");
			params.add(ayuntamientos.getMunicipio().getCodMunicipio());
		}

		// where.append(" AND t1.F_BAJA_31 IS NULL");

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

		return mapWhere;
	}
}
