package com.ejie.ab39a.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.CallableStatementCreator;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab39a.constantes.Constantes;
import com.ejie.ab39a.constantes.SecuenciasSQL;
import com.ejie.ab39a.constantes.TipoEntidadEnum;
import com.ejie.ab39a.model.Entidades;
import com.ejie.ab39a.model.PlanesEstrategicos;
import com.ejie.ab39a.model.Planificacion;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.TableRowDto;
import com.gfi.constants.Constants;
import com.gfi.utils.UtilDate;
import com.gfi.utils.UtilSQL;

/**
 * PlanesEstrategicosDaoImpl.
 * 
 *  
 */

@Repository
@Transactional
public class PlanesEstrategicosDaoImpl implements PlanesEstrategicosDao {

    private static final Logger logger = LoggerFactory.getLogger(PlanesEstrategicosDaoImpl.class);
    private static final String[] ORDER_BY_WHITE_LIST = new String[] { "CODPLANE", "CODENTIDAD", "CODPLANIFICACION",
            "ANYOINICIO", "ANYOFIN", "INDICE_OBLIGAT", "NIVEL_CUMPLIMIENTO_REQEUS", "FECHAACEPTACIONPLAN", "NOMBRE",
            "NOMBREEUS", "SOLICITUDTXOSTENA", "DESENTIDAD", "CIFNIF", "DESCAS", "DESEUS", "FINICIO", "FFIN",
            "FECHAALTA", "CODVERSION", "FECHAMODIFICACION", "TIENEVERSION" };

    private JdbcTemplate jdbcTemplate;

    /*
     * ROW_MAPPERS
     */
    private RowMapper<PlanesEstrategicos> rwMap = new RowMapper<PlanesEstrategicos>() {
        @Override
        public PlanesEstrategicos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
            Entidades entidades = new Entidades();
            Planificacion planificacion = new Planificacion();
            planesEstrategicos.setEntidad(entidades);
            planesEstrategicos.setPlanificacion(planificacion);

            try {
                planesEstrategicos.setCodplane(resultSet.getInt("CODPLANE"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna CODPLANE");
            }
            try {
                planesEstrategicos.setFechaModificacion((resultSet.getDate("FECHAMODIFICACION")));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna FECHAMODIFICACION");
            }
            try {
                planesEstrategicos.getEntidad().setCodentidad(resultSet.getInt("CODENTIDAD"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna CODENTIDAD");
            }
            try {
                planesEstrategicos.getEntidad().setDesentidad(resultSet.getString("DESENTIDAD"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna DESENTIDAD");
            }
            try {
                planesEstrategicos.getEntidad().setCifnif(resultSet.getString("CIFNIF"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna CIFNIF");
            }
            try {
                planesEstrategicos.getEntidad().setTipoEntidad(resultSet.getInt("TIPO_ENTIDAD"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna TIPO_ENTIDAD");
            }
            try {
                planesEstrategicos.getEntidad().setTipoEntidad(resultSet.getInt("TIPO_ENTIDAD"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna TIPO_ENTIDAD");
            }
            try {
                planesEstrategicos.getPlanificacion().setCodplanificacion(resultSet.getLong("CODPLANIFICACION"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna CODPLANIFICACION");
            }
            try {
                planesEstrategicos.getPlanificacion().setDescas(resultSet.getString("DESCAS"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna DESCAS");
            }
            try {
                planesEstrategicos.getPlanificacion().setDeseus(resultSet.getString("DESEUS"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna DESEUS");
            }
            try {
                planesEstrategicos.setAnyoinicio(resultSet.getLong("ANYOINICIO"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna ANYOINICIO");
            }
            try {
                planesEstrategicos.setAnyofin(resultSet.getLong("ANYOFIN"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna ANYOFIN");
            }
            try {
                planesEstrategicos.setIndiceObligat(resultSet.getLong("INDICEOBLIGAT"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna INDICEOBLIGAT");
            }
            try {
                planesEstrategicos.setNivelCumplimientoReqeus(resultSet.getLong("NIVELCUMPLIMIENTOREQEUS"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna NIVELCUMPLIMIENTOREQEUS");
            }
            try {
                planesEstrategicos.setFechaAceptacionPlan(resultSet.getDate("FECHAACEPTACIONPLAN"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna FECHAACEPTACIONPLAN");
            }
            try {
                planesEstrategicos.setNombre(resultSet.getString("NOMBRE"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna NOMBRE");
            }
            try {
                planesEstrategicos.setNombreeus(resultSet.getString("NOMBREEUS"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna NOMBREEUS");
            }
            try {
                planesEstrategicos.setSolitudTxostena(resultSet.getInt("SOLICITUDTXOSTENA"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna SOLICITUDTXOSTENA");
            }
            try {
                planesEstrategicos.setPorcentajeBiling(resultSet.getLong("PORCENTAJE_BILIN"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna PORCENTAJE_BILIN");
            }
            try {
                planesEstrategicos.getPlanificacion().setFechainicio(resultSet.getInt("FINICIO"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna FINICIO");
            }
            try {
                planesEstrategicos.getPlanificacion().setFechafin(resultSet.getInt("FFIN"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna FFIN");
            }
            try {
                planesEstrategicos.setCodVersion(resultSet.getInt("CODVERSION"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna CODVERSION");
            }
            try {
                planesEstrategicos.setFechaAlta(resultSet.getDate("FECHAALTA"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna FECHAALTA");
            }
            try {
                planesEstrategicos.setTieneVersion(resultSet.getInt("TIENEVERSION"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna TIENEVERSION");
            }
            try {
                planesEstrategicos.setNumPgAlta(resultSet.getInt("TIENEPGALTA"));
            } catch (SQLException sqle) { /*
                                           * no existe la columna
                                           */
                PlanesEstrategicosDaoImpl.logger
                        .info("PlanesEstrategicosDaoImpl.rwMap: No existe la columna TIENEPGALTA");
            }

            return planesEstrategicos;
        }
    };

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

    /**
     * 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 PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     * @return PlanesEstrategicos
     */
    @Override
    public PlanesEstrategicos add(PlanesEstrategicos planesestrategicos) {
        Long fechaFin = null;
        Long codPlanificacion = null;
        Integer codEntidad = null;
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "INSERT INTO PLANES_ESTRATEGICOS (CODPLANE, CODENTIDAD, CODPLANIFICACION, ANYOINICIO, ANYOFIN, INDICE_OBLIGAT, ");
        query.append(
                "NIVEL_CUMPLIMIENTO_REQEUS, FECHA_ACEPTACION_PLAN, NOMBRE, NOMBREEUS, SOLICITAR_TXOSTENA, PORCENTAJE_BILIN, ACTIVO,");
        query.append("FECHA_ALTA, CODVERSION,FECHA_MODIFICACION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

        Integer idPlanesEstrateg = SecuenciasSQL.PLANES_ESTRATEGICOS.getNextInteger(jdbcTemplate);
        planesestrategicos.setCodplane(idPlanesEstrateg);
        // Insert del plan con el tecnico
        StringBuilder queryTecnico = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        queryTecnico.append("INSERT INTO PLANESESTR_TECNICOS (CODPLANE,CODTECNICO) VALUES(?,?)");

        if (planesestrategicos.getEntidad() != null) {
            codEntidad = planesestrategicos.getEntidad().getCodentidad();
        }

        if (planesestrategicos.getEntidad() != null
                && planesestrategicos.getEntidad().getTipoEntidad() == TipoEntidadEnum.HERRI_ADMINISTRAZIOA.getId()) {
            if (planesestrategicos.getPorcentajeBiling() == null) {
                planesestrategicos.setPorcentajeBiling(new Long(Constantes.NUM_CERO));
            }
            if (planesestrategicos.getPlanificacion() != null) {
                codPlanificacion = planesestrategicos.getPlanificacion().getCodplanificacion();
                fechaFin = new Long(planesestrategicos.getPlanificacion().getFechafin());
            }
            if (planesestrategicos.getIndiceObligat() == null) {
                planesestrategicos.setIndiceObligat(new Long(Constantes.NUM_CERO));
            }
            if (planesestrategicos.getNivelCumplimientoReqeus() == null) {
                planesestrategicos.setNivelCumplimientoReqeus(new Long(Constantes.NUM_CERO));
            }
        } else if (planesestrategicos.getEntidad() != null && (planesestrategicos.getEntidad()
                .getTipoEntidad() == TipoEntidadEnum.ENTE_PUBLIKOA.getId()
                || planesestrategicos.getEntidad().getTipoEntidad() == TipoEntidadEnum.ENPRESA_PRIBATUA.getId())) {
            fechaFin = planesestrategicos.getAnyofin();
            if (planesestrategicos.getIndiceObligat() == null) {
                planesestrategicos.setIndiceObligat(new Long(Constantes.NUM_CERO));
            }
            if (planesestrategicos.getNivelCumplimientoReqeus() == null) {
                planesestrategicos.setNivelCumplimientoReqeus(new Long(Constantes.NUM_CERO));
            }
            if (planesestrategicos.getPlanificacion() == null) {
                codPlanificacion = null;
            }
            if (planesestrategicos.getPorcentajeBiling() == null) {
                planesestrategicos.setPorcentajeBiling(new Long(Constantes.NUM_CERO));
            }
        }

        this.jdbcTemplate.update(query.toString(), planesestrategicos.getCodplane(), codEntidad, codPlanificacion,
                planesestrategicos.getAnyoinicio(), fechaFin, planesestrategicos.getIndiceObligat(),
                planesestrategicos.getNivelCumplimientoReqeus(), planesestrategicos.getFechaAceptacionPlan(),
                planesestrategicos.getNombre(), planesestrategicos.getNombreeus(), Constantes.TXOSTENA_NO_SOLICITADO,
                planesestrategicos.getPorcentajeBiling(), Constantes.PLANE_ACTIVO, UtilDate.currentDate(),
                Constantes.PLANE_CODVERSION, UtilDate.currentDate());
        this.jdbcTemplate.update(queryTecnico.toString(), planesestrategicos.getCodplane(),
                planesestrategicos.getCodTecnico());

        return planesestrategicos;
    }

    /**
     * Updates a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     * @return PlanesEstrategicos
     */
    @Override
    public PlanesEstrategicos update(PlanesEstrategicos planesestrategicos) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "UPDATE PLANES_ESTRATEGICOS SET ANYOINICIO=?, ANYOFIN=?, INDICE_OBLIGAT=?, NIVEL_CUMPLIMIENTO_REQEUS=?,");
        query.append(
                "FECHA_ACEPTACION_PLAN=?, NOMBRE=?, NOMBREEUS=?, SOLICITAR_TXOSTENA=? , FECHA_MODIFICACION=SYSDATE ");
        query.append(" WHERE CODPLANE=?");
        this.jdbcTemplate.update(query.toString(),
                /*
                 * planesestrategicos.getCodentidad(),
                 * planesestrategicos.getCodplanificacion(),
                 */ planesestrategicos.getAnyoinicio(), planesestrategicos.getAnyofin(),
                planesestrategicos.getIndiceObligat(), planesestrategicos.getNivelCumplimientoReqeus(),
                planesestrategicos.getFechaAceptacionPlan(), planesestrategicos.getNombre(),
                planesestrategicos.getNombreeus(), planesestrategicos.getSolitudTxostena(),
                planesestrategicos.getCodplane());
        return planesestrategicos;
    }

    /**
     * Updates a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     * @return PlanesEstrategicos
     */
    @Override
    public PlanesEstrategicos updateDatosPlan(PlanesEstrategicos planesestrategicos) {
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.findAll: Inicio updateDatosPlan");
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "UPDATE PLANES_ESTRATEGICOS SET INDICE_OBLIGAT=?, NIVEL_CUMPLIMIENTO_REQEUS=?, FECHA_ACEPTACION_PLAN=?, PORCENTAJE_BILIN =?,NOMBRE=?,NOMBREEUS=?,SOLICITAR_TXOSTENA=? ");
        query.append(" ,ANYOINICIO=?, ANYOFIN=? , FECHA_MODIFICACION=SYSDATE ");
        query.append(" WHERE CODPLANE=? AND CODVERSION=? ");
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.findAll: sql:" + query.toString());
        PlanesEstrategicosDaoImpl.logger
                .info("PlanesEstrategicosDaoImpl.findAll: params:" + planesestrategicos.toString());
        this.jdbcTemplate.update(query.toString(), planesestrategicos.getIndiceObligat(),
                planesestrategicos.getNivelCumplimientoReqeus(), planesestrategicos.getFechaAceptacionPlan(),
                planesestrategicos.getPorcentajeBiling(), planesestrategicos.getNombre(),
                planesestrategicos.getNombreeus(), Constantes.TXOSTENA_NO_SOLICITADO,
                planesestrategicos.getAnyoinicio(), planesestrategicos.getAnyofin(), planesestrategicos.getCodplane(),
                planesestrategicos.getCodVersion());

        return planesestrategicos;
    }

    /**
     * Finds a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     * @return PlanesEstrategicos
     */
    @Override
    @Transactional(readOnly = true)
    public PlanesEstrategicos find(PlanesEstrategicos planesestrategicos) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQueryCopiar(planesestrategicos, true));
        // WHERE
        query.append(" WHERE t1.CODPLANE = ? AND t1.CODVERSION = ? ");
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesestrategicos.getUsuarioConectado())) {
            query.append(" AND t6.CODTECNICO = " + planesestrategicos.getCodTecnico());

        }
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.find: sql:" + query.toString());
        PlanesEstrategicosDaoImpl.logger
                .info("PlanesEstrategicosDaoImpl.find: params:" + planesestrategicos.toString());

        List<PlanesEstrategicos> planesestrategicosList = this.jdbcTemplate.query(query.toString(), this.rwMap,
                planesestrategicos.getCodplane(), planesestrategicos.getCodVersion());
        return DataAccessUtils.uniqueResult(planesestrategicosList);
    }

    /**
     * Removes a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     */
    @Override
    public void remove(PlanesEstrategicos planesestrategicos) {
        String query = "DELETE FROM PLANES_ESTRATEGICOS WHERE CODPLANE=?";
        this.jdbcTemplate.update(query, planesestrategicos.getCodplane());
    }

    /**
     * Removes a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     */
    @Override
    public void darBajaplanE(PlanesEstrategicos planesestrategicos) {
        String query = "UPDATE PLANES_ESTRATEGICOS SET BAJA = 1 , FECHA_BAJA=SYSDATE,FECHA_MODIFICACION=SYSDATE ,CODTECNICOBAJA = ? WHERE CODPLANE=? AND CODVERSION=?";
        this.jdbcTemplate.update(query, planesestrategicos.getCodTecnico(), planesestrategicos.getCodplane(),
                planesestrategicos.getCodVersion());
    }

    /**
     * Finds a list of rows in the PlanesEstrategicos table.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @return List<PlanesEstrategicos>
     */
    @Override
    @Transactional(readOnly = true)
    public List<PlanesEstrategicos> findAll(PlanesEstrategicos planesEstrategicos, JQGridRequestDto jqGridRequestDto) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

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

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

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

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

    /**
     * Finds rows in the PlanesEstrategicos table using like.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<PlanesEstrategicos>
     */
    @Override
    @Transactional(readOnly = true)
    public List<PlanesEstrategicos> findAllLike(PlanesEstrategicos planesEstrategicos,
            JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
        List<Object> params = new ArrayList<Object>();
        StringBuilder query = new StringBuilder(
                this.getSelectCompletaPlanesEstrategicosQuery(planesEstrategicos, params));

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

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

    /**
     * Finds rows in the PlanesEstrategicos table using like.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<PlanesEstrategicos>
     */
    @Override
    @Transactional(readOnly = true)
    public List<PlanesEstrategicos> findAllLikeCopiar(PlanesEstrategicos planesEstrategicos,
            JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQueryCopiar(planesEstrategicos, true));

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMapCopiar(planesEstrategicos, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.BAJA=0 ");
        where.append(
                " AND t1.CODENTIDAD = t2.CODENTIDAD  AND t1.CODVERSION IN (SELECT MAX(t5.CODVERSION) FROM PLANES_ESTRATEGICOS t5 WHERE t5.CODPLANE = t1.CODPLANE) ");
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
            where.append(" AND t6.CODTECNICO = " + planesEstrategicos.getCodTecnico());
        }
        where.append(mapaWhere.get("query"));
        query.append(where);

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

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

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

    /**
     * 
     * @param codplane
     * @param jqGridRequestDto
     * @param startsWith
     * @return
     */
    @Override
    @Transactional(readOnly = true)
    public List<PlanesEstrategicos> findVersionesByPlanE(Integer codplane, JQGridRequestDto jqGridRequestDto,
            Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQueryVersiones(true));

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMapVersiones(codplane, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.BAJA=0 ");
        where.append(" AND t1.CODENTIDAD = t2.CODENTIDAD ");
        where.append(mapaWhere.get("query"));
        query.append(where);

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

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

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

    /*
     * OPERACIONES RUP_TABLE
     */

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

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereMap(planesEstrategicos);
        StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.BAJA=0 ");
        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 PlanesEstrategicos table using like.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param startsWith
     *            Boolean
     * @return Long
     */
    @Override
    @Transactional(readOnly = true)
    public Long findAllLikeCount(PlanesEstrategicos planesEstrategicos, Boolean startsWith) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        List<Object> params = new ArrayList<Object>();

        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
            query.append("SELECT COUNT(1) FROM ");

            if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getTipoEntidad() != null) {
                if (planesEstrategicos.getEntidad().getTipoEntidad().longValue() == TipoEntidadEnum.HERRI_ADMINISTRAZIOA
                        .getId()) {

                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3, PLANIFICACION t4");
                    if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
                        query.append(", PLANESESTR_TECNICOS t6 ");
                    }
                    query.append(this.getWhereTecnicoAdmon(planesEstrategicos, params, false));

                } else if (planesEstrategicos.getEntidad().getTipoEntidad()
                        .longValue() == TipoEntidadEnum.ENPRESA_PRIBATUA.getId()
                        || planesEstrategicos.getEntidad().getTipoEntidad().longValue() == TipoEntidadEnum.ENTE_PUBLIKOA
                                .getId()) {

                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3 ");
                    if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
                        query.append(", PLANESESTR_TECNICOS t6 ");
                    }
                    query.append(this.getWhereTecnicoEmpresa(planesEstrategicos, params, false));

                }

            }
        } else if (Constantes.USUARIO_HPS.equals(planesEstrategicos.getUsuarioConectado())) {
            if (planesEstrategicos.getEntidad() != null) {
                query.append("SELECT SUM(NVL(CUENTA,0)) FROM (");
                query.append(" SELECT COUNT(1) as CUENTA FROM ");
                query.append(
                        " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3, PLANIFICACION t4");
                if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
                    query.append(", PLANESESTR_TECNICOS t6 ");
                }
                query.append(this.getWhereTecnicoAdmon(planesEstrategicos, params, false));
                query.append(" UNION ");
                query.append(" SELECT COUNT(1) as CUENTA FROM ");
                query.append(
                        " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3 ");
                query.append(this.getWhereTecnicoEmpresa(planesEstrategicos, params, false));
                query.append(")  ");
            } else if (planesEstrategicos.getTipoEntidad() != null) {
                Integer tipoEntCount = Integer.parseInt(planesEstrategicos.getTipoEntidad());

                if (tipoEntCount == Constantes.TODOS_TIPOENTI) {
                    query.append("SELECT SUM(NVL(CUENTA,0)) FROM (");

                    query.append(" SELECT COUNT(1) as CUENTA FROM ");
                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3, PLANIFICACION t4");
                    if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
                        query.append(", PLANESESTR_TECNICOS t6 ");
                    }
                    query.append(this.getWhereTecnicoAdmon(planesEstrategicos, params, false));
                    query.append(" UNION ");
                    query.append(" SELECT COUNT(1) as CUENTA FROM ");
                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3 ");
                    query.append(this.getWhereTecnicoEmpresa(planesEstrategicos, params, false));
                    query.append(")  ");
                } else if (tipoEntCount == Constantes.HERRI_ADMINISTRAZIOA) {
                    query.append(" SELECT COUNT(1) as CUENTA FROM ");
                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3, PLANIFICACION t4");
                    if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
                        query.append(", PLANESESTR_TECNICOS t6 ");
                    }
                    query.append(this.getWhereTecnicoAdmon(planesEstrategicos, params, false));
                } else if (tipoEntCount == Constantes.ENTE_PUBLIKOA || tipoEntCount == Constantes.ENPRESA_PRIBATUA) {
                    query.append(" SELECT COUNT(1) as CUENTA FROM ");
                    query.append(
                            " (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
                    query.append(" PLANES_ESTRATEGICOS t1, ENTIDADES t3 ");
                    query.append(this.getWhereTecnicoEmpresa(planesEstrategicos, params, false));
                    query.append("AND t3.TIPO_ENTIDAD =");
                    query.append(tipoEntCount);
                }
            }
        }
        PlanesEstrategicosDaoImpl.logger.debug("SQL findAllLikeCount:".concat(query.toString()));
        PlanesEstrategicosDaoImpl.logger.debug("SQL findAllLikeCount params:".concat(params.toString()));

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

    /**
     * Counts rows in the PlanesEstrategicos table using like.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param startsWith
     *            Boolean
     * @return Long
     */
    @Override
    @Transactional(readOnly = true)
    public Long findAllLikeCopiarCount(PlanesEstrategicos planesEstrategicos, Boolean startsWith) {
        StringBuilder query = new StringBuilder(
                "SELECT COUNT(1) FROM PLANES_ESTRATEGICOS t1, ENTIDADES t2, PLANIFICACION t3 ");

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMapCopiar(planesEstrategicos, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.BAJA=0 ");
        where.append(
                " AND t1.CODENTIDAD = t2.CODENTIDAD AND t1.CODPLANIFICACION = t3.CODPLANIFICACION(+) AND t1.CODVERSION IN (SELECT MAX(t5.CODVERSION) FROM PLANES_ESTRATEGICOS t5 WHERE t5.CODPLANE = t1.CODPLANE) ");
        where.append(mapaWhere.get("query"));
        query.append(where);

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

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

    /**
     * 
     * @param plane
     * @param startsWith
     * @return
     */
    @Override
    @Transactional(readOnly = true)
    public Long findVersionesByPlanECount(Integer plane, Boolean startsWith) {
        StringBuilder query = new StringBuilder(
                "SELECT COUNT(1) FROM PLANES_ESTRATEGICOS t1, ENTIDADES t2, PLANIFICACION t3 ");

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMapVersiones(plane, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.BAJA=0 ");
        where.append(" AND t1.CODENTIDAD = t2.CODENTIDAD AND t1.CODPLANIFICACION = t3.CODPLANIFICACION(+) ");
        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 PlanesEstrategicos selected for rup_table
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<TableRowDto<PlanesEstrategicos>>
     */
    @Override
    public List<TableRowDto<PlanesEstrategicos>> reorderSelection(PlanesEstrategicos planesEstrategicos,
            JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

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

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

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

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

    /**
     * Remove multiple method for rup_table
     * 
     * @param filterPlanesEstrategicos
     *            PlanesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     */
    @Override
    public void removeMultiple(PlanesEstrategicos filterPlanesEstrategicos, JQGridRequestDto jqGridRequestDto,
            Boolean startsWith) {
        // SELECT - FROM
        /** TODO: select por clave */
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

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

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

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

    /*
     * MÉTODOS PRIVADOS
     */

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @param includeFrom
     *            boolean
     * @return String
     */
    private String getSelectFromQuery(boolean includeFrom) {
        StringBuilder query = new StringBuilder(
                "SELECT t1.CODPLANE CODPLANE, t1.CODVERSION, t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, t1.ANYOFIN ANYOFIN, ");
        query.append(
                " t1.INDICE_OBLIGAT INDICEOBLIGAT, t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS,   t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN, t1.FECHA_ALTA FECHAALTA, ");
        query.append(
                " t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t2.DESENTIDAD DESENTIDAD, t2.CIFNIF CIFNIF, t2.TIPO_ENTIDAD,t1.PORCENTAJE_BILIN , ");
        query.append(" t3.DESCAS DESCAS, t3.DESEUS DESEUS, t3.FECHAINICIO FINICIO, t3.FECHAFIN FFIN ");
        if (includeFrom) {
            query.append(
                    " FROM PLANES_ESTRATEGICOS t1 INNER JOIN ENTIDADES t2 ON t2.CODENTIDAD = t1.CODENTIDAD INNER JOIN PLANIFICACION t3 ON t1.CODPLANIFICACION = t3.CODPLANIFICACION ");
        }
        return query.toString();
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @param includeFrom
     *            boolean
     * @return String
     */
    private String getSelectFromQueryCopiar(PlanesEstrategicos planesestrategicos, boolean includeFrom) {
        StringBuilder query = new StringBuilder(
                "SELECT t1.CODPLANE CODPLANE, t1.CODVERSION, t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, t1.ANYOFIN ANYOFIN, ");
        query.append(
                " t1.INDICE_OBLIGAT INDICEOBLIGAT, t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS,   t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN, t1.FECHA_ALTA FECHAALTA, ");
        query.append(
                " t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t2.DESENTIDAD DESENTIDAD, t2.CIFNIF CIFNIF, t2.TIPO_ENTIDAD,t1.PORCENTAJE_BILIN , ");
        query.append(" t3.DESCAS DESCAS, t3.DESEUS DESEUS, t3.FECHAINICIO FINICIO, t3.FECHAFIN FFIN ");
        if (includeFrom) {
            query.append(
                    " FROM PLANES_ESTRATEGICOS t1 INNER JOIN ENTIDADES t2 ON t2.CODENTIDAD = t1.CODENTIDAD LEFT OUTER JOIN PLANIFICACION t3 ON t1.CODPLANIFICACION = t3.CODPLANIFICACION ");
            if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesestrategicos.getUsuarioConectado())) {
                query.append(" INNER JOIN AB3917T00 t6  ON t1.CODPLANE  = t6.CODPLANE ");
            }
        }
        return query.toString();
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @param includeFrom
     *            boolean
     * @return String
     */
    private String getSelectFromQueryVersiones(boolean includeFrom) {
        StringBuilder query = new StringBuilder(
                "SELECT t1.CODPLANE CODPLANE, t1.CODVERSION CODVERSION, t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, t1.ANYOFIN ANYOFIN, ");
        query.append(
                " t1.INDICE_OBLIGAT INDICEOBLIGAT, t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS,   t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN, t1.FECHA_ALTA FECHAALTA, ");
        query.append(
                " t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t2.DESENTIDAD DESENTIDAD, t2.CIFNIF CIFNIF, t2.TIPO_ENTIDAD,t1.PORCENTAJE_BILIN , ");
        query.append(" t3.DESCAS DESCAS, t3.DESEUS DESEUS, ");
        query.append(" DECODE (T1.CODPLANIFICACION, NULL, T1.ANYOINICIO, T3.FECHAINICIO) FINICIO,");
        query.append(" DECODE (T1.CODPLANIFICACION, NULL, T1.ANYOFIN, T3.FECHAFIN) FFIN ");

        if (includeFrom) {
            query.append(
                    " FROM PLANES_ESTRATEGICOS t1 INNER JOIN ENTIDADES t2 ON t2.CODENTIDAD = t1.CODENTIDAD LEFT OUTER JOIN PLANIFICACION t3 ON t1.CODPLANIFICACION = t3.CODPLANIFICACION ");
        }
        return query.toString();
    }

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

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

        if (planesEstrategicos != null) {

            if (planesEstrategicos.getNivelCumplimientoReqeus() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NIVEL_CUMPLIMIENTO_REQEUS",
                        planesEstrategicos.getNivelCumplimientoReqeus());
            }
            if (planesEstrategicos.getAnyofin() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.ANYOFIN", planesEstrategicos.getAnyofin());
            }
            if (planesEstrategicos.getIndiceObligat() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.INDICE_OBLIGAT", planesEstrategicos.getIndiceObligat());
            }
            if (planesEstrategicos.getFechaAceptacionPlan() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.FECHA_ACEPTACION_PLAN",
                        planesEstrategicos.getFechaAceptacionPlan());
            }
            if (planesEstrategicos.getNombre() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NOMBRE", planesEstrategicos.getNombre());
            }
            if (planesEstrategicos.getCodplane() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODPLANE", planesEstrategicos.getCodplane());
            }
            if (planesEstrategicos.getAnyoinicio() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.ANYOINICIO", planesEstrategicos.getAnyoinicio());
            }
            if (planesEstrategicos.getNombreeus() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NOMBREEUS", planesEstrategicos.getNombreeus());
            }
            if (planesEstrategicos.getSolitudTxostena() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.SOLICITUDTXOSTENA", planesEstrategicos.getSolitudTxostena());
            }
        }

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

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

        if (planesEstrategicos != null) {
            if (planesEstrategicos.getCodplane() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODPLANE", planesEstrategicos.getCodplane(), startsWith);
            }
            if (planesEstrategicos.getNombreeus() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBREEUS", planesEstrategicos.getNombreeus(),
                        startsWith);
            }
            if (planesEstrategicos.getAnyoinicio() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.ANYOINICIO", planesEstrategicos.getAnyoinicio(),
                        startsWith);
            }
            if (planesEstrategicos.getAnyofin() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.ANYOFIN", planesEstrategicos.getAnyofin(), startsWith);
            }
            if (planesEstrategicos.getNivelCumplimientoReqeus() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NIVEL_CUMPLIMIENTO_REQEUS",
                        planesEstrategicos.getNivelCumplimientoReqeus(), startsWith);
            }
            if (planesEstrategicos.getFechaAceptacionPlan() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.FECHA_ACEPTACION_PLAN",
                        planesEstrategicos.getFechaAceptacionPlan(), startsWith);
            }
            if (planesEstrategicos.getIndiceObligat() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.INDICE_OBLIGAT", planesEstrategicos.getIndiceObligat(),
                        startsWith);
            }
            if (planesEstrategicos.getNombre() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBRE", planesEstrategicos.getNombre(), startsWith);
            }
            if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getCifnif() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t2.CIFNIF", planesEstrategicos.getEntidad().getCifnif(),
                        startsWith);
            }
            if (planesEstrategicos.getPlanificacion() != null
                    && planesEstrategicos.getPlanificacion().getDescas() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t3.DESCAS",
                        planesEstrategicos.getPlanificacion().getDescas(), startsWith);
            }
            if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getDesentidad() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t2.DESENTIDAD",
                        planesEstrategicos.getEntidad().getDesentidad(), startsWith);
            }
            if (planesEstrategicos.getPlanificacion() != null
                    && planesEstrategicos.getPlanificacion().getDeseus() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t3.DESEUS",
                        planesEstrategicos.getPlanificacion().getDeseus(), startsWith);
            }
            if (planesEstrategicos.getEntidades() != null && !planesEstrategicos.getEntidades().isEmpty()) {
                where.append(UtilSQL.AND);
                where.append(" t1.CODENTIDAD IN (");
                for (Entidades entidad : planesEstrategicos.getEntidades()) {
                    if (entidad.getTipoEntidad().intValue() == planesEstrategicos.getEntidad().getTipoEntidad()
                            .intValue()) {
                        where.append("?,");
                        params.add(entidad.getCodentidad());
                    }

                }
                where = new StringBuilder(where.substring(0, where.length() - 1));
                where.append(") ");
            }
            if (planesEstrategicos.getSolitudTxostena() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.SOLICITAR_TXOSTENA",
                        planesEstrategicos.getSolitudTxostena(), startsWith);
            }

        }

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

        return mapWhere;
    }

    /**
     * 
     * @param planesEstrategicos
     * @param startsWith
     * @return
     */
    private Map<String, Object> getWhereLikeMapCopiar(PlanesEstrategicos planesEstrategicos, Boolean startsWith) {

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

        if (planesEstrategicos != null) {
            if (planesEstrategicos.getFechaAceptacionPlan() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.FECHA_ACEPTACION_PLAN",
                        planesEstrategicos.getFechaAceptacionPlan(), startsWith);
            }
            if (planesEstrategicos.getNombre() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBRE", planesEstrategicos.getNombre(), startsWith);
            }
            if (planesEstrategicos.getCodplane() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODPLANE", planesEstrategicos.getCodplane(), startsWith);
            }
            if (planesEstrategicos.getAnyoinicio() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.ANYOINICIO", planesEstrategicos.getAnyoinicio(),
                        startsWith);
            }
            if (planesEstrategicos.getNivelCumplimientoReqeus() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NIVEL_CUMPLIMIENTO_REQEUS",
                        planesEstrategicos.getNivelCumplimientoReqeus(), startsWith);
            }
            if (planesEstrategicos.getEntidades() != null && !planesEstrategicos.getEntidades().isEmpty()) {
                where.append(UtilSQL.AND);
                where.append(" t1.CODENTIDAD IN (");
                for (Entidades entidad : planesEstrategicos.getEntidades()) {
                    if (entidad.getTipoEntidad().intValue() == planesEstrategicos.getEntidad().getTipoEntidad()
                            .intValue()) {
                        where.append("?,");
                        params.add(entidad.getCodentidad());
                    }

                }
                where = new StringBuilder(where.substring(0, where.length() - 1));
                where.append(") ");

                if (planesEstrategicos.getNombreeus() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBREEUS", planesEstrategicos.getNombreeus(),
                            startsWith);
                }
                if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getCifnif() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.CIFNIF", planesEstrategicos.getEntidad().getCifnif(),
                            startsWith);
                }
                if (planesEstrategicos.getEntidad() != null
                        && planesEstrategicos.getEntidad().getDesentidad() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.DESENTIDAD",
                            planesEstrategicos.getEntidad().getDesentidad(), startsWith);
                }
                if (planesEstrategicos.getAnyofin() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t1.ANYOFIN", planesEstrategicos.getAnyofin(),
                            startsWith);
                }
                if (planesEstrategicos.getIndiceObligat() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t1.INDICE_OBLIGAT",
                            planesEstrategicos.getIndiceObligat(), startsWith);
                }
                if (planesEstrategicos.getPlanificacion() != null
                        && planesEstrategicos.getPlanificacion().getDescas() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t3.DESCAS",
                            planesEstrategicos.getPlanificacion().getDescas(), startsWith);
                }
                if (planesEstrategicos.getPlanificacion() != null
                        && planesEstrategicos.getPlanificacion().getDeseus() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t3.DESEUS",
                            planesEstrategicos.getPlanificacion().getDeseus(), startsWith);
                }
                if (planesEstrategicos.getSolitudTxostena() != null
                        && Constantes.TXOSTENA_TODOS != planesEstrategicos.getSolitudTxostena().intValue()) {
                    UtilSQL.createFilterSQL(where, params, "t1.SOLICITAR_TXOSTENA",
                            planesEstrategicos.getSolitudTxostena());
                }

            }

        }

        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
     * PlanesEstrategicos entity
     * 
     * @param codplane
     *            Integer
     * @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> getWhereLikeMapVersiones(Integer codplane, Boolean startsWith) {

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

        if (codplane != null) {
            UtilSQL.createFilterLikeSQL(where, params, "t1.CODPLANE", codplane, startsWith);
        }

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

        return mapWhere;
    }

    /**
     * Operacion CRUD Edit. Modificacion del bean indicado. Solicitar informe
     *
     * @param planesEstrategicos
     *            PlanesEstrategicos Bean que contiene la informacion a modificar.
     * @return PlanesEstrategicos Bean resultante de la modificacion.
     */
    @Override
    public PlanesEstrategicos editInforme(PlanesEstrategicos planesEstrategicos) {
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.findAll: Inicio editInforme");
        StringBuilder query = new StringBuilder(
                "UPDATE PLANES_ESTRATEGICOS SET SOLICITAR_TXOSTENA=?, FECHA_MODIFICACION=SYSDATE ");
        query.append(" WHERE CODPLANE=? AND CODVERSION=? ");
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.findAll: sql:" + query.toString());
        PlanesEstrategicosDaoImpl.logger
                .info("PlanesEstrategicosDaoImpl.findAll: params:" + planesEstrategicos.toString());
        this.jdbcTemplate.update(query.toString(), Constantes.TXOSTENA_SOLICITADO, planesEstrategicos.getCodplane(),
                planesEstrategicos.getCodVersion());

        return planesEstrategicos;
    }

    /**
     * Counts rows in the PlanesEstrategicos table.
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @return Long
     */
    @Override
    @Transactional(readOnly = true)
    public Long borraPlanTieneGestion(PlanesEstrategicos planesEstrategicos) {
        StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM PLANES_GESTION WHERE CODPLANE = "
                + planesEstrategicos.getCodplane() + " AND BAJA = 0 ");

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

    /**
     * Operación que carga los planes estratégicos
     * 
     * @param planEs
     * @return Long
     */
    @Override
    public void generarPlanEstrategico(PlanesEstrategicos planesEstrategicos) {
        PlanesEstrategicosDaoImpl.logger.info("generarPlanEstrategico Inicio");
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("{call GENERA_PLAN_ESTATEGICO (?)}");
        PlanesEstrategicosDaoImpl.logger.info(query.toString());
        final String procedureCall = query.toString();
        final int codPlanEs = planesEstrategicos.getCodplane();

        SqlParameter parametro = new SqlParameter(Types.NUMERIC);

        List<SqlParameter> paramArray = new ArrayList<SqlParameter>();
        paramArray.add(parametro);

        Map<String, Object> resultMap = this.jdbcTemplate.call(new CallableStatementCreator() {
            @Override
            public CallableStatement createCallableStatement(Connection connection) throws SQLException {

                CallableStatement callableStatement = connection.prepareCall(procedureCall);
                callableStatement.setInt(1, codPlanEs);
                PlanesEstrategicosDaoImpl.logger.info("codPlanEs");
                return callableStatement;

            }
        }, paramArray);

    }

    /**
     * 
     * @param planesEstrategicos
     */
    @Override
    public Integer crearCopiaPlanEstrategico(Integer codplanorigen, Integer codplandestino) {
        PlanesEstrategicosDaoImpl.logger.info("crearCopiaPlanEstrategico Inicio");
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("{call COPIA_PLAN_ESTATEGICO (?,?)}");
        PlanesEstrategicosDaoImpl.logger.info(query.toString());
        final String procedureCall = query.toString();
        final int codPlanOrigen = codplanorigen;
        final int codPlanDestino = codplandestino;

        SqlParameter parametro = new SqlParameter(Types.NUMERIC);
        SqlParameter parametro2 = new SqlParameter(Types.NUMERIC);

        List<SqlParameter> paramArray = new ArrayList<SqlParameter>();
        paramArray.add(parametro);
        paramArray.add(parametro2);

        Map<String, Object> resultMap = this.jdbcTemplate.call(new CallableStatementCreator() {
            @Override
            public CallableStatement createCallableStatement(Connection connection) throws SQLException {

                CallableStatement callableStatement = connection.prepareCall(procedureCall);
                callableStatement.setInt(Constantes.NUM_UNO, codPlanOrigen);
                callableStatement.setInt(Constantes.NUM_DOS, codPlanDestino);
                PlanesEstrategicosDaoImpl.logger.info("codPlanEs");
                PlanesEstrategicosDaoImpl.logger.info("codEntidad");
                return callableStatement;

            }
        }, paramArray);
        return codPlanDestino;
    }

    /**
     * Finds a List of rows in the PlanesEstrategicos table.
     *
     * @param planesEstrategicos
     *            PlanesEstrategicos planesEstrategicos
     * @param jqGridRequestDto
     *            JQGridRequestDto jqGridRequestDto
     * @return List lista
     */
    @Override
    public List<PlanesEstrategicos> findAllCombo(PlanesEstrategicos planesEstrategicos,
            JQGridRequestDto jqGridRequestDto) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "SELECT DISTINCT t1.CODPLANE CODPLANE, (SELECT MAX (CODVERSION) FROM PLANES_ESTRATEGICOS t5 WHERE t5.CODPLANE = t1.CODPLANE) CODVERSION, ");
        query.append(
                "t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, t1.ANYOINICIO ANYOINICIO, t1.ANYOFIN ANYOFIN FROM PLANES_ESTRATEGICOS t1");

        if (planesEstrategicos.getCodTecnico() != null) {
            query.append(" INNER JOIN PLANESESTR_TECNICOS t2  ON t1.CODPLANE    = t2.CODPLANE ");
        }

        // Where clause & Params

        Map<String, ?> mapaWhere = this.getWhereMap(planesEstrategicos);
        StringBuilder where = new StringBuilder(
                " WHERE 1=1 AND t1.BAJA=0 AND t1.CODVERSION = CODVERSION  AND  t1.ANYOFIN > to_char(sysdate, 'YYYY') ");
        List<Object> params = new ArrayList<Object>();
        if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getCodentidad() != null) {
            UtilSQL.createFilterSQL(where, params, "t1.CODENTIDAD", planesEstrategicos.getEntidad().getCodentidad());
        }
        if (planesEstrategicos.getCodTecnico() != null) {
            UtilSQL.createFilterSQL(where, params, "t2.CODTECNICO", planesEstrategicos.getCodTecnico());
        }
        where.append(mapaWhere.get("query"));
        query.append(where);

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

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

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

    /**
     * Finds a single row in the PlanesEstrategicos table.
     *
     * @param planesestrategicos
     *            PlanesEstrategicos
     * @return PlanesEstrategicos
     */
    @Override
    @Transactional(readOnly = true)
    public PlanesEstrategicos findFechas(PlanesEstrategicos planesestrategicos) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("SELECT DISTINCT t1.CODPLANE CODPLANE, t1.CODVERSION CODVERSION, ");
        query.append(
                "t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, t1.ANYOFIN ANYOFIN, t1.INDICE_OBLIGAT INDICEOBLIGAT, ");
        query.append(
                "t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS, t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN, t1.FECHA_ALTA FECHAALTA, t1.NOMBRE NOMBRE, ");
        query.append(
                "t1.NOMBREEUS NOMBREEUS, t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t2.DESENTIDAD DESENTIDAD, t2.CIFNIF CIFNIF, t2.TIPO_ENTIDAD, ");
        query.append(
                "t1.PORCENTAJE_BILIN FROM PLANES_ESTRATEGICOS t1 INNER JOIN ENTIDADES t2 ON t2.CODENTIDAD = t1.CODENTIDAD");
        // WHERE
        query.append(" WHERE t1.CODPLANE = ? ");
        query.append(
                " AND t1.CODVERSION IN (SELECT MAX (t5.CODVERSION) FROM PLANES_ESTRATEGICOS t5 WHERE t5.CODPLANE = t1.CODPLANE) ");
        PlanesEstrategicosDaoImpl.logger.info("PlanesEstrategicosDaoImpl.find: sql:" + query.toString());
        PlanesEstrategicosDaoImpl.logger
                .info("PlanesEstrategicosDaoImpl.find: params:" + planesestrategicos.toString());

        List<PlanesEstrategicos> planesestrategicosList = this.jdbcTemplate.query(query.toString(), this.rwMap,
                planesestrategicos.getCodplane());
        return DataAccessUtils.uniqueResult(planesestrategicosList);
    }

    /**
     * Recupera la select (union) para la busqueda de planes estrategicos
     * 
     * @param planesEstrategicos
     *            PlanesEstrategicos
     * @param params
     *            List<Object>
     * @return String
     */
    private String getSelectCompletaPlanesEstrategicosQuery(PlanesEstrategicos planesEstrategicos,
            List<Object> params) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEstrategicos.getUsuarioConectado())) {
            if (planesEstrategicos.getEntidad() != null && planesEstrategicos.getEntidad().getTipoEntidad() != null) {
                if (planesEstrategicos.getEntidad().getTipoEntidad().longValue() == TipoEntidadEnum.HERRI_ADMINISTRAZIOA
                        .getId()) {

                    query.append(this.getSelectFromQueryTecnicoAdmon(planesEstrategicos, params));

                } else if (planesEstrategicos.getEntidad().getTipoEntidad()
                        .longValue() == TipoEntidadEnum.ENPRESA_PRIBATUA.getId()
                        || planesEstrategicos.getEntidad().getTipoEntidad().longValue() == TipoEntidadEnum.ENTE_PUBLIKOA
                                .getId()) {

                    query.append(this.getSelectFromQueryTecnicoEmpresa(planesEstrategicos, params));

                }

            }
        } else if (Constantes.USUARIO_HPS.equals(planesEstrategicos.getUsuarioConectado())) {
            if (planesEstrategicos.getEntidad() != null) {
                query.append(this.getSelectFromQueryTecnicoAdmon(planesEstrategicos, params));
                query.append(" UNION ");
                query.append(this.getSelectFromQueryTecnicoEmpresa(planesEstrategicos, params));
            } else if (planesEstrategicos.getTipoEntidad() != null) {
                // Informamos del filtro por Entidad
                Integer tipoEntPE = Integer.parseInt(planesEstrategicos.getTipoEntidad());

                if (tipoEntPE == Constantes.TODOS_TIPOENTI) {
                    query.append(this.getSelectFromQueryTecnicoAdmon(planesEstrategicos, params));
                    query.append(" UNION ");
                    query.append(this.getSelectFromQueryTecnicoEmpresa(planesEstrategicos, params));
                } else if (tipoEntPE == Constantes.HERRI_ADMINISTRAZIOA) {
                    query.append(this.getSelectFromQueryTecnicoAdmon(planesEstrategicos, params));
                } else if (tipoEntPE == Constantes.ENTE_PUBLIKOA || tipoEntPE == Constantes.ENPRESA_PRIBATUA) {
                    query.append(this.getSelectFromQueryTecnicoEmpresa(planesEstrategicos, params));
                    query.append("AND t3.TIPO_ENTIDAD =");
                    query.append(tipoEntPE);
                }

            }
        }
        return query.toString();
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @return StringBuilder
     */
    private StringBuilder getSelectFromQueryTecnicoAdmon(PlanesEstrategicos planesEs, List<Object> params) {

        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                " SELECT DISTINCT t1.CODPLANE CODPLANE, t1.FECHA_MODIFICACION FECHAMODIFICACION, t1.CODVERSION, t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, ");
        query.append(
                " t1.ANYOFIN ANYOFIN, t1.INDICE_OBLIGAT INDICEOBLIGAT,  t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS, ");
        query.append(
                " t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN, t1.FECHA_ALTA FECHAALTA,  t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, ");
        query.append(
                " t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t1.PORCENTAJE_BILIN, T1.CODENTIDAD CODENTIDADP, t3.DESENTIDAD DESENTIDAD, ");
        query.append(" t4.CODPLANIFICACION CODPLANI, T4.FECHAINICIO FINICIO, T4.FECHAFIN FFIN ");
        query.append(",(SELECT NVL(COUNT(PEV.CODVERSION),0) ");
        query.append(" FROM PLANES_ESTRATEGICOS PEV ");
        query.append(" WHERE T1.CODPLANE=PEV.CODPLANE ");
        query.append(" GROUP BY CODPLANE) AS TIENEVERSION ");
        query.append(" ,DECODE(TIENEPGALTA.NUMPLANG,null,0,TIENEPGALTA.NUMPLANG)AS TIENEPGALTA ");
        query.append(
                "FROM (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
        query.append(
                " PLANES_ESTRATEGICOS t1, ENTIDADES t3, PLANIFICACION t4, (SELECT COUNT(1) AS NUMPLANG, PLANES_GESTION.CODPLANE AS CODPLANE FROM PLANES_GESTION WHERE PLANES_GESTION.BAJA = 0 GROUP BY PLANES_GESTION.CODPLANE ) TIENEPGALTA ");
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            query.append(", PLANESESTR_TECNICOS t6 ");
        }
        query.append(this.getWhereTecnicoAdmon(planesEs, params, true));
        return query;
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @return StringBuilder
     */
    private StringBuilder getSelectFromQueryTecnicoEmpresa(PlanesEstrategicos planesEs, List<Object> params) {

        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "SELECT DISTINCT t1.CODPLANE CODPLANE, t1.FECHA_MODIFICACION FECHAMODIFICACION, t1.CODVERSION, t1.CODENTIDAD CODENTIDAD, t1.CODPLANIFICACION CODPLANIFICACION, t1.ANYOINICIO ANYOINICIO, ");
        query.append(
                "t1.ANYOFIN ANYOFIN, t1.INDICE_OBLIGAT INDICEOBLIGAT, t1.NIVEL_CUMPLIMIENTO_REQEUS NIVELCUMPLIMIENTOREQEUS, t1.FECHA_ACEPTACION_PLAN FECHAACEPTACIONPLAN,");
        query.append(
                " t1.FECHA_ALTA FECHAALTA, t1.NOMBRE NOMBRE, t1.NOMBREEUS NOMBREEUS, t1.SOLICITAR_TXOSTENA SOLICITUDTXOSTENA, t1.PORCENTAJE_BILIN, ");
        query.append(
                " T1.CODENTIDAD CODENTIDADP, t3.DESENTIDAD DESENTIDAD, TO_NUMBER (NULL) CODPLANI, t1.ANYOINICIO FINICIO, t1.ANYOFIN FFIN ");
        query.append(",(SELECT NVL(COUNT(PEV.CODVERSION),0) ");
        query.append(" FROM PLANES_ESTRATEGICOS PEV ");
        query.append(" WHERE T1.CODPLANE=PEV.CODPLANE ");
        query.append(" GROUP BY CODPLANE) AS TIENEVERSION ");
        query.append(" ,DECODE(TIENEPGALTA.NUMPLANG,null,0,TIENEPGALTA.NUMPLANG)AS TIENEPGALTA ");
        query.append(
                " FROM (SELECT MAX (T5.CODVERSION) CODVER, T5.CODPLANE FROM PLANES_ESTRATEGICOS t5 GROUP BY T5.CODPLANE) PLANES, ");
        query.append(
                " PLANES_ESTRATEGICOS t1, ENTIDADES t3, (SELECT COUNT(1) AS NUMPLANG, PLANES_GESTION.CODPLANE AS CODPLANE FROM PLANES_GESTION  WHERE PLANES_GESTION.BAJA = 0 GROUP BY PLANES_GESTION.CODPLANE ) TIENEPGALTA ");
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            query.append(", PLANESESTR_TECNICOS t6 ");
        }
        query.append(this.getWhereTecnicoEmpresa(planesEs, params, true));
        return query;
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @return StringBuilder
     */
    private StringBuilder getWhereTecnicoAdmon(PlanesEstrategicos planesEs, List<Object> params, boolean tieneplang) {

        StringBuilder where = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        where.append(" WHERE 1 = 1 AND t1.BAJA=0 AND t1.CODPLANE = PLANES.CODPLANE AND T1.CODVERSION = PLANES.CODVER ");
        where.append(" AND T3.CODENTIDAD = t1.CODENTIDAD AND T3.TIPO_ENTIDAD = ? ");
        if (tieneplang) {
            where.append(" AND t1.CODPLANE = TIENEPGALTA.CODPLANE(+) ");
        }
        where.append(" AND t1.CODPLANIFICACION = t4.CODPLANIFICACION ");
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            where.append(" AND t1.CODPLANE = t6.CODPLANE ");
        }
        params.add(TipoEntidadEnum.HERRI_ADMINISTRAZIOA.getId());

        if (planesEs.getSolitudTxostena() != null && Constantes.TXOSTENA_TODOS != planesEs.getSolitudTxostena()) {
            where.append("  AND t1.SOLICITAR_TXOSTENA = ? ");
            params.add(planesEs.getSolitudTxostena());
        }
        if (planesEs.getEntidad() != null) {
            Entidades entidad = planesEs.getEntidad();

            if (entidad.getCodentidad() != null) {
                where.append("  AND T1.CODENTIDAD= ? ");
                params.add(entidad.getCodentidad());
            }
            if (entidad.getDesentidad() != null && entidad.getDesentidad().trim().length() > 0) {
                UtilSQL.createFilterLikeSQL(where, params, "t3.DESENTIDAD", entidad.getDesentidad(), false);
            }

        }
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            where.append(" AND t6.CODTECNICO = ? ");
            params.add(planesEs.getCodTecnico());
        }
        if (planesEs.getCodplane() != null) {
            where.append(" AND t1.CODPLANE = ?");
            params.add(planesEs.getCodplane());
        }
        if (planesEs.getNombre() != null && planesEs.getNombre().trim().length() > 0) {
            UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBRE", planesEs.getNombre().trim(), false);
        }
        if (planesEs.getNombreeus() != null && planesEs.getNombreeus().trim().length() > 0) {
            UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBREEUS", planesEs.getNombreeus().trim(), false);
        }
        if (planesEs.getAnyoinicio() != null) {
            UtilSQL.createFilterSQL(where, params, "T1.ANYOINICIO", planesEs.getAnyoinicio());
        }

        return where;
    }

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @return StringBuilder
     */
    private StringBuilder getWhereTecnicoEmpresa(PlanesEstrategicos planesEs, List<Object> params, boolean tieneplang) {

        StringBuilder where = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        where.append(
                "WHERE 1 = 1 AND t1.BAJA=0 AND t1.CODPLANE = PLANES.CODPLANE AND T1.CODVERSION = PLANES.CODVER AND ");
        where.append("T3.CODENTIDAD = t1.CODENTIDAD ");
        if (tieneplang) {
            where.append(" AND t1.CODPLANE  = TIENEPGALTA.CODPLANE(+) ");
        }
        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            where.append(" AND t1.CODPLANE = t6.CODPLANE ");
        }
        where.append(" AND T3.TIPO_ENTIDAD IN (?, ?) ");
        params.add(TipoEntidadEnum.ENPRESA_PRIBATUA.getId());
        params.add(TipoEntidadEnum.ENTE_PUBLIKOA.getId());

        if (planesEs.getSolitudTxostena() != null && Constantes.TXOSTENA_TODOS != planesEs.getSolitudTxostena()) {
            where.append("  AND t1.SOLICITAR_TXOSTENA = ?");
            params.add(planesEs.getSolitudTxostena());
        }

        if (planesEs.getEntidad() != null && planesEs.getEntidad() != null) {
            Entidades entidad = planesEs.getEntidad();

            if (entidad.getCodentidad() != null) {
                where.append("  AND t1.CODENTIDAD =? ");
                params.add(entidad.getCodentidad());
            }
            if (entidad.getDesentidad() != null && entidad.getDesentidad().trim().length() > 0) {
                UtilSQL.createFilterLikeSQL(where, params, "T3.DESENTIDAD", entidad.getDesentidad().trim(), false);
            }

        }

        if (Constantes.USUARIO_TEC_ENTIDAD.equals(planesEs.getUsuarioConectado())) {
            where.append(" AND t6.CODTECNICO = ? ");
            params.add(planesEs.getCodTecnico());
        }

        if (planesEs.getCodplane() != null) {
            where.append(" AND t1.CODPLANE = ?");
            params.add(planesEs.getCodplane());
        }
        if (planesEs.getNombre() != null && planesEs.getNombre().trim().length() > 0) {
            UtilSQL.createFilterLikeSQL(where, params, "T1.NOMBRE", planesEs.getNombre().trim(), false);
        }
        if (planesEs.getNombreeus() != null && planesEs.getNombreeus().trim().length() > 0) {
            UtilSQL.createFilterLikeSQL(where, params, "T1.NOMBREEUS", planesEs.getNombreeus().trim(), false);
        }
        if (planesEs.getAnyoinicio() != null) {
            UtilSQL.createFilterSQL(where, params, "T1.ANYOINICIO", planesEs.getAnyoinicio());
        }

        return where;
    }

    /**
     * 
     * @param plan
     *            PlanesEstrategicos
     * @return PlanesEstrategicos plan
     */
    @Override
    @Transactional(readOnly = true)
    public PlanesEstrategicos findPlanMaxVersionByCodPlan(PlanesEstrategicos plan) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("SELECT NVL(MAX(T1.CODVERSION),1) FROM PLANES_ESTRATEGICOS T1 WHERE T1.CODPLANE=? ");
        PlanesEstrategicosDaoImpl.logger.debug("findPlanMaxVersionByCodPlan:SQL:".concat(query.toString()));
        PlanesEstrategicosDaoImpl.logger.debug("findPlanMaxVersionByCodPlan:params:"
                .concat(((plan != null && plan.getCodplane() != null) ? String.valueOf(plan.getCodplane()) : "")));

        Integer codVersion = this.jdbcTemplate.queryForObject(query.toString(), Integer.class, plan.getCodplane());
        PlanesEstrategicosDaoImpl.logger.debug("findPlanMaxVersionByCodPlan:version encontrada:"
                .concat((codVersion != null ? String.valueOf(codVersion) : "")));

        PlanesEstrategicos obj = null;
        if (codVersion != null) {
            plan.setCodVersion(codVersion);
            obj = this.find(plan);
        }

        return obj;
    }

    /**
     * Versiona el Plan estrategico
     * 
     * @param planEstrategico
     *            PlanesEstrategicos plan estrategico
     */
    @Override
    public void crearVersionPlanEstrategico(PlanesEstrategicos planEstrategico) {

        PlanesEstrategicosDaoImpl.logger.info("crearVersionPlanEstrategico Inicio");
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("{call VERSIONA_PLAN_ESTATEGICO (?)}");
        PlanesEstrategicosDaoImpl.logger.info(query.toString());
        final String procedureCall = query.toString();
        final int codigoPlan = planEstrategico.getCodplane();
        SqlParameter parametro = new SqlParameter(Types.NUMERIC);

        List<SqlParameter> paramArray = new ArrayList<SqlParameter>();
        paramArray.add(parametro);

        this.jdbcTemplate.call(new CallableStatementCreator() {
            @Override
            public CallableStatement createCallableStatement(Connection connection) throws SQLException {

                CallableStatement callableStatement = connection.prepareCall(procedureCall);
                callableStatement.setInt(1, codigoPlan);
                PlanesEstrategicosDaoImpl.logger.info("codPlanEs");
                return callableStatement;
            }
        }, paramArray);

    }

    /**
     * solicitar informe
     * 
     * @param planEstrategico
     *            PlanesEstrategicos planEstrategico
     */
    @Override
    public void solicitarInformeNo(PlanesEstrategicos planEstrategico) {

        PlanesEstrategicosDaoImpl.logger.info("solicitarInformeNo Inicio");
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append("UPDATE PLANES_ESTRATEGICOS SET SOLICITAR_TXOSTENA=0 , FECHA_MODIFICACION=SYSDATE ");
        query.append(" WHERE CODPLANE=? AND CODVERSION=? ");
        PlanesEstrategicosDaoImpl.logger.info("solicitarInformeNo: sql:" + query.toString());
        PlanesEstrategicosDaoImpl.logger.info("solicitarInformeNo: params:" + planEstrategico.toString());
        this.jdbcTemplate.update(query.toString(), planEstrategico.getCodplane(), planEstrategico.getCodVersion());

    }
}