{"id":14037,"date":"2023-01-11T13:54:26","date_gmt":"2023-01-11T19:54:26","guid":{"rendered":"http:\/\/201.237.206.56\/Sitios\/ugit.siua.ac.cr\/?p=14037"},"modified":"2023-01-17T16:33:15","modified_gmt":"2023-01-17T22:33:15","slug":"sigesa-agregar-boton-de-accion","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=14037","title":{"rendered":"SIGESA: Agregar bot\u00f3n de Acci\u00f3n"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">planOperativoListForm<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed lo primero que se debe hacer es agregar la referencia a Bean que maneje a los botones<\/li>\n\n\n\n<li>Esto se hace con la siguiente linea:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>additionalButtonsBean=\"#{planOperativoListBeanButtons}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y esto se debe agregar en el componet \u00abnoEditTable\u00bb quedando as\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> \n        &lt;components:noEditTable id=\"noEditTable\"\n                                header=\"#{i18n.planOperativo_list_form_table_header}\"\n                                bean=\"#{planOperativoBean}\"\n                                showEditButton=\"#{!planOperativoBean.deshabilitarEdicion(row)}\"\n                                i18nKey=\"planOperativo_list_form_table_header\"\n                                additionalButtonsBean=\"#{planOperativoListBeanButtons}\"\n                                editForm=\"planOperativoEditForm\"\/><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoListBeanButtons.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este ser\u00e1 el archivo que se encargar\u00e1 de manejar los botones<\/li>\n\n\n\n<li>Este se crea en la ruta Proyecto-&gt;Web-&gt;view-&gt;buttons<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"494\" height=\"267\" src=\"\/wp-content\/uploads\/2023\/01\/Seleccion_060.png\" alt=\"\" class=\"wp-image-14038\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_060.png 494w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_060-300x162.png 300w\" sizes=\"(max-width: 494px) 100vw, 494px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este debe contener<\/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 *\/\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.view.buttons;\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createMethodExpression;\nimport static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createValueExpression;\nimport cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++        PRIMEFACES           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.primefaces.component.commandbutton.CommandButton;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             OTROS           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport com.sun.faces.taglib.jsf_core.SetPropertyActionListenerImpl;\nimport javax.annotation.PostConstruct;\nimport javax.el.MethodExpression;\nimport javax.el.ValueExpression;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++   Proyecto: PPI\/MCG         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************  DOCUMENTACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/**\n *\n * @author Greivin Barrantes S.\n * @version 0.0.1\n * Fecha_creaci\u00f3n: 29\/08\/2022\n * \n * Modificado por: Gustavo Matamoros Gonz\u00e1lez\n * Fecha_modificaci\u00f3n: 1\/01\/2023\n * Tarea: PPI-267\n *\/\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************  CONFIGURACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n@Component\n@Scope(\"request\")\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/****************    DEFINICI\u00d3N DE CLASE  *****************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\npublic class PlanOperativoListBeanButtons extends AdditionalButtons {\n\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N INIT    *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @PostConstruct\n    public void init() {\n\n\n\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n}\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/***************      FIN DEFINICI\u00d3N DE CLASE   ***********************\/\n\/**********************************************************************\/\n\/**********************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego se debe agregar la creaci\u00f3n del bot\u00f3n con sus propiedades<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n        \/**************************** BOT\u00d3N: DUPLICACI\u00d3N PLAN OPERATIVO **********************************\/\n        \/*************************************************************************************************\/\n        \n        \/\/ Creamos nuevo bot\u00f3n\n        CommandButton duplicarPlanOperativoButton = new CommandButton();\n\n        \/\/ Propiedades del bot\u00f3n\n        duplicarPlanOperativoButton.setId(\"duplicarPlanOperativoButton\");\n        duplicarPlanOperativoButton.setIcon(\"ui-icon-filter-none\");\n        duplicarPlanOperativoButton.setStyleClass(\"actions\");\n        duplicarPlanOperativoButton.setTitle(getI18n(\"plan_operativo_duplicarPlanOperativo_button\"));\n        duplicarPlanOperativoButton.setProcess(\"@this\");\n        duplicarPlanOperativoButton.setAjax(true);\n\n        \/\/ Establecer el objetivo y valor para listener del bot\u00f3n\n        \/\/ValueExpression entityValue = createValueExpression(\"#{row}\", PlanOperativo.class);\n        \/\/ValueExpression entityTarget = createValueExpression(\"#{planOperativoBean.entity}\", PlanOperativo.class);\n        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));\n\n        \/\/ Acci\u00f3n: click\n        duplicarPlanOperativoButton.setOnclick(\"PF('duplicarPlanOperativoButton').show()\");\n\n        \/\/ Funci\u00f3n para renderizar el bot\u00f3n\n\n        duplicarPlanOperativoButton.setValueExpression(\"rendered\", createValueExpression(\"#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}\", Boolean.class));\n\n        \/\/ Agregar el bot\u00f3n\n        this.additionalActionButtons.add(duplicarPlanOperativoButton);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>EXPLICACI\u00d3N:\n<ul class=\"wp-block-list\">\n<li>CommandButton duplicarPlanOperativoButton = new CommandButton(): crea un objeto tipo bot\u00f3n<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setIcon(\u00abui-icon-filter-none\u00bb): establece el icono<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setStyleClass(\u00abactions\u00bb): establece la clase del framework<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setTitle(getI18n(\u00abplan_operativo_duplicarPlanOperativo_button\u00bb)): texto del bot\u00f3n<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setProcess(\u00ab@this\u00bb);<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setAjax(true);<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Los iconos se pueden encontrar en <\/li>\n\n\n\n<li><a href=\"https:\/\/universidadnacional.atlassian.net\/wiki\/spaces\/CGI\/pages\/2384396295\/Migraci+n+de+SDKUNA+1.x+a+SDKUNA+2.x\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/universidadnacional.atlassian.net\/wiki\/spaces\/CGI\/pages\/2384396295\/Migraci+n+de+SDKUNA+1.x+a+SDKUNA+2.x<\/a><\/li>\n\n\n\n<li>Ahora agregamos el texto de internacionalizaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<p>plan_operativo_duplicarPlanOperativo_button: \u00abduplicar plan operativo\u00bb<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La Relaci\u00f3n del objetivo y su valor con las siguientes lineas<\/li>\n\n\n\n<li>Nota: como ya existe un bot\u00f3n anterior las lineas de entityValue y entityTarget no se utilizan solo la relaci\u00f3n con el bot\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Establecer el objetivo y valor para listener del bot\u00f3n\n        ValueExpression entityValue = createValueExpression(\"#{row}\", PlanOperativo.class);\n        ValueExpression entityTarget = createValueExpression(\"#{planOperativoBean.entity}\", PlanOperativo.class);\n        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora toca agregar el bot\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Agregar el bot\u00f3n\nthis.additionalActionButtons.add(duplicarPlanOperativoButton);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora si compilamos el bot\u00f3n ya debe aparecer<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"875\" height=\"308\" src=\"\/wp-content\/uploads\/2023\/01\/Seleccion_062.png\" alt=\"\" class=\"wp-image-14049\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_062.png 875w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_062-300x106.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/01\/Seleccion_062-768x270.png 768w\" sizes=\"(max-width: 875px) 100vw, 875px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora el siguiente paso es crear una ventana modal que nos muestre el \u00abaceptar\u00bb y cancelar<\/li>\n\n\n\n<li>Para esto en el listForm agregamos<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">planOperativoListForm.xhtml (Ventana modal)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed debemos agregar el componente de la ventana modal<\/li>\n\n\n\n<li>CORREGIR<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n            &lt;!--++++++++++++++++++++++++++     MODAL: DUPLICAR PLAN OPERATIVO      +++++++++++++++++++++++++-->\n            &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> \n            &lt;p:confirmDialog    id=\"confirmDialog_duplicarPlanOperativo\" \n                                message=\"#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}\" \n                                header=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}\" \n                                severity=\"alert\" \n                                widgetVar=\"duplicarPlanOperativoButton\" \n                                appendTo=\"@(body)\"\n                                appendToBody=\"true\">  \n\n            &lt;p:commandButton    id=\"confirm_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}\"                              \n                                oncomplete=\"PF('duplicarPlanOperativoButton').hide()\"\n                                actionListener=\"#{planOperativoBean.duplicarPlanOperativoDesdeButton()}\" \n                                update=\":formMantenimiento\"\n                                process=\"@this\">             \n            &lt;\/p:commandButton>\n\n            &lt;p:commandButton    id=\"decline_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}\" \n                                onclick=\"PF('duplicarPlanOperativoButton').hide()\" \n                                type=\"button\"\/>   \n\n            &lt;\/p:confirmDialog> <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>EXPLICACI\u00d3N:\n<ul class=\"wp-block-list\">\n<li>CommandButton duplicarPlanOperativoButton = new CommandButton(): crea un objeto tipo bot\u00f3n<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setIcon(\u00abui-icon-filter-none\u00bb): establece el icono<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setStyleClass(\u00abactions\u00bb): establece la clase del framework<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setTitle(getI18n(\u00abplan_operativo_duplicarPlanOperativo_button\u00bb)): texto del bot\u00f3n<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setProcess(\u00ab@this\u00bb);<\/li>\n\n\n\n<li>duplicarPlanOperativoButton.setAjax(true);<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoListBeanButtons.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos agregar la acci\u00f3n del click del bot\u00f3n, para nuestro caso es abrir una ventana modal<\/li>\n\n\n\n<li>Para esto agregamos antes de agregar el bot\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Acci\u00f3n: click sobre el bot\u00f3n\n        duplicarPlanOperativoButton.setOnclick(\"PF('duplicarPlanOperativoButton').show()\")<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quedando as\u00ed:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n        \/**************************** BOT\u00d3N: DUPLICACI\u00d3N PLAN OPERATIVO **********************************\/\n        \/*************************************************************************************************\/\n        \n        \/\/ Creamos nuevo bot\u00f3n\n        CommandButton duplicarPlanOperativoButton = new CommandButton();\n\n        \/\/ Propiedades del bot\u00f3n\n        duplicarPlanOperativoButton.setId(\"duplicarPlanOperativoButton\");\n        duplicarPlanOperativoButton.setIcon(\"ui-icon-filter-none\");\n        duplicarPlanOperativoButton.setStyleClass(\"actions\");\n        duplicarPlanOperativoButton.setTitle(getI18n(\"plan_operativo_duplicarPlanOperativo_button\"));\n        duplicarPlanOperativoButton.setProcess(\"@this\");\n        duplicarPlanOperativoButton.setAjax(true);\n\n        \/\/ Establecer el objetivo y valor para listener del bot\u00f3n\n        \/\/ValueExpression entityValue = createValueExpression(\"#{row}\", PlanOperativo.class);\n        \/\/ValueExpression entityTarget = createValueExpression(\"#{planOperativoBean.entity}\", PlanOperativo.class);\n        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));\n\n        \/\/ Acci\u00f3n: click sobre el bot\u00f3n\n        duplicarPlanOperativoButton.setOnclick(\"PF('duplicarPlanOperativoButton').show()\");\n\n        \/\/ Funci\u00f3n para renderizar el bot\u00f3n\n\n        duplicarPlanOperativoButton.setValueExpression(\"rendered\", createValueExpression(\"#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}\", Boolean.class));\n\n        \/\/ Agregar el bot\u00f3n\n        this.additionalActionButtons.add(duplicarPlanOperativoButton);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funci\u00f3n para validar el renderizado del bot\u00f3n<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora para poder establecer cuando debe aparecer el bot\u00f3n vamos a utilizar la siguiente instrucci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Funci\u00f3n para renderizar el bot\u00f3n\n        duplicarPlanOperativoButton.setValueExpression(\"rendered\", createValueExpression(\"#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}\", Boolean.class));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esta instrucci\u00f3n indica va estar definida en el Bean del plan Operativo ya que cualquier interfaz se comunica a traves de Bean&#8217;s y esta funci\u00f3n entonces llama a un servicio definido.<\/li>\n\n\n\n<li>Por tanto el Bean de gesti\u00f3n del bot\u00f3n queda finalmente as\u00ed<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoListForm.xhtml (final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--\nCopyright (c) 2022.\nCentro de Gestion Informatica\nDireccion de Tecnologias de la Informacion y Comunicacion\nUniversidad Nacional - Costa Rica\nhttp:&#47;&#47;www.una.ac.cr\n-->\n\n&lt;!--********************************************************************************************-->\n&lt;!--********************************************************************************************-->\n&lt;!--*****************************   COMPOSICI\u00d3N   **********************************************-->\n&lt;!--********************************************************************************************-->\n&lt;!--********************************************************************************************-->\n&lt;ui:composition template=\"\/templates\/crud.xhtml\"\n                xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"  \n                xmlns:p=\"http:\/\/primefaces.org\/ui\"\n                xmlns:f=\"http:\/\/java.sun.com\/jsf\/core\"\n                xmlns:ui=\"http:\/\/java.sun.com\/jsf\/facelets\"\n                xmlns:components=\"http:\/\/java.sun.com\/jsf\/composite\/components\">\n\n    &lt;!--********************************************************************************************-->\n    &lt;!--*****************************      PRERENDER     *******************************************-->\n    &lt;!--********************************************************************************************-->\n    &lt;ui:define name=\"preRender\">\n        &lt;f:event type=\"preRenderView\" listener=\"#{planOperativoBean.list()}\"\/>\n    &lt;\/ui:define>\n    &lt;!--********************************************************************************************-->\n    &lt;!--********************************************************************************************-->\n    &lt;!--********************************************************************************************-->\n\n\n    &lt;!--********************************************************************************************-->\n    &lt;!--*****************************       TITLE        *******************************************-->\n    &lt;!--********************************************************************************************-->\n    &lt;ui:define name=\"title\">#{i18n.planOperativo_list_form_title}&lt;\/ui:define>\n    &lt;!--********************************************************************************************-->\n    &lt;!--********************************************************************************************-->\n    &lt;!--********************************************************************************************-->\n\n\n    &lt;!--********************************************************************************************-->\n    &lt;!--*****************************       DEFINE       *******************************************-->\n    &lt;!--********************************************************************************************-->\n    &lt;ui:define name=\"contentCRUD\">\n\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;components:toolbar id=\"toolbar\"\n                            editMode=\"false\"\n                            bean=\"#{planOperativoBean}\"\n                            showNewButton=\"#{false}\"\n                            listForm=\"planOperativoListForm\"\n                            editForm=\"planOperativoEditForm\"\n                            backForm=\"planOperativoListForm\"\n                            container=\"noEditTable:dataTable\"\/>\n\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> \n        &lt;components:noEditTable id=\"noEditTable\"\n                                header=\"#{i18n.planOperativo_list_form_table_header}\"\n                                bean=\"#{planOperativoBean}\"\n                                showEditButton=\"#{!planOperativoBean.deshabilitarEdicion(row)}\"\n                                i18nKey=\"planOperativo_list_form_table_header\"\n                                additionalButtonsBean=\"#{planOperativoListBeanButtons}\"\n                                editForm=\"planOperativoEditForm\"\/>\n        \n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++     MODAL: APROBAR FLUJO       ++++++++++++++++++++++++++++++++++-->\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> \n        &lt;p:confirmDialog id=\"confirmDialogAprobarFlujo\" \n                         message=\"#{i18n.plan_operativo_aprobar_flujo_confirm_message}\"  \n                             header=\"#{i18n.plan_operativo_aprobar_flujo_confirm_header}\" \n                             severity=\"alert\" \n                             widgetVar=\"aprobarFlujoButton\" \n                             appendTo=\"@(body)\">  \n\n                &lt;p:commandButton id=\"confirmAprobarFlujo\" \n                                 disabled=\"#{false}\"\n                                 value=\"#{i18n.plan_operativo_aprobar_flujo_confirm_accept_button_label}\"                              \n                                 oncomplete=\"PF('aprobarFlujoButton').hide()\"\n                                 actionListener=\"#{planOperativoBean.aprobarFlujoDesdeButton()}\" \n                                 update=\":formMantenimiento\"\n                                 process=\"@this\">             \n                &lt;\/p:commandButton>\n\n                &lt;p:commandButton id=\"declineAprobarFlujo\" \n                                 disabled=\"#{false}\"\n                                 value=\"#{i18n.plan_operativo_aprobar_flujo_cancel_button_label}\" \n                                 onclick=\"PF('aprobarFlujoButton').hide()\" \n                                 type=\"button\" \/>   \n\n            &lt;\/p:confirmDialog> \n            \n            &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->\n            &lt;!--++++++++++++++++++++++++++     MODAL: DUPLICAR PLAN OPERATIVO      +++++++++++++++++++++++++-->\n            &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> \n            &lt;p:confirmDialog    id=\"confirmDialog_duplicarPlanOperativo\" \n                                message=\"#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}\" \n                                header=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}\" \n                                severity=\"alert\" \n                                widgetVar=\"duplicarPlanOperativoButton\" \n                                appendTo=\"@(body)\"\n                                appendToBody=\"true\">  \n\n            &lt;p:commandButton    id=\"confirm_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}\"                              \n                                oncomplete=\"PF('duplicarPlanOperativoButton').hide()\"\n                                actionListener=\"#{planOperativoBean.duplicarPlanOperativoDesdeButton()}\" \n                                update=\":formMantenimiento\"\n                                process=\"@this\">             \n            &lt;\/p:commandButton>\n\n            &lt;p:commandButton    id=\"decline_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}\" \n                                onclick=\"PF('duplicarPlanOperativoButton').hide()\" \n                                type=\"button\"\/>   \n\n            &lt;\/p:confirmDialog> \n\n\n    &lt;\/ui:define>\n    &lt;!--********************************************************************************************-->\n    &lt;!--*****************************   FIN DEFINE     *********************************************-->\n    &lt;!--********************************************************************************************-->\n\n&lt;\/ui:composition>\n&lt;!--********************************************************************************************-->\n&lt;!--********************************************************************************************-->\n&lt;!--**************************     FIN COMPOSICI\u00d3N   *******************************************-->\n&lt;!--********************************************************************************************-->\n&lt;!--********************************************************************************************--><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoListBeanButtons.java (Final)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Archivo Final:<\/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 *\/\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.view.buttons;\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createMethodExpression;\nimport static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createValueExpression;\nimport cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++        PRIMEFACES           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.primefaces.component.commandbutton.CommandButton;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             OTROS           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport com.sun.faces.taglib.jsf_core.SetPropertyActionListenerImpl;\nimport javax.annotation.PostConstruct;\nimport javax.el.MethodExpression;\nimport javax.el.ValueExpression;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++   Proyecto: PPI\/MCG         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************  DOCUMENTACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/**\n *\n * @author Greivin Barrantes S.\n * @version 0.0.1\n * Fecha_creaci\u00f3n: 29\/08\/2022\n * \n * Modificado por: Gustavo Matamoros Gonz\u00e1lez\n * Fecha_modificaci\u00f3n: 1\/01\/2023\n * Tarea: PPI-267\n *\/\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************  CONFIGURACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n@Component\n@Scope(\"request\")\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/****************    DEFINICI\u00d3N DE CLASE  *****************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\npublic class PlanOperativoListBeanButtons extends AdditionalButtons {\n\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N INIT    *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @PostConstruct\n    public void init() {\n\n        \/*************************************************************************************************\/\n        \/**************************** BOT\u00d3N: APROBACI\u00d3N PLAN OPERATIVO ***********************************\/\n        \/*************************************************************************************************\/\n\n        \/\/ BOTON PARA APROBAR UN FLUJO DEL PLAN OPERATIVO DESDE EL LISTFORM\n        CommandButton aprobarFlujoButton = new CommandButton();\n        aprobarFlujoButton.setId(\"aprobarFlujoButton\");\n        aprobarFlujoButton.setIcon(\"ui-icon-done\");\n        aprobarFlujoButton.setStyleClass(\"actions\");\n        aprobarFlujoButton.setTitle(getI18n(\"plan_operativo_aprobar_flujo_button\"));\n        aprobarFlujoButton.setProcess(\"@this\");\n        aprobarFlujoButton.setAjax(true);\n        \n        ValueExpression entityValue = createValueExpression(\"#{row}\", PlanOperativo.class);\n        ValueExpression entityTarget = createValueExpression(\"#{planOperativoBean.entity}\", PlanOperativo.class);\n        aprobarFlujoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));\n\n\n        aprobarFlujoButton.setValueExpression(\"rendered\", createValueExpression(\"#{planOperativoBean.renderButtonAprobarFlujo(row)}\", Boolean.class));\n        aprobarFlujoButton.setOnclick(\"PF('aprobarFlujoButton').show()\");\n\/\/        MethodExpression targetExpressionEdit = createMethodExpression(\"#{planOperativoBean.aprobarFlujoDesdeButton()}\", null, String.class);\n\/\/        aprobarFlujoButton.setActionExpression(targetExpressionEdit);\n\n        this.additionalActionButtons.add(aprobarFlujoButton);\n\n        \/*************************************************************************************************\/\n        \/**************************** BOT\u00d3N: DUPLICACI\u00d3N PLAN OPERATIVO **********************************\/\n        \/*************************************************************************************************\/\n        \n        \/\/ Creamos nuevo bot\u00f3n\n        CommandButton duplicarPlanOperativoButton = new CommandButton();\n\n        \/\/ Propiedades del bot\u00f3n\n        duplicarPlanOperativoButton.setId(\"duplicarPlanOperativoButton\");\n        duplicarPlanOperativoButton.setIcon(\"ui-icon-filter-none\");\n        duplicarPlanOperativoButton.setStyleClass(\"actions\");\n        duplicarPlanOperativoButton.setTitle(getI18n(\"plan_operativo_duplicarPlanOperativo_button\"));\n        duplicarPlanOperativoButton.setProcess(\"@this\");\n        duplicarPlanOperativoButton.setAjax(true);\n\n        \/\/ Establecer el objetivo y valor para listener del bot\u00f3n\n        \/\/ValueExpression entityValue = createValueExpression(\"#{row}\", PlanOperativo.class);\n        \/\/ValueExpression entityTarget = createValueExpression(\"#{planOperativoBean.entity}\", PlanOperativo.class);\n        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));\n\n        \/\/ Acci\u00f3n: click sobre el bot\u00f3n\n        duplicarPlanOperativoButton.setOnclick(\"PF('duplicarPlanOperativoButton').show()\");\n\n        \/\/ Funci\u00f3n para renderizar el bot\u00f3n\n        duplicarPlanOperativoButton.setValueExpression(\"rendered\", createValueExpression(\"#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}\", Boolean.class));\n\n        \/\/ Agregar el bot\u00f3n\n        this.additionalActionButtons.add(duplicarPlanOperativoButton);\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n}\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/***************      FIN DEFINICI\u00d3N DE CLASE   ***********************\/\n\/**********************************************************************\/\n\/**********************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a ir al bean principal PlanOperativoBean.java<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoBean.java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Funcion: renderizado del bot\u00f3n<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos una funci\u00f3n que va invocar un servicio que va a verificar todas las condiciones para la aparici\u00f3n del bot\u00f3n.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que valida cuando el bot\u00f3n de duplicaci\u00f3n de Plan Operativo debe aparecer y permite relizar la duplicaci\u00f3n\n     *\n     * @param planOperativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * Fecha_Creaci\u00f3n:  12\/01\/2023\n     * Tarea: PPI-267\n     * @return True si se cumplen todas las condiciones\n     *\/\n    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo){\n        return service.renderButtonDuplicarPlanOperativo(planOperativo);\n    }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear la funci\u00f3n que se va a ejecutar cuando se de clic en el bot\u00f3n de aceptar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Funci\u00f3n de duplicarPlanOperativoDesdeButton<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Funci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que manda a duplicar un plan operativo desde el bot\u00f3n de duplicaci\u00f3n de Plan Operativo\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * Fecha_Creaci\u00f3n:  17\/01\/2023\n     * Tarea: PPI-267\n     *\/\n    public void duplicarPlanOperativoDesdeButton() {\n        service.duplicarPlanOperativoDesdeButton(this.getEntity());\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esta funci\u00f3n es llamada con la siguiente instrucci\u00f3n dentro de planOperativoListForm.xhtml<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>actionListener=\"#{planOperativoBean.duplicarPlanOperativoDesdeButton()}\" <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esto desde la ventana modal<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:confirmDialog    id=\"confirmDialog_duplicarPlanOperativo\" \n                                message=\"#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}\" \n                                header=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}\" \n                                severity=\"alert\" \n                                widgetVar=\"duplicarPlanOperativoButton\" \n                                appendTo=\"@(body)\"\n                                appendToBody=\"true\">  \n\n            &lt;p:commandButton    id=\"confirm_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}\"                              \n                                oncomplete=\"PF('duplicarPlanOperativoButton').hide()\"\n                                actionListener=\"#{planOperativoBean.duplicarPlanOperativoDesdeButton()}\" \n                                update=\":formMantenimiento\"\n                                process=\"@this\">             \n            &lt;\/p:commandButton>\n\n            &lt;p:commandButton    id=\"decline_duplicarPlanOperativo\" \n                                disabled=\"#{false}\"\n                                value=\"#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}\" \n                                onclick=\"PF('duplicarPlanOperativoButton').hide()\" \n                                type=\"button\"\/>   \n\n            &lt;\/p:confirmDialog> <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por tanto al Bean queda de la siguiente forma<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoBean.java (Funciones finales)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que valida cuando el bot\u00f3n de duplicaci\u00f3n de Plan Operativo debe aparecer y permite relizar la duplicaci\u00f3n\n     *\n     * @param planOperativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * Fecha_Creaci\u00f3n:  12\/01\/2023\n     * Tarea: PPI-267\n     * @return True si se cumplen todas las condiciones\n     *\/\n    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo){\n        return service.renderButtonDuplicarPlanOperativo(planOperativo);\n    }\n\n    \/**\n     * Metodo que manda a duplicar un plan operativo desde el bot\u00f3n de duplicaci\u00f3n de Plan Operativo\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * Fecha_Creaci\u00f3n:  17\/01\/2023\n     * Tarea: PPI-267\n     *\/\n    public void duplicarPlanOperativoDesdeButton() {\n        service.duplicarPlanOperativoDesdeButton(this.getEntity());\n    }<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoServiceImpl.java (Final)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora dentro del Service creamos las siguientes funciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * \n     * M\u00e9todo que muestra el bot\u00f3n de \"Duplicar Plan Operativo\" seg\u00fan las siguientes validaciones:\n     * \n     * 01. El usuario no puede tener el rol de UNA_PPI_PPO_CONSULTA_TOTAL\n     * 02. El plan Operativo debe estar Activo\n     * 03\u00b7 El Periodo Anual del Plan Operativo debe ser igual al Periodo Actual en Ejecuci\u00f3n\n     * 04. Existe una etapa de Modificaci\u00f3n\n     * 05. Existen Plan Operativos Duplicados\n     * 06. Existen Etapas de Planificaci\u00f3n con Excepciones\n     *\n     * @param planOperativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 12\/01\/2023\n     * @issue: PPI-267\n     * @return true (Pintar bot\u00f3n) \/ false (No pintar bot\u00f3n)\n     *\/\n    @Override\n    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo) {\n\n        \/****************************************************************************\/\n        \/\/ VALIDACI\u00d3N-01: El usuario NO Rol de Consulta \"param_ppi_ppo_rol_consulta\"\n        \/****************************************************************************\/\n\n        \/\/ Obtenemos los datos del usuario actual \n        Usuario usuarioActual = usuarioService.getUsuarioActual();\n\n        \/\/ Obtenemos el ID del Rol PPI_PPO_CONSULTA de Paramteros SIGESA \"param_ppi_ppo_rol_consulta\"\n        Rol rol_PPI_PPO_CONSULTA = rolService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_ppo_rol_consulta\").getValor()));\n\n        \/\/ Obtenemos todos los usuarios que tengan el rol de consulta\n        List&lt;Usuario> usuariosRolConsulta = rolUsuarioService.getByRolActivo(rol_PPI_PPO_CONSULTA);\n\n        \/\/ Si el usuario contiene el rol de consulta no muestre bot\u00f3n\n        if (!usuariosRolConsulta.contains(usuarioActual)) {\n\n\n            \n            \/****************************************************************************\/\n            \/\/ VALIDACI\u00d3N-02: El Plan Operativo debe estar Activo\n            \/****************************************************************************\/\n\n            \/\/ Si el Plan Operativo esta Activo\n            if (planOperativo.getActivo() ) {\n\n\n\n                \/****************************************************************************\/\n                \/\/ VALIDACI\u00d3N-03: El periodo anual debe ser el de Ejecuci\u00f3n   \n                \/****************************************************************************\/\n                \n                \/\/ Obtenemos el Periodo Anual en Ejecuci\u00f3n\n                PeriodoAnual periodoActual = periodoAnualService.findAnoEjecucion();\n\n                \/\/ Verificamos si el Periodo Anual en ejecuci\u00f3n == planOperativo.periodoAnual\n                if(planOperativo.getPeriodoAnual().equals(periodoActual)){\n                    \n                    \/****************************************************************************\/\n                    \/\/ VALIDACI\u00d3N-04: Existe una etapa de Modificaci\u00f3n\n                    \/****************************************************************************\/\n\n                    \/\/ Obtenemos el Tipo de Etapa Modificaci\u00f3n\n                    TipoEtapa tipoEtapaModificacion = tipoEtapaService.obtenerTipoEtapaModificacion();\n\n                    \/\/ Obtenemos la Etapa Plan de modificaci\u00f3n seg\u00fan:\n                    \/\/ TipoEtapa:  Modificaci\u00f3n\n                    \/\/ TipoPlan: planOperativo.getTipoPlan()\n                    \/\/ TipoPlanOperativo: planOperativo.getTipoPlanOperativo()\n                    \/\/ PeriodoAnual: planOperativo.getPeriodoAnual()\n                    EtapaPlan etapaPlan =  etapaPlanService.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapaModificacion, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(), planOperativo.getPeriodoAnual());\n                    \n\n                    \/\/ Si la etapa de Plan de Modificaci\u00f3n existe\n                    if(etapaPlan != null){\n\n                        \/****************************************************************************\/\n                        \/\/ VALIDACI\u00d3N-05: Existen Plan Operativos Duplicados\n                        \/****************************************************************************\/\n\n                        \/\/ Preguntamos si existen planes Operativos Duplicados\n                        \/\/ True: Pinte el bot\u00f3n\n                        \/\/ False: No pinte el bot\u00f3n\n                        return existePlanOperativoDuplicado (tipoEtapaModificacion, planOperativo, etapaPlan );\n\n                    }else{\n\n\n                        \/****************************************************************************\/\n                        \/\/ VALIDACI\u00d3N-06: Existen Etapas de Planificaci\u00f3n con Excepciones\n                        \/****************************************************************************\/\n\n                        \/\/ Preguntamos si existe una Excepci\u00f3n para el Plan Operativo con Etapa de Modificaci\u00f3n\n                        ExcepcionPlanificacion excepcionPlanificacion = findByTipoEtapaAndPlanOperativo(tipoEtapaModificacion, planOperativo);\n\n                        \/\/ Si existe una excepci\u00f3n \n                        if(excepcionPlanificacion != null){\n                            \n\n                            \/****************************************************************************\/\n                            \/\/ VALIDACI\u00d3N-05: Existen Plan Operativos Duplicados\n                            \/****************************************************************************\/\n                            \/\/ Preguntamos si existen planes Operativos Duplicados\n                            \/\/ True: Pinte el bot\u00f3n\n                            \/\/ False: No pinte el bot\u00f3n\n                            return existePlanOperativoDuplicado (tipoEtapaModificacion, planOperativo, excepcionPlanificacion.getEtapaPlan());\n                            \n                        }\n\n                    }\n\n                }\n\n            }\n\n        }\n\n        \n        \/\/ *************************************************   \n        \/\/ Si una condici\u00f3n no se cumple no pinte el bot\u00f3n\n        \/\/ *************************************************\n        return false;\n\n    }\n\n    \n    \/**\n     * \n     * M\u00e9todo que retorna una excepci\u00f3n de Planificaci\u00f3n Si existe para un Tipo de Etapa Y Plan Operativo\n     * \n     * @param tipoEtapa: Tipo de Etapa\n     * @param planOperativo: Plan Operativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return ExcepcionPlanificacion\n     *\/\n\n    @Override\n    public ExcepcionPlanificacion findByTipoEtapaAndPlanOperativo(TipoEtapa tipoEtapa, PlanOperativo planOperativo){\n        \n        \/\/ Obtenemos la Fecha Actual\n        Date fechaActual = new Date();\n\n        \/\/ Obtenemos la lista de excepciones para una unidad Ejecutora para la fecha de hoy\n        List&lt;ExcepcionPlanificacion> listaExcepciones = excepcionPlanificacionService.findByUnidadEjecutoraAndFechaHoyBetween(planOperativo.getUnidadEjecutora(), fechaActual);\n\n        \/\/ Si la lista no esta vacia\n        if (!listaExcepciones.isEmpty()) {\n\n            \/\/ Recorremos la lista\n            for (ExcepcionPlanificacion excepcion : listaExcepciones) {\n\n                \/\/ Si el tipo de etapa de la excepci\u00f3n ==  (modificacion)\n                if (excepcion.getEtapaPlan().getTipoEtapa().equals(tipoEtapa)){\n\n                    \/\/ Si el tipo de plan == tipo de Plan del plan operativo\n                    if(excepcion.getEtapaPlan().getTipoPlan().equals(planOperativo.getTipoPlan())){\n\n                        \/\/ Si el periodo anual del plan == periodo anual del plan\n                        if(excepcion.getEtapaPlan().getPeriodoAnual().equals(planOperativo.getPeriodoAnual())){\n\n                            \/\/ Retorne la excepci\u00f3n\n                            return excepcion;\n                        }\n                    }\n                }\n               \n            }\n        }\n        \/\/ No existen excepciones\n        return null;\n\n    }\n    \n\n\n    \/**\n     * \n     * M\u00e9todo que verifica si existe ya un Plan Operativo seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param planOperativo\n     * @param etapaPlan\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return true (Existe un duplicado) \/ false (No existe duplicado)\n     *\/\n\n    @Override\n    public boolean existePlanOperativoDuplicado (TipoEtapa tipoEtapa, PlanOperativo planOperativo, EtapaPlan etapaPlan ){\n\n        \n        \/\/ Obtener Lista de Planes Operativos Duplicados seg\u00fan el Tipo de Etapa (Modificaci\u00f3n) y Etapa Plan (Modificaci\u00f3n) \n        List &lt;PlanOperativo> listaPlanOperativoDuplicados = this.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(tipoEtapa, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(),planOperativo.getPeriodoAnual(),etapaPlan, planOperativo.getUnidadEjecutora());\n\n        \/\/ Si la lista no esta vacia\n        if (!listaPlanOperativoDuplicados.isEmpty()) {\n\n            \/\/ Recorremos la lista \n            for (PlanOperativo planOperativoDuplicado : listaPlanOperativoDuplicados) {\n\n               \n                \/\/ Si el plan Operativo Duplicado su Estado de Fomulaci\u00f3n es diferente de \"Anulado\"\n                if(!planOperativoDuplicado.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoAnulado()) ){\n\n\n                    \/\/ Return false\n                    return false;\n                }\n            }\n        }\n\n        \/\/ Si la lista esta vacia (NO existe dupicados)\n        return true;\n    }\n\n    \/**\n     * \n     * M\u00e9todo que retorna una lista de Planes Operativos seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param tipoPlan\n     * @param tipoPlanOperativo\n     * @param periodoAnual\n     * @param etapaPlan\n     * @param unidadEjecutora\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return List&lt;PlanOperativo>\n     *\/\n    @Override\n    public List &lt;PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora) {\n\n        \/\/ Llamamos al repository\n        return repository.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(tipoEtapa, tipoPlan, tipoPlanOperativo, periodoAnual, etapaPlan, unidadEjecutora);\n    }\n\n\n    \/**\n     * \n     * M\u00e9todo que retorna una lista de Planes Operativos seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param tipoPlan\n     * @param tipoPlanOperativo\n     * @param periodoAnual\n     * @param etapaPlan\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return true (Existe un duplicado) \/ false (No existe duplicado)\n     *\/\n    public void duplicarPlanOperativoDesdeButton(PlanOperativo planOperativo) {\n\n\n        \n        \/\/ Obtenemos el Tipo de Etapa Modificaci\u00f3n\n        TipoEtapa tipoEtapaModificacion = tipoEtapaService.obtenerTipoEtapaModificacion();\n\n        \/\/ Obtenemos la Etapa Plan de modificaci\u00f3n seg\u00fan:\n        \/\/ TipoEtapa:  Modificaci\u00f3n\n        \/\/ TipoPlan: planOperativo.getTipoPlan()\n        \/\/ TipoPlanOperativo: planOperativo.getTipoPlanOperativo()\n        \/\/ PeriodoAnual: planOperativo.getPeriodoAnual()\n        EtapaPlan etapaPlan =  etapaPlanService.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapaModificacion, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(), planOperativo.getPeriodoAnual());\n\n        \/\/ Si Etapa Plan == null es porque las fechas de la etapa pasar\u00f3n y se debe obtener por excepci\u00f3n\n        if(etapaPlan == null){\n            \n            \/\/ Preguntamos si existe una Excepci\u00f3n para el Plan Operativo con Etapa de Modificaci\u00f3n\n            ExcepcionPlanificacion excepcionPlanificacion = findByTipoEtapaAndPlanOperativo(tipoEtapaModificacion, planOperativo);\n\n            \/\/ Si existe una excepci\u00f3n \n            if(excepcionPlanificacion != null){\n\n                \/\/ Obtenga la etapa Plan de la excepci\u00f3n\n                etapaPlan = excepcionPlanificacion.getEtapaPlan();\n            }\n        }\n\n        \/\/ mandamos a duplicar el plans\n        duplicaPlanOpertativo(planOperativo, etapaPlan);\n    }\n\n\n    \/**\n     * \n     * M\u00e9todo que duplica un Plan Operativo:\n     * \n     * @param planOperativo Plan operativo a Duplicar\n     * @param etapaPlan  Etapa del Plan    \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return \n     *\/\n    public void duplicaPlanOpertativo(PlanOperativo planOperativo, EtapaPlan etapaPlan) {\n\n        \/\/ Obtenemos el estado de borrador\n        EstadoFormulacionOpe estadoBorrador = estadoFormulacionOpeService.obtenerEstadoBorrador();\n\n        \/\/ Obtenemos el Periodo Anual en Ejecuci\u00f3n\n        PeriodoAnual periodoAnualEjecucion = periodoAnualService.findAnoEjecucion();\n\n        \/\/ Creamos un nuevo Plan operativo Temporal\n        PlanOperativo planOperativoTMP = new PlanOperativo();\n\n        \/\/ Cargamos en el nuevo Plan Operativo los valores del Plan Operativo a Duplicar\n        planOperativoTMP.setCodigo(this.obtenerSiguienteConsecutivo(periodoAnualEjecucion));\n        planOperativoTMP.setUnidadEjecutora(planOperativo.getUnidadEjecutora());\n        planOperativoTMP.setPeriodoAnual(planOperativo.getPeriodoAnual());\n        planOperativoTMP.setTipoPlanOperativo(planOperativo.getTipoPlanOperativo());\n        planOperativoTMP.setTipoPlan(planOperativo.getTipoPlan());\n        planOperativoTMP.setEtapaPlan(etapaPlan);\n        planOperativoTMP.setTipoEtapa(etapaPlan.getTipoEtapa());\n        planOperativoTMP.setFechaAprobacion(null);\n        planOperativoTMP.setPresupuestoFormulado(planOperativo.getPresupuestoFormulado());\n        planOperativoTMP.setActivo(false);\n        planOperativoTMP.setEstadoFormulacionOpe(estadoBorrador);\n\n     \n\n        \/\/ Mandamos a guardar el Plan Operativo Temporal\n        PlanOperativo planOperativoNuevo = this.saveWithoutStartingFlow(planOperativoTMP);\n\n        \/\/ Mandamos a iniciar el flujo de este Nuevo Plan Operativo Borrador\n        this.iniciarFlujo(planOperativoNuevo);\n\n        \/\/ Mandamos a Guardar los objetivos POA\n        guardarObjetivosPoa(planOperativo.getListaObjetivosPOA(), planOperativoNuevo);\n\n        \/\/ Obtenemos la Lista de Objetivos POA\n        List&lt;ObjetivoPOA> listaObjetivosActualizados = objetivoPOAService.findObjetivoPoaByPlanOperativo(planOperativoNuevo);\n\n\n        \/\/ Proceso de recorrer los Objetivos para guardar las metas POA\n        for (ObjetivoPOA objetivo : planOperativo.getListaObjetivosPOA()) {\n\n            for (ObjetivoPOA objetivoNuevo : listaObjetivosActualizados) {\n\n                if (objetivo.getCodigo().equals(objetivoNuevo.getCodigo())) {\n\n                    guardarMetasPoa(objetivo.getListaMetasPoa(), objetivoNuevo);\n\n                }\n            }\n        }\n\n        \n\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoService.java (Final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * \n     * Definici\u00f3n que muestra el bot\u00f3n de \"Duplicar Plan Operativo\" seg\u00fan las siguientes validaciones:\n     * \n     * 01. El usuario no puede tener el rol de UNA_PPI_PPO_CONSULTA_TOTAL\n     * 02. El plan Operativo debe estar Activo\n     * 03\u00b7 El Periodo Anual del Plan Operativo debe ser igual al Periodo Actual en Ejecuci\u00f3n\n     * 04. Existe una etapa de Modificaci\u00f3n\n     * 05. Existen Plan Operativos Duplicados\n     * 06. Existen Etapas de Planificaci\u00f3n con Excepciones\n     *\n     * @param planOperativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 12\/01\/2023\n     * @issue: PPI-267\n     * @return true (Pintar bot\u00f3n) \/ false (No pintar bot\u00f3n)\n     *\/\n    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo);\n\n    \/**\n     * \n     * M\u00e9todo que retorna una excepci\u00f3n de Planificaci\u00f3n Si existe para un Tipo de Etapa Y Plan Operativo\n     * \n     * @param tipoEtapa: Tipo de Etapa\n     * @param planOperativo: Plan Operativo\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return ExcepcionPlanificacion\n     *\/\n    public ExcepcionPlanificacion findByTipoEtapaAndPlanOperativo(TipoEtapa tipoEtapa, PlanOperativo planOperativo);\n\n\n    \/**\n     * \n     * M\u00e9todo que verifica si existe ya un Plan Operativo seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param planOperativo\n     * @param etapaPlan\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return true (Existe un duplicado) \/ false (No existe duplicado)\n     *\/\n    public boolean existePlanOperativoDuplicado (TipoEtapa tipoEtapa, PlanOperativo planOperativo, EtapaPlan etapaPlan );\n\n\n    \/**\n     * \n     * M\u00e9todo que retorna una lista de Planes Operativos seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param tipoPlan\n     * @param tipoPlanOperativo\n     * @param periodoAnual\n     * @param etapaPlan\n     * @param unidadEjecutora\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return List&lt;PlanOperativo>\n     *\/\n    public List &lt;PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora);\n\n\n\n\n\n\n\n    \/**\n     * \n     * M\u00e9todo que retorna una lista de Planes Operativos seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param tipoPlan\n     * @param tipoPlanOperativo\n     * @param periodoAnual\n     * @param etapaPlan\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return true (Existe un duplicado) \/ false (No existe duplicado)\n     *\/\n    public void duplicarPlanOperativoDesdeButton(PlanOperativo planOperativo);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">PlanOperativoRepository.java (final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * \n     * Defnici\u00f3n que retorna una lista de Planes Operativos seg\u00fan:\n     * \n     * @param tipoEtapa\n     * @param tipoPlan\n     * @param tipoPlanOperativo\n     * @param periodoAnual\n     * @param etapaPlan\n     * @param unidadEjecutora\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 17\/01\/2023\n     * @issue: PPI-267\n     * @return List&lt;PlanOperativo>\n     *\/\n    public List&lt;PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora (TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ademas se tuvo que trabajar en uns funciones de Etpa Plan<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">EtapaPlanRepository.java (final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que obtiene una Etapa Plan de acuerdo a:\n     * Tipo de Etapa\n     * Tipo Plan\n     * Tipo Plan Operativo\n     * Periodo Anual\n     * Fecha Actual este entre Fecha_Inicial y Fecha_Final\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @param tipoEtapa: Tipo de Etapa a consultar\n     * @param tipoPlan: Tipo de Plan a consultar\n     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar\n     * @param periodoAnual; Periodo Anual a consultar\n     * @return EtapaPlan\n     * @since 13\/01\/2023\n     * @issue: PPI-267\n     *\/\n    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo,PeriodoAnual periodoAnual, Date fechaActualInicial, Date fechaActualFinal);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">EtapaPlanService.java (Final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code> \/**\n     * Definici\u00f3n que obtiene una Etapa Plan de acuerdo a:\n     * Tipo de Etapa\n     * Tipo Plan\n     * Tipo Plan Operativo\n     * Periodo Anual\n     * Fecha Actual este entre Fecha_Inicial y Fecha_Final\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @param tipoEtapa: Tipo de Etapa a consultar\n     * @param tipoPlan: Tipo de Plan a consultar\n     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar\n     * @param periodoAnual; Periodo Anual a consultar\n     * @return EtapaPlan\n     * @since 13\/01\/2023\n     * @issue: PPI-267\n     *\/\n    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">EtapaPlanServiceImpl.java (Final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * M\u00e9todo que obtiene una Etapa Plan de acuerdo a:\n     * Tipo de Etapa\n     * Tipo Plan\n     * Tipo Plan Operativo\n     * Periodo Anual\n     * Fecha Actual este entre Fecha_Inicial y Fecha_Final\n     * \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @param tipoEtapa: Tipo de Etapa a consultar\n     * @param tipoPlan: Tipo de Plan a consultar\n     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar\n     * @param periodoAnual; Periodo Anual a consultar\n     * @return EtapaPlan\n     * @since 13\/01\/2023\n     * @issue: PPI-267\n     *\/\n    \n    @Override\n    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual) {\n\n        \/\/ obtener fecha actual\n        Date fechaActual = new Date();\n\n        \/\/ Ejecutar funci\u00f3n del repository\n        return repository.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapa, tipoPlan, tipoPlanOperativo, periodoAnual, fechaActual, fechaActual);\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">TipoEtapaServiceImpl.java (Final)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/******************************************************************************************************************\/\n    \/******************************************************************************************************************\/\n    \/******************************************************************************************************************\/\n    \/**\n     * M\u00e9todo que devuelve el TipoEtapa de acuerdo al parametro param_ppi_ppo_tipoEtapa_modificacion\n     *\n     * @return: TipoEtapa\n     *\n     * @author Gustavo Matamoros G.\n     * @fechaCreacion: 13\/01\/2023\n     * @fechaModificacion: 13\/01\/2023\n     * @m\u00f3dulo: PPI-PPE\n     * @issue: PPI-267\n     *\/\n    @Override\n    public TipoEtapa obtenerTipoEtapaModificacion(){\n        return findTipoEtapaByParametro(\"param_ppi_ppo_tipoEtapa_modificacion\");\n    }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>planOperativoListForm PlanOperativoListBeanButtons.java plan_operativo_duplicarPlanOperativo_button: \u00abduplicar plan operativo\u00bb planOperativoListForm.xhtml (Ventana modal) PlanOperativoListBeanButtons.java Funci\u00f3n para validar el renderizado del bot\u00f3n PlanOperativoListForm.xhtml (final) PlanOperativoListBeanButtons.java (Final) PlanOperativoBean.java Funcion: renderizado del bot\u00f3n Funci\u00f3n de duplicarPlanOperativoDesdeButton PlanOperativoBean.java (Funciones finales) PlanOperativoServiceImpl.java (Final) PlanOperativoService.java (Final) PlanOperativoRepository.java (final) EtapaPlanRepository.java (final) EtapaPlanService.java (Final) EtapaPlanServiceImpl.java (Final) TipoEtapaServiceImpl.java (Final)<\/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":[468,469,444],"class_list":["post-14037","post","type-post","status-publish","format-standard","hentry","category-sigesa","tag-boton-accion","tag-button","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\/14037","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=14037"}],"version-history":[{"count":20,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14037\/revisions"}],"predecessor-version":[{"id":14094,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14037\/revisions\/14094"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}