package com.ejie.ab79.dao.inspecciones;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.Inspectores;
import com.ejie.ab79.model.REST.servicioWeb.DatosBasicos;
import com.ejie.ab79.model.REST.servicioWeb.DatosGenerales;
import com.ejie.ab79.model.REST.servicioWeb.InspeccionDato;
import com.ejie.ab79.model.REST.servicioWeb.InspeccionDocumentacion;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.Expedientes;
import com.ejie.ab79.model.inspecciones.Agrupaciones;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.inspecciones.DesResIns;
import com.ejie.ab79.model.inspecciones.EstadosInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.inspecciones.ResultadosInspeccion;
import com.ejie.ab79.model.nora.T17Localidad;
import com.ejie.ab79.model.nora.T17Municipio;
import com.ejie.ab79.model.procedimientos.Direcciones;
import com.ejie.ab79.model.protocolos.Protocolos;
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;

/**
 * InspeccionesDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class InspeccionesDaoImpl implements InspeccionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDINSPECCION", "IDINSPECCIONMOVIL",
			"IDENTIFICADORINSPECCION", "IDRESULTADOINSPECCION", "IDDIRECCION", "DESCCASTELLANO", "DESCEUSKERA",
			"IDEXPEDIENTE", "IDCAMPAINA", "IDESTADOINSPECCION", "VISITAADMINISTRATIVA", "OBJETOINSPECCION",
			"FECHAREGISTRO", "USUARIOREGISTRO", "FECHAULTMODIFICACION", "USUARIOULTMODIFICACION", "FECHALIMINSPECCION",
			"IDPROTOCOLO", "FECHAREGIS", "IDPROCEDIMIENTO", "DESCCASTPROC", "DESCEUSKPROC", "FOLDERID", "FOLDERNUM",
			"RESULTADODESCRIPCIONCASTELLANO", "RESULTADODESCRIPCIONEUSKERA", "IDPROTOCOLO", "DIRECCION", "DSOMUNICIPIO",
			"DSOLOCALIDAD", "IDINSPECTOR", "FECHAASIGINSPECCION", "SUMAINPECCIONES", "NUMERO ", "ESCALERA ", "PISO ",
			"LETRA" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Inspecciones> rwMap = new RowMapper<Inspecciones>() {
		@Override
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Inspecciones(resultSet.getInt("IDINSPECCION"), resultSet.getString("IDINSPECCIONMOVIL"),
					resultSet.getString("IDENTIFICADORINSPECCION"),
					new ResultadosInspeccion(resultSet.getInt("IDRESULTADOINSPECCION")),
					new Direcciones(resultSet.getInt("IDDIRECCION"), null, null, null),
					new Expedientes(resultSet.getInt("IDEXPEDIENTE")),
					new CampainasInspeccion(resultSet.getInt("IDCAMPAINA")),
					new EstadosInspeccion(resultSet.getLong("IDESTADOINSPECCION")),
					resultSet.getString("OBJETOINSPECCION"), resultSet.getInt("IDORIGENINSPECCION"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getString("USUARIOREGISTRO"),
					resultSet.getDate("FECHAULTMODIFICACION"), resultSet.getString("USUARIOULTMODIFICACION"));
		}
	};

	private RowMapper<Inspecciones> rwMapFind = new RowMapper<Inspecciones>() {
		@Override
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(resultSet.getInt("IDINSPECCION"));
			inspeccion.setIdInspeccionMovil(resultSet.getString("IDINSPECCIONMOVIL"));
			inspeccion.setIdentificadorInspeccion(resultSet.getString("IDENTIFICADORINSPECCION"));
			inspeccion.setObjetoInspeccion(resultSet.getString("OBJETOINSPECCION"));
			inspeccion.setIdOrigenInspeccion(resultSet.getInt("IDORIGENINSPECCION"));
			inspeccion.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			inspeccion.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));
			inspeccion.setFechaUltmodificacion(resultSet.getDate("FECHAULTMODIFICACION"));
			inspeccion.setUsuarioUltmodificacion(resultSet.getString("USUARIOULTMODIFICACION"));
			inspeccion.setObservacionesResultado(resultSet.getString("OBSERVACIONESRESULTADO"));
			inspeccion.setEnviadoTablet(resultSet.getInt("ENVIADOTABLET"));
			inspeccion.setFechaFinInspeccion(resultSet.getDate("FECHAFININSPECCION"));

			ResultadosInspeccion resultadosInspeccion = new ResultadosInspeccion();
			resultadosInspeccion.setIdResultadoInspeccion(resultSet.getInt("IDRESULTADOINSPECCION"));

			Direcciones direcciones = new Direcciones();
			direcciones.setIdDireccion(resultSet.getInt("IDDIRECCION"));
			direcciones.setDescripcionCastellano(resultSet.getString("DIRDESCES"));
			direcciones.setDescripcionEuskera(resultSet.getString("DIRDESCEU"));

			Expedientes expedientes = new Expedientes();
			expedientes.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			if (resultSet.wasNull()) {
				expedientes.setIdExpediente(null);
			}

			CampainasInspeccion campainasInspeccion = new CampainasInspeccion();
			campainasInspeccion.setIdCampaina(resultSet.getInt("IDCAMPAINA"));

			Protocolos protocolos = new Protocolos();
			protocolos.setIdProtocolo(resultSet.getInt("IDPROTOCOLO"));
			protocolos.setDescripcionCastellano(resultSet.getString("PROTOCOLODESCES"));
			protocolos.setDescripcionEuskera(resultSet.getString("PROTOCOLODESCEU"));

			EstadosInspeccion estadosInspeccion = new EstadosInspeccion();
			estadosInspeccion.setIdEstadoInspeccion(resultSet.getLong("IDESTADOINSPECCION"));

			Inspectores inspectores = new Inspectores();
			inspectores.setIdInspector(resultSet.getInt("IDINSPECTOR"));

			Agrupaciones agrupacion = new Agrupaciones();
			agrupacion.setIdAgrupacion(resultSet.getInt("IDAGRUPACION"));

			inspeccion.setResultadoInspeccion(resultadosInspeccion);
			inspeccion.setDireccion(direcciones);
			inspeccion.setExpediente(expedientes);
			inspeccion.setCampaina(campainasInspeccion);
			inspeccion.setIdProtocolo(protocolos);
			inspeccion.setEstadoInspeccion(estadosInspeccion);
			inspeccion.setInspector(inspectores);
			inspeccion.setAgrupacion(agrupacion);

			return inspeccion;
		}
	};

	private RowMapper<Inspecciones> rwMapPK = new RowMapper<Inspecciones>() {
		@Override
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Inspecciones(resultSet.getInt("IDINSPECCION"));
		}
	};

	private RowMapper<Inspecciones> rwMapPropuesta = new RowMapper<Inspecciones>() {
		@Override
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdPropuesta(resultSet.getInt("IDENTIFICADORPROSAN"));
			if (resultSet.wasNull()) {
				inspeccion.setIdPropuesta(null);
			}

			return inspeccion;
		}
	};

	private RowMapper<Inspecciones> rwMapBusquedaInspecciones = new RowMapper<Inspecciones>() {
		@Override
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(resultSet.getInt("IDINSPECCION"));
			inspeccion.setIdInspeccionMovil(resultSet.getString("IDINSPECCIONMOVIL"));
			inspeccion.setIdentificadorInspeccion(resultSet.getString("IDENTIFICADORINSPECCION"));
			inspeccion.setObjetoInspeccion(resultSet.getString("OBJETOINSPECCION"));
			inspeccion.setIdOrigenInspeccion(resultSet.getInt("IDORIGENINSPECCION"));
			inspeccion.setFechaLimInspeccion(resultSet.getDate("FECHALIMINSPECCION"));
			inspeccion.setFechaRegistro(resultSet.getDate("FECHAREGIS"));
			inspeccion.setFechaAsigInspeccion(resultSet.getDate("FECHAASIGINSPECCION"));

			Direcciones direccion = new Direcciones();
			direccion.setIdDireccion(resultSet.getInt("IDDIRECCION"));

			ResultadosInspeccion resultadosInspeccion = new ResultadosInspeccion();
			resultadosInspeccion.setIdResultadoInspeccion(resultSet.getInt("IDRESULTADOINSPECCION"));

			DesResIns desResIns = new DesResIns();
			desResIns.setDescripcionCastellano(resultSet.getString("RESULTADODESCRIPCIONCASTELLANO"));
			desResIns.setDescripcionEuskera(resultSet.getString("RESULTADODESCRIPCIONEUSKERA"));
			resultadosInspeccion.setDesResIns(desResIns);

			Expedientes expedientes = new Expedientes();
			expedientes.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			expedientes.setFolderNumber(resultSet.getString("FOLDERNUM"));
			expedientes.setTitulo(resultSet.getString("TITULO"));

			CampainasInspeccion campainasInspeccion = new CampainasInspeccion();
			campainasInspeccion.setIdCampaina(resultSet.getInt("IDCAMPAINA"));

			EstadosInspeccion estadosInspeccion = new EstadosInspeccion();
			estadosInspeccion.setIdEstadoInspeccion(resultSet.getLong("IDESTADOINSPECCION"));

			Protocolos protocolos = new Protocolos();
			protocolos.setIdProtocolo(resultSet.getInt("IDPROTOCOLO"));

			DatosDirecciones datosDirecciones = new DatosDirecciones();
			String numero = "";
			String escalera = "";
			String piso = "";
			String letra = "";

			if (resultSet.getString("NUMERO") != null) {
				numero = " " + resultSet.getString("NUMERO");
			}
			if (resultSet.getString("ESCALERA") != null) {
				escalera = " " + resultSet.getString("ESCALERA");
			}
			if (resultSet.getString("PISO") != null) {
				piso += " " + resultSet.getString("PISO");
			}
			if (resultSet.getString("LETRA") != null) {
				letra += " " + resultSet.getString("LETRA");
			}

			String direccionAux = "";

			if (resultSet.getString("DIRECCION") != null) {
				direccionAux = resultSet.getString("DIRECCION") + numero + escalera + piso + letra;
			}

			datosDirecciones.setDireccion(direccionAux);

			T17Municipio municipio = new T17Municipio();
			municipio.setDsO(resultSet.getString("DSOMUNICIPIO"));

			T17Localidad localidad = new T17Localidad();
			localidad.setDsO(resultSet.getString("DSOLOCALIDAD"));

			// Para mostrar en la tabla
			String munLocalidad = municipio.getDsO();
			if (localidad.getDsO() != null) {
				munLocalidad += " (" + localidad.getDsO() + ")";
			}

			inspeccion.setDireccion(direccion);
			inspeccion.setResultadoInspeccion(resultadosInspeccion);
			inspeccion.setExpediente(expedientes);
			inspeccion.setCampaina(campainasInspeccion);
			inspeccion.setEstadoInspeccion(estadosInspeccion);
			inspeccion.setIdProtocolo(protocolos);
			inspeccion.setDatosDirecciones(datosDirecciones);
			inspeccion.setMunicipio(municipio);
			inspeccion.setLocalidad(localidad);
			inspeccion.setMunLocalidad(munLocalidad);

			return inspeccion;
		}
	};

	private RowMapper<Inspectores> rwMapInspectorInspeccion = new RowMapper<Inspectores>() {
		@Override
		public Inspectores mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Inspectores inspector = new Inspectores();

			inspector.setIdInspector(resultSet.getInt("IDINSPECTOR"));
			inspector.setNombreInspector(resultSet.getString("NOMBREINSPECTOR"));

			return inspector;
		}
	};

	private RowMapper<InspeccionDato> rwMapInspeccionDato = new RowMapper<InspeccionDato>() {
		@Override
		public InspeccionDato mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			InspeccionDato inspeccionDato = new InspeccionDato();
			DatosGenerales datosGenerales = new DatosGenerales();
			DatosBasicos datosBasicos = new DatosBasicos();

			datosBasicos.setIdInspeccion(resultSet.getInt("idinspeccion"));

			datosBasicos.setIdInspeccionMovil(resultSet.getString("IDINSPECCIONMOVIL"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdInspeccionMovil(null);
			}
			datosBasicos.setIdentificadorInspeccion(resultSet.getString("identificadorinspeccion"));
			datosBasicos.setIdResultadoInspeccion(resultSet.getInt("idresultadoinspeccion"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdResultadoInspeccion(null);
			}
			datosBasicos.setIdDireccion(resultSet.getInt("iddireccion"));
			datosBasicos.setIdCampaina(resultSet.getInt("idcampaina"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdCampaina(null);
			}
			datosBasicos.setIdEstadoInspeccion(resultSet.getInt("idestadoinspeccion"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdEstadoInspeccion(null);
			}
			datosBasicos.setIdProtocolo(resultSet.getInt("idprotocolo"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdProtocolo(null);
			}
			datosBasicos.setIdOrigenInspeccion(resultSet.getInt("idorigeninspeccion"));
			datosBasicos.setIdInspector(resultSet.getInt("idinspector"));
			datosBasicos.setIdExpediente(resultSet.getInt("idexpediente"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdExpediente(null);
			}
			datosBasicos.setNumExpediente(resultSet.getString("numexpediente"));
			datosBasicos.setTituloExpediente(resultSet.getString("tituloexpediente"));
			datosBasicos.setObservacionesResultado(resultSet.getString("OBSERVACIONESRESULTADO"));
			datosBasicos.setObservacionesTecnico(resultSet.getString("OBJETOINSPECCION"));
			datosBasicos.setIdProcedimiento(resultSet.getInt("idprocedimiento"));
			if (resultSet.wasNull()) {
				datosBasicos.setIdProcedimiento(null);
			}

			datosGenerales.setDatosBasicos(datosBasicos);
			inspeccionDato.setDatosGenerales(datosGenerales);

			return inspeccionDato;
		}
	};

	private RowMapper<InspeccionDocumentacion> rwMapInspeccionDocumentacion = new RowMapper<InspeccionDocumentacion>() {
		@Override
		public InspeccionDocumentacion mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			InspeccionDocumentacion inspeccionDocumentacion = new InspeccionDocumentacion();
			inspeccionDocumentacion.setIdInspeccion(resultSet.getInt("idinspeccion"));

			return inspeccionDocumentacion;
		}
	};

	private RowMapper<Integer> rwMapSecuenciaIdentificador = new RowMapper<Integer>() {
		@Override
		public Integer mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return resultSet.getInt("SECUENCIAIDENTIFICADOR");
		}
	};

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

			Inspecciones inspecciones = new Inspecciones(resultSet.getInt("IDINSPECCION"),
					resultSet.getString("IDINSPECCIONMOVIL"), resultSet.getString("IDENTIFICADORINSPECCION"),
					new ResultadosInspeccion(resultSet.getInt("IDRESULTADOINSPECCION")),
					new Direcciones(resultSet.getInt("IDDIRECCION"), null, null, null),
					new Expedientes(resultSet.getInt("IDEXPEDIENTE")),
					new CampainasInspeccion(resultSet.getInt("IDCAMPAINA")),
					new EstadosInspeccion(resultSet.getLong("IDESTADOINSPECCION")),
					resultSet.getString("OBJETOINSPECCION"), resultSet.getInt("IDORIGENINSPECCION"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getString("USUARIOREGISTRO"),
					resultSet.getDate("FECHAULTMODIFICACION"), resultSet.getString("USUARIOULTMODIFICACION"));

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

		int idInspeccion = this.jdbcTemplate.queryForObject("SELECT AB79.S_AB7901T00.NEXTVAL FROM DUAL", Integer.class);

		Integer idInspectorAux = null;
		if (inspecciones != null && inspecciones.getInspector() != null
				&& inspecciones.getInspector().getIdInspector() != null) {
			idInspectorAux = inspecciones.getInspector().getIdInspector();
		}

		Integer idResultadoInspeccionAux = null;
		if (inspecciones != null && inspecciones.getResultadoInspeccion() != null
				&& inspecciones.getResultadoInspeccion().getIdResultadoInspeccion() != null) {
			idResultadoInspeccionAux = inspecciones.getResultadoInspeccion().getIdResultadoInspeccion();
		}

		Integer idExpedienteAux = null;
		if (inspecciones != null && inspecciones.getExpediente() != null
				&& inspecciones.getExpediente().getIdExpediente() != null) {
			idExpedienteAux = inspecciones.getExpediente().getIdExpediente();
		}

		Integer idDireccionAux = null;
		if (inspecciones != null && inspecciones.getDireccion() != null
				&& inspecciones.getDireccion().getIdDireccion() != null) {
			idDireccionAux = inspecciones.getDireccion().getIdDireccion();
		}

		Integer idCampainaAux = null;
		if (inspecciones != null && inspecciones.getCampaina() != null
				&& inspecciones.getCampaina().getIdCampaina() != null) {
			idCampainaAux = inspecciones.getCampaina().getIdCampaina();
		}

		Long idEstadoInspeccionAux = null;
		if (inspecciones != null && inspecciones.getEstadoInspeccion() != null
				&& inspecciones.getEstadoInspeccion().getIdEstadoInspeccion() != null) {
			idEstadoInspeccionAux = inspecciones.getEstadoInspeccion().getIdEstadoInspeccion();
		}

		Integer idProtocoloAux = null;
		if (inspecciones != null && inspecciones.getIdProtocolo() != null
				&& inspecciones.getIdProtocolo().getIdProtocolo() != null) {
			idProtocoloAux = inspecciones.getIdProtocolo().getIdProtocolo();
		}

		String query = "INSERT INTO INSPECCIONES (ID_INSPECCION, ID_INSPECCION_MOVIL, IDENTIFICADOR_INSPECCION, ID_RESULTADO_INSPECCION, ID_DIRECCION, ID_EXPEDIENTE, ID_CAMPAINA, ID_ESTADO_INSPECCION, OBJETO_INSPECCION, FECHA_REGISTRO, USUARIO_REGISTRO , FECHA_LIM_INSPECCION , ID_ORIGEN_INSPECCION, ID_PROTOCOLO, ENVIADO_TABLET, ID_INSPECTOR, FECHA_ASIG_INSPECCION) VALUES (?,?,?,?,?,?,?,?,?,SYSDATE,?,?,?,?,?,?,?)";
		this.jdbcTemplate.update(query, idInspeccion, inspecciones.getIdInspeccionMovil(),
				inspecciones.getIdentificadorInspeccion(), idResultadoInspeccionAux, idDireccionAux, idExpedienteAux,
				idCampainaAux, idEstadoInspeccionAux, inspecciones.getObjetoInspeccion(),
				inspecciones.getUsuarioRegistro(), inspecciones.getFechaLimInspeccion(),
				inspecciones.getIdOrigenInspeccion(), idProtocoloAux, inspecciones.getEnviadoTablet(), idInspectorAux,
				inspecciones.getFechaAsigInspeccion());

		inspecciones.setIdInspeccion(idInspeccion);

		return inspecciones;
	}

	/**
	 * Updates a single row in the Inspecciones table.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @return Inspecciones
	 */
	@Override
	public Inspecciones update(Inspecciones inspecciones) {
		String query = "UPDATE INSPECCIONES SET IDENTIFICADOR_INSPECCION=?, ID_RESULTADO_INSPECCION=?, ID_DIRECCION=?, ID_EXPEDIENTE=?, ID_CAMPAINA=?, ID_ESTADO_INSPECCION=?, OBJETO_INSPECCION=?, FECHA_REGISTRO=?, USUARIO_REGISTRO=?, FECHA_ULTMODIFICACION=?, USUARIO_ULTMODIFICACION=? WHERE ID_INSPECCION=?";
		this.jdbcTemplate.update(query, inspecciones.getIdentificadorInspeccion(),
				inspecciones.getResultadoInspeccion().getIdResultadoInspeccion(),
				inspecciones.getDireccion().getIdDireccion(), inspecciones.getExpediente(),
				inspecciones.getCampaina().getIdCampaina(), inspecciones.getEstadoInspeccion(),
				inspecciones.getObjetoInspeccion(), inspecciones.getFechaRegistro(), inspecciones.getUsuarioRegistro(),
				inspecciones.getFechaUltmodificacion(), inspecciones.getUsuarioUltmodificacion(),
				inspecciones.getIdInspeccion());
		return inspecciones;
	}

	@Override
	public Inspecciones updateDatosBasicos(Inspecciones inspecciones) {

		Inspecciones inspeccionesAux = new Inspecciones();
		inspeccionesAux.setIdInspeccion(inspecciones.getIdInspeccion());
		inspeccionesAux = find(inspeccionesAux);

		String query = null;

		if (inspecciones.getInspector() != null && inspecciones.getInspector().getIdInspector() != null) {
			if (inspeccionesAux.getInspector() != null && inspeccionesAux.getInspector().getIdInspector() != null) {
				if (inspeccionesAux.getInspector().getIdInspector() != inspecciones.getInspector().getIdInspector()) {
					query = "UPDATE INSPECCIONES SET ID_ESTADO_INSPECCION=?, ID_RESULTADO_INSPECCION=?, OBJETO_INSPECCION=?, ID_PROTOCOLO=?, ID_INSPECTOR=?, OBSERVACIONES_RESULTADO=?, ID_CAMPAINA=?, ID_AGRUPACION=?, FECHA_ASIG_INSPECCION=sysdate, USUARIO_ULTMODIFICACION=?, FECHA_ULTMODIFICACION=sysdate  WHERE ID_INSPECCION=?";
				} else {
					query = "UPDATE INSPECCIONES SET ID_ESTADO_INSPECCION=?, ID_RESULTADO_INSPECCION=?, OBJETO_INSPECCION=?, ID_PROTOCOLO=?, ID_INSPECTOR=?, OBSERVACIONES_RESULTADO=?, ID_CAMPAINA=?, ID_AGRUPACION=?, USUARIO_ULTMODIFICACION=?, FECHA_ULTMODIFICACION=sysdate  WHERE ID_INSPECCION=?";
				}
			} else {
				query = "UPDATE INSPECCIONES SET ID_ESTADO_INSPECCION=?, ID_RESULTADO_INSPECCION=?, OBJETO_INSPECCION=?, ID_PROTOCOLO=?, ID_INSPECTOR=?, OBSERVACIONES_RESULTADO=?, ID_CAMPAINA=?, ID_AGRUPACION=?, FECHA_ASIG_INSPECCION=sysdate, USUARIO_ULTMODIFICACION=?, FECHA_ULTMODIFICACION=sysdate  WHERE ID_INSPECCION=?";
			}
		} else {
			query = "UPDATE INSPECCIONES SET ID_ESTADO_INSPECCION=?, ID_RESULTADO_INSPECCION=?, OBJETO_INSPECCION=?, ID_PROTOCOLO=?, ID_INSPECTOR=?, OBSERVACIONES_RESULTADO=?, ID_CAMPAINA=?, ID_AGRUPACION=?, FECHA_ASIG_INSPECCION=NULL, USUARIO_ULTMODIFICACION=?, FECHA_ULTMODIFICACION=sysdate  WHERE ID_INSPECCION=?";
		}

		this.jdbcTemplate.update(query, inspecciones.getEstadoInspeccion().getIdEstadoInspeccion(),
				inspecciones.getResultadoInspeccion().getIdResultadoInspeccion(), inspecciones.getObjetoInspeccion(),
				inspecciones.getIdProtocolo().getIdProtocolo(), inspecciones.getInspector().getIdInspector(),
				inspecciones.getObservacionesResultado(), inspecciones.getCampaina().getIdCampaina(),
				inspecciones.getAgrupacion().getIdAgrupacion(), inspecciones.getUsuarioUltmodificacion(),
				inspecciones.getIdInspeccion());
		return inspecciones;
	}

	/**
	 * Finds a single row in the Inspecciones table.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @return Inspecciones
	 */
	@Override
	@Transactional(readOnly = true)
	public Inspecciones find(Inspecciones inspecciones) {
		String query = "SELECT t1.ID_INSPECCION IDINSPECCION, t1.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL, t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION, "
				+ " t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION, t1.ID_DIRECCION IDDIRECCION, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_CAMPAINA IDCAMPAINA, "
				+ " t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION, t1.OBJETO_INSPECCION OBJETOINSPECCION, t1.ID_ORIGEN_INSPECCION IDORIGENINSPECCION, t1.FECHA_REGISTRO FECHAREGISTRO, "
				+ " t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t1.ID_PROTOCOLO IDPROTOCOLO, "
				+ " t1.ID_INSPECTOR IDINSPECTOR, t1.OBSERVACIONES_RESULTADO OBSERVACIONESRESULTADO, t1.ENVIADO_TABLET ENVIADOTABLET, t1.FECHA_FIN_INSPECCION FECHAFININSPECCION, "
				+ " t1.ID_AGRUPACION IDAGRUPACION, t2.DESCRIPCION_CASTELLANO PROTOCOLODESCES, t2.DESCRIPCION_EUSKERA PROTOCOLODESCEU, "
				+ " t3.DESCRIPCION_CASTELLANO DIRDESCES, t3.DESCRIPCION_EUSKERA DIRDESCEU "
				+ " FROM INSPECCIONES t1, PROTOCOLOS t2, DIRECCIONES t3  "
				+ " WHERE t1.ID_PROTOCOLO = t2.ID_PROTOCOLO(+) AND t1.ID_DIRECCION = t3.ID_DIRECCION(+) AND t1.ID_INSPECCION = ? ";

		List<Inspecciones> inspeccionesList = this.jdbcTemplate.query(query, this.rwMapFind,
				inspecciones.getIdInspeccion());
		return DataAccessUtils.uniqueResult(inspeccionesList);
	}

	@Override
	public Inspecciones findByIdInspeccionMovil(String idInspeccionMovil) {
		String query = "SELECT t1.ID_INSPECCION IDINSPECCION, t1.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL, t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION, "
				+ " t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION, t1.ID_DIRECCION IDDIRECCION, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_CAMPAINA IDCAMPAINA, "
				+ " t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION, t1.OBJETO_INSPECCION OBJETOINSPECCION, t1.ID_ORIGEN_INSPECCION IDORIGENINSPECCION, t1.FECHA_REGISTRO FECHAREGISTRO, "
				+ " t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t1.ID_PROTOCOLO IDPROTOCOLO, "
				+ " t1.ID_INSPECTOR IDINSPECTOR, t1.OBSERVACIONES_RESULTADO OBSERVACIONESRESULTADO, t1.ENVIADO_TABLET ENVIADOTABLET, t1.FECHA_FIN_INSPECCION FECHAFININSPECCION, "
				+ " t1.ID_AGRUPACION IDAGRUPACION, t2.DESCRIPCION_CASTELLANO PROTOCOLODESCES, t2.DESCRIPCION_EUSKERA PROTOCOLODESCEU, "
				+ " t3.DESCRIPCION_CASTELLANO DIRDESCES, t3.DESCRIPCION_EUSKERA DIRDESCEU "
				+ " FROM INSPECCIONES t1, PROTOCOLOS t2, DIRECCIONES t3 "
				+ " WHERE t1.ID_PROTOCOLO = t2.ID_PROTOCOLO(+) AND t1.ID_DIRECCION = t3.ID_DIRECCION(+) AND t1.ID_INSPECCION_MOVIL = ? ";

		List<Inspecciones> inspeccionesList = this.jdbcTemplate.query(query, this.rwMapFind, idInspeccionMovil);
		return DataAccessUtils.uniqueResult(inspeccionesList);
	}

	@Override
	public Inspecciones findByIdentificadorInspeccion(String identificadorInspeccion) {
		String query = "SELECT t1.ID_INSPECCION IDINSPECCION, t1.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL, t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION, "
				+ " t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION, t1.ID_DIRECCION IDDIRECCION, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_CAMPAINA IDCAMPAINA, "
				+ " t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION, t1.OBJETO_INSPECCION OBJETOINSPECCION, t1.ID_ORIGEN_INSPECCION IDORIGENINSPECCION, t1.FECHA_REGISTRO FECHAREGISTRO, "
				+ " t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t1.ID_PROTOCOLO IDPROTOCOLO, "
				+ " t1.ID_INSPECTOR IDINSPECTOR, t1.OBSERVACIONES_RESULTADO OBSERVACIONESRESULTADO, t1.ENVIADO_TABLET ENVIADOTABLET, t1.FECHA_FIN_INSPECCION FECHAFININSPECCION, "
				+ " t1.ID_AGRUPACION IDAGRUPACION, t2.DESCRIPCION_CASTELLANO PROTOCOLODESCES, t2.DESCRIPCION_EUSKERA PROTOCOLODESCEU, "
				+ " t3.DESCRIPCION_CASTELLANO DIRDESCES, t3.DESCRIPCION_EUSKERA DIRDESCEU "
				+ " FROM INSPECCIONES t1, PROTOCOLOS t2, DIRECCIONES t3  "
				+ " WHERE t1.ID_PROTOCOLO = t2.ID_PROTOCOLO(+) AND t1.ID_DIRECCION = t3.ID_DIRECCION(+) AND t1.IDENTIFICADOR_INSPECCION = ? ";

		List<Inspecciones> inspeccionesList = this.jdbcTemplate.query(query, this.rwMapFind, identificadorInspeccion);
		return DataAccessUtils.requiredUniqueResult(inspeccionesList);
	}

	@Override
	public Integer findUltimoIdentificadorByAnioDireccion(int anio, String direccionLetra) {
		String query = "SELECT SUBSTR(t7901.IDENTIFICADOR_INSPECCION, 10, length(t7901.IDENTIFICADOR_INSPECCION)) SECUENCIAIDENTIFICADOR FROM INSPECCIONES t7901 WHERE t7901.IDENTIFICADOR_INSPECCION like ? ORDER BY t7901.IDENTIFICADOR_INSPECCION DESC";

		List<Object> params = new ArrayList<Object>();
		params.add("%" + direccionLetra + "-" + anio + "%");

		List<Integer> listaSecuenciasIdentificador = this.jdbcTemplate.query(query, this.rwMapSecuenciaIdentificador,
				params.toArray());

		if (!listaSecuenciasIdentificador.isEmpty()) {
			return listaSecuenciasIdentificador.get(0);
		} else {
			return null;
		}
	}

	/**
	 * Removes a single row in the Inspecciones table.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @return
	 */
	@Override
	public void remove(Inspecciones inspecciones) {
		String query = "DELETE FROM INSPECCIONES WHERE ID_INSPECCION=?";
		this.jdbcTemplate.update(query, inspecciones.getIdInspeccion());
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	@Override
	public List<Inspecciones> getMultiple(Inspecciones filterInspecciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {

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

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

		StringBuilder sbMultipleSQL = TableManager.getSelectMultipleQuery(tableRequestDto, Inspecciones.class, params,
				"ID_INSPECCION");

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

	/**
	 * Finds a list of rows in the Inspecciones table.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<Inspecciones>
	 */
	@Override
	@Transactional(readOnly = true)
	public List<Inspecciones> findAll(Inspecciones inspecciones, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_INSPECCION IDINSPECCION, t1.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL,t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION,t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION,t1.ID_DIRECCION IDDIRECCION,t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_CAMPAINA IDCAMPAINA,t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION,t1.OBJETO_INSPECCION OBJETOINSPECCION,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");

		query.append("FROM INSPECCIONES t1 ");

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

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

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

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

	/**
	 * Finds rows in the Inspecciones table using like.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Inspecciones>
	 */
	@Override
	@Transactional(readOnly = true)
	public List<Inspecciones> findAllLike(Inspecciones inspecciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {

		StringBuilder query = new StringBuilder();

		query.append("SELECT t7901.ID_INSPECCION IDINSPECCION, ");
		query.append("t7901.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL,");
		query.append("t7901.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION, ");
		query.append("t7901.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION, ");
		query.append("TResul.DESCRIPCION_CASTELLANO RESULTADODESCRIPCIONCASTELLANO, ");
		query.append("TResul.DESCRIPCION_EUSKERA RESULTADODESCRIPCIONEUSKERA, ");
		query.append("t7901.ID_DIRECCION IDDIRECCION, ");
		query.append("t7901.ID_EXPEDIENTE IDEXPEDIENTE, ");
		query.append("t6102.FOLDER_NUMBER FOLDERNUM, ");
		query.append("CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN t6102.TITULO ELSE t7922.TITULO END TITULO, ");
		query.append("t7901.ID_CAMPAINA IDCAMPAINA, ");
		query.append("t7901.ID_ESTADO_INSPECCION IDESTADOINSPECCION, ");
		query.append("t7901.OBJETO_INSPECCION OBJETOINSPECCION, ");
		query.append("t7901.ID_ORIGEN_INSPECCION IDORIGENINSPECCION, ");
		query.append("t7901.FECHA_LIM_INSPECCION FECHALIMINSPECCION, ");
		query.append("t7901.ID_PROTOCOLO IDPROTOCOLO, ");
		query.append("t7901.FECHA_REGISTRO FECHAREGIS, ");
		query.append("t7901.FECHA_ASIG_INSPECCION FECHAASIGINSPECCION, ");
		query.append(
				"CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.DIRECCION ELSE Tinsp.DIRECCION END DIRECCION, ");
		query.append("CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.NUMERO ELSE Tinsp.NUMERO END NUMERO, ");
		query.append(
				"CASE  WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.ESCALERA ELSE Tinsp.ESCALERA END ESCALERA, ");
		query.append("CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.PISO ELSE Tinsp.PISO END PISO, ");
		query.append("CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.LETRA ELSE Tinsp.LETRA END LETRA, ");
		query.append(
				"CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.DSOMUNICIPIO ELSE Tinsp.DSOMUNICIPIO END DSOMUNICIPIO, ");
		query.append(
				"CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN Texp.DSOLOCALIDAD ELSE Tinsp.DSOLOCALIDAD END DSOLOCALIDAD ");

		query.append(" FROM INSPECCIONES t7901, EXPEDIENTES t6102, REL_EST_INS t7922,");
		query.append("INSPECTORES t7904, ");
		query.append(
				"(SELECT t7905.ID_RESULTADO_INSPECCION, t7905.ID_DES_RES_INS, t7927.DESCRIPCION_CASTELLANO, t7927.DESCRIPCION_EUSKERA FROM RESULTADOS_INSPECCION t7905, DES_RES_INS t7927 WHERE t7905.ID_DES_RES_INS = t7927.ID_DES_RES_INS ) TResul, ");

		query.append("ESTADOS_INSPECCION t7906, ");

		query.append(
				"(SELECT t6151.ID_EXPEDIENTE, t_direccion.IDENTIFICADOR_ESTABLECIMIENTO, t_direccion.DIRECCION, t_direccion.NUMERO, t_direccion.ESCALERA, t_direccion.PISO, t_direccion.LETRA, t_direccion.DSOMUNICIPIO DSOMUNICIPIO, t_direccion.DSOLOCALIDAD DSOLOCALIDAD, t_direccion.ID_PROVINCIA, t_direccion.ID_MUNICIPIO, t_direccion.ID_LOCALIDAD, t_direccion.CODIGO_POSTAL ");
		query.append(
				" FROM REL_EXP_DIR t6151, (SELECT t6136.ID_DIRECCION, t6136.IDENTIFICADOR_ESTABLECIMIENTO, t6136.DIRECCION, t6136.NUMERO, t6136.ESCALERA, t6136.PISO, t6136.LETRA, MUN.DS_O DSOMUNICIPIO, LOC.DS_O DSOLOCALIDAD, t6136.ID_PROVINCIA, t6136.ID_MUNICIPIO, t6136.ID_LOCALIDAD, t6136.CODIGO_POSTAL FROM DATOS_DIRECCIONES t6136, MUNICIPIOS MUN, LOCALIDADES LOC WHERE (t6136.ID_TIPO_DIRECCION = 2 OR t6136.ID_TIPO_DIRECCION = 3) AND t6136.ID_PROVINCIA = MUN.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = MUN.ID(+) AND t6136.ID_PROVINCIA = LOC.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = LOC.MUNICIPIO_ID(+) AND t6136.ID_LOCALIDAD = LOC.ID(+) ) t_direccion");
		query.append(" WHERE t6151.ID_DIRECCION = t_direccion.ID_DIRECCION) Texp,");

		query.append(
				" (SELECT t7922.ID_INSPECCION, t_direccion.IDENTIFICADOR_ESTABLECIMIENTO, t_direccion.DIRECCION, t_direccion.NUMERO, t_direccion.ESCALERA, t_direccion.PISO, t_direccion.LETRA, t_direccion.DSOMUNICIPIO DSOMUNICIPIO, t_direccion.DSOLOCALIDAD DSOLOCALIDAD, t_direccion.ID_PROVINCIA, t_direccion.ID_MUNICIPIO, t_direccion.ID_LOCALIDAD, t_direccion.CODIGO_POSTAL ");
		query.append(
				" FROM REL_EST_INS t7922, (SELECT t6136.ID_DIRECCION, t6136.DIRECCION, t6136.IDENTIFICADOR_ESTABLECIMIENTO, t6136.NUMERO, t6136.ESCALERA, t6136.PISO, t6136.LETRA, MUN.DS_O DSOMUNICIPIO, LOC.DS_O DSOLOCALIDAD, t6136.ID_PROVINCIA, t6136.ID_MUNICIPIO, t6136.ID_LOCALIDAD, t6136.CODIGO_POSTAL FROM DATOS_DIRECCIONES t6136, MUNICIPIOS MUN, LOCALIDADES LOC WHERE (t6136.ID_TIPO_DIRECCION = 2 OR t6136.ID_TIPO_DIRECCION = 3) AND t6136.ID_PROVINCIA = MUN.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = MUN.ID(+) AND t6136.ID_PROVINCIA = LOC.PROVINCIA_ID(+)  AND t6136.ID_MUNICIPIO = LOC.MUNICIPIO_ID(+) AND t6136.ID_LOCALIDAD = LOC.ID(+) ) t_direccion");
		query.append(" WHERE t7922.ID_DIRECCION = t_direccion.ID_DIRECCION) Tinsp");

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

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

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

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

	/**
	 * Counts rows in the Inspecciones table using like.
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Override
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Inspecciones inspecciones, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1)");
		query.append(" FROM INSPECCIONES t7901, EXPEDIENTES t6102, REL_EST_INS t7922,");
		query.append("INSPECTORES t7904, ");
		query.append(
				"(SELECT t7905.ID_RESULTADO_INSPECCION, t7905.ID_DES_RES_INS, t7927.DESCRIPCION_CASTELLANO, t7927.DESCRIPCION_EUSKERA FROM RESULTADOS_INSPECCION t7905, DES_RES_INS t7927 WHERE t7905.ID_DES_RES_INS = t7927.ID_DES_RES_INS ) TResul, ");

		if (inspecciones != null && inspecciones.getIdsEstadoInspeccion() != null) {
			query.append("(SELECT ID_ESTADO_INSPECCION FROM ESTADOS_INSPECCION WHERE ID_ESTADO_INSPECCION IN ("
					+ inspecciones.getIdsEstadoInspeccion() + ") ) t7906, ");
		} else {
			query.append("ESTADOS_INSPECCION t7906, ");

		}

		query.append(
				"(SELECT t6151.ID_EXPEDIENTE, t_direccion.IDENTIFICADOR_ESTABLECIMIENTO, t_direccion.DIRECCION, t_direccion.NUMERO, t_direccion.ESCALERA, t_direccion.PISO, t_direccion.LETRA, t_direccion.DSOMUNICIPIO DSOMUNICIPIO, t_direccion.DSOLOCALIDAD DSOLOCALIDAD, t_direccion.ID_PROVINCIA, t_direccion.ID_MUNICIPIO, t_direccion.ID_LOCALIDAD, t_direccion.CODIGO_POSTAL ");
		query.append(
				" FROM REL_EXP_DIR t6151, (SELECT t6136.ID_DIRECCION, t6136.IDENTIFICADOR_ESTABLECIMIENTO, t6136.DIRECCION, t6136.NUMERO, t6136.ESCALERA, t6136.PISO, t6136.LETRA, MUN.DS_O DSOMUNICIPIO, LOC.DS_O DSOLOCALIDAD, t6136.ID_PROVINCIA, t6136.ID_MUNICIPIO, t6136.ID_LOCALIDAD, t6136.CODIGO_POSTAL FROM DATOS_DIRECCIONES t6136, MUNICIPIOS MUN, LOCALIDADES LOC WHERE (t6136.ID_TIPO_DIRECCION = 2 OR t6136.ID_TIPO_DIRECCION = 3) AND t6136.ID_PROVINCIA = MUN.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = MUN.ID(+) AND t6136.ID_PROVINCIA = LOC.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = LOC.MUNICIPIO_ID(+) AND t6136.ID_LOCALIDAD = LOC.ID(+) ) t_direccion");
		query.append(" WHERE t6151.ID_DIRECCION = t_direccion.ID_DIRECCION");

		query.append(") Texp,");
		query.append(
				" (SELECT t7922.ID_INSPECCION, t_direccion.IDENTIFICADOR_ESTABLECIMIENTO, t_direccion.DIRECCION, t_direccion.NUMERO, t_direccion.ESCALERA, t_direccion.PISO, t_direccion.LETRA, t_direccion.DSOMUNICIPIO DSOMUNICIPIO, t_direccion.DSOLOCALIDAD DSOLOCALIDAD, t_direccion.ID_PROVINCIA, t_direccion.ID_MUNICIPIO, t_direccion.ID_LOCALIDAD, t_direccion.CODIGO_POSTAL ");
		query.append(
				" FROM REL_EST_INS t7922, (SELECT t6136.ID_DIRECCION, t6136.DIRECCION, t6136.IDENTIFICADOR_ESTABLECIMIENTO, t6136.NUMERO, t6136.ESCALERA, t6136.PISO, t6136.LETRA, MUN.DS_O DSOMUNICIPIO, LOC.DS_O DSOLOCALIDAD, t6136.ID_PROVINCIA, t6136.ID_MUNICIPIO, t6136.ID_LOCALIDAD, t6136.CODIGO_POSTAL FROM DATOS_DIRECCIONES t6136, MUNICIPIOS MUN, LOCALIDADES LOC WHERE (t6136.ID_TIPO_DIRECCION = 2 OR t6136.ID_TIPO_DIRECCION = 3) AND t6136.ID_PROVINCIA = MUN.PROVINCIA_ID(+) AND t6136.ID_MUNICIPIO = MUN.ID(+) AND t6136.ID_PROVINCIA = LOC.PROVINCIA_ID(+)  AND t6136.ID_MUNICIPIO = LOC.MUNICIPIO_ID(+) AND t6136.ID_LOCALIDAD = LOC.ID(+) ) t_direccion");
		query.append(" WHERE t7922.ID_DIRECCION = t_direccion.ID_DIRECCION");
		// Where clause & Params

		query.append(") Tinsp");

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

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

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

	@Override
	public List<InspeccionDato> findInspeccionesREST(String inspector) {
		String query = "SELECT t7901.id_inspeccion idinspeccion, t7901.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL, t7901.identificador_inspeccion identificadorinspeccion, t7901.id_resultado_inspeccion idresultadoinspeccion, t7901.id_direccion iddireccion, t7901.id_campaina idcampaina, t7901.id_estado_inspeccion idestadoinspeccion, t7901.id_protocolo idprotocolo, t7901.id_origen_inspeccion idorigeninspeccion, t7901.id_inspector idinspector, t7901.id_expediente idexpediente, t7901.OBJETO_INSPECCION OBJETOINSPECCION, t7901.OBSERVACIONES_RESULTADO OBSERVACIONESRESULTADO, t6102.folder_number numexpediente, CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN t6102.TITULO ELSE t7922.TITULO END tituloexpediente, CASE WHEN t7901.ID_EXPEDIENTE IS NOT NULL THEN t6102.id_procedimiento ELSE t7922.id_procedimiento END idprocedimiento FROM inspecciones t7901, expedientes t6102, inspectores t7904, rel_est_ins t7922 WHERE t7901.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE(+) AND t7901.ID_INSPECCION = t7922.ID_INSPECCION(+) AND t7901.id_inspector = t7904.id_inspector AND t7904.usuario_xlnets = ? AND t7901.ENVIADO_TABLET  = ?";

		return this.jdbcTemplate.query(query, this.rwMapInspeccionDato, inspector, Constantes.ENVIADO_TABLET_SI);
	}

	@Override
	public List<InspeccionDocumentacion> findDocumentacionInspeccionesREST(String inspector) {
		String query = "SELECT t1.id_inspeccion idinspeccion FROM inspecciones t1, inspectores t2 WHERE t1.id_inspector = t2.id_inspector AND t2.usuario_xlnets = ? AND t1.ENVIADO_TABLET = 1";

		return this.jdbcTemplate.query(query, this.rwMapInspeccionDocumentacion, inspector);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

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

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

	/**
	 * Reorder the data list of Inspecciones selected for rup_table
	 *
	 * @param inspecciones
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Inspecciones>>
	 */
	@Override
	public List<TableRowDto<Inspecciones>> reorderSelection(Inspecciones inspecciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INSPECCION IDINSPECCION,t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION,t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION,t1.ID_DIRECCION IDDIRECCION,t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_CAMPAINA IDCAMPAINA,t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION,t1.OBJETO_INSPECCION OBJETOINSPECCION,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");
		// FROM
		query.append("FROM INSPECCIONES t1 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(inspecciones, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		// Parámetros de filtrado
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhere.get("params");

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

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            Inspecciones
	 * @param searchParams
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Inspecciones>>
	 */
	@Override
	public List<TableRowDto<Inspecciones>> search(Inspecciones filterParams, Inspecciones searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INSPECCION IDINSPECCION,t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION,t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION,t1.ID_DIRECCION IDDIRECCION,t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_CAMPAINA IDCAMPAINA,t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION,t1.OBJETO_INSPECCION OBJETOINSPECCION,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");
		// FROM
		query.append("FROM INSPECCIONES t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhereFilter.get("query"));
		query.append(where);
		// Filter params
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhereFilter.get("params");

		// BUSQUEDA
		Map<String, Object> mapaWhereSearch = this.getWhereLikeMap(searchParams, startsWith);
		String searchSQL = ((StringBuilder) mapaWhereSearch.get("query")).toString();
		// Search params
		@SuppressWarnings("unchecked")
		List<Object> searchParamList = (List<Object>) mapaWhereSearch.get("params");

		// SQL
		StringBuilder sbReorderSelectionSQL = TableManager.getSearchQuery(query, tableRequestDto, Inspecciones.class,
				filterParamList, searchSQL, searchParamList, from_alias, "ID_INSPECCION");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterinspecciones
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(Inspecciones filterinspecciones, TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INSPECCION IDINSPECCION,t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION,t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION,t1.ID_DIRECCION IDDIRECCION,t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_CAMPAINA IDCAMPAINA,t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION,t1.OBJETO_INSPECCION OBJETOINSPECCION,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");
		// FROM
		query.append("FROM INSPECCIONES t1 ");

		// WHERE
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterinspecciones, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		StringBuilder sbRemoveMultipleSQL = TableManager.getRemoveMultipleQuery(tableRequestDto, Inspecciones.class,
				query, params, "ID_INSPECCION");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical Inspecciones table.
	 *
	 * @param filterInspecciones
	 *            Inspecciones
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<JerarquiaDto<Inspecciones>>
	 */
	@Override
	public List<JerarquiaDto<Inspecciones>> findAllLikeJerarquia(Inspecciones filterInspecciones,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_INSPECCION IDINSPECCION,t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION,t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION,t1.ID_DIRECCION IDDIRECCION,t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_CAMPAINA IDCAMPAINA,t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION,t1.OBJETO_INSPECCION OBJETOINSPECCION,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM INSPECCIONES t1 ");
		List<String> from = new ArrayList<String>();
		from.add("INSPECCIONES");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (inspecciones != null && inspecciones.getIdInspeccion() != null) {
			where.append(" AND t1.ID_INSPECCION = ?");
			params.add(inspecciones.getIdInspeccion());
		}
		if (inspecciones != null && inspecciones.getIdentificadorInspeccion() != null) {
			where.append(" AND t1.IDENTIFICADOR_INSPECCION = ?");
			params.add(inspecciones.getIdentificadorInspeccion());
		}
		if (inspecciones != null && inspecciones.getResultadoInspeccion().getIdResultadoInspeccion() != null) {
			where.append(" AND t1.ID_RESULTADO_INSPECCION = ?");
			params.add(inspecciones.getResultadoInspeccion().getIdResultadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getDireccion() != null
				&& inspecciones.getDireccion().getIdDireccion() != null) {
			where.append(" AND t1.ID_DIRECCION = ?");
			params.add(inspecciones.getDireccion().getIdDireccion());
		}
		if (inspecciones != null && inspecciones.getExpediente().getIdExpediente() != null) {
			where.append(" AND t1.ID_EXPEDIENTE = ?");
			params.add(inspecciones.getExpediente().getIdExpediente());
		}
		if (inspecciones != null && inspecciones.getCampaina().getIdCampaina() != null) {
			where.append(" AND t1.ID_CAMPAINA = ?");
			params.add(inspecciones.getCampaina().getIdCampaina());
		}
		if (inspecciones != null && inspecciones.getEstadoInspeccion().getIdEstadoInspeccion() != null) {
			where.append(" AND t1.ID_ESTADO_INSPECCION = ?");
			params.add(inspecciones.getEstadoInspeccion().getIdEstadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getObjetoInspeccion() != null) {
			where.append(" AND t1.OBJETO_INSPECCION = ?");
			params.add(inspecciones.getObjetoInspeccion());
		}
		if (inspecciones != null && inspecciones.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(inspecciones.getFechaRegistro());
		}
		if (inspecciones != null && inspecciones.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(inspecciones.getUsuarioRegistro());
		}
		if (inspecciones != null && inspecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(inspecciones.getFechaUltmodificacion());
		}
		if (inspecciones != null && inspecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND t1.USUARIO_ULTMODIFICACION = ?");
			params.add(inspecciones.getUsuarioUltmodificacion());
		}

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

		return mapWhere;
	}

	private Map<String, ?> getWhereMapFiltro(Inspecciones inspecciones, Boolean startsWith) {

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

		where.append(" AND t7901.ID_RESULTADO_INSPECCION = TResul.ID_RESULTADO_INSPECCION(+) "
				+ "AND t7901.ID_INSPECTOR = t7904.ID_INSPECTOR(+) "
				+ "AND t7901.ID_ESTADO_INSPECCION = t7906.ID_ESTADO_INSPECCION(+) "
				+ "AND t7901.ID_EXPEDIENTE = Texp.ID_EXPEDIENTE(+) "
				+ "AND t7901.ID_INSPECCION = Tinsp.ID_INSPECCION(+) "
				+ "AND t7901.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE(+) "
				+ "AND t7901.ID_INSPECCION = t7922.ID_INSPECCION(+) ");

		if (inspecciones != null && inspecciones.getnRegistro() != null) {
			where.append(
					" AND (UPPER(Texp.IDENTIFICADOR_ESTABLECIMIENTO) LIKE ? ESCAPE '\\' OR UPPER(Tinsp.IDENTIFICADOR_ESTABLECIMIENTO) LIKE ? ESCAPE '\\')");
			params.add("%" + inspecciones.getnRegistro().toUpperCase() + "%");
			params.add("%" + inspecciones.getnRegistro().toUpperCase() + "%");
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getIdProvincia() != null) {
			where.append(" AND (Texp.ID_PROVINCIA = ? OR Tinsp.ID_PROVINCIA = ?)");
			params.add(inspecciones.getDatosDirecciones().getIdProvincia());
			params.add(inspecciones.getDatosDirecciones().getIdProvincia());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getIdMunicipio() != null) {
			where.append(" AND (Texp.ID_MUNICIPIO = ? OR Tinsp.ID_MUNICIPIO = ?)");
			params.add(inspecciones.getDatosDirecciones().getIdMunicipio());
			params.add(inspecciones.getDatosDirecciones().getIdMunicipio());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getIdLocalidad() != null) {
			where.append(" AND (Texp.ID_LOCALIDAD = ? OR Tinsp.ID_LOCALIDAD = ?)");
			params.add(inspecciones.getDatosDirecciones().getIdLocalidad());
			params.add(inspecciones.getDatosDirecciones().getIdLocalidad());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getCodigoPostal() != null) {
			where.append(
					" AND (UPPER(Texp.CODIGO_POSTAL) like ? ESCAPE  '\\' OR UPPER(Tinsp.CODIGO_POSTAL) like ? ESCAPE  '\\')");
			if (startsWith) {
				params.add(inspecciones.getDatosDirecciones().getCodigoPostal() + "%");
				params.add(inspecciones.getDatosDirecciones().getCodigoPostal() + "%");
			} else {
				params.add("%" + inspecciones.getDatosDirecciones().getCodigoPostal() + "%");
				params.add("%" + inspecciones.getDatosDirecciones().getCodigoPostal() + "%");
			}

		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getNumero() != null) {
			where.append(" AND (Texp.NUMERO = ? OR Tinsp.NUMERO = ?)");
			params.add(inspecciones.getDatosDirecciones().getNumero());
			params.add(inspecciones.getDatosDirecciones().getNumero());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getEscalera() != null) {
			where.append(" AND (Texp.ESCALERA = ? OR Tinsp.ESCALERA = ?)");
			params.add(inspecciones.getDatosDirecciones().getEscalera());
			params.add(inspecciones.getDatosDirecciones().getEscalera());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getPiso() != null) {
			where.append(" AND (Texp.PISO = ? OR Tinsp.PISO = ?)");
			params.add(inspecciones.getDatosDirecciones().getPiso());
			params.add(inspecciones.getDatosDirecciones().getPiso());
		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getLetra() != null) {
			where.append(" AND (UPPER(Texp.LETRA) like ? ESCAPE  '\\' OR UPPER(Tinsp.LETRA) like ? ESCAPE  '\\')");
			if (startsWith) {
				params.add(inspecciones.getDatosDirecciones().getLetra().toUpperCase() + "%");
				params.add(inspecciones.getDatosDirecciones().getLetra().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getDatosDirecciones().getLetra().toUpperCase() + "%");
				params.add("%" + inspecciones.getDatosDirecciones().getLetra().toUpperCase() + "%");
			}

		}
		if (inspecciones != null && inspecciones.getDatosDirecciones() != null
				&& inspecciones.getDatosDirecciones().getDireccion() != null) {
			where.append(
					" AND (UPPER(Texp.DIRECCION) like ? ESCAPE  '\\' OR UPPER(Tinsp.DIRECCION) like ? ESCAPE  '\\')");
			if (startsWith) {
				params.add(inspecciones.getDatosDirecciones().getDireccion().toUpperCase() + "%");
				params.add(inspecciones.getDatosDirecciones().getDireccion().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getDatosDirecciones().getDireccion().toUpperCase() + "%");
				params.add("%" + inspecciones.getDatosDirecciones().getDireccion().toUpperCase() + "%");
			}

		}

		if (inspecciones != null && inspecciones.getIdInspeccion() != null) {
			where.append(" AND t7901.ID_INSPECCION = ?");
			params.add(inspecciones.getIdInspeccion());
		}
		if (inspecciones != null && inspecciones.getIdentificadorInspeccion() != null) {
			where.append(" AND UPPER(t7901.IDENTIFICADOR_INSPECCION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getIdentificadorInspeccion().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getIdentificadorInspeccion().toUpperCase() + "%");
			}
			where.append(" AND t7901.IDENTIFICADOR_INSPECCION IS NOT NULL");
		}
		if (inspecciones != null && inspecciones.getCampaina() != null
				&& inspecciones.getCampaina().getIdCampaina() != null) {
			where.append(" AND t7901.ID_CAMPAINA = ?");
			params.add(inspecciones.getCampaina().getIdCampaina());
		}
		if (inspecciones != null && inspecciones.getAgrupacion() != null
				&& inspecciones.getAgrupacion().getIdAgrupacion() != null) {
			where.append(" AND t7901.ID_AGRUPACION = ?");
			params.add(inspecciones.getAgrupacion().getIdAgrupacion());
		}
		if (inspecciones != null && inspecciones.getResultadoInspeccion() != null
				&& inspecciones.getResultadoInspeccion().getIdResultadoInspeccion() != null) {
			where.append(" AND t7901.ID_RESULTADO_INSPECCION = ?");
			params.add(inspecciones.getResultadoInspeccion().getIdResultadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getDireccion() != null
				&& inspecciones.getDireccion().getIdDireccion() != null) {
			where.append(" AND t7901.ID_DIRECCION = ?");
			params.add(inspecciones.getDireccion().getIdDireccion());
		}
		if (inspecciones != null && inspecciones.getExpediente() != null
				&& inspecciones.getExpediente().getIdExpediente() != null) {
			where.append(" AND t7901.ID_EXPEDIENTE = ?");
			params.add(inspecciones.getExpediente().getIdExpediente());
		}
		if (inspecciones != null && inspecciones.getEstadoInspeccion() != null
				&& inspecciones.getEstadoInspeccion().getIdEstadoInspeccion() != null) {
			where.append(" AND t7901.ID_ESTADO_INSPECCION = ?");
			params.add(inspecciones.getEstadoInspeccion().getIdEstadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getObjetoInspeccion() != null) {
			where.append(" AND t7901.OBJETO_INSPECCION = ?");
			params.add(inspecciones.getObjetoInspeccion());
		}
		if (inspecciones != null && inspecciones.getFechaRegistro() != null) {
			where.append(" AND t7901.FECHA_REGISTRO = ?");
			params.add(inspecciones.getFechaRegistro());
		}
		if (inspecciones != null && inspecciones.getUsuarioRegistro() != null) {
			where.append(" AND t7901.USUARIO_REGISTRO = ?");
			params.add(inspecciones.getUsuarioRegistro());
		}
		if (inspecciones != null && inspecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t7901.FECHA_ULTMODIFICACION = ?");
			params.add(inspecciones.getFechaUltmodificacion());
		}
		if (inspecciones != null && inspecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND t7901.USUARIO_ULTMODIFICACION = ?");
			params.add(inspecciones.getUsuarioUltmodificacion());
		}
		if (inspecciones != null && inspecciones.getIdOrigenInspeccion() != null) {
			where.append(" AND t7901.ID_ORIGEN_INSPECCION = ?");
			params.add(inspecciones.getIdOrigenInspeccion());
		}
		if (inspecciones != null && inspecciones.getFechaAsigInspeccion() != null) {
			where.append(" AND t7901.FECHA_ASIG_INSPECCION = ?");
			params.add(inspecciones.getFechaAsigInspeccion());
		}
		if (inspecciones != null && inspecciones.getExpediente() != null
				&& inspecciones.getExpediente().getFolderNumber() != null) {
			where.append(" AND UPPER(t6102.FOLDER_NUMBER) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getExpediente().getFolderNumber().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getExpediente().getFolderNumber().toUpperCase() + "%");
			}
			where.append(" AND t6102.FOLDER_NUMBER IS NOT NULL");
		}
		if (inspecciones != null && inspecciones.getInspector() != null
				&& inspecciones.getInspector().getIdInspector() != null) {
			if (inspecciones.getInspector().getIdInspector() == 0) {
				// Sin inspector
				where.append(" AND t7901.ID_INSPECTOR IS NULL");
			} else if (inspecciones.getInspector().getIdInspector() == -1) {
				// Todos los inspectores
				where.append(" AND t7901.ID_INSPECTOR = t7904.ID_INSPECTOR");
			} else {
				// Inspector concreto
				where.append(" AND t7901.ID_INSPECTOR = ?");
				params.add(inspecciones.getInspector().getIdInspector());
			}
		}
		if (inspecciones != null && inspecciones.getExpediente() != null
				&& inspecciones.getExpediente().getTitulo() != null) {
			where.append(" AND ((UPPER(t6102.TITULO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getExpediente().getTitulo().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getExpediente().getTitulo().toUpperCase() + "%");
			}
			where.append(" AND t6102.TITULO IS NOT NULL) ");
			where.append(" OR ");
			where.append(" (UPPER(t7922.TITULO) like ? ESCAPE '\\'");
			if (startsWith) {
				params.add(inspecciones.getExpediente().getTitulo().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getExpediente().getTitulo().toUpperCase() + "%");
			}
			where.append(" AND t7922.TITULO IS NOT NULL)) ");
		}
		if (inspecciones != null && inspecciones.getIdsResultadoInspeccion() != null) {
			where.append(" AND TResul.ID_RESULTADO_INSPECCION IN (" + inspecciones.getIdsResultadoInspeccion() + ") ");
		}

		if (inspecciones != null && inspecciones.getIdsEstadoInspeccion() != null) {
			where.append(" AND t7906.ID_ESTADO_INSPECCION IN (" + inspecciones.getIdsEstadoInspeccion() + ") ");
		}

		if (inspecciones != null && inspecciones.getEnviadoTablet() != null && inspecciones.getEnviadoTablet() != -1) {

			if (inspecciones.getEnviadoTablet() == Constantes.ENVIADO_TABLET_NO) {
				where.append(" AND (t7901.ENVIADO_TABLET = ? OR t7901.ENVIADO_TABLET IS NULL)");
			} else {
				where.append(" AND t7901.ENVIADO_TABLET = ?");
			}

			params.add(inspecciones.getEnviadoTablet());
		}
		if (inspecciones.getCasoPropuesta() != null
				&& Constantes.PROPUESTA_EN_TRAMITE.equals(inspecciones.getCasoPropuesta())) {
			where.append(
					" AND ((SELECT COUNT(1) FROM REL_ART_INF_PRO_SAN t7931, PROPUESTAS_SANCION t7930 WHERE t7931.ID_PROPUESTA_SANCION = t7930.ID_PROPUESTA_SANCION AND t7930.ID_INSPECCION = t7901.ID_INSPECCION) > 0) AND ((SELECT COUNT(1) FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = t7901.ID_INSPECCION) = 0)");
		}
		if (inspecciones.getCasoPropuesta() != null
				&& Constantes.PROPUESTA_ENVIADA.equals(inspecciones.getCasoPropuesta())) {
			where.append(
					" AND (SELECT COUNT(1) FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = t7901.ID_INSPECCION AND t6128.ID_ESTADO_PRO_SAN  IS NOT NULL AND t6128.ID_ESTADO_PRO_SAN NOT IN (3, 5, 8, 10)) > 0");
		}
		if (inspecciones.getCasoPropuesta() != null
				&& Constantes.PROPUESTA_EXPEDIENTE_SANCIONADOR.equals(inspecciones.getCasoPropuesta())) {
			where.append(
					" AND (SELECT COUNT(1) FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = t7901.ID_INSPECCION AND t6128.ID_ESTADO_PRO_SAN IN (5, 10)) > 0");
		}
		if (inspecciones.getCasoPropuesta() != null
				&& Constantes.PROPUESTA_SUBSANAR.equals(inspecciones.getCasoPropuesta())) {
			where.append(
					" AND (SELECT COUNT(1) FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = t7901.ID_INSPECCION AND t6128.ID_ESTADO_PRO_SAN IN (3, 8)) > 0");
		}

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

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

		if (inspecciones != null && inspecciones.getIdInspeccion() != null) {
			where.append(" AND t1.ID_INSPECCION = ?");
			params.add(inspecciones.getIdInspeccion());
		}
		if (inspecciones != null && inspecciones.getIdentificadorInspeccion() != null) {
			where.append(" AND UPPER(t1.IDENTIFICADOR_INSPECCION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getIdentificadorInspeccion().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getIdentificadorInspeccion().toUpperCase() + "%");
			}
			where.append(" AND t1.IDENTIFICADOR_INSPECCION IS NOT NULL");
		}
		if (inspecciones != null && inspecciones.getResultadoInspeccion() != null
				&& inspecciones.getResultadoInspeccion().getIdResultadoInspeccion() != null) {
			where.append(" AND t1.ID_RESULTADO_INSPECCION = ?");
			params.add(inspecciones.getResultadoInspeccion().getIdResultadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getDireccion() != null
				&& inspecciones.getDireccion().getIdDireccion() != null) {
			where.append(" AND t1.ID_DIRECCION = ?");
			params.add(inspecciones.getDireccion().getIdDireccion());
		}
		if (inspecciones != null && inspecciones.getExpediente() != null
				&& inspecciones.getExpediente().getIdExpediente() != null) {
			where.append(" AND t1.ID_EXPEDIENTE = ?");
			params.add(inspecciones.getExpediente().getIdExpediente());
		}
		if (inspecciones != null && inspecciones.getCampaina() != null
				&& inspecciones.getCampaina().getIdCampaina() != null) {
			where.append(" AND t1.ID_CAMPAINA = ?");
			params.add(inspecciones.getCampaina().getIdCampaina());
		}
		if (inspecciones != null && inspecciones.getEstadoInspeccion() != null
				&& inspecciones.getEstadoInspeccion().getIdEstadoInspeccion() != null) {
			where.append(" AND t1.ID_ESTADO_INSPECCION = ?");
			params.add(inspecciones.getEstadoInspeccion().getIdEstadoInspeccion());
		}
		if (inspecciones != null && inspecciones.getObjetoInspeccion() != null) {
			where.append(" AND UPPER(t1.OBJETO_INSPECCION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getObjetoInspeccion().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getObjetoInspeccion().toUpperCase() + "%");
			}
			where.append(" AND t1.OBJETO_INSPECCION IS NOT NULL");
		}
		if (inspecciones != null && inspecciones.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(inspecciones.getFechaRegistro());
		}
		if (inspecciones != null && inspecciones.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}
		if (inspecciones != null && inspecciones.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(inspecciones.getFechaUltmodificacion());
		}
		if (inspecciones != null && inspecciones.getUsuarioUltmodificacion() != null) {
			where.append(" AND UPPER(t1.USUARIO_ULTMODIFICACION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(inspecciones.getUsuarioUltmodificacion().toUpperCase() + "%");
			} else {
				params.add("%" + inspecciones.getUsuarioUltmodificacion().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_ULTMODIFICACION IS NOT NULL");
		}

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

		return mapWhere;
	}
	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

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

	@Override
	public Inspecciones updateProtocolos(Inspecciones inspecciones) {
		String query = "UPDATE INSPECCIONES SET ID_PROTOCOLO=? WHERE ID_INSPECCION=?";
		this.jdbcTemplate.update(query, inspecciones.getIdProtocolo().getIdProtocolo(), inspecciones.getIdInspeccion());
		return inspecciones;
	}

	@Override
	public List<Inspecciones> asignarInspector(List<Inspecciones> listaInspecciones) {

		String query = "UPDATE INSPECCIONES SET ID_INSPECTOR = ?, FECHA_ASIG_INSPECCION = sysdate WHERE ID_INSPECCION = ?";

		for (int x = 0; x < listaInspecciones.size(); x++) {
			this.jdbcTemplate.update(query, listaInspecciones.get(x).getInspector().getIdInspector(),
					listaInspecciones.get(x).getIdInspeccion());
		}

		return listaInspecciones;
	}

	@Override
	public List<Inspecciones> enviarTablet(List<Inspecciones> listaInspecciones, Integer enviar) {
		String query = "UPDATE INSPECCIONES SET ENVIADO_TABLET = ? WHERE ID_INSPECCION = ?";

		for (int x = 0; x < listaInspecciones.size(); x++) {
			this.jdbcTemplate.update(query, enviar, listaInspecciones.get(x).getIdInspeccion());
		}

		return listaInspecciones;
	}

	@Override
	public Integer inspeccionesAsociadasDireccion(Integer provinciaPrecargada, Integer direccionPrecargada) {

		String query = "SELECT SUM(IDINSPECCION) AS SUMAINPECCIONES FROM (SELECT COUNT(T1.ID_INSPECCION) AS IDINSPECCION FROM INSPECCIONES T1, EXPEDIENTES T2, REL_EXP_TER T3, DATOS_DIRECCIONES T4, DIRECCIONES T5 WHERE T1.ID_INSPECTOR IS NULL AND (t1.ID_RESULTADO_INSPECCION <> "
				+ Constantes.RESULTADO_CANCELADA
				+ " OR t1.ID_RESULTADO_INSPECCION IS NULL) AND (T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE AND T1.ID_EXPEDIENTE = T3.ID_EXPEDIENTE AND T3.ID_TERCERO = T4.ID_TERCERO AND T1.ID_DIRECCION = T5.ID_DIRECCION AND T1.ID_DIRECCION = ? AND T4.ID_TIPO_DIRECCION = 2 AND T4.ID_PROVINCIA = ?) UNION SELECT COUNT(T1.ID_INSPECCION) AS IDINSPECCION FROM INSPECCIONES T1, REL_EST_INS T2, DATOS_DIRECCIONES T3, DIRECCIONES T4 WHERE T1.ID_INSPECTOR IS NULL AND (T1.ID_INSPECCION = T2.ID_INSPECCION AND T2.ID_TERCERO = T3.ID_TERCERO AND T1.ID_DIRECCION = T4.ID_DIRECCION AND T1.ID_DIRECCION = ? AND T3.ID_TIPO_DIRECCION = 2 AND T3.ID_PROVINCIA = ?))";

		Integer inspeccionesAsociadas = this.jdbcTemplate.queryForObject(query,
				new Object[] { direccionPrecargada, provinciaPrecargada, direccionPrecargada, provinciaPrecargada },
				Integer.class);

		return inspeccionesAsociadas;
	}

	@Override
	public Integer inspeccionesAsociadas(Integer provinciaPrecargada) {

		String query = "SELECT SUM(IDINSPECCION) AS SUMAINPECCIONES FROM (SELECT COUNT(T1.ID_INSPECCION) AS IDINSPECCION FROM INSPECCIONES T1, EXPEDIENTES T2, REL_EXP_TER T3, DATOS_DIRECCIONES T4 WHERE T1.ID_INSPECTOR IS NULL AND (t1.ID_RESULTADO_INSPECCION <> "
				+ Constantes.RESULTADO_CANCELADA
				+ " OR t1.ID_RESULTADO_INSPECCION IS NULL) AND (T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE AND T1.ID_EXPEDIENTE = T3.ID_EXPEDIENTE AND T3.ID_TERCERO = T4.ID_TERCERO AND T4.ID_TIPO_DIRECCION = 2 AND T4.ID_PROVINCIA = ?) UNION SELECT COUNT(T1.ID_INSPECCION) AS IDINSPECCION FROM INSPECCIONES T1, REL_EST_INS T2, DATOS_DIRECCIONES T3 WHERE T1.ID_INSPECTOR IS NULL AND (T1.ID_INSPECCION = T2.ID_INSPECCION AND T2.ID_TERCERO = T3.ID_TERCERO AND T3.ID_TIPO_DIRECCION = 2 AND T3.ID_PROVINCIA = ?))";

		Integer inspeccionesAsociadas = this.jdbcTemplate.queryForObject(query,
				new Object[] { provinciaPrecargada, provinciaPrecargada }, Integer.class);

		return inspeccionesAsociadas;
	}

	@Override
	public Inspecciones findByExpedienteOrigenInspeccion(Expedientes expediente) {
		String query = "SELECT t1.ID_INSPECCION IDINSPECCION, t1.ID_INSPECCION_MOVIL IDINSPECCIONMOVIL, t1.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION, "
				+ " t1.ID_RESULTADO_INSPECCION IDRESULTADOINSPECCION, t1.ID_DIRECCION IDDIRECCION, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_CAMPAINA IDCAMPAINA, "
				+ " t1.ID_ESTADO_INSPECCION IDESTADOINSPECCION, t1.OBJETO_INSPECCION OBJETOINSPECCION, t1.ID_ORIGEN_INSPECCION IDORIGENINSPECCION, t1.FECHA_REGISTRO FECHAREGISTRO, "
				+ " t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t1.ID_PROTOCOLO IDPROTOCOLO, "
				+ " t1.ID_INSPECTOR IDINSPECTOR, t1.OBSERVACIONES_RESULTADO OBSERVACIONESRESULTADO, t1.ENVIADO_TABLET ENVIADOTABLET, t1.FECHA_FIN_INSPECCION FECHAFININSPECCION, "
				+ " t1.ID_AGRUPACION IDAGRUPACION, t2.DESCRIPCION_CASTELLANO PROTOCOLODESCES, t2.DESCRIPCION_EUSKERA PROTOCOLODESCEU, "
				+ " t3.DESCRIPCION_CASTELLANO DIRDESCES, t3.DESCRIPCION_EUSKERA DIRDESCEU "
				+ " FROM INSPECCIONES t1, PROTOCOLOS t2, DIRECCIONES t3  "
				+ "WHERE t1.ID_PROTOCOLO = t2.ID_PROTOCOLO(+) AND t1.ID_DIRECCION = t3.ID_DIRECCION(+) AND t1.ID_EXPEDIENTE = ? AND t1.ID_ORIGEN_INSPECCION IN ("
				+ Constantes.ORIGEN_CAMPAINA + ", " + Constantes.ORIGEN_INSPECCION_OFICIO + ", "
				+ Constantes.ORIGEN_BUZON_FRAUDE + ") ";

		List<Inspecciones> inspeccionesList = this.jdbcTemplate.query(query, this.rwMapFind,
				expediente.getIdExpediente());
		return DataAccessUtils.uniqueResult(inspeccionesList);
	}

	/**
	 * Buscar el inspector de una inspección
	 *
	 * @param idInspeccion
	 *            Integer
	 * @return Inspectores
	 */
	@Override
	public Inspectores comprobarInspectorInspeccion(Integer idInspeccion) {

		StringBuilder query = new StringBuilder();
		List<Object> params = new ArrayList<Object>();

		query.append("SELECT t01.ID_INSPECTOR IDINSPECTOR, t04.NOMBRE_INSPECTOR NOMBREINSPECTOR");
		query.append(" FROM INSPECCIONES t01, INSPECTORES t04");
		query.append(" WHERE  t01.ID_INSPECTOR = t04.ID_INSPECTOR AND t01.ID_INSPECCION = ?");
		params.add(idInspeccion);

		List<Inspectores> inspectorInspeccionList = this.jdbcTemplate.query(query.toString(),
				this.rwMapInspectorInspeccion, params.toArray());

		return DataAccessUtils.uniqueResult(inspectorInspeccionList);

	}

	@Override
	public Inspecciones findPropuestasEnTramite(Inspecciones inspeccion) {
		String query = "SELECT t7930.IDENTIFICADOR_PRO_SAN IDENTIFICADORPROSAN FROM REL_ART_INF_PRO_SAN t31 RIGHT JOIN REL_PRO_SAN_SAN t6128 ON t31.ID_PROPUESTA_SANCION = t6128.ID_PROPUESTA_SANCION RIGHT JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = ? AND t6128.ID_ESTADO_PRO_SAN IS NULL";

		List<Inspecciones> listaInspecciones = this.jdbcTemplate.query(query, this.rwMapPropuesta,
				inspeccion.getIdInspeccion());

		if (!listaInspecciones.isEmpty()) {
			return listaInspecciones.get(0);
		} else {
			return null;
		}
	}

	@Override
	public Inspecciones findPropuestasEnviadas(Inspecciones inspeccion) {
		String query = "SELECT t7930.IDENTIFICADOR_PRO_SAN IDENTIFICADORPROSAN FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = ? AND t6128.ID_ESTADO_PRO_SAN IS NOT NULL AND  t6128.ID_ESTADO_PRO_SAN NOT IN (3,5,8,10)";

		List<Inspecciones> listaInspecciones = this.jdbcTemplate.query(query, this.rwMapPropuesta,
				inspeccion.getIdInspeccion());

		if (!listaInspecciones.isEmpty()) {
			return listaInspecciones.get(0);
		} else {
			return null;
		}
	}

	@Override
	public Inspecciones findPropuestasExpedienteSancionador(Inspecciones inspeccion) {
		String query = "SELECT t7930.IDENTIFICADOR_PRO_SAN IDENTIFICADORPROSAN FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = ? AND t6128.ID_ESTADO_PRO_SAN IN (5,10)";

		List<Inspecciones> listaInspecciones = this.jdbcTemplate.query(query, this.rwMapPropuesta,
				inspeccion.getIdInspeccion());

		if (!listaInspecciones.isEmpty()) {
			return listaInspecciones.get(0);
		} else {
			return null;
		}
	}

	@Override
	public Inspecciones findPropuestasSubsanacion(Inspecciones inspeccion) {
		String query = "SELECT t7930.IDENTIFICADOR_PRO_SAN IDENTIFICADORPROSAN FROM REL_PRO_SAN_SAN t6128 INNER JOIN PROPUESTAS_SANCION t7930 ON t6128.ID_PROPUESTA_SANCION = t7930.IDENTIFICADOR_PRO_SAN WHERE t7930.ID_INSPECCION = ? AND t6128.ID_ESTADO_PRO_SAN IN (3,8)";

		List<Inspecciones> listaInspecciones = this.jdbcTemplate.query(query, this.rwMapPropuesta,
				inspeccion.getIdInspeccion());

		if (!listaInspecciones.isEmpty()) {
			return listaInspecciones.get(0);
		} else {
			return null;
		}
	}

	@Override
	public Inspecciones updateFechaFinInspeccion(Inspecciones inspecciones) {
		String query = "UPDATE INSPECCIONES SET FECHA_FIN_INSPECCION = ?, FECHA_ULTMODIFICACION = SYSDATE, USUARIO_ULTMODIFICACION = ? WHERE ID_INSPECCION = ? ";
		this.jdbcTemplate.update(query, inspecciones.getFechaFinInspeccion(), inspecciones.getUsuarioUltmodificacion(),
				inspecciones.getIdInspeccion());
		return inspecciones;
	}
}
