/*
* Copyright 2021 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.ad74a.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.dao.comun.UtilDAO;
import com.ejie.ad74a.model.BandejaEntradas;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.ErroresExpedienteEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * BandejaEntradasDaoImpl generated by UDA, 06-jun-2023 9:23:12.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class BandejaEntradasDaoImpl implements BandejaEntradasDao {

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

	protected static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDTIPOENTRADA", "IDENTRADA", "ESTADO",
			"IDJMS", "PROCEDUREID", "FREGISTRO", "NUMREGISTRO", "NUMEXPEDIENTE", "IDEXPEDIENTE", "URGENCIA",
			"ERROREXPEDIENTE", "IDSOLICITANTE", "IDENTIFICADOR", "NOMBRE", "APELLIDO1", "APELLIDO2", "TIPO",
			"NUMREGORIGINAL", "FREGORIGINAL", "REMITENTE", "BLOQUEO", "USURESPONSABLE", "NUMDOCUMENTOS", "QRCODE",
			"OBSERVACIONES", "MOTIVOOCULTAR" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<BandejaEntradas> rwMap = new RowMapper<BandejaEntradas>() {
		public BandejaEntradas mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			BandejaEntradas bandejaEntradas = new BandejaEntradas(UtilSQL.getLong(resultSet, "IDTIPOENTRADA"),
					UtilSQL.getLong(resultSet, "IDENTRADA"), resultSet.getString("ESTADO"),
					resultSet.getString("IDJMS"), resultSet.getString("PROCEDUREID"),
					resultSet.getTimestamp("FREGISTRO"), resultSet.getString("NUMREGISTRO"),
					resultSet.getString("NUMEXPEDIENTE"), UtilSQL.getLong(resultSet, "IDEXPEDIENTE"),
					UtilSQL.getLong(resultSet, "URGENCIA"), UtilSQL.getLong(resultSet, "ERROREXPEDIENTE"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE"), resultSet.getString("IDENTIFICADOR"),
					resultSet.getString("NOMBRE"), resultSet.getString("APELLIDO1"), resultSet.getString("APELLIDO2"),
					resultSet.getString("TIPO"), resultSet.getString("NUMREGORIGINAL"),
					resultSet.getDate("FREGORIGINAL"), resultSet.getString("REMITENTE"),
					UtilSQL.getLong(resultSet, "BLOQUEO"), resultSet.getString("USURESPONSABLE"),
					UtilSQL.getLong(resultSet, "NUMDOCUMENTOS"), resultSet.getString("QRCODE"),
					resultSet.getString("OBSERVACIONES"), resultSet.getString("MOTIVOOCULTAR"));

			if (bandejaEntradas.getIdTipoentrada() != null) {
				bandejaEntradas.setIdtipoentrada_desc(TipoExpedientes.idTipoEntrada00
						.getLabelDescById(bandejaEntradas.getIdTipoentrada().intValue()));
			}

			if (bandejaEntradas.getTipo() != null) {
				bandejaEntradas.setTipo_desc(
						TipoAportacionEnum.getDesc(bandejaEntradas.getTipo().replaceAll("^0*", ""), null));
			}

			if (bandejaEntradas.getProcedureid() != null) {
				bandejaEntradas.setProcedureid_desc(ProcedimientosEnum.getDesc(bandejaEntradas.getProcedureid()));
			}

			if (bandejaEntradas.getErrorexpediente() != null) {
				bandejaEntradas.setErrorexpediente_desc(
						ErroresExpedienteEnum.getDesc(bandejaEntradas.getErrorexpediente().intValue()));
			}

			if (UtilDAO.hasColumn(resultSet, "BENEFICIARIO01")) {
				bandejaEntradas.setBeneficiario01(UtilSQL.getInt(resultSet, "BENEFICIARIO01"));
			}

			return bandejaEntradas;
		}
	};

	private RowMapper<BandejaEntradas> rwMapPK = new RowMapper<BandejaEntradas>() {
		public BandejaEntradas mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new BandejaEntradas(UtilSQL.getLong(resultSet, "IDTIPOENTRADA"),
					UtilSQL.getLong(resultSet, "IDENTRADA"), resultSet.getString("ESTADO"),
					resultSet.getString("IDJMS"), resultSet.getString("PROCEDUREID"), resultSet.getDate("FREGISTRO"),
					resultSet.getString("NUMREGISTRO"), resultSet.getString("NUMEXPEDIENTE"),
					UtilSQL.getLong(resultSet, "IDEXPEDIENTE"), UtilSQL.getLong(resultSet, "URGENCIA"),
					UtilSQL.getLong(resultSet, "ERROREXPEDIENTE"), UtilSQL.getLong(resultSet, "IDSOLICITANTE"),
					resultSet.getString("IDENTIFICADOR"), resultSet.getString("NOMBRE"),
					resultSet.getString("APELLIDO1"), resultSet.getString("APELLIDO2"), resultSet.getString("TIPO"),
					resultSet.getString("NUMREGORIGINAL"), resultSet.getDate("FREGORIGINAL"),
					resultSet.getString("REMITENTE"), UtilSQL.getLong(resultSet, "BLOQUEO"),
					resultSet.getString("USURESPONSABLE"), UtilSQL.getLong(resultSet, "NUMDOCUMENTOS"),
					resultSet.getString("QRCODE"), resultSet.getString("OBSERVACIONES"),
					resultSet.getString("MOTIVOOCULTAR"));
		}
	};

	private Object bandejaentradas;

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

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Finds a single row in the BandejaEntradas table.
	 *
	 * @param bandejaentradas BandejaEntradas
	 *
	 * @return BandejaEntradas
	 */
	@Transactional(readOnly = true)
	public BandejaEntradas find(BandejaEntradas bandejaentradas) {
		String query = "SELECT t1.IDTIPOENTRADA IDTIPOENTRADA, t1.IDENTRADA IDENTRADA, t1.ESTADO ESTADO, t1.IDJMS IDJMS, t1.PROCEDUREID PROCEDUREID, t1.FREGISTRO FREGISTRO, "
				+ "t1.NUMREGISTRO NUMREGISTRO, t1.NUMEXPEDIENTE NUMEXPEDIENTE, t1.IDEXPEDIENTE IDEXPEDIENTE, t1.URGENCIA URGENCIA, t1.ERROREXPEDIENTE ERROREXPEDIENTE, "
				+ "t1.IDSOLICITANTE IDSOLICITANTE, t1.IDENTIFICADOR IDENTIFICADOR, t1.NOMBRE NOMBRE, t1.APELLIDO1 APELLIDO1, t1.APELLIDO2 APELLIDO2, t1.TIPO TIPO, "
				+ "t1.NUMREGORIGINAL NUMREGORIGINAL, t1.FREGORIGINAL FREGORIGINAL, t1.REMITENTE REMITENTE, t1.BLOQUEO BLOQUEO, t1.USURESPONSABLE USURESPONSABLE, "
				+ "t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES OBSERVACIONES, t1.MOTIVOOCULTAR MOTIVOOCULTAR "
				+ "FROM BANDEJA_ENTRADAS t1  "
				+ "WHERE t1.IDTIPOENTRADA = ?   AND t1.IDENTRADA = ?   AND t1.ESTADO = ?   AND t1.IDJMS = ?   AND t1.PROCEDUREID = ?   AND t1.FREGISTRO = ?   "
				+ "AND t1.NUMREGISTRO = ?   AND t1.NUMEXPEDIENTE = ?   AND t1.IDEXPEDIENTE = ?   AND t1.URGENCIA = ?   AND t1.ERROREXPEDIENTE = ?   "
				+ "AND t1.IDSOLICITANTE = ?   AND UPPER(t1.IDENTIFICADOR) = UPPER(?)   AND t1.NOMBRE = ?   AND t1.APELLIDO1 = ?   AND t1.APELLIDO2 = ?   AND t1.TIPO = ?   "
				+ "AND t1.NUMREGORIGINAL = ?   AND t1.FREGORIGINAL = ?   AND t1.REMITENTE = ?   AND t1.BLOQUEO = ?   AND t1.USURESPONSABLE = ?   AND t1.NUMDOCUMENTOS = ?  ";

		List<BandejaEntradas> bandejaentradasList = this.jdbcTemplate.query(query, this.rwMap,
				bandejaentradas.getIdTipoentrada(), bandejaentradas.getIdentrada(), bandejaentradas.getEstado(),
				bandejaentradas.getIdjms(), bandejaentradas.getProcedureid(), bandejaentradas.getFregistro(),
				bandejaentradas.getNumregistro(), bandejaentradas.getNumexpediente(), bandejaentradas.getIdexpediente(),
				bandejaentradas.getTipoUrgencia(), bandejaentradas.getErrorexpediente(),
				bandejaentradas.getIdsolicitante(), bandejaentradas.getIdentificador(), bandejaentradas.getNombre(),
				bandejaentradas.getApellido1(), bandejaentradas.getApellido2(), bandejaentradas.getTipo(),
				bandejaentradas.getNumregoriginal(), bandejaentradas.getFregoriginal(), bandejaentradas.getRemitente(),
				bandejaentradas.getBloqueo(), bandejaentradas.getUsuresponsable(), bandejaentradas.getNumdocumentos());
		return DataAccessUtils.uniqueResult(bandejaentradasList);
	}

	public List<BandejaEntradas> getMultiple(BandejaEntradas filterBandejaEntradas, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.IDTIPOENTRADA IDTIPOENTRADA, t1.IDENTRADA IDENTRADA, t1.ESTADO ESTADO, t1.IDJMS IDJMS, t1.PROCEDUREID PROCEDUREID, t1.FREGISTRO FREGISTRO, ");
		query.append(
				"t1.NUMREGISTRO NUMREGISTRO, t1.NUMEXPEDIENTE NUMEXPEDIENTE, t1.IDEXPEDIENTE IDEXPEDIENTE, t1.URGENCIA URGENCIA, t1.ERROREXPEDIENTE ERROREXPEDIENTE, ");
		query.append(
				"t1.IDSOLICITANTE IDSOLICITANTE, t1.IDENTIFICADOR IDENTIFICADOR, t1.NOMBRE NOMBRE, t1.APELLIDO1 APELLIDO1, t1.APELLIDO2 APELLIDO2, t1.TIPO TIPO, ");
		query.append(
				"t1.NUMREGORIGINAL NUMREGORIGINAL, t1.FREGORIGINAL FREGORIGINAL, t1.REMITENTE REMITENTE, t1.BLOQUEO BLOQUEO, t1.USURESPONSABLE USURESPONSABLE, ");
		query.append("t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES, t1.MOTIVOOCULTAR ");
		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1 ");
		// WHERE clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterBandejaEntradas, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		StringBuilder sbMultipleSQL = query.append(
				TableManager.getSelectMultipleQuery(tableRequestDto, BandejaEntradas.class, params, "idtipoentrada",
						"identrada", "estado", "idjms", "procedureid", "fregistro", "numregistro", "numexpediente",
						"idexpediente", "urgencia", "errorexpediente", "idsolicitante", "identificador", "nombre",
						"apellido1", "apellido2", "tipo", "numregoriginal", "fregoriginal", "remitente", "bloqueo",
						"usuresponsable", "numdocumentos", "qrcode", "observaciones", "motivoocultar"));

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

	/**
	 * Finds a list of rows in the BandejaEntradas table.
	 *
	 * @param bandejaentradas BandejaEntradas
	 * @param tableRequestDto TableRequestDto
	 *
	 * @return List<BandejaEntradas>
	 */
	@Transactional(readOnly = true)
	public List<BandejaEntradas> findAll(BandejaEntradas bandejaentradas, TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.IDTIPOENTRADA IDTIPOENTRADA,t1.IDENTRADA IDENTRADA,t1.ESTADO ESTADO,t1.IDJMS IDJMS,t1.PROCEDUREID PROCEDUREID,t1.FREGISTRO FREGISTRO,t1.NUMREGISTRO NUMREGISTRO,t1.NUMEXPEDIENTE NUMEXPEDIENTE,t1.IDEXPEDIENTE IDEXPEDIENTE,t1.URGENCIA URGENCIA,t1.ERROREXPEDIENTE ERROREXPEDIENTE,t1.IDSOLICITANTE IDSOLICITANTE,t1.IDENTIFICADOR IDENTIFICADOR,t1.NOMBRE NOMBRE,t1.APELLIDO1 APELLIDO1,t1.APELLIDO2 APELLIDO2,t1.TIPO TIPO,t1.NUMREGORIGINAL NUMREGORIGINAL,t1.FREGORIGINAL FREGORIGINAL,t1.REMITENTE REMITENTE,t1.BLOQUEO BLOQUEO,t1.USURESPONSABLE USURESPONSABLE,t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES OBSERVACIONES, t1.MOTIVOOCULTAR MOTIVOOCULTAR ");

		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1 ");

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

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

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

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

	/**
	 * Finds rows in the BandejaEntradas table using like.
	 *
	 * @param bandejaentradas BandejaEntradas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<BandejaEntradas>
	 */
	@Transactional(readOnly = true)
	public List<BandejaEntradas> findAllLike(BandejaEntradas bandejaentradas, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.IDTIPOENTRADA IDTIPOENTRADA,t1.IDENTRADA IDENTRADA,t1.ESTADO ESTADO,t1.IDJMS IDJMS,t1.PROCEDUREID PROCEDUREID,t1.FREGISTRO FREGISTRO,t1.NUMREGISTRO NUMREGISTRO,t1.NUMEXPEDIENTE NUMEXPEDIENTE,t1.IDEXPEDIENTE IDEXPEDIENTE,t1.URGENCIA URGENCIA,t1.ERROREXPEDIENTE ERROREXPEDIENTE,t1.IDSOLICITANTE IDSOLICITANTE,t1.IDENTIFICADOR IDENTIFICADOR,t1.NOMBRE NOMBRE,t1.APELLIDO1 APELLIDO1,t1.APELLIDO2 APELLIDO2,t1.TIPO TIPO,t1.NUMREGORIGINAL NUMREGORIGINAL,t1.FREGORIGINAL FREGORIGINAL,t1.REMITENTE REMITENTE,t1.BLOQUEO BLOQUEO,t1.USURESPONSABLE USURESPONSABLE,t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES OBSERVACIONES, t1.MOTIVOOCULTAR MOTIVOOCULTAR ");
		query.append(", t2.BENEFICIARIO_01 BENEFICIARIO01 ");
		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1  ");
		query.append(" LEFT JOIN SOLICITANTES t2 ON (t1.IDSOLICITANTE = t2.ID_SOLICITANTE_01)  ");

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

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

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

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

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

	/**
	 * Counts rows in the BandejaEntradas table using like.
	 *
	 * @param bandejaentradas BandejaEntradas
	 * @param startsWith      Boolean
	 *
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(BandejaEntradas bandejaentradas, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM BANDEJA_ENTRADAS t1 ");
		query.append(" LEFT JOIN SOLICITANTES t2 ON (t1.IDSOLICITANTE = t2.ID_SOLICITANTE_01)  ");

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

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

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

	/**
	 * Reorder the data list of BandejaEntradas selected for rup_table
	 *
	 * @param bandejaentradas BandejaEntradas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<BandejaEntradas>>
	 */
	@Override
	public List<TableRowDto<BandejaEntradas>> reorderSelection(BandejaEntradas bandejaentradas,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.IDTIPOENTRADA IDTIPOENTRADA,t1.IDENTRADA IDENTRADA,t1.ESTADO ESTADO,t1.IDJMS IDJMS,t1.PROCEDUREID PROCEDUREID,t1.FREGISTRO FREGISTRO,t1.NUMREGISTRO NUMREGISTRO,t1.NUMEXPEDIENTE NUMEXPEDIENTE,t1.IDEXPEDIENTE IDEXPEDIENTE,t1.URGENCIA URGENCIA,t1.ERROREXPEDIENTE ERROREXPEDIENTE,t1.IDSOLICITANTE IDSOLICITANTE,t1.IDENTIFICADOR IDENTIFICADOR,t1.NOMBRE NOMBRE,t1.APELLIDO1 APELLIDO1,t1.APELLIDO2 APELLIDO2,t1.TIPO TIPO,t1.NUMREGORIGINAL NUMREGORIGINAL,t1.FREGORIGINAL FREGORIGINAL,t1.REMITENTE REMITENTE,t1.BLOQUEO BLOQUEO,t1.USURESPONSABLE USURESPONSABLE,t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES OBSERVACIONES, t1.MOTIVOOCULTAR MOTIVOOCULTAR ");
		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1 ");
		// FILTRADO
		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(bandejaentradas, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto,
				BandejaEntradas.class, filterParamList, "identrada", "estado", "idjms", "procedureid", "fregistro",
				"numregistro", "numexpediente", "idexpediente", "urgencia", "errorexpediente", "idsolicitante",
				"identificador", "nombre", "apellido1", "apellido2", "tipo", "numregoriginal", "fregoriginal",
				"remitente", "bloqueo", "usuresponsable", "numdocumentos", "observaciones", "motivoocultar");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    BandejaEntradas
	 * @param searchParams    BandejaEntradas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<BandejaEntradas>>
	 */
	@Override
	public List<TableRowDto<BandejaEntradas>> search(BandejaEntradas filterParams, BandejaEntradas searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.IDTIPOENTRADA IDTIPOENTRADA,t1.IDENTRADA IDENTRADA,t1.ESTADO ESTADO,t1.IDJMS IDJMS,t1.PROCEDUREID PROCEDUREID,t1.FREGISTRO FREGISTRO,t1.NUMREGISTRO NUMREGISTRO,t1.NUMEXPEDIENTE NUMEXPEDIENTE,t1.IDEXPEDIENTE IDEXPEDIENTE,t1.URGENCIA URGENCIA,t1.ERROREXPEDIENTE ERROREXPEDIENTE,t1.IDSOLICITANTE IDSOLICITANTE,t1.IDENTIFICADOR IDENTIFICADOR,t1.NOMBRE NOMBRE,t1.APELLIDO1 APELLIDO1,t1.APELLIDO2 APELLIDO2,t1.TIPO TIPO,t1.NUMREGORIGINAL NUMREGORIGINAL,t1.FREGORIGINAL FREGORIGINAL,t1.REMITENTE REMITENTE,t1.BLOQUEO BLOQUEO,t1.USURESPONSABLE USURESPONSABLE,t1.NUMDOCUMENTOS NUMDOCUMENTOS, t1.QRCODE QRCODE, t1.OBSERVACIONES OBSERVACIONES, t1.MOTIVOOCULTAR MOTIVOOCULTAR ");
		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

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

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

		// SQL
		StringBuilder sbReorderSelectionSQL = TableManager.getSearchQuery(query, tableRequestDto, BandejaEntradas.class,
				filterParamList, searchSQL, searchParamList, from_alias,
				"IDTIPOENTRADA,IDENTRADA,ESTADO,IDJMS,PROCEDUREID,FREGISTRO,NUMREGISTRO,NUMEXPEDIENTE,IDEXPEDIENTE,URGENCIA,ERROREXPEDIENTE,IDSOLICITANTE,IDENTIFICADOR,NOMBRE,APELLIDO1,APELLIDO2,TIPO,NUMREGORIGINAL,FREGORIGINAL,REMITENTE,BLOQUEO,USURESPONSABLE,NUMDOCUMENTOS,QRCODE,OBSERVACIONES,MOTIVOOCULTAR");

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

	/*
	 * MÃ‰TODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * BandejaEntradas entity
	 *
	 * @param bandejaentradas BandejaEntradas Bean with the criteria values to
	 *                        filter by.
	 *
	 * @return Map created with two keys key query stores the sql query syntax key
	 *         params stores the parameter values to be used in the condition
	 *         sentence.
	 */
	private Map<String, ?> getWhereMap(BandejaEntradas bandejaentradas) {
		StringBuilder where = new StringBuilder(BandejaEntradasDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (bandejaentradas != null && bandejaentradas.getIdTipoentrada() != null) {
			where.append(" AND t1.IDTIPOENTRADA = ?");
			params.add(bandejaentradas.getIdTipoentrada());
		}
		if (bandejaentradas != null && bandejaentradas.getIdentrada() != null) {
			where.append(" AND t1.IDENTRADA = ?");
			params.add(bandejaentradas.getIdentrada());
		}
		if (bandejaentradas != null && bandejaentradas.getEstado() != null) {
			where.append(" AND t1.ESTADO = ?");
			params.add(bandejaentradas.getEstado());
		}
		if (bandejaentradas != null && bandejaentradas.getIdjms() != null) {
			where.append(" AND t1.IDJMS = ?");
			params.add(bandejaentradas.getIdjms());
		}
		if (bandejaentradas != null && bandejaentradas.getProcedureid() != null) {
			where.append(" AND t1.PROCEDUREID = ?");
			params.add(bandejaentradas.getProcedureid());
		}
		if (bandejaentradas != null && bandejaentradas.getFregistro() != null) {
			where.append(" AND t1.FREGISTRO = ?");
			params.add(bandejaentradas.getFregistro());
		}
		if (bandejaentradas != null && bandejaentradas.getNumregistro() != null) {
			where.append(" AND t1.NUMREGISTRO = ?");
			params.add(bandejaentradas.getNumregistro());
		}
		if (bandejaentradas != null && bandejaentradas.getNumexpediente() != null) {
			where.append(" AND t1.NUMEXPEDIENTE = ?");
			params.add(bandejaentradas.getNumexpediente());
		}
		if (bandejaentradas != null && bandejaentradas.getIdexpediente() != null) {
			where.append(" AND t1.IDEXPEDIENTE = ?");
			params.add(bandejaentradas.getIdexpediente());
		}
		if (bandejaentradas != null && bandejaentradas.getTipoUrgencia() != null) {
			where.append(" AND t1.URGENCIA = ?");
			params.add(bandejaentradas.getTipoUrgencia());
		}
		if (bandejaentradas != null && bandejaentradas.getErrorexpediente() != null) {
			where.append(" AND t1.ERROREXPEDIENTE = ?");
			params.add(bandejaentradas.getErrorexpediente());
		}
		if (bandejaentradas != null && bandejaentradas.getIdsolicitante() != null) {
			where.append(" AND t1.IDSOLICITANTE = ?");
			params.add(bandejaentradas.getIdsolicitante());
		}
		if (bandejaentradas != null && bandejaentradas.getIdentificador() != null) {
			where.append(" AND UPPER(t1.IDENTIFICADOR) = UPPER(?)");
			params.add(bandejaentradas.getIdentificador());
		}
		if (bandejaentradas != null && bandejaentradas.getNombre() != null) {
			where.append(" AND t1.NOMBRE = ?");
			params.add(bandejaentradas.getNombre());
		}
		if (bandejaentradas != null && bandejaentradas.getApellido1() != null) {
			where.append(" AND t1.APELLIDO1 = ?");
			params.add(bandejaentradas.getApellido1());
		}
		if (bandejaentradas != null && bandejaentradas.getApellido2() != null) {
			where.append(" AND t1.APELLIDO2 = ?");
			params.add(bandejaentradas.getApellido2());
		}
		if (bandejaentradas != null && bandejaentradas.getTipo() != null) {
			where.append(" AND t1.TIPO = ?");
			params.add(bandejaentradas.getTipo());
		}
		if (bandejaentradas != null && bandejaentradas.getNumregoriginal() != null) {
			where.append(" AND t1.NUMREGORIGINAL = ?");
			params.add(bandejaentradas.getNumregoriginal());
		}
		if (bandejaentradas != null && bandejaentradas.getFregoriginal() != null) {
			where.append(" AND t1.FREGORIGINAL = ?");
			params.add(bandejaentradas.getFregoriginal());
		}
		if (bandejaentradas != null && bandejaentradas.getRemitente() != null) {
			where.append(" AND t1.REMITENTE = ?");
			params.add(bandejaentradas.getRemitente());
		}
		if (bandejaentradas != null && bandejaentradas.getBloqueo() != null) {
			where.append(" AND t1.BLOQUEO = ?");
			params.add(bandejaentradas.getBloqueo());
		}
		if (bandejaentradas != null && bandejaentradas.getUsuresponsable() != null) {
			where.append(" AND t1.USURESPONSABLE = ?");
			params.add(bandejaentradas.getUsuresponsable());
		}
		if (bandejaentradas != null && bandejaentradas.getNumdocumentos() != null) {
			where.append(" AND t1.NUMDOCUMENTOS = ?");
			params.add(bandejaentradas.getNumdocumentos());
		}
		if (bandejaentradas != null && bandejaentradas.getQrcode() != null) {
			where.append(" AND t1.QRCODE = ?");
			params.add(bandejaentradas.getQrcode());
		}
		if (bandejaentradas != null && bandejaentradas.getObservaciones() != null) {
			where.append(" AND t1.OBSERVACIONES = ?");
			params.add(bandejaentradas.getObservaciones());
		}
		if (bandejaentradas != null && bandejaentradas.getMotivoOcultar() != null) {
			where.append(" AND t1.MOTIVOOCULTAR = ?");
			params.add(bandejaentradas.getMotivoOcultar());
		}

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

		return mapWhere;
	}

	/**
	 * Returns a map with the needed value to create the conditions to filter by the
	 * BandejaEntradas entity
	 *
	 * @param bandejaentradas BandejaEntradas Bean with the criteria values to
	 *                        filter by.
	 * @param startsWith      Boolean
	 *
	 * @return Map created with two keys key query stores the sql query syntax key
	 *         params stores the parameter values to be used in the condition
	 *         sentence.
	 */
	private Map<String, Object> getWhereLikeMap(BandejaEntradas bandejaentradas, Boolean startsWith) {
		StringBuilder where = new StringBuilder(BandejaEntradasDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (bandejaentradas != null && bandejaentradas.getIdTipoentrada() != null) {
			where.append(" AND t1.IDTIPOENTRADA = ?");
			params.add(bandejaentradas.getIdTipoentrada());
		}
		if (bandejaentradas != null && bandejaentradas.getIdentrada() != null) {
			where.append(" AND t1.IDENTRADA = ?");
			params.add(bandejaentradas.getIdentrada());
		}
//		if (bandejaentradas != null && bandejaentradas.getEstado() != null) {
//			where.append(" AND UPPER(t1.ESTADO) like ? ESCAPE  '\\'");
//			if (startsWith) {
//				params.add(bandejaentradas.getEstado().toUpperCase() + "%");
//			} else {
//				params.add("%" + bandejaentradas.getEstado().toUpperCase() + "%");
//			}
//			where.append(" AND t1.ESTADO IS NOT NULL");
//		}

		if ((bandejaentradas != null && bandejaentradas.getEstado() != null && bandejaentradas.getOcultos() == null)
				|| (bandejaentradas != null && bandejaentradas.getOcultos() != null
						&& bandejaentradas.getOcultos() == 0)) {
			// Mostrar los que tienen el estado/s seleccionado/s
			where.append(" AND (");
			String or = "";
			for (String estado : bandejaentradas.getEstado().split(",")) {
				where.append(or).append(" UPPER(t1.ESTADO) like ? ESCAPE  '\\'");
				params.add("%" + estado + "%");
				or = " OR ";
			}

			if (bandejaentradas.getOcultos() == null) {
				where.append(or).append(" UPPER(t1.ESTADO) like ? ESCAPE  '\\'");
				params.add("%" + Constantes.EstadosBandejaPapel0.OCULTO + "%");
				where.append(or).append(" UPPER(t1.ESTADO) like ? ESCAPE  '\\'");
				params.add("%" + Constantes.EstadosBandejaPapel0.EN_CURSO_OCULTO + "%");
			}
			where.append(" ) ");

		} else if (bandejaentradas != null && bandejaentradas.getOcultos() != null
				&& bandejaentradas.getOcultos() == 1) {
			// Mostrar solo estado 'O' y 'X' (EN_CURSO_OCULTO)
			where.append(" AND (UPPER(t1.ESTADO) like ? ESCAPE  '\\'");
			params.add("%" + Constantes.EstadosBandejaPapel0.OCULTO + "%");
			where.append(" OR UPPER(t1.ESTADO) like ? ESCAPE  '\\')");
			params.add("%" + Constantes.EstadosBandejaPapel0.EN_CURSO_OCULTO + "%");
		} else if (bandejaentradas != null && bandejaentradas.getOcultos() != null
				&& bandejaentradas.getOcultos() == 0) {
			// Mostrar sin 'O' ni 'X'
			where.append(" AND UPPER(t1.ESTADO) not like ? ESCAPE  '\\'");
			params.add("%" + Constantes.EstadosBandejaPapel0.OCULTO + "%");
			where.append(" AND UPPER(t1.ESTADO) not like ? ESCAPE  '\\'");
			params.add("%" + Constantes.EstadosBandejaPapel0.EN_CURSO_OCULTO + "%");
		}

		if (bandejaentradas != null && bandejaentradas.getIdjms() != null) {
			where.append(" AND UPPER(t1.IDJMS) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getIdjms().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getIdjms().toUpperCase() + "%");
			}
			where.append(" AND t1.IDJMS IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getProcedureid() != null) {
			where.append(" AND UPPER(t1.PROCEDUREID) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getProcedureid().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getProcedureid().toUpperCase() + "%");
			}
			where.append(" AND t1.PROCEDUREID IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getFregistro() != null) {
			where.append(" AND t1.FREGISTRO = ?");
			params.add(bandejaentradas.getFregistro());
		}

		if (bandejaentradas != null && bandejaentradas.getFregistro_from() != null
				&& bandejaentradas.getFregistro_to() != null) {
			where.append(" AND (TRUNC(t1.FREGISTRO) BETWEEN ").append(" ? ").append(" AND ").append(" ? )");
			params.add(bandejaentradas.getFregistro_from());
			params.add(bandejaentradas.getFregistro_to());
		}
		if (bandejaentradas != null && bandejaentradas.getFregistro_from() != null
				&& bandejaentradas.getFregistro_to() == null) {
			where.append(" AND (t1.FREGISTRO >= ").append(" ? )");
			params.add(bandejaentradas.getFregistro_from());
		}
		if (bandejaentradas != null && bandejaentradas.getFregistro_from() == null
				&& bandejaentradas.getFregistro_to() != null) {

			where.append(" AND (t1.FREGISTRO-1 <= ").append(" ? )");
			params.add(bandejaentradas.getFregistro_to());
		}

		if (bandejaentradas != null && bandejaentradas.getNumregistro() != null) {
			where.append(" AND UPPER(t1.NUMREGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getNumregistro().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getNumregistro().toUpperCase() + "%");
			}
			where.append(" AND t1.NUMREGISTRO IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getNumexpediente() != null) {
			where.append(" AND UPPER(t1.NUMEXPEDIENTE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getNumexpediente().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getNumexpediente().toUpperCase() + "%");
			}
			where.append(" AND t1.NUMEXPEDIENTE IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getIdexpediente() != null) {
			where.append(" AND t1.IDEXPEDIENTE = ?");
			params.add(bandejaentradas.getIdexpediente());
		}

		// SI LA URGENCIA ES 'NO'
		if (bandejaentradas != null && bandejaentradas.getUrgencia() != null && bandejaentradas.getUrgencia() == 0) {
			where.append(" AND t1.URGENCIA = 0");
		}
		// SI LA URGENCIA ES 'SI'
		if (bandejaentradas != null && bandejaentradas.getUrgencia() != null && bandejaentradas.getUrgencia() == 1) {
			where.append(" AND t1.URGENCIA != 0");
			if (bandejaentradas != null && bandejaentradas.getTipoUrgencia() != null) {
				where.append(" AND t1.URGENCIA = ?");
				params.add(bandejaentradas.getTipoUrgencia());
			}
		}

//		if (bandejaentradas != null && bandejaentradas.getErrorexpediente() != null) {
//			where.append(" AND t1.ERROREXPEDIENTE = ?");
//			params.add(bandejaentradas.getErrorexpediente());
//		}
		if (bandejaentradas != null && bandejaentradas.getErrorexpediente() != null) {
			// Todos os errores
			if (bandejaentradas.getErrorexpediente().compareTo(0L) == 0) {
				where.append(" AND t1.ERROREXPEDIENTE > 0");
			} else {
				where.append(" AND t1.ERROREXPEDIENTE = ?");
				params.add(bandejaentradas.getErrorexpediente());
			}
		}
		if (bandejaentradas != null && bandejaentradas.getIdsolicitante() != null) {
			where.append(" AND t1.IDSOLICITANTE = ?");
			params.add(bandejaentradas.getIdsolicitante());
		}

		if (bandejaentradas != null && bandejaentradas.getTipo() != null) {
			where.append(" AND UPPER(t1.TIPO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getTipo().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getTipo().toUpperCase() + "%");
			}
			where.append(" AND t1.TIPO IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getNumregoriginal() != null) {
			where.append(" AND UPPER(t1.NUMREGORIGINAL) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getNumregoriginal().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getNumregoriginal().toUpperCase() + "%");
			}
			where.append(" AND t1.NUMREGORIGINAL IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getFregoriginal() != null) {
			where.append(" AND t1.FREGORIGINAL = ?");
			params.add(bandejaentradas.getFregoriginal());
		}

		if (bandejaentradas != null && bandejaentradas.getFregoriginal_from() != null
				&& bandejaentradas.getFregoriginal_to() != null) {
			where.append(" AND (TRUNC(t1.FREGORIGINAL) BETWEEN ").append(" ? ").append(" AND ").append(" ? )");
			params.add(bandejaentradas.getFregoriginal_from());
			params.add(bandejaentradas.getFregoriginal_to());
		}
		if (bandejaentradas != null && bandejaentradas.getFregoriginal_from() != null
				&& bandejaentradas.getFregoriginal_to() == null) {
			where.append(" AND (t1.FREGORIGINAL >= ").append(" ? )");
			params.add(bandejaentradas.getFregoriginal_from());
		}
		if (bandejaentradas != null && bandejaentradas.getFregoriginal_from() == null
				&& bandejaentradas.getFregoriginal_to() != null) {
			where.append(" AND (t1.FREGORIGINAL <= ").append(" ? )");
			params.add(bandejaentradas.getFregoriginal_to());
		}

		if (bandejaentradas != null && bandejaentradas.getRemitente() != null) {
			where.append(" AND UPPER(t1.REMITENTE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getRemitente().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getRemitente().toUpperCase() + "%");
			}
			where.append(" AND t1.REMITENTE IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getBloqueo() != null) {
			where.append(" AND t1.BLOQUEO = ?");
			params.add(bandejaentradas.getBloqueo());
		}
		if (bandejaentradas != null && bandejaentradas.getUsuresponsable() != null) {
			where.append(" AND UPPER(t1.USURESPONSABLE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getUsuresponsable().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getUsuresponsable().toUpperCase() + "%");
			}
			where.append(" AND t1.USURESPONSABLE IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getNumdocumentos() != null) {
			where.append(" AND t1.NUMDOCUMENTOS = ?");
			params.add(bandejaentradas.getNumdocumentos());
		}
		if (bandejaentradas != null && bandejaentradas.getQrcode() != null) {
			where.append(" AND UPPER(t1.QRCODE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getQrcode().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getQrcode().toUpperCase() + "%");
			}
			where.append(" AND t1.QRCODE IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getObservaciones() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getObservaciones().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getObservaciones().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getMotivoOcultar() != null) {
			where.append(" AND UPPER(t1.MOTIVOOCULTAR) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejaentradas.getMotivoOcultar().toUpperCase() + "%");
			} else {
				params.add("%" + bandejaentradas.getMotivoOcultar().toUpperCase() + "%");
			}
			where.append(" AND t1.MOTIVOOCULTAR IS NOT NULL");
		}
		if (bandejaentradas != null && bandejaentradas.getSolicitantes() != null) {
			Solicitantes solici = bandejaentradas.getSolicitantes();
			if (solici.getIdentificador01() != null) {
				where.append(
						" AND (UPPER(t2.IDENTIFICADOR_01) like ? ESCAPE  '\\' OR UPPER(t1.REMITENTE) like ? ESCAPE '\\' )");
				if (startsWith) {
					params.add(solici.getIdentificador01().toUpperCase() + "%");
					params.add(solici.getIdentificador01().toUpperCase() + "%");
				} else {
					params.add("%" + solici.getIdentificador01().toUpperCase() + "%");
					params.add("%" + solici.getIdentificador01().toUpperCase() + "%");
				}
			}
			if (solici.getNombre01() != null) {
				where.append(
						" AND (UPPER(t2.NOMBRE_01) like ? ESCAPE  '\\' OR UPPER(t1.REMITENTE) like ? ESCAPE '\\' )");
				if (startsWith) {
					params.add(solici.getNombre01().toUpperCase() + "%");
					params.add(solici.getNombre01().toUpperCase() + "%");
				} else {
					params.add("%" + solici.getNombre01().toUpperCase() + "%");
					params.add("%" + solici.getNombre01().toUpperCase() + "%");
				}
			}
			if (solici.getApellido101() != null) {
				where.append(
						" AND (UPPER(t2.APELLIDO1_01) like ? ESCAPE  '\\' OR UPPER(t1.REMITENTE) like ? ESCAPE '\\' )");
				if (startsWith) {
					params.add(solici.getApellido101().toUpperCase() + "%");
					params.add(solici.getApellido101().toUpperCase() + "%");
				} else {
					params.add("%" + solici.getApellido101().toUpperCase() + "%");
					params.add("%" + solici.getApellido101().toUpperCase() + "%");
				}
			}
			if (solici.getApellido201() != null) {
				where.append(
						" AND (UPPER(t2.APELLIDO2_01) like ? ESCAPE  '\\' OR UPPER(t1.REMITENTE) like ? ESCAPE '\\' )");
				if (startsWith) {
					params.add(solici.getApellido201().toUpperCase() + "%");
					params.add(solici.getApellido201().toUpperCase() + "%");
				} else {
					params.add("%" + solici.getApellido201().toUpperCase() + "%");
					params.add("%" + solici.getApellido201().toUpperCase() + "%");
				}
			}
		}
		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

	@Override
	public List<BandejaEntradas> getEntradasExpediente(Long codExpediente, String estado) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.IDTIPOENTRADA IDTIPOENTRADA, t1.IDENTRADA IDENTRADA, t1.ESTADO ESTADO, t1.IDJMS IDJMS, t1.PROCEDUREID PROCEDUREID, t1.FREGISTRO FREGISTRO, "
						+ "t1.NUMREGISTRO NUMREGISTRO, t1.NUMEXPEDIENTE NUMEXPEDIENTE, t1.IDEXPEDIENTE IDEXPEDIENTE, t1.URGENCIA URGENCIA, t1.ERROREXPEDIENTE ERROREXPEDIENTE, "
						+ "t1.IDSOLICITANTE IDSOLICITANTE, t1.IDENTIFICADOR IDENTIFICADOR, t1.NOMBRE NOMBRE, t1.APELLIDO1 APELLIDO1, t1.APELLIDO2 APELLIDO2, t1.TIPO TIPO, "
						+ "t1.NUMREGORIGINAL NUMREGORIGINAL, t1.FREGORIGINAL FREGORIGINAL, t1.REMITENTE REMITENTE, t1.BLOQUEO BLOQUEO, t1.USURESPONSABLE USURESPONSABLE, "
						+ "t1.NUMDOCUMENTOS NUMDOCUMENTOS , t1.QRCODE QRCODE, t1.OBSERVACIONES, t1.MOTIVOOCULTAR ");
		// FROM
		query.append("FROM BANDEJA_ENTRADAS t1");

		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.IDEXPEDIENTE = ? AND t1.ESTADO = ? ");
		query.append(where);

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