/*
* 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 cr.ac.una.cgi.sigesa.ppi.ppo.view.validator;
import cr.ac.una.cgi.sdkuna.domain.Rol;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.service.ParametroService;
import cr.ac.una.cgi.sdkuna.service.RolService;
import cr.ac.una.cgi.sdkuna.service.RolUsuarioService;
import cr.ac.una.cgi.sdkuna.service.UsuarioService;
import cr.ac.una.cgi.sdkuna.view.controller.MessagesController;
import cr.ac.una.cgi.sdkuna.view.util.MessageBundleLoader;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.EstadoFormulacionOpeService;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.PlanOperativoService;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
*
* @author Greivin Barrantes S.
* @version 0.0.1 14/01/2022
*
*/
@Component
@Scope("request")
public class PlanOperativoValidator implements Validator {
@Autowired
MessagesController messagesController;
@Autowired
PlanOperativoService planOperativoService;
@Autowired
EstadoFormulacionOpeService estadoFormulacionOpeService;
@Autowired
UsuarioService usuarioService;
@Autowired
RolUsuarioService rolUsuarioService;
@Autowired
RolService rolService;
@Autowired
ParametroService parametroService;
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
PlanOperativo planOperativo = (PlanOperativo) component.getAttributes().get("planOperativo");
if (planOperativo == null) {
return;
}
if (planOperativo.getUnidadEjecutora() != null && planOperativo.getPeriodoAnual() != null && planOperativo.getTipoPlanOperativo() != null) {
List<PlanOperativo> lista = planOperativoService.findByUnidadEjecutoraAndPeriodoAnualAndTipoPlanOperativo(planOperativo.getUnidadEjecutora(), planOperativo.getPeriodoAnual(), planOperativo.getTipoPlanOperativo());
if (!lista.isEmpty() && planOperativo.getId() == null) {
String message = MessageBundleLoader.getMessage("planOperativo_mismosRegistros_validator");
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", message));
}
}
if (planOperativo.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoBorrador())) {
//Validar que todos los objetivos tengan al menos una meta y que el plan tenga al menos un objetivo
try {
planOperativoService.validarObjetivosSinMetas(planOperativo);
if (planOperativo.getTipoPlanOperativo().equals(planOperativoService.obtieneTipoPlanUnidad())) {
Usuario usuarioActual = usuarioService.getUsuarioActual();
Rol rolAdminPPIPOO = rolService.findOne(Long.parseLong(parametroService.findOneByLlave("param_ppi_ppo_rol_admin").getValor()));
List<Usuario> usuariosRolAdminPPO = rolUsuarioService.getByRolActivo(rolAdminPPIPOO);
if (!usuariosRolAdminPPO.contains(usuarioActual)) {
planOperativoService.validarPlanSinTodosLosAportesEstrategicos(planOperativo);
}
}
} catch (Exception exception) {
String summary = exception.getMessage();
String detail = exception.getCause().getMessage();
messagesController.addError(summary, detail);
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));
}
}
}
}
Y para nuestra tarea se debe cumplir las siguientes condiciones:
El estado debe ser en borrador ya que el siguiente estado es completado
Y las Actividades de mejora y riegos solo se aplican a planes de tipo de unidad
por tanto debemos agregar nuestra validación en esta sección
if (planOperativo.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoBorrador())) {
//Validar que todos los objetivos tengan al menos una meta y que el plan tenga al menos un objetivo
try {
planOperativoService.validarObjetivosSinMetas(planOperativo);
if (planOperativo.getTipoPlanOperativo().equals(planOperativoService.obtieneTipoPlanUnidad())) {
Usuario usuarioActual = usuarioService.getUsuarioActual();
Rol rolAdminPPIPOO = rolService.findOne(Long.parseLong(parametroService.findOneByLlave("param_ppi_ppo_rol_admin").getValor()));
List<Usuario> usuariosRolAdminPPO = rolUsuarioService.getByRolActivo(rolAdminPPIPOO);
if (!usuariosRolAdminPPO.contains(usuarioActual)) {
planOperativoService.validarPlanSinTodosLosAportesEstrategicos(planOperativo);
}
}
} catch (Exception exception) {
String summary = exception.getMessage();
String detail = exception.getCause().getMessage();
messagesController.addError(summary, detail);
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));
}
}
Agregamos
//************************************************************************
// VALIDACIÓN: PlanOperativo.Unidad.TodasLasActividadesMejora
//************************************************************************
// Declaramos una Array de Mensajes para almacenar la lista de las actividades de mejora
List<String> listaMensajesActividadMejora= new ArrayList();
// Variables para MSJ y Detail
String msjSummaryActividadMejora="";
String detailActividadMejora="";
// Bandera para determinar si hay errores o no
boolean hayErroresActividadMejora =false;
// Mandamos a ejecutar un método que retorna una lista de Actividades de Mejora que no fuerón asignadas a una meta
listaMensajesActividadMejora.addAll(planOperativoService.validacionActividadesMejora(planOperativo));
// Si la lista no esta vacia
if(!listaMensajesActividadMejora.isEmpty()){
// Creamos un mensaje de error para que frene el flujo
msjSummaryActividadMejora= messagesController.getI18n("planOperativo_planOperativoSinActividadesMejoraAsignar_remainValidator_summary");
// Creamos un mensaje de warnnig para que muestre el título de las actividades
msjTitleActividadMejora= messagesController.getI18n("planOperativo_planOperativoSinActividadesMejoraAsignar_remainValidator_title");
// Mostramos el mensaje
messagesController.addWarn(msjTitleActividadMejora, "");
// Recorremos la lista de de mensajes para agregarlos a warning
for(int i=1 ; i< listaMensajesActividadMejora.size(); i++){
// La asignamos al detalle
detailActividadMejora = listaMensajesActividadMejora.get(i);
// Desplegamos el mensaje Warning
messagesController.addWarn("", detailActividadMejora);
// Establecemos que si existe un error
hayErroresActividadMejora =true;
}
// Si existen errores detenga el flujo y muestre el error ROJO
if(hayErroresActividadMejora){
Throwable cause = new Throwable("");
throw new Exception(msjSummaryActividadMejora, cause);
}
}
Y agregamos el import necesario
import java.util.ArrayList;
Ahora que creamos el llamado a una función que valide en el service de PO, vamos a crear esta función
PlanOperativoServiceImpl.java
Ahora que tenemos el llamado a la validación vamos a crear el servicio que valida el planOperativo
Ahora creamos la función que retorne la lista de Actividades que faltan de asignar
/**
*
* VALIDACIÓN que verifica si a un Plan Operativo se le asignaron todas la activiades de mejora:
*
* @param planOperativo Plan operativo a Duplicar
* @param etapaPlan Etapa del Plan
* @author Gustavo Matamoros González
* @since 27/01/2023
* @issue: PPI-282
* @return
*/
public List<String> validacionActividadesMejora(PlanOperativo planOperativo) throws Exception{
// *******************************************************************
// PASO1: obtener las Actividades que se deben asignar
// *******************************************************************
// 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 = planOperativo.getPeriodoAnual().getAno();
// Obtenemos la Unidad Ejecutora del Periodo Anual
Long unidadEjecutora = planOperativo.getUnidadEjecutora().getId();
listaActividadesMejoraByUnidadEjecutora.addAll(metaPoaService.findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(AnnoPeriodo,unidadEjecutora));
// *******************************************************************
// PASO2: obtener las Actividades que se han asignado
// *******************************************************************
// 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(metaPoaService.findAllActividadMejoraByPlanOperativo(planOperativo));
// *******************************************************************
// PASO3: crear una lista de actividades faltantes en el plan Operativo
// *******************************************************************
// Declaramos una lista de Actividades faltantes
List<ActividadMejora> listaFaltantesActividadMejora = new ArrayList();
// Recorremos la lista de Activades por asignar
for(ActividadMejora actividadMejora : listaActividadesMejoraByUnidadEjecutora){
// Preguntamos si la actividad NO existe en las asignadas en el PO
if(!listaActividadesMejoraByPlanOperativo.contains(actividadMejora)){
// La agregamos a la lista de faltantes
listaFaltantesActividadMejora.add(actividadMejora);
}
}
// *******************************************************************
// PASO4: crear una lista Mensajes de actividades faltantes en el plan Operativo
// *******************************************************************
// Declaramos una lista de mensajes para retornar las lista de actividades no asignadas
List<String> listaMensajesActividadMejora = new ArrayList();
String mensaje = "";
// Si la lista de faltantes no esta vacia
if (!listaFaltantesActividadMejora.isEmpty()) {
// Limpiamos la lista de mensajes
listaMensajesActividadMejora.clear();
// Recorremos la lista de faltantes
for (ActividadMejora actividadMejora : listaFaltantesActividadMejora) {
// Agregamos el código y descripción de la actividad a la lista de mensajes
listaMensajesActividadMejora.add("Código " + actividadMejora.getCodigo() + " " + actividadMejora.getDescripcion());
}
}
// Retornamos la lista de mensajes
return listaMensajesActividadMejora;
}
PLanOperativoService.java
Agregamos la definición
/**
*
* VALIDACIÓN que verifica si a un Plan Operativo se le asignaron todas la activiades de mejora:
*
* @param planOperativo Plan operativo a Duplicar
* @param etapaPlan Etapa del Plan
* @author Gustavo Matamoros González
* @since 27/01/2023
* @issue: PPI-282
* @return
*/
public List<String> validacionActividadesMejora(PlanOperativo planOperativo) throws Exception;