package com.ejie.ab79.dao.preguntasRespuestas;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.clientesWS.ab63WebService.DatosValidarWS;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.REST.servicioWeb.PreguntaRespuestaExpediente;
import com.ejie.ab79.model.REST.servicioWeb.PreguntaRespuestaRelConFac;
import com.ejie.ab79.model.REST.servicioWeb.PreguntaRespuestaValidacion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPreExp;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasExpediente;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasRespuestasExpediente;
import com.ejie.ab79.model.preguntasRespuestas.RespuestasExpediente;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableManagerJerarquia;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * PreguntasExpedienteDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class PreguntasExpedienteDaoImpl implements PreguntasExpedienteDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDPREGUNTAEXPEDIENTE", "IDPREGUNTAMOVIL",
			"IDINSPECCION", "ORDEN", "DESCRIPCIONCASTELLANO", "DESCRIPCIONEUSKERA", "IDTIPOPREGUNTA", "FECHAFACTURA",
			"NUMEROFACTURA", "PROVEEDOR", "IMPORTE", "IMPORTEADMITIDO", "OBSERVACIONESTECNICOCAS",
			"OBSERVACIONESTECNICOEUS", "FECHAREGISTRO", "USUARIOREGISTRO", "PREGUNTASEXPEDIENTEIDPREGUNTAEXPEDIENTE",
			"PREGUNTASEXPEDIENTEIDINSPECCION", "PREGUNTASEXPEDIENTEORDEN", "PREGUNTASEXPEDIENTEDESCRIPCIONCASTELLANO",
			"PREGUNTASEXPEDIENTEDESCRIPCIONEUSKERA", "PREGUNTASEXPEDIENTEIDTIPOPREGUNTA",
			"PREGUNTASEXPEDIENTEFECHAFACTURA", "PREGUNTASEXPEDIENTENUMEROFACTURA", "PREGUNTASEXPEDIENTEPROVEEDOR",
			"PREGUNTASEXPEDIENTEIMPORTE", "PREGUNTASEXPEDIENTEIMPORTEADMITIDO",
			"PREGUNTASEXPEDIENTEOBSERVACIONESTECNICOCAS", "PREGUNTASEXPEDIENTEOBSERVACIONESTECNICOEUS",
			"PREGUNTASEXPEDIENTEFECHAREGISTRO", "PREGUNTASEXPEDIENTEUSUARIOREGISTRO",
			"PREGUNTASEXPEDIENTEIDPREGUNTAPADREEXP", "CONCEPTO" };

	private JdbcTemplate jdbcTemplate;

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

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();

			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(resultSet.getInt("IDINSPECCION"));

			preguntasExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			preguntasExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntasExpediente.setIdPreguntaPadreExpediente(resultSet.getInt("IDPREGUNTAPADREEXP"));
			preguntasExpediente.setInspeccion(inspeccion);
			preguntasExpediente.setOrden(resultSet.getLong("ORDEN"));
			preguntasExpediente.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasExpediente.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasExpediente.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasExpediente.setFechaFactura(resultSet.getDate("FECHAFACTURA"));
			preguntasExpediente.setNumeroFactura(resultSet.getString("NUMEROFACTURA"));
			preguntasExpediente.setProveedor(resultSet.getString("PROVEEDOR"));
			preguntasExpediente.setImporte(resultSet.getBigDecimal("IMPORTE"));
			preguntasExpediente.setImporteAdmitido(resultSet.getBigDecimal("IMPORTEADMITIDO"));
			preguntasExpediente.setObservacionesTecnicoCas(resultSet.getString("OBSERVACIONESTECNICOCAS"));
			preguntasExpediente.setObservacionesTecnicoEus(resultSet.getString("OBSERVACIONESTECNICOEUS"));
			preguntasExpediente.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			return preguntasExpediente;
		}
	};

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

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

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(resultSet.getInt("ISINSPECCION"));

			preguntasExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			preguntasExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntasExpediente.setIdPreguntaPadreExpediente(resultSet.getInt("IDPREGUNTAPADREEXP"));
			preguntasExpediente.setInspeccion(inspeccion);
			preguntasExpediente.setOrden(resultSet.getLong("ORDEN"));
			preguntasExpediente.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasExpediente.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasExpediente.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasExpediente.setFechaFactura(resultSet.getDate("FECHAFACTURA"));
			preguntasExpediente.setNumeroFactura(resultSet.getString("NUMEROFACTURA"));
			preguntasExpediente.setProveedor(resultSet.getString("PROVEEDOR"));
			preguntasExpediente.setImporte(resultSet.getBigDecimal("IMPORTE"));
			preguntasExpediente.setImporteAdmitido(resultSet.getBigDecimal("IMPORTEADMITIDO"));
			preguntasExpediente.setObservacionesTecnicoCas(resultSet.getString("OBSERVACIONESTECNICOCAS"));
			preguntasExpediente.setObservacionesTecnicoEus(resultSet.getString("OBSERVACIONESTECNICOEUS"));
			preguntasExpediente.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

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

	private RowMapper<PreguntasRespuestasExpediente> rwMapPreguntasRespuestasValidar = new RowMapper<PreguntasRespuestasExpediente>() {
		@Override
		public PreguntasRespuestasExpediente mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
			preguntasExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			preguntasExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntasExpediente.setIdPreguntaPadreExpediente(resultSet.getInt("IDPREGUNTAPADREEXP"));
			if (resultSet.wasNull()) {
				preguntasExpediente.setIdPreguntaPadreExpediente(null);
			}
			preguntasExpediente.setOrden(resultSet.getLong("ORDEN"));
			preguntasExpediente.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasExpediente.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasExpediente.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasExpediente.setValorValidar(resultSet.getString("VALORVALIDAR"));
			preguntasExpediente.setIdentObjEstablecimiento(resultSet.getString("IDENTOBJESTABLECIMIENTO"));
			preguntasExpediente.setDescrObjEstablecimiento(resultSet.getString("DESCROBJESTABLECIMIENTO"));
			preguntasExpediente.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntasExpediente.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			RespuestasExpediente respuestasExpediente = new RespuestasExpediente();
			respuestasExpediente.setIdRespuestaExpediente(resultSet.getInt("IDRESPUESTAEXPEDIENTE"));
			if (resultSet.wasNull()) {
				respuestasExpediente.setIdRespuestaExpediente(null);
			}
			PreguntasExpediente preguntaExpediente = new PreguntasExpediente();
			preguntaExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTERESPUESTA"));
			respuestasExpediente.setPreguntaExpediente(preguntaExpediente);
			if (resultSet.wasNull()) {
				respuestasExpediente.setPreguntaExpediente(null);
			}
			respuestasExpediente.setRespuesta(resultSet.getString("RESPUESTA"));

			PreguntasRespuestasExpediente preguntasRespuestasExpediente = new PreguntasRespuestasExpediente();
			preguntasRespuestasExpediente.setPreguntasExpediente(preguntasExpediente);
			preguntasRespuestasExpediente.setRespuestasExpediente(respuestasExpediente);

			return preguntasRespuestasExpediente;
		}
	};

	private RowMapper<PreguntasRespuestasExpediente> rwMapPreguntasRespuestas = new RowMapper<PreguntasRespuestasExpediente>() {
		@Override
		public PreguntasRespuestasExpediente mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
			preguntasExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			preguntasExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntasExpediente.setIdPreguntaPadreExpediente(resultSet.getInt("IDPREGUNTAPADREEXP"));
			if (resultSet.wasNull()) {
				preguntasExpediente.setIdPreguntaPadreExpediente(null);
			}
			preguntasExpediente.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasExpediente.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasExpediente.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasExpediente.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			RespuestasExpediente respuestasExpediente = new RespuestasExpediente();
			respuestasExpediente.setIdRespuestaExpediente(resultSet.getInt("IDRESPUESTAEXPEDIENTE"));
			if (resultSet.wasNull()) {
				respuestasExpediente.setIdRespuestaExpediente(null);
			}
			PreguntasExpediente preguntaExpediente = new PreguntasExpediente();
			preguntaExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTERESPUESTA"));
			respuestasExpediente.setPreguntaExpediente(preguntaExpediente);
			if (resultSet.wasNull()) {
				respuestasExpediente.setPreguntaExpediente(null);
			}
			respuestasExpediente.setRespuesta(resultSet.getString("RESPUESTA"));

			PreguntasRespuestasExpediente preguntasRespuestasExpediente = new PreguntasRespuestasExpediente();
			preguntasRespuestasExpediente.setPreguntasExpediente(preguntasExpediente);
			preguntasRespuestasExpediente.setRespuestasExpediente(respuestasExpediente);

			return preguntasRespuestasExpediente;
		}
	};

	private RowMapper<OpcionesPreExp> rwMapOpcionesPreExp = new RowMapper<OpcionesPreExp>() {
		@Override
		public OpcionesPreExp mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			OpcionesPreExp opcionesPreExp = new OpcionesPreExp();
			opcionesPreExp.setIdOpcionPreExp(resultSet.getInt("IDOPCIONPREEXP"));
			opcionesPreExp.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			opcionesPreExp.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			opcionesPreExp.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			opcionesPreExp.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			return opcionesPreExp;
		}
	};

	private RowMapper<DatosValidarWS> rwMapDatosValidarWS = new RowMapper<DatosValidarWS>() {
		@Override
		public DatosValidarWS mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DatosValidarWS datosValidarWS = new DatosValidarWS();
			datosValidarWS.setIdentificadorDatoEstablecimiento(resultSet.getString("IDENTDATOESTABLECIMIENTO"));
			datosValidarWS.setValorValidar(resultSet.getString("RESPUESTA"));

			if (Constantes.TIPO_PREGUNTA_SINO == resultSet.getInt("IDTIPOPREGUNTA")) {
				if (Constantes.SINO_SI_CASTELLANO.equals(datosValidarWS.getValorValidar())
						|| Constantes.SINO_SI_EUSKERA.equals(datosValidarWS.getValorValidar())) {
					datosValidarWS.setValorValidar(Constantes.SI_WS);
				} else if (Constantes.SINO_NO_CASTELLANO.equals(datosValidarWS.getValorValidar())
						|| Constantes.SINO_NO_EUSKERA.equals(datosValidarWS.getValorValidar())) {
					datosValidarWS.setValorValidar(Constantes.NO_WS);
				} else if (Constantes.SINO_NP.equals(datosValidarWS.getValorValidar())) {
					return null;
				}
			}

			return datosValidarWS;
		}
	};

	private RowMapper<PreguntasExpediente> rwMapInformeTabla = new RowMapper<PreguntasExpediente>() {
		@Override
		public PreguntasExpediente mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(resultSet.getInt("IDINSPECCION"));

			preguntasExpediente.setIdPreguntaExpediente(resultSet.getInt("IDPREGUNTAEXPEDIENTE"));
			preguntasExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntasExpediente.setIdPreguntaPadreExpediente(resultSet.getInt("IDPREGUNTAPADREEXP"));
			preguntasExpediente.setInspeccion(inspeccion);
			preguntasExpediente.setOrden(resultSet.getLong("ORDEN"));
			preguntasExpediente.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasExpediente.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasExpediente.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasExpediente.setFechaFactura(resultSet.getDate("FECHAFACTURA"));
			preguntasExpediente.setNumeroFactura(resultSet.getString("NUMEROFACTURA"));
			preguntasExpediente.setProveedor(resultSet.getString("PROVEEDOR"));
			preguntasExpediente.setImporte(resultSet.getBigDecimal("IMPORTE"));
			preguntasExpediente.setImporteAdmitido(resultSet.getBigDecimal("IMPORTEADMITIDO"));
			preguntasExpediente.setObservacionesTecnicoCas(resultSet.getString("OBSERVACIONESTECNICOCAS"));
			preguntasExpediente.setObservacionesTecnicoEus(resultSet.getString("OBSERVACIONESTECNICOEUS"));
			preguntasExpediente.setConcepto(resultSet.getString("CONCEPTO"));
			if (resultSet.wasNull()) {
				preguntasExpediente.setConcepto(null);
			}
			preguntasExpediente.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));
			preguntasExpediente.setIdRespuestaExpediente(resultSet.getInt("IDRESPUESTAEXPEDIENTE"));
			if (resultSet.wasNull()) {
				preguntasExpediente.setIdRespuestaExpediente(null);
			}
			preguntasExpediente.setResultado(resultSet.getString("RESPUESTA"));
			preguntasExpediente.setObservacionesInspeccionCas(resultSet.getString("OBSERVACIONESINSPECCIONCAS"));
			preguntasExpediente.setObservacionesInspeccionEus(resultSet.getString("OBSERVACIONESINSPECCIONEUS"));

			return preguntasExpediente;
		}
	};

	private RowMapper<PreguntaRespuestaExpediente> rwMapPreguntasRespuestasExpedienteREST = new RowMapper<PreguntaRespuestaExpediente>() {
		@Override
		public PreguntaRespuestaExpediente mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntaRespuestaExpediente preguntaRespuestaExpediente = new PreguntaRespuestaExpediente();
			preguntaRespuestaExpediente.setIdPreguntaExpediente(resultSet.getInt("idpreguntaexpediente"));
			preguntaRespuestaExpediente.setIdPreguntaMovil(resultSet.getString("IDPREGUNTAMOVIL"));
			preguntaRespuestaExpediente.setOrden(resultSet.getInt("orden"));
			preguntaRespuestaExpediente.setDescripcionCastellano(resultSet.getString("descripcioncastellano"));
			preguntaRespuestaExpediente.setDescripcionEuskera(resultSet.getString("descripcioneuskera"));
			preguntaRespuestaExpediente.setIdTipoPregunta(resultSet.getInt("idtipopregunta"));
			preguntaRespuestaExpediente.setRespuesta(resultSet.getString("respuesta"));

			return preguntaRespuestaExpediente;
		}
	};

	private RowMapper<PreguntaRespuestaValidacion> rwMapPreguntasRespuestasValidacionREST = new RowMapper<PreguntaRespuestaValidacion>() {
		@Override
		public PreguntaRespuestaValidacion mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntaRespuestaValidacion preguntaRespuestaValidacion = new PreguntaRespuestaValidacion();
			preguntaRespuestaValidacion.setIdPreguntaExpediente(resultSet.getInt("idpreguntaexpediente"));
			preguntaRespuestaValidacion.setOrden(resultSet.getInt("orden"));
			preguntaRespuestaValidacion.setDescripcionCastellano(resultSet.getString("descripcioncastellano"));
			preguntaRespuestaValidacion.setDescripcionEuskera(resultSet.getString("descripcioneuskera"));
			preguntaRespuestaValidacion.setIdTipoPregunta(resultSet.getInt("idtipopregunta"));
			preguntaRespuestaValidacion.setValorValidar(resultSet.getString("valorvalidar"));
			preguntaRespuestaValidacion.setRespuesta(resultSet.getString("respuesta"));

			return preguntaRespuestaValidacion;
		}
	};

	private RowMapper<PreguntaRespuestaRelConFac> rwMapPreguntasRespuestasRelConFacREST = new RowMapper<PreguntaRespuestaRelConFac>() {
		@Override
		public PreguntaRespuestaRelConFac mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntaRespuestaRelConFac preguntaRespuestaRelConFac = new PreguntaRespuestaRelConFac();
			preguntaRespuestaRelConFac.setIdPreguntaExpediente(resultSet.getInt("idpreguntaexpediente"));
			preguntaRespuestaRelConFac.setOrden(resultSet.getInt("orden"));
			preguntaRespuestaRelConFac.setDescripcionCastellano(resultSet.getString("descripcioncastellano"));
			preguntaRespuestaRelConFac.setDescripcionEuskera(resultSet.getString("descripcioneuskera"));
			preguntaRespuestaRelConFac.setIdTipoPregunta(resultSet.getInt("idtipopregunta"));
			preguntaRespuestaRelConFac.setFechaFactura(resultSet.getDate("fechafactura"));
			preguntaRespuestaRelConFac.setNumeroFactura(resultSet.getString("numerofactura"));
			preguntaRespuestaRelConFac.setProveedor(resultSet.getString("proveedor"));
			preguntaRespuestaRelConFac.setImporte(resultSet.getBigDecimal("importe"));
			preguntaRespuestaRelConFac.setImporteAdmitido(resultSet.getBigDecimal("importeadmitido"));
			preguntaRespuestaRelConFac.setObservacionesInsCastellano(resultSet.getString("observacionescastellano"));
			preguntaRespuestaRelConFac.setObservacionesInsEuskera(resultSet.getString("observacioneseuskera"));
			preguntaRespuestaRelConFac.setRespuesta(resultSet.getString("respuesta"));
			preguntaRespuestaRelConFac.setNotasInsCastellano(resultSet.getString("notasinscastellano"));
			preguntaRespuestaRelConFac.setNotasInsEuskera(resultSet.getString("notasinseuskera"));

			return preguntaRespuestaRelConFac;
		}
	};

	private RowMapper<String> rwMapIdsObjValidarWS = new RowMapper<String>() {
		@Override
		public String mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			return (resultSet.getString("IDENTOBJESTABLECIMIENTO"));
		}
	};

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

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Insertamos row in the PreguntasExpediente table.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @return PreguntasExpediente
	 */
	@Override
	public PreguntasExpediente add(PreguntasExpediente preguntasexpediente) {

		int idPreguntaExpediente = this.jdbcTemplate.queryForObject("SELECT AB79.S_AB7908T00.NEXTVAL FROM DUAL",
				Integer.class);
		String query = "INSERT INTO PREGUNTAS_EXPEDIENTE (ID_PREGUNTA_EXPEDIENTE, ID_PREGUNTA_PADRE_EXP, ID_INSPECCION, ID_PREGUNTA_PROTOCOLO, ORDEN, DESCRIPCION_CASTELLANO, DESCRIPCION_EUSKERA, ID_TIPO_PREGUNTA, FECHA_FACTURA, NUMERO_FACTURA, PROVEEDOR, IMPORTE, IMPORTE_ADMITIDO, OBSERVACIONES_INSPECCION_CAS, OBSERVACIONES_INSPECCION_EUS, USUARIO_REGISTRO,VALOR_VALIDAR,IDENT_OBJ_ESTABLECIMIENTO, DESCR_OBJ_ESTABLECIMIENTO, CONCEPTO, ID_PREGUNTA_MOVIL, FECHA_REGISTRO) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,sysdate)";

		this.jdbcTemplate.update(query, idPreguntaExpediente, preguntasexpediente.getIdPreguntaExpediente(),
				preguntasexpediente.getInspeccion().getIdInspeccion(), preguntasexpediente.getIdPreguntaProtocolo(),
				preguntasexpediente.getOrden(), preguntasexpediente.getDescripcionCastellano(),
				preguntasexpediente.getDescripcionEuskera(), preguntasexpediente.getIdTipoPregunta(),
				preguntasexpediente.getFechaFactura(), preguntasexpediente.getNumeroFactura(),
				preguntasexpediente.getProveedor(), preguntasexpediente.getImporte(),
				preguntasexpediente.getImporteAdmitido(), preguntasexpediente.getObservacionesTecnicoCas(),
				preguntasexpediente.getObservacionesTecnicoEus(), preguntasexpediente.getUsuarioRegistro(),
				preguntasexpediente.getValorValidar(), preguntasexpediente.getIdentObjEstablecimiento(),
				preguntasexpediente.getDescrObjEstablecimiento(), preguntasexpediente.getConcepto(),
				preguntasexpediente.getIdPreguntaMovil());

		preguntasexpediente.setIdPreguntaExpediente(idPreguntaExpediente);
		return preguntasexpediente;
	}

	/**
	 * Updates a single row in the PreguntasExpediente table.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @return PreguntasExpediente
	 */
	@Override
	public PreguntasExpediente update(PreguntasExpediente preguntasExpediente) {
		String query = "UPDATE PREGUNTAS_EXPEDIENTE SET ID_PREGUNTA_PADRE_EXP=?, ID_INSPECCION=?, ORDEN=?, DESCRIPCION_CASTELLANO=?, DESCRIPCION_EUSKERA=?, ID_TIPO_PREGUNTA=?, FECHA_FACTURA=?, NUMERO_FACTURA=?, PROVEEDOR=?, IMPORTE=?, IMPORTE_ADMITIDO=?, OBSERVACIONES_INSPECCION_CAS=?, OBSERVACIONES_INSPECCION_EUS=?, FECHA_REGISTRO=SYSDATE, USUARIO_REGISTRO=? WHERE ID_PREGUNTA_EXPEDIENTE=?";

		this.jdbcTemplate.update(query, preguntasExpediente.getIdPreguntaPadreExpediente(),
				preguntasExpediente.getInspeccion().getIdInspeccion(), preguntasExpediente.getOrden(),
				preguntasExpediente.getDescripcionCastellano(), preguntasExpediente.getDescripcionEuskera(),
				preguntasExpediente.getIdTipoPregunta(), preguntasExpediente.getFechaFactura(),
				preguntasExpediente.getNumeroFactura(), preguntasExpediente.getProveedor(),
				preguntasExpediente.getImporte(), preguntasExpediente.getImporteAdmitido(),
				preguntasExpediente.getObservacionesTecnicoCas(), preguntasExpediente.getObservacionesTecnicoEus(),
				preguntasExpediente.getUsuarioUltmodificacion(), preguntasExpediente.getIdPreguntaExpediente());
		return preguntasExpediente;
	}

	@Override
	public PreguntasExpediente updatePregunta(PreguntasExpediente preguntaExpediente) {
		String query = "UPDATE PREGUNTAS_EXPEDIENTE SET DESCRIPCION_CASTELLANO=?, DESCRIPCION_EUSKERA=?, ID_TIPO_PREGUNTA=?, ORDEN=?, ID_PREGUNTA_MOVIL=?, FECHA_ULTMODIFICACION=SYSDATE, USUARIO_ULTMODIFICACION=? WHERE ID_PREGUNTA_EXPEDIENTE=?";

		this.jdbcTemplate.update(query, preguntaExpediente.getDescripcionCastellano(),
				preguntaExpediente.getDescripcionEuskera(), preguntaExpediente.getIdTipoPregunta(),
				preguntaExpediente.getOrden(), preguntaExpediente.getIdPreguntaMovil(),
				preguntaExpediente.getUsuarioUltmodificacion(), preguntaExpediente.getIdPreguntaExpediente());
		return preguntaExpediente;
	}

	/**
	 * Finds a single row in the PreguntasExpediente table.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @return PreguntasExpediente
	 */
	@Override
	@Transactional(readOnly = true)
	public PreguntasExpediente find(PreguntasExpediente preguntasexpediente) {
		String query = "SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP, t1.ID_INSPECCION IDINSPECCION, t1.ORDEN ORDEN, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t1.FECHA_FACTURA FECHAFACTURA, t1.NUMERO_FACTURA NUMEROFACTURA, t1.PROVEEDOR PROVEEDOR, t1.IMPORTE IMPORTE, t1.IMPORTE_ADMITIDO IMPORTEADMITIDO, t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS, t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO FROM PREGUNTAS_EXPEDIENTE t1 WHERE t1.ID_PREGUNTA_EXPEDIENTE = ?";

		List<PreguntasExpediente> preguntasexpedienteList = this.jdbcTemplate.query(query, this.rwMap,
				preguntasexpediente.getIdPreguntaExpediente());
		return DataAccessUtils.uniqueResult(preguntasexpedienteList);
	}

	@Override
	public PreguntasExpediente findByIdPreguntaMovil(PreguntasExpediente preguntaExpediente) {
		String query = "SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP, t1.ID_INSPECCION IDINSPECCION, t1.ORDEN ORDEN, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t1.FECHA_FACTURA FECHAFACTURA, t1.NUMERO_FACTURA NUMEROFACTURA, t1.PROVEEDOR PROVEEDOR, t1.IMPORTE IMPORTE, t1.IMPORTE_ADMITIDO IMPORTEADMITIDO, t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS, t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO FROM PREGUNTAS_EXPEDIENTE t1 WHERE t1.ID_PREGUNTA_MOVIL = ?";

		List<PreguntasExpediente> preguntasexpedienteList = this.jdbcTemplate.query(query, this.rwMap,
				preguntaExpediente.getIdPreguntaMovil());
		return DataAccessUtils.uniqueResult(preguntasexpedienteList);
	}

	@Override
	public List<PreguntasExpediente> findByInspeccion(Inspecciones inspeccion) {
		String query = "SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP, t1.ID_INSPECCION IDINSPECCION, t1.ORDEN ORDEN, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t1.FECHA_FACTURA FECHAFACTURA, t1.NUMERO_FACTURA NUMEROFACTURA, t1.PROVEEDOR PROVEEDOR, t1.IMPORTE IMPORTE, t1.IMPORTE_ADMITIDO IMPORTEADMITIDO, t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS, t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO FROM PREGUNTAS_EXPEDIENTE t1 WHERE t1.ID_INSPECCION = ?";
		return this.jdbcTemplate.query(query, this.rwMap, inspeccion.getIdInspeccion());
	}

	@Override
	public List<PreguntasRespuestasExpediente> findPreguntasRespuestasValidar(Inspecciones inspeccion) {
		String query = "SELECT DISTINCT t7.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t7.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t7.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP, t7.ORDEN ORDEN, t7.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t7.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t7.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t7.VALOR_VALIDAR VALORVALIDAR, t7.IDENT_OBJ_ESTABLECIMIENTO IDENTOBJESTABLECIMIENTO, t7.DESCR_OBJ_ESTABLECIMIENTO DESCROBJESTABLECIMIENTO, t7.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t7.FECHA_REGISTRO FECHAREGISTRO, t7.USUARIO_REGISTRO USUARIOREGISTRO, t8.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTERESPUESTA, t8.ID_RESPUESTA_EXPEDIENTE IDRESPUESTAEXPEDIENTE, t8.RESPUESTA RESPUESTA FROM INSPECCIONES t1, ORIGENES_INSPECCION t2, PROTOCOLOS t3, PREGUNTAS_PROTOCOLO t4, TIPOS_PREGUNTAS t5, REL_PRO_PRE t6, PREGUNTAS_EXPEDIENTE t7, RESPUESTAS_EXPEDIENTE t8 WHERE t1.ID_INSPECCION = ? AND t1.ID_ORIGEN_INSPECCION = t2.ID_ORIGEN_INSPECCION AND t1.ID_PROTOCOLO = t3.ID_PROTOCOLO AND t3.ID_PROTOCOLO = t6.ID_PROTOCOLO AND t4.ID_PREGUNTA_PROTOCOLO = t6.ID_PREGUNTA_PROTOCOLO AND t4.PREGUNTA_VALIDAR = 1 AND t4.ID_PREGUNTA_PROTOCOLO = t7.ID_PREGUNTA_PROTOCOLO AND t7.ID_TIPO_PREGUNTA = t5.ID_TIPO_PREGUNTA AND t1.ID_INSPECCION = t7.ID_INSPECCION AND t7.ID_PREGUNTA_EXPEDIENTE = t8.ID_PREGUNTA_EXPEDIENTE(+) AND (t7.ID_TIPO_PREGUNTA = "
				+ Constantes.TIPO_PREGUNTA_NUMERICO + " OR t7.ID_TIPO_PREGUNTA = " + Constantes.TIPO_PREGUNTA_FECHA
				+ " OR t7.ID_TIPO_PREGUNTA = " + Constantes.TIPO_PREGUNTA_TEXTO_LIBRE + " OR t7.ID_TIPO_PREGUNTA = "
				+ Constantes.TIPO_PREGUNTA_SINO + ") ORDER BY ORDEN ASC";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestasValidar, inspeccion.getIdInspeccion());
	}

	@Override
	public List<PreguntasRespuestasExpediente> findPreguntasRespuestasExpediente(Inspecciones inspeccion) {
		String query = "SELECT t4.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t4.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t4.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP, t4.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t4.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t4.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t4.FECHA_REGISTRO FECHAREGISTRO, t4.USUARIO_REGISTRO USUARIOREGISTRO, t5.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTERESPUESTA, t5.ID_RESPUESTA_EXPEDIENTE IDRESPUESTAEXPEDIENTE, t5.RESPUESTA RESPUESTA FROM INSPECCIONES t1, ORIGENES_INSPECCION t2, TIPOS_PREGUNTAS t3, PREGUNTAS_EXPEDIENTE t4, RESPUESTAS_EXPEDIENTE t5 WHERE t1.ID_INSPECCION = ? AND t1.ID_ORIGEN_INSPECCION = t2.ID_ORIGEN_INSPECCION AND t1.ID_INSPECCION = t4.ID_INSPECCION AND t4.ID_TIPO_PREGUNTA = t3.ID_TIPO_PREGUNTA AND t4.ID_PREGUNTA_EXPEDIENTE = t5.ID_PREGUNTA_EXPEDIENTE (+) AND t4.ID_PREGUNTA_PROTOCOLO IS NULL AND t4.IMPORTE IS NULL";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestas, inspeccion.getIdInspeccion());
	}

	@Override
	public List<OpcionesPreExp> findOpcionesPreExp() {
		String query = "SELECT t1.ID_OPCION_PRE_EXP IDOPCIONPREEXP, t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO FROM OPCIONES_PRE_EXP t1 WHERE 1=1";

		return this.jdbcTemplate.query(query, this.rwMapOpcionesPreExp);
	}

	@Override
	public List<DatosValidarWS> findDatosValidarWS(Inspecciones inspeccion, String idObjetosValidarWS) {
		StringBuilder query = new StringBuilder(
				"SELECT t2.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t3.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t4.RESPUESTA RESPUESTA FROM INSPECCIONES t1, PREGUNTAS_PROTOCOLO t2, PREGUNTAS_EXPEDIENTE t3, RESPUESTAS_EXPEDIENTE t4 WHERE t1.ID_INSPECCION = ? AND t1.ID_INSPECCION = t3.ID_INSPECCION AND t3.ID_PREGUNTA_PROTOCOLO IS NOT NULL AND t4.ID_PREGUNTA_EXPEDIENTE = t3.ID_PREGUNTA_EXPEDIENTE AND t3.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO AND t2.PREGUNTA_VALIDAR = 1");

		if (idObjetosValidarWS == null) {
			query.append(" AND t3.IDENT_OBJ_ESTABLECIMIENTO IS NULL");
			return this.jdbcTemplate.query(query.toString(), this.rwMapDatosValidarWS, inspeccion.getIdInspeccion());
		} else {
			query.append(" AND t3.IDENT_OBJ_ESTABLECIMIENTO = ?");
			return this.jdbcTemplate.query(query.toString(), this.rwMapDatosValidarWS, inspeccion.getIdInspeccion(),
					idObjetosValidarWS);
		}

	}

	@Override
	public List<String> findIdsObjValidarWS(Inspecciones inspeccion) {
		String query = "SELECT DISTINCT t2.IDENT_OBJ_ESTABLECIMIENTO IDENTOBJESTABLECIMIENTO FROM INSPECCIONES t1, PREGUNTAS_EXPEDIENTE t2 WHERE t1.ID_INSPECCION = ? AND t1.ID_INSPECCION = t2.ID_INSPECCION AND t2.IDENT_OBJ_ESTABLECIMIENTO IS NOT NULL";

		return this.jdbcTemplate.query(query, this.rwMapIdsObjValidarWS, inspeccion.getIdInspeccion());
	}

	/**
	 * Removes a single row in the PreguntasExpediente table.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @return
	 */
	@Override
	public void remove(PreguntasExpediente preguntasexpediente) {
		String query = "DELETE FROM PREGUNTAS_EXPEDIENTE WHERE ID_PREGUNTA_EXPEDIENTE=?";
		this.jdbcTemplate.update(query, preguntasexpediente.getIdPreguntaExpediente());
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	@Override
	public List<PreguntasExpediente> getMultiple(PreguntasExpediente filterPreguntasExpediente,
			TableRequestDto tableRequestDto, Boolean startsWith) {

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

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

		StringBuilder sbMultipleSQL = TableManager.getSelectMultipleQuery(tableRequestDto, PreguntasExpediente.class,
				params, "ID_PREGUNTA_EXPEDIENTE");

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

	/**
	 * Finds a list of rows in the PreguntasExpediente table.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<PreguntasExpediente>
	 */
	@Override
	@Transactional(readOnly = true)
	public List<PreguntasExpediente> findAll(PreguntasExpediente preguntasexpediente, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		query.append("FROM PREGUNTAS_EXPEDIENTE t1 ");

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

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

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

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

	/**
	 * Finds rows in the PreguntasExpediente table using like.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<PreguntasExpediente>
	 */
	@Override
	@Transactional(readOnly = true)
	public List<PreguntasExpediente> findAllLike(PreguntasExpediente preguntasexpediente,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS, t1.CONCEPTO CONCEPTO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_RESPUESTA_EXPEDIENTE IDRESPUESTAEXPEDIENTE,t2.RESPUESTA RESPUESTA,t2.NOTAS_INSPECTOR_CAS OBSERVACIONESINSPECCIONCAS, t2.NOTAS_INSPECTOR_EUS OBSERVACIONESINSPECCIONEUS ");
		query.append("FROM PREGUNTAS_EXPEDIENTE t1, RESPUESTAS_EXPEDIENTE t2 ");

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

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

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

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

	@Override
	public List<PreguntaRespuestaExpediente> findPreguntasRespuestasExpedienteREST(Integer idInspeccion) {
		String query = "SELECT t1.id_pregunta_expediente idpreguntaexpediente, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.orden orden, t1.descripcion_castellano descripcioncastellano, t1.descripcion_euskera descripcioneuskera, t1.id_tipo_pregunta idtipopregunta, t2.respuesta respuesta FROM preguntas_expediente t1, respuestas_expediente t2 WHERE t1.id_inspeccion = ? AND t1.id_pregunta_protocolo IS NULL AND t1.importe IS NULL AND t2.id_pregunta_expediente (+) = t1.id_pregunta_expediente";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestasExpedienteREST, idInspeccion);
	}

	@Override
	public List<PreguntaRespuestaValidacion> findPreguntasRespuestasValidacionREST(Integer idInspeccion) {
		String query = "SELECT t7.id_pregunta_expediente idpreguntaexpediente, t7.orden orden, t7.descripcion_castellano descripcioncastellano, t7.descripcion_euskera descripcioneuskera, t7.id_tipo_pregunta idtipopregunta, t7.valor_validar valorvalidar, t8.respuesta respuesta FROM inspecciones t1, origenes_inspeccion t2, protocolos t3, preguntas_protocolo t4, tipos_preguntas t5, rel_pro_pre t6, preguntas_expediente t7, respuestas_expediente t8 WHERE t1.id_inspeccion = ? AND t1.id_origen_inspeccion = t2.id_origen_inspeccion AND t1.id_protocolo = t3.id_protocolo AND t3.id_protocolo = t6.id_protocolo AND t4.id_pregunta_protocolo = t6.id_pregunta_protocolo AND t4.pregunta_validar = "
				+ Constantes.VALIDAR
				+ " AND t4.id_pregunta_protocolo = t7.id_pregunta_protocolo AND t7.id_tipo_pregunta = t5.id_tipo_pregunta AND t1.id_inspeccion = t7.id_inspeccion AND t7.id_pregunta_expediente = t8.id_pregunta_expediente (+) AND (t7.id_tipo_pregunta = "
				+ Constantes.TIPO_PREGUNTA_NUMERICO + " OR t7.id_tipo_pregunta = " + Constantes.TIPO_PREGUNTA_FECHA
				+ " OR t7.id_tipo_pregunta = " + Constantes.TIPO_PREGUNTA_TEXTO_LIBRE + " OR t7.id_tipo_pregunta = "
				+ Constantes.TIPO_PREGUNTA_SINO + ")";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestasValidacionREST, idInspeccion);
	}

	@Override
	public List<PreguntaRespuestaRelConFac> findPreguntasRespuestasRelConFacREST(Integer idInspeccion) {
		String query = "SELECT t1.id_pregunta_expediente idpreguntaexpediente, t1.orden orden, t1.descripcion_castellano descripcioncastellano, t1.descripcion_euskera descripcioneuskera, t1.id_tipo_pregunta idtipopregunta, t1.fecha_factura fechafactura, t1.numero_factura numerofactura, t1.proveedor proveedor, t1.importe importe, t1.importe_admitido importeadmitido, t1.observaciones_inspeccion_cas observacionescastellano, t1.observaciones_inspeccion_eus observacioneseuskera, t2.respuesta respuesta, t2.notas_inspector_cas notasinscastellano, t2.notas_inspector_eus notasinseuskera FROM preguntas_expediente t1, respuestas_expediente t2 WHERE t1.id_inspeccion = ? AND t1.importe IS NOT NULL AND t2.id_pregunta_expediente (+) = t1.id_pregunta_expediente";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestasRelConFacREST, idInspeccion);
	}

	@Override
	public List<PreguntasExpediente> findAllLikeInformeTabla(PreguntasExpediente preguntasExpediente,
			TableRequestDto tableRequestDto, boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.CONCEPTO CONCEPTO,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO, t2.ID_RESPUESTA_EXPEDIENTE IDRESPUESTAEXPEDIENTE, t2.RESPUESTA RESPUESTA, t2.NOTAS_INSPECTOR_CAS OBSERVACIONESINSPECCIONCAS, t2.NOTAS_INSPECTOR_EUS OBSERVACIONESINSPECCIONEUS ");
		query.append("FROM PREGUNTAS_EXPEDIENTE t1, RESPUESTAS_EXPEDIENTE t2 ");

		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_INSPECCION = ? AND t1.ID_PREGUNTA_EXPEDIENTE = t2.ID_PREGUNTA_EXPEDIENTE(+) AND t1.ID_TIPO_PREGUNTA = "
						+ Constantes.TIPO_PREGUNTA_CORRECTO_INCORRECTO + " AND t1.IMPORTE IS NOT NULL");
		query.append(where);

		return this.jdbcTemplate.query(query.toString(), this.rwMapInformeTabla,
				preguntasExpediente.getInspeccion().getIdInspeccion());
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

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

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

	/**
	 * Counts rows in the PreguntasExpediente table using like.
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Override
	@Transactional(readOnly = true)
	public Long findAllLikeCount(PreguntasExpediente preguntasexpediente, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM PREGUNTAS_EXPEDIENTE t1 ");

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

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

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

	@Transactional(readOnly = true)
	@Override
	public Long findAllLikeCountInformeTabla(PreguntasExpediente preguntasExpediente, boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PREGUNTAS_EXPEDIENTE t1, RESPUESTAS_EXPEDIENTE t2 ");

		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_INSPECCION = ? AND t1.ID_PREGUNTA_EXPEDIENTE = t2.ID_PREGUNTA_EXPEDIENTE(+) ");
		query.append(where);

		List<Object> params = new ArrayList<Object>();
		params.add(preguntasExpediente.getInspeccion().getIdInspeccion());
		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	/**
	 * Reorder the data list of PreguntasExpediente selected for rup_table
	 *
	 * @param preguntasexpediente
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<PreguntasExpediente>>
	 */
	@Override
	public List<TableRowDto<PreguntasExpediente>> reorderSelection(PreguntasExpediente preguntasexpediente,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		// FROM
		query.append("FROM PREGUNTAS_EXPEDIENTE t1 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(preguntasexpediente, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto,
				PreguntasExpediente.class, filterParamList, "ID_PREGUNTA_EXPEDIENTE");

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

	@Override
	public List<TableRowDto<PreguntasExpediente>> reorderSelectionInformeTabla(
			PreguntasExpediente filterPreguntasExpediente, TableRequestDto tableRequestDto, boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_RESPUESTA_EXPEDIENTE IDRESPUESTAEXPEDIENTE,t2.RESPUESTA RESPUESTA,t2NOTAS_INSPECTOR_CAS OBSERVACIONESINSPECCIONCAS, t2.NOTAS_INSPECTOR_EUS OBSERVACIONESINSPECCIONEUS ");
		// FROM
		query.append("FROM PREGUNTAS_EXPEDIENTE t1, RESPUESTAS_EXPEDIENTE t2 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterPreguntasExpediente, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE 1=1 AND t1.ID_PREGUNTA_EXPEDIENTE = t2.ID_PREGUNTA_EXPEDIENTE(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto,
				PreguntasExpediente.class, filterParamList, "ID_PREGUNTA_EXPEDIENTE");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            PreguntasExpediente
	 * @param searchParams
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<PreguntasExpediente>>
	 */
	@Override
	public List<TableRowDto<PreguntasExpediente>> search(PreguntasExpediente filterParams,
			PreguntasExpediente searchParams, TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		// FROM
		query.append("FROM PREGUNTAS_EXPEDIENTE t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

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

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

		// SQL
		StringBuilder sbReorderSelectionSQL = TableManager.getSearchQuery(query, tableRequestDto,
				PreguntasExpediente.class, filterParamList, searchSQL, searchParamList, from_alias,
				"ID_PREGUNTA_EXPEDIENTE");

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterpreguntasexpediente
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(PreguntasExpediente filterpreguntasexpediente, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE, t1.ID_PREGUNTA_PADRE_EXP IDPREGUNTAPADREEXP,t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		// FROM
		query.append("FROM PREGUNTAS_EXPEDIENTE t1 ");

		// WHERE
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterpreguntasexpediente, 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 = TableManager.getRemoveMultipleQuery(tableRequestDto,
				PreguntasExpediente.class, query, params, "ID_PREGUNTA_EXPEDIENTE");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical PreguntasExpediente table.
	 *
	 * @param filterPreguntasExpediente
	 *            PreguntasExpediente
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<JerarquiaDto<PreguntasExpediente>>
	 */
	@Override
	public List<JerarquiaDto<PreguntasExpediente>> findAllLikeJerarquia(PreguntasExpediente filterPreguntasExpediente,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_EXPEDIENTE IDPREGUNTAEXPEDIENTE,t1.ID_PREGUNTA_MOVIL IDPREGUNTAMOVIL, t1.ID_INSPECCION IDINSPECCION,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_FACTURA FECHAFACTURA,t1.NUMERO_FACTURA NUMEROFACTURA,t1.PROVEEDOR PROVEEDOR,t1.IMPORTE IMPORTE,t1.IMPORTE_ADMITIDO IMPORTEADMITIDO,t1.OBSERVACIONES_INSPECCION_CAS OBSERVACIONESTECNICOCAS,t1.OBSERVACIONES_INSPECCION_EUS OBSERVACIONESTECNICOEUS,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PREGUNTA_EXPEDIENTE PREGUNTASEXPEDIENTEIDPREGUNTAEXPEDIENTE,t2.ID_INSPECCION PREGUNTASEXPEDIENTEIDINSPECCION,t2.ORDEN PREGUNTASEXPEDIENTEORDEN,t2.DESCRIPCION_CASTELLANO PREGUNTASEXPEDIENTEDESCRIPCIONCASTELLANO,t2.DESCRIPCION_EUSKERA PREGUNTASEXPEDIENTEDESCRIPCIONEUSKERA,t2.ID_TIPO_PREGUNTA PREGUNTASEXPEDIENTEIDTIPOPREGUNTA,t2.FECHA_FACTURA PREGUNTASEXPEDIENTEFECHAFACTURA,t2.NUMERO_FACTURA PREGUNTASEXPEDIENTENUMEROFACTURA,t2.PROVEEDOR PREGUNTASEXPEDIENTEPROVEEDOR,t2.IMPORTE PREGUNTASEXPEDIENTEIMPORTE,t2.IMPORTE_ADMITIDO PREGUNTASEXPEDIENTEIMPORTEADMITIDO,t2.OBSERVACIONES_INSPECCION_CAS PREGUNTASEXPEDIENTEOBSERVACIONESTECNICOCAS,t2.OBSERVACIONES_INSPECCION_EUS PREGUNTASEXPEDIENTEOBSERVACIONESTECNICOEUS,t2.FECHA_REGISTRO PREGUNTASEXPEDIENTEFECHAREGISTRO,t2.USUARIO_REGISTRO PREGUNTASEXPEDIENTEUSUARIOREGISTRO,t2.ID_PREGUNTA_PADRE_EXP PREGUNTASEXPEDIENTEIDPREGUNTAPADREEXP ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM PREGUNTAS_EXPEDIENTE t1
		// ,PREGUNTAS_EXPEDIENTE t2 ");
		List<String> from = new ArrayList<String>();
		from.add("PREGUNTAS_EXPEDIENTE");
		from.add("PREGUNTAS_EXPEDIENTE");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/*
	 * MÉTODOS PRIVADOS
	 */

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

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

		if (preguntasexpediente != null && preguntasexpediente.getIdPreguntaExpediente() != null) {
			where.append(" AND t1.ID_PREGUNTA_EXPEDIENTE = ?");
			params.add(preguntasexpediente.getIdPreguntaExpediente());
		}
		if (preguntasexpediente != null && preguntasexpediente.getIdPreguntaPadreExpediente() != null) {
			where.append(" AND t1.ID_PREGUNTA_PADRE_EXP = ?");
			params.add(preguntasexpediente.getIdPreguntaPadreExpediente());
		}
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdPreguntaExpediente()
		// != null ) {
		// where.append(" AND t2.ID_PREGUNTA_EXPEDIENTE = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdPreguntaExpediente());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente()
		// != null &&
		// preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente().getIdPreguntaExpediente()
		// != null ) {
		// where.append(" AND t2.ID_PREGUNTA_PADRE_EXP = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente().getIdPreguntaExpediente());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdInspeccion() !=
		// null ) {
		// where.append(" AND t2.ID_INSPECCION = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdInspeccion());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getOrden() != null ) {
		// where.append(" AND t2.ORDEN = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getOrden());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getDescripcionCastellano()
		// != null ) {
		// where.append(" AND t2.DESCRIPCION_CASTELLANO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getDescripcionCastellano());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getDescripcionEuskera()
		// != null ) {
		// where.append(" AND t2.DESCRIPCION_EUSKERA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getDescripcionEuskera());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdTipoPregunta() !=
		// null ) {
		// where.append(" AND t2.ID_TIPO_PREGUNTA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdTipoPregunta());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getFechaFactura() !=
		// null ) {
		// where.append(" AND t2.FECHA_FACTURA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getFechaFactura());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getNumeroFactura() !=
		// null ) {
		// where.append(" AND t2.NUMERO_FACTURA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getNumeroFactura());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getProveedor() != null )
		// {
		// where.append(" AND t2.PROVEEDOR = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getProveedor());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getImporte() != null ) {
		// where.append(" AND t2.IMPORTE = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getImporte());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getImporteAdmitido() !=
		// null ) {
		// where.append(" AND t2.IMPORTE_ADMITIDO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getImporteAdmitido());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoCas()
		// != null ) {
		// where.append(" AND t2.OBSERVACIONES_INSPECCION_CAS = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoCas());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoEus()
		// != null ) {
		// where.append(" AND t2.OBSERVACIONES_INSPECCION_EUS = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoEus());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getFechaRegistro() !=
		// null ) {
		// where.append(" AND t2.FECHA_REGISTRO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getFechaRegistro());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getUsuarioRegistro() !=
		// null ) {
		// where.append(" AND t2.USUARIO_REGISTRO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getUsuarioRegistro());
		// }
		if (preguntasexpediente != null && preguntasexpediente.getInspeccion() != null
				&& preguntasexpediente.getInspeccion().getIdInspeccion() != null) {
			where.append(" AND t1.ID_INSPECCION = ?");
			params.add(preguntasexpediente.getInspeccion().getIdInspeccion());
		}
		if (preguntasexpediente != null && preguntasexpediente.getOrden() != null) {
			where.append(" AND t1.ORDEN = ?");
			params.add(preguntasexpediente.getOrden());
		}
		if (preguntasexpediente != null && preguntasexpediente.getDescripcionCastellano() != null) {
			where.append(" AND t1.DESCRIPCION_CASTELLANO = ?");
			params.add(preguntasexpediente.getDescripcionCastellano());
		}
		if (preguntasexpediente != null && preguntasexpediente.getDescripcionEuskera() != null) {
			where.append(" AND t1.DESCRIPCION_EUSKERA = ?");
			params.add(preguntasexpediente.getDescripcionEuskera());
		}
		if (preguntasexpediente != null && preguntasexpediente.getIdTipoPregunta() != null) {
			where.append(" AND t1.ID_TIPO_PREGUNTA = ?");
			params.add(preguntasexpediente.getIdTipoPregunta());
		}
		if (preguntasexpediente != null && preguntasexpediente.getFechaFactura() != null) {
			where.append(" AND t1.FECHA_FACTURA = ?");
			params.add(preguntasexpediente.getFechaFactura());
		}
		if (preguntasexpediente != null && preguntasexpediente.getNumeroFactura() != null) {
			where.append(" AND t1.NUMERO_FACTURA = ?");
			params.add(preguntasexpediente.getNumeroFactura());
		}
		if (preguntasexpediente != null && preguntasexpediente.getProveedor() != null) {
			where.append(" AND t1.PROVEEDOR = ?");
			params.add(preguntasexpediente.getProveedor());
		}
		if (preguntasexpediente != null && preguntasexpediente.getImporte() != null) {
			where.append(" AND t1.IMPORTE = ?");
			params.add(preguntasexpediente.getImporte());
		}
		if (preguntasexpediente != null && preguntasexpediente.getImporteAdmitido() != null) {
			where.append(" AND t1.IMPORTE_ADMITIDO = ?");
			params.add(preguntasexpediente.getImporteAdmitido());
		}
		if (preguntasexpediente != null && preguntasexpediente.getObservacionesTecnicoCas() != null) {
			where.append(" AND t1.OBSERVACIONES_INSPECCION_CAS = ?");
			params.add(preguntasexpediente.getObservacionesTecnicoCas());
		}
		if (preguntasexpediente != null && preguntasexpediente.getObservacionesTecnicoEus() != null) {
			where.append(" AND t1.OBSERVACIONES_INSPECCION_EUS = ?");
			params.add(preguntasexpediente.getObservacionesTecnicoEus());
		}
		if (preguntasexpediente != null && preguntasexpediente.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(preguntasexpediente.getUsuarioRegistro());
		}

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

		return mapWhere;
	}

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

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

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

		if (preguntasexpediente != null && preguntasexpediente.getIdPreguntaExpediente() != null) {
			where.append(" AND t1.ID_PREGUNTA_EXPEDIENTE = ?");
			params.add(preguntasexpediente.getIdPreguntaExpediente());
		}
		if (preguntasexpediente != null && preguntasexpediente.getIdPreguntaPadreExpediente() != null) {
			where.append(" AND t1.ID_PREGUNTA_PADRE_EXP = ?");
			params.add(preguntasexpediente.getIdPreguntaPadreExpediente());
		}
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdPreguntaExpediente()
		// != null ) {
		// where.append(" AND t2.ID_PREGUNTA_EXPEDIENTE = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdPreguntaExpediente());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente()
		// != null &&
		// preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente().getIdPreguntaExpediente()
		// != null ) {
		// where.append(" AND t2.ID_PREGUNTA_PADRE_EXP = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getPreguntasExpediente().getIdPreguntaExpediente());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdInspeccion() !=
		// null ) {
		// where.append(" AND t2.ID_INSPECCION = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdInspeccion());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getOrden() != null ) {
		// where.append(" AND t2.ORDEN = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getOrden());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getDescripcionCastellano()
		// != null ) {
		// where.append(" AND UPPER(t2.DESCRIPCION_CASTELLANO) like ? ESCAPE
		// '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getDescripcionCastellano().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getDescripcionCastellano().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.DESCRIPCION_CASTELLANO IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getDescripcionEuskera()
		// != null ) {
		// where.append(" AND UPPER(t2.DESCRIPCION_EUSKERA) like ? ESCAPE
		// '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getDescripcionEuskera().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getDescripcionEuskera().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.DESCRIPCION_EUSKERA IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getIdTipoPregunta() !=
		// null ) {
		// where.append(" AND t2.ID_TIPO_PREGUNTA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getIdTipoPregunta());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getFechaFactura() !=
		// null ) {
		// where.append(" AND t2.FECHA_FACTURA = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getFechaFactura());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getNumeroFactura() !=
		// null ) {
		// where.append(" AND UPPER(t2.NUMERO_FACTURA) like ? ESCAPE '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getNumeroFactura().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getNumeroFactura().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.NUMERO_FACTURA IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getProveedor() != null )
		// {
		// where.append(" AND UPPER(t2.PROVEEDOR) like ? ESCAPE '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getProveedor().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getProveedor().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.PROVEEDOR IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getImporte() != null ) {
		// where.append(" AND t2.IMPORTE = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getImporte());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getImporteAdmitido() !=
		// null ) {
		// where.append(" AND t2.IMPORTE_ADMITIDO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getImporteAdmitido());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoCas()
		// != null ) {
		// where.append(" AND UPPER(t2.OBSERVACIONES_INSPECCION_CAS) like ?
		// ESCAPE '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoCas().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoCas().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.OBSERVACIONES_INSPECCION_CAS IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoEus()
		// != null ) {
		// where.append(" AND UPPER(t2.OBSERVACIONES_INSPECCION_EUS) like ?
		// ESCAPE '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoEus().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getObservacionesTecnicoEus().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.OBSERVACIONES_INSPECCION_EUS IS NOT NULL");
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getFechaRegistro() !=
		// null ) {
		// where.append(" AND t2.FECHA_REGISTRO = ?");
		// params.add(preguntasexpediente.getPreguntasExpediente().getFechaRegistro());
		// }
		// if (preguntasexpediente!=null &&
		// preguntasexpediente.getPreguntasExpediente() != null &&
		// preguntasexpediente.getPreguntasExpediente().getUsuarioRegistro() !=
		// null ) {
		// where.append(" AND UPPER(t2.USUARIO_REGISTRO) like ? ESCAPE '\\'");
		// if (startsWith){
		// params.add(preguntasexpediente.getPreguntasExpediente().getUsuarioRegistro().toUpperCase()
		// +"%");
		// }else{
		// params.add("%"+preguntasexpediente.getPreguntasExpediente().getUsuarioRegistro().toUpperCase()
		// +"%");
		// }
		// where.append(" AND t2.USUARIO_REGISTRO IS NOT NULL");
		// }
		if (preguntasexpediente != null && preguntasexpediente.getInspeccion() != null
				&& preguntasexpediente.getInspeccion().getIdInspeccion() != null) {
			where.append(" AND t1.ID_INSPECCION = ?");
			params.add(preguntasexpediente.getInspeccion().getIdInspeccion());
		}
		if (preguntasexpediente != null && preguntasexpediente.getOrden() != null) {
			where.append(" AND t1.ORDEN = ?");
			params.add(preguntasexpediente.getOrden());
		}
		if (preguntasexpediente != null && preguntasexpediente.getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getIdTipoPregunta() != null) {
			where.append(" AND t1.ID_TIPO_PREGUNTA = ?");
			params.add(preguntasexpediente.getIdTipoPregunta());
		}
		if (preguntasexpediente != null && preguntasexpediente.getFechaFactura() != null) {
			where.append(" AND t1.FECHA_FACTURA = ?");
			params.add(preguntasexpediente.getFechaFactura());
		}
		if (preguntasexpediente != null && preguntasexpediente.getNumeroFactura() != null) {
			where.append(" AND UPPER(t1.NUMERO_FACTURA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getNumeroFactura().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getNumeroFactura().toUpperCase() + "%");
			}
			where.append(" AND t1.NUMERO_FACTURA IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getProveedor() != null) {
			where.append(" AND UPPER(t1.PROVEEDOR) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getProveedor().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getProveedor().toUpperCase() + "%");
			}
			where.append(" AND t1.PROVEEDOR IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getImporte() != null) {
			where.append(" AND t1.IMPORTE = ?");
			params.add(preguntasexpediente.getImporte());
		}
		if (preguntasexpediente != null && preguntasexpediente.getImporteAdmitido() != null) {
			where.append(" AND t1.IMPORTE_ADMITIDO = ?");
			params.add(preguntasexpediente.getImporteAdmitido());
		}
		if (preguntasexpediente != null && preguntasexpediente.getObservacionesTecnicoCas() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES_INSPECCION_CAS) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getObservacionesTecnicoCas().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getObservacionesTecnicoCas().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES_INSPECCION_CAS IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getObservacionesTecnicoEus() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES_INSPECCION_EUS) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getObservacionesTecnicoEus().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getObservacionesTecnicoEus().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES_INSPECCION_EUS IS NOT NULL");
		}
		if (preguntasexpediente != null && preguntasexpediente.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasexpediente.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasexpediente.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}

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

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

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

}
