SIGESA: Validación con una lista

  • Vamos a crear una validación que muestre un warning con una lista de actividades de mejora que falten por asiganar a una meta
  • Para esta tarea ya existen ciertas cosas como es el EditForm y el Archivo validador
  • por tanto en planOperativoEditForm tenemos el llamado al validador

planOperativoEditForm.xhtml

  • Ademas tenemos varios validadores
<!--Entrada oculta para validaciones-->
            <h:inputHidden id="planOperativoValidator" value="true" >
                <f:attribute name="planOperativo" value="#{planOperativoBean.entity}"/>
                <f:validator binding="#{planOperativoValidator}"
                             disabled="#{empty param['formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}"
                             />
            </h:inputHidden> 
            
             <h:inputHidden id="planOperativoTipoIntegradoValidator"
                           value="true">
                <f:attribute name="planOperativo" value="#{planOperativoBean.entity}"/>
                <f:validator binding="#{planOperativoTipoIntegradoValidator}"/>
            </h:inputHidden>
            
            <h:inputHidden id="planOperativoIntegradoAccionesValidator"
                           value="true">
                <f:attribute name="planOperativo" value="#{planOperativoBean.entity}"/>
                <f:validator binding="#{planOperativoIntegradoAccionesValidator}"/>
            </h:inputHidden>
  • El que requerimos en el de planOperativo
<h:inputHidden id="planOperativoValidator" value="true" >
                <f:attribute name="planOperativo" value="#{planOperativoBean.entity}"/>
                <f:validator binding="#{planOperativoValidator}"
                             disabled="#{empty param['formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}"
                             />
            </h:inputHidden> 
  • Aquí es importante que cuando requerimos que la validación solo se aplique para el flujo debe tener la linea
disabled="#{empty param['formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}"
  • En caso contrario se aplica sobre el botón y el flujo como en este caso:
<h:inputHidden id="planOperativoTipoIntegradoValidator"
                           value="true">
                <f:attribute name="planOperativo" value="#{planOperativoBean.entity}"/>
                <f:validator binding="#{planOperativoTipoIntegradoValidator}"/>
            </h:inputHidden>

PlanOperativoValidator.java

  • Aquí ya tenemos la validación
/*
 * 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
  • Primero agregamos el import necesario
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
  • 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;
  • Pendiente probar funcionamiento
  • Y crear para actividad de riesgo