package com.ejie.ab61.dao.moduloAdministrativo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

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.ab61.comun.Constantes;
import com.ejie.ab61.comun.utilidades.ClobUtils;
import com.ejie.ab61.model.moduloAdministrativo.HuecosFolderNumber;
import com.ejie.ab61.model.moduloAdministrativo.ModuloAdministracion;
import com.ejie.ab61.model.moduloAdministrativo.Trazas;
import com.ejie.ab61.model.solicitudes.MensajesSolicitud;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.TableRowDto;

@Repository
@Transactional
public class ModuloAdministracionDaoImpl implements ModuloAdministracionDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDMENSAJE", "CODPROCEDUREID", "TIPOMENSAJE",
			"MENSAJE", "PLATEATYPE", "PLATEASUBTYPE", "SOLICITUD", "NUMEROTRAZAS", "CONFIGURACION", "EXCEPCION",
			"IDTRAZA", "IDSOLICITUDTRAZA", "IDEXPEDIENTE", "CODPROCEDUREIDTRAZA", "EXCEPCIONTRAZA", "METODO",
			"ESTADOSOLICITUD", "TAREAS", "FECHAREGISTROTRAZA", "IDMENSAJETRAZA", "IDSOLICITUD", "FECHAREGISTRO",
			"IDERRFOLDERNUMBER", "IDPROCEDIMIENTO", "FOLDERNUMBER", "FECHAREGISTROH", "USUARIOREGISTROH",
			"DESCRIPCIONCAST", "DESCRIPCIONEUSK", "IDEXPEDIENTE", "FOLDERID", "CODPROCEDUREID", "TITULO" };

	private JdbcTemplate jdbcTemplate;

	private RowMapper<ModuloAdministracion> rwMap = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			moduloAdministracion.setIdMensaje(resultSet.getInt("IDMENSAJE"));
			moduloAdministracion.setTipoMensaje(resultSet.getString("TIPOMENSAJE"));
			moduloAdministracion.setCodigoProcedimiento(resultSet.getString("CODPROCEDUREID"));
			moduloAdministracion.setMensaje(resultSet.getClob("MENSAJE"));
			moduloAdministracion.setPlateaType(resultSet.getString("PLATEATYPE"));
			moduloAdministracion.setPlateaSubType(resultSet.getString("PLATEASUBTYPE"));
			moduloAdministracion.setSolicitud(resultSet.getClob("SOLICITUD"));
			moduloAdministracion.setNumeroTrazas(resultSet.getInt("NUMEROTRAZAS"));
			moduloAdministracion.setFechaRegistro(resultSet.getTimestamp("FECHAREGISTRO"));
			moduloAdministracion.setConfiguracion(resultSet.getInt("CONFIGURACION"));
			moduloAdministracion.setIdSolicitud(resultSet.getInt("IDSOLICITUD"));
			moduloAdministracion.setFicheroMensaje(ClobUtils.clobToString(resultSet.getClob("MENSAJE")));
			moduloAdministracion.setFicheroSolicitud(ClobUtils.clobToString(resultSet.getClob("SOLICITUD")));
			return moduloAdministracion;
		}
	};

	private RowMapper<ModuloAdministracion> rwMapTrazas = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			Trazas trazas = new Trazas();

			trazas.setIdTraza(resultSet.getInt("IDTRAZA"));
			trazas.setIdSolicitud(resultSet.getInt("IDSOLICITUDTRAZA"));
			trazas.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			trazas.setCodigoProcedimiento(resultSet.getString("CODPROCEDUREIDTRAZA"));
			trazas.setExcepcion(resultSet.getString("EXCEPCIONTRAZA"));
			trazas.setMetodo(resultSet.getString("METODO"));
			trazas.setEstadoSolicitud(resultSet.getString("ESTADOSOLICITUD"));
			trazas.setTareas(resultSet.getClob("TAREAS"));
			trazas.setFicheroTareas(ClobUtils.clobToString(resultSet.getClob("TAREAS")));
			trazas.setFechaRegistro(resultSet.getTimestamp("FECHAREGISTROTRAZA"));
			trazas.setIdMensaje(resultSet.getInt("IDMENSAJETRAZA"));

			moduloAdministracion.setTrazas(trazas);

			return moduloAdministracion;
		}
	};

	private RowMapper<ModuloAdministracion> rwMapMensaje = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			moduloAdministracion.setFicheroMensaje(ClobUtils.clobToString(resultSet.getClob("MENSAJE")));
			return moduloAdministracion;
		}
	};

	private RowMapper<ModuloAdministracion> rwMapSolicitud = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			moduloAdministracion.setFicheroMensaje(ClobUtils.clobToString(resultSet.getClob("SOLICITUD")));
			return moduloAdministracion;
		}
	};

	private RowMapper<ModuloAdministracion> rwMapConfiguracion = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			moduloAdministracion.setConfiguracion(resultSet.getInt("CONFIGURACION"));
			return moduloAdministracion;
		}
	};

	private RowMapper<ModuloAdministracion> rwMapIdSolicitud = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			moduloAdministracion.setIdSolicitud(resultSet.getInt("IDSOLICITUDTRAZA"));

			return moduloAdministracion;
		}
	};

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

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

	private RowMapper<ModuloAdministracion> rwMapTareas = new RowMapper<ModuloAdministracion>() {
		public ModuloAdministracion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			ModuloAdministracion moduloAdministracion = new ModuloAdministracion();
			Trazas traza = new Trazas();
			traza.setFicheroTareas(ClobUtils.clobToString(resultSet.getClob("TAREAS")));
			moduloAdministracion.setTrazas(traza);
			return moduloAdministracion;
		}
	};

	private RowMapper<HuecosFolderNumber> rwMapHuecosFolderNumber = new RowMapper<HuecosFolderNumber>() {
		public HuecosFolderNumber mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			HuecosFolderNumber huecosFolderNumber = new HuecosFolderNumber();
			huecosFolderNumber.setIdErrorFolderNumber(resultSet.getInt("IDERRFOLDERNUMBER"));
			huecosFolderNumber.setIdProcedimiento(resultSet.getInt("IDPROCEDIMIENTO"));
			huecosFolderNumber.setFolderNumber(resultSet.getString("FOLDERNUMBER"));
			huecosFolderNumber.setFechaRegistro(resultSet.getDate("FECHAREGISTROH"));
			huecosFolderNumber.setUsuarioRegistro(resultSet.getString("USUARIOREGISTROH"));
			huecosFolderNumber.setProcedimientoDesCast(resultSet.getString("DESCRIPCIONCAST"));
			huecosFolderNumber.setProcedimientoDesEusk(resultSet.getString("DESCRIPCIONEUSK"));
			return huecosFolderNumber;
		}
	};

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

	private RowMapper<HuecosFolderNumber> rwMapFolderNull = new RowMapper<HuecosFolderNumber>() {
		public HuecosFolderNumber mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			HuecosFolderNumber huecosFolderNumber = new HuecosFolderNumber();
			huecosFolderNumber.setIdExpediente(resultSet.getInt("IDEXPEDIENTE"));
			huecosFolderNumber.setIdProcedimiento(resultSet.getInt("IDPROCEDIMIENTO"));
			huecosFolderNumber.setFolderId(resultSet.getString("FOLDERID"));
			huecosFolderNumber.setFechaRegistro(resultSet.getDate("FECHAREGISTROH"));
			huecosFolderNumber.setUsuarioRegistro(resultSet.getString("USUARIOREGISTROH"));
			huecosFolderNumber.setProcedimientoDesCast(resultSet.getString("DESCRIPCIONCAST"));
			huecosFolderNumber.setProcedimientoDesEusk(resultSet.getString("DESCRIPCIONEUSK"));
			huecosFolderNumber.setCodProcedure(resultSet.getString("CODPROCEDUREID"));
			huecosFolderNumber.setTitulo(resultSet.getString("TITULO"));
			return huecosFolderNumber;
		}
	};

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

	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public List<ModuloAdministracion> findAllLike(ModuloAdministracion filterModuloAdministrativo,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {

		StringBuilder queryCount = new StringBuilder(
				"SELECT COUNT(1) FROM MENSAJES_SOLICITUD t1, SOLICITUDES t2, CONFIG_EVENTOS t4 ");

		// Where clause & Params
		Map<String, ?> mapaWhereCount = this.getWhereLikeMap(filterModuloAdministrativo, startsWith);
		StringBuilder whereCount = new StringBuilder(
				"WHERE 1=1 AND t1.ID_MENSAJE = t2.ID_MENSAJE(+) AND t1.TIPOMENSAJE = t4.TIPO_EVENTO(+) AND t1.PLATEA_TYPE = t4.PLATEA_TYPE(+) AND t1.PLATEA_SUBTYPE = t4.PLATEA_SUBTYPE(+) ");
		whereCount.append(mapaWhereCount.get("query"));
		queryCount.append(whereCount);

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

		Long numeroInspecciones = this.jdbcTemplate.queryForLong(queryCount.toString(), paramsCount.toArray());

		StringBuilder queryMaximo = new StringBuilder(
				"SELECT t1.VALOR FROM PARAMETROS_CONFIG t1 WHERE DESCRIPCION = ?");

		Long numeroRegistros = this.jdbcTemplate.queryForLong(queryMaximo.toString(), Constantes.CONFIG_MAXIMO_TRAZAS);

		if (numeroInspecciones < numeroRegistros) {

			StringBuilder query = new StringBuilder(
					"SELECT t1.ID_MENSAJE IDMENSAJE, t1.COD_PROCEDURE_ID CODPROCEDUREID, t1.TIPOMENSAJE TIPOMENSAJE, t1.MENSAJE MENSAJE, t1.PLATEA_TYPE PLATEATYPE, t1.PLATEA_SUBTYPE PLATEASUBTYPE, t1.FECHA_REGISTRO FECHAREGISTRO, t2.ID_SOLICITUD IDSOLICITUD, t2.SOLICITUD SOLICITUD, DECODE(t1.TIPOMENSAJE, 'R02_REQUEST', (SELECT CONFIGURACION FROM CONFIG_EVENTOS WHERE TIPO_EVENTO = t1.TIPOMENSAJE AND PLATEA_TYPE = t1.PLATEA_TYPE AND PLATEA_SUBTYPE = t1.PLATEA_SUBTYPE), (SELECT CONFIGURACION FROM CONFIG_EVENTOS WHERE TIPO_EVENTO = t1.TIPOMENSAJE)) CONFIGURACION, DECODE(t1.TIPOMENSAJE, 'R02_REQUEST', DECODE((SELECT CONFIGURACION FROM CONFIG_EVENTOS WHERE TIPO_EVENTO  = t1.TIPOMENSAJE AND PLATEA_TYPE    = t1.PLATEA_TYPE AND PLATEA_SUBTYPE = t1.PLATEA_SUBTYPE), 1,(SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE OR t3.ID_SOLICITUD  = t2.ID_SOLICITUD), 2,(SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE OR t3.ID_SOLICITUD  = t2.ID_SOLICITUD), (SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE)), (SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE))NUMEROTRAZAS "
							+ "FROM MENSAJES_SOLICITUD t1, SOLICITUDES t2, CONFIG_EVENTOS t4 ");

			// Where clause & Params
			Map<String, ?> mapaWhere = this.getWhereLikeMap(filterModuloAdministrativo, startsWith);
			StringBuilder where = new StringBuilder(
					"WHERE 1=1 AND t1.ID_MENSAJE = t2.ID_MENSAJE(+) AND t1.TIPOMENSAJE = t4.TIPO_EVENTO(+) AND t1.PLATEA_TYPE = t4.PLATEA_TYPE(+) AND t1.PLATEA_SUBTYPE = t4.PLATEA_SUBTYPE(+) ");
			where.append(mapaWhere.get("query"));
			query.append(where);

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

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

			List<ModuloAdministracion> listaModulos = this.jdbcTemplate.query(query.toString(), this.rwMap,
					params.toArray());

			for (ModuloAdministracion moduloAdministracion : listaModulos) {

				if (moduloAdministracion.getConfiguracion() == 1 || moduloAdministracion.getConfiguracion() == 2) {

					if (moduloAdministracion.getSolicitud() == null) {
						moduloAdministracion.setError(2);
					} else {
						if (moduloAdministracion.getNumeroTrazas() == 0) {

							moduloAdministracion.setError(1);

						} else if (moduloAdministracion.getNumeroTrazas() == 1) {

							Long numeroSolicitudes = this.countTrazasSolicitudes(moduloAdministracion.getIdMensaje());

							if (numeroSolicitudes != 0) {

								List<ModuloAdministracion> listaTrazasSolicitudes = this
										.findAllLikeTrazasSolicitudes(moduloAdministracion.getIdMensaje());

								Iterator<ModuloAdministracion> itS = listaTrazasSolicitudes.iterator();
								Boolean estadoSolicitud = false;

								while (itS.hasNext()) {
									if (itS.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
										estadoSolicitud = true;
									}
								}

								if (estadoSolicitud) {
									moduloAdministracion.setError(3);
								} else {
									moduloAdministracion.setError(1);
								}
							} else {
								moduloAdministracion.setError(1);
							}

						}

						else if (moduloAdministracion.getNumeroTrazas() > 1) {

							List<ModuloAdministracion> listaTrazasMensaje = this
									.findAllLikeTrazasMensajes(moduloAdministracion.getIdMensaje());

							Iterator<ModuloAdministracion> itM = listaTrazasMensaje.iterator();
							Boolean estadoMensaje = false;

							while (itM.hasNext()) {
								if (itM.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
									estadoMensaje = true;
								}
							}

							List<ModuloAdministracion> listaTrazasSolicitudes = this
									.findAllLikeTrazasSolicitudes(moduloAdministracion.getIdMensaje());

							Iterator<ModuloAdministracion> itS = listaTrazasSolicitudes.iterator();
							Boolean estadoSolicitud = false;

							while (itS.hasNext()) {
								if (itS.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
									estadoSolicitud = true;
								}
							}

							if (estadoMensaje && estadoSolicitud) {
								moduloAdministracion.setError(0);
							} else if (!estadoMensaje && estadoSolicitud) {
								moduloAdministracion.setError(3);
							} else if (!estadoMensaje && !estadoSolicitud) {
								moduloAdministracion.setError(1);
							} else if (estadoMensaje && !estadoSolicitud) {
								moduloAdministracion.setError(1);
							}

						}

					}

				} else if (moduloAdministracion.getConfiguracion() == 0) {
					moduloAdministracion.setError(6);
				} else if (moduloAdministracion.getConfiguracion() == 3) {
					if (moduloAdministracion.getNumeroTrazas() == 0) {

						moduloAdministracion.setError(4);

					} else {
						List<ModuloAdministracion> listaTrazasMensaje = this
								.findAllLikeTrazasMensajes(moduloAdministracion.getIdMensaje());

						Iterator<ModuloAdministracion> itM = listaTrazasMensaje.iterator();
						Boolean estadoMensaje = false;

						while (itM.hasNext()) {
							if (itM.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
								estadoMensaje = true;
							}
						}

						if (estadoMensaje) {
							moduloAdministracion.setError(0);
						} else {
							moduloAdministracion.setError(4);
						}

					}

				} else if (moduloAdministracion.getConfiguracion() == 5) {
					if (moduloAdministracion.getNumeroTrazas() == 0) {

						moduloAdministracion.setError(5);

					} else {
						List<ModuloAdministracion> listaTrazasMensaje = this
								.findAllLikeTrazasMensajes(moduloAdministracion.getIdMensaje());

						Iterator<ModuloAdministracion> itM = listaTrazasMensaje.iterator();
						Boolean estadoMensaje = false;

						while (itM.hasNext()) {
							if (itM.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
								estadoMensaje = true;
							}
						}

						if (estadoMensaje) {
							moduloAdministracion.setError(0);
						} else {
							moduloAdministracion.setError(5);
						}

					}
				} else if (moduloAdministracion.getConfiguracion() == 4) {
					if (moduloAdministracion.getNumeroTrazas() == 0) {

						moduloAdministracion.setError(1);

					} else {

						List<ModuloAdministracion> listaTrazasMensaje = this
								.findAllLikeTrazasMensajes(moduloAdministracion.getIdMensaje());

						Iterator<ModuloAdministracion> itM = listaTrazasMensaje.iterator();

						if (moduloAdministracion.getNumeroTrazas() == 1) {

							Boolean estadoMensaje = false;

							while (itM.hasNext()) {
								if (itM.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
									estadoMensaje = true;
								}
							}

							if (estadoMensaje) {
								moduloAdministracion.setError(3);
							} else {
								moduloAdministracion.setError(1);
							}

						} else {

							Integer estadoMensajeUno = 0;

							while (itM.hasNext()) {
								if (itM.next().getTrazas().getEstadoSolicitud().equals(Integer.toString(1))) {
									estadoMensajeUno++;
								}
							}

							if (estadoMensajeUno == 0) {
								moduloAdministracion.setError(1);
							} else if (estadoMensajeUno == 1) {
								moduloAdministracion.setError(3);
							} else if (estadoMensajeUno >= 2) {
								moduloAdministracion.setError(0);
							}

						}
					}
				}
			}

			Collections.sort(listaModulos, new Comparator<ModuloAdministracion>() {
				@Override
				public int compare(ModuloAdministracion o1, ModuloAdministracion o2) {
					return -o1.getError().compareTo(o2.getError());
				}
			});

			return listaModulos;
		} else {
			List<ModuloAdministracion> listaModulosAux = new ArrayList<ModuloAdministracion>();
			ModuloAdministracion modulo = new ModuloAdministracion();
			listaModulosAux.add(modulo);
			return listaModulosAux;
		}
	}

	@Override
	public Long findAllLikeCount(ModuloAdministracion filterModuloAdministrativo, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM MENSAJES_SOLICITUD t1, SOLICITUDES t2, CONFIG_EVENTOS t4 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterModuloAdministrativo, startsWith);
		StringBuilder where = new StringBuilder(
				"WHERE 1=1 AND t1.ID_MENSAJE = t2.ID_MENSAJE(+) AND t1.TIPOMENSAJE = t4.TIPO_EVENTO(+) AND t1.PLATEA_TYPE = t4.PLATEA_TYPE(+) AND t1.PLATEA_SUBTYPE = t4.PLATEA_SUBTYPE(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	@Override
	public List<TableRowDto<ModuloAdministracion>> reorderSelection(ModuloAdministracion filterModuloAdministrativo,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_MENSAJE IDMENSAJE, t1.COD_PROCEDURE_ID CODPROCEDUREID, t1.TIPOMENSAJE TIPOMENSAJE, t1.MENSAJE MENSAJE, t1.PLATEA_TYPE PLATEATYPE, t1.PLATEA_SUBTYPE PLATEASUBTYPE, t2.ID_SOLICITUD IDSOLICITUD, t2.SOLICITUD SOLICITUD, DECODE(CONFIGURACION,1,(SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE OR t3.ID_SOLICITUD = t2.ID_SOLICITUD),2,(SELECT COUNT(t3.ID_TRAZA) FROM TRAZAS t3 WHERE t3.ID_MENSAJE = t1.ID_MENSAJE OR t3.ID_SOLICITUD = t2.ID_SOLICITUD),(SELECT COUNT(t4.ID_TRAZA) FROM TRAZAS t4 WHERE t4.ID_MENSAJE = t1.ID_MENSAJE)) NUMEROTRAZAS, t4.CONFIGURACION CONFIGURACION ");
		// FROM
		query.append("FROM FROM MENSAJES_SOLICITUD t1, SOLICITUDES t2, CONFIG_EVENTOS t4 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterModuloAdministrativo, startsWith);
		StringBuilder where = new StringBuilder(
				"WHERE 1=1 AND t1.ID_MENSAJE = t2.ID_MENSAJE(+) AND t1.TIPOMENSAJE = t4.TIPO_EVENTO(+) AND t1.PLATEA_TYPE = t4.PLATEA_TYPE(+) AND t1.PLATEA_SUBTYPE = t4.PLATEA_SUBTYPE(+)");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				ModuloAdministracionDaoImpl.class, filterParamList, "ID_MENSAJE");

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

	@Override
	public List<ModuloAdministracion> findAllLikeTrazasMensajes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {

		if (jqGridRequestDto.getSidx() != null
				&& jqGridRequestDto.getSidx().equals(Constantes.CONSTANTE_SIDX_FECHAREGISTRO)) {
			jqGridRequestDto.setSidx("FECHAREGISTROTRAZA");
		}

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1 WHERE t1.ID_MENSAJE = ?");

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

		List<ModuloAdministracion> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapTrazas,
				filterTrazas.getTrazas().getIdMensaje());

		return listaTrazas;
	}

	@Override
	public List<ModuloAdministracion> findAllLikeTrazasMensajes(Integer idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1 WHERE t1.ID_MENSAJE = ?");

		List<ModuloAdministracion> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapTrazas, idMensaje);

		return listaTrazas;
	}

	@Override
	public Long findAllLikeCountTrazasMensajes(ModuloAdministracion filterTrazas, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM TRAZAS t1 WHERE t1.ID_MENSAJE = ?");

		return this.jdbcTemplate.queryForLong(query.toString(), filterTrazas.getTrazas().getIdMensaje());
	}

	@Override
	public Long countTrazasMensajes(Integer idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(t2.ID_TRAZA) FROM MENSAJES_SOLICITUD t1, TRAZAS t2 WHERE t1.ID_MENSAJE = t2.ID_MENSAJE AND t1.ID_MENSAJE = ?");

		return this.jdbcTemplate.queryForLong(query.toString(), idMensaje);
	}

	@Override
	public List<TableRowDto<ModuloAdministracion>> reorderSelectionTrazasMensajes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = null;
		StringBuilder where = new StringBuilder(
				"WHERE t1.ID_MENSAJE = " + filterTrazas.getTrazas().getIdMensaje() + "");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				ModuloAdministracionDaoImpl.class, filterParamList, "ID_TRAZA");

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

	@Override
	public List<ModuloAdministracion> findAllLikeTrazasSolicitudes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {

		if (jqGridRequestDto.getSidx() != null
				&& jqGridRequestDto.getSidx().equals(Constantes.CONSTANTE_SIDX_FECHAREGISTRO)) {
			jqGridRequestDto.setSidx("FECHAREGISTROTRAZA");
		}

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1, MENSAJES_SOLICITUD t2, SOLICITUDES t3 WHERE t1.ID_SOLICITUD = t3.ID_SOLICITUD AND t3.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_MENSAJE = ?");

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

		List<ModuloAdministracion> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapTrazas,
				filterTrazas.getTrazas().getIdMensaje());

		return listaTrazas;
	}

	@Override
	public List<ModuloAdministracion> findAllLikeTrazasSolicitudes(Integer idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1, MENSAJES_SOLICITUD t2, SOLICITUDES t3 WHERE t1.ID_SOLICITUD = t3.ID_SOLICITUD AND t3.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_MENSAJE = ?");

		List<ModuloAdministracion> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapTrazas, idMensaje);

		return listaTrazas;
	}

	@Override
	public Long findAllLikeCountTrazasSolicitudes(ModuloAdministracion filterTrazas, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM TRAZAS t1, MENSAJES_SOLICITUD t2, SOLICITUDES t3 WHERE t1.ID_SOLICITUD = t3.ID_SOLICITUD AND t3.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_MENSAJE = ?");

		return this.jdbcTemplate.queryForLong(query.toString(), filterTrazas.getTrazas().getIdMensaje());
	}

	@Override
	public Long countTrazasSolicitudes(Integer idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(t3.ID_TRAZA) FROM MENSAJES_SOLICITUD t1, SOLICITUDES t2, TRAZAS t3 WHERE t1.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_SOLICITUD = t3.ID_SOLICITUD AND t1.ID_MENSAJE = ?");

		return this.jdbcTemplate.queryForLong(query.toString(), idMensaje);
	}

	@Override
	public List<TableRowDto<ModuloAdministracion>> reorderSelectionTrazasSolicitudes(ModuloAdministracion filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_TRAZA IDTRAZA, t1.ID_SOLICITUD IDSOLICITUDTRAZA, t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.COD_PROCEDURE_ID CODPROCEDUREIDTRAZA, t1.EXCEPCION EXCEPCIONTRAZA, t1.METODO METODO, t1.ESTADO_SOLICITUD ESTADOSOLICITUD, t1.TAREAS TAREAS, t1.FECHA_REGISTRO FECHAREGISTROTRAZA, t1.ID_MENSAJE IDMENSAJETRAZA FROM TRAZAS t1, MENSAJES_SOLICITUD t2, SOLICITUDES t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = null;
		StringBuilder where = new StringBuilder(
				"WHERE WHERE t1.ID_SOLICITUD = t3.ID_SOLICITUD AND t3.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_MENSAJE = "
						+ filterTrazas.getTrazas().getIdMensaje() + "");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				ModuloAdministracionDaoImpl.class, filterParamList, "ID_TRAZA");

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

	@Override
	public String obtenerMensaje(String idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.MENSAJE MENSAJE FROM MENSAJES_SOLICITUD t1 WHERE t1.ID_MENSAJE = ? ");

		List<ModuloAdministracion> modulo = this.jdbcTemplate.query(query.toString(), this.rwMapMensaje, idMensaje);

		Iterator<ModuloAdministracion> it = modulo.iterator();
		String mensaje = null;

		while (it.hasNext()) {
			mensaje = it.next().getFicheroMensaje();
		}

		return mensaje;
	}

	@Override
	public String obtenerSolicitud(String idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.SOLICITUD SOLICITUD FROM SOLICITUDES t1 WHERE t1.ID_MENSAJE = ? ");

		List<ModuloAdministracion> modulo = this.jdbcTemplate.query(query.toString(), this.rwMapSolicitud, idMensaje);

		Iterator<ModuloAdministracion> it = modulo.iterator();
		String mensaje = null;

		while (it.hasNext()) {
			mensaje = it.next().getFicheroMensaje();
		}

		return mensaje;
	}

	@Override
	public String obtenerTarea(String id) {
		StringBuilder query = new StringBuilder("SELECT t1.TAREAS TAREAS FROM TRAZAS t1 WHERE t1.ID_TRAZA = ? ");

		List<ModuloAdministracion> modulo = this.jdbcTemplate.query(query.toString(), this.rwMapTareas, id);

		Iterator<ModuloAdministracion> it = modulo.iterator();
		String tarea = null;

		while (it.hasNext()) {
			tarea = it.next().getTrazas().getFicheroTareas();
		}

		return tarea;
	}

	@Override
	public Integer obtenerConfiguracion(String idMensaje) {
		StringBuilder query = new StringBuilder(
				"SELECT t2.CONFIGURACION CONFIGURACION FROM MENSAJES_SOLICITUD t1, CONFIG_EVENTOS t2 WHERE t1.TIPOMENSAJE = t2.TIPO_EVENTO AND t1.PLATEA_TYPE = t2.PLATEA_TYPE AND t1.PLATEA_SUBTYPE = t2.PLATEA_SUBTYPE AND t1.ID_MENSAJE = ? ");

		List<ModuloAdministracion> modulo = this.jdbcTemplate.query(query.toString(), this.rwMapConfiguracion,
				idMensaje);

		Iterator<ModuloAdministracion> it = modulo.iterator();
		Integer configuracion = null;

		while (it.hasNext()) {
			configuracion = it.next().getConfiguracion();
		}

		return configuracion;
	}

	@Override
	public void guardarTextoMensajeLimpiado(Integer id, String textoLimpiado, Usuario usuario) {
		String query = "UPDATE MENSAJES_SOLICITUD SET MENSAJE = ?, FECHA_ULTMODIFICACION=sysdate, USUARIO_ULTMODIFICACION = ? WHERE ID_MENSAJE = ?";
		this.jdbcTemplate.update(query, textoLimpiado.trim(), usuario.getNombreUsuario(), id);
	}

	@Override
	public void guardarTextoSolicitudLimpiado(Integer id, String textoLimpiado, Usuario usuario) {
		StringBuilder queryIdSolicitud = new StringBuilder(
				"SELECT t1.ID_SOLICITUD FROM SOLICITUDES t1,MENSAJES_SOLICITUD t2 WHERE t1.ID_MENSAJE = t2.ID_MENSAJE AND t2.ID_MENSAJE = ?");

		Long idSolicitud = this.jdbcTemplate.queryForLong(queryIdSolicitud.toString(), id);

		String query = "UPDATE SOLICITUDES SET SOLICITUD = ?, FECHA_ULTMODIFICACION=sysdate, USUARIO_ULTMODIFICACION = ? WHERE ID_SOLICITUD = ?";
		this.jdbcTemplate.update(query, textoLimpiado.trim(), usuario.getNombreUsuario(), idSolicitud);
	}

	@Override
	public MensajesSolicitud guardarMensajeFicticio(MensajesSolicitud mensajeFicticio) {

		mensajeFicticio
				.setIdMensaje(this.jdbcTemplate.queryForObject("SELECT S_AB6117T00.NEXTVAL FROM DUAL", Integer.class));

		String query = "INSERT INTO MENSAJES_SOLICITUD (ID_MENSAJE, COD_PROCEDURE_ID, TIPOMENSAJE, MENSAJE, FECHA_REGISTRO, PLATEA_TYPE, PLATEA_SUBTYPE) VALUES (?,?,?,?,sysdate,?,?)";
		this.jdbcTemplate.update(query, mensajeFicticio.getIdMensaje(), mensajeFicticio.getCodProcedureId(),
				mensajeFicticio.getTipomensaje(), mensajeFicticio.getFicheroMensaje(), mensajeFicticio.getPlateaType(),
				mensajeFicticio.getPlateaSubtype());

		return mensajeFicticio;
	}

	private Map<String, Object> getWhereLikeMap(ModuloAdministracion filterModuloAdministrativo, Boolean startsWith) {

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

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getIdMensaje() != null) {
			where.append(" AND t1.ID_MENSAJE = ?");
			params.add(filterModuloAdministrativo.getIdMensaje());
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getTipoMensaje() != null) {
			where.append(" AND UPPER(t1.TIPOMENSAJE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(filterModuloAdministrativo.getTipoMensaje().toUpperCase() + "%");
			} else {
				params.add("%" + filterModuloAdministrativo.getTipoMensaje().toUpperCase() + "%");
			}
			where.append(" AND t1.TIPOMENSAJE IS NOT NULL");
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getCodigoProcedimiento() != null) {
			where.append(" AND t1.COD_PROCEDURE_ID = ?");
			params.add(filterModuloAdministrativo.getCodigoProcedimiento());
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getPlateaType() != null) {
			where.append(" AND t1.PLATEA_TYPE = ?");
			params.add(filterModuloAdministrativo.getPlateaType());
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getPlateaSubType() != null) {
			where.append(" AND t1.PLATEA_SUBTYPE = ?");
			params.add(filterModuloAdministrativo.getPlateaSubType());
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getFolderId() != null) {
			where.append(" AND UPPER(t1.MENSAJE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(filterModuloAdministrativo.getFolderId().toUpperCase() + "%");
			} else {
				params.add("%" + filterModuloAdministrativo.getFolderId().toUpperCase() + "%");
			}
			where.append(" AND t1.MENSAJE IS NOT NULL");
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getFechaRegistroDesde() != null
				&& filterModuloAdministrativo.getFechaRegistroHasta() != null) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(filterModuloAdministrativo.getFechaRegistroHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_REGISTRO BETWEEN TO_DATE('"
					+ new SimpleDateFormat("dd/MM/yyyy").format(filterModuloAdministrativo.getFechaRegistroDesde())
					+ "','dd/MM/yyyy') AND TO_DATE('" + new SimpleDateFormat("dd/MM/yyyy").format(calendar.getTime())
					+ "','dd/MM/yyyy')");
		} else if (filterModuloAdministrativo != null && filterModuloAdministrativo.getFechaRegistroDesde() != null
				&& filterModuloAdministrativo.getFechaRegistroHasta() == null) {
			where.append(" AND t1.FECHA_REGISTRO > TO_DATE('"
					+ new SimpleDateFormat("dd/MM/yyyy").format(filterModuloAdministrativo.getFechaRegistroDesde())
					+ "','dd/MM/yyyy')");
		} else if (filterModuloAdministrativo != null && filterModuloAdministrativo.getFechaRegistroDesde() == null
				&& filterModuloAdministrativo.getFechaRegistroHasta() != null) {

			Calendar calendar = Calendar.getInstance();
			calendar.setTime(filterModuloAdministrativo.getFechaRegistroHasta());
			calendar.add(Calendar.DAY_OF_YEAR, 1);
			where.append(" AND t1.FECHA_REGISTRO < TO_DATE('"
					+ new SimpleDateFormat("dd/MM/yyyy").format(calendar.getTime()) + "','dd/MM/yyyy')");
		}

		if (filterModuloAdministrativo != null && filterModuloAdministrativo.getIdSolicitud() != null) {
			where.append(" AND t2.ID_SOLICITUD = ?");
			params.add(filterModuloAdministrativo.getIdSolicitud());
		}

		where.append(" ORDER BY t1.FECHA_REGISTRO ASC");

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

		return mapWhere;
	}

	@Override
	public List<HuecosFolderNumber> findAllLike(HuecosFolderNumber filterTrazas, JQGridRequestDto jqGridRequestDto,
			boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ERROR_FOLDER_NUMBER IDERRFOLDERNUMBER, t1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, t1.FOLDER_NUMBER FOLDERNUMBER, t1.FECHA_REGISTRO FECHAREGISTROH, t1.USUARIO_REGISTRO USUARIOREGISTROH, t2.DESCRIPCION_CASTELLANO DESCRIPCIONCAST, t2.DESCRIPCION_EUSKERA DESCRIPCIONEUSK FROM AB6127T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO");

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

		List<HuecosFolderNumber> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapHuecosFolderNumber);

		return listaTrazas;
	}

	@Override
	public Long findAllLikeCount(HuecosFolderNumber filterTrazas, boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM AB6127T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO");

		return this.jdbcTemplate.queryForLong(query.toString());
	}

	@Override
	public List<TableRowDto<HuecosFolderNumber>> reorderSelection(HuecosFolderNumber filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_ERROR_FOLDER_NUMBER IDERRFOLDERNUMBER, t1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, t1.FOLDER_NUMBER FOLDERNUMBER, t1.FECHA_REGISTRO FECHAREGISTROH, t1.USUARIO_REGISTRO USUARIOREGISTROH, t2.DESCRIPCION_CASTELLANO DESCRIPCIONCAST, t2.DESCRIPCION_EUSKERA DESCRIPCIONEUSK FROM AB6127T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO");

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

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				ModuloAdministracionDaoImpl.class, filterParamList, "ID_ERROR_FOLDER_NUMBER");

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

	@Override
	public List<HuecosFolderNumber> findAllLikeNull(HuecosFolderNumber filterTrazas, JQGridRequestDto jqGridRequestDto,
			boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.TITULO TITULO, t1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, t1.FOLDER_ID FOLDERID, t1.FECHA_REGISTRO FECHAREGISTROH, t1.USUARIO_REGISTRO USUARIOREGISTROH, t2.DESCRIPCION_CASTELLANO DESCRIPCIONCAST, t2.DESCRIPCION_EUSKERA DESCRIPCIONEUSK, t2.COD_PROCEDURE_ID CODPROCEDUREID FROM AB6102T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO AND T1.FOLDER_NUMBER IS NULL");

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

		List<HuecosFolderNumber> listaTrazas = this.jdbcTemplate.query(query.toString(), this.rwMapFolderNull);

		return listaTrazas;
	}

	@Override
	public Long findAllLikeCountNull(HuecosFolderNumber filterTrazas, boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM AB6102T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO AND T1.FOLDER_NUMBER IS NULL");

		return this.jdbcTemplate.queryForLong(query.toString());
	}

	@Override
	public List<TableRowDto<HuecosFolderNumber>> reorderSelectionNull(HuecosFolderNumber filterTrazas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_EXPEDIENTE IDEXPEDIENTE, t1.TITULO TITULO, t1.ID_PROCEDIMIENTO IDPROCEDIMIENTO, t1.FOLDER_ID FOLDERID, t1.FECHA_REGISTRO FECHAREGISTROH, t1.USUARIO_REGISTRO USUARIOREGISTROH, t2.DESCRIPCION_CASTELLANO DESCRIPCIONCAST, t2.DESCRIPCION_EUSKERA DESCRIPCIONEUSK, t2.COD_PROCEDURE_ID CODPROCEDUREID FROM AB6102T00 t1, PROCEDIMIENTOS t2 WHERE t1.ID_PROCEDIMIENTO = t2.ID_PROCEDIMIENTO  AND T1.FOLDER_NUMBER IS NULL");

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

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto,
				ModuloAdministracionDaoImpl.class, filterParamList, "ID_EXPEDIENTE");

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

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

}
