{"id":14227,"date":"2023-02-17T15:45:53","date_gmt":"2023-02-17T21:45:53","guid":{"rendered":"http:\/\/201.237.206.56\/Sitios\/ugit.siua.ac.cr\/?p=14227"},"modified":"2023-02-22T10:16:19","modified_gmt":"2023-02-22T16:16:19","slug":"sigesa-procesos-modificacion","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=14227","title":{"rendered":"SIGESA: Procesos modificaci\u00f3n"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>Primero la tarea es la PPI-265<\/li>\n\n\n\n<li>Descripci\u00f3n:\n<ul class=\"wp-block-list\">\n<li>Yo como Analista de planificaci\u00f3n operativa requiero verificar el funcionamiento de proceso finalizaci\u00f3n de etapa.<\/li>\n\n\n\n<li><strong>Criterios de aceptaci\u00f3n:<\/strong><\/li>\n\n\n\n<li>Debe ejecutarse autom\u00e1ticamente el d\u00eda registrado en la ejecuci\u00f3n de procesos de la etapa correspondiente.<\/li>\n\n\n\n<li>Debe enviarse a las unidades ejecutoras que tengan vinculaci\u00f3n de plan y cuyos planes no est\u00e9n en estado:\n<ul class=\"wp-block-list\">\n<li>Aprobado Un Solo Nivel<\/li>\n\n\n\n<li>Aprobado Unidad Integradora<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Revisar la estructura del correo:\n<ul class=\"wp-block-list\">\n<li>T\u00edtulo:<\/li>\n\n\n\n<li>Asunto:<\/li>\n\n\n\n<li>Cuerpo:<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ser\u00e1 enviado a los roles de aprobaci\u00f3n de primera y segunda instancia.\n<ul class=\"wp-block-list\">\n<li>APROBADOR_UNIDAD_EJECUTORA<\/li>\n\n\n\n<li>APROBADOR_UNIDAD_INTEGRADORA<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>No tomar en cuenta los planes en estado anulado.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero es que este proceso se encuentra en:\n<ul class=\"wp-block-list\">\n<li>PPI &#8211; Planificaci\u00f3n Institucional\n<ul class=\"wp-block-list\">\n<li>PPO &#8211;  Planificaci\u00f3n Operativa\n<ul class=\"wp-block-list\">\n<li>PPO &#8211; Procesos\n<ul class=\"wp-block-list\">\n<li>Proceso de Aviso de Finalizaci\u00f3n de Etapas PPO<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"566\" height=\"300\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_040.png\" alt=\"\" class=\"wp-image-14228\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_040.png 566w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_040-300x159.png 300w\" sizes=\"(max-width: 566px) 100vw, 566px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero es que el nombre del proceso se modific\u00f3 entonces para esto debemos ingresar a \u00abLista de procesos\u00bb<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"720\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_041-1024x720.png\" alt=\"\" class=\"wp-image-14229\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_041-1024x720.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_041-300x211.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_041-768x540.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_041.png 1121w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo siguiente que se debe hacer es modificar el nombre dentro del recurso<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"648\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_042-1024x648.png\" alt=\"\" class=\"wp-image-14232\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_042-1024x648.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_042-300x190.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_042-768x486.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_042.png 1205w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora los  procesos trabajan con un archivo que se ubica en:\n<ul class=\"wp-block-list\">\n<li>Proyecto\n<ul class=\"wp-block-list\">\n<li>resources\n<ul class=\"wp-block-list\">\n<li>META-INF\n<ul class=\"wp-block-list\">\n<li>spring<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"394\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_043.png\" alt=\"\" class=\"wp-image-14234\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_043.png 620w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_043-300x191.png 300w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El contenido es el siguiente adem\u00e1s aqu\u00ed es necesario realizar el cambio del nombre del proceso<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"\n       xmlns:batch=\"http:\/\/www.springframework.org\/schema\/batch\"\n       xmlns:aop=\"http:\/\/www.springframework.org\/schema\/aop\"\n       xmlns:context=\"http:\/\/www.springframework.org\/schema\/context\"\n       xmlns:task=\"http:\/\/www.springframework.org\/schema\/task\"\n       xmlns:p=\"http:\/\/www.springframework.org\/schema\/p\"\n       xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n       xsi:schemaLocation=\"http:\/\/www.springframework.org\/schema\/batch http:\/\/www.springframework.org\/schema\/batch\/spring-batch.xsd\n        http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd \n\thttp:\/\/www.springframework.org\/schema\/aop http:\/\/www.springframework.org\/schema\/aop\/spring-aop.xsd\n        http:\/\/www.springframework.org\/schema\/context http:\/\/www.springframework.org\/schema\/context\/spring-context.xsd \n        http:\/\/www.springframework.org\/schema\/task http:\/\/www.springframework.org\/schema\/task\/spring-task.xsd\n         http:&#47;&#47;www.springframework.org\/schema\/context\n         http:\/\/www.springframework.org\/schema\/context\/spring-context.xsd\n         http:\/\/www.springframework.org\/schema\/aop http:\/\/www.springframework.org\/schema\/aop\/spring-aop-2.5.xsd\"&gt;\n\n \n\n    &lt;batch:job id=\"procesoPPIFinalizacionEtapasPPOJob\"&gt;\n        &lt;batch:step id=\"simpleTaskletStepProcesoPPIFinalizacionEtapasPPOJob\"&gt;\n            &lt;batch:tasklet ref=\"procesoPPIFinalizacionEtapasPPO\" \/&gt;\n            &lt;batch:listeners&gt;\n                &lt;batch:listener ref=\"batchJobStepListener\" \/&gt;\n            &lt;\/batch:listeners&gt;\n        &lt;\/batch:step&gt;\n    &lt;\/batch:job&gt;\n    \n    \n    \n    &lt;bean id=\"procesoPPIFinalizacionEtapasPPO\" class=\"org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter\" scope=\"step\"&gt;\n        &lt;property name=\"targetObject\" ref=\"planOperativoServiceImpl\"  \/&gt;\n        &lt;property name=\"targetMethod\" value=\"procesoFinalizacionEtapasPPO\" \/&gt;\n        &lt;property name=\"arguments\"&gt;\n            &lt;list&gt;           \n                &lt;value&gt;#{stepExecution.id}&lt;\/value&gt;\n            &lt;\/list&gt;\n        &lt;\/property&gt;\n    &lt;\/bean&gt;\n  \n  \n\n    &lt;bean id=\"procesoPPIFinalizacionEtapasPPOJobLauncher\" class=\"cr.ac.una.cgi.sdkuna.service.BatchJobLauncherService\" scope=\"prototype\"&gt;\n        &lt;property name=\"jobLauncher\" ref=\"jobLauncher\"&gt;&lt;\/property&gt;\n        &lt;property name=\"job\" ref=\"procesoPPIFinalizacionEtapasPPOJob\"&gt;&lt;\/property&gt;\n    &lt;\/bean&gt;\n    \n&lt;\/beans&gt;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqupi lo importante es la siguiente secci\u00f3n que no indica donde esta definido el servicio y el m\u00e9todo que va a atender el proceso<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;bean id=\"procesoPPIFinalizacionEtapasPPO\" class=\"org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter\" scope=\"step\"&gt;\n        &lt;property name=\"targetObject\" ref=\"planOperativoServiceImpl\"  \/&gt;\n        &lt;property name=\"targetMethod\" value=\"procesoFinalizacionEtapasPPO\" \/&gt;\n        &lt;property name=\"arguments\"&gt;\n            &lt;list&gt;           \n                &lt;value&gt;#{stepExecution.id}&lt;\/value&gt;\n            &lt;\/list&gt;\n        &lt;\/property&gt;\n    &lt;\/bean&gt;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"918\" height=\"208\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_044.png\" alt=\"\" class=\"wp-image-14239\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_044.png 918w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_044-300x68.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_044-768x174.png 768w\" sizes=\"(max-width: 918px) 100vw, 918px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actualmente el proceso es el siguiente<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public void procesoFinalizacionEtapasPPO(Long jobId) {\n\n        \/*PPI-198 se habl\u00f3 con Laura y para el a\u00f1o 2022 no son necesarias las evaluaciones, para el 2023 verificar este m\u00e9todo\n        \/\/evaluacionOperativaService.procesoFinalizacionEvaluacion(jobId);\n         *\/\n        Date diaHoy = eventoService.fechaFormatoSinHoras(new Date());\n        Date diaAyer = eventoService.calcularFecha(diaHoy,-eventoService.fechaMenosNDiasHabiles(diaHoy, 1));\n        PeriodoAnual periodoAnualVigente = periodoAnualService.findAnoFormulacion();\n\n        String ids = parametroService.findOneByLlave(\"param_ppi_ppo_estados_formulacion_correo\").getValor();\n        String&#91;] arrayIds = ids.split(\",\");\n\n        List&lt;Long&gt; idsEstados = new ArrayList();\n        for (String s : arrayIds) {\n            idsEstados.add(Long.valueOf(s));\n        }\n\n        List&lt;PlanOperativo&gt; planesSinFinalizar = findByPeriodoAnualAndEstadoNotAprobadoSegundaInstaciaAndEventoFinalizado(periodoAnualVigente, idsEstados, diaAyer);\n\n        if (!planesSinFinalizar.isEmpty()) {\n\n            Rol rolAprobadorUnidadEjecutora = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_aprobador_unidad_ejecutora\").getValor()));\n            List&lt;Usuario&gt; usuariosUnidadEjecutora = rolUsuarioService.getByRolActivo(rolAprobadorUnidadEjecutora);\n            \n            Rol rolAprobadorUnidadIntegradora = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_aprobador_unidad_integradora\").getValor()));\n            List&lt;Usuario&gt; usuariosUnidadIntegradora = rolUsuarioService.getByRolActivo(rolAprobadorUnidadIntegradora);\n                       \n            Rol rolPPIAdmin = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_admin\").getValor()));\n            List&lt;Usuario&gt; usuariosPPIAdmin = rolUsuarioService.getByRolActivo(rolPPIAdmin);\n                      \n            Rol rolPPIAnalista = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_analista\").getValor()));\n            List&lt;Usuario&gt; usuariosPPIAnalista = rolUsuarioService.getByRolActivo(rolPPIAnalista);\n            \n            for (PlanOperativo planOperativo : planesSinFinalizar) {\n                List&lt;Usuario&gt; usuariosUE = this.obtieneUsuariosPorRolAcl(planOperativo.getUnidadEjecutora().getCodigo());\n                List&lt;Usuario&gt; usuariosEnviarCorreo = new ArrayList();\n                usuariosEnviarCorreo.addAll(usuariosPPIAnalista);\n                for (Usuario usuarioACL : usuariosUE) {\n                    if ((usuariosUnidadEjecutora.contains(usuarioACL) || usuariosUnidadIntegradora.contains(usuarioACL)) &amp;&amp; !usuariosEnviarCorreo.contains(usuarioACL)) {\n                        usuariosEnviarCorreo.add(usuarioACL);\n                    }\n                }\n                for (Usuario usuario : usuariosPPIAdmin) {\n                    if (!usuariosEnviarCorreo.contains(usuario)) {\n                        usuariosEnviarCorreo.add(usuario);\n                    }\n                }\n\n                this.enviarCorreoVencimiento(usuariosEnviarCorreo, planOperativo);\n\n            }\n        }\n\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora lo primero que debemos hacer es agregarle un parametro \u00abEtapaPlan\u00bb al proceso<\/li>\n\n\n\n<li>Para esto lo primero que vamos hacer es buscar SIGESA el proceso y le indicamos que va requerir un parametro\n<ul class=\"wp-block-list\">\n<li>SAS &#8211;  Seguridad y Administraci\u00f3n \n<ul class=\"wp-block-list\">\n<li>SAS &#8211;  Seguridad y Administraci\u00f3n \n<ul class=\"wp-block-list\">\n<li>SAS &#8211; Mantenimiento\n<ul class=\"wp-block-list\">\n<li>Lista de Procesos\n<ul class=\"wp-block-list\">\n<li>procesoPPIFinalizacionEtapasPPOJob<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"990\" height=\"685\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_045.png\" alt=\"\" class=\"wp-image-14243\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_045.png 990w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_045-300x208.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_045-768x531.png 768w\" sizes=\"(max-width: 990px) 100vw, 990px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos\n<ul class=\"wp-block-list\">\n<li>etapaPlan<\/li>\n\n\n\n<li>Etapa de Planificaci\u00f3n<\/li>\n\n\n\n<li>Objeto<\/li>\n\n\n\n<li>Requerido<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"824\" height=\"623\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_046.png\" alt=\"\" class=\"wp-image-14244\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_046.png 824w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_046-300x227.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_046-768x581.png 768w\" sizes=\"(max-width: 824px) 100vw, 824px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos\n<ul class=\"wp-block-list\">\n<li>cr.ac.una.cgi.sigesa.ppi.ppo.domain.EtapaPlan<\/li>\n\n\n\n<li>nombre<\/li>\n\n\n\n<li>EtapaPlanBean<\/li>\n\n\n\n<li>EtapaPlanProcesoService<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"730\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_047.png\" alt=\"\" class=\"wp-image-14246\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_047.png 576w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_047-237x300.png 237w\" sizes=\"(max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ya con esto si ingresamos al proceso podemos ver que pide el parametro<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"434\" src=\"\/wp-content\/uploads\/2023\/02\/Seleccion_048-1024x434.png\" alt=\"\" class=\"wp-image-14248\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_048-1024x434.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_048-300x127.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_048-768x326.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_048-1536x651.png 1536w, https:\/\/sada.services\/wp-content\/uploads\/2023\/02\/Seleccion_048.png 1564w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">applicationContext-procesoFinalizacionEtapasPPOJob.xml<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a modifica el proceso para que reciba el parametro<\/li>\n\n\n\n<li>Para esto abrimos el archivo y buscamos la secci\u00f3n donde se invoca el servicio<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;bean id=\"procesoPPIFinalizacionEtapasPPO\" class=\"org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter\" scope=\"step\"&gt;\n        &lt;property name=\"targetObject\" ref=\"planOperativoServiceImpl\"  \/&gt;\n        &lt;property name=\"targetMethod\" value=\"procesoFinalizacionEtapasPPO\" \/&gt;\n        &lt;property name=\"arguments\"&gt;\n            &lt;list&gt;           \n                &lt;value&gt;#{stepExecution.id}&lt;\/value&gt;\n            &lt;\/list&gt;\n        &lt;\/property&gt;\n    &lt;\/bean&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le indicamos que vamos a recibir uno nuevo, agregando la siguiente linea<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;value&gt;#{jobParameters&#91;'etapaPlan']}&lt;\/value&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quedando as\u00ed<\/li>\n\n\n\n<li>NOTA: es importante el orden de los parametros<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;bean id=\"procesoPPIFinalizacionEtapasPPO\" class=\"org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter\" scope=\"step\"&gt;\n        &lt;property name=\"targetObject\" ref=\"planOperativoServiceImpl\"  \/&gt;\n        &lt;property name=\"targetMethod\" value=\"procesoFinalizacionEtapasPPO\" \/&gt;\n        &lt;property name=\"arguments\"&gt;\n            &lt;list&gt;           \n                &lt;value&gt;#{stepExecution.id}&lt;\/value&gt;\n                &lt;value&gt;#{jobParameters&#91;'etapaPlan']}&lt;\/value&gt;\n            &lt;\/list&gt;\n        &lt;\/property&gt;\n    &lt;\/bean&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos hacer que el servicio reciba el parametro<\/li>\n\n\n\n<li>NOTA: los parametros vienen como String por tanto para poder obtener el objeto debemos:\n<ul class=\"wp-block-list\">\n<li>Recibir un String<\/li>\n\n\n\n<li>Y obtener el objeto con find convirtiendo el String en Long<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ejemplo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void procesoFinalizacionEtapasPPO( Long jobId, String idEtapaPlan) {\n\n        \/\/Obtenemos la etapa plan\n        EtapaPlan etapaPlan = etapaPlanService.find(Long.parseLong(idEtapaPlan));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora lo que debemos hacer es modificar este metodo <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>findByPeriodoAnualAndEstadoNotAprobadoSegundaInstaciaAndEventoFinalizado<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por este<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>findByEtapaPlanAndFlujoNotFinalizado<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para hacer esto vamos a copiar el anterior y crea un m\u00e9todo nuevo<\/li>\n\n\n\n<li>Actual<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;PlanOperativo&gt; findByPeriodoAnualAndEstadoNotAprobadoSegundaInstaciaAndEventoFinalizado(PeriodoAnual periodoAnual, List&lt;Long&gt; idsEstados, Date dia) {\n        Specification specPeriodoAnual = PlanOperativoSpecs.periodoAnualEqual(periodoAnual);\n        Specification specEstadoNotEqual = PlanOperativoSpecs.estadosNotIn(idsEstados);\n        Specification specEventoFinalizado = PlanOperativoSpecs.isEventoFinalizado(eventoService.fechaFormatoSinHoras(dia));\n\n        Specification specFinal = Specification.where(specPeriodoAnual).and(specEstadoNotEqual).and(specEventoFinalizado);\n        return repository.findAll(specFinal);\n\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el nuevo metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * M\u00e9todo que retorna un List&lt;PlanOperativo&gt; seg\u00fan etapa plan y flujo no finalizado\n     * \n     * @param etapaPlan : etapaPlan por buscar\n     * @param idsEstados : lista de estados de formulaci\u00f3n de etapas no finalizadas\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @fechaCreacion: 20\/02\/2023\n     * @fechaModificacion: 20\/02\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-PPO\n     * @issue: PPI-265\n     *\/\n    public List&lt;PlanOperativo&gt; findByEtapaPlanAndFlujoNotFinalizado(EtapaPlan etapaPlan, List&lt;Long&gt; idsEstados) {\n        Specification specEtapaPlan = PlanOperativoSpecs.etapaPlanEqual(etapaPlan);\n        Specification specEstadoNotEqual = PlanOperativoSpecs.estadosNotIn(idsEstados);\n       \n        Specification specFinal = Specification.where(specEtapaPlan).and(specEstadoNotEqual);\n        return repository.findAll(specFinal);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora como vemos se modificar\u00f3n las espec\u00edficaciones eliminando la de specPeriodoAnual y agregando una nueva <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Specification specEtapaPlan = PlanOperativoSpecs.etapaPlanEqual(etapaPlan);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoSpecs.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por tanto debemos agregar esta nueva especificaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public static Specification&lt;PlanOperativo&gt; etapaPlanEqual(final EtapaPlan etapaPlan) {\n        return (Root&lt;PlanOperativo&gt; root, CriteriaQuery&lt;?&gt; cq, CriteriaBuilder cb) -&gt; {\n            Expression etaPlan = root.get(\"etapaPlan\");\n            Expression etaPlanLiteral = cb.literal(etapaPlan);\n            return cb.equal(etaPlan, etaPlanLiteral);\n        };\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora moficamos el m\u00e9todo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Date diaHoy = eventoService.fechaFormatoSinHoras(new Date());\n        Date diaAyer = eventoService.calcularFecha(diaHoy,-eventoService.fechaMenosNDiasHabiles(diaHoy, 1));\n        PeriodoAnual periodoAnualVigente = periodoAnualService.findAnoFormulacion();<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y renombramos los nombres de variables<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public void procesoFinalizacionEtapasPPO(Long jobId, String idEtapaPlan) {\n\n        \/\/ Obtenemos la etapa plan\n        EtapaPlan etapaPlan = etapaPlanService.find(Long.parseLong(idEtapaPlan));\n\n        \/\/ Obtenemos los id de estados de formulacion que no es necesario enviar correo\n        String ids = parametroService.findOneByLlave(\"param_ppi_ppo_estados_formulacion_correo\").getValor();\n        \n        \/\/ Hacemos un split \n        String&#91;] arrayIds = ids.split(\",\");\n\n        \/\/ creamos una lista de estados\n        List&lt;Long> idsEstados = new ArrayList();\n\n        \/\/ Recorremos la lista\n        for (String s : arrayIds) {\n            \n            \/\/ agregamos el valor a lista\n            idsEstados.add(Long.valueOf(s));\n        }\n\n        \/\/ Obtenemos todos los planes que no hayan terminado el flujo\n        List&lt;PlanOperativo> planesSinFinalizar = findByEtapaPlanAndFlujoNotFinalizado(etapaPlan, idsEstados);\n\n        if (!planesSinFinalizar.isEmpty()) {\n\n            Rol rolAprobadorUnidadEjecutora = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_aprobador_unidad_ejecutora\").getValor()));\n            List&lt;Usuario> usuariosUnidadEjecutora = rolUsuarioService.getByRolActivo(rolAprobadorUnidadEjecutora);\n            \n            Rol rolAprobadorUnidadIntegradora = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_aprobador_unidad_integradora\").getValor()));\n            List&lt;Usuario> usuariosUnidadIntegradora = rolUsuarioService.getByRolActivo(rolAprobadorUnidadIntegradora);\n                       \n            Rol rolPPOAdmin = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_admin\").getValor()));\n            List&lt;Usuario> usuariosPPOAdmin = rolUsuarioService.getByRolActivo(rolPPOAdmin);\n                      \n            Rol rolPPOAnalista = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_analista\").getValor()));\n            List&lt;Usuario> usuariosPPOAnalista = rolUsuarioService.getByRolActivo(rolPPOAnalista);\n            \n            for (PlanOperativo planOperativo : planesSinFinalizar) {\n                List&lt;Usuario> usuariosUE = this.obtieneUsuariosPorRolAcl(planOperativo.getUnidadEjecutora().getCodigo());\n                List&lt;Usuario> usuariosEnviarCorreo = new ArrayList();\n                usuariosEnviarCorreo.addAll(usuariosPPOAnalista);\n                for (Usuario usuarioACL : usuariosUE) {\n                    if ((usuariosUnidadEjecutora.contains(usuarioACL) || usuariosUnidadIntegradora.contains(usuarioACL)) &amp;&amp; !usuariosEnviarCorreo.contains(usuarioACL)) {\n                        usuariosEnviarCorreo.add(usuarioACL);\n                    }\n                }\n                for (Usuario usuario : usuariosPPOAdmin) {\n                    if (!usuariosEnviarCorreo.contains(usuario)) {\n                        usuariosEnviarCorreo.add(usuario);\n                    }\n                }\n\n                this.enviarCorreoVencimiento(usuariosEnviarCorreo, planOperativo, etapaPlan.getNombre());\n\n            }\n        }\n\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modificamos la funci\u00f3n del envi\u00f3 de correo, para agregarle los parametros de\n<ul class=\"wp-block-list\">\n<li>planOperativo<\/li>\n\n\n\n<li>TipoPlan<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void enviarCorreoVencimiento(List&lt;Usuario> usuarios, PlanOperativo planOperativo, String nombreEtapaPlan) {\n        try {\n            List&lt;Persona> personas = new ArrayList();\n            personas = agregarPersonasPorUsuarios(personas, usuarios);\n\n            if (!personas.isEmpty()) {\n\n                for (Persona persona : personas) {\n\n                    String subject;\n                    String body;\n\n                    String nombreUnidad = planOperativo.getUnidadEjecutora().getNombre();\n                    String estado = planOperativo.getEstadoFormulacionOpe().getNombre();\n                    List&lt;String> correos = new ArrayList();\n                    Map&lt;String, String> parametros = new HashMap&lt;>();\n\n                    subject = i18nService.findOneByLlaveAndIdioma(\"param_ppi_ppo_planesOperativos_sinFinalizar\", \"es\").getValor();\n\n                    persona.getPersonaCorreos().stream()\n                            .filter(personaCorreo -> ((personaCorreo.getActivo() == 1) &amp;&amp; (personaCorreo.getPrioridad() == 1)))\n                            .map(personaCorreo -> personaCorreo.getCorreoElectronico())\n                            .forEachOrdered(destinatario -> {\n                                correos.add(destinatario);\n                            });\n\n                    parametros.put(\"nombreUnidad\", nombreUnidad);\n                    parametros.put(\"nombreEtapaPlan\", nombreEtapaPlan);\n                    parametros.put(\"estado\", estado);\n                    parametros.put(\"planOperativo\", planOperativo.getCodigo());\n                    parametros.put(\"tipoPlan\", planOperativo.getTipoPlan().getNombre());\n\n                    body = plantillaCorreoService.getHtmlContent(\"TPPIPPOPLANESSINFINALIZAR\", parametros);\n\n                    if (!correos.isEmpty()) {\n                        mailService.sendMail(MailMessageData.builder()\n                                .to(correos)\n                                .subject(subject)\n                                .body(body)\n                                .build());\n                    }\n                }\n            }\n\n        } catch (Exception ex) {\n        }\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoService<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Renombramos el m\u00e9todo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void procesoFinalizacionEtapasPPO(Long jobId, String idEtapaPlan);<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>applicationContext-procesoFinalizacionEtapasPPOJob.xml PlanOperativoServiceImpl.java PlanOperativoSpecs.java PlanOperativoServiceImpl.java PlanOperativoService<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[443],"tags":[478,477,444],"class_list":["post-14227","post","type-post","status-publish","format-standard","hentry","category-sigesa","tag-correos","tag-procesos","tag-sigesa"],"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\/14227","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=14227"}],"version-history":[{"count":19,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14227\/revisions"}],"predecessor-version":[{"id":14259,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14227\/revisions\/14259"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}