package com.ejie.ab63.dao.expedientes;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.model.InfoExpedienteEstablecimiento;
import com.ejie.ab63.model.Inspeccion;
import com.ejie.ab63.model.expedientes.Expedientes;
import com.ejie.ab63.model.procedimientos.Areas;
import com.ejie.ab63.model.procedimientos.Direcciones;
import com.ejie.ab63.model.procedimientos.Procedimientos;
import com.ejie.ab63.model.terceros.DatosTerceros;
import com.ejie.ab63.model.terceros.TiposTercero;
import com.ejie.ab63.util.PermisosXLNETS;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridManagerJerarquia;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

@Repository
@Transactional
public class ExpedientesDaoImpl implements ExpedientesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDEXPEDIENTE", "IDENTIFICADOR_ESTABLECIMIENTO",
			"IDTERRITORIOHISTORICO", "FOLDERID", "FOLDERNUMBER", "TITULO", "FECHAENTRADA", "FECHADOCFORMAL",
			"FECHAULTAPOR", "DOCUMENTO", "FECHAREGISTRO", "USUARIOREGISTRO", "PROCEDIMIENTOSIDPROCEDIMIENTO",
			"PROCEDIMIENTOSCODPROCEDUREID", "PROCEDIMIENTOSFOLDERID", "PROCEDIMIENTOSFOLDERNUMBER",
			"PROCEDIMIENTOSTITULOEXPEDIENTE", "PROCEDIMIENTOSFECHAREGISTRO", "PROCEDIMIENTOSUSUARIOREGISTRO",
			"PROCEDIMIENTOSIDDIRECCION", "PROCEDIMIENTOSIDAREA", "IMPORTEPRESENTADO", "IMPORTEADMITIDO",
			"SUBVENCIONCALCULADA", "SUBVENCIONRESUELTA", "DESCRIPCIONCASTELLANO", "DESCRIPCIONEUSKERA", "NOMBRETERCERO",
			"NOMBREEMPRESA", "FECHACIERRE", "EXPFECHAENTRADA", "EXPFECHACIERRE", "IDRELEXPINS", "IDEXPINSP",
			"IDINSPECCION", "TIPOINSPECCION", "FECHAREGISTROINSP", "USUARIOREGISTROINSP", "IDENTIFICADORINSPECCION",
			"FOLDERID", "PRODDESCCAST", "PRODDESCEUSK", "FOLDERNUMBERORIGEN", "FOLDERIDORIGEN" };

	private JdbcTemplate jdbcTemplate;
	private static final Logger logger = LoggerFactory.getLogger(ExpedientesDaoImpl.class);

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

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Expedientes> rwMap = new RowMapper<Expedientes>() {
		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Expedientes(resultSet.getInt("IDEXPEDIENTE"), resultSet.getLong("IDTERRITORIOHISTORICO"),
					resultSet.getString("FOLDERID"), resultSet.getString("FOLDERNUMBER"), resultSet.getString("TITULO"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getDate("FECHACIERRE"),
					resultSet.getString("USUARIOREGISTRO"),
					new Procedimientos(resultSet.getInt("ProcedimientosIDPROCEDIMIENTO"),
							resultSet.getString("ProcedimientosCODPROCEDUREID"),
							resultSet.getString("ProcedimientosTITULOEXPEDIENTE"),
							resultSet.getDate("ProcedimientosFECHAREGISTRO"),
							resultSet.getString("ProcedimientosUSUARIOREGISTRO"),
							new Direcciones(resultSet.getInt("ProcedimientosIDDIRECCION"), null, null, null, null, null,
									null, null),
							new Areas(resultSet.getInt("ProcedimientosIDAREA"), null, null, null, null, null, null),
							resultSet.getString("PROCDESCES"), resultSet.getString("PROCDESCEU"), null),
					resultSet.getInt("IDEXPEDIENTEORIGEN"));
		}
	};

	private RowMapper<Expedientes> rwMapExpedientesPendientes = new RowMapper<Expedientes>() {
		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Expedientes(resultSet.getInt("IDEXPEDIENTE"), resultSet.getLong("IDTERRITORIOHISTORICO"),
					resultSet.getString("FOLDERID"), resultSet.getString("FOLDERNUMBER"), resultSet.getString("TITULO"),
					resultSet.getDate("FECHAREGISTRO"), null,
					new Procedimientos(null, resultSet.getString("ProcedimientosCODPROCEDUREID"), null, null, null,
							null, null, resultSet.getString("DESCCAST"), resultSet.getString("DESCEUSK"),
							resultSet.getString("INSPECCIONABLE")));
		}
	};

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

			return new Inspeccion(resultSet.getInt("ID_REL_EXP_INS"),
					new Expedientes(resultSet.getInt("ID_EXPEDIENTE")), resultSet.getInt("ID_INSPECCION"),
					resultSet.getInt("TIPO_INSPECCION"), resultSet.getDate("FECHA_REGISTRO"),
					resultSet.getString("USUARIO_REGISTRO"), resultSet.getString("IDENTIFICADOR_INSPECCION"));
		}
	};

	private RowMapper<Date> rwMapDateExp = new RowMapper<Date>() {
		public Date mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return resultSet.getDate(1);
		}
	};

	private RowMapper<Expedientes> rwMapProcedureId = new RowMapper<Expedientes>() {
		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Expedientes expedientes = new Expedientes();
			Procedimientos procedimientos = new Procedimientos();
			procedimientos.setIdProcedimiento(resultSet.getInt("IDPROCEDIMIENTO"));
			expedientes.setProcedimientos(procedimientos);

			return expedientes;
		}
	};

	private RowMapper<Expedientes> rwMapExpedienteId = new RowMapper<Expedientes>() {
		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Expedientes expedientes = new Expedientes();
			expedientes.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			return expedientes;
		}
	};

	private RowMapper<Expedientes> rwMapEmpTer = new RowMapper<Expedientes>() {
		SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			String folderNumber = "";
			String titulo = "";
			Date fechaEntrada = null;
			Date fechaDoc = null;
			Date fechaUltaPor = null;
			// String descripcionCastellano = "";
			// String descripcionEuskera = "";
			String documento = "";
			String nombre = "";
			String apellido1 = "";
			String apellido2 = "";

			try {
				if (null != resultSet.getString("FOLDERNUMBER")) {
					folderNumber = resultSet.getString("FOLDERNUMBER");
				}
				if (null != resultSet.getString("TITULO")) {
					titulo = resultSet.getString("TITULO");
				}
				if (null != resultSet.getString("FECHAENTRADA")) {
					fechaEntrada = formatoDeFecha.parse(resultSet.getString("FECHAENTRADA"));
				}
				if (null != resultSet.getString("FECHAENTRADA")) {
					fechaEntrada = formatoDeFecha.parse(resultSet.getString("FECHAENTRADA"));
				}
				if (null != resultSet.getString("FECHADOCFORMAL")) {
					fechaDoc = formatoDeFecha.parse(resultSet.getString("FECHADOCFORMAL"));
				}
				if (null != resultSet.getString("FECHAULTAPOR")) {
					fechaUltaPor = formatoDeFecha.parse(resultSet.getString("FECHAULTAPOR"));
				}
				// if (null != resultSet.getString("DESCRIPCIONCASTELLANO")) {
				// descripcionCastellano =
				// resultSet.getString("DESCRIPCIONCASTELLANO");
				// }
				// if (null != resultSet.getString("DESCRIPCIONEUSKERA")) {
				// descripcionEuskera =
				// resultSet.getString("DESCRIPCIONEUSKERA");
				// }

				if (null != resultSet.getString("NOMBRE")) {
					nombre = resultSet.getString("NOMBRE");
				}
				if (null != resultSet.getString("DOCUMENTO")) {
					documento = resultSet.getString("DOCUMENTO");
				}

				if (null != resultSet.getString("APELLIDO1")) {
					apellido1 = resultSet.getString("APELLIDO1");
				}
				if (null != resultSet.getString("APELLIDO2")) {
					apellido2 = resultSet.getString("APELLIDO2");
				}
			} catch (ParseException e) {
				logger.error(
						"Excepcion recogida en el mapRow al parsear las fechas de la busqueda de expedientes =  " + e);
			}
			Expedientes expedientes = new Expedientes();
			expedientes.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			expedientes.setFolderNumber(folderNumber);
			expedientes.setTitulo(titulo);
			expedientes.setFechaEntrada(fechaEntrada);
			expedientes.setFechaDocFormal(fechaDoc);
			expedientes.setFechaUltApor(fechaUltaPor);

			DatosTerceros datosTerceros = new DatosTerceros();

			datosTerceros.setDocumento(documento);
			datosTerceros.setNombre(nombre);
			datosTerceros.setApellido1(apellido1);
			datosTerceros.setApellido2(apellido2);
			expedientes.setDatosTerceros(datosTerceros);

			return expedientes;
		}
	};

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

	private RowMapper<Expedientes> rwMapFolderNumber = new RowMapper<Expedientes>() {
		public Expedientes mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Expedientes(resultSet.getString("FOLDER_NUMBER"));
		}
	};

	/**
	 * 
	 */
	private RowMapper<InfoExpedienteEstablecimiento> rwMapInfoExpedientes = new RowMapper<InfoExpedienteEstablecimiento>() {
		public InfoExpedienteEstablecimiento mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			InfoExpedienteEstablecimiento infoExpedienteEstablecimiento = new InfoExpedienteEstablecimiento();

			infoExpedienteEstablecimiento.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			infoExpedienteEstablecimiento.setIdEstablecimiento(resultSet.getInt("IDESTABLECIMIENTO"));
			infoExpedienteEstablecimiento
					.setIdentificadorEstablecimiento(resultSet.getString("IDENTIFICADOR_ESTABLECIMIENTO"));
			infoExpedienteEstablecimiento.setFolderNumber(resultSet.getString("FOLDERNUMBER"));
			infoExpedienteEstablecimiento.setTitulo(resultSet.getString("TITULO"));
			infoExpedienteEstablecimiento.setProcedimientoDescCast(resultSet.getString("PRODDESCCAST"));
			infoExpedienteEstablecimiento.setProcedimientoDescEusk(resultSet.getString("PRODDESCEUSK"));
			infoExpedienteEstablecimiento.setExpFechaEntrada(resultSet.getDate("EXPFECHAENTRADA"));
			infoExpedienteEstablecimiento.setDireccion(resultSet.getString("DIRECCION"));
			infoExpedienteEstablecimiento.setIdDireccion(resultSet.getString("IDDIRECCION"));
			infoExpedienteEstablecimiento.setProvincia(resultSet.getString("PROVINCIA"));
			infoExpedienteEstablecimiento.setMunicipio(resultSet.getString("MUNICIPIO"));
			infoExpedienteEstablecimiento.setLocalidad(resultSet.getString("LOCALIDAD"));
			infoExpedienteEstablecimiento.setNumTitular(resultSet.getString("DOCUMENTO"));
			infoExpedienteEstablecimiento.setTitular(resultSet.getString("NOMBRE"));
			StringBuilder builder = new StringBuilder();
			builder.append(" ");
			String piso = resultSet.getString("PISO");
			String numero = resultSet.getString("NUMERO");
			String letra = resultSet.getString("LETRA");
			String escalera = resultSet.getString("ESCALERA");

			if (infoExpedienteEstablecimiento.getDireccion() != null) {
				builder.append(infoExpedienteEstablecimiento.getDireccion());
			}

			if (numero != null) {
				if (!"".equals(builder.toString())) {
					builder.append(" ").append(numero);
				} else {
					builder.append(numero);
				}
			}

			if (escalera != null) {
				if (!"".equals(builder.toString())) {
					builder.append(", ").append(escalera);
				} else {
					builder.append(escalera);
				}
			}

			if (piso != null) {
				if (!"".equals(builder.toString())) {
					builder.append(", ").append(piso);
				} else {
					builder.append(piso);
				}
			}

			if (letra != null) {
				if (!"".equals(builder.toString())) {
					builder.append(", ").append(letra);
				} else {
					builder.append(letra);
				}
			}

			if (infoExpedienteEstablecimiento.getMunicipio() != null) {
				if (!"".equals(builder.toString())) {
					builder.append(" (").append(infoExpedienteEstablecimiento.getMunicipio()).append(")");

				} else {
					builder.append(infoExpedienteEstablecimiento.getMunicipio());
				}
			}

			infoExpedienteEstablecimiento.setDireccionCompuesta(builder.toString());
			return infoExpedienteEstablecimiento;
		}
	};

	private RowMapper<InfoExpedienteEstablecimiento> rwMapExpRelacionadosEst = new RowMapper<InfoExpedienteEstablecimiento>() {
		public InfoExpedienteEstablecimiento mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			InfoExpedienteEstablecimiento infoExpedienteEstablecimiento = new InfoExpedienteEstablecimiento();

			infoExpedienteEstablecimiento.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			infoExpedienteEstablecimiento.setFolderId(resultSet.getString("FOLDERID"));
			infoExpedienteEstablecimiento.setFolderIdOrigen(resultSet.getString("FOLDERIDORIGEN"));
			infoExpedienteEstablecimiento.setFolderNumber(resultSet.getString("FOLDERNUMBER"));
			infoExpedienteEstablecimiento.setFolderNumberOrigen(resultSet.getString("FOLDERNUMBERORIGEN"));
			infoExpedienteEstablecimiento.setTitulo(resultSet.getString("TITULO"));
			infoExpedienteEstablecimiento.setExpFechaEntrada(resultSet.getDate("EXPFECHAENTRADA"));
			infoExpedienteEstablecimiento.setProcedimientoDescCast(resultSet.getString("PRODDESCCAST"));
			infoExpedienteEstablecimiento.setProcedimientoDescEusk(resultSet.getString("PRODDESCEUSK"));
			infoExpedienteEstablecimiento.setExpFechaCierre((resultSet.getDate("EXPFECHACIERRE")));
			infoExpedienteEstablecimiento.setInspeccion(new Inspeccion(resultSet.getInt("IDRELEXPINS"),
					new Expedientes(resultSet.getInt("IDEXPINSP")), resultSet.getInt("IDINSPECCION"),
					resultSet.getInt("TIPOINSPECCION"), resultSet.getDate("FECHAREGISTROINSP"),
					resultSet.getString("USUARIOREGISTROINSP"), resultSet.getString("IDENTIFICADORINSPECCION")));

			return infoExpedienteEstablecimiento;
		}
	};

	private RowMapper<InfoExpedienteEstablecimiento> rwMapExpRelacionadosEst2 = new RowMapper<InfoExpedienteEstablecimiento>() {
		public InfoExpedienteEstablecimiento mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			InfoExpedienteEstablecimiento infoExpedienteEstablecimiento = new InfoExpedienteEstablecimiento();

			infoExpedienteEstablecimiento.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			infoExpedienteEstablecimiento.setFolderId(resultSet.getString("FOLDERID"));
			infoExpedienteEstablecimiento.setFolderIdOrigen(resultSet.getString("FOLDERIDORIGEN"));
			infoExpedienteEstablecimiento.setFolderNumber(resultSet.getString("FOLDERNUMBER"));
			infoExpedienteEstablecimiento.setFolderNumberOrigen(resultSet.getString("FOLDERNUMBERORIGEN"));
			infoExpedienteEstablecimiento.setTitulo(resultSet.getString("TITULO"));
			infoExpedienteEstablecimiento.setExpFechaEntrada(resultSet.getDate("EXPFECHAENTRADA"));
			infoExpedienteEstablecimiento.setProcedimientoDescCast(resultSet.getString("PRODDESCCAST"));
			infoExpedienteEstablecimiento.setProcedimientoDescEusk(resultSet.getString("PRODDESCEUSK"));
			infoExpedienteEstablecimiento.setExpFechaCierre((resultSet.getDate("EXPFECHACIERRE")));
			infoExpedienteEstablecimiento
					.setInspeccion(new Inspeccion(null, new Expedientes(resultSet.getInt("IDEXPEDIENTE")), null, null,
							null, null, resultSet.getString("IDENTIFICADORINSPECCION")));
			infoExpedienteEstablecimiento.setUrlExpedienteOtrasApps(resultSet.getString("URL_APLICACION"));

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

			Expedientes expedientes = new Expedientes(resultSet.getInt("IDEXPEDIENTE"),
					resultSet.getLong("IDTERRITORIOHISTORICO"), resultSet.getString("FOLDERID"),
					resultSet.getString("FOLDERNUMBER"), resultSet.getString("TITULO"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getString("USUARIOREGISTRO"),
					new Procedimientos(resultSet.getInt("ProcedimientosIDPROCEDIMIENTO"),
							resultSet.getString("ProcedimientosCODPROCEDUREID"),
							resultSet.getString("ProcedimientosTITULOEXPEDIENTE"),
							resultSet.getDate("ProcedimientosFECHAREGISTRO"),
							resultSet.getString("ProcedimientosUSUARIOREGISTRO"),
							new Direcciones(resultSet.getInt("ProcedimientosIDDIRECCION"), null, null, null, null, null,
									null, null),
							new Areas(resultSet.getInt("ProcedimientosIDAREA"), null, null, null, null, null, null)));

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

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Inserts a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	public Expedientes add(Expedientes expedientes) {
		String query = "INSERT INTO EXPEDIENTES (ID_EXPEDIENTE, ID_PROCEDIMIENTO, ID_TERRITORIO_HISTORICO, FOLDER_ID, FOLDER_NUMBER, TITULO, FECHA_REGISTRO, USUARIO_REGISTRO) VALUES (?,?,?,?,?,?,SYSDATE,?)";
		Object getProcedimientosIdProcedimientoAux = null;
		if (expedientes.getProcedimientos() != null && expedientes.getProcedimientos().getIdProcedimiento() != null) {
			getProcedimientosIdProcedimientoAux = expedientes.getProcedimientos().getIdProcedimiento();
		}
		this.jdbcTemplate.update(query, expedientes.getIdExpediente(), getProcedimientosIdProcedimientoAux,
				expedientes.getIdTerritorioHistorico(), expedientes.getFolderId(), expedientes.getFolderNumber(),
				expedientes.getTitulo(), PermisosXLNETS.getUserConnected());
		return expedientes;
	}

	/**
	 * Updates a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	public Expedientes update(Expedientes expedientes) {
		String query = "UPDATE EXPEDIENTES SET ID_PROCEDIMIENTO=?, ID_TERRITORIO_HISTORICO=?, FOLDER_ID=?, FOLDER_NUMBER=?, TITULO=?, FECHA_ULTMODIFICACION=, USUARIO_ULTMODIFICACION=? WHERE ID_EXPEDIENTE=?";
		Object getProcedimientosIdProcedimientoAux = null;
		if (expedientes.getProcedimientos() != null && expedientes.getProcedimientos().getIdProcedimiento() != null) {
			getProcedimientosIdProcedimientoAux = expedientes.getProcedimientos().getIdProcedimiento();
		}
		this.jdbcTemplate.update(query, getProcedimientosIdProcedimientoAux, expedientes.getIdTerritorioHistorico(),
				expedientes.getFolderId(), expedientes.getFolderNumber(), expedientes.getTitulo(),
				PermisosXLNETS.getUserConnected(), expedientes.getIdExpediente());
		return expedientes;
	}

	/**
	 * Updates a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	public Boolean updateOrigen(Expedientes expedientes) {
		String query = "UPDATE EXPEDIENTES SET ID_EXPEDIENTE_ORIGEN = ?, FECHA_ULTMODIFICACION=SYSDATE, USUARIO_ULTMODIFICACION=? WHERE ID_EXPEDIENTE = ? ";
		int result = this.jdbcTemplate.update(query, expedientes.getIdExpedienteOrigen(),
				PermisosXLNETS.getUserConnected(), expedientes.getIdExpediente());
		return result == 1;
	}

	/**
	 * Updates a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	public Expedientes updateFolder(Expedientes expedientes) {
		String query = "UPDATE EXPEDIENTES SET FOLDER_NUMBER=?, FOLDER_ID=?, FECHA_ULTMODIFICACION=SYSDATE, USUARIO_ULTMODIFICACION=SYSDATE WHERE ID_EXPEDIENTE=?";

		this.jdbcTemplate.update(query, expedientes.getFolderNumber(), expedientes.getFolderId(),
				PermisosXLNETS.getUserConnected(), expedientes.getIdExpediente());
		return expedientes;
	}

	/**
	 * Updates a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	public Expedientes updateExpedienteFolder(Expedientes expedientes) {
		String query = "UPDATE EXPEDIENTES SET TITULO=?, FOLDER_NUMBER=?, FECHA_ULTMODIFICACION=sysdate, USUARIO_ULTMODIFICACION=? WHERE FOLDER_ID=?";
		logger.info("Inicio updateFolderTitle");
		logger.info("Query = " + query);
		logger.info("PARAMETRO TITULO = " + expedientes.getTitulo());
		logger.info("PARAMETRO FECHA_REGISTRO = SYSDATE");
		logger.info("PARAMETRO USUARIO_REGISTRO = " + expedientes.getUsuarioRegistro());
		logger.info("PARAMETRO FOLDER_ID = " + expedientes.getFolderId());
		this.jdbcTemplate.update(query, expedientes.getTitulo(), expedientes.getFolderNumber(),
				expedientes.getUsuarioRegistro(), expedientes.getFolderId());
		return expedientes;
	}

	/**
	 * Finds a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	@Transactional(readOnly = true)
	public Expedientes find(Expedientes expedientes) {
		String query = "SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_EXPEDIENTE_ORIGEN IDEXPEDIENTEORIGEN, t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO, t1.FOLDER_ID FOLDERID, t1.FOLDER_NUMBER FOLDERNUMBER, t1.TITULO TITULO, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO, t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,  t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE, t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO, t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO, t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION, t2.ID_AREA PROCEDIMIENTOSIDAREA, t1.FECHA_CIERRE FECHACIERRE, t2.DESCRIPCION_CASTELLANO PROCDESCES, t2.DESCRIPCION_EUSKERA PROCDESCEU FROM EXPEDIENTES t1 , PROCEDIMIENTOS t2  WHERE t1.ID_EXPEDIENTE = ?   AND t1.ID_PROCEDIMIENTO= t2.ID_PROCEDIMIENTO(+)";

		List<Expedientes> expedientesList = this.jdbcTemplate.query(query, this.rwMap, expedientes.getIdExpediente());
		return (Expedientes) DataAccessUtils.uniqueResult(expedientesList);
	}

	/**
	 * Finds a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	@Transactional(readOnly = true)
	public Expedientes findProcedureIdPorExpediente(Expedientes expedientes) {
		String query = "SELECT t1.ID_PROCEDIMIENTO IDPROCEDIMIENTO FROM EXPEDIENTES t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO(+) AND t1.ID_EXPEDIENTE   = ?";

		List<Expedientes> expedientesList = this.jdbcTemplate.query(query, this.rwMapProcedureId,
				expedientes.getIdExpediente());
		return (Expedientes) DataAccessUtils.uniqueResult(expedientesList);
	}

	/**
	 * Finds a single row in the Expedientes table por FolderId.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	@Transactional(readOnly = true)
	public Expedientes findByFolderId(Expedientes expedientes) {
		String query = "SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_EXPEDIENTE_ORIGEN IDEXPEDIENTEORIGEN, t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO, t1.FOLDER_ID FOLDERID, t1.FOLDER_NUMBER FOLDERNUMBER, t1.TITULO TITULO, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO, t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID, t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE, t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO, t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO, t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION, t2.ID_AREA PROCEDIMIENTOSIDAREA, t1.FECHA_CIERRE FECHACIERRE, t2.DESCRIPCION_CASTELLANO PROCDESCES, t2.DESCRIPCION_EUSKERA PROCDESCEU  FROM EXPEDIENTES t1 , PROCEDIMIENTOS t2  WHERE t1.FOLDER_ID = ?   AND t1.ID_PROCEDIMIENTO= t2.ID_PROCEDIMIENTO(+)";

		List<Expedientes> expedientesList = this.jdbcTemplate.query(query, this.rwMap, expedientes.getFolderId());
		return (Expedientes) DataAccessUtils.uniqueResult(expedientesList);
	}

	/**
	 * Finds a single row in the Expedientes table por FolderId.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Expedientes
	 */
	@Transactional(readOnly = true)
	public Expedientes findByFolderNumber(Expedientes expedientes) {
		String query = "SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE FROM EXPEDIENTES t1 , PROCEDIMIENTOS t2  WHERE t1.FOLDER_NUMBER = ?";

		List<Expedientes> expedientesList = this.jdbcTemplate.query(query, this.rwMapFolderNumber,
				expedientes.getFolderNumber());
		return (Expedientes) DataAccessUtils.uniqueResult(expedientesList);
	}

	/**
	 * Removes a single row in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return
	 */
	public void remove(Expedientes expedientes) {
		String query = "DELETE FROM EXPEDIENTES WHERE ID_EXPEDIENTE=?";
		this.jdbcTemplate.update(query, expedientes.getIdExpediente());
	}

	/**
	 * Finds a list of rows in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Expedientes>
	 */
	@Transactional(readOnly = true)
	public List<Expedientes> findAll(Expedientes expedientes, JQGridRequestDto jqGridRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.ID_EXPEDIENTE_ORIGEN IDEXPEDIENTEORIGEN,t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO,t1.FOLDER_ID FOLDERID,t1.FOLDER_NUMBER FOLDERNUMBER,t1.TITULO TITULO,t1.FECHA_REGISTRO FECHAREGISTRO, t1.FECHA_CIERRE FECHACIERRE ,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE,t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t2.ID_AREA PROCEDIMIENTOSIDAREA, t2.DESCRIPCION_CASTELLANO PROCDESCES, t2.DESCRIPCION_EUSKERA PROCDESCEU ");
		query.append("FROM EXPEDIENTES t1 ,PROCEDIMIENTOS t2 ");

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

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(Expedientes expedientes) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM EXPEDIENTES t1 , PROCEDIMIENTOS t2 ");

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

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

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

	/**
	 * Finds rows in the Expedientes table using like.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Expedientes>
	 */

	@Transactional(readOnly = true)
	public List<Expedientes> findAllLikeTer(Expedientes expedientes, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder();
		query.append(
				"SELECT T1.ID_EXPEDIENTE IDEXPEDIENTE, T1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, T1.FOLDER_NUMBER FOLDERNUMBER, T1.TITULO TITULO, TO_CHAR(T1.FECHA_ENTRADA,'DD/MM/YYYY HH24:MI:SS') FECHAENTRADA, ");
		query.append(
				"TO_CHAR(T1.FECHA_DOC_FOR,'DD/MM/YYYY HH24:MI:SS') FECHADOCFORMAL, TO_CHAR(T1.FECHA_ULT_APOR,'DD/MM/YYYY HH24:MI:SS') FECHAULTAPOR, T8.DOCUMENTO DOCUMENTO, T8.NOMBRE NOMBRE, T8.APELLIDO1 APELLIDO1, T8.APELLIDO2 APELLIDO2 ");
		query.append(
				"FROM EXPEDIENTES T1 INNER JOIN REL_EXP_TER T2 ON T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE INNER JOIN PROCEDIMIENTOS T6 ON T1.ID_PROCEDIMIENTO = T6.ID_PROCEDIMIENTO ");
		query.append(" INNER JOIN DATOS_TERCERO T8 ON T2.ID_TERCERO = T8.ID_TERCERO AND  T8.TIPO_PARTICIPANTE="
				+ Constantes.PARTICIPANTE_TITULAR);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereExpediente(expedientes);
		query.append(mapaWhere.get("query"));

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Finds rows in the Expedientes table using like.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Expedientes>
	 */

	@Transactional(readOnly = true)
	public List<Expedientes> findAllLike(Expedientes expedientes, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder();
		query.append(
				"SELECT T1.ID_EXPEDIENTE IDEXPEDIENTE, T1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, T1.FOLDER_NUMBER FOLDERNUMBER, T1.TITULO TITULO, TO_CHAR(T1.FECHA_ENTRADA,'DD/MM/YYYY HH24:MI:SS') FECHAENTRADA, ");
		query.append(
				"TO_CHAR(T1.FECHA_DOC_FOR,'DD/MM/YYYY HH24:MI:SS') FECHADOCFORMAL, TO_CHAR(T1.FECHA_ULT_APOR,'DD/MM/YYYY HH24:MI:SS') FECHAULTAPOR, T8.DOCUMENTO DOCUMENTO, T8.NOMBRE NOMBRE, T8.APELLIDO1 APELLIDO1, T8.APELLIDO2 APELLIDO2 ");
		query.append(
				"FROM EXPEDIENTES T1 INNER JOIN REL_EXP_TER T2 ON T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE INNER JOIN PROCEDIMIENTOS T6 ON T1.ID_PROCEDIMIENTO = T6.ID_PROCEDIMIENTO ");
		query.append(" INNER JOIN DATOS_TERCERO T8 ON T2.ID_TERCERO = T8.ID_TERCERO AND  T8.TIPO_PARTICIPANTE="
				+ Constantes.PARTICIPANTE_TITULAR);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereExpediente(expedientes);
		query.append(mapaWhere.get("query"));

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Counts rows in the Expedientes table using like.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountTer(Expedientes expedientes, Boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM EXPEDIENTES T1 INNER JOIN REL_EXP_TER T2 ON T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE INNER JOIN PROCEDIMIENTOS T6 ON T1.ID_PROCEDIMIENTO = T6.ID_PROCEDIMIENTO INNER JOIN DATOS_TERCERO T8 ON T2.ID_TERCERO = T8.ID_TERCERO AND T8.TIPO_PARTICIPANTE="
						+ Constantes.PARTICIPANTE_TITULAR);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereExpediente(expedientes);
		query.append(mapaWhere.get("query"));
		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForObject(query.toString(), Long.class, params.toArray());
	}

	/**
	 * Counts rows in the Expedientes table using like.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Expedientes expedientes, Boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM EXPEDIENTES T1 INNER JOIN REL_EXP_TER T2 ON T1.ID_EXPEDIENTE = T2.ID_EXPEDIENTE INNER JOIN PROCEDIMIENTOS T6 ON T1.ID_PROCEDIMIENTO = T6.ID_PROCEDIMIENTO INNER JOIN DATOS_TERCERO T8 ON T2.ID_TERCERO = T8.ID_TERCERO AND T8.TIPO_PARTICIPANTE="
						+ Constantes.PARTICIPANTE_TITULAR);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereExpediente(expedientes);
		query.append(mapaWhere.get("query"));
		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForObject(query.toString(), Long.class, params.toArray());
	}

	/**
	 * Finds a list of rows in the Expedientes table.
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Expedientes>
	 */
	@Transactional(readOnly = true)
	public List<Expedientes> findLupaExpediente(String folderNumber) {
		StringBuilder query = new StringBuilder(
				"SELECT T1.ID_EXPEDIENTE IDEXPEDIENTE FROM EXPEDIENTES T1 WHERE UPPER(t1.FOLDER_NUMBER) LIKE UPPER('%"
						+ folderNumber + "%')");
		return (List<Expedientes>) this.jdbcTemplate.query(query.toString(), this.rwMapExpedienteId);
	}

	/**
	 * Reorder the data list of Expedientes selected for rup_table
	 *
	 * @param expedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Expedientes>>
	 */
	@Override
	public List<TableRowDto<Expedientes>> reorderSelection(Expedientes expedientes, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO,t1.FOLDER_ID FOLDERID,t1.FOLDER_NUMBER FOLDERNUMBER,t1.TITULO TITULO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE,t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t2.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM EXPEDIENTES t1 ,PROCEDIMIENTOS t2 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(expedientes, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_PROCEDIMIENTO= t2.ID_PROCEDIMIENTO(+) ");
		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 = JQGridManager.getReorderQuery(query, jqGridRequestDto, Expedientes.class,
				filterParamList, "ID_EXPEDIENTE");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            Expedientes
	 * @param searchParams
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Expedientes>>
	 */
	@Override
	public List<TableRowDto<Expedientes>> search(Expedientes filterParams, Expedientes searchParams,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO,t1.FOLDER_ID FOLDERID,t1.FOLDER_NUMBER FOLDERNUMBER,t1.TITULO TITULO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE,t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t2.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM EXPEDIENTES t1 ,PROCEDIMIENTOS t2 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_PROCEDIMIENTO= t2.ID_PROCEDIMIENTO(+) ");
		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 = JQGridManager.getSearchQuery(query, jqGridRequestDto, Expedientes.class,
				filterParamList, searchSQL, searchParamList, from_alias, "ID_EXPEDIENTE");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterexpedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(Expedientes filterexpedientes, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO,t1.FOLDER_ID FOLDERID,t1.FOLDER_NUMBER FOLDERNUMBER,t1.TITULO TITULO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE,t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t2.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM EXPEDIENTES t1 ,PROCEDIMIENTOS t2 ");

		// WHERE
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterexpedientes, 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 = JQGridManager.getRemoveMultipleQuery(jqGridRequestDto, Expedientes.class,
				query, params, "ID_EXPEDIENTE");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical Expedientes table.
	 *
	 * @param filterExpedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<JerarquiaDto<Expedientes>>
	 */
	@Override
	public List<JerarquiaDto<Expedientes>> findAllLikeJerarquia(Expedientes filterExpedientes,
			JQGridRequestDto jqGridRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE,t1.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO,t1.FOLDER_ID FOLDERID,t1.FOLDER_NUMBER FOLDERNUMBER,t1.TITULO TITULO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t2.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t2.CAMPOS_TITULO_EXPEDIENTE ProcedimientosTITULOEXPEDIENTE,t2.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t2.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t2.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t2.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM EXPEDIENTES t1
		// ,PROCEDIMIENTOS t2 ");
		List<String> from = new ArrayList<String>();
		from.add("EXPEDIENTES");
		from.add("PROCEDIMIENTOS");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

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

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

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

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		query = JQGridManagerJerarquia.getQuery(jqGridRequestDto, query, mapaWhere, "ID_EXPEDIENTE", "ID_PADRE",
				"NOMBRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// query = JQGridManagerJerarquia.getQuery(jqGridRequestDto, query,
		// mapaWhere, "ID", "ID_PADRE", "NOMBRE", from, from_alias, joins,
		// businessFilters, businessParams);

		// PAGINACION
		if (jqGridRequestDto != null) {
			query = JQGridManagerJerarquia.getPaginationQuery(jqGridRequestDto, query,
					ExpedientesDaoImpl.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 filterExpedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(Expedientes filterExpedientes, JQGridRequestDto jqGridRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM EXPEDIENTES t1
		// ,PROCEDIMIENTOS t2 ");
		List<String> from = new ArrayList<String>();
		from.add("EXPEDIENTES");
		from.add("PROCEDIMIENTOS");

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

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

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

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

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = JQGridManagerJerarquia.getQueryCount(jqGridRequestDto, mapaWhere, "ID_EXPEDIENTE",
				"ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// JQGridManagerJerarquia.getQueryCount(jqGridRequestDto, mapaWhere,
		// "ID", "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForObject(query.toString(), Long.class, params.toArray());
	}

	/**
	 * 
	 */
	@Transactional(readOnly = true)
	public List<InfoExpedienteEstablecimiento> findExpedientesEstablecimientosByDni(
			InfoExpedienteEstablecimiento filter, Integer tipoTercero, JQGridRequestDto jqGridRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT EXPEDIENTES.ID_EXPEDIENTE IDEXPEDIENTE, ESTABLECIMIENTOS.ID_ESTABLECIMIENTO IDESTABLECIMIENTO, ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADOR_ESTABLECIMIENTO, EXPEDIENTES.FOLDER_NUMBER FOLDERNUMBER, EXPEDIENTES.TITULO TITULO, PROCEDIMIENTOS.DESCRIPCION_CASTELLANO PRODDESCCAST, PROCEDIMIENTOS.DESCRIPCION_EUSKERA PRODDESCEUSK, T6145.FECHA_EXPEDIENTE EXPFECHAENTRADA, DIRECCIONES.DIRECCION DIRECCION, DIRECCIONES.PISO PISO, DIRECCIONES.NUMERO NUMERO, DIRECCIONES.LETRA LETRA, DIRECCIONES.ESCALERA ESCALERA, PROVINCIA.DS_O PROVINCIA, MUNICIPIO.DS_O MUNICIPIO, LOCALIDAD.DS_O LOCALIDAD, DIRECCIONES.ID_DIRECCION IDDIRECCION, TERCEROS.DOCUMENTO DOCUMENTO, TRIM(TERCEROS.NOMBRE  || ' ' || TERCEROS.APELLIDO1 || ' ' || TERCEROS.APELLIDO2) NOMBRE ")
						.append(" FROM EXPEDIENTES EXPEDIENTES ")
						.append(" INNER JOIN (SELECT RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE  FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC  WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE  AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ON T6145.ID_EXPEDIENTE = EXPEDIENTES.ID_EXPEDIENTE")
						.append(" INNER JOIN PROCEDIMIENTOS PROCEDIMIENTOS ON PROCEDIMIENTOS.ID_PROCEDIMIENTO = EXPEDIENTES.ID_PROCEDIMIENTO ")
						.append(" INNER JOIN REL_EXP_TER RELTER ON EXPEDIENTES.ID_EXPEDIENTE = RELTER.ID_EXPEDIENTE ")
						.append(" INNER JOIN DATOS_TERCERO TERCEROS ON TERCEROS.ID_TERCERO = RELTER.ID_TERCERO AND RELTER.ID_TIPO_TERCERO = ? AND TERCEROS.DOCUMENTO = ?  ")
						.append(" INNER JOIN DATOS_DIRECCIONES DIRECCIONES ON  TERCEROS.ID_TERCERO = DIRECCIONES.ID_TERCERO AND DIRECCIONES.ID_TIPO_DIRECCION = 2  ")
						.append(" INNER JOIN AB6301S00 ESTABLECIMIENTOS ON (EXPEDIENTES.ID_EXPEDIENTE = ESTABLECIMIENTOS.ID_EXPEDIENTE  OR ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO = DIRECCIONES.IDENTIFICADOR_ESTABLECIMIENTO) AND ESTABLECIMIENTOS.TIPO_REGISTRO = ?")
						.append(" INNER JOIN PROVINCIAS PROVINCIA ON PROVINCIA.ID = DIRECCIONES.ID_PROVINCIA ")
						.append(" INNER JOIN MUNICIPIOS MUNICIPIO ON MUNICIPIO.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND MUNICIPIO.ID = DIRECCIONES.ID_MUNICIPIO ")
						.append(" INNER JOIN LOCALIDADES LOCALIDAD ON LOCALIDAD.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND LOCALIDAD.MUNICIPIO_ID = DIRECCIONES.ID_MUNICIPIO AND LOCALIDAD.ID = DIRECCIONES.ID_LOCALIDAD ");

		// Where clause & Params
		concatFilterProcedimiento(query, filter.getExcludes());
		query.append(" AND EXPEDIENTES.ID_EXPEDIENTE != ? ");

		List<Object> params = new ArrayList<Object>();
		params.add(tipoTercero);
		params.add(filter.getNumTitular());
		params.add(Constantes.TIPO_REGISTRO_PROVISIONAL);
		params.add(filter.getIdExpedienteExclude());

		if (filter.getIdentificadorEstablecimiento() != null && !"".equals(filter.getIdentificadorEstablecimiento())) {
			query.append(" AND ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO != ? ");
			params.add(filter.getIdentificadorEstablecimiento());
		}

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		return (List<InfoExpedienteEstablecimiento>) this.jdbcTemplate.query(query.toString(),
				this.rwMapInfoExpedientes, params.toArray());

	}

	/**
	 * 
	 */
	@Transactional(readOnly = true)
	public Long findExpedientesEstablecimientosByDniCount(InfoExpedienteEstablecimiento filterEstablecimiento,
			Integer tipoTercero) {

		StringBuilder query = new StringBuilder("SELECT COUNT(1)  FROM EXPEDIENTES EXPEDIENTES ")
				.append(" INNER JOIN (SELECT RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE  FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC  WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE  AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ON T6145.ID_EXPEDIENTE = EXPEDIENTES.ID_EXPEDIENTE")
				.append(" INNER JOIN PROCEDIMIENTOS PROCEDIMIENTOS ON PROCEDIMIENTOS.ID_PROCEDIMIENTO = EXPEDIENTES.ID_PROCEDIMIENTO ")
				.append(" INNER JOIN REL_EXP_TER RELTER ON EXPEDIENTES.ID_EXPEDIENTE = RELTER.ID_EXPEDIENTE ")
				.append(" INNER JOIN DATOS_TERCERO TERCEROS ON TERCEROS.ID_TERCERO = RELTER.ID_TERCERO AND RELTER.ID_TIPO_TERCERO = ? AND TERCEROS.DOCUMENTO = ?  ")
				.append(" INNER JOIN DATOS_DIRECCIONES DIRECCIONES ON  TERCEROS.ID_TERCERO = DIRECCIONES.ID_TERCERO AND DIRECCIONES.ID_TIPO_DIRECCION = 2  ")
				.append(" INNER JOIN AB6301S00 ESTABLECIMIENTOS ON (EXPEDIENTES.ID_EXPEDIENTE = ESTABLECIMIENTOS.ID_EXPEDIENTE  OR ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO = DIRECCIONES.IDENTIFICADOR_ESTABLECIMIENTO) AND ESTABLECIMIENTOS.TIPO_REGISTRO = ? ")
				.append(" INNER JOIN PROVINCIAS PROVINCIA ON PROVINCIA.ID = DIRECCIONES.ID_PROVINCIA ")
				.append(" INNER JOIN MUNICIPIOS MUNICIPIO ON MUNICIPIO.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND MUNICIPIO.ID = DIRECCIONES.ID_MUNICIPIO ")
				.append(" INNER JOIN LOCALIDADES LOCALIDAD ON LOCALIDAD.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND LOCALIDAD.MUNICIPIO_ID = DIRECCIONES.ID_MUNICIPIO AND LOCALIDAD.ID = DIRECCIONES.ID_LOCALIDAD ");

		// Where clause & Params
		concatFilterProcedimiento(query, filterEstablecimiento.getExcludes());
		query.append(" AND EXPEDIENTES.ID_EXPEDIENTE != ? ");

		List<Object> params = new ArrayList<Object>();
		params.add(tipoTercero);
		params.add(filterEstablecimiento.getNumTitular());
		params.add(Constantes.TIPO_REGISTRO_PROVISIONAL);
		params.add(filterEstablecimiento.getIdExpedienteExclude());

		if (filterEstablecimiento.getIdentificadorEstablecimiento() != null
				&& !"".equals(filterEstablecimiento.getIdentificadorEstablecimiento())) {
			query.append(" AND ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO != ? ");
			params.add(filterEstablecimiento.getIdentificadorEstablecimiento());
		}

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

	/**
	 * 
	 */
	@Transactional(readOnly = true)
	public List<InfoExpedienteEstablecimiento> findExpedientesEstablecimientosByUbicacion(
			InfoExpedienteEstablecimiento filterEstablecimiento, JQGridRequestDto jqGridRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT EXPEDIENTES.ID_EXPEDIENTE IDEXPEDIENTE, ESTABLECIMIENTOS.ID_ESTABLECIMIENTO IDESTABLECIMIENTO, ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADOR_ESTABLECIMIENTO, EXPEDIENTES.FOLDER_NUMBER FOLDERNUMBER, EXPEDIENTES.TITULO TITULO, PROCEDIMIENTOS.DESCRIPCION_CASTELLANO PRODDESCCAST, PROCEDIMIENTOS.DESCRIPCION_EUSKERA PRODDESCEUSK, T6145.FECHA_EXPEDIENTE EXPFECHAENTRADA, DIRECCIONES.DIRECCION DIRECCION, DIRECCIONES.PISO PISO, DIRECCIONES.NUMERO NUMERO, DIRECCIONES.LETRA LETRA, DIRECCIONES.ESCALERA ESCALERA, DIRECCIONES.ID_DIRECCION IDDIRECCION, PROVINCIA.DS_O PROVINCIA, MUNICIPIO.DS_O MUNICIPIO, LOCALIDAD.DS_O LOCALIDAD, TERCEROS.DOCUMENTO DOCUMENTO, TRIM(TERCEROS.NOMBRE  || ' ' || TERCEROS.APELLIDO1 || ' ' || TERCEROS.APELLIDO2) NOMBRE ")
						.append(" FROM EXPEDIENTES EXPEDIENTES ")
						.append(" INNER JOIN (SELECT RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE  FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC  WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE  AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ON T6145.ID_EXPEDIENTE = EXPEDIENTES.ID_EXPEDIENTE")
						.append(" INNER JOIN PROCEDIMIENTOS PROCEDIMIENTOS ON PROCEDIMIENTOS.ID_PROCEDIMIENTO = EXPEDIENTES.ID_PROCEDIMIENTO ")
						.append(" INNER JOIN REL_EXP_TER RELTER ON EXPEDIENTES.ID_EXPEDIENTE = RELTER.ID_EXPEDIENTE ")
						.append(" INNER JOIN DATOS_TERCERO TERCEROS ON TERCEROS.ID_TERCERO = RELTER.ID_TERCERO AND RELTER.ID_TIPO_TERCERO = 1 ")
						.append(" INNER JOIN DATOS_DIRECCIONES DIRECCIONES ON  TERCEROS.ID_TERCERO = DIRECCIONES.ID_TERCERO AND DIRECCIONES.ID_TIPO_DIRECCION = 2  ")
						.append(" INNER JOIN AB6301S00 ESTABLECIMIENTOS ON (EXPEDIENTES.ID_EXPEDIENTE = ESTABLECIMIENTOS.ID_EXPEDIENTE  OR ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO = DIRECCIONES.IDENTIFICADOR_ESTABLECIMIENTO) AND ESTABLECIMIENTOS.TIPO_REGISTRO = ? ")
						.append(" INNER JOIN PROVINCIAS PROVINCIA ON PROVINCIA.ID = DIRECCIONES.ID_PROVINCIA AND DIRECCIONES.ID_PROVINCIA = ? ")
						.append(" INNER JOIN MUNICIPIOS MUNICIPIO ON MUNICIPIO.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND MUNICIPIO.ID = DIRECCIONES.ID_MUNICIPIO AND DIRECCIONES.ID_MUNICIPIO = ? ")
						.append(" INNER JOIN LOCALIDADES LOCALIDAD ON LOCALIDAD.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND LOCALIDAD.MUNICIPIO_ID = DIRECCIONES.ID_MUNICIPIO AND LOCALIDAD.ID = DIRECCIONES.ID_LOCALIDAD AND DIRECCIONES.ID_LOCALIDAD = ?  ");

		// Where clause & Params
		concatFilterProcedimiento(query, filterEstablecimiento.getExcludes());
		query.append(" AND EXPEDIENTES.ID_EXPEDIENTE != ? ");

		List<Object> params = new ArrayList<Object>();
		params.add(Constantes.TIPO_REGISTRO_PROVISIONAL);
		params.add(filterEstablecimiento.getIdProvincia());
		params.add(filterEstablecimiento.getIdMunicipio());
		params.add(filterEstablecimiento.getIdLocalidad());
		params.add(filterEstablecimiento.getIdExpedienteExclude());

		if (filterEstablecimiento.getIdentificadorEstablecimiento() != null
				&& !"".equals(filterEstablecimiento.getIdentificadorEstablecimiento())) {
			query.append(" AND ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO != ? ");
			params.add(filterEstablecimiento.getIdentificadorEstablecimiento());
		}

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

		return (List<InfoExpedienteEstablecimiento>) this.jdbcTemplate.query(query.toString(),
				this.rwMapInfoExpedientes, params.toArray());

	}

	/**
	 * 
	 */
	@Transactional(readOnly = true)
	public Long findExpedientesEstablecimientosByUbicacionCount(InfoExpedienteEstablecimiento filterEstablecimiento) {

		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM EXPEDIENTES EXPEDIENTES ")
				.append(" INNER JOIN (SELECT RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE  FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC  WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE  AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ON T6145.ID_EXPEDIENTE = EXPEDIENTES.ID_EXPEDIENTE")
				.append(" INNER JOIN PROCEDIMIENTOS PROCEDIMIENTOS ON PROCEDIMIENTOS.ID_PROCEDIMIENTO = EXPEDIENTES.ID_PROCEDIMIENTO ")
				.append(" INNER JOIN REL_EXP_TER RELTER ON EXPEDIENTES.ID_EXPEDIENTE = RELTER.ID_EXPEDIENTE ")
				.append(" INNER JOIN DATOS_TERCERO TERCEROS ON TERCEROS.ID_TERCERO = RELTER.ID_TERCERO AND RELTER.ID_TIPO_TERCERO = 1  ")
				.append(" INNER JOIN DATOS_DIRECCIONES DIRECCIONES ON  TERCEROS.ID_TERCERO = DIRECCIONES.ID_TERCERO AND DIRECCIONES.ID_TIPO_DIRECCION = 2  ")
				.append(" INNER JOIN AB6301S00 ESTABLECIMIENTOS ON (EXPEDIENTES.ID_EXPEDIENTE = ESTABLECIMIENTOS.ID_EXPEDIENTE  OR ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO = DIRECCIONES.IDENTIFICADOR_ESTABLECIMIENTO) AND ESTABLECIMIENTOS.TIPO_REGISTRO = ?")
				.append(" INNER JOIN PROVINCIAS PROVINCIA ON PROVINCIA.ID = DIRECCIONES.ID_PROVINCIA AND DIRECCIONES.ID_PROVINCIA = ? ")
				.append(" INNER JOIN MUNICIPIOS MUNICIPIO ON MUNICIPIO.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND MUNICIPIO.ID = DIRECCIONES.ID_MUNICIPIO AND DIRECCIONES.ID_MUNICIPIO = ? ")
				.append(" INNER JOIN LOCALIDADES LOCALIDAD ON LOCALIDAD.PROVINCIA_ID = DIRECCIONES.ID_PROVINCIA AND LOCALIDAD.MUNICIPIO_ID = DIRECCIONES.ID_MUNICIPIO AND LOCALIDAD.ID = DIRECCIONES.ID_LOCALIDAD AND DIRECCIONES.ID_LOCALIDAD = ?  ");

		// Where clause & Params
		concatFilterProcedimiento(query, filterEstablecimiento.getExcludes());
		query.append(" AND EXPEDIENTES.ID_EXPEDIENTE != ? ");

		List<Object> params = new ArrayList<Object>();
		params.add(Constantes.TIPO_REGISTRO_PROVISIONAL);
		params.add(filterEstablecimiento.getIdProvincia());
		params.add(filterEstablecimiento.getIdMunicipio());
		params.add(filterEstablecimiento.getIdLocalidad());
		params.add(filterEstablecimiento.getIdExpedienteExclude());

		if (filterEstablecimiento.getIdentificadorEstablecimiento() != null
				&& !"".equals(filterEstablecimiento.getIdentificadorEstablecimiento())) {
			query.append(" AND ESTABLECIMIENTOS.IDENTIFICADOR_ESTABLECIMIENTO != ? ");
			params.add(filterEstablecimiento.getIdentificadorEstablecimiento());
		}

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

	private StringBuilder concatFilterProcedimiento(StringBuilder query, List<String> excludes) {
		if (excludes != null && !excludes.isEmpty()) {
			query.append("WHERE procedimientos.COD_PROCEDURE_ID NOT IN ( ");
			for (int i = 0; i < excludes.size(); i++) {
				query.append(" '").append(excludes.get(i)).append("'");

				if (i != (excludes.size() - 1)) {
					query.append(",");
				}
			}
			query.append(" ) ");
		}
		return query;
	}

	@Override
	@Transactional(readOnly = true)
	public List<Expedientes> findExpedientesPendientesByExpediente(Integer idExpediente) {
		StringBuilder query = new StringBuilder();
		query.append("SELECT t02.ID_EXPEDIENTE IDEXPEDIENTE, ");
		query.append("  t02.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO, ");
		query.append("  t02.FOLDER_ID FOLDERID, ");
		query.append("  t02.FOLDER_NUMBER FOLDERNUMBER, ");
		query.append("  t02.FECHA_REGISTRO FECHAREGISTRO, ");
		query.append("  t02.TITULO TITULO, ");
		query.append("  t01.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID, ");
		query.append(" t01.DESCRIPCION_CASTELLANO DESCCAST, ");
		query.append(" t01.DESCRIPCION_EUSKERA DESCEUSK, ");
		query.append(" t01.INSPECCIONABLE INSPECCIONABLE ");
		query.append("FROM REL_EXP_TER t34, ");
		query.append("  DATOS_DIRECCIONES t36, ");
		query.append("  EXPEDIENTES t02, ");
		query.append("  PROCEDIMIENTOS t01 ");
		query.append(" WHERE t34.ID_TERCERO = t36.ID_TERCERO ");
		query.append(" AND t34.ID_EXPEDIENTE = t02.ID_EXPEDIENTE ");
		query.append(" AND t02.ID_PROCEDIMIENTO = t01.ID_PROCEDIMIENTO ");
		query.append(
				" AND t02.id_expediente NOT IN (SELECT relFec.id_expediente FROM REL_EXP_FECH relFec, FECHAS_EXPEDIENTE FEC WHERE relFec.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_CIERRE' ) ");
		query.append(" AND t01.COD_PROCEDURE_ID IN ('").append(Constantes.PROCEDIMIENTO_INICIO_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_MODIFICACIONES_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_CESE_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_DISPENSAS_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_CONSULTAS_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_ADAPTACION_DECRETO_ACTIVIDAD).append("','")
				.append(Constantes.PROCEDIMIENTO_COMPROBACION_DE_OFICIO).append("') ");
		// query.append(" AND t34.ID_TIPO_TERCERO = 1 ");
		query.append(" AND t36.ID_TIPO_DIRECCION = 2 ");
		query.append(" AND t36.IDENTIFICADOR_ESTABLECIMIENTO IN ");
		query.append("  (SELECT t36.IDENTIFICADOR_ESTABLECIMIENTO ");
		query.append("  FROM REL_EXP_TER t34, ");
		query.append("    DATOS_DIRECCIONES t36 ");
		query.append("  WHERE t34.ID_EXPEDIENTE = ?");
		query.append("  AND t34.ID_TERCERO = t36.ID_TERCERO");
		// query.append(" AND t34.ID_TIPO_TERCERO = 1");
		query.append("  AND t36.ID_TIPO_DIRECCION = 2");
		query.append(" ) ");
		query.append("ORDER BY FECHAREGISTRO DESC");

		// Where clause & Params
		List<Object> params = new ArrayList<Object>();

		params.add(idExpediente);

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

	public Boolean hasInspectExpedient(Integer idExpediente) {
		String query = "SELECT COUNT(ID_EXPEDIENTE) FROM INSPECCIONES_EXPEDIENTE WHERE ID_EXPEDIENTE = ? ";
		Long numInspect = this.jdbcTemplate.queryForObject(query, Long.class, idExpediente);
		return numInspect > 0;
	}

	public boolean checkDateExpediente(Expedientes expediente, String etiqueta) {
		String query = "SELECT COUNT(ID_EXPEDIENTE) FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE =FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = ? AND ID_EXPEDIENTE = ? ";
		Long numInspect = this.jdbcTemplate.queryForObject(query, Long.class, etiqueta, expediente.getIdExpediente());
		return numInspect > 0;
	}

	public Inspeccion getInspectExpedient(Integer idExpediente) {
		String query = "SELECT ID_REL_EXP_INS, ID_EXPEDIENTE, ID_INSPECCION, IDENTIFICADOR_INSPECCION, TIPO_INSPECCION, FECHA_REGISTRO, USUARIO_REGISTRO FROM INSPECCIONES_EXPEDIENTE WHERE ID_EXPEDIENTE = ? ";
		List<Object> params = new ArrayList<Object>();
		params.add(idExpediente);
		List<Inspeccion> listInps = this.jdbcTemplate.query(query, this.rwMapInspecion, params.toArray());
		if (listInps.isEmpty()) {
			return new Inspeccion();
		}
		return listInps.get(0);
	}

	public Inspeccion getInspect(String identInspeccion) {
		String query = "SELECT ID_REL_EXP_INS, ID_EXPEDIENTE, ID_INSPECCION, IDENTIFICADOR_INSPECCION, TIPO_INSPECCION, FECHA_REGISTRO, USUARIO_REGISTRO FROM INSPECCIONES_EXPEDIENTE WHERE IDENTIFICADOR_INSPECCION = ? ";
		List<Object> params = new ArrayList<Object>();
		params.add(identInspeccion);
		List<Inspeccion> listInps = this.jdbcTemplate.query(query, this.rwMapInspecion, params.toArray());
		if (listInps.isEmpty()) {
			return new Inspeccion();
		}
		return listInps.get(0);
	}

	@Override
	@Transactional(readOnly = true)
	public List<Expedientes> findAllExpedientesOrigen(String identificadorEstablecimiento) {
		StringBuilder query = new StringBuilder();
		query.append("SELECT DISTINCT t02.ID_EXPEDIENTE IDEXPEDIENTE, ");
		query.append("  t02.ID_TERRITORIO_HISTORICO IDTERRITORIOHISTORICO, ");
		query.append("  t02.FOLDER_ID FOLDERID, ");
		query.append("  t02.FOLDER_NUMBER FOLDERNUMBER, ");
		query.append("  t02.FECHA_REGISTRO FECHAREGISTRO, ");
		query.append("  t02.TITULO TITULO, ");
		query.append("  t01.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID, ");
		query.append(" t01.DESCRIPCION_CASTELLANO DESCCAST, ");
		query.append(" t01.DESCRIPCION_EUSKERA DESCEUSK,t01.INSPECCIONABLE INSPECCIONABLE ");
		query.append(" FROM REL_EXP_TER t34, ");
		query.append("  DATOS_DIRECCIONES t36, ");
		query.append("  EXPEDIENTES t02, ");
		query.append("  FECHAS_EXPEDIENTE T4, ");
		query.append("  REL_EXP_FECH T5, ");
		query.append("  PROCEDIMIENTOS t01 ");
		query.append(" WHERE t34.ID_TERCERO = t36.ID_TERCERO ");
		query.append(" AND t34.ID_EXPEDIENTE = t02.ID_EXPEDIENTE ");
		query.append(" AND t5.id_expediente = t02.id_expediente ");
		query.append(" AND t02.ID_PROCEDIMIENTO = t01.ID_PROCEDIMIENTO ");
		query.append(" AND T5.ID_FECHA_EXPEDIENTE = T4.ID_FECHA_EXPEDIENTE  ");
		query.append(" AND T34.ID_EXPEDIENTE = T02.ID_EXPEDIENTE ");
		query.append(" AND T4.ETIQUETA_FECHA = 'FECHA_CIERRE' ");

		query.append("AND t01.COD_PROCEDURE_ID IN ('").append(Constantes.PROCEDIMIENTO_INICIO_ACTIVIDAD).append("', '")
				.append(Constantes.PROCEDIMIENTO_MODIFICACIONES_ACTIVIDAD).append("', '")
				.append(Constantes.PROCEDIMIENTO_COMPROBACION_DE_OFICIO).append("', '")
				.append(Constantes.PROCEDIMIENTO_ADAPTACION_DECRETO_ACTIVIDAD).append("') ");
		query.append(" AND (t34.ID_TIPO_TERCERO = 1 OR t34.ID_TIPO_TERCERO = 3) ");
		query.append(" AND t36.ID_TIPO_DIRECCION = 2 ");
		query.append(" AND t36.IDENTIFICADOR_ESTABLECIMIENTO = ? ");
		query.append(" ORDER BY FECHAREGISTRO DESC ");

		// Where clause & Params
		List<Object> params = new ArrayList<Object>();

		params.add(identificadorEstablecimiento);

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

	/**
	 * Find dependent hierarchical rows
	 *
	 * @param filterExpedientes
	 *            Expedientes
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<TableRowDto<Expedientes>>
	 */
	@Override
	public List<TableRowDto<Expedientes>> findAllChild(Expedientes filterExpedientes,
			JQGridRequestDto jqGridRequestDto) {

		// FROM
		// StringBuilder from = new StringBuilder("FROM EXPEDIENTES t1
		// ,PROCEDIMIENTOS t2 ");
		List<String> from = new ArrayList<String>();
		from.add("EXPEDIENTES");
		from.add("PROCEDIMIENTOS");

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

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

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

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

		// MULTISELECCION
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = JQGridManagerJerarquia.getQueryChildren(jqGridRequestDto, mapaWhere, "ID_EXPEDIENTE",
				"ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// JQGridManagerJerarquia.getQueryChildren(jqGridRequestDto, mapaWhere,
		// "ID", "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

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

		return this.jdbcTemplate.query(query.toString(),
				new RowNumResultSetExtractor<Expedientes>(this.rwMapPK, "ID_EXPEDIENTE"), params.toArray());
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (expedientes != null && expedientes.getIdExpediente() != null) {
			where.append(" AND t1.ID_EXPEDIENTE = ?");
			params.add(expedientes.getIdExpediente());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getIdProcedimiento() != null) {
			where.append(" AND t2.ID_PROCEDIMIENTO = ?");
			params.add(expedientes.getProcedimientos().getIdProcedimiento());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getDirecciones() != null
				&& expedientes.getProcedimientos().getDirecciones().getIdDireccion() != null) {
			where.append(" AND t2.ID_DIRECCION = ?");
			params.add(expedientes.getProcedimientos().getDirecciones().getIdDireccion());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getAreas() != null
				&& expedientes.getProcedimientos().getAreas().getIdArea() != null) {
			where.append(" AND t2.ID_AREA = ?");
			params.add(expedientes.getProcedimientos().getAreas().getIdArea());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getCodProcedureId() != null) {
			where.append(" AND t2.COD_PROCEDURE_ID = ?");
			params.add(expedientes.getProcedimientos().getCodProcedureId());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getCamposTituloExpediente() != null) {
			where.append(" AND t2.CAMPOS_TITULO_EXPEDIENTE = ?");
			params.add(expedientes.getProcedimientos().getCamposTituloExpediente());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(expedientes.getProcedimientos().getFechaRegistro());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getUsuarioRegistro() != null) {
			where.append(" AND t2.USUARIO_REGISTRO = ?");
			params.add(expedientes.getProcedimientos().getUsuarioRegistro());
		}
		if (expedientes != null && expedientes.getIdTerritorioHistorico() != null) {
			where.append(" AND t1.ID_TERRITORIO_HISTORICO = ?");
			params.add(expedientes.getIdTerritorioHistorico());
		}
		if (expedientes != null && expedientes.getFolderId() != null) {
			where.append(" AND t1.FOLDER_ID = ?");
			params.add(expedientes.getFolderId());
		}
		if (expedientes != null && expedientes.getFolderNumber() != null) {
			where.append(" AND t1.FOLDER_NUMBER = ?");
			params.add(expedientes.getFolderNumber());
		}
		if (expedientes != null && expedientes.getTitulo() != null) {
			where.append(" AND t1.TITULO = ?");
			params.add(expedientes.getTitulo());
		}
		if (expedientes != null && expedientes.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(expedientes.getFechaRegistro());
		}
		if (expedientes != null && expedientes.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(expedientes.getUsuarioRegistro());
		}

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

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

		if (expedientes != null && expedientes.getIdExpediente() != null) {
			where.append(" AND t1.ID_EXPEDIENTE = ?");
			params.add(expedientes.getIdExpediente());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getIdProcedimiento() != null) {
			where.append(" AND t2.ID_PROCEDIMIENTO = ?");
			params.add(expedientes.getProcedimientos().getIdProcedimiento());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getDirecciones() != null
				&& expedientes.getProcedimientos().getDirecciones().getIdDireccion() != null) {
			where.append(" AND t2.ID_DIRECCION = ?");
			params.add(expedientes.getProcedimientos().getDirecciones().getIdDireccion());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getAreas() != null
				&& expedientes.getProcedimientos().getAreas().getIdArea() != null) {
			where.append(" AND t2.ID_AREA = ?");
			params.add(expedientes.getProcedimientos().getAreas().getIdArea());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getCodProcedureId() != null) {
			where.append(" AND UPPER(t2.COD_PROCEDURE_ID) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getProcedimientos().getCodProcedureId().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getProcedimientos().getCodProcedureId().toUpperCase() + "%");
			}
			where.append(" AND t2.COD_PROCEDURE_ID IS NOT NULL");
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getCamposTituloExpediente() != null) {
			where.append(" AND UPPER(t2.CAMPOS_TITULO_EXPEDIENTE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getProcedimientos().getCamposTituloExpediente().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getProcedimientos().getCamposTituloExpediente().toUpperCase() + "%");
			}
			where.append(" AND t2.CAMPOS_TITULO_EXPEDIENTE IS NOT NULL");
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(expedientes.getProcedimientos().getFechaRegistro());
		}
		if (expedientes != null && expedientes.getProcedimientos() != null
				&& expedientes.getProcedimientos().getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t2.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getProcedimientos().getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getProcedimientos().getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t2.USUARIO_REGISTRO IS NOT NULL");
		}
		if (expedientes != null && expedientes.getIdTerritorioHistorico() != null) {
			where.append(" AND t1.ID_TERRITORIO_HISTORICO = ?");
			params.add(expedientes.getIdTerritorioHistorico());
		}
		if (expedientes != null && expedientes.getFolderId() != null) {
			where.append(" AND UPPER(t1.FOLDER_ID) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getFolderId().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getFolderId().toUpperCase() + "%");
			}
			where.append(" AND t1.FOLDER_ID IS NOT NULL");
		}
		if (expedientes != null && expedientes.getFolderNumber() != null) {
			where.append(" AND UPPER(t1.FOLDER_NUMBER) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getFolderNumber().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getFolderNumber().toUpperCase() + "%");
			}
			where.append(" AND t1.FOLDER_NUMBER IS NOT NULL");
		}
		if (expedientes != null && expedientes.getTitulo() != null) {
			where.append(" AND UPPER(t1.TITULO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getTitulo().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getTitulo().toUpperCase() + "%");
			}
			where.append(" AND t1.TITULO IS NOT NULL");
		}
		if (expedientes != null && expedientes.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(expedientes.getFechaRegistro());
		}
		if (expedientes != null && expedientes.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(expedientes.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + expedientes.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}

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

		return mapWhere;
	}

	private Map<String, ?> getWhereExpediente(Expedientes expedientes) {

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

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

		// SEGURIDAD
		List<GrantedAuthority> list = new ArrayList<GrantedAuthority>(
				SecurityContextHolder.getContext().getAuthentication().getAuthorities());

		boolean esComercio = false;
		boolean esTurismo = false;

		for (int i = 0; i < list.size(); i++) {

			if ("ROLE_AB63-IN-0001".equals(list.get(i).getAuthority())) {
				esComercio = true;
				esTurismo = true;
			}
			if ("ROLE_AB63-IN-0002".equals(list.get(i).getAuthority())) {
				esTurismo = true;
			}
			if ("ROLE_AB63-IN-0003".equals(list.get(i).getAuthority())) {
				esTurismo = true;
			}
			if ("ROLE_AB63-IN-0004".equals(list.get(i).getAuthority())) {
				esComercio = true;
			}
			if ("ROLE_AB63-IN-0005".equals(list.get(i).getAuthority())) {
				esComercio = true;
			}

		}

		where.append(" AND (t6.ID_DIRECCION = ? OR t6.ID_DIRECCION = ?) ");

		if (esComercio && esTurismo) {
			params.add(Constantes.ID_TIPO_DIRECCION_ESTABLECIMIENTO_EXPEDIENTE);
			params.add(Constantes.COD_DIRECCION_TURISMO);
		} else if (esComercio) {
			params.add(Constantes.ID_TIPO_DIRECCION_ESTABLECIMIENTO_EXPEDIENTE);
			params.add(Constantes.ID_TIPO_DIRECCION_ESTABLECIMIENTO_EXPEDIENTE);
		} else {
			params.add(Constantes.COD_DIRECCION_TURISMO);
			params.add(Constantes.COD_DIRECCION_TURISMO);
		}

		TiposTercero tiposTercero = new TiposTercero();
		tiposTercero.setIdTipoTercero(com.ejie.ab63.comun.Constantes.SOLICITANTE);

		if (expedientes != null && expedientes.getProcedimiento() != null
				&& expedientes.getProcedimiento().getIdProcedimiento() != null) {
			where.append(" AND t6.ID_PROCEDIMIENTO = ?");
			params.add(expedientes.getProcedimiento().getIdProcedimiento());
		}

		if (expedientes != null && expedientes.getFolderNumber() != null) {
			where.append(" AND UPPER(t1.FOLDER_NUMBER) LIKE UPPER('%" + expedientes.getFolderNumber() + "%')");
		}

		if (expedientes != null && expedientes.getDatosTerceros() != null
				&& expedientes.getDatosTerceros().getDocumento() != null) {
			where.append(" AND UPPER(t8.DOCUMENTO) = UPPER(?)");
			params.add(expedientes.getDatosTerceros().getDocumento());
		}
		if (expedientes != null && expedientes.getDatosTerceros() != null
				&& expedientes.getDatosTerceros().getNombre() != null) {
			where.append(" AND UPPER(t8.NOMBRE) LIKE UPPER('%" + expedientes.getDatosTerceros().getNombre() + "%')");
		}
		if (expedientes != null && expedientes.getDatosTerceros() != null
				&& expedientes.getDatosTerceros().getApellido1() != null) {
			where.append(
					" AND UPPER(t8.APELLIDO1) LIKE UPPER('%" + expedientes.getDatosTerceros().getApellido1() + "%')");
		}
		if (expedientes != null && expedientes.getDatosTerceros() != null
				&& expedientes.getDatosTerceros().getApellido2() != null) {
			where.append(
					" AND UPPER(t8.APELLIDO2) LIKE UPPER('%" + expedientes.getDatosTerceros().getApellido2() + "%')");
		}
		if (tiposTercero != null && tiposTercero.getIdTipoTercero() != null) {
			where.append(" AND t2.ID_TIPO_TERCERO = ?");
			params.add(tiposTercero.getIdTipoTercero());
		}
		if (expedientes != null && expedientes.getDatosTerceros() != null
				&& expedientes.getDatosTerceros().getTipoParticipante() != null) {
			where.append(" AND t8.TIPO_PARTICIPANTE = ?");
			params.add(Constantes.PARTICIPANTE_TITULAR);
		}
		if (expedientes != null && expedientes.getTitulo() != null) {
			where.append(" AND UPPER(t1.TITULO) LIKE UPPER('%" + expedientes.getTitulo() + "%')");
		}
		return mapWhere;
	}

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

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

	@Override
	@Deprecated
	public List<InfoExpedienteEstablecimiento> findExpRelByIdentificadorEstOLD(InfoExpedienteEstablecimiento filter,
			JQGridRequestDto jqGridRequestDto, String origen) {

		StringBuilder query = new StringBuilder(

				"SELECT DISTINCT t6102.ID_EXPEDIENTE IDEXPEDIENTE, t6102.FOLDER_ID FOLDERID, t6102.FOLDER_NUMBER FOLDERNUMBER,(SELECT t6102aux.FOLDER_NUMBER FROM AB61.AB6102T00 t6102aux WHERE t6102.ID_EXPEDIENTE_ORIGEN=t6102aux.ID_EXPEDIENTE) FOLDERNUMBERORIGEN, (SELECT t6102aux.FOLDER_ID FROM AB61.AB6102T00 t6102aux WHERE t6102.ID_EXPEDIENTE_ORIGEN=t6102aux.ID_EXPEDIENTE) FOLDERIDORIGEN, t6102.TITULO TITULO, T6145.FECHA_EXPEDIENTE EXPFECHAENTRADA, t6144.FECHA_EXPEDIENTE EXPFECHACIERRE, t6101.DESCRIPCION_CASTELLANO PRODDESCCAST, t6101.DESCRIPCION_EUSKERA PRODDESCEUSK, t6143.ID_REL_EXP_INS IDRELEXPINS, t6143.ID_EXPEDIENTE IDEXPINSP, t6143.ID_INSPECCION IDINSPECCION, t6143.TIPO_INSPECCION TIPOINSPECCION, t6143.FECHA_REGISTRO FECHAREGISTROINSP, t6143.USUARIO_REGISTRO USUARIOREGISTROINSP, t6143.IDENTIFICADOR_INSPECCION IDENTIFICADORINSPECCION")
						.append(" FROM EXPEDIENTES t6102, PROCEDIMIENTOS t6101, REL_EXP_TER t6134, DATOS_DIRECCIONES t6136, INSPECCIONES_EXPEDIENTE t6143, (SELECT RELFEC.id_expediente,  TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_CIERRE') T6144, (SELECT RELFEC.id_expediente,  TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA' ) T6145 ")
						.append(" WHERE t6102.ID_EXPEDIENTE = t6143.ID_EXPEDIENTE(+)")
						.append(" AND T6144.ID_EXPEDIENTE (+)= T6102.ID_EXPEDIENTE ")
						.append(" AND T6145.ID_EXPEDIENTE (+) = T6102.ID_EXPEDIENTE ")
						.append(" AND t6134.ID_TERCERO = t6136.ID_TERCERO")
						.append(" AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE")
						.append(" AND t6102.ID_PROCEDIMIENTO = t6101.ID_PROCEDIMIENTO")
						.append(" AND t6136.IDENTIFICADOR_ESTABLECIMIENTO IN (SELECT t6136.IDENTIFICADOR_ESTABLECIMIENTO FROM REL_EXP_TER t6134, DATOS_DIRECCIONES t6136 WHERE t6136.IDENTIFICADOR_ESTABLECIMIENTO=? AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE AND t6134.ID_TERCERO = t6136.ID_TERCERO)");

		List<Object> params = new ArrayList<Object>();
		params.add(filter.getIdentificadorEstablecimiento());

		if ("1".equals(origen)) {
			query.append(
					" AND t6101.COD_PROCEDURE_ID IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");

			// union nb29
			query.append(
					" UNION SELECT NULL, t6343.FOLDER_ID FOLDERID,t6343.NUM_EXPEDIENTE FOLDERNUMBER, NULL, NULL, t6343.TITULO_EXP TITULO,t6343.FECHA_APERTURA EXPFECHAENTRADA,NULL,t6343.NOMBRE_PROC PRODDESCCAST,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM AB6343T00 t6343 WHERE t6343.ID_ESTABLECIMIENTO IN (SELECT ID_ESTABLECIMIENTO FROM AB6301T00 WHERE IDENTIFICADOR_ESTABLECIMIENTO = ?) ");
			params.add(filter.getIdentificadorEstablecimiento());
			// union nb29
		} else {
			query.append(
					" AND t6101.COD_PROCEDURE_ID NOT IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");
		}

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

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

	@Override
	public List<InfoExpedienteEstablecimiento> findExpRelByIdentificadorEst(InfoExpedienteEstablecimiento filter,
			JQGridRequestDto jqGridRequestDto, String origen) {

		StringBuilder query = new StringBuilder(
				"SELECT DISTINCT T6102.ID_EXPEDIENTE IDEXPEDIENTE, T6102.FOLDER_ID FOLDERID, T6102.FOLDER_NUMBER FOLDERNUMBER, (SELECT T6102AUX.FOLDER_NUMBER FROM AB61.AB6102T00 T6102AUX WHERE T6102.ID_EXPEDIENTE_ORIGEN = T6102AUX.ID_EXPEDIENTE) FOLDERNUMBERORIGEN, (SELECT T6102AUX.FOLDER_ID FROM AB61.AB6102T00 T6102AUX WHERE T6102.ID_EXPEDIENTE_ORIGEN = T6102AUX.ID_EXPEDIENTE) FOLDERIDORIGEN, T6102.TITULO TITULO, T6145.FECHA_EXPEDIENTE EXPFECHAENTRADA, T6144.FECHA_EXPEDIENTE EXPFECHACIERRE, T6101.DESCRIPCION_CASTELLANO PRODDESCCAST, T6101.DESCRIPCION_EUSKERA PRODDESCEUSK, (SELECT LISTAGG(A1.IDENTIFICADOR_INSPECCION || '#' || A1.ID_INSPECCION,',') WITHIN GROUP( ORDER BY A1.IDENTIFICADOR_INSPECCION) FROM INSPECCIONES_EXPEDIENTE A1 WHERE A1.ID_EXPEDIENTE = T6102.ID_EXPEDIENTE) IDENTIFICADORINSPECCION, APPS.URL_APLICACION ")
						.append(" FROM EXPEDIENTES T6102, PROCEDIMIENTOS T6101, REL_EXP_TER T6134, DATOS_DIRECCIONES T6136, AB61.AB6146T00 APPS, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_CIERRE' ) T6144, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ")
						.append(" WHERE T6144.ID_EXPEDIENTE (+)= T6102.ID_EXPEDIENTE ")
						.append(" AND T6145.ID_EXPEDIENTE (+) = T6102.ID_EXPEDIENTE ")
						.append(" AND t6134.ID_TERCERO = t6136.ID_TERCERO")
						.append(" AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE")
						.append(" AND t6102.ID_PROCEDIMIENTO = t6101.ID_PROCEDIMIENTO")
						.append(" AND T6101.ID_APLICACION (+) = APPS.ID_APLICACION")
						.append(" AND t6136.IDENTIFICADOR_ESTABLECIMIENTO IN (SELECT t6136.IDENTIFICADOR_ESTABLECIMIENTO FROM REL_EXP_TER t6134, DATOS_DIRECCIONES t6136 WHERE t6136.IDENTIFICADOR_ESTABLECIMIENTO=? AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE AND t6134.ID_TERCERO = t6136.ID_TERCERO) ");

		List<Object> params = new ArrayList<Object>();
		params.add(filter.getIdentificadorEstablecimiento());

		if ("1".equals(origen)) {
			query.append(
					" AND t6101.COD_PROCEDURE_ID IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");

			// union nb29
			query.append(
					" UNION SELECT NULL, t6124.folder_id folderid, T6124.FOLDER_NUMBER foldernumber, NULL, NULL, T6124.TITULO titulo, T6124.FECHA_APERTURA expfechaentrada, NULL, T6124.NOM_PROCEDIMIENTO proddesccast, NULL, NULL, NULL FROM AB61.ab6124t00 t6124 WHERE t6124.id_establecimiento IN ( SELECT id_establecimiento FROM ab6301t00 WHERE identificador_establecimiento=?) ");
			params.add(filter.getIdentificadorEstablecimiento());
			// union nb29
		} else {
			query.append(
					" AND t6101.COD_PROCEDURE_ID NOT IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");
		}

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, ExpedientesDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	@Override
	public Long findExpRelByIdentificadorEstCountOLD(InfoExpedienteEstablecimiento filter, String origen) {

		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM (")
				.append("SELECT DISTINCT T6102.ID_EXPEDIENTE IDEXPEDIENTE, T6102.FOLDER_ID FOLDERID, T6102.FOLDER_NUMBER FOLDERNUMBER, (SELECT T6102AUX.FOLDER_NUMBER FROM AB61.AB6102T00 T6102AUX WHERE T6102.ID_EXPEDIENTE_ORIGEN = T6102AUX.ID_EXPEDIENTE) FOLDERNUMBERORIGEN, (SELECT T6102AUX.FOLDER_ID FROM AB61.AB6102T00 T6102AUX WHERE T6102.ID_EXPEDIENTE_ORIGEN = T6102AUX.ID_EXPEDIENTE) FOLDERIDORIGEN, T6102.TITULO TITULO, T6145.FECHA_EXPEDIENTE EXPFECHAENTRADA, T6144.FECHA_EXPEDIENTE EXPFECHACIERRE, T6101.DESCRIPCION_CASTELLANO PRODDESCCAST, T6101.DESCRIPCION_EUSKERA PRODDESCEUSK, (SELECT LISTAGG(A1.IDENTIFICADOR_INSPECCION || '#' || A1.ID_INSPECCION,',') WITHIN GROUP( ORDER BY A1.IDENTIFICADOR_INSPECCION) FROM INSPECCIONES_EXPEDIENTE A1 WHERE A1.ID_EXPEDIENTE = T6102.ID_EXPEDIENTE) IDENTIFICADORINSPECCION ")
				.append(" FROM EXPEDIENTES T6102, PROCEDIMIENTOS T6101, REL_EXP_TER T6134, DATOS_DIRECCIONES T6136, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_CIERRE' ) T6144, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ")
				.append(" WHERE T6144.ID_EXPEDIENTE (+)= T6102.ID_EXPEDIENTE ")
				.append(" AND T6145.ID_EXPEDIENTE (+) = T6102.ID_EXPEDIENTE ")
				.append(" AND t6134.ID_TERCERO = t6136.ID_TERCERO")
				.append(" AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE")
				.append(" AND t6102.ID_PROCEDIMIENTO = t6101.ID_PROCEDIMIENTO")
				.append(" AND t6136.IDENTIFICADOR_ESTABLECIMIENTO IN (SELECT t6136.IDENTIFICADOR_ESTABLECIMIENTO FROM REL_EXP_TER t6134, DATOS_DIRECCIONES t6136 WHERE t6136.IDENTIFICADOR_ESTABLECIMIENTO=? AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE AND t6134.ID_TERCERO = t6136.ID_TERCERO) ");

		List<Object> params = new ArrayList<Object>();
		params.add(filter.getIdentificadorEstablecimiento());

		if ("1".equals(origen)) {
			query.append(
					" AND t6101.COD_PROCEDURE_ID IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");

			// union nb29
			query.append(
					" UNION SELECT NULL, t6124.folder_id folderid, T6124.FOLDER_NUMBER foldernumber, NULL, NULL, T6124.TITULO titulo, T6124.FECHA_APERTURA expfechaentrada, NULL, T6124.NOM_PROCEDIMIENTO proddesccast, NULL, NULL FROM AB61.ab6124t00 t6124 WHERE t6124.id_establecimiento IN ( SELECT id_establecimiento FROM ab6301t00 WHERE identificador_establecimiento=?) ");
			params.add(filter.getIdentificadorEstablecimiento());
			// union nb29
		} else {
			query.append(
					" AND t6101.COD_PROCEDURE_ID NOT IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807'))");
		}

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

	@Override
	public Long findExpRelByIdentificadorEstCount(InfoExpedienteEstablecimiento filter, String origen) {

		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM (")
				.append("SELECT DISTINCT t6102.ID_EXPEDIENTE IDEXPEDIENTE ")
				.append(" FROM EXPEDIENTES T6102, PROCEDIMIENTOS T6101, REL_EXP_TER T6134, DATOS_DIRECCIONES T6136, AB61.AB6146T00 APPS, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_CIERRE' ) T6144, (SELECT RELFEC.ID_EXPEDIENTE, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND FEC.ETIQUETA_FECHA = 'FECHA_APERTURA') T6145 ")
				.append(" WHERE T6144.ID_EXPEDIENTE (+)= T6102.ID_EXPEDIENTE ")
				.append(" AND T6145.ID_EXPEDIENTE (+) = T6102.ID_EXPEDIENTE ")
				.append(" AND t6134.ID_TERCERO = t6136.ID_TERCERO")
				.append(" AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE")
				.append(" AND t6102.ID_PROCEDIMIENTO = t6101.ID_PROCEDIMIENTO")
				.append(" AND T6101.ID_APLICACION (+) = APPS.ID_APLICACION")
				.append(" AND t6136.IDENTIFICADOR_ESTABLECIMIENTO IN (SELECT t6136.IDENTIFICADOR_ESTABLECIMIENTO FROM REL_EXP_TER t6134, DATOS_DIRECCIONES t6136 WHERE t6136.IDENTIFICADOR_ESTABLECIMIENTO=? AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE AND t6134.ID_TERCERO = t6136.ID_TERCERO) ");

		// modificada por version arriba (no era igual que
		// findExpRelByIdentificadorEst)
		// .append(" FROM EXPEDIENTES t6102, PROCEDIMIENTOS t6101, REL_EXP_TER
		// t6134, DATOS_DIRECCIONES t6136, INSPECCIONES_EXPEDIENTE t6143,
		// (SELECT RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE)
		// FECHA_EXPEDIENTE FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC
		// WHERE RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND
		// FEC.ETIQUETA_FECHA = 'FECHA_CIERRE') T6144, (SELECT
		// RELFEC.id_expediente, TRUNC(RELFEC.FECHA_EXPEDIENTE) FECHA_EXPEDIENTE
		// FROM REL_EXP_FECH RELFEC, FECHAS_EXPEDIENTE FEC WHERE
		// RELFEC.ID_FECHA_EXPEDIENTE = FEC.ID_FECHA_EXPEDIENTE AND
		// FEC.ETIQUETA_FECHA = 'FECHA_APERTURA' ) T6145 ")
		// .append(" WHERE t6102.ID_EXPEDIENTE = t6143.ID_EXPEDIENTE(+)")
		// .append(" AND T6144.ID_EXPEDIENTE (+)= T6102.ID_EXPEDIENTE ")
		// .append(" AND T6145.ID_EXPEDIENTE (+) = T6102.ID_EXPEDIENTE ")
		// .append(" AND t6134.ID_TERCERO = t6136.ID_TERCERO")
		// .append(" AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE")
		// .append(" AND t6102.ID_PROCEDIMIENTO = t6101.ID_PROCEDIMIENTO")
		// .append(" AND t6136.IDENTIFICADOR_ESTABLECIMIENTO IN (SELECT
		// t6136.IDENTIFICADOR_ESTABLECIMIENTO FROM REL_EXP_TER t6134,
		// DATOS_DIRECCIONES t6136 WHERE t6136.IDENTIFICADOR_ESTABLECIMIENTO=?
		// AND t6134.ID_EXPEDIENTE = t6102.ID_EXPEDIENTE AND t6134.ID_TERCERO =
		// t6136.ID_TERCERO)");

		List<Object> params = new ArrayList<Object>();
		params.add(filter.getIdentificadorEstablecimiento());

		if ("1".equals(origen)) {
			query.append(
					" AND t6101.COD_PROCEDURE_ID IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807')");

			// union nb29
			query.append(
					" UNION SELECT  count(t6124.FOLDER_ID)  FROM AB61.AB6124T00 t6124 WHERE t6124.ID_ESTABLECIMIENTO IN (SELECT ID_ESTABLECIMIENTO FROM AB6301T00 WHERE IDENTIFICADOR_ESTABLECIMIENTO = ?)) ");
			params.add(filter.getIdentificadorEstablecimiento());
			// union nb29
		} else {
			query.append(
					" AND t6101.COD_PROCEDURE_ID NOT IN ('0012801','0012802','0012803','0012804','0012805','0012806','0012807'))");
		}

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

	@Override
	public Date getMaxDateExpediente(Integer idExpediente, String tipoFecha, boolean isEtiqueta) {
		StringBuilder query = new StringBuilder(
				"SELECT MAX(RF.FECHA_EXPEDIENTE) fecha FROM EXPEDIENTES E, REL_EXP_FECH RF, FECHAS_EXPEDIENTE F ");
		query.append("WHERE E.ID_EXPEDIENTE=RF.ID_EXPEDIENTE AND RF.ID_FECHA_EXPEDIENTE = F.ID_FECHA_EXPEDIENTE");
		query.append(" AND E.ID_EXPEDIENTE = ? ");
		if (isEtiqueta) {
			query.append(" AND F.ETIQUETA_FECHA = ? ");
		} else {
			query.append(" AND F.PLATEA_TYPE = ? ");
		}
		query.append("GROUP BY F.PLATEA_TYPE");
		List<Date> dates = this.jdbcTemplate.query(query.toString(), this.rwMapDateExp, idExpediente, tipoFecha);
		if (dates.isEmpty()) {
			return null;
		}
		return dates.get(0);
	}

	@Override
	public Expedientes updateTerritorioHistorico(Expedientes expediente) {

		String query = "UPDATE EXPEDIENTES SET ID_TERRITORIO_HISTORICO=?, FECHA_ULTMODIFICACION=SYSDATE, USUARIO_ULTMODIFICACION=? WHERE ID_EXPEDIENTE=?";

		this.jdbcTemplate.update(query, expediente.getIdTerritorioHistorico(), PermisosXLNETS.getUserConnected(),
				expediente.getIdExpediente());

		return expediente;
	}

}