package com.ejie.ab61.dao.plantillas;

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.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab61.comun.utilidades.SecuenciasSQL;
import com.ejie.ab61.model.expedientes.RelExpPla;
import com.ejie.ab61.model.plantillas.Documentos;
import com.ejie.ab61.model.plantillas.Plantillas;
import com.ejie.ab61.model.plantillas.TiposPlantilla;
import com.ejie.ab61.model.procedimientos.Areas;
import com.ejie.ab61.model.procedimientos.Direcciones;
import com.ejie.ab61.model.procedimientos.Procedimientos;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridManagerJerarquia;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * PlantillasDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class PlantillasDaoImpl implements PlantillasDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDPLANTILLA", "DESCRIPCIONCASTELLANO",
			"DESCRIPCIONEUSKERA", "OBSERVACIONES", "DOCPLANTILLA", "TAREA", "FECHAREGISTRO", "USUARIOREGISTRO",
			"FECHAULTMODIFICACION", "USUARIOULTMODIFICACION", "TIPOSPLANTILLAIDTIPOPLANTILLA", "RUTA", "IDRELEXPPLA",
			"TIPOSPLANTILLADESCASTELLANO", "TIPOSPLANTILLADESEUSKERA", "TIPOSPLANTILLAFECHAREGISTRO",
			"TIPOSPLANTILLAUSUARIOREGISTRO", "PROCEDIMIENTOSIDPROCEDIMIENTO", "PROCEDIMIENTOSCODPROCEDUREID",
			"PROCEDIMIENTOSFOLDERID", "PROCEDIMIENTOSFOLDERNUMBER", "PROCAMPOSTITULOEXPEDIENTE",
			"PROCEDIMIENTOSFECHAREGISTRO", "PROCEDIMIENTOSUSUARIOREGISTRO", "PROCEDIMIENTOSIDDIRECCION", "ARCHIVO",
			"NOMBREDOCUMENTO", "PROCEDIMIENTOSIDAREA" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Plantillas> rwMap = new RowMapper<Plantillas>() {
		public Plantillas mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Plantillas(resultSet.getInt("IDPLANTILLA"), resultSet.getString("DESCRIPCIONCASTELLANO"),
					resultSet.getString("DESCRIPCIONEUSKERA"), resultSet.getString("OBSERVACIONES"),
					resultSet.getDate("FECHAREGISTRO"), resultSet.getString("USUARIOREGISTRO"),
					resultSet.getDate("FECHAULTMODIFICACION"), resultSet.getString("USUARIOULTMODIFICACION"),
					new Documentos(null, resultSet.getString("NOMBREDOCUMENTO"), null, resultSet.getBlob("ARCHIVO"),
							null, null, null, null, null, null),
					new RelExpPla(resultSet.getInt("IDRELEXPPLA"), null, null, resultSet.getString("RUTA"), null, null,
							null),
					new TiposPlantilla(resultSet.getLong("TiposPlantillaIDTIPOPLANTILLA"),
							resultSet.getString("TiposPlantillaDESCASTELLANO"),
							resultSet.getString("TIPOSPLANTILLADESEUSKERA"), resultSet.getString("TASKID"),
							resultSet.getDate("TiposPlantillaFECHAREGISTRO"),
							resultSet.getString("TiposPlantillaUSUARIOREGISTRO")),
					new Procedimientos(resultSet.getInt("ProcedimientosIDPROCEDIMIENTO"),
							resultSet.getString("ProcedimientosDESCCASTELLANO"),
							resultSet.getString("ProcedimientosDESCEUSKERA"),
							resultSet.getString("ProcedimientosCODPROCEDUREID"),
							resultSet.getString("PROCAMPOSTITULOEXPEDIENTE"),
							resultSet.getDate("ProcedimientosFECHAREGISTRO"),
							resultSet.getString("ProcedimientosUSUARIOREGISTRO"),
							new Direcciones(resultSet.getInt("ProcedimientosIDDIRECCION"), null, null, null, null, null,
									null, null),
							new Areas(resultSet.getInt("ProcedimientosIDAREA"), null, null, null, null, null, null),
							resultSet.getBoolean("INSPECCIONABLE")),
					resultSet.getInt("ORIGEN"));
		}
	};

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Plantillas> rwMapMantenimiento = new RowMapper<Plantillas>() {
		public Plantillas mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Plantillas(resultSet.getInt("IDPLANTILLA"), resultSet.getString("DESCRIPCIONCASTELLANO"),
					resultSet.getString("DESCRIPCIONEUSKERA"), resultSet.getString("OBSERVACIONES"), null, null, null,
					null,
					new Documentos(null, resultSet.getString("NOMBREDOCUMENTO"), null, null, null, null, null, null,
							null, null),
					new RelExpPla(null, null, null, null, null, null, null),
					new TiposPlantilla(resultSet.getLong("TiposPlantillaIDTIPOPLANTILLA"),
							resultSet.getString("TiposPlantillaDESCASTELLANO"),
							resultSet.getString("TIPOSPLANTILLADESEUSKERA")),
					new Procedimientos(null, null, null, null, null, null, null,
							new Direcciones(null, null, null, null, null, null, null, null),
							new Areas(null, null, null, null, null, null, null), false),
					resultSet.getInt("ORIGEN"));
		}
	};

	private RowMapper<Plantillas> rwMapFindPlantillas = new RowMapper<Plantillas>() {
		public Plantillas mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Plantillas(resultSet.getInt("IDPLANTILLA"), resultSet.getString("DESCRIPCIONCASTELLANO"),
					resultSet.getString("DESCRIPCIONEUSKERA"), resultSet.getString("OBSERVACIONES"), null, null, null,
					null,
					new Documentos(resultSet.getInt("IDDOCUMENTO"), resultSet.getString("NOMBREDOCUMENTO"), null,
							resultSet.getBlob("ARCHIVO"), null, null, null, null, null, null),
					new RelExpPla(null, null, null, null, null, null, null),
					new TiposPlantilla(resultSet.getLong("TiposPlantillaIDTIPOPLANTILLA"),
							resultSet.getString("TiposPlantillaDESCASTELLANO"),
							resultSet.getString("TIPOSPLANTILLADESEUSKERA"), resultSet.getString("TASKID"), null, null),
					new Procedimientos(resultSet.getInt("ProcedimientosIDPROCEDIMIENTO"),
							resultSet.getString("ProcedimientosDESCCASTELLANO"),
							resultSet.getString("ProcedimientosDESCEUSKERA"),
							resultSet.getString("ProcedimientosCODPROCEDUREID"),
							resultSet.getString("PROCAMPOSTITULOEXPEDIENTE"), null, null,
							new Direcciones(resultSet.getInt("ProcedimientosIDDIRECCION"), null, null, null, null, null,
									null, null),
							new Areas(resultSet.getInt("ProcedimientosIDAREA"), null, null, null, null, null, null),
							resultSet.getBoolean("INSPECCIONABLE")),
					resultSet.getInt("ORIGEN"));
		}
	};

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

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

			Plantillas plantillas = new Plantillas(resultSet.getInt("IDPLANTILLA"),
					resultSet.getString("DESCRIPCIONCASTELLANO"), resultSet.getString("DESCRIPCIONEUSKERA"),
					resultSet.getString("OBSERVACIONES"), resultSet.getDate("FECHAREGISTRO"),
					resultSet.getString("USUARIOREGISTRO"), resultSet.getDate("FECHAULTMODIFICACION"),
					resultSet.getString("USUARIOULTMODIFICACION"),
					new Documentos(null, null, null, resultSet.getBlob("ARCHIVO"), null, null, null, null, null, null),
					new RelExpPla(null, null, null, resultSet.getString("RUTA"), null, null, null),
					new TiposPlantilla(resultSet.getLong("TiposPlantillaIDTIPOPLANTILLA"),
							resultSet.getString("TiposPlantillaDESCASTELLANO"),
							resultSet.getString("TIPOSPLANTILLADESEUSKERA"), resultSet.getString("TASKID"),
							resultSet.getDate("TiposPlantillaFECHAREGISTRO"),
							resultSet.getString("TiposPlantillaUSUARIOREGISTRO")),
					new Procedimientos(resultSet.getInt("ProcedimientosIDPROCEDIMIENTO"),
							resultSet.getString("ProcedimientosDESCCASTELLANO"),
							resultSet.getString("ProcedimientosDESCEUSKERA"),
							resultSet.getString("ProcedimientosCODPROCEDUREID"),
							resultSet.getString("PROCAMPOSTITULOEXPEDIENTE"),
							resultSet.getDate("ProcedimientosFECHAREGISTRO"),
							resultSet.getString("ProcedimientosUSUARIOREGISTRO"),
							new Direcciones(resultSet.getInt("ProcedimientosIDDIRECCION"), null, null, null, null, null,
									null, null),
							new Areas(resultSet.getInt("ProcedimientosIDAREA"), null, null, null, null, null, null),
							resultSet.getBoolean("INSPECCIONABLE")),
					resultSet.getInt("ORIGEN"));

			JerarquiaDto<Plantillas> jerarquia = new JerarquiaDto<Plantillas>();
			jerarquia.setModel(plantillas);
			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 Plantillas table.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @return Plantillas
	 */
	public Plantillas add(Plantillas plantillas) {
		int idPlantilla = this.jdbcTemplate.queryForInt(SecuenciasSQL.getSelectNext("AB61.S_AB6110T00"));
		plantillas.setIdPlantilla(idPlantilla);
		String query = "INSERT INTO PLANTILLAS (ID_PLANTILLA, ID_TIPO_PLANTILLA, ID_PROCEDIMIENTO, DESCRIPCION_CASTELLANO, DESCRIPCION_EUSKERA, OBSERVACIONES, FECHA_REGISTRO, USUARIO_REGISTRO, ID_DOCUMENTO, ORIGEN) VALUES (?,?,?,?,?,?,?,?,?,?)";
		Object getTiposPlantillaIdTipoPlantillaAux = null;
		if (plantillas.getTiposPlantilla() != null && plantillas.getTiposPlantilla().getIdTipoPlantilla() != null) {
			getTiposPlantillaIdTipoPlantillaAux = plantillas.getTiposPlantilla().getIdTipoPlantilla();
		}
		Object getProcedimientosIdProcedimientoAux = null;
		if (plantillas.getProcedimientos() != null && plantillas.getProcedimientos().getIdProcedimiento() != null) {
			getProcedimientosIdProcedimientoAux = plantillas.getProcedimientos().getIdProcedimiento();
		}
		Object getDocumentoIdDocumentoAux = null;
		if (plantillas.getDocumento() != null && plantillas.getDocumento().getIdDocumento() != null
				&& plantillas.getDocumento().getIdDocumento() != 0) {
			getDocumentoIdDocumentoAux = plantillas.getDocumento().getIdDocumento();
		}
		this.jdbcTemplate.update(query, plantillas.getIdPlantilla(), getTiposPlantillaIdTipoPlantillaAux,
				getProcedimientosIdProcedimientoAux, plantillas.getDescripcionCastellano(),
				plantillas.getDescripcionEuskera(), plantillas.getObservaciones(), plantillas.getFechaRegistro(),
				plantillas.getUsuarioRegistro(), getDocumentoIdDocumentoAux, plantillas.getOrigen());
		return plantillas;
	}

	/**
	 * Updates a single row in the Plantillas table.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @return Plantillas
	 */
	public Plantillas update(Plantillas plantillas) {
		String query = "UPDATE PLANTILLAS SET ID_TIPO_PLANTILLA=?, ID_PROCEDIMIENTO=?, DESCRIPCION_CASTELLANO=?, DESCRIPCION_EUSKERA=?, OBSERVACIONES=?, FECHA_ULTMODIFICACION=?, USUARIO_ULTMODIFICACION=?, ID_DOCUMENTO=?, ORIGEN=? WHERE ID_PLANTILLA=?";
		Object getTiposPlantillaIdTipoPlantillaAux = null;
		if (plantillas.getTiposPlantilla() != null && plantillas.getTiposPlantilla().getIdTipoPlantilla() != null) {
			getTiposPlantillaIdTipoPlantillaAux = plantillas.getTiposPlantilla().getIdTipoPlantilla();
		}
		Object getProcedimientosIdProcedimientoAux = null;
		if (plantillas.getProcedimientos() != null && plantillas.getProcedimientos().getIdProcedimiento() != null) {
			getProcedimientosIdProcedimientoAux = plantillas.getProcedimientos().getIdProcedimiento();
		}
		Object getDocumentoIdDocumentoAux = null;
		if (plantillas.getDocumento() != null && plantillas.getDocumento().getIdDocumento() != null
				&& plantillas.getDocumento().getIdDocumento() != 0) {
			getDocumentoIdDocumentoAux = plantillas.getDocumento().getIdDocumento();
		}
		this.jdbcTemplate.update(query, getTiposPlantillaIdTipoPlantillaAux, getProcedimientosIdProcedimientoAux,
				plantillas.getDescripcionCastellano(), plantillas.getDescripcionEuskera(),
				plantillas.getObservaciones(), plantillas.getFechaUltmodificacion(),
				plantillas.getUsuarioUltmodificacion(), getDocumentoIdDocumentoAux, plantillas.getOrigen(),
				plantillas.getIdPlantilla());
		return plantillas;
	}

	/**
	 * Finds a single row in the Plantillas table.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @return Plantillas
	 */
	@Transactional(readOnly = true)
	public Plantillas find(Plantillas plantillas) {
		String query = "SELECT  t1.ID_PLANTILLA IDPLANTILLA, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.OBSERVACIONES OBSERVACIONES, t1.ORIGEN ORIGEN, t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA, t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO, t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA, t2.TASK_ID TASKID, t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO, t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID, t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO, t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA, t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE, t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION, t3.ID_AREA PROCEDIMIENTOSIDAREA, t3.INSPECCIONABLE INSPECCIONABLE, t4.ID_DOCUMENTO IDDOCUMENTO ,  t4.NOMBRE_DOCUMENTO NOMBREDOCUMENTO , t4.ARCHIVO ARCHIVO FROM  PLANTILLAS t1 , TIPOS_PLANTILLA t2 , PROCEDIMIENTOS t3, DOCUMENTOS t4 WHERE t1.ID_PLANTILLA   = ? AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO = t3.ID_PROCEDIMIENTO(+) AND t4.ID_DOCUMENTO(+) = t1.ID_DOCUMENTO";
		List<Plantillas> plantillasList = this.jdbcTemplate.query(query, this.rwMapFindPlantillas,
				plantillas.getIdPlantilla());
		return (Plantillas) DataAccessUtils.uniqueResult(plantillasList);
	}

	/**
	 * Removes a single row in the Plantillas table.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @return
	 */
	public void remove(Plantillas plantillas) {
		String query = "DELETE FROM PLANTILLAS WHERE ID_PLANTILLA=?";
		this.jdbcTemplate.update(query, plantillas.getIdPlantilla());
	}

	/**
	 * Finds a list of rows in the Plantillas table.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Plantillas>
	 */
	@Transactional(readOnly = true)
	public List<Plantillas> findAll(Plantillas plantillas, JQGridRequestDto jqGridRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.DOC_PLANTILLA DOCPLANTILLA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.DOCUMENTO,t1.ORIGEN,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO,t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO,t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA,t3.INSPECCIONABLE INSPECCIONABLE ");
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 ");

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

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

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

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

	/**
	 * Poner a null los id_documentos de plantiilas, segun el id_documento dado.
	 *
	 * @param idDocumento
	 *            Integer
	 */
	public void updateIdDocumento(Integer idDocumento) {
		String query = "UPDATE PLANTILLAS SET  ID_DOCUMENTO= null , FECHA_ULTMODIFICACION=sysdate, USUARIO_ULTMODIFICACION=? WHERE ID_DOCUMENTO=?";
		String usuario = "";
		Authentication aut = SecurityContextHolder.getContext().getAuthentication();
		if (null != aut) {
			usuario = (String) aut.getPrincipal();
		}

		this.jdbcTemplate.update(query, usuario, idDocumento);

	}

	/**
	 * metodo para saber cuantas plantillas tienen asociado el mismo id de
	 * documento
	 * 
	 * 
	 * @return count.
	 */
	@Transactional(readOnly = true)
	public Long obtenerNumDocumentosCampo(Integer idDocumento) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM PLANTILLAS WHERE ID_DOCUMENTO =?");

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

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

	/**
	 * Finds rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Plantillas>
	 */
	@Transactional(readOnly = true)
	public List<Plantillas> findMantenimientoPlantillas(Plantillas plantillas, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.OBSERVACIONES OBSERVACIONES, t1.ORIGEN ORIGEN, t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA, t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO, t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA, t5.NOMBRE_DOCUMENTO NOMBREDOCUMENTO, t5.ARCHIVO ARCHIVO ");
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+)  AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, PlantillasDaoImpl.ORDER_BY_WHITE_LIST);
		}
		return (List<Plantillas>) this.jdbcTemplate.query(query.toString(), this.rwMapMantenimiento, params.toArray());
	}

	/**
	 * Finds rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Plantillas>
	 */
	@Transactional(readOnly = true)
	public List<Plantillas> findMantenimientoPlantillasPorDireccion(Plantillas plantillas,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith, Integer direccion) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.OBSERVACIONES OBSERVACIONES, t1.ORIGEN ORIGEN, t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA, t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO, t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA, t5.NOMBRE_DOCUMENTO NOMBREDOCUMENTO, t5.ARCHIVO ARCHIVO ");
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+) AND t3.ID_DIRECCION = "
						+ direccion + " AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, PlantillasDaoImpl.ORDER_BY_WHITE_LIST);
		}
		return (List<Plantillas>) this.jdbcTemplate.query(query.toString(), this.rwMapMantenimiento, params.toArray());
	}

	/**
	 * Finds rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Plantillas>
	 */
	@Transactional(readOnly = true)
	public List<Plantillas> findAllLike(Plantillas plantillas, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.ORIGEN,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO, t2.TASK_ID TASKID, t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO,t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA, t3.INSPECCIONABLE INSPECCIONABLE ,t4.ID_REL_EXP_PLA  IDRELEXPPLA, t4.RUTA RUTA,   t5.NOMBRE_DOCUMENTO NOMBREDOCUMENTO,  t5.ARCHIVO ARCHIVO ");
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3, REL_EXP_PLA t4 , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+)   AND t1.ID_PROCEDIMIENTO = t4.ID_PROCEDIMIENTO(+)   AND t1.ID_PLANTILLA = t4.ID_PLANTILLA (+)  AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// if (jqGridRequestDto != null) {
		// if (jqGridRequestDto.getSidx() != null) {
		// if
		// (jqGridRequestDto.getSidx().equals("tiposPlantilla.descripcionCastellano"))
		// jqGridRequestDto.setSidx("TiposPlantillaDESCASTELLANO");
		// else if
		// (jqGridRequestDto.getSidx().equals("tiposPlantilla.descripcionEuskera"))
		// jqGridRequestDto.setSidx("TIPOSPLANTILLADESEUSKERA");
		//
		// }
		//
		// query = JQGridManager.getPaginationQuery(jqGridRequestDto, query,
		// PlantillasDaoImpl.ORDER_BY_WHITE_LIST);
		// }

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, PlantillasDaoImpl.ORDER_BY_WHITE_LIST);
		}
		return (List<Plantillas>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

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

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

	/**
	 * Counts rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountManteniemiento(Plantillas plantillas, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3  , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+) AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	/**
	 * Counts rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCountManteniemientoPorDireccion(Plantillas plantillas, Boolean startsWith,
			Integer direccion) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3  , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+) AND t3.ID_DIRECCION = "
						+ direccion + " AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	/**
	 * Counts rows in the Plantillas table using like.
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(Plantillas plantillas, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 , REL_EXP_PLA t4 , DOCUMENTOS t5 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+) AND t1.ID_PROCEDIMIENTO = t4.ID_PROCEDIMIENTO(+)   AND t1.ID_PLANTILLA = t4.ID_PLANTILLA (+) AND t1.ID_DOCUMENTO = t5.ID_DOCUMENTO (+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

	/**
	 * Reorder the data list of Plantillas selected for rup_table
	 *
	 * @param plantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Plantillas>>
	 */
	@Override
	public List<TableRowDto<Plantillas>> reorderSelection(Plantillas plantillas, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.DOC_PLANTILLA DOCPLANTILLA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.DOCUMENTO,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO,t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO,t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(plantillas, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_TIPO_PLANTILLA= t2.ID_TIPO_PLANTILLA(+) AND t1.ID_PROCEDIMIENTO= t3.ID_PROCEDIMIENTO(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

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

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            Plantillas
	 * @param searchParams
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Plantillas>>
	 */
	@Override
	public List<TableRowDto<Plantillas>> search(Plantillas filterParams, Plantillas searchParams,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.DOC_PLANTILLA DOCPLANTILLA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.DOCUMENTO,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO,t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO,t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

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

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

		// SQL
		StringBuilder sbReorderSelectionSQL = JQGridManager.getSearchQuery(query, jqGridRequestDto, Plantillas.class,
				filterParamList, searchSQL, searchParamList, from_alias, "ID_PLANTILLA");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterplantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(Plantillas filterplantillas, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.DOC_PLANTILLA DOCPLANTILLA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.DOCUMENTO,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO,t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.DESCRIPCION_CASTELLANO PROCEDIMIENTOSDESCCASTELLANO,t3.DESCRIPCION_EUSKERA PROCEDIMIENTOSDESCEUSKERA,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		query.append("FROM PLANTILLAS t1 ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 ");

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

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

		StringBuilder sbRemoveMultipleSQL = JQGridManager.getRemoveMultipleQuery(jqGridRequestDto, Plantillas.class,
				query, params, "ID_PLANTILLA");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical Plantillas table.
	 *
	 * @param filterPlantillas
	 *            Plantillas
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<JerarquiaDto<Plantillas>>
	 */
	@Override
	public List<JerarquiaDto<Plantillas>> findAllLikeJerarquia(Plantillas filterPlantillas,
			JQGridRequestDto jqGridRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PLANTILLA IDPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.OBSERVACIONES OBSERVACIONES,t1.DOC_PLANTILLA DOCPLANTILLA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION,t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION,t1.DOCUMENTO,t1.ORIGEN,t2.ID_TIPO_PLANTILLA TIPOSPLANTILLAIDTIPOPLANTILLA,t2.DESCRIPCION_CASTELLANO TIPOSPLANTILLADESCASTELLANO,t2.DESCRIPCION_EUSKERA TIPOSPLANTILLADESEUSKERA,t2.FECHA_REGISTRO TIPOSPLANTILLAFECHAREGISTRO,t2.USUARIO_REGISTRO TIPOSPLANTILLAUSUARIOREGISTRO,t3.ID_PROCEDIMIENTO PROCEDIMIENTOSIDPROCEDIMIENTO,t3.COD_PROCEDURE_ID PROCEDIMIENTOSCODPROCEDUREID,t3.CAMPOS_TITULO_EXPEDIENTE PROCAMPOSTITULOEXPEDIENTE,t3.FECHA_REGISTRO PROCEDIMIENTOSFECHAREGISTRO,t3.USUARIO_REGISTRO PROCEDIMIENTOSUSUARIOREGISTRO,t3.ID_DIRECCION PROCEDIMIENTOSIDDIRECCION,t3.ID_AREA PROCEDIMIENTOSIDAREA ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM PLANTILLAS t1
		// ,TIPOS_PLANTILLA t2 ,PROCEDIMIENTOS t3 ");
		List<String> from = new ArrayList<String>();
		from.add("PLANTILLAS");
		from.add("TIPOS_PLANTILLA");
		from.add("PROCEDIMIENTOS");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");
		from_alias.add(" t3 ");

		// 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(filterPlantillas, false);

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

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

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

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

		// 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(filterPlantillas, false);

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

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

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

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

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

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

		// 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(filterPlantillas, false);

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

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

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

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

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (plantillas != null && plantillas.getIdPlantilla() != null) {
			where.append(" AND t1.ID_PLANTILLA = ?");
			params.add(plantillas.getIdPlantilla());
		}

		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getIdTipoPlantilla() != null) {
			where.append(" AND t2.ID_TIPO_PLANTILLA = ?");
			params.add(plantillas.getTiposPlantilla().getIdTipoPlantilla());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getDescripcionCastellano() != null) {
			where.append(" AND t2.DESCRIPCION_CASTELLANO = ?");
			params.add(plantillas.getTiposPlantilla().getDescripcionCastellano());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getDescripcionEuskera() != null) {
			where.append(" AND t2.DESCRIPCION_EUSKERA = ?");
			params.add(plantillas.getTiposPlantilla().getDescripcionEuskera());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(plantillas.getTiposPlantilla().getFechaRegistro());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getUsuarioRegistro() != null) {
			where.append(" AND t2.USUARIO_REGISTRO = ?");
			params.add(plantillas.getTiposPlantilla().getUsuarioRegistro());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getIdProcedimiento() != null) {
			where.append(" AND t3.ID_PROCEDIMIENTO = ?");
			params.add(plantillas.getProcedimientos().getIdProcedimiento());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getDirecciones() != null
				&& plantillas.getProcedimientos().getDirecciones().getIdDireccion() != null) {
			where.append(" AND t3.ID_DIRECCION = ?");
			params.add(plantillas.getProcedimientos().getDirecciones().getIdDireccion());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getAreas() != null
				&& plantillas.getProcedimientos().getAreas().getIdArea() != null) {
			where.append(" AND t3.ID_AREA = ?");
			params.add(plantillas.getProcedimientos().getAreas().getIdArea());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getCodProcedureId() != null) {
			where.append(" AND t3.COD_PROCEDURE_ID = ?");
			params.add(plantillas.getProcedimientos().getCodProcedureId());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getCamposTituloExpediente() != null) {
			where.append(" AND t3.CAMPOS_TITULO_EXPEDIENTE = ?");
			params.add(plantillas.getProcedimientos().getCamposTituloExpediente());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getFechaRegistro() != null) {
			where.append(" AND t3.FECHA_REGISTRO = ?");
			params.add(plantillas.getProcedimientos().getFechaRegistro());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getUsuarioRegistro() != null) {
			where.append(" AND t3.USUARIO_REGISTRO = ?");
			params.add(plantillas.getProcedimientos().getUsuarioRegistro());
		}
		if (plantillas != null && plantillas.getDescripcionCastellano() != null) {
			where.append(" AND t1.DESCRIPCION_CASTELLANO = ?");
			params.add(plantillas.getDescripcionCastellano());
		}
		if (plantillas != null && plantillas.getDescripcionEuskera() != null) {
			where.append(" AND t1.DESCRIPCION_EUSKERA = ?");
			params.add(plantillas.getDescripcionEuskera());
		}
		if (plantillas != null && plantillas.getObservaciones() != null) {
			where.append(" AND t1.OBSERVACIONES = ?");
			params.add(plantillas.getObservaciones());
		}
		if (plantillas != null && plantillas.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(plantillas.getFechaRegistro());
		}
		if (plantillas != null && plantillas.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(plantillas.getUsuarioRegistro());
		}
		if (plantillas != null && plantillas.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(plantillas.getFechaUltmodificacion());
		}
		if (plantillas != null && plantillas.getUsuarioUltmodificacion() != null) {
			where.append(" AND t1.USUARIO_ULTMODIFICACION = ?");
			params.add(plantillas.getUsuarioUltmodificacion());
		}

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

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

		if (plantillas != null && plantillas.getIdPlantilla() != null) {
			where.append(" AND t1.ID_PLANTILLA = ?");
			params.add(plantillas.getIdPlantilla());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getIdTipoPlantilla() != null) {
			where.append(" AND t2.ID_TIPO_PLANTILLA = ?");
			params.add(plantillas.getTiposPlantilla().getIdTipoPlantilla());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t2.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getTiposPlantilla().getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getTiposPlantilla().getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t2.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t2.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getTiposPlantilla().getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getTiposPlantilla().getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t2.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getFechaRegistro() != null) {
			where.append(" AND t2.FECHA_REGISTRO = ?");
			params.add(plantillas.getTiposPlantilla().getFechaRegistro());
		}
		if (plantillas != null && plantillas.getTiposPlantilla() != null
				&& plantillas.getTiposPlantilla().getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t2.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getTiposPlantilla().getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getTiposPlantilla().getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t2.USUARIO_REGISTRO IS NOT NULL");
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getIdProcedimiento() != null) {
			where.append(" AND t3.ID_PROCEDIMIENTO = ?");
			params.add(plantillas.getProcedimientos().getIdProcedimiento());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getDirecciones() != null
				&& plantillas.getProcedimientos().getDirecciones().getIdDireccion() != null) {
			where.append(" AND t3.ID_DIRECCION = ?");
			params.add(plantillas.getProcedimientos().getDirecciones().getIdDireccion());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getAreas() != null
				&& plantillas.getProcedimientos().getAreas().getIdArea() != null) {
			where.append(" AND t3.ID_AREA = ?");
			params.add(plantillas.getProcedimientos().getAreas().getIdArea());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getCodProcedureId() != null) {
			where.append(" AND UPPER(t3.COD_PROCEDURE_ID) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getProcedimientos().getCodProcedureId().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getProcedimientos().getCodProcedureId().toUpperCase() + "%");
			}
			where.append(" AND t3.COD_PROCEDURE_ID IS NOT NULL");
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getCamposTituloExpediente() != null) {
			where.append(" AND UPPER(t3.CAMPOS_TITULO_EXPEDIENTE) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getProcedimientos().getCamposTituloExpediente().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getProcedimientos().getCamposTituloExpediente().toUpperCase() + "%");
			}
			where.append(" AND t3.CAMPOS_TITULO_EXPEDIENTE IS NOT NULL");
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getFechaRegistro() != null) {
			where.append(" AND t3.FECHA_REGISTRO = ?");
			params.add(plantillas.getProcedimientos().getFechaRegistro());
		}
		if (plantillas != null && plantillas.getProcedimientos() != null
				&& plantillas.getProcedimientos().getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t3.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getProcedimientos().getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getProcedimientos().getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t3.USUARIO_REGISTRO IS NOT NULL");
		}
		if (plantillas != null && plantillas.getRelExpPla() != null
				&& plantillas.getRelExpPla().getIdExpediente() != null) {
			where.append(" AND t4.ID_EXPEDIENTE(+) =  ? ");
			params.add(plantillas.getRelExpPla().getIdExpediente());

		}
		if (plantillas != null && plantillas.getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (plantillas != null && plantillas.getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (plantillas != null && plantillas.getObservaciones() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getObservaciones().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getObservaciones().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES IS NOT NULL");
		}
		if (plantillas != null && plantillas.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(plantillas.getFechaRegistro());
		}
		if (plantillas != null && plantillas.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}
		if (plantillas != null && plantillas.getFechaUltmodificacion() != null) {
			where.append(" AND t1.FECHA_ULTMODIFICACION = ?");
			params.add(plantillas.getFechaUltmodificacion());
		}
		if (plantillas != null && plantillas.getUsuarioUltmodificacion() != null) {
			where.append(" AND UPPER(t1.USUARIO_ULTMODIFICACION) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(plantillas.getUsuarioUltmodificacion().toUpperCase() + "%");
			} else {
				params.add("%" + plantillas.getUsuarioUltmodificacion().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_ULTMODIFICACION IS NOT NULL");
		}

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

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

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