{"id":14210,"date":"2023-01-27T14:15:33","date_gmt":"2023-01-27T20:15:33","guid":{"rendered":"http:\/\/201.237.206.56\/Sitios\/ugit.siua.ac.cr\/?p=14210"},"modified":"2023-02-03T14:20:25","modified_gmt":"2023-02-03T20:20:25","slug":"sigesa-validacion-con-una-lista","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=14210","title":{"rendered":"SIGESA: Validaci\u00f3n con una lista"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>Vamos a crear una validaci\u00f3n que muestre un warning con una lista de actividades de mejora que falten por asiganar a una meta<\/li>\n\n\n\n<li>Para esta tarea ya existen ciertas cosas como es el EditForm y el Archivo validador<\/li>\n\n\n\n<li>por tanto en planOperativoEditForm tenemos el llamado al validador<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">planOperativoEditForm.xhtml<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ademas tenemos varios validadores<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--Entrada oculta para validaciones--&gt;\n            &lt;h:inputHidden id=\"planOperativoValidator\" value=\"true\" &gt;\n                &lt;f:attribute name=\"planOperativo\" value=\"#{planOperativoBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{planOperativoValidator}\"\n                             disabled=\"#{empty param&#91;'formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}\"\n                             \/&gt;\n            &lt;\/h:inputHidden&gt; \n            \n             &lt;h:inputHidden id=\"planOperativoTipoIntegradoValidator\"\n                           value=\"true\"&gt;\n                &lt;f:attribute name=\"planOperativo\" value=\"#{planOperativoBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{planOperativoTipoIntegradoValidator}\"\/&gt;\n            &lt;\/h:inputHidden&gt;\n            \n            &lt;h:inputHidden id=\"planOperativoIntegradoAccionesValidator\"\n                           value=\"true\"&gt;\n                &lt;f:attribute name=\"planOperativo\" value=\"#{planOperativoBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{planOperativoIntegradoAccionesValidator}\"\/&gt;\n            &lt;\/h:inputHidden&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El que requerimos en el de planOperativo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;h:inputHidden id=\"planOperativoValidator\" value=\"true\" &gt;\n                &lt;f:attribute name=\"planOperativo\" value=\"#{planOperativoBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{planOperativoValidator}\"\n                             disabled=\"#{empty param&#91;'formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}\"\n                             \/&gt;\n            &lt;\/h:inputHidden&gt; <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed es importante que cuando requerimos que la validaci\u00f3n solo se aplique para el flujo debe tener la linea<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>disabled=\"#{empty param&#91;'formMantenimiento:toolbar:toolbar_workflowCompleteTaskBtn']}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En caso contrario se aplica sobre el bot\u00f3n y el flujo como en este caso:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;h:inputHidden id=\"planOperativoTipoIntegradoValidator\"\n                           value=\"true\"&gt;\n                &lt;f:attribute name=\"planOperativo\" value=\"#{planOperativoBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{planOperativoTipoIntegradoValidator}\"\/&gt;\n            &lt;\/h:inputHidden&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoValidator.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed ya tenemos la validaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (C) 2022.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n * \n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.view.validator;\n\nimport cr.ac.una.cgi.sdkuna.domain.Rol;\nimport cr.ac.una.cgi.sdkuna.domain.Usuario;\nimport cr.ac.una.cgi.sdkuna.service.ParametroService;\nimport cr.ac.una.cgi.sdkuna.service.RolService;\nimport cr.ac.una.cgi.sdkuna.service.RolUsuarioService;\nimport cr.ac.una.cgi.sdkuna.service.UsuarioService;\nimport cr.ac.una.cgi.sdkuna.view.controller.MessagesController;\nimport cr.ac.una.cgi.sdkuna.view.util.MessageBundleLoader;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.EstadoFormulacionOpeService;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.PlanOperativoService;\nimport java.util.List;\nimport javax.faces.application.FacesMessage;\nimport javax.faces.component.UIComponent;\nimport javax.faces.context.FacesContext;\nimport javax.faces.validator.Validator;\nimport javax.faces.validator.ValidatorException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\n\n\/**\n *\n * @author Greivin Barrantes S.\n * @version 0.0.1 14\/01\/2022\n *\n *\/\n@Component\n@Scope(\"request\")\npublic class PlanOperativoValidator implements Validator {\n\n    @Autowired\n    MessagesController messagesController;\n\n    @Autowired\n    PlanOperativoService planOperativoService;\n    \n    @Autowired\n    EstadoFormulacionOpeService estadoFormulacionOpeService;\n    \n    @Autowired\n    UsuarioService usuarioService;\n    \n    @Autowired\n    RolUsuarioService rolUsuarioService;\n    \n    @Autowired\n    RolService rolService;\n    \n    @Autowired\n    ParametroService parametroService;\n\n    @Override\n    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {\n\n        PlanOperativo planOperativo = (PlanOperativo) component.getAttributes().get(\"planOperativo\");\n\n        if (planOperativo == null) {\n            return;\n        }\n\n        if (planOperativo.getUnidadEjecutora() != null &amp;&amp; planOperativo.getPeriodoAnual() != null &amp;&amp; planOperativo.getTipoPlanOperativo() != null) {\n            List&lt;PlanOperativo&gt; lista = planOperativoService.findByUnidadEjecutoraAndPeriodoAnualAndTipoPlanOperativo(planOperativo.getUnidadEjecutora(), planOperativo.getPeriodoAnual(), planOperativo.getTipoPlanOperativo());\n\n            if (!lista.isEmpty() &amp;&amp; planOperativo.getId() == null) {\n                String message = MessageBundleLoader.getMessage(\"planOperativo_mismosRegistros_validator\");\n                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, \"\", message));\n            }\n        }\n        \n        if (planOperativo.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoBorrador())) {\n            \/\/Validar que todos los objetivos tengan al menos una meta y que el plan tenga al menos un objetivo\n            try {\n                planOperativoService.validarObjetivosSinMetas(planOperativo);\n                if (planOperativo.getTipoPlanOperativo().equals(planOperativoService.obtieneTipoPlanUnidad())) {\n\n                    Usuario usuarioActual = usuarioService.getUsuarioActual();\n                    Rol rolAdminPPIPOO = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_admin\").getValor()));\n                    List&lt;Usuario&gt; usuariosRolAdminPPO = rolUsuarioService.getByRolActivo(rolAdminPPIPOO);\n\n                    if (!usuariosRolAdminPPO.contains(usuarioActual)) {\n\n                        planOperativoService.validarPlanSinTodosLosAportesEstrategicos(planOperativo);\n                    }\n                }\n            } catch (Exception exception) {\n                String summary = exception.getMessage();\n                String detail = exception.getCause().getMessage();\n                messagesController.addError(summary, detail);\n                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y para nuestra tarea se debe cumplir las siguientes condiciones:\n<ul class=\"wp-block-list\">\n<li>El estado debe ser en borrador ya que el siguiente estado es completado<\/li>\n\n\n\n<li>Y las Actividades de mejora y riegos solo se aplican a planes de tipo de unidad<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>por tanto debemos agregar nuestra validaci\u00f3n en esta secci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if (planOperativo.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoBorrador())) {\n            \/\/Validar que todos los objetivos tengan al menos una meta y que el plan tenga al menos un objetivo\n            try {\n                \n                planOperativoService.validarObjetivosSinMetas(planOperativo);\n\n                if (planOperativo.getTipoPlanOperativo().equals(planOperativoService.obtieneTipoPlanUnidad())) {\n\n                    Usuario usuarioActual = usuarioService.getUsuarioActual();\n                    Rol rolAdminPPIPOO = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_admin\").getValor()));\n                    List&lt;Usuario&gt; usuariosRolAdminPPO = rolUsuarioService.getByRolActivo(rolAdminPPIPOO);\n\n                    if (!usuariosRolAdminPPO.contains(usuarioActual)) {\n\n                        planOperativoService.validarPlanSinTodosLosAportesEstrategicos(planOperativo);\n                    }\n\n\n                }\n            } catch (Exception exception) {\n                String summary = exception.getMessage();\n                String detail = exception.getCause().getMessage();\n                messagesController.addError(summary, detail);\n                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));\n            }\n        }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"438\" src=\"\/wp-content\/uploads\/2023\/01\/Seleccion_028-1024x438.png\" alt=\"\" class=\"wp-image-14214\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_028-1024x438.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_028-300x128.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_028-768x328.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_028.png 1196w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/************************************************************************\n                    \/\/ VALIDACI\u00d3N: PlanOperativo.Unidad.TodasLasActividadesMejora\n                    \/\/************************************************************************\n                    \n                    \/\/ Declaramos una Array de Mensajes para almacenar la lista de las actividades de mejora\n                    List&lt;String> listaMensajesActividadMejora= new ArrayList(); \n\n                    \/\/ Variables para MSJ y Detail\n                    String msjSummaryActividadMejora=\"\";\n                    String detailActividadMejora=\"\";\n\n                    \/\/ Bandera para determinar si hay errores o no\n                    boolean hayErroresActividadMejora =false;\n                    \n                    \/\/ Mandamos a ejecutar un m\u00e9todo que retorna una lista de Actividades de Mejora que no fuer\u00f3n asignadas a una meta\n                    listaMensajesActividadMejora.addAll(planOperativoService.validacionActividadesMejora(planOperativo));\n                    \n                    \/\/ Si la lista no esta vacia \n                    if(!listaMensajesActividadMejora.isEmpty()){\n            \n                         \/\/ Creamos un mensaje de error para que frene el flujo\n                        msjSummaryActividadMejora= messagesController.getI18n(\"planOperativo_planOperativoSinActividadesMejoraAsignar_remainValidator_summary\");\n\n\/\/ Creamos un mensaje de warnnig para que muestre el t\u00edtulo de las actividades\n                        msjTitleActividadMejora= messagesController.getI18n(\"planOperativo_planOperativoSinActividadesMejoraAsignar_remainValidator_title\");\n\n                        \/\/ Mostramos el mensaje\n                        messagesController.addWarn(msjTitleActividadMejora, \"\");\n                        \/\/ Recorremos la lista de de mensajes para agregarlos a warning\n                        for(int i=1 ; i&lt; listaMensajesActividadMejora.size(); i++){\n                            \n                            \/\/ La asignamos al detalle\n                            detailActividadMejora = listaMensajesActividadMejora.get(i);\n                            \n                            \/\/ Desplegamos el mensaje Warning\n                            messagesController.addWarn(\"\", detailActividadMejora);\n\n                            \/\/ Establecemos que si existe un error\n                            hayErroresActividadMejora =true;\n                            \n                        }\n                        \n                        \/\/ Si existen errores detenga el flujo y muestre el error ROJO \n                        if(hayErroresActividadMejora){\n                            Throwable cause = new Throwable(\"\");\n                            throw new Exception(msjSummaryActividadMejora, cause);\n                        }\n        \n                         \n                    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y agregamos el import necesario<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.ArrayList;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que creamos el llamado a una funci\u00f3n que valide en el service de PO, vamos a crear esta funci\u00f3n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que tenemos el llamado a la validaci\u00f3n vamos a crear el servicio que valida el planOperativo<\/li>\n\n\n\n<li>Primero agregamos el import necesario<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos la  funci\u00f3n que retorne la lista de Actividades que faltan de asignar<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * \n     * VALIDACI\u00d3N que verifica si a un Plan Operativo se le asignaron todas la activiades de mejora:\n     * \n     * @param planOperativo Plan operativo a Duplicar\n     * @param etapaPlan  Etapa del Plan    \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/01\/2023\n     * @issue: PPI-282\n     * @return \n     *\/\n    public List&lt;String&gt; validacionActividadesMejora(PlanOperativo planOperativo) throws Exception{\n        \n            \n            \n            \/\/ *******************************************************************\n            \/\/ PASO1: obtener las Actividades que se deben asignar\n            \/\/ *******************************************************************\n\n            \/\/ Creamos una lista nueva para obtener las actividades de mejora disponibles para una Unidad Ejecutora\n            List&lt;ActividadMejora&gt; listaActividadesMejoraByUnidadEjecutora = new ArrayList();\n\n            \/\/ Obtenemos el A\u00f1o del Periodo Anual\n            Integer AnnoPeriodo = planOperativo.getPeriodoAnual().getAno();\n\n            \/\/ Obtenemos la Unidad Ejecutora del Periodo Anual\n            Long unidadEjecutora = planOperativo.getUnidadEjecutora().getId();\n\n            listaActividadesMejoraByUnidadEjecutora.addAll(metaPoaService.findAllActividadMejoraByActivoAndPeriodoEntreAndUnidadEjecutoraEquals(AnnoPeriodo,unidadEjecutora));\n\n\n            \/\/ *******************************************************************\n            \/\/ PASO2: obtener las Actividades que se han asignado\n            \/\/ *******************************************************************\n             \/\/ Creamos una lista nueva para obtener las actividades de mejora disponibles para un Plan Operativo\n            List&lt;ActividadMejora&gt; listaActividadesMejoraByPlanOperativo = new ArrayList();\n\n            \/\/ Le agregamos a la lista los valores obtenidos del service de Actividad de Mejora\n            listaActividadesMejoraByPlanOperativo.addAll(metaPoaService.findAllActividadMejoraByPlanOperativo(planOperativo));\n\n\n            \/\/ *******************************************************************\n            \/\/ PASO3: crear una lista de actividades faltantes en el plan Operativo\n            \/\/ *******************************************************************\n\n            \/\/ Declaramos una lista de Actividades faltantes\n            List&lt;ActividadMejora&gt; listaFaltantesActividadMejora = new ArrayList();\n\n            \/\/ Recorremos la lista de Activades por asignar\n            for(ActividadMejora actividadMejora : listaActividadesMejoraByUnidadEjecutora){\n\n                \/\/ Preguntamos si la actividad NO existe en las asignadas en el PO\n                if(!listaActividadesMejoraByPlanOperativo.contains(actividadMejora)){\n\n                    \/\/ La agregamos a la lista de faltantes\n                    listaFaltantesActividadMejora.add(actividadMejora);\n                }\n            }\n\n            \/\/ *******************************************************************\n            \/\/ PASO4: crear una lista Mensajes de actividades faltantes en el plan Operativo\n            \/\/ *******************************************************************\n            \n            \/\/ Declaramos una lista de mensajes para retornar las lista de actividades no asignadas\n            List&lt;String&gt; listaMensajesActividadMejora = new ArrayList(); \n\n            String mensaje = \"\";\n\n            \/\/ Si la lista de faltantes no esta vacia\n            if (!listaFaltantesActividadMejora.isEmpty()) {\n                \n                \/\/ Limpiamos la lista de mensajes\n                listaMensajesActividadMejora.clear();\n\n                \/\/ Recorremos la lista de faltantes \n                for (ActividadMejora actividadMejora : listaFaltantesActividadMejora) {\n                    \n                    \/\/ Agregamos el c\u00f3digo y descripci\u00f3n de la actividad a la lista de mensajes\n                    listaMensajesActividadMejora.add(\"C\u00f3digo \" + actividadMejora.getCodigo() + \" \" + actividadMejora.getDescripcion());  \n                }\n\n                \n            }\n            \n            \/\/ Retornamos la lista de mensajes\n            return listaMensajesActividadMejora;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PLanOperativoService.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * \n     * VALIDACI\u00d3N que verifica si a un Plan Operativo se le asignaron todas la activiades de mejora:\n     * \n     * @param planOperativo Plan operativo a Duplicar\n     * @param etapaPlan  Etapa del Plan    \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/01\/2023\n     * @issue: PPI-282\n     * @return \n     *\/\n    public List&lt;String&gt; validacionActividadesMejora(PlanOperativo planOperativo) throws Exception;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pendiente probar funcionamiento<\/li>\n\n\n\n<li>Y crear para actividad de riesgo<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>planOperativoEditForm.xhtml PlanOperativoValidator.java PlanOperativoServiceImpl.java PLanOperativoService.java<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[443,1],"tags":[473,444,464,474],"class_list":["post-14210","post","type-post","status-publish","format-standard","hentry","category-sigesa","category-sin-categoria","tag-listas","tag-sigesa","tag-validacion","tag-warning"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14210"}],"version-history":[{"count":10,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14210\/revisions"}],"predecessor-version":[{"id":14223,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14210\/revisions\/14223"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}