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.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.model.BandejaTelematica;
import com.ejie.ad74a.model.Estados;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.ad74a.util.constantes.ErroresExpedienteEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableManagerJerarquia;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * BandejaTelematicaDaoImpl generated by UDA, 28-mar-2023 10:21:53.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class BandejaTelematicaDaoImpl implements BandejaTelematicaDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDENTRADA14", "ESTADO14", "FOLDERID14",
			"PROCEDUREID14", "FPROCESO14", "FREGISTRO14", "IDJMS14", "INSTANCEID14", "NUMREGISTRO14", "SENDERID14",
			"SENDERNAME14", "SUBMISIONTYPE14", "URGENCIA14", "FALTA14", "USUALTA14", "FMODIF14", "USUMODIF14",
			"IDSOLICITANTE01", "NUMEXPEDIENTE00" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_BANDEJA_TELEMATICA = "SEQ_BANDEJA_TELEMATICA";

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

			BandejaTelematica bandejaTelematica = new BandejaTelematica(UtilSQL.getLong(resultSet, "IDENTRADA14"),
					resultSet.getString("ESTADO14"), resultSet.getString("FOLDERID14"),
					resultSet.getString("PROCEDUREID14"), resultSet.getDate("FPROCESO14"),
					resultSet.getTimestamp("FREGISTRO14"), resultSet.getString("IDJMS14"),
					UtilSQL.getLong(resultSet, "INSTANCEID14"), resultSet.getString("NUMREGISTRO14"),
					resultSet.getString("SENDERID14"), resultSet.getString("SENDERNAME14"),
					resultSet.getString("SUBMISIONTYPE14"), resultSet.getString("SUBMISIONTYPEPROCESADO14"),
					UtilSQL.getInt(resultSet, "URGENCIA14"), resultSet.getDate("FALTA14"),
					resultSet.getString("USUALTA14"), resultSet.getDate("FMODIF14"), resultSet.getString("USUMODIF14"));

//			Long instanceID = null;
//			if (null != bandejaTelematica.getInstanceid14()) {
//				instanceID = bandejaTelematica.getInstanceid14();
//			}

			if (bandejaTelematica.getSubmisiontype14() != null) {
				bandejaTelematica.setSubmisiontype14_desc(
						TipoAportacionEnum.getDesc(bandejaTelematica.getSubmisiontype14(), null));
			}

			return bandejaTelematica;
		}
	};

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

			BandejaTelematica bandejaTelematica = new BandejaTelematica(UtilSQL.getLong(resultSet, "IDENTRADA14"),
					resultSet.getString("ESTADO14"), resultSet.getString("FOLDERID14"),
					resultSet.getString("PROCEDUREID14"), resultSet.getDate("FPROCESO14"),
					resultSet.getDate("FREGISTRO14"), resultSet.getString("IDJMS14"),
					UtilSQL.getLong(resultSet, "INSTANCEID14"), resultSet.getString("NUMREGISTRO14"),
					resultSet.getString("SENDERID14"), resultSet.getString("SENDERNAME14"),
					resultSet.getString("SUBMISIONTYPE14"), resultSet.getString("SUBMISIONTYPEPROCESADO14"),
					UtilSQL.getInt(resultSet, "URGENCIA14"), resultSet.getDate("FALTA14"),
					resultSet.getString("USUALTA14"), resultSet.getDate("FMODIF14"), resultSet.getString("USUMODIF14"));

//			Long instanceID = null;
//			if (null != bandejaTelematica.getInstanceid14()) {
//				instanceID = bandejaTelematica.getInstanceid14();
//			}

			if (bandejaTelematica.getSubmisiontype14() != null) {
				bandejaTelematica.setSubmisiontype14_desc(
						TipoAportacionEnum.getDesc(bandejaTelematica.getSubmisiontype14(), null));
			}

			if (bandejaTelematica.getSubmisiontypeProcesado14() != null) {
				bandejaTelematica.setSubmisiontypeProcesado14_desc(
						TipoAportacionEnum.getDesc(bandejaTelematica.getSubmisiontypeProcesado14(), null));
			}

			if (bandejaTelematica.getProcedureid14() != null) {
				bandejaTelematica
						.setProcedureid14_desc(ProcedimientosEnum.getDesc(bandejaTelematica.getProcedureid14()));
			}

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

			// Si existe error en el expdiente, obtener su descripción
			if (expediente.getErrorExpediente00() != null) {
				expediente.setErrorExpediente00_desc(ErroresExpedienteEnum.getDesc(expediente.getErrorExpediente00()));
			}

			Estados estado = new Estados();
			estado.setIdEstado30(UtilSQL.getLong(resultSet, "IDESTADO30"));
			estado.setDescripcionEs30(resultSet.getString("DESCRIPCIONES30"));
			estado.setDescripcionEu30(resultSet.getString("DESCRIPCIONEU30"));
			expediente.setEstados(estado);

			bandejaTelematica.setExpediente(expediente);

			// Datos del solicitante
			Solicitantes solicitante = new Solicitantes();
			solicitante.setIdSolicitante01(UtilSQL.getLong(resultSet, "IDSOLICITANTE01"));
			solicitante.setIdentificador01(resultSet.getString("IDENTIFICADOR01"));
			solicitante.setApellido101(resultSet.getString("APELLIDO101"));
			solicitante.setApellido201(resultSet.getString("APELLIDO201"));
			solicitante.setNombre01(resultSet.getString("NOMBRE01"));
			solicitante.setBeneficiario01(UtilSQL.getInt(resultSet, "BENEFICIARIO01"));

			bandejaTelematica.setSolicitante(solicitante);

			return bandejaTelematica;
		}
	};

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

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

			BandejaTelematica bandejatelematica = new BandejaTelematica(UtilSQL.getLong(resultSet, "IDENTRADA14"),
					resultSet.getString("ESTADO14"), resultSet.getString("FOLDERID14"),
					resultSet.getString("PROCEDUREID14"), resultSet.getDate("FPROCESO14"),
					resultSet.getDate("FREGISTRO14"), resultSet.getString("IDJMS14"),
					UtilSQL.getLong(resultSet, "INSTANCEID14"), resultSet.getString("NUMREGISTRO14"),
					resultSet.getString("SENDERID14"), resultSet.getString("SENDERNAME14"),
					resultSet.getString("SUBMISIONTYPE14"), resultSet.getString("SUBMISIONTYPEPROCESADO14"),
					UtilSQL.getInt(resultSet, "URGENCIA14"), resultSet.getDate("FALTA14"),
					resultSet.getString("USUALTA14"), resultSet.getDate("FMODIF14"), resultSet.getString("USUMODIF14"));

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

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

	/*
	 * OPERACIONES CRUD
	 */

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

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO BANDEJA_TELEMATICA (ID_ENTRADA_14, ESTADO_14, FOLDERID_14, PROCEDUREID_14, F_PROCESO_14, F_REGISTRO_14, IDJMS_14, INSTANCEID_14, NUM_REGISTRO_14, SENDER_ID_14, SENDER_NAME_14, SUBMISIONTYPE_14, URGENCIA_14, F_ALTA_14, USU_ALTA_14, F_MODIF_14, USU_MODIF_14) "
				+ "VALUES (" + SEQUENCE_BANDEJA_TELEMATICA
				+ ".NEXTVAL,:estado,:folderId,:procedureId,:fProceso,:fRegistro,:idjms,:instanceId,:numRegistro,:senderId,:senderName,:submisionType,:urgencia,sysdate,:usuAlta,:fModif,:usuModif)";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("estado", bandejatelematica.getEstado14())
				.addValue("folderId", bandejatelematica.getFolderid14())
				.addValue("procedureId", bandejatelematica.getProcedureid14())
				.addValue("fProceso", bandejatelematica.getfProceso14())
				.addValue("fRegistro", bandejatelematica.getfRegistro14())
				.addValue("idjms", bandejatelematica.getIdjms14())
				.addValue("instanceId", bandejatelematica.getInstanceid14())
				.addValue("numRegistro", bandejatelematica.getNumRegistro14())
				.addValue("senderId", bandejatelematica.getSenderId14())
				.addValue("senderName", bandejatelematica.getSenderName14())
				.addValue("submisionType", bandejatelematica.getSubmisiontype14())
				.addValue("urgencia", bandejatelematica.getUrgencia14())
				.addValue("usuAlta", bandejatelematica.getUsuAlta14())
				.addValue("fModif", bandejatelematica.getfModif14())
				.addValue("usuModif", bandejatelematica.getUsuModif14());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_ENTRADA_14" });
		bandejatelematica.setIdEntrada14(generatedKeyHolder.getKey().longValue());

		return bandejatelematica;
	}

	/**
	 * Updates a single row in the BandejaTelematica table.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @return BandejaTelematica
	 */
	public BandejaTelematica update(BandejaTelematica bandejatelematica) {
		String query = "UPDATE BANDEJA_TELEMATICA SET ESTADO_14=?, FOLDERID_14=?, PROCEDUREID_14=?, F_PROCESO_14=?, F_REGISTRO_14=?, IDJMS_14=?, INSTANCEID_14=?, NUM_REGISTRO_14=?, SENDER_ID_14=?, SENDER_NAME_14=?, SUBMISIONTYPE_14=?, URGENCIA_14 = ?, F_ALTA_14=?, USU_ALTA_14=?, F_MODIF_14=?, USU_MODIF_14=? WHERE ID_ENTRADA_14=?";
		this.jdbcTemplate.update(query, bandejatelematica.getEstado14(), bandejatelematica.getFolderid14(),
				bandejatelematica.getProcedureid14(), bandejatelematica.getfProceso14(),
				bandejatelematica.getfRegistro14(), bandejatelematica.getIdjms14(), bandejatelematica.getInstanceid14(),
				bandejatelematica.getNumRegistro14(), bandejatelematica.getSenderId14(),
				bandejatelematica.getSenderName14(), bandejatelematica.getSubmisiontype14(),
				bandejatelematica.getUrgencia14(), bandejatelematica.getfAlta14(), bandejatelematica.getUsuAlta14(),
				bandejatelematica.getfModif14(), bandejatelematica.getUsuModif14(), bandejatelematica.getIdEntrada14());
		return bandejatelematica;
	}

	public BandejaTelematica updateProcesado(BandejaTelematica bandejaTelematica) {
		String query = "UPDATE BANDEJA_TELEMATICA SET ESTADO_14=?, F_PROCESO_14=?, F_MODIF_14=sysdate, USU_MODIF_14=? WHERE ID_ENTRADA_14=?";
		this.jdbcTemplate.update(query, bandejaTelematica.getEstado14(), bandejaTelematica.getfProceso14(),
				bandejaTelematica.getUsuModif14(), bandejaTelematica.getIdEntrada14());
		return bandejaTelematica;
	}

	/**
	 * Finds a single row in the BandejaTelematica table.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @return BandejaTelematica
	 */
	@Transactional(readOnly = true)
	public BandejaTelematica find(BandejaTelematica bandejatelematica) {
		String query = "SELECT t1.ID_ENTRADA_14 IDENTRADA14, t1.ESTADO_14 ESTADO14, t1.FOLDERID_14 FOLDERID14, t1.PROCEDUREID_14 PROCEDUREID14, t1.F_PROCESO_14 FPROCESO14, t1.F_REGISTRO_14 FREGISTRO14, t1.IDJMS_14 IDJMS14, t1.INSTANCEID_14 INSTANCEID14, t1.NUM_REGISTRO_14 NUMREGISTRO14, t1.SENDER_ID_14 SENDERID14, t1.SENDER_NAME_14 SENDERNAME14, t1.SUBMISIONTYPE_14 SUBMISIONTYPE14, t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14, t1.USU_ALTA_14 USUALTA14, t1.F_MODIF_14 FMODIF14, t1.USU_MODIF_14 USUMODIF14 FROM BANDEJA_TELEMATICA t1  WHERE t1.ID_ENTRADA_14 = ?  ";

		List<BandejaTelematica> bandejatelematicaList = this.jdbcTemplate.query(query, this.rwMap,
				bandejatelematica.getIdEntrada14());
		return (BandejaTelematica) DataAccessUtils.uniqueResult(bandejatelematicaList);
	}

	/**
	 * Removes a single row in the BandejaTelematica table.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @return
	 */
	public void remove(BandejaTelematica bandejatelematica) {
		String query = "DELETE FROM BANDEJA_TELEMATICA WHERE ID_ENTRADA_14=?";
		this.jdbcTemplate.update(query, bandejatelematica.getIdEntrada14());
	}

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

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ENTRADA_14 IDENTRADA14, t1.ESTADO_14 ESTADO14, t1.FOLDERID_14 FOLDERID14, t1.PROCEDUREID_14 PROCEDUREID14, t1.F_PROCESO_14 FPROCESO14, t1.F_REGISTRO_14 FREGISTRO14, t1.IDJMS_14 IDJMS14, t1.INSTANCEID_14 INSTANCEID14, t1.NUM_REGISTRO_14 NUMREGISTRO14, t1.SENDER_ID_14 SENDERID14, t1.SENDER_NAME_14 SENDERNAME14, t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14, t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14, t1.USU_ALTA_14 USUALTA14, t1.F_MODIF_14 FMODIF14, t1.USU_MODIF_14 USUMODIF14");
		query.append(" FROM BANDEJA_TELEMATICA t1  ");
		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterBandejaTelematica, startsWith);
		StringBuilder where = new StringBuilder(query + " WHERE 1=1 ");
		where.append(mapaWhere.get("query"));

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

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

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

	/**
	 * Finds a list of rows in the BandejaTelematica table.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @param tableRequestDto   TableRequestDto
	 * @return List<BandejaTelematica>
	 */
	@Transactional(readOnly = true)
	public List<BandejaTelematica> findAll(BandejaTelematica bandejatelematica, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14 ");
		query.append("FROM BANDEJA_TELEMATICA t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(bandejatelematica);
		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,
					BandejaTelematicaDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Finds rows in the BandejaTelematica table using like.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @param tableRequestDto   TableRequestDto
	 * @param startsWith        Boolean
	 * @return List<BandejaTelematica>
	 */
	@Transactional(readOnly = true)
	public List<BandejaTelematica> findAllLike(BandejaTelematica bandejatelematica, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14 ");
		query.append("FROM BANDEJA_TELEMATICA t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(bandejatelematica, 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,
					BandejaTelematicaDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	/**
	 * Búsqueda en bandeja telemática join con expedientes y solicitantes
	 * 
	 * @param filterBandejaTelematica
	 * @param tableRequestDto
	 * @return
	 */
	@Override
	@Transactional(readOnly = true)
	public List<BandejaTelematica> filterComplete(BandejaTelematica filterBandejaTelematica,
			TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14, t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14, ");

		query.append(
				" t2.ID_EXPEDIENTE_00 IDEXPEDIENTE00, t2.NUM_EXPEDIENTE_00 NUMEXPEDIENTE00, t2.URGENCIA_00 URGENCIA00, t2.ERROR_EXPEDIENTE_00 ERROREXPEDIENTE00, ");
		query.append(
				" t3.ID_SOLICITANTE_01 IDSOLICITANTE01,t3.IDENTIFICADOR_01 IDENTIFICADOR01, t3.APELLIDO1_01 APELLIDO101, t3.APELLIDO2_01 APELLIDO201, t3.NOMBRE_01 NOMBRE01, t3.BENEFICIARIO_01 BENEFICIARIO01, ");
		query.append(
				" t4.ID_ESTADO_30 IDESTADO30, t4.DESCRIPCION_ES_30 DESCRIPCIONES30, t4.DESCRIPCION_EU_30 DESCRIPCIONEU30 ");

		query.append("FROM BANDEJA_TELEMATICA t1 ");
		query.append(" INNER JOIN EXPEDIENTES t2 ON (t1.FOLDERID_14 = t2.FOLDER_ID_00) ");
		// query.append(" INNER JOIN SOLICITANTES t3 ON (t2.ID_SOLICITANTE_00 =
		// t3.ID_SOLICITANTE_01) ");
		query.append(" LEFT JOIN SOLICITANTES t3 ON (t2.ID_SOLICITANTE_00 = t3.ID_SOLICITANTE_01) ");
		query.append(" INNER JOIN ESTADOS t4 ON (t2.id_estado_00 = t4.id_estado_30) ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeCompleteMap(filterBandejaTelematica);
		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,
					BandejaTelematicaDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

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

		StringBuilder query = new StringBuilder("SELECT  COUNT(1) ");

		query.append("FROM BANDEJA_TELEMATICA t1 ");
		query.append(" INNER JOIN EXPEDIENTES t2 ON (t1.FOLDERID_14 = t2.FOLDER_ID_00) ");
		query.append(" INNER JOIN SOLICITANTES t3 ON (t2.ID_SOLICITANTE_00 = t3.ID_SOLICITANTE_01) ");
		query.append(" INNER JOIN ESTADOS t4 ON (t2.id_estado_00 = t4.id_estado_30) ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeCompleteMap(bandejatelematica);
		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);
	}

	private Map<String, ?> getWhereLikeCompleteMap(BandejaTelematica bandejatelematica) {
		StringBuilder where = new StringBuilder(BandejaTelematicaDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (bandejatelematica != null && bandejatelematica.getIdEntrada14() != null) {
			where.append(" AND t1.ID_ENTRADA_14 = ?");
			params.add(bandejatelematica.getIdEntrada14());
		}
		if (bandejatelematica != null && bandejatelematica.getEstado14() != null) {
			where.append(" AND UPPER(t1.ESTADO_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getEstado14().toUpperCase() + "%");
			where.append(" AND t1.ESTADO_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getFolderid14() != null) {
			where.append(" AND UPPER(t1.FOLDERID_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getFolderid14().toUpperCase() + "%");
			where.append(" AND t1.FOLDERID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getProcedureid14() != null) {
			where.append(" AND UPPER(t1.PROCEDUREID_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getProcedureid14().toUpperCase() + "%");
			where.append(" AND t1.PROCEDUREID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getfProceso14() != null) {
			where.append(" AND t1.F_PROCESO_14 = ?");
			params.add(bandejatelematica.getfProceso14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14() != null) {
			where.append(" AND t1.F_REGISTRO_14 = ?");
			params.add(bandejatelematica.getfRegistro14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_14 BETWEEN ").append(" ? ").append(" AND ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() == null) {
			where.append(" AND (t1.F_REGISTRO_14 >= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() == null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_14 <= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getIdjms14() != null) {
			where.append(" AND UPPER(t1.IDJMS_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getIdjms14().toUpperCase() + "%");
			where.append(" AND t1.IDJMS_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getInstanceid14() != null) {
			where.append(" AND t1.INSTANCEID_14 = ?");
			params.add(bandejatelematica.getInstanceid14());
		}
		if (bandejatelematica != null && bandejatelematica.getNumRegistro14() != null) {
			where.append(" AND UPPER(t1.NUM_REGISTRO_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getNumRegistro14().toUpperCase() + "%");
			where.append(" AND t1.NUM_REGISTRO_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSenderId14() != null) {
			where.append(" AND UPPER(t1.SENDER_ID_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getSenderId14().toUpperCase() + "%");
			where.append(" AND t1.SENDER_ID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSenderName14() != null) {
			where.append(" AND UPPER(t1.SENDER_NAME_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getSenderName14().toUpperCase() + "%");
			where.append(" AND t1.SENDER_NAME_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSubmisiontype14() != null) {
			where.append(" AND t1.SUBMISIONTYPE_14 = ?");
			params.add(bandejatelematica.getSubmisiontype14());
		}

		if (bandejatelematica != null && bandejatelematica.getUrgencia14() != null) {
			where.append(" AND t1.URGENCIA_14 = ?");
			params.add(bandejatelematica.getUrgencia14());
		}

		if (bandejatelematica != null && bandejatelematica.getfAlta14() != null) {
			where.append(" AND t1.F_ALTA_14 = ?");
			params.add(bandejatelematica.getfAlta14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuAlta14() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getUsuAlta14().toUpperCase() + "%");
			where.append(" AND t1.USU_ALTA_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getfModif14() != null) {
			where.append(" AND t1.F_MODIF_14 = ?");
			params.add(bandejatelematica.getfModif14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuModif14() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_14) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getUsuModif14().toUpperCase() + "%");
			where.append(" AND t1.USU_MODIF_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getExpediente() != null
				&& bandejatelematica.getExpediente().getNumExpediente00() != null) {
			where.append(" AND UPPER(t2.NUM_EXPEDIENTE_00) like ? ESCAPE  '\\'");
			params.add("%" + bandejatelematica.getExpediente().getNumExpediente00().toUpperCase() + "%");
			where.append(" AND t2.NUM_EXPEDIENTE_00 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getExpediente() != null
				&& bandejatelematica.getExpediente().getUrgencia00() != null) {
			where.append(" AND t2.URGENCIA_00 = ?");
			params.add(bandejatelematica.getExpediente().getUrgencia00());
		}
		if (bandejatelematica != null && bandejatelematica.getExpediente() != null
				&& bandejatelematica.getExpediente().getErrorExpediente00() != null) {

			// Todos os errores
			if (bandejatelematica.getExpediente().getErrorExpediente00() == 0) {
				where.append(" AND t2.ERROR_EXPEDIENTE_00 > 0");
			} else {
				where.append(" AND t2.ERROR_EXPEDIENTE_00 = ?");
				params.add(bandejatelematica.getExpediente().getErrorExpediente00());
			}
		}

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

		return mapWhere;
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(bandejatelematica);
		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 BandejaTelematica table using like.
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @param startsWith        Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(BandejaTelematica bandejatelematica, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM BANDEJA_TELEMATICA t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(bandejatelematica, 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 BandejaTelematica selected for rup_table
	 *
	 * @param bandejatelematica BandejaTelematica
	 * @param tableRequestDto   TableRequestDto
	 * @param startsWith        Boolean
	 * @return List<TableRowDto<BandejaTelematica>>
	 */
	@Override
	public List<TableRowDto<BandejaTelematica>> reorderSelection(BandejaTelematica bandejatelematica,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14 ");
		// FROM
		query.append("FROM BANDEJA_TELEMATICA t1 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(bandejatelematica, 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,
				BandejaTelematica.class, filterParamList, "IDENTRADA14");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    BandejaTelematica
	 * @param searchParams    BandejaTelematica
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<TableRowDto<BandejaTelematica>>
	 */
	@Override
	public List<TableRowDto<BandejaTelematica>> search(BandejaTelematica filterParams, BandejaTelematica searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14 ");
		// FROM
		query.append("FROM BANDEJA_TELEMATICA 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,
				BandejaTelematica.class, filterParamList, searchSQL, searchParamList, from_alias, "IDENTRADA14");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param tableRequestDto TableRequestDto
	 */
	@Override
	public void removeMultiple(TableRequestDto tableRequestDto) {
		StringBuilder sbRemoveMultipleSQL = TableManager.getRemoveMultipleQuery(tableRequestDto,
				BandejaTelematica.class, "BANDEJA_TELEMATICA", new String[] { "IDENTRADA14" });

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

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

	/**
	 * Filter in the hierarchical BandejaTelematica table.
	 *
	 * @param filterBandejaTelematica BandejaTelematica
	 * @param tableRequestDto         TableRequestDto
	 * @return List<JerarquiaDto<BandejaTelematica>>
	 */
	@Override
	public List<JerarquiaDto<BandejaTelematica>> findAllLikeJerarquia(BandejaTelematica filterBandejaTelematica,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ENTRADA_14 IDENTRADA14,t1.ESTADO_14 ESTADO14,t1.FOLDERID_14 FOLDERID14,t1.PROCEDUREID_14 PROCEDUREID14,t1.F_PROCESO_14 FPROCESO14,t1.F_REGISTRO_14 FREGISTRO14,t1.IDJMS_14 IDJMS14,t1.INSTANCEID_14 INSTANCEID14,t1.NUM_REGISTRO_14 NUMREGISTRO14,t1.SENDER_ID_14 SENDERID14,t1.SENDER_NAME_14 SENDERNAME14,t1.SUBMISIONTYPE_14 SUBMISIONTYPE14,t1.SUBMISIONTYPE_PROCESADO_14 SUBMISIONTYPEPROCESADO14,t1.URGENCIA_14 URGENCIA14, t1.F_ALTA_14 FALTA14,t1.USU_ALTA_14 USUALTA14,t1.F_MODIF_14 FMODIF14,t1.USU_MODIF_14 USUMODIF14 ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM BANDEJA_TELEMATICA t1 ");
		List<String> from = new ArrayList<String>();
		from.add("BANDEJA_TELEMATICA");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

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

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

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

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

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

		// PAGINACION
		if (tableRequestDto != null) {
			query = TableManagerJerarquia.getPaginationQuery(tableRequestDto, query,
					BandejaTelematicaDaoImpl.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 filterBandejaTelematica BandejaTelematica
	 * @param tableRequestDto         TableRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(BandejaTelematica filterBandejaTelematica, TableRequestDto tableRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM BANDEJA_TELEMATICA t1 ");
		List<String> from = new ArrayList<String>();
		from.add("BANDEJA_TELEMATICA");

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

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

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

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

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

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

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

	/**
	 * Find dependent hierarchical rows
	 *
	 * @param filterBandejaTelematica BandejaTelematica
	 * @param tableRequestDto         TableRequestDto
	 * @return List<TableRowDto<BandejaTelematica>>
	 */
	@Override
	public List<TableRowDto<BandejaTelematica>> findAllChild(BandejaTelematica filterBandejaTelematica,
			TableRequestDto tableRequestDto) {

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

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

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

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

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

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

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

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

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

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (bandejatelematica != null && bandejatelematica.getIdEntrada14() != null) {
			where.append(" AND t1.ID_ENTRADA_14 = ?");
			params.add(bandejatelematica.getIdEntrada14());
		}
		if (bandejatelematica != null && bandejatelematica.getEstado14() != null) {
			where.append(" AND t1.ESTADO_14 = ?");
			params.add(bandejatelematica.getEstado14());
		}
		if (bandejatelematica != null && bandejatelematica.getFolderid14() != null) {
			where.append(" AND t1.FOLDERID_14 = ?");
			params.add(bandejatelematica.getFolderid14());
		}
		if (bandejatelematica != null && bandejatelematica.getProcedureid14() != null) {
			where.append(" AND t1.PROCEDUREID_14 = ?");
			params.add(bandejatelematica.getProcedureid14());
		}
		if (bandejatelematica != null && bandejatelematica.getfProceso14() != null) {
			where.append(" AND t1.F_PROCESO_14 = ?");
			params.add(bandejatelematica.getfProceso14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14() != null) {
			where.append(" AND t1.F_REGISTRO_14 = ?");
			params.add(bandejatelematica.getfRegistro14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_01 BETWEEN ").append(" ? ").append(" AND ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() == null) {
			where.append(" AND (t1.F_REGISTRO_01 >= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() == null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_01 <= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getIdjms14() != null) {
			where.append(" AND t1.IDJMS_14 = ?");
			params.add(bandejatelematica.getIdjms14());
		}
		if (bandejatelematica != null && bandejatelematica.getInstanceid14() != null) {
			where.append(" AND t1.INSTANCEID_14 = ?");
			params.add(bandejatelematica.getInstanceid14());
		}
		if (bandejatelematica != null && bandejatelematica.getNumRegistro14() != null) {
			where.append(" AND t1.NUM_REGISTRO_14 = ?");
			params.add(bandejatelematica.getNumRegistro14());
		}
		if (bandejatelematica != null && bandejatelematica.getSenderId14() != null) {
			where.append(" AND t1.SENDER_ID_14 = ?");
			params.add(bandejatelematica.getSenderId14());
		}
		if (bandejatelematica != null && bandejatelematica.getSenderName14() != null) {
			where.append(" AND t1.SENDER_NAME_14 = ?");
			params.add(bandejatelematica.getSenderName14());
		}
		if (bandejatelematica != null && bandejatelematica.getSubmisiontype14() != null) {
			where.append(" AND t1.SUBMISIONTYPE_14 = ?");
			params.add(bandejatelematica.getSubmisiontype14());
		}

		if (bandejatelematica != null && bandejatelematica.getUrgencia14() != null) {
			where.append(" AND t1.URGENCIA_14 = ?");
			params.add(bandejatelematica.getUrgencia14());
		}

		if (bandejatelematica != null && bandejatelematica.getfAlta14() != null) {
			where.append(" AND t1.F_ALTA_14 = ?");
			params.add(bandejatelematica.getfAlta14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuAlta14() != null) {
			where.append(" AND t1.USU_ALTA_14 = ?");
			params.add(bandejatelematica.getUsuAlta14());
		}
		if (bandejatelematica != null && bandejatelematica.getfModif14() != null) {
			where.append(" AND t1.F_MODIF_14 = ?");
			params.add(bandejatelematica.getfModif14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuModif14() != null) {
			where.append(" AND t1.USU_MODIF_14 = ?");
			params.add(bandejatelematica.getUsuModif14());
		}

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

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

		if (bandejatelematica != null && bandejatelematica.getIdEntrada14() != null) {
			where.append(" AND t1.ID_ENTRADA_14 = ?");
			params.add(bandejatelematica.getIdEntrada14());
		}
		if (bandejatelematica != null && bandejatelematica.getEstado14() != null) {
			where.append(" AND UPPER(t1.ESTADO_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getEstado14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getEstado14().toUpperCase() + "%");
			}
			where.append(" AND t1.ESTADO_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getFolderid14() != null) {
			where.append(" AND UPPER(t1.FOLDERID_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getFolderid14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getFolderid14().toUpperCase() + "%");
			}
			where.append(" AND t1.FOLDERID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getProcedureid14() != null) {
			where.append(" AND UPPER(t1.PROCEDUREID_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getProcedureid14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getProcedureid14().toUpperCase() + "%");
			}
			where.append(" AND t1.PROCEDUREID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getfProceso14() != null) {
			where.append(" AND t1.F_PROCESO_14 = ?");
			params.add(bandejatelematica.getfProceso14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14() != null) {
			where.append(" AND t1.F_REGISTRO_14 = ?");
			params.add(bandejatelematica.getfRegistro14());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_14 BETWEEN ").append(" ? ").append(" AND ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() != null
				&& bandejatelematica.getfRegistro14_to() == null) {
			where.append(" AND (t1.F_REGISTRO_14 >= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_from());
		}
		if (bandejatelematica != null && bandejatelematica.getfRegistro14_from() == null
				&& bandejatelematica.getfRegistro14_to() != null) {
			where.append(" AND (t1.F_REGISTRO_14 <= ").append(" ? )");
			params.add(bandejatelematica.getfRegistro14_to());
		}
		if (bandejatelematica != null && bandejatelematica.getIdjms14() != null) {
			where.append(" AND UPPER(t1.IDJMS_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getIdjms14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getIdjms14().toUpperCase() + "%");
			}
			where.append(" AND t1.IDJMS_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getInstanceid14() != null) {
			where.append(" AND t1.INSTANCEID_14 = ?");
			params.add(bandejatelematica.getInstanceid14());
		}
		if (bandejatelematica != null && bandejatelematica.getNumRegistro14() != null) {
			where.append(" AND UPPER(t1.NUM_REGISTRO_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getNumRegistro14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getNumRegistro14().toUpperCase() + "%");
			}
			where.append(" AND t1.NUM_REGISTRO_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSenderId14() != null) {
			where.append(" AND UPPER(t1.SENDER_ID_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getSenderId14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getSenderId14().toUpperCase() + "%");
			}
			where.append(" AND t1.SENDER_ID_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSenderName14() != null) {
			where.append(" AND UPPER(t1.SENDER_NAME_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getSenderName14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getSenderName14().toUpperCase() + "%");
			}
			where.append(" AND t1.SENDER_NAME_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getSubmisiontype14() != null) {
			where.append(" AND t1.SUBMISIONTYPE_14 = ?");
			params.add(bandejatelematica.getSubmisiontype14());
		}

		if (bandejatelematica != null && bandejatelematica.getUrgencia14() != null) {
			where.append(" AND t1.URGENCIA_14 = ?");
			params.add(bandejatelematica.getUrgencia14());
		}

		if (bandejatelematica != null && bandejatelematica.getfAlta14() != null) {
			where.append(" AND t1.F_ALTA_14 = ?");
			params.add(bandejatelematica.getfAlta14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuAlta14() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getUsuAlta14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getUsuAlta14().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_14 IS NOT NULL");
		}
		if (bandejatelematica != null && bandejatelematica.getfModif14() != null) {
			where.append(" AND t1.F_MODIF_14 = ?");
			params.add(bandejatelematica.getfModif14());
		}
		if (bandejatelematica != null && bandejatelematica.getUsuModif14() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_14) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(bandejatelematica.getUsuModif14().toUpperCase() + "%");
			} else {
				params.add("%" + bandejatelematica.getUsuModif14().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_MODIF_14 IS NOT NULL");
		}

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

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

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

	@Override
	public BandejaTelematica updateTipoProceso(BandejaTelematica bandejaTelematica) {
		String query = "UPDATE BANDEJA_TELEMATICA SET SUBMISIONTYPE_PROCESADO_14=?, F_MODIF_14=SYSDATE, USU_MODIF_14=? WHERE ID_ENTRADA_14=?";
		this.jdbcTemplate.update(query, bandejaTelematica.getSubmisiontypeProcesado14(),
				bandejaTelematica.getUsuModif14(), bandejaTelematica.getIdEntrada14());
		return bandejaTelematica;
	}

}
