SelectManyMenu x especificación

  • Vamos a crear un SelectManyMenu por específicación
  • Lo primero que vamos hacer es crear el archivo de specs
  • Este esta ubicado Proyecto->Service->specs
  • Creamos la carpeta
  • Ahora creamos el archivo Specs

ActividadMejoraSpecs.java

  • Contenido
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.specs;


/**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++            BD               ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       Specification         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.jpa.domain.Specification;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++            DOMAIN                  ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;


/**********************************************************************/
/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Especificación para la administración de la entidad {@link ActividadMejora}
 *
 * @author Gustavo Matamoros González
 * @fecha 19/01/2023
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ActividadMejoraSpecs {

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Ahora lo primero que vamos hacer es crear una especificación que solo traiga los activos
  • Para esto creamos una especificación que indique que los activos, agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: activoEquals                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    public static Specification<ActividadMejora> activoEquals(final Boolean activo) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("activo");
                Expression y = cb.literal(activo);
                return cb.equal(x, y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Ahora creamos otra específicación que traiga los que el año del periodo anual del plan Operativo este entre los años de la fecha de inicio y fecha fin de la Actividad de Mejora
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: periodoAnualEntre              *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public static Specification<ActividadMejora> periodoAnualEntre(final Integer anno) {


        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq,
                    CriteriaBuilder cb) {
                // build query here
                Expression x = root.join("periodoAnualInicial").get("ano");
                Expression y = root.join("periodoAnualFinal").get("ano");
                Expression z = cb.literal(anno);
                return cb.between(z,x,y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.specs;


/**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++            BD               ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       Specification         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.jpa.domain.Specification;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++            DOMAIN                  ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;


/**********************************************************************/
/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Especificación para la administración de la entidad {@link ActividadMejora}
 *
 * @author Gustavo Matamoros González
 * @fecha 19/01/2023
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ActividadMejoraSpecs {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: activoEquals                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    public static Specification<ActividadMejora> activoEquals(final Boolean activo) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("activo");
                Expression y = cb.literal(activo);
                return cb.equal(x, y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    
    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: periodoAnualEntre              *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public static Specification<ActividadMejora> periodoAnualEntre(final Integer anno) {


        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq,
                    CriteriaBuilder cb) {
                // build query here
                Expression x = root.join("periodoAnualInicial").get("ano");
                Expression y = root.join("periodoAnualFinal").get("ano");
                Expression z = cb.literal(anno);
                return cb.between(z,x,y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

ActividadMejoraServiceImpl.java

  • Ahora vamos a crear una servicio que consuma estas específicaciones
  • Lo primero que debemos hacer es agregar el archivo de específicaciones
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.mcg.specs.ActividadMejoraSpecs;
  • Y agregar los import’s necesarios para utilizar especificaciones
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       Specification         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.jpa.domain.Specification;
  • Y el de lista
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++             CAMPOS                 ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.List;
  • Ahora creamos una método que nos retorne una lista (esto por que vamos a utilizar un componete SelectManyMenu que requiere una lista), su fuera un autocomplete requerimos que sea un Page
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByActivoAndPeriodoEntre(java.lang.Boolean, java.lang.Integer)) }
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param anno : Año del Periodo Anual del Plan Operativo
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntre(Boolean activo, Integer anno) {
        
        // Definimos una variable de tipo especificación ActividadMejora
        Specification<ActividadMejora> specFinal;
       
        // Obtenemos la especificación de activo
        Specification specActivoEquals = ActividadMejoraSpecs.activoEquals(activo);
       
        // Obtenemos la especificación de periodoAnualEntre
        Specification specPeriodoAnualEntre = ActividadMejoraSpecs.periodoAnualEntre(anno);

        // Creamos la especificación final
        specFinal = Specification.where(specActivoEquals).and(specPeriodoAnualEntre);
       
        return repository.findAll(specFinal);
    }
  • Ahora debemos crear la definición del método en el service para que este disponible

ActividadMejoraService.java

  • Le agregamos el import de manejo de listas
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++             CAMPOS                 ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.List;
  • Y agregamos la definición
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByActivoAndPeriodoEntre(java.lang.Boolean, java.lang.Integer)) }
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param anno : Año del Periodo Anual del PLan Operativo
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntre(Boolean activo, Integer anno);
  • Y con esto ya tenemos un servicio que obtiene todas las Actividades de Mejora que estén activas y el periodo este entre los años de la Actividad de Mejora
  • Ahora dentro del Bean que va a utilizar este servicio vamos a crear lo necesario para que pueda consumir el servicio

MetaPoaBean.java

  • Primero aregamos los imports necesarios
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadMejora;
  • Ahora como en SIGESA un Bean se comunica con un Bean necesitamos crear una AutoWired al bean para poder utilizarlo

  • Lo primero es que vamos a crear 2 variables de tipo List:
    • listaAllActividadMejora: que va almacenar todas Actividad de Mejora
    • listaActividadMejoraSeleccionados: que va alamacenar la lista de Actividad de Mejora Seleccionados
// **************************************************
    // ACTIVIDAD DE MEJORA
    // **************************************************
    
    // Lista de todas las Actividades de Mejora
    private List<ActividadMejora> listaAllActividadesMejora;

    // Lista de las Actividades de Mejoras Seleccionadas por el usuario
    private List<ActividadMejora> listaActividadesMejoraSeleccionados;
  • Luego creamos los respectivos get’s y set’s
//************************************************************************
    // ACTIVIDAD DE MEJORA: ListaAllActividadesMejora
    //************************************************************************
    public List<ActividadMejora> getListaAllActividadesMejora() {
        return listaAllActividadesMejora;
    }

    public void setListaAllActividadesMejora(List<ActividadMejora> listaAllActividadesMejora) {
        this.listaAllActividadesMejora = listaAllActividadesMejora;
    }
    
    //************************************************************************
    // ACTIVIDAD DE MEJORA: ListaActividadesMejoraSeleccionadas
    //************************************************************************
    public List<ActividadMejora> getListaActividadesMejoraSeleccionadas() {
        return listaActividadesMejoraSeleccionadas;
    }

    public void setListaActividadesMejoraSeleccionadas(List<ActividadMejora> listaActividadesMejoraSeleccionadas) {
        this.listaActividadesMejoraSeleccionadas = listaActividadesMejoraSeleccionadas;
    }
  • Ahora debemos hacer el proceso para que estas listan sean cargadas con los valores necesarios
  • Para esto en la función de initDetails()
  • vamos a mandar a cargar la lista de todas las actividades de mejora, le agregamos en el initDetails()
// ***************************************************************
// ACTIVIDAD MEJORA
// ***************************************************************

// Mandamos a cargar todas las actividades de mejora      this.setListaAllActividadesMejora(this.obtieneAllActividadesMejora());
  • Con esto tenemos la función que vamos a llamar para cargar todas las actividades de mejora
  • Ahora para cargar la lista de las Actividades de Mejora Seleccionadas
  • Debemos crear una lista vacia
// creamos una lista vacia para almacenar la lista de las Activiades de Mejora Seleccionadas
this.setListaActividadesMejoraSeleccionadas(new ArrayList());
  • Y luego realizar el proceso de carga de la BD a la entidad y a la lista de Actividades de Mejora Seleccionadas
// Cargamos los valores en la lista de Actividades de Mejora en la entidad 
            this.getEntity().setListaMetaPoaActividadesMejora(metaPoaActividadMejoraBean.setDetails(this.getEntity().getListaMetaPoaActividadesMejora()));
            
            // Recorremos la lista 
            for (MetaPoaActividadMejora metaPoaActividadMejora : this.getEntity().getListaMetaPoaActividadesMejora()) {

                // Y los agregamos a la lista de los seleccionados
                this.listaActividadesMejoraSeleccionadas.add(metaPoaActividadMejora.getActividadMejora());
            }

            // Inicializamos el Bean
            metaPoaActividadMejoraBean.init();
  • RESULTADO
// ***************************************************************
            // ACTIVIDAD MEJORA
            // ***************************************************************
          

            // Mandamos a cargar todas las actividades de mejora
            this.setListaAllActividadesMejora(this.obtieneAllActividadesMejora());

            // creamos una lista vacia para almacenar la lista de las Activiades de Mejora Seleccionadas
            this.setListaActividadesMejoraSeleccionadas(new ArrayList());


            // Cargamos los valores en la lista de Actividades de Mejora en la entidad 
            this.getEntity().setListaMetaPoaActividadesMejora(metaPoaActividadMejoraBean.setDetails(this.getEntity().getListaMetaPoaActividadesMejora()));
            
            // Recorremos la lista 
            for (MetaPoaActividadMejora metaPoaActividadMejora : this.getEntity().getListaMetaPoaActividadesMejora()) {

                // Y los agregamos a la lista de los seleccionados
                this.listaActividadesMejoraSeleccionadas.add(metaPoaActividadMejora.getActividadMejora());
            }

            // Inicializamos el Bean
            metaPoaActividadMejoraBean.init();
  • Ahora vamos a crear la función de «obtieneAllActividadesMejora»
/**
     * Nombre: obtieneAllActividadesMejora
     * Función: Obtener la lista de todas las actividades de Mejora
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> obtieneAllActividadesMejora() {

        // Creamos una lista nueva para obtener las actividades de mejora
        List<ActividadMejora> listaActividadesMejora = new ArrayList();

        // Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora
        listaActividadesMejora.addAll(service.findAllActividadMejoraByActivoAndPeriodoEntre(this.getEntity().getObjetivoPOA().getPlanOperativo().getPeriodoAnual().getAno()));

        // Retornamos la lista
        return listaActividadesMejora;
    }

MetaPoaServiceImpl.java

  • ya que tenemos la función que se va a encargar de obtener todas las actividades de mejora
  • Vamos a crear el servicio, para esto primero debemos realizar los import’s necesarios de las clases
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadMejoraService;
  • Y agregamos el AutoWired para el uso del servicio
@Autowired
ActividadMejoraService actividadMejoraService;
  • Y agregamos la función
/**
     * Nombre: findAllActividadMejoraByActivoAndPeriodoEntre
     * Función: Obtener la lista de todas las actividades donde:
     * -> ActividadMejora.activo = 1
     * -> ActividadMejora.FechaInicial < PlanOperativo.ano > ActividadMejora.FechaInicial
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    @Override
    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntre(Integer anno) {

        // Retornamos la lista ordenada
        return ordenaListaActividadesMejora(actividadMejoraService.findAllActividadMejoraByActivoAndPeriodoEntre(Boolean.TRUE, anno));
    }
  • Y como parte de la tarea se encontraba la tarea de que la lista debe estar ordenada por el código por esto agregamos una funcion que se encarga de esto
/**
     * Nombre: ordenaListaActividadesMejora
     * Función: Ordenar una lista de Actividades de Mejora
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> ordenaListaActividadesMejora(List<ActividadMejora> listaActividadMejora) {
        Collections.sort(listaActividadMejora, new Comparator<ActividadMejora>() {

            @Override
            public int compare(ActividadMejora am1, ActividadMejora am2) {
                return am1.getCodigo().compareTo(am2.getCodigo());
            }
        });

        return listaActividadMejora;
    }
  • Y agregamos la definición dentro del service

MetaPoaService.java

  • Agregamos los imports necesarios
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
  • Agregamos la definición
/**
     * Nombre: findAllActividadMejoraByActivoAndPeriodoEntre
     * Función: Obtener la lista de todas las actividades donde:
     * -> ActividadMejora.activo = 1
     * -> ActividadMejora.FechaInicial < PlanOperativo.ano > ActividadMejora.FechaInicial
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntre(Integer anno);

metaPoaEditForm.xhtml

  • Agregamos el componente
<!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ACTIVIDAD MEJORA -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                
                <!--LABEL-->
                <p:outputLabel id="actividadMejoraOutputLabel" 
                               for="actividadMejoraSelectManyMenu" 
                               value="#{i18n.metaPoa_actividadMejora_header_label}"
                               />
        
                
                <!--PANEL-->
                <p:outputPanel id="actividadMejoraOutputPanel" >
                    

                    <!--CAMPO-->
                    <p:selectManyMenu id="actividadMejoraSelectManyMenu" 
                                      value="#{metaPoaBean.listaActividadesMejoraSeleccionadas}"
                                      converter="#{actividadMejoraBean.converter}" 
                                      var="am" 
                                      filter="true" 
                                      filterMatchMode="contains" 
                                      showCheckbox="true" 
                                      styleClass="una-selectManyMenu"
                                      >


                        <p:ajax process="@this" 
                                listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                update="@this"/>

                        <f:selectItems value="#{metaPoaBean.listaAllActividadesMejora}" 
                                       var="codAM" 
                                       itemLabel="#{codAM.codigo}"
                                       itemValue="#{codAM}"/>

                        <p:column>
                            <h:outputText value="#{am.codigo}"/>
                        </p:column>
                        <p:column>
                            <h:outputText value="#{am.descripcion}"/>
                        </p:column>
                    </p:selectManyMenu>

                    <!--MENSAJE-->
                    <p:message id="actividadMejoraMessage" 
                               for="actividadMejoraSelectManyMenu" />

                </p:outputPanel>
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
  • NOTA Importante:
  • La siguiente instrucción es necesaria sino la lista será presentada pero no se va actualizar en la entidad cuando el usuario marque o desmarque opciones
<p:ajax process="@this" 
                                listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionados}"
                                update="@this"/>
  • Como se ve en la instrucción anterior vamos a crear dentro del Bean una función que actualice la lista de la entidad cada vez que el usuario marque o desmarque

MetaPoaBean.java

/**
     * Nombre: actualizaActividadesMejoraSeleccionadas
     * Función: Actualiza la lista de Actividades de Mejora según interacción del usuario
     * @return void
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public void actualizaActividadesMejoraSeleccionadas() {

        // Limpiamos la lista de Actividades de Mejora
        this.getEntity().getListaMetaPoaActividadesMejora().clear();

        // Obtenemos la lista de las actividades de Mejora seleccionadas por el usuario
        for (ActividadMejora actividadMejora : this.getListaActividadesMejoraSeleccionadas()) {

            // Creamos una nueva actividad de mejora
            MetaPoaActividadMejora am = new MetaPoaActividadMejora();
            
            // Le guardamos la meta poa
            am.setMetaPoa(this.getEntity());

            // Le guardamos la actividad de mejora
            am.setActividadMejora(actividadMejora);

            // La agregamos a a la lista de MetaPoaActividadMejora
            this.getEntity().getListaMetaPoaActividadesMejora().add(am);
        }

    }
  • Ahora debemos comenzar a crear la relación de META_POA con META_POA_ACTIVIDAD_MEJORA

MetaPoa.java

  • Le agregamos la lista de de Actividades de Mejora

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "META_POA", nullable = false)
private List<MetaPoaActividadMejora> listaMetaPoaActividadMejora;
  • Y los respectivos get’s y set’s
public void setListaMetaPoaActividadMejora(List<MetaPoaActividadMejora> listaMetaPoaActividadMejora) {
        this.listaMetaPoaActividadMejora = listaMetaPoaActividadMejora;
    }

    public List<MetaPoaActividadMejora> getListaMetaPoaActividadMejora() {
        return listaMetaPoaActividadMejora;
    }
  • Ahora para poder obtener la lista de las actividades de mejora seleccionadas vamos hacer lo siguiente
  • Ahora como un Bean se comunica con una Bean, necesitamos crear el Bean de MetaPoaActividadMejoraBean.java

MetaPoaActividadMejoraBean.java

  • Y le agregamos
  • NOTA: en este caso la tabla de META_POA_ACTIVIDAD_MEJORA esta funcionando como una detalle, por tanto este Bean no funciona como CRUD sino como ASER
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.ppo.view.model;

/**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         SRPING              ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         CAMPOS              ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.annotation.PostConstruct;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         PPI                 ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadMejora;



/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

/**
 * Spring Bean Session para la administración de la entidad {@link MetaPoaActividadMejora}
 *
 * @author: Gustavo Matamoros González
 * @since 23/01/2023
 * @version: 1.0.0
 * @issue PPI-281
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
@Component
@Scope("session")

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class MetaPoaActividadMejoraBean extends ASERImpl<MetaPoaActividadMejora> implements ASER {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @PostConstruct
    public void init() {
        
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
}
/**********************************************************************/
/**********************************************************************/
/*************** FIN DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
  • Y de una vez creamos el Bean para ActividadRiesgo

MetaPoaActividadRiesgoBean.java

  • Le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.ppo.view.model;

//**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         SRPING              ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         CAMPOS              ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.annotation.PostConstruct;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         PPI                 ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadRiesgo;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPoaActividadRiesgoService;

/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

/**
 * Spring Bean Session para la administración de la entidad {@link MetaPoaActividadRiesgo}
 *
 * @author: Gustavo Matamoros González
 * @since 23/01/2023
 * @version: 1.0.0
 * @issue PPI-281
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
@Component
@Scope("session")

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class MetaPoaActividadRiesgoBean extends ASERImpl<MetaPoaActividadRiesgo> implements ASER {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @PostConstruct
    public void init() {
        
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
}
/**********************************************************************/
/**********************************************************************/
/*************** FIN DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/

Validación: solo se presenta si es PlanOperativo = Unidad

  • Para poder crear esta validación vamos a crear una función que me retorne true si es un plan de Unidad y en caso contrario false

MetaPoaBean.java

  • Agregamos la función
/**
     * Nombre: isPlanOperativoUnidad
     * Función: Determinar si el plan operativo es una plan de unidad
     * @return true = Plan de Unidad / false = No es plan de unidad
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public boolean isPlanOperativoUnidad() {

        // Obtenemos el context
        FacesContext context = FacesContext.getCurrentInstance();

        // Obtenemos el bean actual
        PlanOperativoBean planOperativoBean = context.getApplication().evaluateExpressionGet(context, "#{planOperativoBean}", PlanOperativoBean.class);

        // Si el plan operativo existe
        if (planOperativoBean != null) {

            // Obtenemos el tipo de plan de Unidad
            TipoPlanOperativo tipoPlanUnidad = service.obtieneTipoPlanUnidad();

            // Retornamos true si es igual
            return planOperativoBean.getEntity().getTipoPlanOperativo().equals(tipoPlanUnidad);
        }

        // Sino false
        return false;
    }
  • Ahora la siguiente parte es indicarle a EditForm que solo pinte los componentes si es un plan de unidad esto los hacemos con la siguiente instrucción
rendered="#{!metaPoaBean.isPlanOperativoUnidad()}"
  • Agregandola al outputLabel, outputPanel, el campo y message

metaPoaEditForm.xhtml

  • Resultado
<!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ACTIVIDAD MEJORA                                                              -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                
                <!--LABEL-->
                <p:outputLabel  id="actividadMejoraOutputLabel" 
                                for="actividadMejoraSelectManyMenu" 
                                value="#{i18n.metaPoa_actividadMejora_header_label}"
                                rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                               />

                
                <!--PANEL-->
                <p:outputPanel  id="actividadMejoraOutputPanel" 
                                rendered="#{metaPoaBean.isPlanOperativoUnidad()}">
        

                    <!--CAMPO-->
                    <p:selectManyMenu id="actividadMejoraSelectManyMenu" 
                                      value="#{metaPoaBean.listaActividadesMejoraSeleccionadas}"
                                      converter="#{actividadMejoraBean.converter}" 
                                      var="am" 
                                      filter="true" 
                                      filterMatchMode="contains" 
                                      showCheckbox="true" 
                                      styleClass="una-selectManyMenu"
                                      rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                      >

                        <p:ajax process="@this" 
                                listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                update="@this"/>

                        <f:selectItems value="#{metaPoaBean.listaAllActividadesMejora}" 
                                       var="codAM" 
                                       itemLabel="#{codAM.codigo}"
                                       itemValue="#{codAM}"/>

                        <p:column>
                            <h:outputText value="#{am.codigo}"/>
                        </p:column>
                        <p:column>
                            <h:outputText value="#{am.descripcion}"/>
                        </p:column>
                    </p:selectManyMenu>

                    <!--MENSAJE-->
                    <p:message id="actividadMejoraMessage" 
                               for="actividadMejoraSelectManyMenu" 
                               rendered="#{metaPoaBean.isPlanOperativoUnidad()}"/>

                </p:outputPanel>
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->
                <!-- ***************************************************************************** -->

3° condición que las actividades de mejora sean filtradas por UnidadEjecutora

  • Para realizar esta condición vamos agrega una nueva específicación

ActividadMejoraSpecs.java

  • Le agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: unidadEjecutoraEquals          *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    public static Specification<ActividadMejora> unidadEjecutoraEquals(final Long unidadEjecutora) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("unidadEjecutora");
                Expression y = cb.literal(unidadEjecutora);
                return cb.equal(x, y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

ActividadMejoraServiceImpl.java

  • Debemos modificarla para indicarle que va recibir una Long con el ID de la Unidad
  • Modificamos el nombre
findAllActividadMejoraByActivoAndPeriodoEntre
X
findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals
  • Y le agregamos el parametro quedando Así
public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Boolean activo, Integer anno, Long unidadEjecutora) {
  • Creamos la nueva Especificación
// Obtenemos la especificación de unidadEjecutora
        Specification specUnidadEjecutora = ActividadMejoraSpecs.unidadEjecutoraEquals(unidadEjecutora);
  • Y se la agregamos a la nueva específicación
// Creamos la especificación final
        specFinal = Specification.where(specActivoEquals).and(specPeriodoAnualEntre).and(specUnidadEjecutora);
  • RESULTADO
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(java.lang.Boolean, java.lang.Integer, java.lang.Long)) }
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param anno : Año del Periodo Anual del Plan Operativo
     * @param unidadEjecutora : Id de la Unidad Ejecutora
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Boolean activo, Integer anno, Long unidadEjecutora) {
        
        // Definimos una variable de tipo especificación ActividadMejora
        Specification<ActividadMejora> specFinal;
       
        // Obtenemos la especificación de activo
        Specification specActivoEquals = ActividadMejoraSpecs.activoEquals(activo);
       
        // Obtenemos la especificación de periodoAnualEntre
        Specification specPeriodoAnualEntre = ActividadMejoraSpecs.periodoAnualEntre(anno);

        // Obtenemos la especificación de unidadEjecutora
        Specification specUnidadEjecutora = ActividadMejoraSpecs.unidadEjecutoraEquals(unidadEjecutora);

        // Creamos la especificación final
        specFinal = Specification.where(specActivoEquals).and(specPeriodoAnualEntre).and(specUnidadEjecutora);
       
        return repository.findAll(specFinal);
    }

ActividadMejoraService.java

  • Modificamos la definición
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(java.lang.Boolean, java.lang.Integer, java.lang.Long)) }
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param anno : Año del Periodo Anual del Plan Operativo
     * @param unidadEjecutora : Id de la Unidad Ejecutora
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Boolean activo, Integer anno, Long unidadEjecutora);
  • Ahora debemos crear el proceso de obtener el ID de la Unidad Ejecutora que se encuentre actualmente seleccionada

MetaPoaBean.java

  • Primero agregamos el import de unidad Ejecutora
import cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;
  • La vamos a modificar para que los parametros sean obtenidos y almacenados en variables
  • RESULTADO:
/**
     * Nombre: obtieneAllActividadesMejora
     * Función: Obtener la lista de todas las actividades de Mejora
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> obtieneAllActividadesMejora() {

        // Creamos una lista nueva para obtener las actividades de mejora
        List<ActividadMejora> listaActividadesMejora = new ArrayList();

        // Obtenemos el Año del Periodo Anual
        Integer AnnoPeriodo = this.getEntity().getObjetivoPOA().getPlanOperativo().getPeriodoAnual().getAno();

        // Obtenemos la Unidad Ejecutora del Periodo Anual
        Long unidadEjecutora = this.getEntity().getObjetivoPOA().getPlanOperativo().getUnidadEjecutora().getId();

        // Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora
        listaActividadesMejora.addAll(service.findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(AnnoPeriodo, unidadEjecutora));

        // Retornamos la lista
        return listaActividadesMejora;
    }

MetaPoaServiceImpl.java

  • Ahora modificamos para que la función resivva el parametros de unidadEjecutora
  • RESULTADO
/**
     * Nombre: findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals
     * Función: Obtener la lista de todas las actividades de Mejora donde:
     * -> ActividadMejora.activo = 1
     * -> ActividadMejora.FechaInicial < PlanOperativo.ano > ActividadMejora.FechaInicial
     * -> UnidadEjecutora.equals
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     * @param anno
     * @param unidadEjecutora: ID
     */
    @Override
    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Integer anno, Long unidadEjecutora) {

        // Retornamos la lista ordenada
        return ordenaListaActividadesMejora(actividadMejoraService.findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Boolean.TRUE, anno, unidadEjecutora));
    }

MetaPoaService.java

  • Modificamos la definición
/**
     * Nombre: findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals
     * Función: Obtener la lista de todas las actividades de Mejora donde:
     * -> ActividadMejora.activo = 1
     * -> ActividadMejora.FechaInicial < PlanOperativo.ano > ActividadMejora.FechaInicial
     * -> UnidadEjecutora.equals
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     * @param anno
     * @param unidadEjecutora
     */
    public List<ActividadMejora> findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(Integer anno, Long unidadEjecutora);

4° condición: Solo se pueden listar la Actividades de Mejora que no esten dentro de Otro Plan Operativo -> ObjetivoPoa -> MetaPoa

  • Para este filtro vamos a crear una nueva especificación que retorne todas las ActividadesMejora que existen en un plan operativo

ActividadMejoraSpecs.java

  • Agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /******  SPECIFICATION: actividadMejoraNotInMetaPoaObjetivoPoaPlanOperativo   ********************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
     * Subquery: SELECT * FROM ACTIVIDAD_MEJORA
     *                  WHERE ID_ACTIVIDAD_MEJORA IN(
     *                  SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA AM
     *                  INNER JOIN META_POA MP ON (MP.ID_META_POA = AM.META_POA)
     *                  INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
     *                  INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
     *                  WHERE PO.ID_PLAN_OPERATIVO = 212 )
     *
     * 
     * 
     * @param planOperativo
     * @return
     */
    public static Specification actividadMejoraByPlanOperativo(final PlanOperativo planOperativo) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                
                Subquery<MetaPoaActividadMejora> qMetaPoaActividadMejora = cq.subquery(MetaPoaActividadMejora.class);
                Root<MetaPoaActividadMejora> rMetaPoaActividadMejora = qMetaPoaActividadMejora.from(MetaPoaActividadMejora.class);

                Join<MetaPoa,       MetaPoaActividadMejora> joinMetaPoa         = rMetaPoaActividadMejora.join("metaPoa");
                Join<ObjetivoPOA,   MetaPoa>                joinObjetivoPoa     = joinMetaPoa.join("objetivoPoa");
                //Join<PlanOperativo, ObjetivoPOA>            joinPlanOperativo   = joinObjetivoPoa.join("planOperativo");

                Expression planOpe = joinObjetivoPoa.get("planOperativo");
                Join<ActividadMejora, MetaPoaActividadMejora> joinActividadMejora = rMetaPoaActividadMejora.join("actividadMejora");

                Expression selectMetaPoaActividadMejora = joinActividadMejora.get("id");


                qMetaPoaActividadMejora.select(selectMetaPoaActividadMejora).where(cb.equal(planOpe, planOperativo));

                return root.get("id").in(qMetaPoaActividadMejora);
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

ActividadMejoraServiceImpl.java

  • Ahora vamos a crear un servicio que permita consumir la lista
  • Agregamos el import necesario
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;
  • Agregamos
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByPlanOperativo(PlanOperativo)) }
     * @author Gustavo Matamoros González
     * @since 26/01/2023
     * @issue PPI-281  
     * @param planOperativo
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByPlanOperativo(PlanOperativo planOperativo) {
        
        // Definimos una variable de tipo especificación ActividadMejora
        Specification<ActividadMejora> specFinal;
       

        // Obtenemos la especificación de unidadEjecutora
        Specification specPO = ActividadMejoraSpecs.actividadMejoraByPlanOperativo(planOperativo);


        // Creamos la especificación final
        specFinal = Specification.where(specPO);
       
        return repository.findAll(specFinal);
    }

ActividadMejoraService.java

  • Agregamos el import
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;
  • Agregamos la definición
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllActividadMejoraByPlanOperativo(PlanOperativo)) }
     * @author Gustavo Matamoros González
     * @since 26/01/2023
     * @issue PPI-281  
     * @param planOperativo
     * @return List<ActividadMejora>
     */
    /**********************************************************************/

    public List<ActividadMejora> findAllActividadMejoraByPlanOperativo(PlanOperativo planOperativo);

MetaPoaServiceImpl.java

  • Ahora vamos a crear un servicio dentro de MetaPoa que obtenga una lista <ActividadMejora> que existen en el Plan Operativo
/**
     * Nombre: findAllActividadMejoraByPlanOperativo
     * Función: Obtener la lista de todas las actividades de Mejora que existan en un PlanOperativo
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     * @param anno
     * @param unidadEjecutora: ID
     */
    @Override
    public List<ActividadMejora> findAllActividadMejoraByPlanOperativo(PlanOperativo planOperativo) {

        // Retornamos la lista ordenada
        return ordenaListaActividadesMejora(actividadMejoraService.findAllActividadMejoraByPlanOperativo(planOperativo));
    }

MetaPoaService.java

  • Agregamos la definicion
/**
     * Nombre: findAllActividadMejoraByPoaPlanOperativo
     * Función: Obtener la lista de todas las actividades de Mejora que existan en un PlanOperativo
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     * @param anno
     * @param unidadEjecutora: ID
     */
    public List<ActividadMejora> findAllActividadMejoraByPlanOperativo(PlanOperativo planOperativo);
  • Ahora debemos crear una función dentro del MetaPoaBean para que pueda obtener el Plan Operativo seleccionado por el usuarios

MetaPoaBean.java

  • Lo primero que debemos hacer es que primero se cargue la lista de ActividadMejora Seleccionadas y luego obtenga con base en esta lista las listaAllActividad de Mejora
  • Por tanto modificamos de posición
// ***************************************************************
            // ACTIVIDAD MEJORA
            // ***************************************************************
            
            // creamos una lista vacia para almacenar la lista de las Activiades de Mejora Seleccionadas
            this.setListaActividadesMejoraSeleccionadas(new ArrayList());
            
            
            // Cargamos los valores en la lista de Actividades de Mejora en la entidad 
            this.getEntity().setListaMetaPoaActividadesMejora(metaPoaActividadMejoraBean.setDetails(this.getEntity().getListaMetaPoaActividadesMejora()));
            
            // Recorremos la lista 
            for (MetaPoaActividadMejora metaPoaActividadMejora : this.getEntity().getListaMetaPoaActividadesMejora()) {
                
                // Y los agregamos a la lista de los seleccionados
                this.listaActividadesMejoraSeleccionadas.add(metaPoaActividadMejora.getActividadMejora());
            }
            listaActividadesMejoraByMetaPoa
            // Inicializamos el Bean
            metaPoaActividadMejoraBean.init();
            
            // Mandamos a cargar todas las actividades de mejora
            this.setListaAllActividadesMejora(this.obtieneAllActividadesMejora());
  • Agregamos
/**
     * Nombre: obtieneAllActividadesMejoraByPlanOperativo
     * Función: Obtener la lista de todas las actividades de Mejora que existen en un plan operativo
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> obtieneAllActividadesMejoraByPlanOperativo() {

        // Creamos una lista nueva para obtener las actividades de mejora
        List<ActividadMejora> listaActividadesMejoraInPO = new ArrayList();

        // Obtenemos el Año del Periodo Anual
        PlanOperativo planOperativo = this.getEntity().getObjetivoPOA().getPlanOperativo();

        
        // Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora
        listaActividadesMejoraInPO.addAll(service.findAllActividadMejoraByPlanOperativo(planOperativo));

        // Retornamos la lista
        return listaActividadesMejoraInPO;
    }
  • Y ahora vamos a modificar la función obtieneAllActividadesMejora, para que utilice las 3 listas:
    • listaActividadesMejoraByUnidadEjecutora
    • listaActividadesMejoraByPlanOperativo
    • listaActividadesMejoraByMetaPoa
  • Para generar la lista correcta de Actividades de Mejora
/**
     * Nombre: obtieneAllActividadesMejora
     * Función: Obtener la lista de todas las actividades de Mejora
     * @return List<ActividadMejora>
     * @author  Gustavo Matamoros González
     * @issue PPI-281
     */
    public List<ActividadMejora> obtieneAllActividadesMejora() {


        // ************************************************************************************
        // Lista por: Lista Final
        // ************************************************************************************

        // Creamos una lista nueva para obtener las actividades de mejora que se deben retornar
        List<ActividadMejora> listaFinal = new ArrayList();


        // ************************************************************************************
        // Lista por: Unidad Ejecutora
        // ************************************************************************************

        // Creamos una lista nueva para obtener las actividades de mejora disponibles para una Unidad Ejecutora
        List<ActividadMejora> listaActividadesMejoraByUnidadEjecutora = new ArrayList();

        // Obtenemos el Año del Periodo Anual
        Integer AnnoPeriodo = this.getEntity().getObjetivoPOA().getPlanOperativo().getPeriodoAnual().getAno();

        // Obtenemos la Unidad Ejecutora del Periodo Anual
        Long unidadEjecutora = this.getEntity().getObjetivoPOA().getPlanOperativo().getUnidadEjecutora().getId();

        // Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora
        listaActividadesMejoraByUnidadEjecutora.addAll(service.findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(AnnoPeriodo, unidadEjecutora));

        

        // ************************************************************************************
        // Lista por: Plan Operativo
        // ************************************************************************************

        // Creamos una lista nueva para obtener las actividades de mejora disponibles para un Plan Operativo
        List<ActividadMejora> listaActividadesMejoraByPlanOperativo = new ArrayList();

        // Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora
        listaActividadesMejoraByPlanOperativo.addAll(obtieneAllActividadesMejoraByPlanOperativo());




        // ************************************************************************************
        // Lista por: Meta POA
        // ************************************************************************************

        // Creamos una lista nueva para obtener las actividades de mejora disponibles para una Meta POA
        List<ActividadMejora> listaActividadesMejoraByMetaPoa = this.getListaActividadesMejoraSeleccionadas();

        // Recorremos la lista de la Actividades de Mejora Disponibles para Una Unidad Ejecutora
        for (ActividadMejora listaByUE: listaActividadesMejoraByUnidadEjecutora) {
    
            // Si la ActividadMejora existe ya asignada en el Plan Operativo
            if(listaActividadesMejoraByPlanOperativo.contains(listaByUE)){
                
                // Si la ActividadMejora pertenece a esta meta POA agreguela
                if(listaActividadesMejoraByMetaPoa.contains(listaByUE)){
                    listaFinal.add(listaByUE);
                }

            // No si no existe en el Plan Puede ser utilizada
            }else{
                listaFinal.add(listaByUE);
            }

        }

        // Retornamos la lista
        return listaFinal;
    }