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 java.util.Objects;

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.Avisos;
import com.ejie.ad74a.model.Ayuntamientos;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.DocumentosInforme;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.InformeSocial;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.UnidadesBase;
import com.ejie.ad74a.model.Usuarios;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.constantes.ActoresEnum;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.TipoInformesEnum;
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;

/**
 * InformesDaoImpl generated by UDA, 19-abr-2023 16:38:34.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class InformesDaoImpl implements InformesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDINFORME16", "TIPOINFORME16", "OBSERVACIONES16",
			"ESTADO16", "IDBENEFICIARIO16", "IDEXPEDIENTE16", "FINICIO16", "FFIN16", "FENVIOADMON16", "OCULTO16",
			"ORIGEN16", "URGENTE16", "USUALTA16", "USUMODIF16", "FALTA16", "FMODIF16", "DocInfIDDOCINFORME17",
			"DOCINFIDTIPODOC17", "DOCINFOID17", "DOCINFOIDDOKUSI17", "DOCINFURLRUTA17", "DOCINFUSUALTA17",
			"DOCINFUSUMODIF17", "DOCINFFALTA17", "DOCINFFMODIF17", "NOMBREDOC17",

			"IDUSUARIO80", "NOMBRE80", "APELLIDOS80", "USUXLNETS80", "EMAIL80", "TLFNO80", "PUESTO80", "FALTA80",
			"IDENTIFICADOR80", "FALTA80", "USUALTA80", "FMODIF80", "USUMODIF80",

			"NUMEXPEDIENTE00", "IDEXPEDIENTE00", "URGENCIA00", "ERROREXPEDIENTE00", "IDSOLICITANTE01",
			"IDENTIFICADOR01", "NOMBRE01", "APELLIDO101", "APELLIDO201", "CALLE06", "IDENTIFICADOR_FILTER",
			"NOMBREAPELLIDOS_FILTER", "NOMBRE_TRS_FILTER", "DESC_TIPO_INFORME_CAS", "DESC_TIPO_INFORME_EUS",
			"ESTADO_DESC_CAS", "ESTADO_DESC_EUS" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_INFORMES = "SEQ_INFORMES";

	/*
	 * ROW_MAPPERS
	 */

	private RowMapper<Informes> rwMapInforme = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));
			return informes;
		}
	};

	private RowMapper<Informes> rwMapInformesDocumento = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));

			DocumentosInforme documentosInforme = new DocumentosInforme(
					UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"), UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"),
					resultSet.getString("DOCINFOID17"), resultSet.getString("DOCINFOIDDOKUSI17"),
					resultSet.getString("DOCINFURLRUTA17"), resultSet.getString("DOCINFUSUALTA17"),
					resultSet.getString("DOCINFUSUMODIF17"), resultSet.getDate("DOCINFFALTA17"),
					resultSet.getDate("DOCINFFMODIF17"), resultSet.getString("NOMBREDOC17"));

			MaestroTiposDoc maestroTiposDoc = new MaestroTiposDoc();
			maestroTiposDoc.setIdTipoDoc36(documentosInforme.getIdTipoDoc17());
			if (UtilDAO.hasColumn(resultSet, "DESCES36")) {
				maestroTiposDoc.setDescEs36(resultSet.getString("DESCES36"));
			}
			if (UtilDAO.hasColumn(resultSet, "DESCEU36")) {
				maestroTiposDoc.setDescEu36(resultSet.getString("DESCEU36"));
			}

			documentosInforme.setMaestroTiposDoc(maestroTiposDoc);

			informes.setDocumentosInforme(documentosInforme);

			return informes;
		}
	};

	private RowMapper<Informes> rwMap = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DocumentosInforme documentosInforme = new DocumentosInforme(
					UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"), UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"),
					resultSet.getString("DOCINFOID17"), resultSet.getString("DOCINFOIDDOKUSI17"),
					resultSet.getString("DOCINFURLRUTA17"), resultSet.getString("DOCINFUSUALTA17"),
					resultSet.getString("DOCINFUSUMODIF17"), resultSet.getDate("DOCINFFALTA17"),
					resultSet.getDate("DOCINFFMODIF17"), resultSet.getString("NOMBREDOC17"));

			Usuarios usuario = new Usuarios(UtilSQL.getLong(resultSet, "IDUSUARIO80"),
					resultSet.getString("IDENTIFICADOR80"), resultSet.getString("NOMBRE80"),
					resultSet.getString("APELLIDOS80"), resultSet.getString("USUXLNETS80"),
					resultSet.getString("EMAIL80"), resultSet.getString("TLFNO80"), resultSet.getString("PUESTO80"),
					resultSet.getDate("FBAJA80"), resultSet.getDate("FALTA80"), resultSet.getString("USUALTA80"),
					resultSet.getDate("FMODIF80"), resultSet.getString("USUMODIF80"));

			// Ayuntamiento
			Ayuntamientos ayuntamiento = new Ayuntamientos();
			ayuntamiento.setIdAyuntamiento31(resultSet.getLong("IDAYUNTAMIENTO31"));
			ayuntamiento.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamiento.setDescEu31(resultSet.getString("DESCEU31"));

			// Unidad base

			List<UnidadesBase> unidadesBase = new ArrayList<UnidadesBase>();
			if (UtilDAO.hasColumn(resultSet, "IDUNIDADBASE92")) {
				UnidadesBase unidadBase = new UnidadesBase();
				unidadBase.setIdUnidadBase92(resultSet.getLong("IDUNIDADBASE92"));
				unidadBase.setDescEs92(resultSet.getString("DESCES92"));
				unidadBase.setDescEu92(resultSet.getString("DESCEU92"));
				unidadesBase.add(unidadBase);
			}
			ayuntamiento.setUnidadesBase(unidadesBase);
			usuario.setAyuntamiento(ayuntamiento);

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));
			informes.setDocumentosInforme(documentosInforme);
			informes.setUsuario(usuario);
			informes.setTelefono16(resultSet.getString("TELEFONO16"));
			informes.setEmail16(resultSet.getString("EMAIL16"));

			informes.setIdUnidadBase16(UtilSQL.getLong(resultSet, "IDUNIDADBASE16"));
			informes.setUnidadBase16(resultSet.getString("UNIDADBASE16"));
			informes.setDireccion(resultSet.getString("CALLE06"));
			informes.setLetra(resultSet.getString("LETRA06"));
			informes.setPiso(resultSet.getString("PISO06"));
			informes.setPortal(resultSet.getString("PORTAL06"));
			informes.setLocalidad(resultSet.getString("DSO"));
			informes.setCp(resultSet.getString("CP06"));

			// Datos del expediente relacionado
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente00(UtilSQL.getLong(resultSet, "IDEXPEDIENTE00"));
			expediente.setNumExpediente00(resultSet.getString("NUMEXPEDIENTE00"));
			expediente.setUrgencia00(UtilSQL.getInt(resultSet, "URGENCIA00"));
			expediente.setErrorExpediente00(UtilSQL.getInt(resultSet, "ERROREXPEDIENTE00"));
			informes.setExpedientes(expediente);

			Solicitantes beneficiario = new Solicitantes();
			beneficiario.setIdSolicitante01(resultSet.getLong("IDSOLICITANTE01"));
			beneficiario.setNombre01(resultSet.getString("NOMBRE01"));
			beneficiario.setApellido101(resultSet.getString("APELLIDO101"));
			beneficiario.setApellido201(resultSet.getString("APELLIDO201"));
			beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));
			informes.setSolicitantes(beneficiario);

			InformeSocial informeSocial = new InformeSocial();
			informeSocial.setIdInfSocial02(UtilSQL.getLong(resultSet, "IDINFSOCIAL02"));
			informeSocial.setfInforme02(resultSet.getDate("FINFORME02"));
//			informeSocial.setAyuntamiento(ayuntamiento);

			informeSocial.setNombre02(resultSet.getString("NOMBRE02"));
			informeSocial.setApellido102(resultSet.getString("APELLIDO102"));
			informeSocial.setApellido202(resultSet.getString("APELLIDO202"));
			informeSocial.setIdentificador02(resultSet.getString("IDENTIFICADOR02"));
//			informeSocial.setUnidadBase02(resultSet.getString("UNIDADBASE02"));
//			informeSocial.setTelefono02(resultSet.getString("TELEFONO02"));
//			informeSocial.setEmail02(resultSet.getString("EMAIL02"));
			informeSocial.setSola02(UtilSQL.getInt(resultSet, "SOLA02"));
			informeSocial.setEstaSolaManana02(UtilSQL.getInt(resultSet, "ESTASOLAMANANA02"));
			informeSocial.setEstaSolaTarde02(UtilSQL.getInt(resultSet, "ESTASOLATARDE02"));
			informeSocial.setEstaSolaNoche02(UtilSQL.getInt(resultSet, "ESTASOLANOCHE02"));
			informeSocial.setRelacionEntorno02(UtilSQL.getInt(resultSet, "RELACIONENTORNO02"));
			informeSocial.setFamiliarFallecido02(UtilSQL.getInt(resultSet, "FAMILIARFALLECIDO02"));
			informeSocial.setVinculoFallecido02(resultSet.getString("VINCULOFALLECIDO02"));
			informeSocial.setVisitasFamilia02(UtilSQL.getInt(resultSet, "VISITASFAMILIA02"));
			informeSocial.setVisitasAmigos02(UtilSQL.getInt(resultSet, "VISITASAMIGOS02"));
			informeSocial.setFrecuenciaSalidas02(UtilSQL.getInt(resultSet, "FRECUENCIASALIDAS02"));
			informeSocial.setPeriodoSinVisitas02(UtilSQL.getInt(resultSet, "PERIODOSINVISITAS02"));
			informeSocial.setTiempoSinVisitas02(UtilSQL.getInt(resultSet, "TIEMPOSINVISITAS02"));
			informeSocial.setObservaciones02(resultSet.getString("OBSERVACIONES02"));
			informeSocial.setObservacionesPs02(resultSet.getString("OBSERVACIONESPS02"));
			informeSocial.setApreciacion02(UtilSQL.getInt(resultSet, "APRECIACION02"));
			informeSocial.setfAlta02(resultSet.getDate("FALTA02"));
			informes.setInformeSocial(informeSocial);

			return informes;
		}
	};

	private RowMapper<Informes> rwMapInformeSocial = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DocumentosInforme documentosInforme = new DocumentosInforme(
					UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"), UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"),
					resultSet.getString("DOCINFOID17"), resultSet.getString("DOCINFOIDDOKUSI17"),
					resultSet.getString("DOCINFURLRUTA17"), resultSet.getString("DOCINFUSUALTA17"),
					resultSet.getString("DOCINFUSUMODIF17"), resultSet.getDate("DOCINFFALTA17"),
					resultSet.getDate("DOCINFFMODIF17"), resultSet.getString("NOMBREDOC17"));

			Usuarios usuario = new Usuarios(UtilSQL.getLong(resultSet, "IDUSUARIO80"),
					resultSet.getString("IDENTIFICADOR80"), resultSet.getString("NOMBRE80"),
					resultSet.getString("APELLIDOS80"), resultSet.getString("USUXLNETS80"),
					resultSet.getString("EMAIL80"), resultSet.getString("TLFNO80"), resultSet.getString("PUESTO80"),
					resultSet.getDate("FBAJA80"), resultSet.getDate("FALTA80"), resultSet.getString("USUALTA80"),
					resultSet.getDate("FMODIF80"), resultSet.getString("USUMODIF80"));

			Ayuntamientos ayuntamiento = new Ayuntamientos(resultSet.getLong("IDAYUNTAMIENTO16"));
			ayuntamiento.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamiento.setDescEu31(resultSet.getString("DESCEU31"));
			ayuntamiento.setMunicipio(new Municipio(null, resultSet.getString("municipioAyuntamiento"), null));
			usuario.setAyuntamiento(ayuntamiento);

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));
			informes.setDocumentosInforme(documentosInforme);
			informes.setUsuario(usuario);
			informes.setIdentificadorFilter(resultSet.getString("IDENTIFICADOR_FILTER"));
			informes.setAyuntamiento(ayuntamiento);
			informes.setUnidadBase16(resultSet.getString("UNIDADBASE16"));
			informes.setIdUnidadBase16(UtilSQL.getLong(resultSet, "IDUNIDADBASE16"));
			informes.setTelefono16(
					resultSet.getString("TELEFONO16") != null ? resultSet.getString("TELEFONO16") : "N/A");
			informes.setEmail16(resultSet.getString("EMAIL16") != null ? resultSet.getString("EMAIL16") : "N/A");

			// Datos del expediente relacionado
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente00(UtilSQL.getLong(resultSet, "IDEXPEDIENTE00"));
			expediente.setNumExpediente00(resultSet.getString("NUMEXPEDIENTE00"));
			expediente.setUrgencia00(UtilSQL.getInt(resultSet, "URGENCIA00"));
			expediente.setErrorExpediente00(UtilSQL.getInt(resultSet, "ERROREXPEDIENTE00"));
			informes.setExpedientes(expediente);

			Solicitantes beneficiario = new Solicitantes();

			if (Objects.isNull(resultSet.getLong("IDSOLICITANTE01")) || 0L == resultSet.getLong("IDSOLICITANTE01")) {
				// Inf. social previo a solicitud de alta no tiene idsolicitante
				beneficiario.setNombre01(resultSet.getString("NOMBRE02"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO102"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO202"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR02"));
			} else {
				beneficiario.setIdSolicitante01(resultSet.getLong("IDSOLICITANTE01"));
				beneficiario.setNombre01(resultSet.getString("NOMBRE01"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO101"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO201"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));
			}
			informes.setSolicitantes(beneficiario);

			informes.setDireccion(resultSet.getString("CALLE06"));
			informes.setLetra(resultSet.getString("LETRA06"));
			informes.setPiso(resultSet.getString("PISO06"));
			informes.setPortal(resultSet.getString("PORTAL06"));
			informes.setLocalidad(resultSet.getString("DSO"));
			informes.setCp(resultSet.getString("CP06"));

			Direcciones direccion = new Direcciones(UtilSQL.getLong(resultSet, "DireccionesIDDIRECCION06"),
					resultSet.getString("DireccionesCALLE06"), resultSet.getString("DireccionesCP06"),
					UtilSQL.getLong(resultSet, "DireccionesIDCALLE06"),
					UtilSQL.getLong(resultSet, "DireccionesIDLOCALIDAD06"),
					resultSet.getString("DireccionesIDMUNICIPIO06"), resultSet.getString("DireccionesIDPAIS06"),
					UtilSQL.getLong(resultSet, "DireccionesIDPORTAL06"),
					resultSet.getString("DireccionesIDPROVINCIA06"), resultSet.getString("DireccionesLETRA06"),
					resultSet.getString("DireccionesLOCALIDAD06"), resultSet.getString("DireccionesMUNICIPIO06"),
					resultSet.getString("DireccionesPAIS06"), resultSet.getString("DireccionesPISO06"),
					resultSet.getString("DireccionesPORTAL06"), resultSet.getString("DireccionesESCALERA06"),
					resultSet.getString("DireccionesPROVINCIA06"),
					UtilSQL.getLong(resultSet, "DIRECCIONESIDSOLICITANTE06"),
					resultSet.getString("DIRECCIONESUSUHISTORICO06"), resultSet.getDate("DIRECCIONESFHISTORICO06"),
					resultSet.getDate("DireccionesFALTA06"), resultSet.getString("DireccionesUSUALTA06"),
					resultSet.getString("provincianoradesces"), resultSet.getString("provincianoradesceu"),
					resultSet.getString("municipionoradesc"), resultSet.getString("localidadNORADesc"),
					resultSet.getString("calleDescripcion"), resultSet.getString("calleTipoVia"),
					UtilSQL.getLong(resultSet, "portalNumNORADesc"), resultSet.getString("portalBisNORADesc"),
					resultSet.getString("portalBloqueNORADesc"));

			informes.setDirecciones(direccion);

			InformeSocial informeSocial = new InformeSocial();
			informeSocial.setIdInfSocial02(UtilSQL.getLong(resultSet, "IDINFSOCIAL02"));
			informeSocial.setfInforme02(resultSet.getDate("FINFORME02"));
//			informeSocial.setAyuntamiento(ayuntamiento);

			informeSocial.setNombre02(resultSet.getString("NOMBRE02"));
			informeSocial.setApellido102(resultSet.getString("APELLIDO102"));
			informeSocial.setApellido202(resultSet.getString("APELLIDO202"));
			informeSocial.setIdentificador02(resultSet.getString("IDENTIFICADOR02"));
//			informeSocial.setUnidadBase02(resultSet.getString("UNIDADBASE02"));
//			informeSocial.setTelefono02(resultSet.getString("TELEFONO02"));
//			informeSocial.setEmail02(resultSet.getString("EMAIL02"));
			informeSocial.setSola02(UtilSQL.getInt(resultSet, "SOLA02"));
			informeSocial.setEstaSolaManana02(UtilSQL.getInt(resultSet, "ESTASOLAMANANA02"));
			informeSocial.setEstaSolaTarde02(UtilSQL.getInt(resultSet, "ESTASOLATARDE02"));
			informeSocial.setEstaSolaNoche02(UtilSQL.getInt(resultSet, "ESTASOLANOCHE02"));
			informeSocial.setRelacionEntorno02(UtilSQL.getInt(resultSet, "RELACIONENTORNO02"));
			informeSocial.setFamiliarFallecido02(UtilSQL.getInt(resultSet, "FAMILIARFALLECIDO02"));
			informeSocial.setVinculoFallecido02(resultSet.getString("VINCULOFALLECIDO02"));
			informeSocial.setVisitasFamilia02(UtilSQL.getInt(resultSet, "VISITASFAMILIA02"));
			informeSocial.setVisitasAmigos02(UtilSQL.getInt(resultSet, "VISITASAMIGOS02"));
			informeSocial.setFrecuenciaSalidas02(UtilSQL.getInt(resultSet, "FRECUENCIASALIDAS02"));
			informeSocial.setPeriodoSinVisitas02(UtilSQL.getInt(resultSet, "PERIODOSINVISITAS02"));
			informeSocial.setTiempoSinVisitas02(UtilSQL.getInt(resultSet, "TIEMPOSINVISITAS02"));
			informeSocial.setObservaciones02(resultSet.getString("OBSERVACIONES02"));
			informeSocial.setObservacionesPs02(resultSet.getString("OBSERVACIONESPS02"));
			informeSocial.setApreciacion02(UtilSQL.getInt(resultSet, "APRECIACION02"));
			informeSocial.setfAlta02(resultSet.getDate("FALTA02"));

			informes.setInformeSocial(informeSocial);

			return informes;
		}
	};

	private RowMapper<Informes> rwMapDetalleNoInfSoc = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DocumentosInforme documentosInforme = new DocumentosInforme(
					UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"), UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"),
					resultSet.getString("DOCINFOID17"), resultSet.getString("DOCINFOIDDOKUSI17"),
					resultSet.getString("DOCINFURLRUTA17"), resultSet.getString("DOCINFUSUALTA17"),
					resultSet.getString("DOCINFUSUMODIF17"), resultSet.getDate("DOCINFFALTA17"),
					resultSet.getDate("DOCINFFMODIF17"), resultSet.getString("NOMBREDOC17"));

			MaestroTiposDoc maestroTiposDoc = new MaestroTiposDoc();
			maestroTiposDoc.setIdTipoDoc36(documentosInforme.getIdTipoDoc17());
			if (UtilDAO.hasColumn(resultSet, "DESCES36")) {
				maestroTiposDoc.setDescEs36(resultSet.getString("DESCES36"));
			}
			if (UtilDAO.hasColumn(resultSet, "DESCEU36")) {
				maestroTiposDoc.setDescEu36(resultSet.getString("DESCEU36"));
			}
			documentosInforme.setMaestroTiposDoc(maestroTiposDoc);

			Usuarios usuario = new Usuarios(UtilSQL.getLong(resultSet, "IDUSUARIO80"),
					resultSet.getString("IDENTIFICADOR80"), resultSet.getString("NOMBRE80"),
					resultSet.getString("APELLIDOS80"), resultSet.getString("USUXLNETS80"),
					resultSet.getString("EMAIL80"), resultSet.getString("TLFNO80"), resultSet.getString("PUESTO80"),
					resultSet.getDate("FBAJA80"), resultSet.getDate("FALTA80"), resultSet.getString("USUALTA80"),
					resultSet.getDate("FMODIF80"), resultSet.getString("USUMODIF80"));

			Ayuntamientos ayuntamiento = new Ayuntamientos(resultSet.getLong("IDAYUNTAMIENTO16"));
			ayuntamiento.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamiento.setDescEu31(resultSet.getString("DESCEU31"));
			usuario.setAyuntamiento(ayuntamiento);

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));
			informes.setDocumentosInforme(documentosInforme);
			informes.setUsuario(usuario);
			informes.setUnidadBase16(resultSet.getString("UNIDADBASE16"));
			informes.setIdUnidadBase16(UtilSQL.getLong(resultSet, "IDUNIDADBASE16"));
			informes.setTelefono16(resultSet.getString("TELEFONO16"));
			informes.setEmail16(resultSet.getString("EMAIL16"));

			// Datos del expediente relacionado
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente00(UtilSQL.getLong(resultSet, "IDEXPEDIENTE00"));
			expediente.setNumExpediente00(resultSet.getString("NUMEXPEDIENTE00"));
			expediente.setUrgencia00(UtilSQL.getInt(resultSet, "URGENCIA00"));
			expediente.setErrorExpediente00(UtilSQL.getInt(resultSet, "ERROREXPEDIENTE00"));
			informes.setExpedientes(expediente);

			Solicitantes beneficiario = new Solicitantes();
			if (Objects.isNull(resultSet.getLong("IDSOLICITANTE01")) || 0L == resultSet.getLong("IDSOLICITANTE01")) {
				// Inf. social previo a solicitud de alta no tiene idsolicitante
				beneficiario.setNombre01(resultSet.getString("NOMBRE02"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO102"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO202"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR02"));
			} else {
				beneficiario.setIdSolicitante01(resultSet.getLong("IDSOLICITANTE01"));
				beneficiario.setNombre01(resultSet.getString("NOMBRE01"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO101"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO201"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));
			}
			informes.setSolicitantes(beneficiario);

			informes.setDireccion(resultSet.getString("CALLE06"));
			informes.setLetra(resultSet.getString("LETRA06"));
			informes.setPiso(resultSet.getString("PISO06"));
			informes.setPortal(resultSet.getString("PORTAL06"));
			informes.setLocalidad(resultSet.getString("DSO"));
			informes.setCp(resultSet.getString("CP06"));

			Direcciones direccion = new Direcciones(UtilSQL.getLong(resultSet, "DireccionesIDDIRECCION06"),
					resultSet.getString("DireccionesCALLE06"), resultSet.getString("DireccionesCP06"),
					UtilSQL.getLong(resultSet, "DireccionesIDCALLE06"),
					UtilSQL.getLong(resultSet, "DireccionesIDLOCALIDAD06"),
					resultSet.getString("DireccionesIDMUNICIPIO06"), resultSet.getString("DireccionesIDPAIS06"),
					UtilSQL.getLong(resultSet, "DireccionesIDPORTAL06"),
					resultSet.getString("DireccionesIDPROVINCIA06"), resultSet.getString("DireccionesLETRA06"),
					resultSet.getString("DireccionesLOCALIDAD06"), resultSet.getString("DireccionesMUNICIPIO06"),
					resultSet.getString("DireccionesPAIS06"), resultSet.getString("DireccionesPISO06"),
					resultSet.getString("DireccionesPORTAL06"), resultSet.getString("DireccionesESCALERA06"),
					resultSet.getString("DireccionesPROVINCIA06"),
					UtilSQL.getLong(resultSet, "DIRECCIONESIDSOLICITANTE06"),
					resultSet.getString("DIRECCIONESUSUHISTORICO06"), resultSet.getDate("DIRECCIONESFHISTORICO06"),
					resultSet.getDate("DireccionesFALTA06"), resultSet.getString("DireccionesUSUALTA06"),
					resultSet.getString("provincianoradesces"), resultSet.getString("provincianoradesceu"),
					resultSet.getString("municipionoradesc"), resultSet.getString("localidadNORADesc"),
					resultSet.getString("calleDescripcion"), resultSet.getString("calleTipoVia"),
					UtilSQL.getLong(resultSet, "portalNumNORADesc"), resultSet.getString("portalBisNORADesc"),
					resultSet.getString("portalBloqueNORADesc"));

			informes.setDirecciones(direccion);
			return informes;
		}
	};

	private RowMapper<Informes> rwMapDetalleConInfSoc = new RowMapper<Informes>() {
		public Informes mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DocumentosInforme documentosInforme = new DocumentosInforme(
					UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"), UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"),
					resultSet.getString("DOCINFOID17"), resultSet.getString("DOCINFOIDDOKUSI17"),
					resultSet.getString("DOCINFURLRUTA17"), resultSet.getString("DOCINFUSUALTA17"),
					resultSet.getString("DOCINFUSUMODIF17"), resultSet.getDate("DOCINFFALTA17"),
					resultSet.getDate("DOCINFFMODIF17"), resultSet.getString("NOMBREDOC17"));

			MaestroTiposDoc maestroTiposDoc = new MaestroTiposDoc();
			maestroTiposDoc.setIdTipoDoc36(documentosInforme.getIdTipoDoc17());
			if (UtilDAO.hasColumn(resultSet, "DESCES36")) {
				maestroTiposDoc.setDescEs36(resultSet.getString("DESCES36"));
			}
			if (UtilDAO.hasColumn(resultSet, "DESCEU36")) {
				maestroTiposDoc.setDescEu36(resultSet.getString("DESCEU36"));
			}
			documentosInforme.setMaestroTiposDoc(maestroTiposDoc);

			Usuarios usuario = new Usuarios(UtilSQL.getLong(resultSet, "IDUSUARIO80"),
					resultSet.getString("IDENTIFICADOR80"), resultSet.getString("NOMBRE80"),
					resultSet.getString("APELLIDOS80"), resultSet.getString("USUXLNETS80"),
					resultSet.getString("EMAIL80"), resultSet.getString("TLFNO80"), resultSet.getString("PUESTO80"),
					resultSet.getDate("FBAJA80"), resultSet.getDate("FALTA80"), resultSet.getString("USUALTA80"),
					resultSet.getDate("FMODIF80"), resultSet.getString("USUMODIF80"));

			Ayuntamientos ayuntamiento = new Ayuntamientos(resultSet.getLong("IDAYUNTAMIENTO16"));
			ayuntamiento.setDescEs31(resultSet.getString("DESCES31"));
			ayuntamiento.setDescEu31(resultSet.getString("DESCEU31"));
			usuario.setAyuntamiento(ayuntamiento);

			Informes informes = new Informes();
			informes.setIdInforme16(UtilSQL.getLong(resultSet, "IDINFORME16"));
			informes.setTipoInforme16(resultSet.getString("TIPOINFORME16"));
			informes.setObservaciones16(resultSet.getString("OBSERVACIONES16"));
			informes.setEstado16(resultSet.getString("ESTADO16"));
			informes.setIdBeneficiario16(UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"));
			informes.setIdExpediente16(UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"));
			informes.setfInicio16(resultSet.getTimestamp("FINICIO16"));
			informes.setfFin16(resultSet.getDate("FFIN16"));
			informes.setfEnvioAdmon16(resultSet.getTimestamp("FENVIOADMON16"));
			informes.setOculto16(UtilSQL.getInt(resultSet, "OCULTO16"));
			informes.setOrigen16(UtilSQL.getInt(resultSet, "ORIGEN16"));
			informes.setUrgente16(UtilSQL.getInt(resultSet, "URGENTE16"));
			informes.setUsuAlta16(resultSet.getString("USUALTA16"));
			informes.setUsuModif16(resultSet.getString("USUMODIF16"));
			informes.setfAlta16(resultSet.getDate("FALTA16"));
			informes.setfModif16(resultSet.getDate("FMODIF16"));
			informes.setDocumentosInforme(documentosInforme);
			informes.setUsuario(usuario);
			informes.setAyuntamiento(ayuntamiento);
			informes.setUnidadBase16(resultSet.getString("UNIDADBASE16"));
			informes.setIdUnidadBase16(UtilSQL.getLong(resultSet, "IDUNIDADBASE16"));
			informes.setTelefono16(resultSet.getString("TELEFONO16"));
			informes.setEmail16(resultSet.getString("EMAIL16"));

			// Datos del expediente relacionado
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente00(UtilSQL.getLong(resultSet, "IDEXPEDIENTE00"));
			expediente.setNumExpediente00(resultSet.getString("NUMEXPEDIENTE00"));
			expediente.setUrgencia00(UtilSQL.getInt(resultSet, "URGENCIA00"));
			expediente.setErrorExpediente00(UtilSQL.getInt(resultSet, "ERROREXPEDIENTE00"));
			informes.setExpedientes(expediente);

			Solicitantes beneficiario = new Solicitantes();
			if (Objects.isNull(resultSet.getLong("IDSOLICITANTE01")) || 0L == resultSet.getLong("IDSOLICITANTE01")) {
				// Inf. social previo a solicitud de alta no tiene idsolicitante
				beneficiario.setNombre01(resultSet.getString("NOMBRE02"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO102"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO202"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR02"));
				beneficiario.setTipoIdentificador01(resultSet.getString("TIPOIDENTIFICADOR01"));
			} else {
				beneficiario.setIdSolicitante01(resultSet.getLong("IDSOLICITANTE01"));
				beneficiario.setNombre01(resultSet.getString("NOMBRE01"));
				beneficiario.setApellido101(resultSet.getString("APELLIDO101"));
				beneficiario.setApellido201(resultSet.getString("APELLIDO201"));
				beneficiario.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));
				beneficiario.setTipoIdentificador01(resultSet.getString("TIPOIDENTIFICADOR01"));

			}
			informes.setSolicitantes(beneficiario);

			informes.setDireccion(resultSet.getString("CALLE06"));
			informes.setLetra(resultSet.getString("LETRA06"));
			informes.setPiso(resultSet.getString("PISO06"));
			informes.setPortal(resultSet.getString("PORTAL06"));
			informes.setLocalidad(resultSet.getString("DSO"));
			informes.setCp(resultSet.getString("CP06"));

			Direcciones direccion = new Direcciones(UtilSQL.getLong(resultSet, "DireccionesIDDIRECCION06"),
					resultSet.getString("DireccionesCALLE06"), resultSet.getString("DireccionesCP06"),
					UtilSQL.getLong(resultSet, "DireccionesIDCALLE06"),
					UtilSQL.getLong(resultSet, "DireccionesIDLOCALIDAD06"),
					resultSet.getString("DireccionesIDMUNICIPIO06"), resultSet.getString("DireccionesIDPAIS06"),
					UtilSQL.getLong(resultSet, "DireccionesIDPORTAL06"),
					resultSet.getString("DireccionesIDPROVINCIA06"), resultSet.getString("DireccionesLETRA06"),
					resultSet.getString("DireccionesLOCALIDAD06"), resultSet.getString("DireccionesMUNICIPIO06"),
					resultSet.getString("DireccionesPAIS06"), resultSet.getString("DireccionesPISO06"),
					resultSet.getString("DireccionesPORTAL06"), resultSet.getString("DireccionesESCALERA06"),
					resultSet.getString("DireccionesPROVINCIA06"),
					UtilSQL.getLong(resultSet, "DIRECCIONESIDSOLICITANTE06"),
					resultSet.getString("DIRECCIONESUSUHISTORICO06"), resultSet.getDate("DIRECCIONESFHISTORICO06"),
					resultSet.getDate("DireccionesFALTA06"), resultSet.getString("DireccionesUSUALTA06"),
					resultSet.getString("provincianoradesces"), resultSet.getString("provincianoradesceu"),
					resultSet.getString("municipionoradesc"), resultSet.getString("localidadNORADesc"),
					resultSet.getString("calleDescripcion"), resultSet.getString("calleTipoVia"),
					UtilSQL.getLong(resultSet, "portalNumNORADesc"), resultSet.getString("portalBisNORADesc"),
					resultSet.getString("portalBloqueNORADesc"));

			informes.setDirecciones(direccion);

			InformeSocial informeSocial = new InformeSocial();
			informeSocial.setIdInfSocial02(UtilSQL.getLong(resultSet, "IDINFSOCIAL02"));
			informeSocial.setfInforme02(resultSet.getDate("FINFORME02"));
//			informeSocial.setAyuntamiento(ayuntamiento);
			informeSocial.setNombre02(resultSet.getString("NOMBRE02"));
			informeSocial.setApellido102(resultSet.getString("APELLIDO102"));
			informeSocial.setApellido202(resultSet.getString("APELLIDO202"));
			informeSocial.setIdentificador02(resultSet.getString("IDENTIFICADOR02"));
//			informeSocial.setUnidadBase02(resultSet.getString("UNIDADBASE02"));
//			informeSocial.setTelefono02(resultSet.getString("TELEFONO02"));
//			informeSocial.setEmail02(resultSet.getString("EMAIL02"));
			informeSocial.setSola02(UtilSQL.getInt(resultSet, "SOLA02"));
			informeSocial.setEstaSolaManana02(UtilSQL.getInt(resultSet, "ESTASOLAMANANA02"));
			informeSocial.setEstaSolaTarde02(UtilSQL.getInt(resultSet, "ESTASOLATARDE02"));
			informeSocial.setEstaSolaNoche02(UtilSQL.getInt(resultSet, "ESTASOLANOCHE02"));
			informeSocial.setRelacionEntorno02(UtilSQL.getInt(resultSet, "RELACIONENTORNO02"));
			informeSocial.setFamiliarFallecido02(UtilSQL.getInt(resultSet, "FAMILIARFALLECIDO02"));
			informeSocial.setVinculoFallecido02(resultSet.getString("VINCULOFALLECIDO02"));
			informeSocial.setVisitasFamilia02(UtilSQL.getInt(resultSet, "VISITASFAMILIA02"));
			informeSocial.setVisitasAmigos02(UtilSQL.getInt(resultSet, "VISITASAMIGOS02"));
			informeSocial.setFrecuenciaSalidas02(UtilSQL.getInt(resultSet, "FRECUENCIASALIDAS02"));
			informeSocial.setPeriodoSinVisitas02(UtilSQL.getInt(resultSet, "PERIODOSINVISITAS02"));
			informeSocial.setTiempoSinVisitas02(UtilSQL.getInt(resultSet, "TIEMPOSINVISITAS02"));
			informeSocial.setObservaciones02(resultSet.getString("OBSERVACIONES02"));
			informeSocial.setObservacionesPs02(resultSet.getString("OBSERVACIONESPS02"));
			informeSocial.setApreciacion02(UtilSQL.getInt(resultSet, "APRECIACION02"));
			informeSocial.setfAlta02(resultSet.getDate("FALTA02"));

//			if (UtilDAO.hasColumn(resultSet, "TIPOIDENTIFICADOR02")
//					&& null != resultSet.getObject("TIPOIDENTIFICADOR02")) {
//				informeSocial.setTipoIdentificador02(resultSet.getString("TIPOIDENTIFICADOR02"));
//			}
//			if (UtilDAO.hasColumn(resultSet, "IDENTIFICADOR02") && null != resultSet.getObject("IDENTIFICADOR02")) {
//				informeSocial.setIdentificador02(resultSet.getString("IDENTIFICADOR02"));
//			}
			informes.setInformeSocial(informeSocial);
			return informes;
		}
	};

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

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

			Informes informes = new Informes(UtilSQL.getLong(resultSet, "IDINFORME16"),
					resultSet.getString("TIPOINFORME16"), resultSet.getString("OBSERVACIONES16"),
					resultSet.getString("ESTADO16"), UtilSQL.getLong(resultSet, "IDBENEFICIARIO16"),
					UtilSQL.getLong(resultSet, "IDEXPEDIENTE16"), resultSet.getTimestamp("FINICIO16"),
					resultSet.getDate("FFIN16"), resultSet.getTimestamp("FENVIOADMON16"),
					UtilSQL.getInt(resultSet, "OCULTO16"), UtilSQL.getInt(resultSet, "ORIGEN16"),
					UtilSQL.getInt(resultSet, "URGENTE16"), resultSet.getString("USUALTA16"),
					resultSet.getString("USUMODIF16"), resultSet.getDate("FALTA16"), resultSet.getDate("FMODIF16"),
					new DocumentosInforme(UtilSQL.getLong(resultSet, "DocInfIDDOCINFORME17"),
							UtilSQL.getLong(resultSet, "DOCINFIDTIPODOC17"), resultSet.getString("DOCINFOID17"),
							resultSet.getString("DOCINFOIDDOKUSI17"), resultSet.getString("DOCINFURLRUTA17"),
							resultSet.getString("DOCINFUSUALTA17"), resultSet.getString("DOCINFUSUMODIF17"),
							resultSet.getDate("DOCINFFALTA17"), resultSet.getDate("DOCINFFMODIF17"),
							resultSet.getString("NOMBREDOC17")),
					new Usuarios(UtilSQL.getLong(resultSet, "IDUSUARIO80"), resultSet.getString("IDENTIFICADOR80"),
							resultSet.getString("NOMBRE80"), resultSet.getString("APELLIDOS80"),
							resultSet.getString("USUXLNETS80"), resultSet.getString("EMAIL80"),
							resultSet.getString("TLFNO80"), resultSet.getString("PUESTO80"),
							resultSet.getDate("FBAJA80"), resultSet.getDate("FALTA80"),
							resultSet.getString("USUALTA80"), resultSet.getDate("FMODIF80"),
							resultSet.getString("USUMODIF80")));

			// Datos del expediente relacionado
			Expedientes expediente = new Expedientes();
			expediente.setIdExpediente00(UtilSQL.getLong(resultSet, "IDEXPEDIENTE00"));
			expediente.setNumExpediente00(resultSet.getString("NUMEXPEDIENTE00"));
			expediente.setUrgencia00(UtilSQL.getInt(resultSet, "URGENCIA00"));
			expediente.setErrorExpediente00(UtilSQL.getInt(resultSet, "ERROREXPEDIENTE00"));

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

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

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Inserts a single row in the Informes table.
	 *
	 * @param informes Informes
	 * @return Informes
	 */
	public Informes add(Informes informes) {

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO INFORMES (ID_INFORME_16, ID_DOC_INFORME_16, ID_USUARIO_16, TIPO_INFORME_16, OBSERVACIONES_16, ESTADO_16, ID_BENEFICIARIO_16, ID_EXPEDIENTE_16, "
				+ "ID_AYUNTAMIENTO_16, UNIDAD_BASE_16, ID_UNIDAD_BASE_16, TELEFONO_16, EMAIL_16, "
				+ "F_INICIO_16, F_FIN_16, F_ENVIO_ADMON_16, OCULTO_16, ORIGEN_16, URGENTE_16, USU_ALTA_16, USU_MODIF_16, F_ALTA_16, F_MODIF_16) "
				+ "VALUES (" + SEQUENCE_INFORMES
				+ ".NEXTVAL,:idDocInforme,:idUsuario,:tipoInforme,:observa,:estado,:idBene,:idExp,"
				+ ":idAyuntamiento,:unidadBase,:idUnidadBase16,:telefono,:email,"
				+ "sysdate,:fFin,:fEnvioAdmon,:oculto,:origen,:urgente,:usuAlta,:usuModif,sysdate,:fModif)";
		Object getDocInfIDDOCINFORME17Aux = null;
		if (informes.getDocumentosInforme() != null && informes.getDocumentosInforme().getIdDocInforme17() != null) {
			getDocInfIDDOCINFORME17Aux = informes.getDocumentosInforme().getIdDocInforme17();
		}
		Object getIDUSUARIO80Aux = null;
		if (informes.getUsuario() != null && informes.getUsuario().getIdUsuario80() != null) {
			getIDUSUARIO80Aux = informes.getUsuario().getIdUsuario80();
		}

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("idDocInforme", getDocInfIDDOCINFORME17Aux).addValue("idUsuario", getIDUSUARIO80Aux)
				.addValue("tipoInforme", informes.getTipoInforme16()).addValue("observa", informes.getObservaciones16())
				.addValue("estado", informes.getEstado16())
				.addValue("idBene", informes.getSolicitantes().getIdSolicitante01())
				.addValue("idExp", informes.getIdExpediente16())
				.addValue("idAyuntamiento",
						informes.getAyuntamiento() != null ? informes.getAyuntamiento().getIdAyuntamiento31() : null)
				.addValue("unidadBase", informes.getUnidadBase16())
				.addValue("idUnidadBase16", informes.getIdUnidadBase16()).addValue("telefono", informes.getTelefono16())
				.addValue("email", informes.getEmail16()).addValue("fFin", informes.getfFin16())
				.addValue("fEnvioAdmon", informes.getfEnvioAdmon16()).addValue("oculto", informes.getOculto16())
				.addValue("origen", informes.getOrigen16()).addValue("urgente", informes.getUrgente16())
				.addValue("usuAlta", informes.getUsuAlta16()).addValue("usuModif", informes.getUsuModif16())
				.addValue("fModif", informes.getfModif16()).addValue("idInforme16", informes.getIdInforme16());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_INFORME_16" });
		informes.setIdInforme16(generatedKeyHolder.getKey().longValue());
		return informes;
	}

	public Informes addInformeSocial(Informes informes) {

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO INFORMES (ID_INFORME_16, ID_DOC_INFORME_16, ID_USUARIO_16, TIPO_INFORME_16, OBSERVACIONES_16, ESTADO_16, ID_BENEFICIARIO_16, ID_EXPEDIENTE_16, "
				+ "ID_AYUNTAMIENTO_16, UNIDAD_BASE_16, ID_UNIDAD_BASE_16, TELEFONO_16, EMAIL_16, "
				+ "F_INICIO_16, F_FIN_16, F_ENVIO_ADMON_16, OCULTO_16, ORIGEN_16, URGENTE_16, USU_ALTA_16, USU_MODIF_16, F_ALTA_16, F_MODIF_16 ) "
				+ "VALUES (" + SEQUENCE_INFORMES
				+ ".NEXTVAL,:idDocInforme,:idUsuario,:tipoInforme,:observa,:estado,:idBene,:idExp,"
				+ ":idAyuntamiento,:unidadBase,:idUnidadBase,:telefono,:email,"
				+ "sysdate,:fFin,:fEnvioAdmon,:oculto,:origen,:urgente,:usuAlta,:usuModif,sysdate,:fModif)";
		Object getDocInfIDDOCINFORME17Aux = null;
		if (informes.getDocumentosInforme() != null && informes.getDocumentosInforme().getIdDocInforme17() != null) {
			getDocInfIDDOCINFORME17Aux = informes.getDocumentosInforme().getIdDocInforme17();
		}

		// No se está usando
//		Object getIDUSUARIO80Aux = null;
//		if (informes.getUsuario() != null && informes.getUsuario().getIdUsuario80() != null) {
//			getIDUSUARIO80Aux = informes.getUsuario().getIdUsuario80();
//		}

		Object getIDAYUNTAMIENTO31Aux = null;
		if (informes.getAyuntamiento() != null && informes.getAyuntamiento().getIdAyuntamiento31() != null) {
			getIDAYUNTAMIENTO31Aux = informes.getAyuntamiento().getIdAyuntamiento31();
		}

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("idDocInforme", getDocInfIDDOCINFORME17Aux)
				.addValue("idUsuario", informes.getUsuario().getIdUsuario80())
				.addValue("tipoInforme", informes.getTipoInforme16()).addValue("observa", informes.getObservaciones16())
				.addValue("estado", informes.getEstado16())
				.addValue("idBene", informes.getSolicitantes().getIdSolicitante01())
				.addValue("idExp", informes.getIdExpediente16()).addValue("idAyuntamiento", getIDAYUNTAMIENTO31Aux)
				.addValue("unidadBase", informes.getUnidadBase16())
				.addValue("idUnidadBase", informes.getIdUnidadBase16()).addValue("telefono", informes.getTelefono16())
				.addValue("email", informes.getEmail16()).addValue("fFin", informes.getfFin16())
				.addValue("fEnvioAdmon", informes.getfEnvioAdmon16()).addValue("oculto", informes.getOculto16())
				.addValue("origen", informes.getOrigen16()).addValue("urgente", informes.getUrgente16())
				.addValue("usuAlta", informes.getUsuAlta16()).addValue("usuModif", informes.getUsuModif16())
				.addValue("fModif", informes.getfModif16())

				.addValue("idInforme16", informes.getIdInforme16());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_INFORME_16" });
		informes.setIdInforme16(generatedKeyHolder.getKey().longValue());
		return informes;
	}

	/**
	 * Updates a single row in the Informes table.
	 *
	 * @param informes Informes
	 * @return Informes
	 */
	public Informes update(Informes informes) {
		String query = "UPDATE INFORMES SET TIPO_INFORME_16=?, OBSERVACIONES_16=?, ESTADO_16=?, ID_BENEFICIARIO_16=?, ID_EXPEDIENTE_16=?, OCULTO_16=?, "
				+ "ORIGEN_16=?, URGENTE_16 = ?, F_FIN_16=?, F_ENVIO_ADMON_16=?, "
				+ "ID_AYUNTAMIENTO_16=?, UNIDAD_BASE_16=?, ID_UNIDAD_BASE_16=?, TELEFONO_16=?, EMAIL_16=? "
				+ "WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getTipoInforme16(), informes.getObservaciones16(),
				informes.getEstado16(), informes.getIdBeneficiario16(), informes.getIdExpediente16(),
				informes.getOculto16(), informes.getOrigen16(), informes.getUrgente16(), informes.getfFin16(),
				informes.getfEnvioAdmon16(), informes.getAyuntamiento().getIdAyuntamiento31(),
				informes.getUnidadBase16(), informes.getIdUnidadBase16(), informes.getTelefono16(),
				informes.getEmail16(), informes.getIdInforme16());

		if (informes.getInformeSocial() != null) {
			String queryInformeSocial = "UPDATE AD74A02T00 SET SOLA_02=?, ESTA_SOLA_MANANA_02=?, ESTA_SOLA_TARDE_02=?, ESTA_SOLA_NOCHE_02=?, RELACION_ENTORNO_02=?, "
					+ "FAMILIAR_FALLECIDO_02=?, VINCULO_FALLECIDO_02=?, VISITAS_FAMILIA_02=?, VISITAS_AMIGOS_02=?, FRECUENCIA_SALIDAS_02=?, PERIODO_SIN_VISITAS_02=?, TIEMPO_SIN_VISITAS_02=?, OBSERVACIONES_02=?, OBSERVACIONES_PS_02 = ?, "
					+ "APRECIACION_02=? WHERE ID_INF_SOCIAL_02 = ?";
			this.jdbcTemplate.update(queryInformeSocial, informes.getInformeSocial().getSola02(),
					informes.getInformeSocial().getEstaSolaManana02(), informes.getInformeSocial().getEstaSolaTarde02(),
					informes.getInformeSocial().getEstaSolaNoche02(),
					informes.getInformeSocial().getRelacionEntorno02(),
					informes.getInformeSocial().getFamiliarFallecido02(),
					informes.getInformeSocial().getVinculoFallecido02(),
					informes.getInformeSocial().getVisitasFamilia02(), informes.getInformeSocial().getVisitasAmigos02(),
					informes.getInformeSocial().getFrecuenciaSalidas02(),
					informes.getInformeSocial().getPeriodoSinVisitas02(),
					informes.getInformeSocial().getTiempoSinVisitas02(),
					informes.getInformeSocial().getObservaciones02(),
					informes.getInformeSocial().getObservacionesPs02(), informes.getInformeSocial().getApreciacion02(),
					informes.getIdInforme16());
		}

		return informes;
	}

	/**
	 * Updates a single row in the Informes related to and InformeSocial.
	 *
	 * @param informes Informes
	 * @return Informes
	 */
	public Informes updateInforme(Informes informes) {
		String query = "UPDATE INFORMES SET ID_BENEFICIARIO_16=?, ID_EXPEDIENTE_16=?, URGENTE_16 = ?, USU_MODIF_16=?, F_MODIF_16 = ?, ESTADO_16 = ?,  "
				+ "ID_AYUNTAMIENTO_16=?, UNIDAD_BASE_16=?, ID_UNIDAD_BASE_16=?, TELEFONO_16=?, EMAIL_16=? WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getSolicitantes().getIdSolicitante01(), informes.getIdExpediente16(),
				informes.getUrgente16(), informes.getUsuModif16(), informes.getfModif16(), informes.getEstado16(),
				informes.getUsuario().getAyuntamiento().getIdAyuntamiento31(), informes.getUnidadBase16(),
				informes.getIdUnidadBase16(), informes.getTelefono16(), informes.getEmail16(),
				informes.getIdInforme16());

		return informes;
	}

	/**
	 * Finds a single row in the Informes table.
	 *
	 * @param informes Informes
	 * @return Informes
	 */
	@Transactional(readOnly = true)
	public Informes find(Informes informes) {
		String query = "SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')),TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER,  t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
				+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
				+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16, t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
				+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
				+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17,  t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

				+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
				+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

				+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
				+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
				+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t7. ID_INF_SOCIAL_02 IDINFSOCIAL02, "
				+ "t7.F_INFORME_02 FINFORME02, "

//				+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
				+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

				+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, "
				+ "t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02,t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, "
				+ "t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, "
				+ "t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, "
				+ "t7.APRECIACION_02 APRECIACION02, t7.F_ALTA_02 FALTA02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02,  t7.IDENTIFICADOR_02 IDENTIFICADOR02,t7.NOMBRE_02 NOMBRE02,"
				+ "t7.APELLIDO1_02 APELLIDO102 , t7.APELLIDO2_02 APELLIDO202, "
				+ "t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
				+ "t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31, "
				+ "t10.ID_UNIDAD_BASE_92 IDUNIDADBASE92, t10.DESC_ES_92 DESCES92, t10.DESC_EU_92 DESCEU92 "

				+ "FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7, AYUNTAMIENTOS t8, T17_LOCALIDAD t9, UNIDADES_BASE t10"

				+ " WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
				// + "AND t1.ESTADO_16 <> 7 "
				+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+)  "
				+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) " + "AND t1.ID_INFORME_16 = ?";

		List<Informes> informesList = this.jdbcTemplate.query(query, this.rwMap, informes.getIdInforme16());
		return (Informes) DataAccessUtils.uniqueResult(informesList);
	}

	/**
	 * Removes a single row in the Informes table.
	 *
	 * @param informes Informes
	 * @return
	 */
	public void remove(Informes informes) {
		String query = "DELETE FROM INFORMES WHERE ID_INFORME_16=?";
		this.jdbcTemplate.update(query, informes.getIdInforme16());
	}

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

		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_INFORME_16 IDINFORME16, t1.TIPO_INFORME_16 TIPOINFORME16, t1.OBSERVACIONES_16 OBSERVACIONES16, t1.ESTADO_16 ESTADO16, t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16, t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16, t1.F_INICIO_16 FINICIO16, t1.F_FIN_16 FFIN16, t1.F_ENVIO_ADMON_16 FENVIOADMON16, t1.OCULTO_16 OCULTO16, t1.ORIGEN_16 ORIGEN16, t1.URGENTE_16 URGENTE16, t1.USU_ALTA_16 USUALTA16, t1.USU_MODIF_16 USUMODIF16, t1.F_ALTA_16 FALTA16, t1.F_MODIF_16 FMODIF16, t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17, t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17, t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, t2.URL_RUTA_17 DOCINFURLRUTA17, t2.USU_ALTA_17 DOCINFUSUALTA17, t2.USU_MODIF_17 DOCINFUSUMODIF17, t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, "

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80");

		query.append(" FROM INFORMES t1 , DOCUMENTOS_INFORME t2 , USUARIOS t3  ");
		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterInformes, startsWith);
		StringBuilder where = new StringBuilder(query + " WHERE 1=1 ");
		where.append(mapaWhere.get("query"));

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

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

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

	/**
	 * Finds a list of rows in the Informes table.
	 *
	 * @param informes        Informes
	 * @param tableRequestDto TableRequestDto
	 * @return List<Informes>
	 */
	@Transactional(readOnly = true)
	public List<Informes> findAll(Informes informes, TableRequestDto tableRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')),TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER,  t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t7. ID_INF_SOCIAL_02 IDINFSOCIAL02, "
						+ "t7.F_INFORME_02 FINFORME02, "

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, "
						+ "t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02,t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, "
						+ "t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, "
						+ "t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, "
						+ "t7.APRECIACION_02 APRECIACION02, t7.F_ALTA_02 FALTA02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02,  t7.IDENTIFICADOR_02 IDENTIFICADOR02 , t7.NOMBRE_02 NOMBRE02,"
						+ "t7.APELLIDO1_02 APELLIDO102 , t7.APELLIDO2_02 APELLIDO202, "
						+ "t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31,"
						+ "t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
						+ "t10.ID_UNIDAD_BASE_92 IDUNIDADBASE92, t10.DESC_ES_92 DESCES92, t10.DESC_EU_92 DESCEU92 ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7 , AYUNTAMIENTOS t8, T17_LOCALIDAD t9, UNIDADES_BASE t10");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(informes);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) "
						+ "AND t1.id_expediente_16 = t4.id_expediente_00(+) AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) "
						+ "AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// TODO: revisar si este tiene algún efecto secundario
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);
		List<?> params = (List<?>) mapaWhere.get("params");
		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query, InformesDaoImpl.ORDER_BY_WHITE_LIST);
		}
		return (List<Informes>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/**
	 * Finds a list of rows in the Informes table.
	 *
	 * @param informes        Informes
	 * @param tableRequestDto TableRequestDto
	 * @return List<Informes>
	 */
	@Transactional(readOnly = true)
	public List<Informes> findAllTodosEstados(Informes informes, TableRequestDto tableRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')),TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER,  t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t7. ID_INF_SOCIAL_02 IDINFSOCIAL02, "
						+ "t7.F_INFORME_02 FINFORME02, "

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, "
						+ "t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02,t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, "
						+ "t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, "
						+ "t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, "
						+ "t7.APRECIACION_02 APRECIACION02, t7.F_ALTA_02 FALTA02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02,  t7.IDENTIFICADOR_02 IDENTIFICADOR02 , t7.NOMBRE_02 NOMBRE02,"
						+ "t7.APELLIDO1_02 APELLIDO102 , t7.APELLIDO2_02 APELLIDO202, t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31,"
						+ "t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
						+ "t10.ID_UNIDAD_BASE_92 IDUNIDADBASE92, t10.DESC_ES_92 DESCES92, t10.DESC_EU_92 DESCEU92 ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7 , AYUNTAMIENTOS t8, T17_LOCALIDAD t9, UNIDADES_BASE t10");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(informes);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) "
						+ "AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);
		List<?> params = (List<?>) mapaWhere.get("params");
		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query, InformesDaoImpl.ORDER_BY_WHITE_LIST);
		}
		return (List<Informes>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/**
	 * Finds rows in the Informes table using like.
	 *
	 * @param informes        Informes
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<Informes>
	 */
	@Transactional(readOnly = true)
	public List<Informes> findAllLike(Informes informes, TableRequestDto tableRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')),TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER, t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, "
						+ "t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t7. ID_INF_SOCIAL_02 IDINFSOCIAL02, "
						+ "t7.F_INFORME_02 FINFORME02, "

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, "
						+ "t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02,t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, "
						+ "t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, "
						+ "t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, "
						+ "t7.APRECIACION_02 APRECIACION02, t7.F_ALTA_02 FALTA02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02,  t7.IDENTIFICADOR_02 IDENTIFICADOR02, t7.NOMBRE_02 NOMBRE02, "
						+ "t7.APELLIDO1_02 APELLIDO102 , t7.APELLIDO2_02 APELLIDO202, t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, "
						+ "t9.DS_O DSO, t6.CP_06 CP06, t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31,   "
						+ "t10.ID_UNIDAD_BASE_92 IDUNIDADBASE92, t10.DESC_ES_92 DESCES92, t10.DESC_EU_92 DESCEU92 ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6 ,AYUNTAMIENTOS T8, INFORME_SOCIAL t7, T17_LOCALIDAD t9, UNIDADES_BASE t10");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(informes, startsWith);
		StringBuilder where = new StringBuilder(
				"  WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		/* AND t7.id_informe_02=t1.id_informe_16(+) */
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

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

	@Transactional(readOnly = true)
	public List<Informes> findAllLikePorUsuario(Informes informes, TableRequestDto tableRequestDto, Boolean startsWith,
			Integer usuario) {
		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')), TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER, "
						+ " t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, "
						+ "t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00,  t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31,"
						+ "t7.ID_INF_SOCIAL_02 IDINFSOCIAL02, t7.F_INFORME_02 FINFORME02,"

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02, t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, t7.APRECIACION_02 APRECIACION02, t7.ID_INFORME_02 IDINFORME02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02, t7.IDENTIFICADOR_02 IDENTIFICADOR02, t7.NOMBRE_02 NOMBRE02, t7.APELLIDO1_02 APELLIDO102, t7.APELLIDO2_02 APELLIDO202, t7.F_ALTA_02 FALTA02,"

						+ "t6.ID_DIRECCION_06 DIRECCIONESIDDIRECCION06,t6.CALLE_06 DIRECCIONESCALLE06,t6.CP_06 DIRECCIONESCP06,t6.ID_CALLE_06 DIRECCIONESIDCALLE06,t6.ID_LOCALIDAD_06 DIRECCIONESIDLOCALIDAD06,t6.ID_MUNICIPIO_06 DIRECCIONESIDMUNICIPIO06,t6.ID_PAIS_06 DIRECCIONESIDPAIS06,t6.ID_PORTAL_06 DIRECCIONESIDPORTAL06,t6.ID_PROVINCIA_06 DIRECCIONESIDPROVINCIA06,t6.LETRA_06 DIRECCIONESLETRA06,t6.LOCALIDAD_06 DIRECCIONESLOCALIDAD06,t6.MUNICIPIO_06 DIRECCIONESMUNICIPIO06,t6.PAIS_06 DIRECCIONESPAIS06,t6.PISO_06 DIRECCIONESPISO06,t6.PORTAL_06 DIRECCIONESPORTAL06,t6.ESCALERA_06 DIRECCIONESESCALERA06, t6.PROVINCIA_06 DIRECCIONESPROVINCIA06,t6.ID_SOLICITANTE_06 DIRECCIONESIDSOLICITANTE06, t6.USU_HISTORICO_06 DIRECCIONESUSUHISTORICO06, t6.F_HISTORICO_06 DIRECCIONESFHISTORICO06, t6.F_ALTA_06 DIRECCIONESFALTA06,t6.USU_ALTA_06 DIRECCIONESUSUALTA06, "
						+ "t10.ds_e provincianoradesceu, t10.ds_c provincianoradesces,"//
						+ "t11.DS_O municipionoradesc," //
						+ "t12.TIPO_VIA calleTipoVia,t12.ds_o calleDescripcion," //
						+ "t9.DS_O localidadNORADesc, " //
						+ "t13.NUMERO portalNumNORADesc,t13.BIS portalBisNORADesc,t13.BLOQUE portalBloqueNORADesc , t14.ds_o municipioAyuntamiento ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6 , AYUNTAMIENTOS T8, INFORME_SOCIAL t7, "
						+ "T17_LOCALIDAD t9, T17_PROVINCIA t10, T17_MUNICIPIO t11, T17_CALLE t12, T17_PORTAL t13, t17_municipio t14 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapPorUsuarios(informes, startsWith, usuario);
		StringBuilder where = new StringBuilder(
				"  WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// TODO: ver si este cambio tiene efectos colaterales
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ " AND t6.ID_PROVINCIA_06 = t10.ID(+) AND (t6.ID_MUNICIPIO_06=t11.ID(+) AND t6.ID_PROVINCIA_06=t11.PROVINCIA_ID(+)) "
						+ " AND t6.ID_CALLE_06 = t12.id(+) AND t6.id_provincia_06 = t12.provincia_id(+) AND t6.id_municipio_06 = t12.municipio_id(+) "
						+ " AND t6.ID_LOCALIDAD_06 = t9.id(+) AND t6.id_provincia_06 = t9.PROVINCIA_ID(+) AND t6.id_municipio_06 = t9.MUNICIPIO_ID(+) "
						+ " AND t6.ID_PORTAL_06 = t13.id(+) AND t6.id_calle_06 = t13.CALLE_ID(+)"
						+ " AND t8.ID_MUNICIPIO_31 = t14.ID(+) AND t8.ID_PROVINCIA_31 = t14.PROVINCIA_ID (+)");

		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

		List<Informes> listainformes = (List<Informes>) this.jdbcTemplate.query(query.toString(),
				this.rwMapInformeSocial, params.toArray());

		return listainformes;
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the Informes table.
	 *
	 * @param informes Informes
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(Informes informes) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7 , AYUNTAMIENTOS t8, T17_LOCALIDAD t9, UNIDADES_BASE t10 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(informes);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		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 Informes table.
	 *
	 * @param informes Informes
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllTodosEstadosCount(Informes informes) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7 , AYUNTAMIENTOS t8, T17_LOCALIDAD t9, UNIDADES_BASE t10 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(informes);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		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 Informes table using like.
	 *
	 * @param informes   Informes
	 * @param startsWith Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Informes informes, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, INFORME_SOCIAL t7, T17_LOCALIDAD t9, UNIDADES_BASE t10");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(informes, startsWith);
		StringBuilder where = new StringBuilder(
				"  WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ "AND t1.id_unidad_base_16 = t10.id_unidad_base_92 (+) ");
		query.append(where);

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

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

	@Transactional(readOnly = true)
	public Long findAllLikeCountPorUsuario(Informes informes, Boolean startsWith, Integer usuario) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6 , AYUNTAMIENTOS T8, INFORME_SOCIAL t7, T17_LOCALIDAD t9, T17_PROVINCIA t10, T17_MUNICIPIO t11, T17_CALLE t12, T17_PORTAL t13");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapPorUsuarios(informes, startsWith, usuario);
		StringBuilder where = new StringBuilder(
				"  WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) "
						+ " AND t6.ID_PROVINCIA_06 = t10.ID(+) AND (t6.ID_MUNICIPIO_06=t11.ID(+) AND t6.ID_PROVINCIA_06=t11.PROVINCIA_ID(+)) "
						+ " AND t6.ID_CALLE_06 = t12.id(+) AND t6.id_provincia_06 = t12.provincia_id(+) AND t6.id_municipio_06 = t12.municipio_id(+) "
						+ " AND t6.ID_LOCALIDAD_06 = t9.id(+) AND t6.id_provincia_06 = t9.PROVINCIA_ID(+) AND t6.id_municipio_06 = t9.MUNICIPIO_ID(+) "
						+ " AND t6.ID_PORTAL_06 = t13.id(+) AND t6.id_calle_06 = t13.CALLE_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);
	}

	/**
	 * Reorder the data list of Informes selected for rup_table
	 *
	 * @param informes        Informes
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Informes>>
	 */
	@Override
	public List<TableRowDto<Informes>> reorderSelection(Informes informes, TableRequestDto tableRequestDto,
			Boolean startsWith, Integer usuario) {

		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER,  NVL2(t1.ID_BENEFICIARIO_16,TRIM(NVL(t5.NOMBRE_01, '') || ' ' || NVL(t5.APELLIDO1_01, '') || ' ' || NVL(t5.APELLIDO2_01, '')), TRIM(NVL(t7.NOMBRE_02, '') || ' ' || NVL(t7.APELLIDO1_02, '') || ' ' || NVL(t7.APELLIDO2_02, ''))) NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER, "
						+ " t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, "
						+ "t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00,  t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t8.ID_AYUNTAMIENTO_31 IDAYUNTAMIENTO31, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31,"
						+ "t7.ID_INF_SOCIAL_02 IDINFSOCIAL02, t7.F_INFORME_02 FINFORME02,"

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02, t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, t7.APRECIACION_02 APRECIACION02, t7.ID_INFORME_02 IDINFORME02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02, t7.IDENTIFICADOR_02 IDENTIFICADOR02, t7.NOMBRE_02 NOMBRE02, t7.APELLIDO1_02 APELLIDO102, t7.APELLIDO2_02 APELLIDO202, t7.F_ALTA_02 FALTA02 ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6 , AYUNTAMIENTOS T8, INFORME_SOCIAL t7, T17_LOCALIDAD t9");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapPorUsuarios(informes, startsWith, usuario);
		StringBuilder where = new StringBuilder(
				"  WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) ");

		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, Informes.class,
				filterParamList, "IDINFORME16");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Informes
	 * @param searchParams    Informes
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<Informes>>
	 */
	@Override
	public List<TableRowDto<Informes>> search(Informes filterParams, Informes searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER, t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16,t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16,t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16,t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17,t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17,t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17, NOMBREAPELLIDOS_FILTER, TRIM(NVL(t3.NOMBRE_80, '') || ' ' || NVL(t3.APELLIDOS_80, '')) NOMBRE_TRS_FILTER, "

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80 ");

		// FROM
		query.append("FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, INFORME_SOCIAL t7 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.IS_USUARIO_16= t3.ID_USUARIO_80(+) AND ID_INFORME_16 = ID_INFORME_02(+) ");
		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, Informes.class,
				filterParamList, searchSQL, searchParamList, from_alias, "IDINFORME16");

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

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

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

	/**
	 * Filter in the hierarchical Informes table.
	 *
	 * @param filterInformes  Informes
	 * @param tableRequestDto TableRequestDto
	 * @return List<JerarquiaDto<Informes>>
	 */
	@Override
	public List<JerarquiaDto<Informes>> findAllLikeJerarquia(Informes filterInformes, TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16,t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16,t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16,t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17,t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17,t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80 "

		);
		// FROM
		// StringBuilder from = new StringBuilder("FROM INFORMES t1 ,DOCUMENTOS_INFORME
		// t2 ,USUARIOS t3 ");
		List<String> from = new ArrayList<String>();
		from.add("INFORMES");
		from.add("DOCUMENTOS_INFORME");
		from.add("USUARIOS");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

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

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

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

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada por
		// defecto (ID_PADRE)
		query = TableManagerJerarquia.getQuery(tableRequestDto, query, mapaWhere, "IDINFORME16", "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,
					InformesDaoImpl.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 filterInformes  Informes
	 * @param tableRequestDto TableRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(Informes filterInformes, TableRequestDto tableRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM INFORMES t1 ,DOCUMENTOS_INFORME
		// t2 ,USUARIOS t3 ");
		List<String> from = new ArrayList<String>();
		from.add("INFORMES");
		from.add("DOCUMENTOS_INFORME");
		from.add("USUARIOS");

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

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

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

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

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

		// FROM
		// StringBuilder from = new StringBuilder("FROM INFORMES t1 ,DOCUMENTOS_INFORME
		// t2 ,USUARIOS t3 ");
		List<String> from = new ArrayList<String>();
		from.add("INFORMES");
		from.add("DOCUMENTOS_INFORME");
		from.add("USUARIOS");

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

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

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

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

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

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (informes != null && informes.getIdInforme16() != null) {
			where.append(" AND t1.ID_INFORME_16 = ?");
			params.add(informes.getIdInforme16());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getIdDocInforme17() != null) {
			where.append(" AND t2.ID_DOC_INFORME_17 = ?");
			params.add(informes.getDocumentosInforme().getIdDocInforme17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getIdTipoDoc17() != null) {
			where.append(" AND t2.ID_TIPO_DOC_17 = ?");
			params.add(informes.getDocumentosInforme().getIdTipoDoc17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getOid17() != null) {
			where.append(" AND t2.OID_17 = ?");
			params.add(informes.getDocumentosInforme().getOid17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getOidDokusi17() != null) {
			where.append(" AND t2.OID_DOKUSI_17 = ?");
			params.add(informes.getDocumentosInforme().getOidDokusi17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUrlRuta17() != null) {
			where.append(" AND t2.URL_RUTA_17 = ?");
			params.add(informes.getDocumentosInforme().getUrlRuta17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuAlta17() != null) {
			where.append(" AND t2.USU_ALTA_17 = ?");
			params.add(informes.getDocumentosInforme().getUsuAlta17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuModif17() != null) {
			where.append(" AND t2.USU_MODIF_17 = ?");
			params.add(informes.getDocumentosInforme().getUsuModif17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfAlta17() != null) {
			where.append(" AND t2.F_ALTA_17 = ?");
			params.add(informes.getDocumentosInforme().getfAlta17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfModif17() != null) {
			where.append(" AND t2.F_MODIF_17 = ?");
			params.add(informes.getDocumentosInforme().getfModif17());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdUsuario80() != null) {
			where.append(" AND t3.ID_USUARIO_80 = ?");
			params.add(informes.getUsuario().getIdUsuario80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getNombre80() != null) {
			where.append(" AND t3.NOMBRE_80 = ?");
			params.add(informes.getUsuario().getNombre80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getApellidos80() != null) {
			where.append(" AND t3.APELLIDOS_80 = ?");
			params.add(informes.getUsuario().getApellidos80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdentificador80() != null) {
			where.append(" AND UPPER(t3.IDENTIFICADOR_80) = (?)");
			params.add(informes.getUsuario().getIdentificador80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfAlta80() != null) {
			where.append(" AND t3.F_ALTA_80 = ?");
			params.add(informes.getUsuario().getfAlta80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuAlta80() != null) {
			where.append(" AND t3.USU_ALTA_80 = ?");
			params.add(informes.getUsuario().getUsuAlta80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfModif80() != null) {
			where.append(" AND t3.F_MODIF_80 = ?");
			params.add(informes.getUsuario().getfModif80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuModif80() != null) {
			where.append(" AND t3.USU_MODIF_80 = ?");
			params.add(informes.getUsuario().getUsuModif80());
		}
		if (informes != null && informes.getTipoInforme16() != null) {
			where.append(" AND t1.TIPO_INFORME_16 = ?");
			params.add(informes.getTipoInforme16());
		}
		if (informes != null && informes.getObservaciones16() != null) {
			where.append(" AND t1.OBSERVACIONES_16 = ?");
			params.add(informes.getObservaciones16());
		}
		if (informes != null && informes.getEstado16() != null) {
			where.append(" AND t1.ESTADO_16 = ?");
			params.add(informes.getEstado16());
		}
		if (informes != null && informes.getIdBeneficiario16() != null) {
			where.append(" AND t1.ID_BENEFICIARIO_16 = ?");
			params.add(informes.getIdBeneficiario16());
		}
		if (informes != null && informes.getIdExpediente16() != null) {
			where.append(" AND t1.ID_EXPEDIENTE_16 = ?");
			params.add(informes.getIdExpediente16());
		}
		if (informes != null && informes.getfInicio16() != null) {
			where.append(" AND t1.F_INICIO_16 = ?");
			params.add(informes.getfInicio16());
		}
		if (informes != null && informes.getfFin16() != null) {
			where.append(" AND t1.F_FIN_16 = ?");
			params.add(informes.getfFin16());
		}
		if (informes != null && informes.getfEnvioAdmon16() != null) {
			where.append(" AND t1.F_ENVIO_ADMON_16 = ?");
			params.add(informes.getfEnvioAdmon16());
		}
		if (informes != null && informes.getOculto16() != null) {
			where.append(" AND (t1.OCULTO_16 = 0 OR t1.OCULTO_16 IS NULL)");
			params.add(informes.getOculto16());
		}
		if (informes != null && informes.getOrigen16() != null) {
			where.append(" AND t1.ORIGEN_16 = ?");
			params.add(informes.getOrigen16());
		}
		if (informes != null && informes.getUrgente16() != null) {
			where.append(" AND t1.URGENTE_16 = ?");
			params.add(informes.getUrgente16());
		}
		if (informes != null && informes.getUsuAlta16() != null) {
			where.append(" AND t1.USU_ALTA_16 = ?");
			params.add(informes.getUsuAlta16());
		}
		if (informes != null && informes.getUsuModif16() != null) {
			where.append(" AND t1.USU_MODIF_16 = ?");
			params.add(informes.getUsuModif16());
		}
		if (informes != null && informes.getfAlta16() != null) {
			where.append(" AND t1.F_ALTA_16 = ?");
			params.add(informes.getfAlta16());
		}
		if (informes != null && informes.getfModif16() != null) {
			where.append(" AND t1.F_MODIF_16 = ?");
			params.add(informes.getfModif16());
		}

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

		return mapWhere;
	}

	private Map<String, ?> getWhereMapSoloId(Informes informes) {

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

		if (informes != null && informes.getIdInforme16() != null) {
			where.append(" AND t1.ID_INFORME_16 = ?");
			params.add(informes.getIdInforme16());
		}
		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
	 * Informes entity
	 *
	 * @param informes   Informes 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(Informes informes, Boolean startsWith) {

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

		if (informes != null && informes.getIdInforme16() != null) {
			where.append(" AND t1.ID_INFORME_16 = ?");
			params.add(informes.getIdInforme16());
		}

		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuAlta17() != null) {
			where.append(" AND UPPER(t2.USU_ALTA_17) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getDocumentosInforme().getUsuAlta17().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getDocumentosInforme().getUsuAlta17().toUpperCase() + "%");
			}
			where.append(" AND t2.USU_ALTA_17 IS NOT NULL");
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuModif17() != null) {
			where.append(" AND UPPER(t2.USU_MODIF_17) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getDocumentosInforme().getUsuModif17().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getDocumentosInforme().getUsuModif17().toUpperCase() + "%");
			}
			where.append(" AND t2.USU_MODIF_17 IS NOT NULL");
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfAlta17() != null) {
			where.append(" AND t2.F_ALTA_17 = ?");
			params.add(informes.getDocumentosInforme().getfAlta17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfModif17() != null) {
			where.append(" AND t2.F_MODIF_17 = ?");
			params.add(informes.getDocumentosInforme().getfModif17());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdUsuario80() != null) {
			where.append(" AND t3.ID_USUARIO_80 = ?");
			params.add(informes.getUsuario().getIdUsuario80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getNombre80() != null) {
			where.append(" AND UPPER(t3.NOMBRE_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getNombre80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getNombre80().toUpperCase() + "%");
			}
			where.append(" AND t3.NOMBRE_80 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getApellidos80() != null) {
			where.append(" AND UPPER(t3.APELLIDOS_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getApellidos80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getApellidos80().toUpperCase() + "%");
			}
			where.append(" AND t3.APELLIDOS_80 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdentificador80() != null) {
			where.append(" AND UPPER(t3.IDENTIFICADOR_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getIdentificador80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getIdentificador80().toUpperCase() + "%");
			}
			where.append(" AND t3.IDENTIFICADOR_380 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfAlta80() != null) {
			where.append(" AND t3.F_ALTA_80 = ?");
			params.add(informes.getUsuario().getfAlta80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuAlta80() != null) {
			where.append(" AND UPPER(t3.USU_ALTA_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getUsuAlta80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getUsuAlta80().toUpperCase() + "%");
			}
			where.append(" AND t3.USU_ALTA_380 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfModif80() != null) {
			where.append(" AND t3.F_MODIF_80 = ?");
			params.add(informes.getUsuario().getfModif80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuModif80() != null) {
			where.append(" AND UPPER(t3.USU_MODIF_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getUsuModif80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getUsuModif80().toUpperCase() + "%");
			}
			where.append(" AND t3.USU_MODIF_80 IS NOT NULL");
		}
		if (informes != null && informes.getTipoInforme16() != null) {
			where.append(" AND UPPER(t1.TIPO_INFORME_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getTipoInforme16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getTipoInforme16().toUpperCase() + "%");
			}
			where.append(" AND t1.TIPO_INFORME_16 IS NOT NULL");
		}
		if (informes != null && informes.getObservaciones16() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getObservaciones16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getObservaciones16().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES_16 IS NOT NULL");
		}
		if (informes != null && informes.getEstado16() != null) {
			where.append(" AND UPPER(t1.ESTADO_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getEstado16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getEstado16().toUpperCase() + "%");
			}
			where.append(" AND t1.ESTADO_16 IS NOT NULL");
		}
		if (informes != null && informes.getIdBeneficiario16() != null) {
			where.append(" AND t1.ID_BENEFICIARIO_16 = ?");
			params.add(informes.getIdBeneficiario16());
		}
		if (informes != null && informes.getExpedientes() != null
				&& informes.getExpedientes().getNumExpediente00() != null) {
			where.append(" AND t4.NUM_EXPEDIENTE_00 LIKE ?");
			params.add(informes.getExpedientes().getNumExpediente00());
		}

		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getIdentificador01() != null) {
			where.append(" AND UPPER(t5.IDENTIFICADOR_01) LIKE UPPER(?) ESCAPE  '\\'");
			params.add(informes.getSolicitantes().getIdentificador01());
		}
		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getNombre01() != null) {
			where.append(" AND t5.NOMBRE_01 = ?");
			params.add(informes.getSolicitantes().getNombre01());
		}
		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getDirecciones() != null
				&& informes.getSolicitantes().getDirecciones().getCalle06() != null) {
			where.append(" AND UPPER(t6.CALLE_06) LIKE ? ESCAPE  '\\'");
			params.add(informes.getSolicitantes().getDirecciones().getCalle06().toUpperCase() + "%");
		}
		if (informes != null && informes.getfInicio16() != null) {
			where.append(" AND t1.F_INICIO_16 >= ?");
			params.add(informes.getfInicio16());
		}
		if (informes != null && informes.getfFin16() != null) {
			where.append(" AND t1.F_FIN_16 <= ?");
			params.add(informes.getfFin16());
		}
		if (informes != null && informes.getfEnvioAdmon16() != null) {
			where.append(" AND TRUCN(t1.F_ENVIO_ADMON_16) = TRUNC(?)");
			params.add(informes.getfEnvioAdmon16());
		}
		if (informes != null && informes.getMostrarOcultos() == null) {
			where.append(" AND (t1.OCULTO_16 = 0 OR t1.OCULTO_16 IS NULL)");
		}
		if (informes != null && informes.getOrigen16() != null) {
			where.append(" AND t1.ORIGEN_16 = ?");
			params.add(informes.getOrigen16());
		}
		if (informes != null && informes.getUrgente16() != null) {
			where.append(" AND t1.URGENTE_16 = ?");
			params.add(informes.getUrgente16());
		}
		if (informes != null && informes.getUsuAlta16() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuAlta16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuAlta16().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_16 IS NOT NULL");
		}
		if (informes != null && informes.getUsuModif16() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuModif16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuModif16().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_MODIF_16 IS NOT NULL");
		}
		if (informes != null && informes.getfAlta16() != null) {
			where.append(" AND t1.F_ALTA_16 = ?");
			params.add(informes.getfAlta16());
		}
		if (informes != null && informes.getfModif16() != null) {
			where.append(" AND t1.F_MODIF_16 = ?");
			params.add(informes.getfModif16());
		}

		// Para hacer matching desde las bandejas de entrada
		if (informes != null && informes.getInformeSocial() != null
				&& informes.getInformeSocial().getIdentificador02() != null && informes.getMatch() != null
				&& informes.getMatch()) {
			where.append(" AND UPPER(IDENTIFICADOR_02) LIKE UPPER(?) ESCAPE  '\\'");
			params.add(informes.getInformeSocial().getIdentificador02());

		}

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

		return mapWhere;
	}

	private Map<String, Object> getWhereLikeMapPorUsuarios(Informes informes, Boolean startsWith, Integer usuario) {

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

		if (informes != null && informes.getIdInforme16() != null) {
			where.append(" AND t1.ID_INFORME_16 = ?");
			params.add(informes.getIdInforme16());
		}

		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuAlta17() != null) {
			where.append(" AND UPPER(t2.USU_ALTA_17) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getDocumentosInforme().getUsuAlta17().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getDocumentosInforme().getUsuAlta17().toUpperCase() + "%");
			}
			where.append(" AND t2.USU_ALTA_17 IS NOT NULL");
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getUsuModif17() != null) {
			where.append(" AND UPPER(t2.USU_MODIF_17) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getDocumentosInforme().getUsuModif17().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getDocumentosInforme().getUsuModif17().toUpperCase() + "%");
			}
			where.append(" AND t2.USU_MODIF_17 IS NOT NULL");
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfAlta17() != null) {
			where.append(" AND t2.F_ALTA_17 = ?");
			params.add(informes.getDocumentosInforme().getfAlta17());
		}
		if (informes != null && informes.getDocumentosInforme() != null
				&& informes.getDocumentosInforme().getfModif17() != null) {
			where.append(" AND t2.F_MODIF_17 = ?");
			params.add(informes.getDocumentosInforme().getfModif17());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdUsuario80() != null) {
			where.append(" AND t3.ID_USUARIO_80 = ?");
			params.add(informes.getUsuario().getIdUsuario80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getNombre80() != null) {
			where.append(" AND UPPER(t3.NOMBRE_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getNombre80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getNombre80().toUpperCase() + "%");
			}
			where.append(" AND t3.NOMBRE_80 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getApellidos80() != null) {
			where.append(" AND UPPER(t3.APELLIDOS_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getApellidos80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getApellidos80().toUpperCase() + "%");
			}
			where.append(" AND t3.APELLIDOS_80 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getIdentificador80() != null) {
			where.append(" AND UPPER(t3.IDENTIFICADOR_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getIdentificador80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getIdentificador80().toUpperCase() + "%");
			}
			where.append(" AND t3.IDENTIFICADOR_380 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfAlta80() != null) {
			where.append(" AND t3.F_ALTA_80 = ?");
			params.add(informes.getUsuario().getfAlta80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuAlta80() != null) {
			where.append(" AND UPPER(t3.USU_ALTA_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getUsuAlta80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getUsuAlta80().toUpperCase() + "%");
			}
			where.append(" AND t3.USU_ALTA_380 IS NOT NULL");
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getfModif80() != null) {
			where.append(" AND t3.F_MODIF_80 = ?");
			params.add(informes.getUsuario().getfModif80());
		}
		if (informes != null && informes.getUsuario() != null && informes.getUsuario().getUsuModif80() != null) {
			where.append(" AND UPPER(t3.USU_MODIF_80) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuario().getUsuModif80().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuario().getUsuModif80().toUpperCase() + "%");
			}
			where.append(" AND t3.USU_MODIF_80 IS NOT NULL");
		}
		if (informes != null && informes.getTipoInforme16() != null) {
			where.append(" AND UPPER(t1.TIPO_INFORME_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getTipoInforme16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getTipoInforme16().toUpperCase() + "%");
			}
			where.append(" AND t1.TIPO_INFORME_16 IS NOT NULL");
		}
		if (informes != null && informes.getObservaciones16() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getObservaciones16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getObservaciones16().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES_16 IS NOT NULL");
		}
		if (informes != null && informes.getEstado16() != null) {

			if (EstadoInformesEnum.EN_TRAMITACION.getId().equalsIgnoreCase(informes.getEstado16())) {
				where.append(" AND UPPER(t1.ESTADO_16) IN (?, ?, ?, ?)");
				params.add(EstadoInformesEnum.SOLICITADO_PROVEEDOR.getId());
				params.add(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
				params.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getId());
				params.add(EstadoInformesEnum.ENVIADO.getId());
			} else {
				where.append(" AND UPPER(t1.ESTADO_16) like ? ESCAPE  '\\'");
				if (startsWith) {
					params.add(informes.getEstado16().toUpperCase() + "%");
				} else {
					params.add("%" + informes.getEstado16().toUpperCase() + "%");
				}
			}

			where.append(" AND t1.ESTADO_16 IS NOT NULL");
		}
		if (informes != null && informes.getIdBeneficiario16() != null) {
			where.append(" AND t1.ID_BENEFICIARIO_16 = ?");
			params.add(informes.getIdBeneficiario16());
		}
		if (informes != null && informes.getExpedientes() != null
				&& informes.getExpedientes().getNumExpediente00() != null) {
			where.append(" AND t4.NUM_EXPEDIENTE_00 LIKE ?");
			params.add("%" + informes.getExpedientes().getNumExpediente00() + "%");
		}

		if (informes != null && informes.getIdExpediente16() != null) {
			where.append(" AND t4.ID_EXPEDIENTE_00 = ?");
			params.add(informes.getIdExpediente16());
		}

		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getIdentificador01() != null) {
			where.append(
					" AND ( UPPER(t5.IDENTIFICADOR_01) LIKE UPPER(?) ESCAPE  '\\' OR UPPER(t7.IDENTIFICADOR_02) LIKE UPPER(?) ESCAPE  '\\')");
			params.add("%" + informes.getSolicitantes().getIdentificador01() + "%");
			params.add("%" + informes.getSolicitantes().getIdentificador01() + "%");
		}
		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getNombre01() != null) {
			where.append(" AND t5.NOMBRE_01 LIKE ? ESCAPE  '\\'");
			params.add(informes.getSolicitantes().getNombre01() + "%");
		}
		if (informes != null && informes.getSolicitantes() != null
				&& informes.getSolicitantes().getDirecciones() != null
				&& informes.getSolicitantes().getDirecciones().getCalle06() != null) {
			where.append(" AND UPPER(t6.CALLE_06) LIKE ? ESCAPE  '\\'");
			params.add(informes.getSolicitantes().getDirecciones().getCalle06().toUpperCase() + "%");
		}
		if (informes != null && informes.getfInicio16() != null) {
			where.append(" AND t1.F_INICIO_16 >= ?");
			params.add(informes.getfInicio16());
		}
		if (informes != null && informes.getfFin16() != null) {
			where.append(" AND t1.F_FIN_16 <= ?");
			params.add(informes.getfFin16());
		}
		if (informes != null && informes.getfEnvioAdmon16() != null) {
			// where.append(" AND t1.F_ENVIO_ADMON_16 = ?");
			where.append(" AND TRUNC(t1.F_ENVIO_ADMON_16) = TRUNC(?, 'DD')");
			params.add(informes.getfEnvioAdmon16());
		}
		if (informes != null && informes.getMostrarOcultos() == null) {
			where.append(" AND (t1.OCULTO_16 = 0 OR t1.OCULTO_16 IS NULL)");
		}
		if (informes != null && informes.getOrigen16() != null) {
			where.append(" AND t1.ORIGEN_16 = ?");
			params.add(informes.getOrigen16());
		}
		if (informes != null && informes.getUrgente16() != null) {
			where.append(" AND t1.URGENTE_16 = ?");
			params.add(informes.getUrgente16());
		}
		if (informes != null && informes.getUsuAlta16() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuAlta16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuAlta16().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_16 IS NOT NULL");
		}
		if (informes != null && informes.getUsuModif16() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_16) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(informes.getUsuModif16().toUpperCase() + "%");
			} else {
				params.add("%" + informes.getUsuModif16().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_MODIF_16 IS NOT NULL");
		}
		if (informes != null && informes.getfAlta16() != null) {
			where.append(" AND t1.F_ALTA_16 = ?");
			params.add(informes.getfAlta16());
		}
		if (informes != null && informes.getfModif16() != null) {
			where.append(" AND t1.F_MODIF_16 = ?");
			params.add(informes.getfModif16());
		}

		// DSS, Director
		if (usuario == ActoresEnum.DSS.getId().intValue() || usuario == ActoresEnum.ADMIN.getId().intValue()) {
			where.append(" AND (");

			where.append(" (t1.TIPO_INFORME_16 = ? AND t1.ESTADO_16 = ?) ");
			params.add(TipoInformesEnum.INFSOC.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(
					" OR (t1.TIPO_INFORME_16 = ? AND (t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ?)) ");
			params.add(TipoInformesEnum.INFINT.getId());
			params.add(EstadoInformesEnum.SOLICITADO.getId());
			params.add(EstadoInformesEnum.SOLICITADO_PROVEEDOR.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(" OR (t1.TIPO_INFORME_16 = ? AND t1.ESTADO_16 = ?) ");
			params.add(TipoInformesEnum.INFSUM.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(")");
		}
		// PS
		if (usuario == ActoresEnum.PS.getId().intValue()) {
			where.append(" AND (");

			where.append(" (t1.TIPO_INFORME_16 = ? AND (t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ?)) ");
			params.add(TipoInformesEnum.INFINT.getId());
			params.add(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
			params.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(
					" OR (t1.TIPO_INFORME_16 = ? AND (t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ?)) ");
			params.add(TipoInformesEnum.INFSUM.getId());
			params.add(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
			params.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(")");

			where.append(" AND NOT(t1.TIPO_INFORME_16 = ?) ");
			params.add(TipoInformesEnum.INFSOC.getId());
		}

		// SSB
		if (usuario == ActoresEnum.SSB.getId().intValue()) {
			where.append(" AND (");
			where.append(
					" (t1.TIPO_INFORME_16 = ? AND (t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ?)) ");
			params.add(TipoInformesEnum.INFSOC.getId());
			params.add(EstadoInformesEnum.INICIADO.getId());
			params.add(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
			params.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(
					" OR (t1.TIPO_INFORME_16 = ? AND (t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ? OR t1.ESTADO_16 = ?)) ");
			params.add(TipoInformesEnum.INFINT.getId());
			params.add(EstadoInformesEnum.SOLICITADO.getId());
			params.add(EstadoInformesEnum.SOLICITADO_PROVEEDOR.getId());
			params.add(EstadoInformesEnum.PENDIENTE_APORTAR.getId());
			params.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getId());
			params.add(EstadoInformesEnum.ENVIADO.getId());

			where.append(")");

			where.append(" AND NOT(t1.TIPO_INFORME_16 = ?) ");
			params.add(TipoInformesEnum.INFSUM.getId());

			// Solo los de sus ayuntamientos
			if (informes.getAyuntamiento() != null && informes.getAyuntamiento().getIdAyuntamiento31() != null) {
				where.append(" AND t1.id_ayuntamiento_16 = ? ");
				params.add(informes.getAyuntamiento().getIdAyuntamiento31());
			}
//			where.append(
//					" AND ( t1.id_ayuntamiento_16 IN (SELECT usuayto.id_ayuntamiento_81 FROM USUARIOS_AYUNTAMIENTO usuAyto WHERE usuayto.id_usuario_81 = t1.id_usuario_16)) ");
		}

		// Administrador (Puede ver todo menos los disponibles)
		if (usuario == ActoresEnum.ADMIN.getId().intValue()) {
			where.append(" AND t1.ESTADO_16 <> ? ");
			params.add(EstadoInformesEnum.DISPONIBLE.getId());
		}

		// Para hacer matching desde las bandejas de entrada
		if (informes != null && informes.getInformeSocial() != null
				&& informes.getInformeSocial().getIdentificador02() != null && informes.getMatch() != null
				&& informes.getMatch()) {
			where.append(" AND UPPER(IDENTIFICADOR_02) LIKE UPPER(?) ESCAPE  '\\'");
			params.add(informes.getInformeSocial().getIdentificador02());
		}

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

		return mapWhere;
	}

	@Override
	@Transactional(readOnly = true)
	public List<Informes> filterComplete(Informes filterInformes, TableRequestDto tableRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT NVL2(t1.ID_BENEFICIARIO_16 , t5.IDENTIFICADOR_01 , t7.IDENTIFICADOR_02) IDENTIFICADOR_FILTER, t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.TIPO_INFORME_16 TIPOINFORME16, t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17,"

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t5.TIPO_IDENTIFICADOR_01 TIPOIDENTIFICADOR01, t7. ID_INF_SOCIAL_02 IDINFSOCIAL02, "
						+ "t7.F_INFORME_02 FINFORME02, "

//						+ "t7.ID_AYUNTAMIENTO_02 IDAYUNTAMIENTO02, t7.UNIDAD_BASE_02 UNIDADBASE02, t7.TELEFONO_02 TELEFONO02, t7.EMAIL_02 EMAIL02, "
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16, "

						+ "t7.SOLA_02 SOLA02, t7.ESTA_SOLA_MANANA_02 ESTASOLAMANANA02, t7.ESTA_SOLA_TARDE_02 ESTASOLATARDE02, t7.ESTA_SOLA_NOCHE_02 ESTASOLANOCHE02, "
						+ "t7.RELACION_ENTORNO_02 RELACIONENTORNO02, t7.FAMILIAR_FALLECIDO_02 FAMILIARFALLECIDO02, t7.VINCULO_FALLECIDO_02 VINCULOFALLECIDO02,t7.VISITAS_FAMILIA_02 VISITASFAMILIA02, "
						+ "t7.VISITAS_AMIGOS_02 VISITASAMIGOS02, t7.FRECUENCIA_SALIDAS_02 FRECUENCIASALIDAS02, t7.PERIODO_SIN_VISITAS_02 PERIODOSINVISITAS02, "
						+ "t7.TIEMPO_SIN_VISITAS_02 TIEMPOSINVISITAS02, t7.OBSERVACIONES_02 OBSERVACIONES02, t7.OBSERVACIONES_PS_02 OBSERVACIONESPS02, "
						+ "t7.APRECIACION_02 APRECIACION02, t7.F_ALTA_02 FALTA02, t7.TIPO_IDENTIFICADOR_02 TIPOIDENTIFICADOR02,  t7.IDENTIFICADOR_02 IDENTIFICADOR02 , t7.NOMBRE_02 NOMBRE02,"
						+ "t7.APELLIDO1_02 APELLIDO102 , t7.APELLIDO2_02 APELLIDO202, t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31, t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06, "
						+ "t14.DESC_ES_36 DESCES36, t14.DESC_EU_36 DESCEU36, "

						+ "t6.ID_DIRECCION_06 DIRECCIONESIDDIRECCION06,t6.CALLE_06 DIRECCIONESCALLE06,t6.CP_06 DIRECCIONESCP06,t6.ID_CALLE_06 DIRECCIONESIDCALLE06,t6.ID_LOCALIDAD_06 DIRECCIONESIDLOCALIDAD06,t6.ID_MUNICIPIO_06 DIRECCIONESIDMUNICIPIO06,t6.ID_PAIS_06 DIRECCIONESIDPAIS06,t6.ID_PORTAL_06 DIRECCIONESIDPORTAL06,t6.ID_PROVINCIA_06 DIRECCIONESIDPROVINCIA06,t6.LETRA_06 DIRECCIONESLETRA06,t6.LOCALIDAD_06 DIRECCIONESLOCALIDAD06,t6.MUNICIPIO_06 DIRECCIONESMUNICIPIO06,t6.PAIS_06 DIRECCIONESPAIS06,t6.PISO_06 DIRECCIONESPISO06,t6.PORTAL_06 DIRECCIONESPORTAL06,t6.ESCALERA_06 DIRECCIONESESCALERA06, t6.PROVINCIA_06 DIRECCIONESPROVINCIA06,t6.ID_SOLICITANTE_06 DIRECCIONESIDSOLICITANTE06, t6.USU_HISTORICO_06 DIRECCIONESUSUHISTORICO06, t6.F_HISTORICO_06 DIRECCIONESFHISTORICO06, t6.F_ALTA_06 DIRECCIONESFALTA06,t6.USU_ALTA_06 DIRECCIONESUSUALTA06, "
						+ "t10.ds_e provincianoradesceu, t10.ds_c provincianoradesces,"//
						+ "t11.DS_O municipionoradesc," //
						+ "t12.TIPO_VIA calleTipoVia,t12.ds_o calleDescripcion," //
						+ "t9.DS_O localidadNORADesc, " //
						+ "t13.NUMERO portalNumNORADesc,t13.BIS portalBisNORADesc,t13.BLOQUE portalBloqueNORADesc ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6 , AYUNTAMIENTOS T8, INFORME_SOCIAL t7, T17_LOCALIDAD t9, T17_PROVINCIA t10, T17_MUNICIPIO t11, T17_CALLE t12, T17_PORTAL t13, MAESTRO_TIPOS_DOC t14 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterInformes, false);
		List<?> params = (List<?>) mapaWhere.get("params");

		StringBuilder where = new StringBuilder();
		where.append(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						// + "AND t1.ESTADO_16 <> 7 "
						+ "AND ID_INFORME_16 = ID_INFORME_02(+) AND t6.id_localidad_06 = t9.id (+) AND t2.id_tipo_doc_17 = t14.id_tipo_doc_36 (+)"
						+ " AND t6.ID_PROVINCIA_06 = t10.ID(+) AND (t6.ID_MUNICIPIO_06=t11.ID(+) AND t6.ID_PROVINCIA_06=t11.PROVINCIA_ID(+)) "
						+ " AND t6.ID_CALLE_06 = t12.id(+) AND t6.id_provincia_06 = t12.provincia_id(+) AND t6.id_municipio_06 = t12.municipio_id(+) "
						+ " AND t6.ID_LOCALIDAD_06 = t9.id(+) AND t6.id_provincia_06 = t9.PROVINCIA_ID(+) AND t6.id_municipio_06 = t9.MUNICIPIO_ID(+) "
						+ " AND t6.ID_PORTAL_06 = t13.id(+) AND t6.id_calle_06 = t13.CALLE_ID(+)");
		// Para hacer el match el informe no ha de estar asociado a ningún expediente
		if (null != filterInformes && null != filterInformes.getMatch() && filterInformes.getMatch()) {
			where.append(" AND t1.ID_EXPEDIENTE_16 IS NULL AND t1.ESTADO_16 = ")
					.append(EstadoInformesEnum.ENVIADO.getId());
		}
		where.append(mapaWhere.get("query"));
		query.append(where);

		if (tableRequestDto != null && filterInformes.getMatch()) {
			query = TableManager.getPaginationQuery(tableRequestDto, query,
					BandejaTelematicaDaoImpl.ORDER_BY_WHITE_LIST);
		} else {
			query.append(" ORDER BY F_INICIO_16 DESC");
		}
		return this.jdbcTemplate.query(query.toString(), this.rwMapDetalleConInfSoc, params.toArray());
	}

	@Override
	@Transactional(readOnly = true)
	public List<Informes> filterCompleteNoInfSoc(Informes filterInformes) {

		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
						+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
						+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.TIPO_INFORME_16 TIPOINFORME16, t1.URGENTE_16 URGENTE16,t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
						+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16,t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17,t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17,t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, "
						+ "t2.URL_RUTA_17 DOCINFURLRUTA17,t2.USU_ALTA_17 DOCINFUSUALTA17,t2.USU_MODIF_17 DOCINFUSUMODIF17,t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17, "

						+ "t3.ID_USUARIO_80 IDUSUARIO80,t3.NOMBRE_80 NOMBRE80,t3.APELLIDOS_80 APELLIDOS80, t3.USU_XLNETS_80 USUXLNETS80, t3.EMAIL_80 EMAIL80, t3.TLFNO_80 TLFNO80, t3.PUESTO_80 PUESTO80, "
						+ "t3.F_BAJA_80 FBAJA80, t3.IDENTIFICADOR_80 IDENTIFICADOR80,t3.F_ALTA_80 FALTA80,t3.USU_ALTA_80 USUALTA80, t3.F_MODIF_80 FMODIF80,t3.USU_MODIF_80 USUMODIF80, "

						+ "t4.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t4.ID_EXPEDIENTE_00 IDEXPEDIENTE00,t4.URGENCIA_00 URGENCIA00,t4.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, "
						+ "t5.ID_SOLICITANTE_01 IDSOLICITANTE01, t5.IDENTIFICADOR_01 IDENTIFICADOR01, t5.ID_DIRECCION_01 IDDIRECCION01, "
						+ "t5.NOMBRE_01 NOMBRE01, t5.APELLIDO1_01 APELLIDO101, t5.APELLIDO2_01 APELLIDO201, t6.CALLE_06 CALLE06, t6.LETRA_06 LETRA06, t6.PISO_06 PISO06, t6.PORTAL_06 PORTAL06, t9.DS_O DSO, t6.CP_06 CP06,"
						+ "t14.DESC_ES_36 DESCES36, t14.DESC_EU_36 DESCEU36,"
						+ "t1.ID_AYUNTAMIENTO_16 IDAYUNTAMIENTO16, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t1.TELEFONO_16 TELEFONO16, t1.EMAIL_16 EMAIL16,"
						+ "t8.DESC_ES_31 DESCES31,t8.DESC_EU_31 DESCEU31, "

						+ "t6.ID_DIRECCION_06 DIRECCIONESIDDIRECCION06,t6.CALLE_06 DIRECCIONESCALLE06,t6.CP_06 DIRECCIONESCP06,t6.ID_CALLE_06 DIRECCIONESIDCALLE06,t6.ID_LOCALIDAD_06 DIRECCIONESIDLOCALIDAD06,t6.ID_MUNICIPIO_06 DIRECCIONESIDMUNICIPIO06,t6.ID_PAIS_06 DIRECCIONESIDPAIS06,t6.ID_PORTAL_06 DIRECCIONESIDPORTAL06,t6.ID_PROVINCIA_06 DIRECCIONESIDPROVINCIA06,t6.LETRA_06 DIRECCIONESLETRA06,t6.LOCALIDAD_06 DIRECCIONESLOCALIDAD06,t6.MUNICIPIO_06 DIRECCIONESMUNICIPIO06,t6.PAIS_06 DIRECCIONESPAIS06,t6.PISO_06 DIRECCIONESPISO06,t6.PORTAL_06 DIRECCIONESPORTAL06,t6.ESCALERA_06 DIRECCIONESESCALERA06, t6.PROVINCIA_06 DIRECCIONESPROVINCIA06,t6.ID_SOLICITANTE_06 DIRECCIONESIDSOLICITANTE06, t6.USU_HISTORICO_06 DIRECCIONESUSUHISTORICO06, t6.F_HISTORICO_06 DIRECCIONESFHISTORICO06, t6.F_ALTA_06 DIRECCIONESFALTA06,t6.USU_ALTA_06 DIRECCIONESUSUALTA06, "
						+ "t10.ds_e provincianoradesceu, t10.ds_c provincianoradesces,"//
						+ "t11.DS_O municipionoradesc," //
						+ "t12.TIPO_VIA calleTipoVia,t12.ds_o calleDescripcion," //
						+ "t9.DS_O localidadNORADesc, " //
						+ "t13.NUMERO portalNumNORADesc,t13.BIS portalBisNORADesc,t13.BLOQUE portalBloqueNORADesc ");

		query.append(
				"FROM INFORMES t1 ,DOCUMENTOS_INFORME t2 ,USUARIOS t3, EXPEDIENTES t4, SOLICITANTES t5, DIRECCIONES t6, AYUNTAMIENTOS T8, "
						+ "T17_LOCALIDAD t9, T17_PROVINCIA t10, T17_MUNICIPIO t11, T17_CALLE t12, T17_PORTAL t13, MAESTRO_TIPOS_DOC t14 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMapSoloId(filterInformes);
		List<?> params = (List<?>) mapaWhere.get("params");

		StringBuilder where = new StringBuilder();
		where.append(
				" WHERE 1=1 AND t1.ID_DOC_INFORME_16= t2.ID_DOC_INFORME_17(+) AND t1.ID_USUARIO_16= t3.ID_USUARIO_80(+) AND t1.id_expediente_16 = t4.id_expediente_00(+) "
						+ "AND t1.id_beneficiario_16 = t5.id_solicitante_01(+) AND t5.id_direccion_01=t6.ID_DIRECCION_06(+) AND t1.ID_AYUNTAMIENTO_16 = t8.ID_AYUNTAMIENTO_31(+) "
						+ "AND t6.ID_LOCALIDAD_06 = t9.id (+) AND t2.id_tipo_doc_17 = t14.id_tipo_doc_36 (+)"
						+ " AND t6.ID_PROVINCIA_06 = t10.ID(+) AND (t6.ID_MUNICIPIO_06=t11.ID(+) AND t6.ID_PROVINCIA_06=t11.PROVINCIA_ID(+)) "
						+ " AND t6.ID_CALLE_06 = t12.id(+) AND t6.id_provincia_06 = t12.provincia_id(+) AND t6.id_municipio_06 = t12.municipio_id(+) "
						+ " AND t6.ID_LOCALIDAD_06 = t9.id(+) AND t6.id_provincia_06 = t9.PROVINCIA_ID(+) AND t6.id_municipio_06 = t9.MUNICIPIO_ID(+) "
						+ " AND t6.ID_PORTAL_06 = t13.id(+) AND t6.id_calle_06 = t13.CALLE_ID(+)");

		// Para hacer el match el informe no ha de estar asociado a ningún expediente
		if (null != filterInformes && null != filterInformes.getMatch() && filterInformes.getMatch()) {
			where.append(" AND t1.ID_EXPEDIENTE_16 IS NULL AND t1.ESTADO_16 = ")
					.append(EstadoInformesEnum.ENVIADO.getId());
		}
		where.append(mapaWhere.get("query"));
		query.append(where);

//		if (tableRequestDto != null && filterInformes.getMatch()) {
//			query = TableManager.getPaginationQuery(tableRequestDto, query,
//					BandejaTelematicaDaoImpl.ORDER_BY_WHITE_LIST);
//		} else {
//			query.append(" ORDER BY F_INICIO_16 DESC");
//		}
		return this.jdbcTemplate.query(query.toString(), this.rwMapDetalleNoInfSoc, params.toArray());
	}

	public Informes relacionInformePorMatch(Informes informes) {
		String query = "UPDATE INFORMES SET ID_BENEFICIARIO_16=?, ID_EXPEDIENTE_16=?, ESTADO_16 = ?, USU_MODIF_16=?, F_MODIF_16=sysdate WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getIdBeneficiario16(), informes.getIdExpediente16(),
				EstadoInformesEnum.DISPONIBLE.getId(), UtilSeguridad.getNameUsuarioConectado(),
				informes.getIdInforme16());

		return informes;
	}

	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

	/**
	 * StringBuilder initilization value
	 */

	public Informes ocultar(Informes informes) {
		String query = "UPDATE INFORMES SET OCULTO_16=1 WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getIdInforme16());

		return informes;

	}

	public Informes aportar(Informes informes) {
		String query = "UPDATE INFORMES SET ID_DOC_INFORME_16 = ?, ESTADO_16 = ? WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getDocumentosInforme().getIdDocInforme17(), informes.getEstado16(),
				informes.getIdInforme16());

		return informes;

	}

	public Informes mostrar(Informes informes) {
		String query = "UPDATE INFORMES SET OCULTO_16=0 WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getIdInforme16());

		return informes;

	}

	public static final int STRING_BUILDER_INIT = 4096;

	@Override
	public Informes obtenerInforme(Informes informes) {
		String query = "SELECT  t1.ID_INFORME_16 IDINFORME16,t1.TIPO_INFORME_16 TIPOINFORME16,t1.OBSERVACIONES_16 OBSERVACIONES16,t1.ESTADO_16 ESTADO16, "
				+ "t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16,t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16,t1.F_INICIO_16 FINICIO16,t1.F_FIN_16 FFIN16, "
				+ "t1.F_ENVIO_ADMON_16 FENVIOADMON16,t1.OCULTO_16 OCULTO16,t1.ORIGEN_16 ORIGEN16,t1.URGENTE_16 URGENTE16, t1.USU_ALTA_16 USUALTA16,t1.USU_MODIF_16 USUMODIF16, "
				+ "t1.F_ALTA_16 FALTA16,t1.F_MODIF_16 FMODIF16" + " FROM INFORMES t1 "
				+ " WHERE 1=1 AND t1.ID_INFORME_16 = ?";

		List<Informes> informesList = this.jdbcTemplate.query(query, this.rwMapInforme, informes.getIdInforme16());
		return (Informes) DataAccessUtils.uniqueResult(informesList);
	}

	public Informes updateDocInforme(Informes informes) {
		String query = "UPDATE INFORMES SET ESTADO_16=?, ID_DOC_INFORME_16 = ?, USU_MODIF_16 = ?, F_MODIF_16 = sysdate WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getEstado16(), informes.getDocumentosInforme().getIdDocInforme17(),
				informes.getUsuModif16(), informes.getIdInforme16());

		return informes;
	}

	@Transactional(readOnly = true)
	public Informes eliminar(Informes informes, InformeSocial informeSocial) {
		String query3 = "DELETE FROM CONVIVIENTES_INF_SOCI WHERE ID_INF_SOCIAL_82=?";
		this.jdbcTemplate.update(query3, informeSocial.getIdInfSocial02());

		String query = "DELETE FROM INFORME_SOCIAL WHERE ID_INFORME_02=?";
		this.jdbcTemplate.update(query, informes.getIdInforme16());

		String query2 = "DELETE FROM INFORMES WHERE ID_INFORME_16=?";
		this.jdbcTemplate.update(query2, informes.getIdInforme16());

		return informes;

	}

	public Informes updateEstado(Informes informes) {
		String query = "UPDATE INFORMES SET ESTADO_16=?, F_MODIF_16=SYSDATE,  USU_MODIF_16=? WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getEstado16(), informes.getUsuModif16(), informes.getIdInforme16());

		return informes;

	}

	public Informes updateEnvioAdmon(Informes informes) {
		String query = "UPDATE INFORMES SET F_ENVIO_ADMON_16=SYSDATE, F_FIN_16 = SYSDATE, F_MODIF_16=SYSDATE, USU_MODIF_16=? WHERE ID_INFORME_16=?";

		this.jdbcTemplate.update(query, informes.getUsuModif16(), informes.getIdInforme16());

		return informes;

	}

	@Transactional(readOnly = true)
	public Informes borrarDocumento(Informes informes) {
		String query = "UPDATE INFORMES SET ESTADO_16=?, F_MODIF_16=SYSDATE, USU_MODIF_16=?, ID_DOC_INFORME_16 = NULL WHERE ID_INFORME_16=?";
		this.jdbcTemplate.update(query, informes.getEstado16(), informes.getUsuModif16(), informes.getIdInforme16());

		query = "DELETE FROM DOCUMENTOS_INFORME WHERE ID_DOC_INFORME_17=?";
		this.jdbcTemplate.update(query, informes.getDocumentosInforme().getIdDocInforme17());

		return informes;

	}

	public Informes addDesdeAvisos(Informes informes) {

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO INFORMES (ID_INFORME_16, TIPO_INFORME_16, OBSERVACIONES_16, ESTADO_16, ID_BENEFICIARIO_16, URGENTE_16, USU_ALTA_16, F_ALTA_16) "
				+ "VALUES (" + SEQUENCE_INFORMES
				+ ".NEXTVAL,:tipoInforme,:observa,:estado,:idBene,:urgente,:usuAlta, SYSDATE)";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("tipoInforme", informes.getTipoInforme16()).addValue("observa", informes.getObservaciones16())
				.addValue("estado", informes.getEstado16())
				.addValue("idBene", informes.getSolicitantes().getIdSolicitante01())
				.addValue("urgente", informes.getUrgente16() != null ? informes.getUrgente16() : null)
				.addValue("usuAlta", informes.getUsuAlta16());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_INFORME_16" });
		informes.setIdInforme16(generatedKeyHolder.getKey().longValue());
		return informes;
	}

	@Override
	@Transactional(readOnly = true)
	public Avisos aportarExpediente(Avisos avisos) {

		String query = "UPDATE INFORMES SET ESTADO_16 = 9, ID_EXPEDIENTE_16 = ? WHERE ID_INFORME_16 = ?";

		this.jdbcTemplate.update(query, avisos.getIdexpedienteAsociado(), avisos.getIdInforme20());
		return avisos;
	}

	public Long tieneExpediente(Long idInforme) {

		String query = "SELECT COUNT (1) FROM INFORMES WHERE ID_INFORME_16 =" + idInforme
				+ "AND ID_EXPEDIENTE_16 IS NOT NULL";

		return this.jdbcTemplate.queryForObject(query, Long.class);

	}

	@Transactional(rollbackFor = Throwable.class)
	public Informes actualizarEstadoInformeDisponible(Informes informe) {
		String query = "UPDATE INFORMES SET ESTADO_16 = ? WHERE ID_INFORME_16 = ?";

		this.jdbcTemplate.update(query, EstadoInformesEnum.DISPONIBLE.getId(), informe.getIdInforme16());
		return informe;
	}

	@Override
	@Transactional(readOnly = true)
	public List<Informes> getInformesDisponiblesSinExpAsociado(Long idSolicitante) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INFORME_16 IDINFORME16, t1.TIPO_INFORME_16 TIPOINFORME16, t1.OBSERVACIONES_16 OBSERVACIONES16, t1.ESTADO_16 ESTADO16, t1.ID_BENEFICIARIO_16 IDBENEFICIARIO16, t1.ID_EXPEDIENTE_16 IDEXPEDIENTE16, t1.F_INICIO_16 FINICIO16, t1.F_FIN_16 FFIN16, t1.F_ENVIO_ADMON_16 FENVIOADMON16, t1.OCULTO_16 OCULTO16, t1.ORIGEN_16 ORIGEN16, t1.URGENTE_16 URGENTE16, t1.USU_ALTA_16 USUALTA16, t1.USU_MODIF_16 USUMODIF16, t1.F_ALTA_16 FALTA16, t1.F_MODIF_16 FMODIF16, t2.ID_DOC_INFORME_17 DocInfIDDOCINFORME17, t2.ID_TIPO_DOC_17 DOCINFIDTIPODOC17, t2.OID_17 DOCINFOID17, t2.OID_DOKUSI_17 DOCINFOIDDOKUSI17, t2.URL_RUTA_17 DOCINFURLRUTA17, t2.USU_ALTA_17 DOCINFUSUALTA17, t2.USU_MODIF_17 DOCINFUSUMODIF17, t2.F_ALTA_17 DOCINFFALTA17, t2.F_MODIF_17 DOCINFFMODIF17, t2.NOMBRE_DOC_17 NOMBREDOC17, t1.UNIDAD_BASE_16 UNIDADBASE16, t1.ID_UNIDAD_BASE_16 IDUNIDADBASE16, t14.DESC_ES_36 DESCES36, t14.DESC_EU_36 DESCEU36 ");

		query.append("FROM INFORMES t1, DOCUMENTOS_INFORME t2, MAESTRO_TIPOS_DOC t14 ");

		query.append(
				" WHERE ID_DOC_INFORME_16 = ID_DOC_INFORME_17(+) AND t2.id_tipo_doc_17 = t14.id_tipo_doc_36 (+) AND  t1.ESTADO_16 =  "
						+ EstadoInformesEnum.DISPONIBLE.getId()
						+ " AND ID_EXPEDIENTE_16 IS NULL AND ID_BENEFICIARIO_16 = ?");

		return (List<Informes>) this.jdbcTemplate.query(query.toString(), this.rwMapInformesDocumento, idSolicitante);
	}

}
