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
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
/**********************************************************************/
/**
* 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
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
/**
* 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;
}
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
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
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
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
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
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;
}