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.Date;
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.dao.comun.UtilDAO;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.MaestroNivSoporte;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.Soporte;
import com.ejie.ad74a.model.Valoraciones;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.model.comun.Provincia;
import com.ejie.ad74a.util.UtilSQL;

/**
 * ValoracionesDaoImpl generated by UDA, 21-mar-2023 11:41:04.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class ValoracionesDaoImpl implements ValoracionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDVALORACION08", "FVALORACION08",
			"TIPOVALORACION08", "CONTRATOACTUACION08", "IDNIVELSOPORTE08", "ALTORIESGO08", "NIVELMALTRATO08",
			"NIVELSUICIDIO08", "PERIODICIDADPROPUESTA08", "PERIODICIDADACORDADA08", "PROPUESTAACEPTADA08",
			"IDSOLICITANTE08", "USUHISTORICO08", "FHISTORICO08", "FALTA08", "USUALTA08", "MOTIVORETRASO08",
			"IDENTIFICADOR01", "NOMBRE01", "APELLIDO101", "APELLIDO201", "DSCPROV", "DSOMUN", "MSTRIDNIVELSOPORTE58",
			"MSTRDESCES58", "MSTRDESCEU58", "MSTRFALTA58", "MSTRUSUALTA58", "MSTRFMODIF58", "MSTRUSUMODIF58",
			"MODOVALORACION08" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_VALORACION = "SEQ_VALORACIONES";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Valoraciones> rwMap = new RowMapper<Valoraciones>() {
		public Valoraciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Valoraciones valoraciones = new Valoraciones(UtilSQL.getLong(resultSet, "IDVALORACION08"),
					resultSet.getDate("FVALORACION08"), UtilSQL.getInt(resultSet, "TIPOVALORACION08"),
					resultSet.getString("CONTRATOACTUACION08"), UtilSQL.getLong(resultSet, "IDNIVELSOPORTE08"),
					UtilSQL.getInt(resultSet, "ALTORIESGO08"), UtilSQL.getInt(resultSet, "NIVELMALTRATO08"),
					UtilSQL.getInt(resultSet, "NIVELSUICIDIO08"), UtilSQL.getLong(resultSet, "PERIODICIDADPROPUESTA08"),
					UtilSQL.getLong(resultSet, "PERIODICIDADACORDADA08"),
					UtilSQL.getInt(resultSet, "PROPUESTAACEPTADA08"), UtilSQL.getLong(resultSet, "IDSOLICITANTE08"),
					resultSet.getString("USUHISTORICO08"), resultSet.getDate("FHISTORICO08"),
					UtilSQL.getInt(resultSet, "MOTIVORETRASO08"), resultSet.getDate("FALTA08"),
					resultSet.getString("USUALTA08"), UtilSQL.getInt(resultSet, "MODOVALORACION08"));

			if (UtilDAO.hasColumn(resultSet, "IDENTIFICADOR01") && null != resultSet.getString("IDENTIFICADOR01")) {
				Solicitantes solicitantes = new Solicitantes();
				solicitantes.setNombre01(resultSet.getString("NOMBRE01"));
				solicitantes.setIdSolicitante01(UtilSQL.getLong(resultSet, "IDSOLICITANTE08"));
				solicitantes.setApellido101(resultSet.getString("APELLIDO101"));
				solicitantes.setApellido201(resultSet.getString("APELLIDO201"));
				solicitantes.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));

				Direcciones dir = new Direcciones();
				dir.setProvinciaNORA(new Provincia(resultSet.getString("IDPROVINCIA"), resultSet.getString("DSCPROV"),
						resultSet.getString("DSEPROV"), resultSet.getString("AUTONOMIAID")));
				dir.setMunicipioNORA(new Municipio(resultSet.getString("IDMUNICIPIO"), resultSet.getString("DSOMUN"),
						resultSet.getString("IDPROVINCIA")));

				solicitantes.setDirecciones(dir);
				valoraciones.setSolicitantes(solicitantes);
			}

			if (UtilDAO.hasColumn(resultSet, "MSTRIDNIVELSOPORTE58")
					&& null != UtilSQL.getLong(resultSet, "MSTRIDNIVELSOPORTE58")) {
				MaestroNivSoporte nivelSoporte = new MaestroNivSoporte();
				nivelSoporte.setIdNivelSoporte58(UtilSQL.getLong(resultSet, "MSTRIDNIVELSOPORTE58"));
				nivelSoporte.setDescEs58(resultSet.getString("MSTRDESCES58"));
				nivelSoporte.setDescEu58(resultSet.getString("MSTRDESCEU58"));
				nivelSoporte.setUsuAlta58(resultSet.getString("MSTRUSUALTA58"));
				nivelSoporte.setUsuModif58(resultSet.getString("MSTRUSUMODIF58"));
				nivelSoporte.setfAlta58(resultSet.getDate("MSTRFALTA58"));
				nivelSoporte.setfModif58(resultSet.getDate("MSTRFMODIF58"));
				// valoraciones.set
			}

			return valoraciones;
		}

	};

	private RowMapper<Valoraciones> rwMapHistorico = new RowMapper<Valoraciones>() {
		public Valoraciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Valoraciones(UtilSQL.getLong(resultSet, "IDVALORACION08"), resultSet.getDate("FVALORACION08"),
					UtilSQL.getLong(resultSet, "IDNIVELSOPORTE08"), resultSet.getString("USUHISTORICO08"),
					resultSet.getDate("FHISTORICO08"));
		}
	};

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

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

			Valoraciones valoraciones = new Valoraciones(UtilSQL.getLong(resultSet, "IDVALORACION08"),
					resultSet.getDate("FVALORACION08"), UtilSQL.getInt(resultSet, "TIPOVALORACION08"),
					resultSet.getString("CONTRATOACTUACION08"), UtilSQL.getLong(resultSet, "IDNIVELSOPORTE08"),
					UtilSQL.getInt(resultSet, "ALTORIESGO08"), UtilSQL.getInt(resultSet, "NIVELMALTRATO08"),
					UtilSQL.getInt(resultSet, "NIVELSUICIDIO08"), UtilSQL.getLong(resultSet, "PERIODICIDADPROPUESTA08"),
					UtilSQL.getLong(resultSet, "PERIODICIDADACORDADA08"),
					UtilSQL.getInt(resultSet, "PROPUESTAACEPTADA08"), UtilSQL.getLong(resultSet, "IDSOLICITANTE08"),
					resultSet.getString("USUHISTORICO08"), resultSet.getDate("FHISTORICO08"),
					UtilSQL.getInt(resultSet, "MOTIVORETRASO08"), resultSet.getDate("FALTA08"),
					resultSet.getString("USUALTA08"), UtilSQL.getInt(resultSet, "MODOVALORACION08"));

			JerarquiaDto<Valoraciones> jerarquia = new JerarquiaDto<Valoraciones>();
			jerarquia.setModel(valoraciones);
			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;
		}
	};

	private RowMapper<Valoraciones> rwMapValoracionEntreFechas = new RowMapper<Valoraciones>() {
		public Valoraciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Valoraciones valoraciones = new Valoraciones(UtilSQL.getLong(resultSet, "IDVALORACION08"));
			valoraciones.setMaestroNivSoporte(new MaestroNivSoporte(UtilSQL.getLong(resultSet, "IDNIVELSOPORTE08")));
			valoraciones.setfHistorico08(resultSet.getDate("FHISTORICO08"));
			valoraciones.setfAlta08(resultSet.getDate("FALTA08"));

			return valoraciones;
		}
	};

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

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO VALORACIONES (ID_VALORACION_08, F_VALORACION_08, TIPO_VALORACION_08, CONTRATO_ACTUACION_08, ID_NIVEL_SOPORTE_08, ALTO_RIESGO_08, NIVEL_MALTRATO_08, NIVEL_SUICIDIO_08, PERIODICIDAD_PROPUESTA_08, PERIODICIDAD_ACORDADA_08, PROPUESTA_ACEPTADA_08, ID_SOLICITANTE_08, USU_HISTORICO_08, F_HISTORICO_08, F_ALTA_08, USU_ALTA_08, MOTIVO_RETRASO_08, MODO_VALORACION_08) "
				+ "VALUES (" + SEQUENCE_VALORACION
				+ ".NEXTVAL,:fValoracion,:tipoValoracion,:contratoActuacion,:idNivelSoporte,:altoRiesgo,:nivelMaltrato,:nivelSuicidio,:perioPropuesta,:perioAcordada,:propuestaAceptada,:idSolicitante,:usuHistorico, :fHistorico, sysdate,:usuAlta, :motivoRetraso, :modoValoracion)";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("fValoracion", valoraciones.getfValoracion08())
				.addValue("tipoValoracion", valoraciones.getTipoValoracion08())
				.addValue("contratoActuacion", valoraciones.getContratoActuacion08())
				.addValue("idNivelSoporte", valoraciones.getIdNivelSoporte08())
				.addValue("altoRiesgo", valoraciones.getAltoRiesgo08())
				.addValue("nivelMaltrato", valoraciones.getNivelMaltrato08())
				.addValue("nivelSuicidio", valoraciones.getNivelSuicidio08())
				.addValue("perioPropuesta", valoraciones.getPeriodicidadPropuesta08())
				.addValue("perioAcordada", valoraciones.getPeriodicidadAcordada08())
				.addValue("propuestaAceptada", valoraciones.getPropuestaAceptada08())
				.addValue("idSolicitante", valoraciones.getIdSolicitante08())
				.addValue("usuHistorico", valoraciones.getUsuHistorico08())
				.addValue("fHistorico", valoraciones.getfHistorico08()).addValue("usuAlta", valoraciones.getUsuAlta08())
				.addValue("motivoRetraso", valoraciones.getMotivoRetraso08())
				.addValue("modoValoracion", valoraciones.getModoValoracion08());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_VALORACION_08" });
		valoraciones.setIdValoracion08(generatedKeyHolder.getKey().longValue());

		return valoraciones;
	}

	/**
	 * Updates a single row in the Valoraciones table.
	 *
	 * @param valoraciones Valoraciones
	 * @return Valoraciones
	 */
	public Valoraciones update(Valoraciones valoraciones) {
		String query = "UPDATE VALORACIONES SET F_VALORACION_08=?, TIPO_VALORACION_08=?, CONTRATO_ACTUACION_08=?, ID_NIVEL_SOPORTE_08=?, ALTO_RIESGO_08=?, NIVEL_MALTRATO_08=?, NIVEL_SUICIDIO_08=?, PERIODICIDAD_PROPUESTA_08=?, PERIODICIDAD_ACORDADA_08=?, PROPUESTA_ACEPTADA_08=?, ID_SOLICITANTE_08 = ?, USU_HISTORICO_08 = ?, F_HISTORICO_08 = ?, F_ALTA_08=?, USU_ALTA_08=?, MODO_VALORACION_08=? WHERE ID_VALORACION_08=?";
		this.jdbcTemplate.update(query, valoraciones.getfValoracion08(), valoraciones.getTipoValoracion08(),
				valoraciones.getContratoActuacion08(), valoraciones.getIdNivelSoporte08(),
				valoraciones.getAltoRiesgo08(), valoraciones.getNivelMaltrato08(), valoraciones.getNivelSuicidio08(),
				valoraciones.getPeriodicidadPropuesta08(), valoraciones.getPeriodicidadAcordada08(),
				valoraciones.getPropuestaAceptada08(), valoraciones.getIdSolicitante08(),
				valoraciones.getUsuHistorico08(), valoraciones.getfHistorico08(), valoraciones.getfAlta08(),
				valoraciones.getUsuAlta08(), valoraciones.getModoValoracion08(), valoraciones.getIdValoracion08());
		return valoraciones;
	}

	/**
	 * Finds a single row in the Valoraciones table.
	 *
	 * @param valoraciones Valoraciones
	 * @return Valoraciones
	 */
	@Transactional(readOnly = true)
	public Valoraciones find(Valoraciones valoraciones) {
		String query = "SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.F_VALORACION_08 FVALORACION08, t1.TIPO_VALORACION_08 TIPOVALORACION08, t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.ALTO_RIESGO_08 ALTORIESGO08, t1.NIVEL_MALTRATO_08 NIVELMALTRATO08, t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08, t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08, t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08, t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08, t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.MOTIVO_RETRASO_08 MOTIVORETRASO08, t1.F_ALTA_08 FALTA08, t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2  WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58  AND t1.ID_VALORACION_08 = ?  ";

		List<Valoraciones> valoracionesList = this.jdbcTemplate.query(query, this.rwMap,
				valoraciones.getIdValoracion08());
		return (Valoraciones) DataAccessUtils.uniqueResult(valoracionesList);
	}

	/**
	 * Removes a single row in the Valoraciones table.
	 *
	 * @param valoraciones Valoraciones
	 * @return
	 */
	public void remove(Valoraciones valoraciones) {
		String query = "DELETE FROM VALORACIONES WHERE ID_VALORACION_08=?";
		this.jdbcTemplate.update(query, valoraciones.getIdValoracion08());
	}

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

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.F_VALORACION_08 FVALORACION08, t1.TIPO_VALORACION_08 TIPOVALORACION08, t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.ALTO_RIESGO_08 ALTORIESGO08, t1.NIVEL_MALTRATO_08 NIVELMALTRATO08, t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08, t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08, t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08, t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08, t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.MOTIVO_RETRASO_08 MOTIVORETRASO08, t1.F_ALTA_08 FALTA08, t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58");
		query.append(" FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2   ");
		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterValoraciones, startsWith);
		StringBuilder where = new StringBuilder(query + " WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		where.append(mapaWhere.get("query"));

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

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

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

	/**
	 * Finds a list of rows in the Valoraciones table.
	 *
	 * @param valoraciones    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @return List<Valoraciones>
	 */
	@Transactional(readOnly = true)
	public List<Valoraciones> findAll(Valoraciones valoraciones, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08,t1.MOTIVO_RETRASO_08 MOTIVORETRASO08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2  ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(valoraciones);
		StringBuilder where = new StringBuilder(" WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

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

	/**
	 * Finds rows in the Valoraciones table using like.
	 *
	 * @param valoraciones    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Valoraciones>
	 */
	@Transactional(readOnly = true)
	public List<Valoraciones> findAllLike(Valoraciones valoraciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.MOTIVO_RETRASO_08 MOTIVORETRASO08,t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58, t4.IDENTIFICADOR_01 IDENTIFICADOR01, t4.NOMBRE_01 NOMBRE01, t4.APELLIDO1_01 APELLIDO101, t4.APELLIDO2_01 APELLIDO201, t5.id_localidad_06, t7.ID IDPROVINCIA, t7.AUTONOMIA_ID AUTONOMIAID, t7.ds_c DSCPROV,t7.ds_e DSEPROV, t7.ds_o DSPROV, t6.ID IDMUNICIPIO, t6.DS_O DSOMUN ");
		query.append(
				" FROM VALORACIONES t1, SOLICITANTES t4, direcciones t5, T17_MUNICIPIO t6, T17_PROVINCIA t7, MAESTRO_NIV_SOPORTE t2  ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(valoraciones, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE T1.ID_NIVEL_SOPORTE_08 = T2.ID_NIVEL_SOPORTE_58 AND T4.ID_SOLICITANTE_01 = T1.ID_SOLICITANTE_08 AND T4.ID_DIRECCION_01 = T5.ID_DIRECCION_06(+) AND T5.ID_PROVINCIA_06 = T6.PROVINCIA_ID(+) AND T5.ID_MUNICIPIO_06 = T6.ID(+) AND T5.ID_PROVINCIA_06 = T7.ID(+)");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

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

	/**
	 * Finds rows in the Valoraciones table using like.
	 *
	 * @param valoraciones    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Valoraciones>
	 */
	@Transactional(readOnly = true)
	public List<Valoraciones> findAllLikeHistorico(Valoraciones valoraciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08 ");
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2  ");

		// Where clause & Params
		StringBuilder where = new StringBuilder(" WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		where.append(" AND t1.F_HISTORICO_08 IS NOT NULL AND t1.ID_SOLICITANTE_08 = ?");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add(valoraciones.getIdSolicitante08());

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the Valoraciones table.
	 *
	 * @param valoraciones Valoraciones
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(Valoraciones valoraciones) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM VALORACIONES t1, SOLICITANTES t4, MAESTRO_NIV_SOPORTE t2 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(valoraciones);
		StringBuilder where = new StringBuilder(
				" WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58  AND t4.ID_SOLICITANTE_01 = t1.ID_SOLICITANTE_08 ");
		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 Valoraciones table using like.
	 *
	 * @param valoraciones Valoraciones
	 * @param startsWith   Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Valoraciones valoraciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM VALORACIONES t1, SOLICITANTES t4, direcciones t5, T17_MUNICIPIO t6, T17_PROVINCIA t7, MAESTRO_NIV_SOPORTE t2  ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(valoraciones, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE T1.ID_NIVEL_SOPORTE_08 = T2.ID_NIVEL_SOPORTE_58 AND T4.ID_SOLICITANTE_01 = T1.ID_SOLICITANTE_08 AND T4.ID_DIRECCION_01 = T5.ID_DIRECCION_06(+) AND T5.ID_PROVINCIA_06 = T6.PROVINCIA_ID(+) AND T5.ID_MUNICIPIO_06 = T6.ID(+) AND T5.ID_PROVINCIA_06 = T7.ID(+)");
		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 Valoraciones table using like.
	 *
	 * @param valoraciones Valoraciones
	 * @param startsWith   Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountHistorico(Valoraciones valoraciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM VALORACIONES t1 ");

		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append("AND t1.F_HISTORICO_08 IS NOT NULL AND t1.ID_SOLICITANTE_08 = ?");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add(valoraciones.getIdSolicitante08());

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

	/**
	 * Reorder the data list of Valoraciones selected for rup_table
	 *
	 * @param valoraciones    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Valoraciones>>
	 */
	@Override
	public List<TableRowDto<Valoraciones>> reorderSelection(Valoraciones valoraciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		// FROM
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2  ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(valoraciones, startsWith);
		StringBuilder where = new StringBuilder(" WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		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, Valoraciones.class,
				filterParamList, "IDVALORACION08");

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

	/**
	 * ReorderHistorico the data list of Valoraciones selected for rup_table
	 *
	 * @param valoraciones    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Valoraciones>>
	 */
	@Override
	public List<TableRowDto<Valoraciones>> reorderSelectionHistorico(Valoraciones valoraciones,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		// FROM
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2  ");
		// FILTRADO
		// Where clause & Params
		StringBuilder where = new StringBuilder(" WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		where.append("AND t1.F_HISTORICO_08 IS NOT NULL AND t1.ID_SOLICITANTE_08 = ?");
		query.append(where);

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

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

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Valoraciones
	 * @param searchParams    Valoraciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Valoraciones>>
	 */
	@Override
	public List<TableRowDto<Valoraciones>> search(Valoraciones filterParams, Valoraciones searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		// FROM
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2 ");
		// 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 t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 ");
		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, Valoraciones.class,
				filterParamList, searchSQL, searchParamList, from_alias, "IDVALORACION08");

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

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

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

	/**
	 * Filter in the hierarchical Valoraciones table.
	 *
	 * @param filterValoraciones Valoraciones
	 * @param tableRequestDto    TableRequestDto
	 * @return List<JerarquiaDto<Valoraciones>>
	 */
	@Override
	public List<JerarquiaDto<Valoraciones>> findAllLikeJerarquia(Valoraciones filterValoraciones,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, t1.USU_HISTORICO_08 USUHISTORICO08, t1.F_HISTORICO_08 FHISTORICO08,t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08, t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58, t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM VALORACIONES t1 ");
		List<String> from = new ArrayList<String>();
		from.add("VALORACIONES");
		from.add("MAESTRO_NIV_SOPORTE");

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

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

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

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

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

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

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

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

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

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

	/**
	 * Metodo para obtener los niveles de soporte entre fechas.
	 * 
	 * @param fechaDesde Date
	 * @param fechaHasta Date
	 * @return List<Valoraciones>
	 */
	@Transactional(readOnly = true)
	public List<Valoraciones> findValoracionEntreFechas(Date fechaDesde, Date fechaHasta, Long idBeneficiario) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08 ");
		query.append(" FROM VALORACIONES t1 ");
		query.append(" WHERE F_ALTA_08 <= ? AND F_HISTORICO_08 >= ?");
		query.append(" AND t1.ID_NIVEL_SOPORTE_08 IS NOT NULL");
		query.append(" AND t1.id_solicitante_08 = ?");

		query.append(" UNION ");

		query.append(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08 ");
		query.append(
				"FROM   solicitantes t2 INNER JOIN valoraciones t1 ON (t2.id_valoracion_01 = t1.id_valoracion_08)");
		query.append(" WHERE F_ALTA_08 <= ? AND F_HISTORICO_08 >= ?");
		query.append(" AND t1.ID_NIVEL_SOPORTE_08 IS NOT NULL");
		query.append(" AND t1.id_solicitante_08 = ?");
		return this.jdbcTemplate.query(query.toString(), this.rwMapValoracionEntreFechas, fechaDesde, fechaHasta,
				idBeneficiario, fechaDesde, fechaHasta, idBeneficiario);
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (valoraciones != null && valoraciones.getIdValoracion08() != null) {
			where.append(" AND t1.ID_VALORACION_08 = ?");
			params.add(valoraciones.getIdValoracion08());
		}
		if (valoraciones != null && valoraciones.getfValoracion08() != null) {
			where.append(" AND t1.F_VALORACION_08 = ?");
			params.add(valoraciones.getfValoracion08());
		}
		if (valoraciones != null && valoraciones.getTipoValoracion08() != null) {
			where.append(" AND t1.TIPO_VALORACION_08 = ?");
			params.add(valoraciones.getTipoValoracion08());
		}
		if (valoraciones != null && valoraciones.getContratoActuacion08() != null) {
			where.append(" AND t1.CONTRATO_ACTUACION_08 = ?");
			params.add(valoraciones.getContratoActuacion08());
		}
		if (valoraciones != null && valoraciones.getModoValoracion08() != null) {
			where.append(" AND t1.MODO_VALORACION_08 = ?");
			params.add(valoraciones.getModoValoracion08());
		}
		if (valoraciones != null && valoraciones.getIdNivelSoporte08() != null) {
			where.append(" AND t1.ID_NIVEL_SOPORTE_08 = ?");
			params.add(valoraciones.getIdNivelSoporte08());
		}
		if (valoraciones != null && valoraciones.getAltoRiesgo08() != null) {
			where.append(" AND t1.ALTO_RIESGO_08 = ?");
			params.add(valoraciones.getAltoRiesgo08());
		}
		if (valoraciones != null && valoraciones.getNivelMaltrato08() != null) {
			where.append(" AND t1.NIVEL_MALTRATO_08 = ?");
			params.add(valoraciones.getNivelMaltrato08());
		}
		if (valoraciones != null && valoraciones.getNivelSuicidio08() != null) {
			where.append(" AND t1.NIVEL_SUICIDIO_08 = ?");
			params.add(valoraciones.getNivelSuicidio08());
		}
		if (valoraciones != null && valoraciones.getPeriodicidadPropuesta08() != null) {
			where.append(" AND t1.PERIODICIDAD_PROPUESTA_08 = ?");
			params.add(valoraciones.getPeriodicidadPropuesta08());
		}
		if (valoraciones != null && valoraciones.getPeriodicidadAcordada08() != null) {
			where.append(" AND t1.PERIODICIDAD_ACORDADA_0808 = ?");
			params.add(valoraciones.getPeriodicidadAcordada08());
		}
		if (valoraciones != null && valoraciones.getPropuestaAceptada08() != null) {
			where.append(" AND t1.PROPUESTA_ACEPTADA_08 = ?");
			params.add(valoraciones.getPropuestaAceptada08());
		}

		if (valoraciones != null && valoraciones.getIdSolicitante08() != null) {
			where.append(" AND t1.ID_SOLICITANTE_08 = ?");
			params.add(valoraciones.getIdSolicitante08());
		}
		if (valoraciones != null && valoraciones.getUsuHistorico08() != null) {
			where.append(" AND t1.USU_HISTORICO_08 = ?");
			params.add(valoraciones.getUsuHistorico08());
		}
		if (valoraciones != null && valoraciones.getfHistorico08() != null) {
			where.append(" AND t1.F_HISTORICO_08 = ?");
			params.add(valoraciones.getfHistorico08());
		}

		if (valoraciones != null && valoraciones.getfAlta08() != null) {
			where.append(" AND t1.F_ALTA_08 = ?");
			params.add(valoraciones.getfAlta08());
		}
		if (valoraciones != null && valoraciones.getUsuAlta08() != null) {
			where.append(" AND t1.USU_ALTA_08 = ?");
			params.add(valoraciones.getUsuAlta08());
		}

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

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

		if (valoraciones != null && valoraciones.getIdValoracion08() != null) {
			where.append(" AND t1.ID_VALORACION_08 = ?");
			params.add(valoraciones.getIdValoracion08());
		}

		if (valoraciones != null && valoraciones.getSolicitantes() != null
				&& valoraciones.getSolicitantes().getIdentificador01() != null) {
			where.append(" AND UPPER(t4.IDENTIFICADOR_01) LIKE ? ESCAPE  '\\'");
			params.add("%" + valoraciones.getSolicitantes().getIdentificador01().toUpperCase() + "%");
		}

		if (valoraciones != null && valoraciones.getSolicitantes() != null
				&& valoraciones.getSolicitantes().getNombre01() != null) {
			where.append(" AND UPPER(t4.NOMBRE_01) LIKE ? ESCAPE  '\\'");
			params.add("%" + valoraciones.getSolicitantes().getNombre01().toUpperCase() + "%");
		}
		if (valoraciones != null && valoraciones.getSolicitantes() != null
				&& valoraciones.getSolicitantes().getApellido101() != null) {
			where.append(" AND UPPER(t4.APELLIDO1_01) LIKE ? ESCAPE  '\\'");
			params.add("%" + valoraciones.getSolicitantes().getApellido101().toUpperCase() + "%");
		}
		if (valoraciones != null && valoraciones.getSolicitantes() != null
				&& valoraciones.getSolicitantes().getApellido201() != null) {
			where.append(" AND UPPER(t4.APELLIDO2_01) LIKE ? ESCAPE  '\\'");
			params.add("%" + valoraciones.getSolicitantes().getApellido201().toUpperCase() + "%");
		}
		if (valoraciones != null && valoraciones.getfValoracion08() != null) {
			where.append(" AND t1.F_VALORACION_08 = ?");
			params.add(valoraciones.getfValoracion08());
		}
		if (valoraciones != null && valoraciones.getTipoValoracion08() != null) {
			where.append(" AND t1.TIPO_VALORACION_08 = ?");
			params.add(valoraciones.getTipoValoracion08());
		}
		if (valoraciones != null && valoraciones.getContratoActuacion08() != null) {
			where.append(" AND UPPER(t1.CONTRATO_ACTUACION_08) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(valoraciones.getContratoActuacion08().toUpperCase() + "%");
			} else {
				params.add("%" + valoraciones.getContratoActuacion08().toUpperCase() + "%");
			}
			where.append(" AND t1.CONTRATO_ACTUACION_08 IS NOT NULL");
		}
		if (valoraciones != null && valoraciones.getModoValoracion08() != null) {
			where.append(" AND t1.MODO_VALORACION_08 = ?");
			params.add(valoraciones.getModoValoracion08());
		}
		if (valoraciones != null && valoraciones.getIdNivelSoporte08() != null) {
			where.append(" AND t1.ID_NIVEL_SOPORTE_08 = ?");
			params.add(valoraciones.getIdNivelSoporte08());
		}
		if (valoraciones != null && valoraciones.getAltoRiesgo08() != null) {
			where.append(" AND t1.ALTO_RIESGO_08 = ?");
			params.add(valoraciones.getAltoRiesgo08());
		}
		if (valoraciones != null && valoraciones.getNivelMaltrato08() != null) {
			where.append(" AND t1.NIVEL_MALTRATO_08 = ?");
			params.add(valoraciones.getNivelMaltrato08());
		}
		if (valoraciones != null && valoraciones.getNivelSuicidio08() != null) {
			where.append(" AND t1.NIVEL_SUICIDIO_08 = ?");
			params.add(valoraciones.getNivelSuicidio08());
		}
		if (valoraciones != null && valoraciones.getPeriodicidadPropuesta08() != null) {
			where.append(" AND t1.PERIODICIDAD_PROPUESTA_08 = ?");
			params.add(valoraciones.getPeriodicidadPropuesta08());
		}
		if (valoraciones != null && valoraciones.getPeriodicidadAcordada08() != null) {
			where.append(" AND t1.PERIODICIDAD_ACORDADA_08 = ?");
			params.add(valoraciones.getPeriodicidadAcordada08());
		}
		if (valoraciones != null && valoraciones.getPropuestaAceptada08() != null) {
			where.append(" AND t1.PROPUESTA_ACEPTADA_08 = ?");
			params.add(valoraciones.getPropuestaAceptada08());
		}

		if (valoraciones != null && valoraciones.getIdSolicitante08() != null) {
			where.append(" AND t1.ID_SOLICITANTE_08 = ?");
			params.add(valoraciones.getIdSolicitante08());
		}
		if (valoraciones != null && valoraciones.getUsuHistorico08() != null) {
			where.append(" AND UPPER(t1.USU_HISTORICO_08) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(valoraciones.getUsuHistorico08().toUpperCase() + "%");
			} else {
				params.add("%" + valoraciones.getUsuHistorico08().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_HISTORICO_08 IS NOT NULL");
		}
		if (valoraciones != null && valoraciones.getfHistorico08() != null) {
			where.append(" AND t1.F_HISTORICO_08 = ?");
			params.add(valoraciones.getfHistorico08());
		}

		if (valoraciones != null && valoraciones.getfAlta08() != null) {
			where.append(" AND t1.F_ALTA_08 = ?");
			params.add(valoraciones.getfAlta08());
		}
		if (valoraciones != null && valoraciones.getUsuAlta08() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_08) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(valoraciones.getUsuAlta08().toUpperCase() + "%");
			} else {
				params.add("%" + valoraciones.getUsuAlta08().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_08 IS NOT NULL");
		}

		if (valoraciones != null && valoraciones.getfValoracionDesde() != null) {
			where.append(" AND t1.F_VALORACION_08 >= ?");
			params.add(valoraciones.getfValoracionDesde());
		}
		if (valoraciones != null && valoraciones.getfValoracionHasta() != null) {
			where.append(" AND TRUNC(t1.f_valoracion_08) <= ?");
			params.add(valoraciones.getfValoracionHasta());
		}

		if (valoraciones != null && valoraciones.getfHistoricoDesde() != null) {
			where.append(" AND t1.F_HISTORICO_08 > ?");
			params.add(valoraciones.getfHistoricoDesde());
		}
		if (valoraciones != null && valoraciones.getDirecciones() != null
				&& valoraciones.getDirecciones().getProvinciaNORA() != null
				&& valoraciones.getDirecciones().getProvinciaNORA().getCodProvincia() != null) {
			where.append(" AND t7.ID = ?");
			params.add(valoraciones.getDirecciones().getProvinciaNORA().getCodProvincia());
		}
		if (valoraciones != null && valoraciones.getDirecciones() != null
				&& valoraciones.getDirecciones().getMunicipioNORA() != null
				&& valoraciones.getDirecciones().getMunicipioNORA().getCodMunicipio() != null) {
			where.append(" AND t6.ID = ?");
			params.add(valoraciones.getDirecciones().getMunicipioNORA().getCodMunicipio());
		}

		if (valoraciones != null && valoraciones.getMotivoRetraso08() != null) {
			where.append(" AND t1.MOTIVO_RETRASO_08 = ?");
			params.add(valoraciones.getMotivoRetraso08());
		}

		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;

	@Override
	public Valoraciones updateTabPrestacionServicio(Valoraciones valoraciones) {
		String query = "UPDATE VALORACIONES SET ID_NIVEL_SOPORTE_08=?, NIVEL_MALTRATO_08=?, NIVEL_SUICIDIO_08=?, ALTO_RIESGO_08=? WHERE ID_VALORACION_08=?";
		this.jdbcTemplate.update(query, valoraciones.getIdNivelSoporte08(), valoraciones.getNivelMaltrato08(),
				valoraciones.getNivelSuicidio08(), valoraciones.getAltoRiesgo08(), valoraciones.getIdValoracion08());
		return valoraciones;
	}

	public Valoraciones pasarHistorico(Valoraciones valoraciones) {
		String query = "UPDATE VALORACIONES SET USU_HISTORICO_08 = ?, F_HISTORICO_08 = sysdate WHERE ID_VALORACION_08=?";
		this.jdbcTemplate.update(query, valoraciones.getUsuHistorico08(), valoraciones.getIdValoracion08());
		return valoraciones;
	}

	/**
	 * Obtiene la valoración actual de un solicitante
	 * 
	 * @param valoracion
	 * @return
	 */
	@Override
	public Valoraciones getSolCurrentValoracion(Valoraciones valoraciones) {

		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_VALORACION_08 IDVALORACION08,t1.F_VALORACION_08 FVALORACION08,t1.TIPO_VALORACION_08 TIPOVALORACION08,");
		query.append(
				"t1.CONTRATO_ACTUACION_08 CONTRATOACTUACION08, t1.MODO_VALORACION_08 MODOVALORACION08,t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08,t1.ALTO_RIESGO_08 ALTORIESGO08,");
		query.append(
				"t1.NIVEL_MALTRATO_08 NIVELMALTRATO08,t1.NIVEL_SUICIDIO_08 NIVELSUICIDIO08,t1.PERIODICIDAD_PROPUESTA_08 PERIODICIDADPROPUESTA08,");
		query.append(
				"t1.PERIODICIDAD_ACORDADA_08 PERIODICIDADACORDADA08,t1.PROPUESTA_ACEPTADA_08 PROPUESTAACEPTADA08,t1.ID_SOLICITANTE_08 IDSOLICITANTE08, ");
		query.append(
				"t1.USU_HISTORICO_08 USUHISTORICO08,t1.MOTIVO_RETRASO_08 MOTIVORETRASO08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08,t1.USU_ALTA_08 USUALTA08,");
		query.append(
				"t2.ID_NIVEL_SOPORTE_58 MSTRIDNIVELSOPORTE58, t2.DESC_ES_58 MSTRDESCES58, t2.DESC_EU_58 MSTRDESCEU58, t2.F_ALTA_58 MSTRFALTA58, t2.USU_ALTA_58 MSTRUSUALTA58,");
		query.append("t2.F_MODIF_58 MSTRFMODIF58, t2.USU_MODIF_58 MSTRUSUMODIF58 ");
		query.append("FROM VALORACIONES t1, MAESTRO_NIV_SOPORTE t2, SOLICITANTES t3  ");
		query.append(
				"WHERE t1.ID_NIVEL_SOPORTE_08 = t2.ID_NIVEL_SOPORTE_58 AND t3.ID_VALORACION_01 = t1.ID_VALORACION_08 ");
		query.append(" AND t3.ID_SOLICITANTE_01 = ?");

		List<Valoraciones> valoracionesList = this.jdbcTemplate.query(query.toString(), this.rwMap,
				valoraciones.getIdSolicitante08());
		return (Valoraciones) DataAccessUtils.uniqueResult(valoracionesList);
	}

	/**
	 * Updates a single row in the Valoraciones table as historico.
	 *
	 * @param valoracion Valoraciones
	 * @return Valoraciones
	 */
	@Override
	public Valoraciones updateHistorico(Valoraciones valoracion) {
		String query = "UPDATE VALORACIONES SET USU_HISTORICO_08=?, F_HISTORICO_08=SYSDATE WHERE ID_VALORACION_08=?";
		this.jdbcTemplate.update(query, valoracion.getUsuHistorico08(), valoracion.getIdValoracion08());
		return valoracion;
	}

}
