package com.ejie.ab39a.dao;

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.UtilSQL;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.ejie.ab39a.constantes.Constantes;
import com.ejie.ab39a.constantes.SecuenciasSQL;
import com.ejie.ab39a.model.AccionesPg;

/**
 * AccionesPgDaoImpl.
 * 
 *  
 */

@Repository
@Transactional
public class AccionesPgDaoImpl implements AccionesPgDao {

    private static final Logger logger = LoggerFactory.getLogger(ElementosArbolDaoImpl.class);

    private static final String[] ORDER_BY_WHITE_LIST = new String[] { "CODACCIONPG", "CODELEMPG", "NUMRECEPTORES",
            "NUMRECEPH", "NUMRECEPM", "CODSITUACIONFINAL", "ORDEN", "NOMBRE", "NOMBRECAS", "NUEVAFECHAPREV", "IDACCION",
            "RESPONSABLE", "FECHAPREV", "CODTIPORECEPTOR", "RAZON_APLAZA", "MOTIVO_CANCELA", "DESCRIPCION" };

    private JdbcTemplate jdbcTemplate;

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

            return new AccionesPg(resultSet.getInt("CODACCIONPG"), resultSet.getInt("CODELEMPG"),
                    resultSet.getInt("NUMRECEPTORES"), resultSet.getLong("NUMRECEPH"), resultSet.getLong("NUMRECEPM"),
                    resultSet.getInt("CODSITUACIONFINAL"), resultSet.getLong("ORDEN"), resultSet.getString("NOMBRE"),
                    resultSet.getString("NOMBRECAS"), resultSet.getDate("NUEVAFECHAPREV"), resultSet.getInt("IDACCION"),
                    resultSet.getString("RESPONSABLE"), resultSet.getDate("FECHAPREV"),
                    resultSet.getLong("CODTIPORECEPTOR"), resultSet.getString("RAZONAPLAZA"),
                    resultSet.getString("MOTIVOCANCELA"), resultSet.getString("DESCRIPCION"),
                    resultSet.getString("DESCRIPCIONCAS"), resultSet.getString("MOTIVO_CANCELA_CAS"),
                    resultSet.getString("RAZON_APLAZA_CAS"), resultSet.getString("OBSERVACIONES"),
                    resultSet.getString("OBSERVACIONESCAS"), resultSet.getLong("ELEMBASE"),
                    resultSet.getLong("RESULTHECHA"));
        }
    };

    private RowMapper<AccionesPg> rwMapNombres = new RowMapper<AccionesPg>() {
        @Override
        public AccionesPg mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            AccionesPg acciones = new AccionesPg();
            acciones.setNombre(resultSet.getString("NOMBREEUS"));
            acciones.setNombrecas(resultSet.getString("NOMBRECAS"));
            return acciones;
        }
    };

    private RowMapper<Map<String, List<AccionesPg>>> rwMapArbol = new RowMapper<Map<String, List<AccionesPg>>>() {
        @Override
        public Map<String, List<AccionesPg>> mapRow(ResultSet rs, int rowNum) throws SQLException {

            Map<String, List<AccionesPg>> mapa = new HashMap<String, List<AccionesPg>>();
            List<AccionesPg> elemArbol = new ArrayList<AccionesPg>();
            AccionesPg listaAcciones = new AccionesPg();
            Integer elemento = 0;

            do {

                AccionesPg accion = new AccionesPg(rs.getInt("CODACCIONPG"), rs.getInt("CODELEMPG"),
                        rs.getInt("NUMRECEPTORES"), rs.getLong("NUMRECEPH"), rs.getLong("NUMRECEPM"),
                        rs.getInt("CODSITUACIONFINAL"), rs.getLong("ORDEN"), rs.getString("NOMBRE"),
                        rs.getString("NOMBRECAS"), rs.getDate("NUEVAFECHAPREV"), rs.getInt("IDACCION"),
                        rs.getString("RESPONSABLE"), rs.getDate("FECHAPREV"), rs.getLong("CODTIPORECEPTOR"),
                        rs.getString("RAZONAPLAZA"), rs.getString("MOTIVOCANCELA"), rs.getString("DESCRIPCION"),
                        rs.getString("DESCAS"), rs.getString("DESEUS"), rs.getString("DESCRIPCIONCAS"),
                        rs.getString("MOTIVO_CANCELA_CAS"), rs.getString("RAZON_APLAZA_CAS"),
                        rs.getString("OBSERVACIONES"), rs.getString("OBSERVACIONESCAS"), rs.getLong("ELEMBASE"),
                        rs.getLong("RESULTHECHA"));

                if (rs.getInt("CODSITUACIONFINAL") == Constantes.NUM_UNO) {
                    accion.setSituacionEs(Constantes.SITUACION1ES);
                    accion.setSituacionEu(Constantes.SITUACION1EU);
                } else if (rs.getInt("CODSITUACIONFINAL") == Constantes.NUM_DOS) {
                    accion.setSituacionEs(Constantes.SITUACION2ES);
                    accion.setSituacionEu(Constantes.SITUACION2EU);
                } else if (rs.getInt("CODSITUACIONFINAL") == Constantes.NUM_TRES) {
                    accion.setSituacionEs(Constantes.SITUACION3ES);
                    accion.setSituacionEu(Constantes.SITUACION3EU);
                } else {
                    accion.setSituacionEs(Constantes.VACIO);
                    accion.setSituacionEu(Constantes.VACIO);
                }
                if (rs.getLong("RESULTHECHA") == Constantes.NUM_UNO) {
                    accion.setPreguntaHechaEs(Constantes.PREGUNTAHECHAES1);
                    accion.setPreguntaHechaEu(Constantes.PREGUNTAHECHAEU1);
                } else if (rs.getLong("RESULTHECHA") == Constantes.NUM_DOS) {
                    accion.setPreguntaHechaEs(Constantes.PREGUNTAHECHAES2);
                    accion.setPreguntaHechaEu(Constantes.PREGUNTAHECHAEU2);
                } else if (rs.getLong("RESULTHECHA") == Constantes.NUM_TRES) {
                    accion.setPreguntaHechaEs(Constantes.PREGUNTAHECHAES3);
                    accion.setPreguntaHechaEu(Constantes.PREGUNTAHECHAEU3);
                } else if (rs.getLong("RESULTHECHA") == Constantes.NUM_CUATRO) {
                    accion.setPreguntaHechaEs(Constantes.PREGUNTAHECHAES4);
                    accion.setPreguntaHechaEu(Constantes.PREGUNTAHECHAEU4);
                } else if (rs.getLong("RESULTHECHA") == Constantes.NUM_CINCO) {
                    accion.setPreguntaHechaEs(Constantes.PREGUNTAHECHAES5);
                    accion.setPreguntaHechaEu(Constantes.PREGUNTAHECHAEU5);
                }

                if (elemento != rs.getInt("CODELEMPG")) {
                    if (elemento != 0) {
                        listaAcciones.setAcciones(elemArbol);
                        mapa.put(elemento.toString(), listaAcciones.getAcciones());
                    }
                    elemArbol = new ArrayList<AccionesPg>();
                    elemArbol.add(accion);

                } else {
                    elemArbol.add(accion);
                }

                elemento = rs.getInt("CODELEMPG");
            } while (rs.next());
            listaAcciones = new AccionesPg();
            listaAcciones.setAcciones(elemArbol);
            mapa.put(elemento.toString(), listaAcciones.getAcciones());
            return mapa;
        }
    };

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

    /**
     * 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 AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     * @return AccionesPg
     */
    @Override
    public AccionesPg add(AccionesPg accionespg) {
        StringBuilder query = new StringBuilder(
                "INSERT INTO ACCIONES_PG (CODACCIONPG, CODELEMPG, NUMRECEPTORES, NUMRECEPH, NUMRECEPM, CODSITUACIONFINAL, ORDEN, NOMBRE, NOMBRECAS, NUEVAFECHAPREV, IDACCION, RESPONSABLE,");
        query.append(
                " FECHAPREV, CODTIPORECEPTOR, RAZON_APLAZA, MOTIVO_CANCELA, DESCRIPCION,RAZON_APLAZA_CAS,MOTIVO_CANCELA_CAS,DESCRIPCIONCAS,OBSERVACIONES,OBSERVACIONESCAS)");
        query.append(" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
        this.jdbcTemplate.update(query.toString(), accionespg.getCodaccionpg(), accionespg.getCodelempg(),
                accionespg.getNumreceptores(), accionespg.getNumreceph(), accionespg.getNumrecepm(),
                accionespg.getCodsituacionfinal(), accionespg.getOrden(), accionespg.getNombre(),
                accionespg.getNombrecas(), accionespg.getNuevafechaprev(), accionespg.getIdaccion(),
                accionespg.getResponsable(), accionespg.getFechaprev(), accionespg.getCodtiporeceptor(),
                accionespg.getRazonAplaza(), accionespg.getMotivoCancela(), accionespg.getDescripcion(),
                accionespg.getRazonAplazacas(), accionespg.getMotivoCancelacas(), accionespg.getDescripcioncas(),
                accionespg.getObservaciones(), accionespg.getObservacionescas());
        return accionespg;
    }

    /**
     * Updates a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     * @return AccionesPg
     */
    @Override
    public AccionesPg update(AccionesPg accionespg) {
        StringBuilder query = new StringBuilder(
                "UPDATE ACCIONES_PG SET CODELEMPG=?, NUMRECEPTORES=?, NUMRECEPH=?, NUMRECEPM=?, CODSITUACIONFINAL=?, ORDEN=?, NOMBRE=?, NOMBRECAS=?, NUEVAFECHAPREV=?, IDACCION=?,");
        query.append(
                " RESPONSABLE=?, FECHAPREV=?, CODTIPORECEPTOR=?, RAZON_APLAZA=?, MOTIVO_CANCELA=?, DESCRIPCION=?,RAZON_APLAZA_CAS=?,MOTIVO_CANCELA_CAS=?,DESCRIPCIONCAS=?,OBSERVACIONES=?,OBSERVACIONESCAS=? ");
        query.append(" WHERE CODACCIONPG=?");
        this.jdbcTemplate.update(query.toString(), accionespg.getCodelempg(), accionespg.getNumreceptores(),
                accionespg.getNumreceph(), accionespg.getNumrecepm(), accionespg.getCodsituacionfinal(),
                accionespg.getOrden(), accionespg.getNombre(), accionespg.getNombrecas(),
                accionespg.getNuevafechaprev(), accionespg.getIdaccion(), accionespg.getResponsable(),
                accionespg.getFechaprev(), accionespg.getCodtiporeceptor(), accionespg.getRazonAplaza(),
                accionespg.getMotivoCancela(), accionespg.getDescripcion(), accionespg.getRazonAplazacas(),
                accionespg.getMotivoCancelacas(), accionespg.getDescripcioncas(), accionespg.getObservaciones(),
                accionespg.getObservacionescas(), accionespg.getCodaccionpg());
        return accionespg;
    }

    /**
     * Updates a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     * @return AccionesPg
     */
    @Override
    public AccionesPg guardarAcciones(AccionesPg accionespg) {
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.guardarAcciones: Inicio guardarAcciones");
        StringBuilder query = new StringBuilder(
                "UPDATE ACCIONES_PG SET NUMRECEPTORES=?, NUMRECEPH=?, NUMRECEPM=?, CODSITUACIONFINAL=?, NUEVAFECHAPREV=?, RESPONSABLE=?, FECHAPREV=?, CODTIPORECEPTOR=?, ");
        query.append(
                " RAZON_APLAZA=?, MOTIVO_CANCELA=?, DESCRIPCION=?,RAZON_APLAZA_CAS=?,MOTIVO_CANCELA_CAS=?,DESCRIPCIONCAS=?,OBSERVACIONES=?,OBSERVACIONESCAS=?,NOMBRE=?,NOMBRECAS=?,RESULTHECHA=? ");
        query.append(" WHERE CODACCIONPG=?");
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.guardarAcciones: sql: " + query);
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.guardarAcciones: params: " + accionespg.toString());
        this.jdbcTemplate.update(query.toString(),
                accionespg.getNumreceptores() == null ? 0 : accionespg.getNumreceptores(),
                accionespg.getNumreceph() == null ? 0 : accionespg.getNumreceph(),
                accionespg.getNumrecepm() == null ? 0 : accionespg.getNumrecepm(),
                accionespg.getCodsituacionfinal() == null ? 0 : accionespg.getCodsituacionfinal(),
                accionespg.getNuevafechaprev(), accionespg.getResponsable(), accionespg.getFechaprev(),
                accionespg.getCodtiporeceptor(), accionespg.getRazonAplaza(), accionespg.getMotivoCancela(),
                accionespg.getDescripcion(), accionespg.getRazonAplazacas(), accionespg.getMotivoCancelacas(),
                accionespg.getDescripcioncas(), accionespg.getObservaciones(), accionespg.getObservacionescas(),
                accionespg.getNombre(), accionespg.getNombrecas(), accionespg.getPreguntaHecha(),
                accionespg.getCodaccionpg());
        return accionespg;
    }

    /**
     * Updates a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     * @return AccionesPg
     */
    @Override
    public AccionesPg anyadirAccionPgNueva(AccionesPg accionespg, String modo) {
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.anyadirAccionPgNueva: Inicio anyadirAccionPgNueva");

        String nombre = "";
        String nombreCas = "";
        Integer elemBase = 0;
        StringBuilder query = new StringBuilder("");
        List<Object> params = new ArrayList<Object>();
        query = new StringBuilder(
                "SELECT DECODE(MAX(ORDEN)+1,null,1,MAX(ORDEN)+1) AS ORDEN FROM Acciones_pg WHERE codelempg =?");
        params.add(accionespg.getCodelempg());
        long ordenAccion = this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);

        Integer codAccion = SecuenciasSQL.ACCIONESPG.getNextInteger(jdbcTemplate);

        if (modo.equals(Constantes.TIPO_ACCION_SELECC)) {
            query = new StringBuilder("SELECT NOMBREEUS,NOMBRECAS FROM ACCIONES WHERE IDACCION = ?");
            List<AccionesPg> accionespgList = this.jdbcTemplate.query(query.toString(), this.rwMapNombres,
                    accionespg.getCodaccionpg());
            AccionesPg accionesNombres = accionespgList.get(0);
            nombre = accionesNombres.getNombre();
            nombreCas = accionesNombres.getNombrecas();
        } else {
            nombre = accionespg.getNombre();
            nombreCas = accionespg.getNombrecas();
            elemBase = 1;
        }

        query = new StringBuilder(
                "INSERT INTO ACCIONES_PG (CODACCIONPG,CODELEMPG,NOMBRE,NOMBRECAS,ORDEN,IDACCION,ELEMBASE) VALUES(?,?,?,?,?,?,?)");

        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.anyadirAccionPgNueva: sql: " + query);
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.anyadirAccionPgNueva: params: " + accionespg.toString());

        this.jdbcTemplate.update(query.toString(), codAccion, accionespg.getCodelempg(), nombre, nombreCas, ordenAccion,
                accionespg.getCodaccionpg(), elemBase);

        AccionesPg elem = new AccionesPg();
        elem.setCodaccionpg(codAccion);
        elem.setCodelempg(accionespg.getCodelempg());
        elem.setNumreceptores(0);
        elem.setNumreceph(0l);
        elem.setNumrecepm(0l);
        elem.setCodsituacionfinal(0);
        elem.setOrden(ordenAccion);
        elem.setNombre(nombre);
        elem.setNombrecas(nombreCas);
        elem.setNuevafechaprev(null);
        elem.setIdaccion((Integer) 0);
        elem.setResponsable(Constantes.VACIO);
        elem.setFechaprev(null);
        elem.setCodtiporeceptor(null);
        elem.setRazonAplaza(Constantes.VACIO);
        elem.setMotivoCancela(Constantes.VACIO);
        elem.setDescripcion(Constantes.VACIO);
        elem.setDescripcioncas(Constantes.VACIO);
        elem.setMotivoCancelacas(Constantes.VACIO);
        elem.setRazonAplazacas(Constantes.VACIO);
        elem.setObservaciones(Constantes.VACIO);
        elem.setObservacionescas(Constantes.VACIO);
        elem.setElemBase((long) elemBase);
        elem.setPreguntaHecha(0l);

        return elem;
    }

    /**
     * Finds a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     * @return AccionesPg
     */
    @Override
    @Transactional(readOnly = true)
    public AccionesPg find(AccionesPg accionespg) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));
        // WHERE
        query.append(" WHERE t1.CODACCIONPG = ?  ");

        List<AccionesPg> accionespgList = this.jdbcTemplate.query(query.toString(), this.rwMap,
                accionespg.getCodaccionpg());
        return DataAccessUtils.uniqueResult(accionespgList);
    }

    /**
     * Removes a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     */
    @Override
    public void remove(AccionesPg accionespg) {
        String query = "DELETE FROM ACCIONES_PG WHERE CODACCIONPG=?";
        this.jdbcTemplate.update(query, accionespg.getCodaccionpg());
    }

    /**
     * Removes a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     */
    @Override
    public void removeIdElem(Integer idElemento) {
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeIdElem: Inicio borrar acciones de un elemento");
        String query = "DELETE FROM ACCIONES_PG WHERE CODELEMPG=?";
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeIdElem: sql: " + query);
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeIdElem: params: " + idElemento);
        this.jdbcTemplate.update(query, idElemento);
    }

    /**
     * Removes a single row in the AccionesPg table.
     *
     * @param accionespg
     *            AccionesPg
     */
    @Override
    public void removeAccionesHijos(Integer idElemento) {
        AccionesPgDaoImpl.logger
                .info("AccionesPgDaoImpl.removeAccionesHijos: Inicio borrar acciones de los hijos de un  elemento");
        String query = "DELETE FROM ACCIONES_PG WHERE CODELEMPG IN(SELECT CODELEMPG FROM ELEMENTOS_PG WHERE CODELEMPGPADRE IN(SELECT CODELEMPG FROM ELEMENTOS_PG WHERE CODELEMENTOPE = ?))";
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeAccionesHijos: sql: " + query);
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeAccionesHijos: params: " + idElemento);
        this.jdbcTemplate.update(query, idElemento);
    }

    /**
     * Borra las acciones de elementos pg de un elemento pe
     *
     * @param accionespg
     *            AccionesPg
     */
    @Override
    public void removeAccionesPgPe(Integer idElemento) {
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeAccionesPgPe:Inicio");
        String query = "DELETE FROM ACCIONES_PG WHERE CODELEMPG IN(SELECT CODELEMPG FROM ELEMENTOS_PG WHERE CODELEMENTOPE = ?)";
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeAccionesHijos: sql: " + query);
        AccionesPgDaoImpl.logger.info("AccionesPgDaoImpl.removeAccionesHijos: params: " + idElemento);
        this.jdbcTemplate.update(query, idElemento);
    }

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

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

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

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

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

    /**
     * Finds a list of rows in the AccionesPg table.
     * 
     * @param accionesPg
     *            AccionesPg
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @return List<AccionesPg>
     */
    @Override
    @Transactional(readOnly = true)
    public Map<String, List<AccionesPg>> buscarAccionesPgArbol(Integer idP) {
        AccionesPgDaoImpl.logger.info("ElementosArbolDaoImpl.buscarAccionesPgArbol: Inicio buscarAccionesPgArbol");

        // SELECT - FROM
        StringBuilder query = new StringBuilder(
                "SELECT t1.CODACCIONPG CODACCIONPG, t1.CODELEMPG CODELEMPG, t1.NUMRECEPTORES NUMRECEPTORES,t1.RESULTHECHA, t1.NUMRECEPH NUMRECEPH, t1.NUMRECEPM NUMRECEPM, ");
        query.append(
                "t1.CODSITUACIONFINAL CODSITUACIONFINAL, t1.ORDEN ORDEN, t1.NOMBRE NOMBRE, t1.NOMBRECAS NOMBRECAS, t1.NUEVAFECHAPREV NUEVAFECHAPREV, t1.IDACCION IDACCION, t1.RESPONSABLE RESPONSABLE,");
        query.append(
                " t1.FECHAPREV FECHAPREV, t1.CODTIPORECEPTOR CODTIPORECEPTOR, t1.RAZON_APLAZA RAZONAPLAZA, t1.MOTIVO_CANCELA MOTIVOCANCELA, t1.DESCRIPCION DESCRIPCION, AB3912T00.DESCAS, AB3912T00.DESEUS ");
        query.append(
                "  ,t1.RAZON_APLAZA_CAS,t1.MOTIVO_CANCELA_CAS,t1.DESCRIPCIONCAS,t1.OBSERVACIONES,t1.OBSERVACIONESCAS ,t1.ELEMBASE ");
        query.append(
                " FROM ACCIONES_PG t1 LEFT JOIN TIPOS_RECEPTORES AB3912T00 ON t1.CODTIPORECEPTOR = AB3912T00.CODTIPORECEP ");
        query.append(" WHERE CODELEMPG IN(SELECT CODELEMPG FROM ELEMENTOS_PG WHERE CODPLANG=" + idP + ") ");
        query.append(" ORDER BY t1.CODELEMPG");

        AccionesPgDaoImpl.logger.info("ElementosArbolDaoImpl.buscarAccionesPgArbol: query" + query);
        Map<String, List<AccionesPg>> mapadev = null;
        List<Map<String, List<AccionesPg>>> listaMapa = this.jdbcTemplate.query(query.toString(), this.rwMapArbol);
        if (listaMapa != null && !listaMapa.isEmpty()) {
            mapadev = listaMapa.get(0);
        }
        return mapadev;
    }

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

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

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

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

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

    /*
     * OPERACIONES RUP_TABLE
     */

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

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

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMap(accionesPg, 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 AccionesPg selected for rup_table
     * 
     * @param accionesPg
     *            AccionesPg
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<TableRowDto<AccionesPg>>
     */
    @Override
    public List<TableRowDto<AccionesPg>> reorderSelection(AccionesPg accionesPg, JQGridRequestDto jqGridRequestDto,
            Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

        // FILTRADO
        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMap(accionesPg, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 ");
        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, AccionesPg.class,
                filterParamList, "CODACCIONPG");

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

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

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

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

        StringBuilder sbRemoveMultipleSQL = JQGridManager.getRemoveMultipleQuery(jqGridRequestDto, AccionesPg.class,
                query, params, "CODACCIONPG");
        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.CODACCIONPG CODACCIONPG, t1.CODELEMPG CODELEMPG,t1.RESULTHECHA, t1.NUMRECEPTORES NUMRECEPTORES, t1.NUMRECEPH NUMRECEPH, t1.NUMRECEPM NUMRECEPM, t1.CODSITUACIONFINAL CODSITUACIONFINAL, t1.ORDEN ORDEN, t1.NOMBRE NOMBRE, t1.NOMBRECAS NOMBRECAS, t1.NUEVAFECHAPREV NUEVAFECHAPREV, t1.IDACCION IDACCION, t1.RESPONSABLE RESPONSABLE, t1.FECHAPREV FECHAPREV, t1.CODTIPORECEPTOR CODTIPORECEPTOR, t1.RAZON_APLAZA RAZONAPLAZA, t1.MOTIVO_CANCELA MOTIVOCANCELA, t1.DESCRIPCION DESCRIPCION ");
        if (includeFrom) {
            query.append(" FROM ACCIONES_PG t1 ");
        }
        return query.toString();
    }

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

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

        if (accionesPg != null) {
            if (accionesPg.getCodaccionpg() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODACCIONPG", accionesPg.getCodaccionpg());
            }
            if (accionesPg.getCodelempg() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODELEMPG", accionesPg.getCodelempg());
            }
            if (accionesPg.getNumreceptores() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUMRECEPTORES", accionesPg.getNumreceptores());
            }
            if (accionesPg.getNumreceph() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUMRECEPH", accionesPg.getNumreceph());
            }
            if (accionesPg.getNumrecepm() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUMRECEPM", accionesPg.getNumrecepm());
            }
            if (accionesPg.getCodsituacionfinal() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODSITUACIONFINAL", accionesPg.getCodsituacionfinal());
            }
            if (accionesPg.getOrden() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.ORDEN", accionesPg.getOrden());
            }
            if (accionesPg.getNombre() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NOMBRE", accionesPg.getNombre());
            }
            if (accionesPg.getNombrecas() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NOMBRECAS", accionesPg.getNombrecas());
            }
            if (accionesPg.getNuevafechaprev() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUEVAFECHAPREV", accionesPg.getNuevafechaprev());
            }
            if (accionesPg.getIdaccion() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.IDACCION", accionesPg.getIdaccion());
            }
            if (accionesPg.getResponsable() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.RESPONSABLE", accionesPg.getResponsable());
            }
            if (accionesPg.getFechaprev() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.FECHAPREV", accionesPg.getFechaprev());
            }
            if (accionesPg.getCodtiporeceptor() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODTIPORECEPTOR", accionesPg.getCodtiporeceptor());
            }
            if (accionesPg.getRazonAplaza() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.RAZON_APLAZA", accionesPg.getRazonAplaza());
            }
            if (accionesPg.getMotivoCancela() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.MOTIVO_CANCELA", accionesPg.getMotivoCancela());
            }
            if (accionesPg.getDescripcion() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.DESCRIPCION", accionesPg.getDescripcion());
            }
        }

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

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

        if (accionesPg != null) {
            if (accionesPg.getCodaccionpg() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODACCIONPG", accionesPg.getCodaccionpg(), startsWith);
            }
            if (accionesPg.getCodelempg() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODELEMPG", accionesPg.getCodelempg(), startsWith);
            }
            if (accionesPg.getNumreceptores() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NUMRECEPTORES", accionesPg.getNumreceptores(),
                        startsWith);
            }
            if (accionesPg.getNumreceph() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NUMRECEPH", accionesPg.getNumreceph(), startsWith);
            }
            if (accionesPg.getNumrecepm() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NUMRECEPM", accionesPg.getNumrecepm(), startsWith);
            }
            if (accionesPg.getCodsituacionfinal() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODSITUACIONFINAL", accionesPg.getCodsituacionfinal(),
                        startsWith);
            }
            if (accionesPg.getOrden() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.ORDEN", accionesPg.getOrden(), startsWith);
            }
            if (accionesPg.getNombre() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBRE", accionesPg.getNombre(), startsWith);
            }
            if (accionesPg.getNombrecas() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NOMBRECAS", accionesPg.getNombrecas(), startsWith);
            }
            if (accionesPg.getNuevafechaprev() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.NUEVAFECHAPREV", accionesPg.getNuevafechaprev(),
                        startsWith);
            }
            if (accionesPg.getIdaccion() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.IDACCION", accionesPg.getIdaccion(), startsWith);
            }
            if (accionesPg.getResponsable() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.RESPONSABLE", accionesPg.getResponsable(), startsWith);
            }
            if (accionesPg.getFechaprev() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.FECHAPREV", accionesPg.getFechaprev(), startsWith);
            }
            if (accionesPg.getCodtiporeceptor() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODTIPORECEPTOR", accionesPg.getCodtiporeceptor(),
                        startsWith);
            }
            if (accionesPg.getRazonAplaza() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.RAZON_APLAZA", accionesPg.getRazonAplaza(), startsWith);
            }
            if (accionesPg.getMotivoCancela() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.MOTIVO_CANCELA", accionesPg.getMotivoCancela(),
                        startsWith);
            }
            if (accionesPg.getDescripcion() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.DESCRIPCION", accionesPg.getDescripcion(), startsWith);
            }
        }

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

        return mapWhere;
    }
}
