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

import com.ejie.ad74a.model.ae01b.Liquidaciones;
import com.ejie.ad74a.model.ae01b.MotivosAnulDev;
import com.ejie.ad74a.model.ae01b.Operaciones;
import com.ejie.ad74a.model.ae01b.TiposNotificacion;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * OperacionesDaoImpl generated by UDA, 28-jun-2023 11:01:41.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class OperacionesDaoImpl implements OperacionesDao {

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

	protected static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDOPERACION02", "IDLIQUIDACION02",
			"TIPOOPE02", "FOPERACION02", "FENVIOSIPCA02", "IDFICHEROENV02", "ESTADOOPE02", "IDMOTIVO02",
			"OBSERVACIONES02", "FPAGODEV02", "TIPOTERCERO02", "TERCERO02", "NOMRACSOC02", "FNOTIF02", "IDTIPONOT02",
			"CONCEPTORES02", "PERLIQDESDE02", "PERLIQHASTA02", "FINIPRESCRIP02", "PLAZOPRESCRIP02", "INDRECURRIDA02",
			"USUALTA02", "FALTA02", "USUMODIF02", "FMODIF02" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_OPERACIONES_LIQ = "SEQ_OPERACIONES_LIQ";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Operaciones> rwMap = new RowMapper<Operaciones>() {
		public Operaciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Operaciones(UtilSQL.getLong(resultSet, "IDOPERACION02"),
					new Liquidaciones(UtilSQL.getLong(resultSet, "IDLIQUIDACION02")),
					UtilSQL.getLong(resultSet, "TIPOOPE02"), resultSet.getDate("FOPERACION02"),
					resultSet.getDate("FENVIOSIPCA02"), UtilSQL.getInt(resultSet, "IDFICHEROENV02"),
					UtilSQL.getInt(resultSet, "ESTADOOPE02"),
					new MotivosAnulDev(UtilSQL.getLong(resultSet, "IDMOTIVO02")),
					resultSet.getString("OBSERVACIONES02"), resultSet.getDate("FPAGODEV02"),
					UtilSQL.getInt(resultSet, "TIPOTERCERO02"), resultSet.getString("TERCERO02"),
					resultSet.getString("NOMRACSOC02"), resultSet.getDate("FNOTIF02"),
					new TiposNotificacion(UtilSQL.getLong(resultSet, "IDTIPONOT02")),
					resultSet.getString("CONCEPTORES02"), resultSet.getDate("PERLIQDESDE02"),
					resultSet.getDate("PERLIQHASTA02"), resultSet.getDate("FINIPRESCRIP02"),
					UtilSQL.getLong(resultSet, "PLAZOPRESCRIP02"), UtilSQL.getInt(resultSet, "INDRECURRIDA02"),
					resultSet.getString("USUALTA02"), resultSet.getDate("FALTA02"), resultSet.getString("USUMODIF02"),
					resultSet.getDate("FMODIF02"));
		}
	};

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

	/**
	 * 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 Operaciones table.
	 *
	 * @param operaciones Operaciones
	 *
	 * @return Operaciones
	 */
	public Operaciones add(Operaciones operaciones) {

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO AE01B.OPERACIONES (ID_OPERACION_02, ID_LIQUIDACION_02, TIPO_OPE_02, F_OPERACION_02, F_ENVIO_SIPCA_02, ID_FICHERO_ENV_02, ESTADO_OPE_02, ID_MOTIVO_02, OBSERVACIONES_02, F_PAGO_DEV_02, TIPO_TERCERO_02, TERCERO_02, NOM_RAC_SOC_02, F_NOTIF_02, ID_TIPO_NOT_02, CONCEPTORES_02, PER_LIQ_DESDE_02, PER_LIQ_HASTA_02, F_INI_PRESCRIP_02, PLAZO_PRESCRIP_02, IND_RECURRIDA_02, USU_ALTA_02, F_ALTA_02, USU_MODIF_02, F_MODIF_02) "
				+ "VALUES (" + SEQUENCE_OPERACIONES_LIQ
				+ ".NEXTVAL,:idLiquidacion02,:tipoOpe02,:fOperacion02,:fEnvioSipca02,:idFicheroEnv02,:estadoOpe02,:idMotivo02,:observaciones02,:fPagoDev02,:tipoTercero02,:tercero02,:nomRacSoc02,:fNotif02,:idTipoNot02,:conceptores02,:perLiqDesde02,:perLiqHasta02,:fIniPrescrip02,:plazoPrescrip02,:indRecurrida02,:usuAlta02, :fAlta02, :usuModif02, :fModif02)";

		Object getLiquidacionesIdLiquidacion00Aux = null;
		if (operaciones.getLiquidaciones() != null && operaciones.getLiquidaciones().getIdLiquidacion00() != null) {
			getLiquidacionesIdLiquidacion00Aux = operaciones.getLiquidaciones().getIdLiquidacion00();
		}
		Object getMotivoAnulDevIdMotivo32Aux = null;
		if (operaciones.getMotivosAnulDev() != null && operaciones.getMotivosAnulDev().getIdMotivo32() != null) {
			getMotivoAnulDevIdMotivo32Aux = operaciones.getMotivosAnulDev().getIdMotivo32();
		}
		Object getTiposNotificacionIdTipoNot33Aux = null;
		if (operaciones.getTiposNotificacion() != null && operaciones.getTiposNotificacion().getIdTipoNot33() != null) {
			getTiposNotificacionIdTipoNot33Aux = operaciones.getTiposNotificacion().getIdTipoNot33();
		}

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("idLiquidacion02", getLiquidacionesIdLiquidacion00Aux)
				.addValue("tipoOpe02", operaciones.getTipoOpe02())
				.addValue("fOperacion02", operaciones.getfOperacion02())
				.addValue("fEnvioSipca02", operaciones.getfEnvioSipca02())
				.addValue("idFicheroEnv02", operaciones.getIdFicheroEnv02())
				.addValue("estadoOpe02", operaciones.getEstadoOpe02())
				.addValue("idMotivo02", getMotivoAnulDevIdMotivo32Aux)
				.addValue("observaciones02", operaciones.getObservaciones02())
				.addValue("fPagoDev02", operaciones.getfPagoDev02())
				.addValue("tipoTercero02", operaciones.getTipoTercero02())
				.addValue("tercero02", operaciones.getTercero02()).addValue("nomRacSoc02", operaciones.getNomRacSoc02())
				.addValue("fNotif02", operaciones.getfNotif02())
				.addValue("idTipoNot02", getTiposNotificacionIdTipoNot33Aux)
				.addValue("conceptores02", operaciones.getConceptores02())
				.addValue("perLiqDesde02", operaciones.getPerLiqDesde02())
				.addValue("perLiqHasta02", operaciones.getPerLiqHasta02())
				.addValue("fIniPrescrip02", operaciones.getfIniPrescrip02())
				.addValue("plazoPrescrip02", operaciones.getPlazoPrescrip02())
				.addValue("indRecurrida02", operaciones.getIndRecurrida02())
				.addValue("usuAlta02", operaciones.getUsuAlta02()).addValue("fAlta02", operaciones.getfAlta02())
				.addValue("usuModif02", operaciones.getUsuModif02()).addValue("fModif02", operaciones.getfModif02());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_OPERACION_02" });
		operaciones.setIdOperacion02(generatedKeyHolder.getKey().longValue());

		return operaciones;
	}

	/**
	 * Updates a single row in the Operaciones table.
	 *
	 * @param operaciones Operaciones
	 *
	 * @return Operaciones
	 */
	public Operaciones update(Operaciones operaciones) {
		String query = "UPDATE AE01B.OPERACIONES SET ID_LIQUIDACION_02=?, TIPO_OPE_02=?, F_OPERACION_02=?, F_ENVIO_SIPCA_02=?, ID_FICHERO_ENV_02=?, ESTADO_OPE_02=?, ID_MOTIVO_02=?, OBSERVACIONES_02=?, F_PAGO_DEV_02=?, TIPO_TERCERO_02=?, TERCERO_02=?, NOM_RAC_SOC_02=?, F_NOTIF_02=?, ID_TIPO_NOT_02=?, CONCEPTORES_02=?, PER_LIQ_DESDE_02=?, PER_LIQ_HASTA_02=?, F_INI_PRESCRIP_02=?, PLAZO_PRESCRIP_02=?, IND_RECURRIDA_02=?, USU_MODIF_02=?, F_MODIF_02=? WHERE ID_OPERACION_02=?";

		Object getLiquidacionesIdLiquidacion00Aux = null;
		if (operaciones.getLiquidaciones() != null && operaciones.getLiquidaciones().getIdLiquidacion00() != null) {
			getLiquidacionesIdLiquidacion00Aux = operaciones.getLiquidaciones().getIdLiquidacion00();
		}
		Object getMotivoAnulDevIdMotivo32Aux = null;
		if (operaciones.getMotivosAnulDev() != null && operaciones.getMotivosAnulDev().getIdMotivo32() != null) {
			getMotivoAnulDevIdMotivo32Aux = operaciones.getMotivosAnulDev().getIdMotivo32();
		}
		Object getTiposNotificacionIdTipoNot33Aux = null;
		if (operaciones.getTiposNotificacion() != null && operaciones.getTiposNotificacion().getIdTipoNot33() != null) {
			getTiposNotificacionIdTipoNot33Aux = operaciones.getTiposNotificacion().getIdTipoNot33();
		}

		this.jdbcTemplate.update(query, getLiquidacionesIdLiquidacion00Aux, operaciones.getTipoOpe02(),
				operaciones.getfOperacion02(), operaciones.getfEnvioSipca02(), operaciones.getIdFicheroEnv02(),
				operaciones.getEstadoOpe02(), getMotivoAnulDevIdMotivo32Aux, operaciones.getObservaciones02(),
				operaciones.getfPagoDev02(), operaciones.getTipoTercero02(), operaciones.getTercero02(),
				operaciones.getNomRacSoc02(), operaciones.getfNotif02(), getTiposNotificacionIdTipoNot33Aux,
				operaciones.getConceptores02(), operaciones.getPerLiqDesde02(), operaciones.getPerLiqHasta02(),
				operaciones.getfIniPrescrip02(), operaciones.getPlazoPrescrip02(), operaciones.getIndRecurrida02(),
				operaciones.getUsuModif02(), operaciones.getfModif02(), operaciones.getIdOperacion02());
		return operaciones;
	}

	/**
	 * Finds a single row in the Operaciones table.
	 *
	 * @param operaciones Operaciones
	 *
	 * @return Operaciones
	 */
	@Transactional(readOnly = true)
	public Operaciones find(Operaciones operaciones) {
		String query = "SELECT t1.ID_OPERACION_02 IDOPERACION02, t1.ID_LIQUIDACION_02 IDLIQUIDACION02, t1.TIPO_OPE_02 TIPOOPE02, t1.F_OPERACION_02 FOPERACION02, t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02, t1.ID_FICHERO_ENV_02 IDFICHEROENV02, t1.ESTADO_OPE_02 ESTADOOPE02, t1.ID_MOTIVO_02 IDMOTIVO02, t1.OBSERVACIONES_02 OBSERVACIONES02, t1.F_PAGO_DEV_02 FPAGODEV02, t1.TIPO_TERCERO_02 TIPOTERCERO02, t1.TERCERO_02 TERCERO02, t1.NOM_RAC_SOC_02 NOMRACSOC02, t1.F_NOTIF_02 FNOTIF02, t1.ID_TIPO_NOT_02 IDTIPONOT02, t1.CONCEPTORES_02 CONCEPTORES02, t1.PER_LIQ_DESDE_02 PERLIQDESDE02, t1.PER_LIQ_HASTA_02 PERLIQHASTA02, t1.F_INI_PRESCRIP_02 FINIPRESCRIP02, t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02, t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 FROM AE01B.OPERACIONES t1  WHERE t1.ID_OPERACION_02 = ?  ";

		List<Operaciones> operacionesList = this.jdbcTemplate.query(query, this.rwMap, operaciones.getIdOperacion02());
		return DataAccessUtils.uniqueResult(operacionesList);
	}

	/**
	 * Removes a single row in the Operaciones table.
	 *
	 * @param operaciones Operaciones
	 */
	public void remove(Operaciones operaciones) {
		String query = "DELETE FROM AE01B.OPERACIONES WHERE ID_OPERACION_02=?";
		this.jdbcTemplate.update(query, operaciones.getIdOperacion02());
	}

	public List<Operaciones> getMultiple(Operaciones filterOperaciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_OPERACION_02 IDOPERACION02, t1.ID_LIQUIDACION_02 IDLIQUIDACION02, t1.TIPO_OPE_02 TIPOOPE02, t1.F_OPERACION_02 FOPERACION02, t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02, t1.ID_FICHERO_ENV_02 IDFICHEROENV02, t1.ESTADO_OPE_02 ESTADOOPE02, t1.ID_MOTIVO_02 IDMOTIVO02, t1.OBSERVACIONES_02 OBSERVACIONES02, t1.F_PAGO_DEV_02 FPAGODEV02, t1.TIPO_TERCERO_02 TIPOTERCERO02, t1.TERCERO_02 TERCERO02, t1.NOM_RAC_SOC_02 NOMRACSOC02, t1.F_NOTIF_02 FNOTIF02, t1.ID_TIPO_NOT_02 IDTIPONOT02, t1.CONCEPTORES_02 CONCEPTORES02, t1.PER_LIQ_DESDE_02 PERLIQDESDE02, t1.PER_LIQ_HASTA_02 PERLIQHASTA02, t1.F_INI_PRESCRIP_02 FINIPRESCRIP02, t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02, t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 ");
		// FROM
		query.append("FROM AE01B.OPERACIONES t1 ");
		// WHERE clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterOperaciones, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		StringBuilder sbMultipleSQL = query.append(
				TableManager.getSelectMultipleQuery(tableRequestDto, Operaciones.class, params, "id_operacion_02"));

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

	/**
	 * Finds a list of rows in the Operaciones table.
	 *
	 * @param operaciones     Operaciones
	 * @param tableRequestDto TableRequestDto
	 *
	 * @return List<Operaciones>
	 */
	@Transactional(readOnly = true)
	public List<Operaciones> findAll(Operaciones operaciones, TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_OPERACION_02 IDOPERACION02,t1.ID_LIQUIDACION_02 IDLIQUIDACION02,t1.TIPO_OPE_02 TIPOOPE02,t1.F_OPERACION_02 FOPERACION02,t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02,t1.ID_FICHERO_ENV_02 IDFICHEROENV02,t1.ESTADO_OPE_02 ESTADOOPE02,t1.ID_MOTIVO_02 IDMOTIVO02,t1.OBSERVACIONES_02 OBSERVACIONES02,t1.F_PAGO_DEV_02 FPAGODEV02,t1.TIPO_TERCERO_02 TIPOTERCERO02,t1.TERCERO_02 TERCERO02,t1.NOM_RAC_SOC_02 NOMRACSOC02,t1.F_NOTIF_02 FNOTIF02,t1.ID_TIPO_NOT_02 IDTIPONOT02,t1.CONCEPTORES_02 CONCEPTORES02,t1.PER_LIQ_DESDE_02 PERLIQDESDE02,t1.PER_LIQ_HASTA_02 PERLIQHASTA02,t1.F_INI_PRESCRIP_02 FINIPRESCRIP02,t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02,t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 ");

		// FROM
		query.append("FROM AE01B.OPERACIONES t1 ");

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

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

	/**
	 * Finds rows in the Operaciones table using like.
	 *
	 * @param operaciones     Operaciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<Operaciones>
	 */
	@Transactional(readOnly = true)
	public List<Operaciones> findAllLike(Operaciones operaciones, TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_OPERACION_02 IDOPERACION02,t1.ID_LIQUIDACION_02 IDLIQUIDACION02,t1.TIPO_OPE_02 TIPOOPE02,t1.F_OPERACION_02 FOPERACION02,t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02,t1.ID_FICHERO_ENV_02 IDFICHEROENV02,t1.ESTADO_OPE_02 ESTADOOPE02,t1.ID_MOTIVO_02 IDMOTIVO02,t1.OBSERVACIONES_02 OBSERVACIONES02,t1.F_PAGO_DEV_02 FPAGODEV02,t1.TIPO_TERCERO_02 TIPOTERCERO02,t1.TERCERO_02 TERCERO02,t1.NOM_RAC_SOC_02 NOMRACSOC02,t1.F_NOTIF_02 FNOTIF02,t1.ID_TIPO_NOT_02 IDTIPONOT02,t1.CONCEPTORES_02 CONCEPTORES02,t1.PER_LIQ_DESDE_02 PERLIQDESDE02,t1.PER_LIQ_HASTA_02 PERLIQHASTA02,t1.F_INI_PRESCRIP_02 FINIPRESCRIP02,t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02,t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 ");

		// FROM
		query.append("FROM AE01B.OPERACIONES t1 ");

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

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

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

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

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

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

	/**
	 * Reorder the data list of Operaciones selected for rup_table
	 *
	 * @param operaciones     Operaciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<Operaciones>>
	 */
	@Override
	public List<TableRowDto<Operaciones>> reorderSelection(Operaciones operaciones, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_OPERACION_02 IDOPERACION02,t1.ID_LIQUIDACION_02 IDLIQUIDACION02,t1.TIPO_OPE_02 TIPOOPE02,t1.F_OPERACION_02 FOPERACION02,t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02,t1.ID_FICHERO_ENV_02 IDFICHEROENV02,t1.ESTADO_OPE_02 ESTADOOPE02,t1.ID_MOTIVO_02 IDMOTIVO02,t1.OBSERVACIONES_02 OBSERVACIONES02,t1.F_PAGO_DEV_02 FPAGODEV02,t1.TIPO_TERCERO_02 TIPOTERCERO02,t1.TERCERO_02 TERCERO02,t1.NOM_RAC_SOC_02 NOMRACSOC02,t1.F_NOTIF_02 FNOTIF02,t1.ID_TIPO_NOT_02 IDTIPONOT02,t1.CONCEPTORES_02 CONCEPTORES02,t1.PER_LIQ_DESDE_02 PERLIQDESDE02,t1.PER_LIQ_HASTA_02 PERLIQHASTA02,t1.F_INI_PRESCRIP_02 FINIPRESCRIP02,t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02,t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 ");
		// FROM
		query.append("FROM AE01B.OPERACIONES t1 ");
		// FILTRADO
		// WHERE clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(operaciones, 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, Operaciones.class,
				filterParamList, "idoperacion02");

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

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams    Operaciones
	 * @param searchParams    Operaciones
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 *
	 * @return List<TableRowDto<Operaciones>>
	 */
	@Override
	public List<TableRowDto<Operaciones>> search(Operaciones filterParams, Operaciones searchParams,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_OPERACION_02 IDOPERACION02,t1.ID_LIQUIDACION_02 IDLIQUIDACION02,t1.TIPO_OPE_02 TIPOOPE02,t1.F_OPERACION_02 FOPERACION02,t1.F_ENVIO_SIPCA_02 FENVIOSIPCA02,t1.ID_FICHERO_ENV_02 IDFICHEROENV02,t1.ESTADO_OPE_02 ESTADOOPE02,t1.ID_MOTIVO_02 IDMOTIVO02,t1.OBSERVACIONES_02 OBSERVACIONES02,t1.F_PAGO_DEV_02 FPAGODEV02,t1.TIPO_TERCERO_02 TIPOTERCERO02,t1.TERCERO_02 TERCERO02,t1.NOM_RAC_SOC_02 NOMRACSOC02,t1.F_NOTIF_02 FNOTIF02,t1.ID_TIPO_NOT_02 IDTIPONOT02,t1.CONCEPTORES_02 CONCEPTORES02,t1.PER_LIQ_DESDE_02 PERLIQDESDE02,t1.PER_LIQ_HASTA_02 PERLIQHASTA02,t1.F_INI_PRESCRIP_02 FINIPRESCRIP02,t1.PLAZO_PRESCRIP_02 PLAZOPRESCRIP02,t1.IND_RECURRIDA_02 INDRECURRIDA02, t1.USU_ALTA_02 USUALTA02, t1.F_ALTA_02 FALTA02, t1.USU_MODIF_02 USUMODIF02, t1.F_MODIF_02 FMODIF02 ");
		// FROM
		query.append("FROM AE01B.OPERACIONES t1 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");

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

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

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

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

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param tableRequestDto TableRequestDto
	 */
	@Override
	public void removeMultiple(TableRequestDto tableRequestDto) {
		StringBuilder sbRemoveMultipleSQL = TableManager.getRemoveMultipleQuery(null, tableRequestDto,
				Operaciones.class, "AE01B.OPERACIONES", "t1", new String[] { "IDOPERACION02" });

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

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

	/*
	 * MÃ‰TODOS PRIVADOS
	 */

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

		if (operaciones != null && operaciones.getIdOperacion02() != null) {
			where.append(" AND t1.ID_OPERACION_02 = ?");
			params.add(operaciones.getIdOperacion02());
		}
		if (operaciones != null && operaciones.getLiquidaciones() != null
				&& operaciones.getLiquidaciones().getIdLiquidacion00() != null) {
			where.append(" AND t1.ID_LIQUIDACION_02 = ?");
			params.add(operaciones.getLiquidaciones().getIdLiquidacion00());
		}
		if (operaciones != null && operaciones.getTipoOpe02() != null) {
			where.append(" AND t1.TIPO_OPE_02 = ?");
			params.add(operaciones.getTipoOpe02());
		}
		if (operaciones != null && operaciones.getfOperacion02() != null) {
			where.append(" AND t1.F_OPERACION_02 = ?");
			params.add(operaciones.getfOperacion02());
		}
		if (operaciones != null && operaciones.getfEnvioSipca02() != null) {
			where.append(" AND t1.F_ENVIO_SIPCA_02 = ?");
			params.add(operaciones.getfEnvioSipca02());
		}
		if (operaciones != null && operaciones.getIdFicheroEnv02() != null) {
			where.append(" AND t1.ID_FICHERO_ENV_02 = ?");
			params.add(operaciones.getIdFicheroEnv02());
		}
		if (operaciones != null && operaciones.getEstadoOpe02() != null) {
			where.append(" AND t1.ESTADO_OPE_02 = ?");
			params.add(operaciones.getEstadoOpe02());
		}
		if (operaciones != null && operaciones.getMotivosAnulDev() != null
				&& operaciones.getMotivosAnulDev().getIdMotivo32() != null) {
			where.append(" AND t1.ID_MOTIVO_02 = ?");
			params.add(operaciones.getMotivosAnulDev().getIdMotivo32());
		}
		if (operaciones != null && operaciones.getObservaciones02() != null) {
			where.append(" AND t1.OBSERVACIONES_02 = ?");
			params.add(operaciones.getObservaciones02());
		}
		if (operaciones != null && operaciones.getfPagoDev02() != null) {
			where.append(" AND t1.F_PAGO_DEV_02 = ?");
			params.add(operaciones.getfPagoDev02());
		}
		if (operaciones != null && operaciones.getTipoTercero02() != null) {
			where.append(" AND t1.TIPO_TERCERO_02 = ?");
			params.add(operaciones.getTipoTercero02());
		}
		if (operaciones != null && operaciones.getTercero02() != null) {
			where.append(" AND t1.TERCERO_02 = ?");
			params.add(operaciones.getTercero02());
		}
		if (operaciones != null && operaciones.getNomRacSoc02() != null) {
			where.append(" AND t1.NOM_RAC_SOC_02 = ?");
			params.add(operaciones.getNomRacSoc02());
		}
		if (operaciones != null && operaciones.getfNotif02() != null) {
			where.append(" AND t1.F_NOTIF_02 = ?");
			params.add(operaciones.getfNotif02());
		}
		if (operaciones != null && operaciones.getTiposNotificacion() != null
				&& operaciones.getTiposNotificacion().getIdTipoNot33() != null) {
			where.append(" AND t1.ID_TIPO_NOT_02 = ?");
			params.add(operaciones.getTiposNotificacion().getIdTipoNot33());
		}
		if (operaciones != null && operaciones.getConceptores02() != null) {
			where.append(" AND t1.CONCEPTORES_02 = ?");
			params.add(operaciones.getConceptores02());
		}
		if (operaciones != null && operaciones.getPerLiqDesde02() != null) {
			where.append(" AND t1.PER_LIQ_DESDE_02 = ?");
			params.add(operaciones.getPerLiqDesde02());
		}
		if (operaciones != null && operaciones.getPerLiqHasta02() != null) {
			where.append(" AND t1.PER_LIQ_HASTA_02 = ?");
			params.add(operaciones.getPerLiqHasta02());
		}
		if (operaciones != null && operaciones.getfIniPrescrip02() != null) {
			where.append(" AND t1.F_INI_PRESCRIP_02 = ?");
			params.add(operaciones.getfIniPrescrip02());
		}
		if (operaciones != null && operaciones.getPlazoPrescrip02() != null) {
			where.append(" AND t1.PLAZO_PRESCRIP_02 = ?");
			params.add(operaciones.getPlazoPrescrip02());
		}
		if (operaciones != null && operaciones.getIndRecurrida02() != null) {
			where.append(" AND t1.IND_RECURRIDA_02 = ?");
			params.add(operaciones.getIndRecurrida02());
		}
		if (operaciones != null && operaciones.getUsuAlta02() != null) {
			where.append(" AND t1.USU_ALTA_02 = ?");
			params.add(operaciones.getUsuAlta02());
		}
		if (operaciones != null && operaciones.getfAlta02() != null) {
			where.append(" AND t1.F_ALTA_02 = ?");
			params.add(operaciones.getfAlta02());
		}
		if (operaciones != null && operaciones.getUsuModif02() != null) {
			where.append(" AND t1.USU_MODIF_02 = ?");
			params.add(operaciones.getUsuModif02());
		}
		if (operaciones != null && operaciones.getfModif02() != null) {
			where.append(" AND t1.F_MODIF_02 = ?");
			params.add(operaciones.getfModif02());
		}

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

		return mapWhere;
	}

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

		if (operaciones != null && operaciones.getIdOperacion02() != null) {
			where.append(" AND t1.ID_OPERACION_02 = ?");
			params.add(operaciones.getIdOperacion02());
		}
		if (operaciones != null && operaciones.getLiquidaciones() != null
				&& operaciones.getLiquidaciones().getIdLiquidacion00() != null) {
			where.append(" AND t1.ID_LIQUIDACION_02 = ?");
			params.add(operaciones.getLiquidaciones().getIdLiquidacion00());
		}
		if (operaciones != null && operaciones.getTipoOpe02() != null) {
			where.append(" AND t1.TIPO_OPE_02 = ?");
			params.add(operaciones.getTipoOpe02());
		}
		if (operaciones != null && operaciones.getfOperacion02() != null) {
			where.append(" AND t1.F_OPERACION_02 = ?");
			params.add(operaciones.getfOperacion02());
		}
		if (operaciones != null && operaciones.getfEnvioSipca02() != null) {
			where.append(" AND t1.F_ENVIO_SIPCA_02 = ?");
			params.add(operaciones.getfEnvioSipca02());
		}
		if (operaciones != null && operaciones.getIdFicheroEnv02() != null) {
			where.append(" AND t1.ID_FICHERO_ENV_02 = ?");
			params.add(operaciones.getIdFicheroEnv02());
		}
		if (operaciones != null && operaciones.getEstadoOpe02() != null) {
			where.append(" AND t1.ESTADO_OPE_02 = ?");
			params.add(operaciones.getEstadoOpe02());
		}
		if (operaciones != null && operaciones.getMotivosAnulDev() != null
				&& operaciones.getMotivosAnulDev().getIdMotivo32() != null) {
			where.append(" AND t1.ID_MOTIVO_02 = ?");
			params.add(operaciones.getMotivosAnulDev().getIdMotivo32());
		}
		if (operaciones != null && operaciones.getObservaciones02() != null) {
			where.append(" AND UPPER(t1.OBSERVACIONES_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getObservaciones02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getObservaciones02().toUpperCase() + "%");
			}
			where.append(" AND t1.OBSERVACIONES_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getfPagoDev02() != null) {
			where.append(" AND t1.F_PAGO_DEV_02 = ?");
			params.add(operaciones.getfPagoDev02());
		}
		if (operaciones != null && operaciones.getTipoTercero02() != null) {
			where.append(" AND t1.TIPO_TERCERO_02 = ?");
			params.add(operaciones.getTipoTercero02());
		}
		if (operaciones != null && operaciones.getTercero02() != null) {
			where.append(" AND UPPER(t1.TERCERO_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getTercero02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getTercero02().toUpperCase() + "%");
			}
			where.append(" AND t1.TERCERO_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getNomRacSoc02() != null) {
			where.append(" AND UPPER(t1.NOM_RAC_SOC_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getNomRacSoc02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getNomRacSoc02().toUpperCase() + "%");
			}
			where.append(" AND t1.NOM_RAC_SOC_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getfNotif02() != null) {
			where.append(" AND t1.F_NOTIF_02 = ?");
			params.add(operaciones.getfNotif02());
		}
		if (operaciones != null && operaciones.getTiposNotificacion() != null
				&& operaciones.getTiposNotificacion().getIdTipoNot33() != null) {
			where.append(" AND t1.ID_TIPO_NOT_02 = ?");
			params.add(operaciones.getTiposNotificacion().getIdTipoNot33());
		}
		if (operaciones != null && operaciones.getConceptores02() != null) {
			where.append(" AND UPPER(t1.CONCEPTORES_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getConceptores02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getConceptores02().toUpperCase() + "%");
			}
			where.append(" AND t1.CONCEPTORES_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getPerLiqDesde02() != null) {
			where.append(" AND t1.PER_LIQ_DESDE_02 = ?");
			params.add(operaciones.getPerLiqDesde02());
		}
		if (operaciones != null && operaciones.getPerLiqHasta02() != null) {
			where.append(" AND t1.PER_LIQ_HASTA_02 = ?");
			params.add(operaciones.getPerLiqHasta02());
		}
		if (operaciones != null && operaciones.getfIniPrescrip02() != null) {
			where.append(" AND t1.F_INI_PRESCRIP_02 = ?");
			params.add(operaciones.getfIniPrescrip02());
		}
		if (operaciones != null && operaciones.getPlazoPrescrip02() != null) {
			where.append(" AND t1.PLAZO_PRESCRIP_02 = ?");
			params.add(operaciones.getPlazoPrescrip02());
		}
		if (operaciones != null && operaciones.getIndRecurrida02() != null) {
			where.append(" AND t1.IND_RECURRIDA_02 = ?");
			params.add(operaciones.getIndRecurrida02());
		}
		if (operaciones != null && operaciones.getUsuAlta02() != null) {
			where.append(" AND UPPER(t1.USU_ALTA_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getUsuAlta02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getUsuAlta02().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_ALTA_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getfAlta02() != null) {
			where.append(" AND t1.F_ALTA_02 = ?");
			params.add(operaciones.getfAlta02());
		}
		if (operaciones != null && operaciones.getUsuModif02() != null) {
			where.append(" AND UPPER(t1.USU_MODIF_02) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(operaciones.getUsuModif02().toUpperCase() + "%");
			} else {
				params.add("%" + operaciones.getUsuModif02().toUpperCase() + "%");
			}
			where.append(" AND t1.USU_MODIF_02 IS NOT NULL");
		}
		if (operaciones != null && operaciones.getfModif02() != null) {
			where.append(" AND t1.F_MODIF_02 = ?");
			params.add(operaciones.getfModif02());
		}

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

		return mapWhere;
	}
}
