{"id":14557,"date":"2023-04-11T13:49:18","date_gmt":"2023-04-11T19:49:18","guid":{"rendered":"http:\/\/201.237.206.56\/Sitios\/ugit.siua.ac.cr\/?p=14557"},"modified":"2023-05-03T11:46:52","modified_gmt":"2023-05-03T17:46:52","slug":"sigesa-bitacora-arr-justificacion-tab-de-bitacora","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=14557","title":{"rendered":"SIGESA: Bitacora ARR, Justificacion, Tab de bitacora, progress bar, especificaci\u00f3n"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Tarea BITACORA ARR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear una bit\u00e1cora de cambios de estado de las actividades\n<ul class=\"wp-block-list\">\n<li>BITACORA_AM\n<ul class=\"wp-block-list\">\n<li>ACTIVIDAD_MEJORA<\/li>\n\n\n\n<li>ESTADO_AM<\/li>\n\n\n\n<li>FECHA<\/li>\n\n\n\n<li>USUARIO<\/li>\n\n\n\n<li>Justificaci\u00f3n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Crear pesta\u00f1a que contenga una tabla que muestre la bit\u00e1cora de la actividad.\n<ul class=\"wp-block-list\">\n<li>Ordenado por fecha DES<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Asignarles el estado en proceso a todos los registros (En proceso).<\/li>\n\n\n\n<li>Agregar autocomplete para la selecci\u00f3n del estado.\n<ul class=\"wp-block-list\">\n<li>S\u00f3lo se puede seleccionar manualmente los valores (Sin iniciar y Descartada)<\/li>\n\n\n\n<li>Si se cambia el estado debe registrar la bit\u00e1cora incluyendo la justificaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Agregar \u00e1rea de texto (remaining)\n<ul class=\"wp-block-list\">\n<li>Obligatoria para los cambios de estado.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Si se modifica la vigencia de la actividad se debe recalcular el estado con respecto al avance o cumplimiento de la meta operativa de la siguiente manera:\n<ul class=\"wp-block-list\">\n<li>En proceso, si el c\u00e1lculo del avance o cumplimiento es inferior a 100%<\/li>\n\n\n\n<li>Implementada, si el c\u00e1lculo del avance o cumplimiento es 100%<\/li>\n\n\n\n<li>Debe registrar la bit\u00e1cora incluyendo la justificaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>El usuario administrador del m\u00f3dulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificaci\u00f3n de manera obligatoria.<\/li>\n\n\n\n<li>Al descartar una actividad pasa a estar inactivo el registro.<\/li>\n\n\n\n<li>Cuando el avance y\/o cumplimiento de los planes operativos obtengan el estado APROBADO por unidad integradora o en un s\u00f3lo nivel se debe recalcular el estado de las actividades de mejora y de respuesta al riesgo con respecto al avance o cumplimiento de la meta operativa de la siguiente manera:\n<ul class=\"wp-block-list\">\n<li>En proceso, si el c\u00e1lculo del avance o cumplimiento es inferior a 100%<\/li>\n\n\n\n<li>Implementada, si el c\u00e1lculo del avance o cumplimiento es 100%<\/li>\n\n\n\n<li>Debe crear un registro en la bit\u00e1cora de AM\n<ul class=\"wp-block-list\">\n<li>Estado calculado en esta tarea<\/li>\n\n\n\n<li>Usuario, debe registrar el que cambi\u00f3 el avance o cumplimiento a los estados Aprobado Unidad Integradora o Aprobado en un s\u00f3lo nivel.<\/li>\n\n\n\n<li>Fecha, debe registrar la fecha de aprobaci\u00f3n (APROBADO por unidad integradora o en un s\u00f3lo nivel) del avance o cumplimiento.<\/li>\n\n\n\n<li>Justificaci\u00f3n de la META_POA asociada a la AM<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TAREA: BITACORA AM<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear una bit\u00e1cora de cambios de estado de las actividades\n<ul class=\"wp-block-list\">\n<li>BITACORA_AM\n<ul class=\"wp-block-list\">\n<li>ACTIVIDAD_MEJORA<\/li>\n\n\n\n<li>ESTADO_AM<\/li>\n\n\n\n<li>FECHA<\/li>\n\n\n\n<li>USUARIO<\/li>\n\n\n\n<li>Justificaci\u00f3n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Crear pesta\u00f1a que contenga una tabla que muestre la bit\u00e1cora de la actividad.\n<ul class=\"wp-block-list\">\n<li>Ordenado por fecha DES<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Asignarles el estado en proceso a todos los registros (En proceso).<\/li>\n\n\n\n<li>Agregar autocomplete para la selecci\u00f3n del estado.\n<ul class=\"wp-block-list\">\n<li>S\u00f3lo se puede seleccionar manualmente los valores (Sin iniciar y Descartada)<\/li>\n\n\n\n<li>Si se cambia el estado debe registrar la bit\u00e1cora incluyendo la justificaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Agregar \u00e1rea de texto (remaining)\n<ul class=\"wp-block-list\">\n<li>Obligatoria para los cambios de estado.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Si se modifica la vigencia de la actividad se debe recalcular el estado con respecto al avance o cumplimiento de la meta operativa de la siguiente manera:\n<ul class=\"wp-block-list\">\n<li>En proceso, si el c\u00e1lculo del avance o cumplimiento es inferior a 100%<\/li>\n\n\n\n<li>Implementada, si el c\u00e1lculo del avance o cumplimiento es 100%<\/li>\n\n\n\n<li>Debe registrar la bit\u00e1cora incluyendo la justificaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>El usuario administrador del m\u00f3dulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificaci\u00f3n de manera obligatoria.<\/li>\n\n\n\n<li>Al descartar una actividad pasa a estar inactivo el registro.<\/li>\n\n\n\n<li>Cuando el avance y\/o cumplimiento de los planes operativos obtengan el estado APROBADO por unidad integradora o en un s\u00f3lo nivel se debe recalcular el estado de las actividades de mejora y de respuesta al riesgo con respecto al avance o cumplimiento de la meta operativa de la siguiente manera:\n<ul class=\"wp-block-list\">\n<li>En proceso, si el c\u00e1lculo del avance o cumplimiento es inferior a 100%<\/li>\n\n\n\n<li>Implementada, si el c\u00e1lculo del avance o cumplimiento es 100%<\/li>\n\n\n\n<li>Debe crear un registro en la bit\u00e1cora de AM\n<ul class=\"wp-block-list\">\n<li>Estado calculado en esta tarea<\/li>\n\n\n\n<li>Usuario, debe registrar el que cambi\u00f3 el avance o cumplimiento a los estados Aprobado Unidad Integradora o Aprobado en un s\u00f3lo nivel.<\/li>\n\n\n\n<li>Fecha, debe registrar la fecha de aprobaci\u00f3n (APROBADO por unidad integradora o en un s\u00f3lo nivel) del avance o cumplimiento.<\/li>\n\n\n\n<li>Justificaci\u00f3n de la META_POA asociada a la AM<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de Bitacora<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Como se ve vamos a crear 2 bitacoras una ARR (Actividad Respuesta al Riesgo) y otra AM (Actividad Mejora)<\/li>\n\n\n\n<li>Por lo que creamos los script de creaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRCreate.sql<\/h3>\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 * Author:  Gustavo Matamoros Gonz\u00e1lez\n * Created: 11\/04\/2023\n *\/\n\n\/********************************************************\/\n\/* CREACI\u00d3N DE TABLA                                    *\/\n\/********************************************************\/\nCREATE TABLE \"PPI\".\"BITACORA_ARR\"\n(\n    \"ID_BITACORA_ARR\"            NUMBER (19,0)       NOT NULL ENABLE,\n    \"ACTIVIDAD_RIESGO\"           NUMBER (19,0)       NOT NULL ENABLE,\n    \"ESTADO_ARR\"                 NUMBER (19,0)       NOT NULL ENABLE,    \n    \"USUARIO\"                    NUMBER (19,0)       NOT NULL ENABLE,        \n    \"FECHA\"                     DATE                NOT NULL ENABLE,\n    \"JUSTIFICACION\"             VARCHAR2(500 BYTE),\n\n    \"FECHA_CREACION\"        DATE                NOT NULL ENABLE,\n    \"USUARIO_CREACION\"      NUMBER(19,0)        NOT NULL ENABLE,\n    \"FECHA_MODIFICACION\"    DATE                NOT NULL ENABLE,\n    \"USUARIO_MODIFICACION\"  NUMBER(19,0)        NOT NULL ENABLE,\n    \"VERSION\"               NUMBER(19,0),\n    \"CAMPO_CONFIGURABLE\"    NUMBER(19,0),\n\n    CONSTRAINT \"PK_BITACORA_ARR\" PRIMARY KEY(\"ID_BITACORA_ARR\"),\n    \n    \n    \/********************************************************\/\n    \/* LLAVE: FORANEAS                                      *\/\n    \/********************************************************\/\n    --BITACORA_ARR-&gt;ACTIVIDAD_RESPUESTA_RIESGO\n    CONSTRAINT FK_BIT_ARR_ARR FOREIGN KEY(ACTIVIDAD_RIESGO)                 REFERENCES PPI.ACTIVIDAD_RESPUESTA_RIESGO(ID_ACTIVIDAD_RESPUESTA_RIESGO),\n\n    --BITACORA_ARR-&gt;ESTADO_ARR\n    CONSTRAINT FK_BIT_ARR_EST_ARR FOREIGN KEY(ESTADO_ARR)                   REFERENCES PPI.ESTADO_ARR(ID_ESTADO_ARR),\n    \n     --BITACORA_ARR-&gt;USUARIO\n    CONSTRAINT FK_BIT_ARR_USU FOREIGN KEY(USUARIO)                          REFERENCES SAS.USUARIO (ID_USUARIO),\n    \n    \n    \n    \n    \/********************************************************\/\n    \/* LLAVE: FORANEAS SIGESA                               *\/\n    \/********************************************************\/\n    CONSTRAINT FK_BIT_ARR_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),\n    CONSTRAINT FK_BIT_ARR_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),\n    CONSTRAINT FK_BIT_ARR_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)\n    \n    \n);\n\n\n\/********************************************************\/\n\/* COMENTARIOS                                          *\/\n\/********************************************************\/\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_ARR\".\"ACTIVIDAD_RIESGO\"                   IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla ACTIVIDAD_RESPUESTA_RIESGO';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_ARR\".\"ESTADO_ARR\"                         IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla ESTADO_ARR';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_ARR\".\"USUARIO\"                            IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla USUARIO';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_ARR\".\"FECHA\"                              IS 'Fecha y hora en que se realiza la transacci\u00f3n';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_ARR\".\"JUSTIFICACION\"                      IS 'Campo para almacenar la justificaci\u00f3n de un cambio de estado de actividad';\n\n\n\n\n\n\/********************************************************\/\n\/* SECUENCIA                                            *\/\n\/********************************************************\/\nCREATE SEQUENCE PPI.SQ_BITACORA_ARR START WITH 1 INCREMENT BY 1 MINVALUE 1 NOCACHE  NOCYCLE  NOORDER;\n\n\n\n\n\/********************************************************\/\n\/* SINONIMOS                                            *\/\n\/********************************************************\/\nCREATE PUBLIC SYNONYM BITACORA_ARR FOR \"PPI\".\"BITACORA_ARR\";\nCREATE PUBLIC SYNONYM SQ_BITACORA_ARR FOR PPI.SQ_BITACORA_ARR;\n\n\n\n\/********************************************************\/\n\/* GRANT PERMISOS SOBRE LA TABLA                        *\/\n\/********************************************************\/\nGRANT DELETE, INSERT, UPDATE, SELECT, REFERENCES ON PPI.BITACORA_ARR TO WWW_SIGESA, WWW_TEUNA;\nGRANT SELECT, ALTER ON PPI.SQ_BITACORA_ARR TO WWW_SIGESA, WWW_TEUNA;\nGRANT SELECT ON \"PPI\".\"BITACORA_ARR\" TO \"ANALISTA\", \"ANALISTA_SIGESA\";\n\n\n\n\/********************************************************\/\n\/* ELIMINAR TABLA  (ROLLBACK)                           *\/\n\/********************************************************\/\nDROP SEQUENCE \"PPI\".SQ_BITACORA_ARR;\nDROP PUBLIC SYNONYM BITACORA_ARR;\nDROP PUBLIC SYNONYM SQ_BITACORA_ARR;\nDROP TABLE \"PPI\".BITACORA_ARR;\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMCreate.sql<\/h3>\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 * Author:  Gustavo Matamoros Gonz\u00e1lez\n * Created: 11\/04\/2023\n *\/\n\n\/********************************************************\/\n\/* CREACI\u00d3N DE TABLA                                    *\/\n\/********************************************************\/\nCREATE TABLE \"PPI\".\"BITACORA_AM\"\n(\n\n    \"ID_BITACORA_AM\"             NUMBER (19,0)       NOT NULL ENABLE,\n    \"ACTIVIDAD_MEJORA\"           NUMBER (19,0)       NOT NULL ENABLE,\n    \"ESTADO_AM\"                  NUMBER (19,0)       NOT NULL ENABLE,    \n    \"USUARIO\"                    NUMBER (19,0)       NOT NULL ENABLE,        \n    \"FECHA\"                     DATE                NOT NULL ENABLE,\n    \"JUSTIFICACION\"             VARCHAR2(500 BYTE),\n\n    \"FECHA_CREACION\"        DATE                NOT NULL ENABLE,\n    \"USUARIO_CREACION\"      NUMBER(19,0)        NOT NULL ENABLE,\n    \"FECHA_MODIFICACION\"    DATE                NOT NULL ENABLE,\n    \"USUARIO_MODIFICACION\"  NUMBER(19,0)        NOT NULL ENABLE,\n    \"VERSION\"               NUMBER(19,0),\n    \"CAMPO_CONFIGURABLE\"    NUMBER(19,0),\n    \n\n    CONSTRAINT \"PK_BITACORA_AM\" PRIMARY KEY(\"ID_BITACORA_AM\"),\n    \n   \n    \/********************************************************\/\n    \/* LLAVE: FORANEAS                                      *\/\n    \/********************************************************\/\n    --BITACORA_AM-&gt;ACTIVIDAD_MEJORA\n    CONSTRAINT FK_BIT_AM_AM FOREIGN KEY(ACTIVIDAD_MEJORA)                   REFERENCES PPI.ACTIVIDAD_MEJORA(ID_ACTIVIDAD_MEJORA),\n\n    --BITACORA_AM-&gt;ESTADO_AM\n    CONSTRAINT FK_BIT_AM_EST_AM FOREIGN KEY(ESTADO_AM)                      REFERENCES PPI.ESTADO_AM(ID_ESTADO_AM),\n    \n     --BITACORA_AM-&gt;USUARIO\n    CONSTRAINT FK_BIT_AM_USU FOREIGN KEY(USUARIO)                           REFERENCES SAS.USUARIO (ID_USUARIO),\n    \n\n    \/********************************************************\/\n    \/* LLAVE: FORANEAS SIGESA                               *\/\n    \/********************************************************\/\n    CONSTRAINT FK_BIT_AM_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),\n    CONSTRAINT FK_BIT_AM_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),\n    CONSTRAINT FK_BIT_AM_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)\n    \n    \n);\n\n\n\/********************************************************\/\n\/* COMENTARIOS                                          *\/\n\/********************************************************\/\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_AM\".\"ACTIVIDAD_MEJORA\"                   IS 'Campo que relaciona la tabla BITACORA_AM con la tabla ACTIVIDAD_MEJORA';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_AM\".\"ESTADO_AM\"                          IS 'Campo que relaciona la tabla BITACORA_AM con la tabla ESTADO_AM';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_AM\".\"USUARIO\"                            IS 'Campo que relaciona la tabla BITACORA_AM con la tabla USUARIO';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_AM\".\"FECHA\"                              IS 'Fecha y hora en que se realiza la transacci\u00f3n';\nCOMMENT ON COLUMN \"PPI\".\"BITACORA_AM\".\"JUSTIFICACION\"                      IS 'Campo para almacenar la justificaci\u00f3n de un cambio de estado de actividad';\n\n\n\/********************************************************\/\n\/* SECUENCIA                                            *\/\n\/********************************************************\/\nCREATE SEQUENCE PPI.SQ_BITACORA_AM START WITH 1 INCREMENT BY 1 MINVALUE 1 NOCACHE  NOCYCLE  NOORDER;\n\n\n\n\/********************************************************\/\n\/* SINONIMOS                                            *\/\n\/********************************************************\/\nCREATE PUBLIC SYNONYM BITACORA_AM FOR \"PPI\".\"BITACORA_AM\";\nCREATE PUBLIC SYNONYM SQ_BITACORA_AM FOR PPI.SQ_BITACORA_AM;\n\n\n\n\/********************************************************\/\n\/* GRANT PERMISOS SOBRE LA TABLA                        *\/\n\/********************************************************\/\nGRANT DELETE, INSERT, UPDATE, SELECT, REFERENCES ON PPI.BITACORA_AM TO WWW_SIGESA, WWW_TEUNA;\nGRANT SELECT, ALTER ON PPI.SQ_BITACORA_AM TO WWW_SIGESA, WWW_TEUNA;\nGRANT SELECT ON \"PPI\".\"BITACORA_AM\" TO \"ANALISTA\", \"ANALISTA_SIGESA\";\n\n\n\n\n\/********************************************************\/\n\/* ELIMINAR TABLA  (ROLLBACK)                           *\/\n\/********************************************************\/\nDROP SEQUENCE \"PPI\".SQ_BITACORA_AM;\nDROP PUBLIC SYNONYM BITACORA_AM;\nDROP PUBLIC SYNONYM SQ_BITACORA_AM;\nDROP TABLE \"PPI\".BITACORA_AM;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">DOMAIN<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear los domain&#8217;s de ambas tablas<\/li>\n\n\n\n<li>Primero se deben agregar los siguientes import&#8217;s<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.Date;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARR.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.domain;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.util.Date;\nimport javax.persistence.AttributeOverride;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.SequenceGenerator;\nimport javax.persistence.Table;\nimport javax.persistence.Temporal;\nimport javax.persistence.Transient;\nimport cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;\nimport cr.ac.una.cgi.sdkuna.domain.Usuario;\nimport cr.ac.una.cgi.sdkuna.generic.BaseEntity;\n\n\n\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Entity para la administraci\u00f3n de la entidad {@link BitacoraARR}\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion:       11\/04\/2023\n * @Version: 1.0.0\n *\/\n@Entity\n@Table(name = \"BITACORA_ARR\")\n@AttributeOverride(name = \"id\", column\n        = @Column(name = \"ID_BITACORA_ARR\"))\n@SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_BITACORA_ARR\", allocationSize = 1)\npublic class BitacoraARR extends BaseEntity&lt;Usuario, CampoConfigurable&gt; {\n\n    \/***************************************\/\n    \/\/ MAPEO'S\n    \/***************************************\/\n    @ManyToOne(fetch = FetchType.LAZY, optional = false)\n    @JoinColumn(name = \"ACTIVIDAD_RIESGO\",\n            referencedColumnName = \"ID_ACTIVIDAD_RESPUESTA_RIESGO\",\n            nullable = false,\n            insertable = false,\n            updatable = false)\n    private ActividadRespuestaRiesgo actividadRespuestaRiesgo;\n\n    @ManyToOne\n    @JoinColumn(name = \"ESTADO_ARR\")\n    private EstadoARR estadoARR;\n\n    @ManyToOne\n    @JoinColumn(name = \"USUARIO\")\n    private Usuario usuario;\n\n    \/***************************************\/\n    \/\/ CAMPOS\n    \/***************************************\/\n    @Column(name = \"FECHA\")\n    @Temporal(javax.persistence.TemporalType.TIMESTAMP)\n    private Date fecha;\n\n    @Column(name = \"JUSTIFICACION\")\n    private String justificacion;\n\n    \/***************************************\/\n    \/\/ TRASIENT'S\n    \/***************************************\/\n    @Transient\n    private String estadoNombre;\n\n    @Transient\n    private String actividadRespuestaRiesgoCodigo;\n\n    @Transient\n    private String actividadRespuestaRiesgoDescripcion;\n\n    @Transient\n    private String usuarioCedula;\n\n\n    \/***************************************\/\n    \/\/ MAPEO'S GET Y SET\n    \/***************************************\/\n    public ActividadRespuestaRiesgo getActividadRespuestaRiesgo() {\n        return actividadRespuestaRiesgo;\n    }\n\n    public void setActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuestaRiesgo) {\n        this.actividadRespuestaRiesgo = actividadRespuestaRiesgo;\n    }\n\n    public EstadoARR getEstadoARR() {\n        return estadoARR;\n    }\n\n    public void setEstadoARR(EstadoARR estadoARR) {\n        this.estadoARR = estadoARR;\n    }\n\n    public Usuario getUsuario() {\n        return usuario;\n    }\n\n    public void setUsuario(Usuario usuario) {\n        this.usuario = usuario;\n    }\n\n    \/***************************************\/\n    \/\/ CAMPOS GET Y SET\n    \/***************************************\/\n    public Date getFecha() {\n        return fecha;\n    }\n\n    public void setFecha(Date fecha) {\n        this.fecha = fecha;\n    }\n\n    public String getJustificacion() {\n        return justificacion;\n    }\n\n    public void setJustificacion(String justificacion) {\n        this.justificacion = justificacion;\n    }\n\n    \/***************************************\/\n    \/\/ TRASIENT GET Y SET\n    \/***************************************\/\n    public String getEstadoNombre() {\n        estadoNombre = \"\";\n        if (estadoARR != null) {\n            estadoNombre = estadoARR.getNombre();\n        }\n        return estadoNombre;\n    }\n    public void setEstadoNombre(String estadoNombre) {\n        this.estadoNombre = estadoNombre;\n    }\n\n\n    public String getActividadRespuestaRiesgoCodigo() {\n        actividadRespuestaRiesgoCodigo = \"\";\n        if (actividadRespuestaRiesgo != null) {\n            actividadRespuestaRiesgoCodigo = actividadRespuestaRiesgo.getCodigo();\n        }\n        return actividadRespuestaRiesgoCodigo;\n    }\n    public void setActividadRespuestaRiesgoCodigo(String actividadRespuestaRiesgoCodigo) {\n        this.actividadRespuestaRiesgoCodigo = actividadRespuestaRiesgoCodigo;\n    }\n\n\n    public String getActividadRespuestaRiesgoDescripcion() {\n        actividadRespuestaRiesgoDescripcion = \"\";\n        if (actividadRespuestaRiesgo != null) {\n            actividadRespuestaRiesgoDescripcion = actividadRespuestaRiesgo.getDescripcion();\n        }\n        return actividadRespuestaRiesgoDescripcion;\n    }\n    public void setActividadRespuestaRiesgoDescripcion(String actividadRespuestaRiesgoDescripcion) {\n        this.actividadRespuestaRiesgoDescripcion = actividadRespuestaRiesgoDescripcion;\n    }\n    \n\n    public String getUsuarioCedula() {\n        usuarioCedula = \"\";\n        if (usuario != null) {\n            usuarioCedula = usuario.getNombreUsuario();\n        }\n        return usuarioCedula;\n    }\n\n    public void setUsuarioCedula(String usuarioCedula) {\n        this.usuarioCedula = usuarioCedula;\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAM.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.domain;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.util.Date;\nimport javax.persistence.AttributeOverride;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.SequenceGenerator;\nimport javax.persistence.Table;\nimport javax.persistence.Temporal;\nimport javax.persistence.Transient;\nimport cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;\nimport cr.ac.una.cgi.sdkuna.domain.Usuario;\nimport cr.ac.una.cgi.sdkuna.generic.BaseEntity;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Entity para la administraci\u00f3n de la entidad {@link BitacoraAM}\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion:       11\/04\/2023\n * @Version: 1.0.0\n *\/\n@Entity\n@Table(name = \"BITACORA_AM\")\n@AttributeOverride(name = \"id\", column\n        = @Column(name = \"ID_BITACORA_AM\"))\n@SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_BITACORA_AM\", allocationSize = 1)\npublic class BitacoraAM extends BaseEntity&lt;Usuario, CampoConfigurable&gt; {\n\n    \/***************************************\/\n    \/\/ MAPEO'S\n    \/***************************************\/\n    @ManyToOne(fetch = FetchType.LAZY, optional = false)\n    @JoinColumn(name = \"ACTIVIDAD_MEJORA\",\n            referencedColumnName = \"ID_ACTIVIDAD_MEJORA\",\n            nullable = false,\n            insertable = false,\n            updatable = false)\n    private ActividadMejora actividadMejora;\n\n    @ManyToOne\n    @JoinColumn(name = \"ESTADO_AM\")\n    private EstadoAM estadoAM;\n\n    @ManyToOne\n    @JoinColumn(name = \"USUARIO\")\n    private Usuario usuario;\n\n    \/***************************************\/\n    \/\/ CAMPOS\n    \/***************************************\/\n    @Column(name = \"FECHA\")\n    @Temporal(javax.persistence.TemporalType.TIMESTAMP)\n    private Date fecha;\n\n    @Column(name = \"JUSTIFICACION\")\n    private String justificacion;\n\n    \/***************************************\/\n    \/\/ TRASIENT'S\n    \/***************************************\/\n    @Transient\n    private String estadoNombre;\n\n    @Transient\n    private String actividadMejoraCodigo;\n\n    @Transient\n    private String actividadMejoraDescripcion;\n\n    @Transient\n    private String usuarioNombre;\n    \n    \/***************************************\/\n    \/\/ MAPEO'S GET Y SET\n    \/***************************************\/\n    public ActividadMejora getActividadMejora() {\n        return actividadMejora;\n    }\n\n    public void setActividadMejora(ActividadMejora actividadMejora) {\n        this.actividadMejora = actividadMejora;\n    }\n\n    public EstadoAM getEstadoAM() {\n        return estadoAM;\n    }\n\n    public void setEstadoAM(EstadoAM estadoAM) {\n        this.estadoAM = estadoAM;\n    }\n\n    public Usuario getUsuario() {\n        return usuario;\n    }\n\n    public void setUsuario(Usuario usuario) {\n        this.usuario = usuario;\n    }\n\n    \/***************************************\/\n    \/\/ CAMPOS GET Y SET\n    \/***************************************\/\n    public Date getFecha() {\n        return fecha;\n    }\n\n    public void setFecha(Date fecha) {\n        this.fecha = fecha;\n    }\n\n    public String getJustificacion() {\n        return justificacion;\n    }\n\n    public void setJustificacion(String justificacion) {\n        this.justificacion = justificacion;\n    }\n\n    \/***************************************\/\n    \/\/ TRASIENT GET Y SET\n    \/***************************************\/\n    public String getEstadoNombre() {\n        estadoNombre = \"\";\n        if (estadoAM != null) {\n            estadoNombre = estadoAM.getNombre();\n        }\n        return estadoNombre;\n    }\n    public void setEstadoNombre(String estadoNombre) {\n        this.estadoNombre = estadoNombre;\n    }\n\n\n    public String getActividadMejoraCodigo() {\n        actividadMejoraCodigo = \"\";\n        if (actividadMejora != null) {\n            actividadMejoraCodigo = actividadMejora.getCodigo();\n        }\n        return actividadMejoraCodigo;\n    }\n    public void setActividadMejoraCodigo(String actividadMejoraCodigo) {\n        this.actividadMejoraCodigo = actividadMejoraCodigo;\n    }\n\n\n    public String getActividadMejoraDescripcion() {\n        actividadMejoraDescripcion = \"\";\n        if (actividadMejora != null) {\n            actividadMejoraDescripcion = actividadMejora.getDescripcion();\n        }\n        return actividadMejoraDescripcion;\n    }\n    public void setActividadMejoraDescripcion(String actividadMejoraDescripcion) {\n        this.actividadMejoraDescripcion = actividadMejoraDescripcion;\n    }\n    \n\n    public String getUsuarioNombre() {\n        usuarioNombre = \"\";\n        if (usuario != null) {\n            usuarioNombre = usuario.getNombreUsuario();\n        }\n        return usuarioNombre;\n    }\n\n    public void setUsuarioNombre(String usuarioNombre) {\n        this.usuarioNombre = usuarioNombre;\n    }\n\n    \n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Repository<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos los repository<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRRepository.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.repository;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport org.springframework.stereotype.Repository;\nimport cr.ac.una.cgi.sdkuna.generic.GenericRepository;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;\n\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Repository para la administraci\u00f3n de la entidad {@link BitacoraARR}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2o23\n  * @Version: 1.0.0\n *\/\n@Repository\npublic interface BitacoraARRRepository extends GenericRepository&lt;BitacoraARR&gt; {\n\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMRepository.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.repository;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport org.springframework.stereotype.Repository;\nimport cr.ac.una.cgi.sdkuna.generic.GenericRepository;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Repository para la administraci\u00f3n de la entidad {@link BitacoraAM}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2o23\n  * @Version: 1.0.0\n *\/\n@Repository\npublic interface BitacoraAMRepository extends GenericRepository&lt;BitacoraAM&gt; {\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Service<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos service<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRService.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.service;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport cr.ac.una.cgi.sdkuna.api.service.EntityService;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Interface para la administraci\u00f3n de la entidad {@link BitacoraARR}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2023\n * @Version: 1.0.0.\n *\/\npublic interface BitacoraARRService extends EntityService&lt;BitacoraARR&gt; {\n\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMService.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.service;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport cr.ac.una.cgi.sdkuna.api.service.EntityService;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Interface para la administraci\u00f3n de la entidad {@link BitacoraAM}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2023\n * @Version: 1.0.0.\n *\/\npublic interface BitacoraAMService extends EntityService&lt;BitacoraAM&gt; {\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ServiceImpl<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos la implementaciones<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRServiceImpl.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.service;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.repository.BitacoraARRRepository;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Clase que implementa el servicio {@link BitacoraARRService} para la entidad\n * {@link BitacoraARR}\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2023\n * @version: 1.0.0\n *\/\n@Service\n@Transactional\npublic class BitacoraARRServiceImpl extends EntityServiceImpl&lt;BitacoraARR, BitacoraARRRepository&gt; implements BitacoraARRService {\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMServiceImpl.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.service;\n\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.repository.BitacoraAMRepository;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n * Clase que implementa el servicio {@link BitacoraAMService} para la entidad\n * {@link BitacoraAM}\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 11\/04\/2023\n * @version: 1.0.0\n *\/\n@Service\n@Transactional\npublic class BitacoraAMServiceImpl extends EntityServiceImpl&lt;BitacoraAM, BitacoraAMRepository&gt; implements BitacoraAMService {\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MAPEOS<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. MAPEO: ActividadRespuestaRiesgo.java -&gt;BitacoraARR.java (JPA-ARR)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para crear el mapeo dentro de ActividadRespuestaRiesgos.java<\/li>\n\n\n\n<li>Agregamos los import&#8217;s necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.persistence.OneToMany;\nimport java.util.List;\nimport javax.persistence.CascadeType;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos crear la relaci\u00f3n (mapeo) que existe entre la entidad \u00abActividadRespuestaRiesgo\u00bb y   \u00abBitacoraARR\u00bb<\/li>\n\n\n\n<li>Esta relaci\u00f3n se da a trav\u00e9s del la columna de \u00abACTIVIDAD_RIESGO\u00bb dentro de bitacora<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"753\" height=\"689\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_015.png\" alt=\"\" class=\"wp-image-14569\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_015.png 753w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_015-300x275.png 300w\" sizes=\"(max-width: 753px) 100vw, 753px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entonces a ARR le vamos a decir usted tiene un hijo que es una lista de BitacoraARR, con la siguiente instrucci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n\/\/ MAPEO: ACTIVIDAD_RESPUESTA_RIESGO-&gt;BITACORA_ARR\n\/\/ ***************************************\n@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)\n@JoinColumn(name = \"ACTIVIDAD_RIESGO\", nullable = false)\nprivate List&lt;BitacoraARR&gt; listaBitacoraARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y ademas de esto debemos crear los GET&#8217;s y Set&#8217;s de la lista<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n    \/\/ MAPEO: ACTIVIDAD_RESPUESTA_RIESGO-&gt;BITACORA_ARR\n    \/\/ ***************************************\n    public List&lt;BitacoraARR&gt; getListaBitacoraARR() {\n        return listaBitacoraARR;\n    }\n\n    public void setListaBitacoraARR(List&lt;BitacoraARR&gt; listaBitacoraARR) {\n        this.listaBitacoraARR = listaBitacoraARR;\n    } <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. MAPEO: BitacoraARR.java -&gt; ActividadRespuestaRiesgo.java (JPA-ARR)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora como ya le indicamos al padre quien es su hijo ahora debemos indicarle al hijo quien es su padre<\/li>\n\n\n\n<li>Para esto sobre el archivo BitacoraARR.java<\/li>\n\n\n\n<li>Primero agregamos los inports necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.persistence.FetchType;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le vamos a modificar la definici\u00f3n del siguiente campo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@ManyToOne\n@JoinColumn(name = \"ACTIVIDAD_RIESGO\")\nprivate ActividadRespuestaRiesgo actividadRespuestaRiesgo;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y la vamos a dejar as\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@ManyToOne(fetch = FetchType.LAZY, optional = false)\n@JoinColumn(name = \"ACTIVIDAD_RIESGO\",\n            referencedColumnName = \"ID_ACTIVIDAD_RESPUESTA_RIESGO\",\n            nullable = false,\n            insertable = false,\n            updatable = false)\nprivate ActividadRespuestaRiesgo actividadRespuestaRiesgo;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed estamos indicando que la columna \u00abACTIVIDAD_RIESGO\u00bb, referencia a ActividadRespuestaRiesgo por el campo \u00abID_ACTIVIDAD_RESPUESTA_RIESGO\u00bb<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"459\" height=\"639\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_016.png\" alt=\"\" class=\"wp-image-14573\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_016.png 459w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_016-215x300.png 215w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Mapeo: ActividadMejora -&gt; BitacoraAM<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para crear el mapeo dentro de ActividadRespuestaRiesgos.java<\/li>\n\n\n\n<li>Agregamos los import\u2019s necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.persistence.OneToMany;\nimport java.util.List;\nimport javax.persistence.CascadeType;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos crear la relaci\u00f3n (mapeo) que existe entre la entidad \u201cActividadMejora\u201d y \u201cBitacoraAM\u201d<\/li>\n\n\n\n<li>Esta relaci\u00f3n se da a trav\u00e9s del la columna de \u201cACTIVIDAD_MEJORA\u201d dentro de bitacora<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"466\" height=\"622\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_017.png\" alt=\"\" class=\"wp-image-14575\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_017.png 466w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_017-225x300.png 225w\" sizes=\"(max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entonces a ARR le vamos a decir usted tiene un hijo que es una lista de BitacoraARR, con la siguiente instrucci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)\n@JoinColumn(name = \"ACTIVIDAD_MEJORA\", nullable = false)\nprivate List&lt;BitacoraAM&gt; listaBitacoraAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y ademas de esto debemos crear los GET\u2019s y Set\u2019s de la lista<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;BitacoraAM&gt; getListaBitacoraAM() {\n        return listaBitacoraAM;\n    }\n\n    public void setListaBitacoraAM(List&lt;BitacoraAM&gt; listaBitacoraAM) {\n        this.listaBitacoraAM = listaBitacoraAM;\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. MAPEO: BitacoraAM.java -&gt; ActividadMejora.java (JPA-AM)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora como ya le indicamos al padre quien es su hijo ahora debemos indicarle al hijo quien es su padre<\/li>\n\n\n\n<li>Para esto sobre el archivo BitacoraARR.java<\/li>\n\n\n\n<li>Primero agregamos los inports necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import javax.persistence.FetchType;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le vamos a modificar la definici\u00f3n del siguiente campo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@ManyToOne\n@JoinColumn(name = \"ACTIVIDAD_MEJORA\")\nprivate ActividadMejora actividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y la vamos a dejar as\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@ManyToOne(fetch = FetchType.LAZY, optional = false)\n@JoinColumn(name = \"ACTIVIDAD_MEJORA\",\n            referencedColumnName = \"ID_ACTIVIDAD_MEJORA\",\n            nullable = false,\n            insertable = false,\n            updatable = false)\nprivate ActividadMejora actividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed estamos indicando que la columna \u201cACTIVIDAD_MEJORA\u201d, referencia a ActividadMejora por el campo \u201cID_ACTIVIDAD_MEJORA\u201d<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"370\" height=\"647\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_018.png\" alt=\"\" class=\"wp-image-14576\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_018.png 370w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_018-172x300.png 172w\" sizes=\"(max-width: 370px) 100vw, 370px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Beans<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Como lo que estamos haciendo en un mastero \/ detalle debemos crear los Beans para las bitacoras pero que sean de tipo ASER<\/li>\n\n\n\n<li>Creamos los bean&#8217;s tipo ASER<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRBean.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.view.model;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASER;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 12\/04\/2023\n * @version: 1.0.0\n *\/\n@Component\n@Scope(\"session\")\npublic class BitacoraARRBean extends ASERImpl&lt;BitacoraARR&gt; implements ASER {\n\n    public BitacoraARRBean() {\n\n    }\n\n    @PostConstruct\n    public void init() {\n\n        List&lt;ASERColumn&gt; columns = new ArrayList&lt;&gt;();\n        \n     \n        ASERColumn column1 = new ASERColumn(\"estadoNombre\",                         getI18n(\"bitacoraARR_estadoNombre_label\"),                          true);\n        ASERColumn column2 = new ASERColumn(\"fecha\",                                getI18n(\"bitacoraARR_fecha_label\"),                                 true);        \n        ASERColumn column3 = new ASERColumn(\"usuarioCedula\",                        getI18n(\"bitacoraARR_usuarioCedula_label\"),                         true);\n        ASERColumn column4 = new ASERColumn(\"justificacion\",                        getI18n(\"bitacoraARR_justificacion_label\"),                         true);\n\n        columns.add(column1);\n        columns.add(column2);\n        columns.add(column3);\n        columns.add(column4);\n\n\n        this.setColumnsDetails(columns);\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMBean.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.view.model;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASER;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\n\n\n\n\/**********************************************************************\/\n\/*********************    DOCUMENTACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion: 12\/04\/2023\n * @version: 1.0.0\n *\/\n@Component\n@Scope(\"session\")\npublic class BitacoraAMBean extends ASERImpl&lt;BitacoraAM&gt; implements ASER {\n\n    public BitacoraAMBean() {\n\n    }\n    \n    @PostConstruct\n    public void init() {\n\n        List&lt;ASERColumn&gt; columns = new ArrayList&lt;&gt;();\n        \n        ASERColumn column1 = new ASERColumn(\"estadoNombre\",                         getI18n(\"bitacoraARR_estadoNombre_label\"),                 true);\n        ASERColumn column2 = new ASERColumn(\"fecha\",                                getI18n(\"bitacoraARR_fecha_label\"),                        true);        \n        ASERColumn column3 = new ASERColumn(\"usuarioNombre\",                        getI18n(\"bitacoraARR_usuarioNombre_label\"),                true);\n        ASERColumn column4 = new ASERColumn(\"justificacion\",                        getI18n(\"bitacoraARR_justificacion_label\"),                true);\n\n        columns.add(column1);\n        columns.add(column2);\n        columns.add(column3);\n        columns.add(column4);\n\n        this.setColumnsDetails(columns);\n    }\n}\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto ya tenemos los necesario para que se pueda mostrar el contenido de las bitacoras<\/li>\n\n\n\n<li>Ahora falta definir donde deseamos que se muestre o se inicialicen los valores <\/li>\n\n\n\n<li>Para BitacoraARR ser\u00eda en el editForm de ActividadRespuestaRiesgo<\/li>\n\n\n\n<li>Para BitacoraAM ser\u00eda en el editForm de ActividadMejora<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El archivo actualmente se encuentra as\u00ed<\/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.mcg.view.model;\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUD;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.HashMap;\nimport java.util.Map;\nimport javax.annotation.PostConstruct;\n\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.TipoActividadRiesgo;\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************   DOCUMENTACI\u00d3N   ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/**\n * Spring Bean Session para la administraci\u00f3n de la entidad {@link ActividadRespuestaRiesgo}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fecha 16\/12\/2022\n *\/\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************    CONFIGURACI\u00d3N  ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\n\/\/ Establece que es un componente\n@Component\n\n\/\/ Establece que existe mientras la session de usuario este activa\n@Scope(\"session\")\n\n\n\/**********************************************************************\/\n\/**********************************************************************\/\n\/****************    DEFINICI\u00d3N DE CLASE  *****************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\npublic class ActividadRespuestaRiesgoBean extends CRUDImpl&lt;ActividadRespuestaRiesgo, ActividadRespuestaRiesgoService&gt; implements CRUD {\n\n\n\n     \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N INIT    *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @PostConstruct\n    public void init() {\n\n        this.activeTab = 0;\n        List&lt;CRUDColumn&gt; columns = new ArrayList&lt;&gt;();\n\n        CRUDColumn column1 = new CRUDColumn(\"codigo\",                               getI18n(\"actividadRespuestaRiesgo_codigo_label\"),                       true);\n        CRUDColumn column2 = new CRUDColumn(\"descripcion\",                          getI18n(\"actividadRespuestaRiesgo_descripcion_label\"),                  true);\n        \n        CRUDColumn column3 = new CRUDColumn(\"nombreTipoActividadRiesgo\",            getI18n(\"actividadRespuestaRiesgo_tipoActividadRiesgoNombre_label\"),    true, \"tipoActividadRiesgo.nombre\");\n        CRUDColumn column4 = new CRUDColumn(\"codigoUnidadEjecutora\",                getI18n(\"actividadRespuestaRiesgo_unidadEjecutoraCodigo_label\"),        true, \"unidadEjecutora.codigo\");\n        CRUDColumn column5 = new CRUDColumn(\"nombreUnidadEjecutora\",                getI18n(\"actividadRespuestaRiesgo_nombreUnidadEjecutora_header\"),                    true, \"unidadEjecutora.nombre\");       \n        CRUDColumn column6 = new CRUDColumn(\"annoPeriodoAnualInicial\",              getI18n(\"actividadRespuestaRiesgo_periodoAnualInicialAnno_label\"),      true, \"periodoAnualInicial.ano\");\n        CRUDColumn column7 = new CRUDColumn(\"annoPeriodoAnualFinal\",                getI18n(\"actividadRespuestaRiesgo_periodoAnualFinalAnno_label\"),        true, \"periodoAnualFinal.ano\");\n\n        CRUDColumn column8 = new CRUDColumn(\"activo\",                               getI18n(\"actividadRespuestaRiesgo_activo_label\"),                       true);\n\n        \/\/Agregamos las columnas a la variable\n        columns.add(column1);\n        columns.add(column2);\n        columns.add(column3);\n        columns.add(column4);\n        columns.add(column5);\n        columns.add(column6);\n        columns.add(column7);\n        columns.add(column8);\n\n\n        this.setTableColumns(columns);\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN  FUNCI\u00d3N INIT   *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************           VARIABLES              *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n    \/\/ Variable para paso de parametros en LOV\n    private Map&lt;String, Object&gt; beanParams = new HashMap();\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************       FIN VARIABLES              *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITPROPERTIES     *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initProperties() {\n        if (!isPostBack()) {\n            beanParams.put(\"activo\", true);\n        }\n    }\n\n    \/\/-----------------------------------------------------------------\n    \/\/Variables para manejo de params\n    \/\/-----------------------------------------------------------------\n    public Map&lt;String, Object&gt; getBeanParams() {\n        return beanParams;\n    }\n\n    public void setBeanParams(Map&lt;String, Object&gt; beanParams) {\n        this.beanParams = beanParams;\n    }\n    \n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITPROPERTIES     *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\n\n\n\n\n\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n\n       \n\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\n\n\n   \n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Unidad Ejecutora   ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n    \/* AutoComplete *\/\n    public Page&lt;UnidadEjecutora&gt; completeUnidadEjecutora(String query, Pageable pgbl) {\n        return service.autoCompleteUnidadEjecutora(query, pgbl);\n    }\n\n    \/* Clear: Unidad Ejecutora  *\/\n    public void handleClearUnidadEjecutora() {\n        this.getEntity().setUnidadEjecutora(null);\n    }\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: Unidad Ejecutora   ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Tipo Actividad Riesgo   *******************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \n    \/* AutoComplete *\/\n    public Page&lt;TipoActividadRiesgo&gt; completeTipoActividadRiesgo(String query, Pageable pageable) {\n        return service.autoCompleteTipoActividadRiesgo(query, pageable);\n    }\n\n    \/* Clear: Tipo Actividad Riesgo  *\/\n    public void handleClearTipoActividadRiesgo() {\n        this.getEntity().setTipoActividadRiesgo(null);\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: Tipo Actividad Riesgo   *******************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Periodo Anual      ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n    \/* AutoComplete: Periodo Anual Inicial  *\/\n    public Page&lt;PeriodoAnual&gt; completePeriodoAnualInicial(String query, Pageable pageable) {\n        return service.autoCompletePeriodoAnualInicial(query, pageable);\n    }\n\n    \/* Clear: Periodo Anual Inicial  *\/\n    public void handleClearPeriodoAnualInicial() {\n        this.getEntity().setPeriodoAnualInicial(null);\n    }\n\n    \/* AutoComplete: Periodo Anual Final *\/\n    public Page&lt;PeriodoAnual&gt; completePeriodoAnualFinal(String query, Pageable pageable) {\n        return service.autoCompletePeriodoAnualFinal(query, pageable);\n    }\n\n    \/* Clear: Periodo Anual Final *\/\n    public void handleClearPeriodoAnualFinal() {\n        this.getEntity().setPeriodoAnualFinal(null);\n    }\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: Periodo Anual      ************************************\/\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>Vamos a agregarle el autowired para que pueda acceder al bean de BitacoraARR<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de TabView: ARR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear el TabView para mostrar la bitacora dentro de la actividad<\/li>\n\n\n\n<li>primero le agregamos el import necesario<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le agregamos el autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nBitacoraARRBean bitacoraARRBean;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y en el initDetails debemos indicarle que cargue la lista <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero que debemos hacer es ubicar el final del PanelGrid<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"894\" height=\"277\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_014.png\" alt=\"\" class=\"wp-image-14566\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_014.png 894w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_014-300x93.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_014-768x238.png 768w\" sizes=\"(max-width: 894px) 100vw, 894px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ya que es ah\u00ed donde debemos agregar el TabView<\/li>\n\n\n\n<li>Agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;p:tabView id=\"ARR_TabView\" activeIndex=\"#{actividadRespuestaRiesgoBean.activeTab}\"&gt;   \n\n        &lt;\/p:tabView&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Donde:\n<ul class=\"wp-block-list\">\n<li>id=\u00bbARR_TabView\u00bb: es un id que identifica el tabVieq<\/li>\n\n\n\n<li>activeIndex=\u00bb#{actividadRespuestaRiesgoBean.activeTab}\u00bb: establece en el Bean cual es el tab inicial <\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ACTIVEINDEX:\n<ul class=\"wp-block-list\">\n<li>Como se ve dentro de ActividadRespuestaRiesgoBean.java en la funci\u00f3n init(), se debe difinir cual es el n\u00famero del tab  inicial, com la siguiente instrucci\u00f3n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>this.activeTab = 0;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora este campo se encuentra definido por herencia de SIGESA dentro de \u00abCRUDImpl\u00bb<\/li>\n\n\n\n<li>Por tanto con solo que indiquemos el valor es suficiente<\/li>\n\n\n\n<li>Quedando as\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void init() {\n   this.activeTab = 0;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora para que se inicialice el componete<\/li>\n\n\n\n<li>en initDetails debemos agregar<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();<\/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    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora agregamos el import necesario<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le agregamos un Autowired para poder acceder al Bean de la bitacora<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nBitacoraARRBean bitacoraARRBean;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hacemos lo mismo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>this.activeTab = 0;\n\npublic void init() {\n   this.activeTab = 0;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora para que se inicialice el componente <\/li>\n\n\n\n<li>en el el InitDetail debemos agregar<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void initDetails() {\n        if (!isPostBack()) {\n            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));\n            bitacoraAMBean.init();\n        }\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora agregamos el import necesario<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\nimport org.springframework.beans.factory.annotation.Autowired;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le agregamos un Autowired para poder acceder al Bean de la bitacora<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    BitacoraAMBean bitacoraAMBean;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que ya sabemos cual es el tab que se va a mostrar<\/li>\n\n\n\n<li>Vamos a crearlo<\/li>\n\n\n\n<li>Con esto creamos el tab<\/li>\n\n\n\n<li>que tiene que estar despues del fin del panelForm<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++  TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;p:tab  id=\"bitacoraARRTab\" \n                    title=\"#{i18n.actividadRespuestaRiesgo_bitacoraARR_tab_label}\" &gt;\n\n            &lt;\/p:tab&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NOTA: Si requerimos que se muestre solo en ciertos casos podemmom utilizar un render como el siguiente, sin embargo aqu\u00ed no aplica<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>rendered=\"#{planOperativoBean.isTipoEtapaModificacion()}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ahora dentro de tab todos los elementos deben estar dentro de un outputPanel, por tanto le agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:outputPanel id =\"actividadRespuestaRiesgoOutputPanel\"&gt;\n\n&lt;\/p:outputPanel&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y finalmente le agregamos el componete \u00abdetailNoEditTableHorizontal\u00bb que permite listar el contenido de una tabla solo de consulta<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;components:detailNoEditTableHorizontal     id=\"actividadRespuestaRiesgoDetailNoEditTableHorizontal\"\n                                                                header=\"#{i18n.actividadRespuestaRiesgo_bitacoraARR_label}\"\n                                                                bean=\"#{bitacoraARRBean}\"\n                                                                masterBean=\"#{actividadRespuestaRiesgoBean}\"\n                                                                showNewButton=\"false\"\n                                                                showEditButton=\"false\"\n                                                                showDeleteButton=\"false\"\nshowActions=\"false\"\n                                                                container=\"ARR_TabView:\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FINAL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;p:tabView id=\"ARR_TabView\" activeIndex=\"#{actividadRespuestaRiesgoBean.activeTab}\"&gt;   \n\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++  TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;p:tab  id=\"bitacoraARRTab\" \n                    title=\"#{i18n.actividadRespuestaRiesgo_bitacoraARR_tab_label}\" &gt;\n\n                \n                &lt;p:outputPanel id =\"actividadRespuestaRiesgoOutputPanel\"&gt;\n\n                    &lt;!--####################################################################################--&gt;\n                    &lt;!--##########################   NO EDIT TABLE        ##################################--&gt;\n                    &lt;!--####################################################################################--&gt;\n                    &lt;components:detailNoEditTableHorizontal     id=\"actividadRespuestaRiesgoDetailNoEditTableHorizontal\"\n                                                                header=\"#{i18n.actividadRespuestaRiesgo_bitacoraARR_label}\"\n                                                                bean=\"#{bitacoraARRBean}\"\n                                                                masterBean=\"#{actividadRespuestaRiesgoBean}\"\n                                                                showNewButton=\"false\"\n                                                                showEditButton=\"false\"\n                                                                showDeleteButton=\"false\"\nshowActions=\"false\"\n                                                                container=\"ARR_TabView:\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n            &lt;\/p:tab&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n\n        &lt;\/p:tabView&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y finalmente debemos indicar que se ejecute el initDetails<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;f:event type=\"preRenderView\" listener=\"#{actividadRespuestaRiesgoBean.initDetails()}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Final<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************      PRERENDER     *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;ui:define name=\"preRender\"&gt;\n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadRespuestaRiesgoBean.find()}\" \/&gt;\n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadRespuestaRiesgoBean.initProperties()}\" \/&gt;\n        &lt;f:event type=\"preRenderView\" listener=\"#{planOperativoBean.initDetails()}\"\/&gt;\n    &lt;\/ui:define&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************  FIN PRERENDER     *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadMejoraEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que ya sabemos cual es el tab que se va a mostrar<\/li>\n\n\n\n<li>Vamos a crearlo<\/li>\n\n\n\n<li>Con esto creamos el tab<\/li>\n\n\n\n<li>que tiene que estar despues del fin del panelForm<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;p:tabView id=\"AM_TabView\" activeIndex=\"#{actividadMejoraBean.activeTab}\"&gt;   \n\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++  TAB: BITACORA AM      +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;p:tab  id=\"bitacoraAMTab\" \n                    title=\"#{i18n.actividadMejora_bitacoraAM_tab_label}\" &gt;\n\n                \n                &lt;p:outputPanel id =\"actividadMejoraOutputPanel\"&gt;\n\n                    &lt;!--####################################################################################--&gt;\n                    &lt;!--##########################   NO EDIT TABLE        ##################################--&gt;\n                    &lt;!--####################################################################################--&gt;\n                    &lt;components:detailNoEditTableHorizontal     id=\"actividadMejoraDetailNoEditTableHorizontal\"\n                                                                header=\"#{i18n.actividadMejora_bitacoraAM_label}\"\n                                                                bean=\"#{bitacoraAMBean}\"\n                                                                masterBean=\"#{actividadMejoraBean}\"\n                                                                showNewButton=\"false\"\n                                                                showEditButton=\"false\"\n                                                                showDeleteButton=\"false\"\nshowActions=\"false\"                                                               container=\"ARR_TabView:\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n            &lt;\/p:tab&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n\n        &lt;\/p:tabView&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y finalmente debemos indicar que se ejecute el initDetails<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.initDetails()}\"\/&gt;   <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Final<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;ui:define name=\"preRender\"&gt;\n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.find()}\"\/&gt;        \n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.initProperties()}\"\/&gt;    \n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.initDetails()}\"\/&gt;    \n    &lt;\/ui:define&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y con esto tenemos el tabView<\/li>\n<\/ul>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaci\u00f3n de BD relacionar ActividadRespuestaRiesgo-&gt;EstadoARR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear la siguiente relaci\u00f3n y vamos a isertar los datos correctos de los estados<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"764\" height=\"778\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_019.png\" alt=\"\" class=\"wp-image-14605\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_019.png 764w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_019-295x300.png 295w\" sizes=\"(max-width: 764px) 100vw, 764px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para esto ejecutamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*********************************************************************\n-- MODIFICACI\u00d3N TABLA: ACTIVIDAD_RESPUESTA_RIESGO\n--*********************************************************************\n\n-- ++++++++++++++++++++++++++++++++++\n--PASO1: LIMPIAR TABLA: BITACORA_ARR\n-- ++++++++++++++++++++++++++++++++++\nTRUNCATE TABLE PPI.BITACORA_ARR;\n\n-- ++++++++++++++++++++++++++++++++++\n--PASO2: LIMPIAR TABLA DE ESTADOS\n-- ++++++++++++++++++++++++++++++++++\nTRUNCATE TABLE PPI.ESTADO_ARR;\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO3: REINICIAR SECUENCIA\n-- ++++++++++++++++++++++++++++++++++\n\n-- Deteminar valor actual\nSELECT PPI.SQ_ESTADO_ARR.CURRVAL FROM DUAL;\n\n-- Modificamos la secuencia para que quede en 1\nALTER SEQUENCE PPI.SQ_ESTADO_ARR INCREMENT by -4;\n\n--Reiniciar la secuencia\nSELECT PPI.SQ_ESTADO_ARR.NEXTVAL FROM DUAL;\n\n--Establecemos el incremento\nALTER SEQUENCE PPI.SQ_ESTADO_ARR INCREMENT by 1;\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO4: INSERTAR ESTADOS \n-- ++++++++++++++++++++++++++++++++++\nINSERT INTO\nESTADO_ARR (\n            ID_ESTADO_ARR,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '1',\n            'En Proceso',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_ARR (\n            ID_ESTADO_ARR,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '2',\n            'Sin Iniciar',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_ARR (\n            ID_ESTADO_ARR,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '3',\n            'Descartada',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_ARR (\n            ID_ESTADO_ARR,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '4',\n            'Completado',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO5: AGREGAR COLUMNA ESTADO_ARR \n-- ++++++++++++++++++++++++++++++++++\n\n--Agregar COLUMNA ESTADO_ARR\nALTER TABLE PPI.ACTIVIDAD_RESPUESTA_RIESGO ADD ESTADO_ARR NUMBER (19,0);\n  \n\n-- Agregar llave foranea\nALTER TABLE PPI.ACTIVIDAD_RESPUESTA_RIESGO ADD CONSTRAINT FK_ACT_RES_RIE_EST_ARR FOREIGN KEY ( ESTADO_ARR ) REFERENCES PPI.ESTADO_ARR ( ID_ESTADO_ARR );\n\n-- Actualizar los registros de ACTIVIDAD_MEJORA para asignarles el estado 1 \"En Proceso\nUPDATE \"PPI\".ACTIVIDAD_RESPUESTA_RIESGO SET ESTADO_ARR='1';\n\n-- Establecer coluna ESTADO_ARR NOT NULL\nALTER TABLE \"PPI\".ACTIVIDAD_RESPUESTA_RIESGO MODIFY ( ESTADO_ARR NOT NULL);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Relaci\u00f3n ActividadMejora-&gt;Estado_AM<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ejecutamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*********************************************************************\n-- MODIFICACI\u00d3N TABLA: ACTIVIDAD_MEJORA\n--*********************************************************************\n\n-- ++++++++++++++++++++++++++++++++++\n--PASO1: LIMPIAR TABLA: BITACORA_AM\n-- ++++++++++++++++++++++++++++++++++\nTRUNCATE TABLE PPI.BITACORA_AM;\n\n-- ++++++++++++++++++++++++++++++++++\n--PASO2: LIMPIAR TABLA DE ESTADOS\n-- ++++++++++++++++++++++++++++++++++\nTRUNCATE TABLE PPI.ESTADO_AM;\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO3: REINICIAR SECUENCIA\n-- ++++++++++++++++++++++++++++++++++\n\n-- Deteminar valor actual\nSELECT PPI.SQ_ESTADO_AM.CURRVAL FROM DUAL;\n\n-- Modificamos la secuencia para que quede en 1\nALTER SEQUENCE PPI.SQ_ESTADO_AM INCREMENT by -2;\n\n--Reiniciar la secuencia\nSELECT PPI.SQ_ESTADO_AM.NEXTVAL FROM DUAL;\n\n--Establecemos el incremento\nALTER SEQUENCE PPI.SQ_ESTADO_AM INCREMENT by 1;\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO4: INSERTAR ESTADOS \n-- ++++++++++++++++++++++++++++++++++\nINSERT INTO\nESTADO_AM (\n            ID_ESTADO_AM,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '1',\n            'En Proceso',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_AM (\n            ID_ESTADO_AM,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '2',\n            'Sin Iniciar',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_AM (\n            ID_ESTADO_AM,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '3',\n            'Descartada',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\nINSERT INTO\nESTADO_AM (\n            ID_ESTADO_AM,\n            NOMBRE,\n            ACTIVO,\n            FECHA_CREACION,\n            USUARIO_CREACION,\n            FECHA_MODIFICACION,\n            USUARIO_MODIFICACION,\n            CAMPO_CONFIGURABLE,\n            VERSION) \nvalues (\n            '4',\n            'Completado',\n            '1',\n            SYSDATE,\n            '55998',\n            SYSDATE,\n            '55998',\n            null,\n            '0'\n);\nSELECT PPI.SQ_ESTADO_ARR.nextval  from dual;\n\n\n-- ++++++++++++++++++++++++++++++++++\n-- PASO5: AGREGAR COLUMNA ESTADO_AM \n-- ++++++++++++++++++++++++++++++++++\n\n--Agregar COLUMNA ESTADO_AM\nALTER TABLE PPI.ACTIVIDAD_MEJORA ADD ESTADO_AM NUMBER (19,0);\n  \n\n-- Agregar llave foranea\nALTER TABLE PPI.ACTIVIDAD_MEJORA ADD CONSTRAINT FK_ACT_MEJ_EST_AM FOREIGN KEY ( ESTADO_AM ) REFERENCES PPI.ESTADO_AM ( ID_ESTADO_AM );\n\n-- Actualizar los registros de ACTIVIDAD_MEJORA para asignarles el estado 1 \"En Proceso\"\nUPDATE \"PPI\".ACTIVIDAD_MEJORA SET ESTADO_AM='1';\n\n-- Establecer coluna ESTADO_AM NOT NULL\nALTER TABLE \"PPI\".ACTIVIDAD_MEJORA MODIFY ( ESTADO_AM NOT NULL);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Modificaci\u00f3n JPA: ActividadRespuestaRiesgo.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos mapeo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n    \/\/ MAPEO: ACTIVIDAD_RESPUESTA_RIESGO-&gt;ESTADO_ARR\n    \/\/ ***************************************\n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name = \"ESTADO_ARR\", nullable = false)\n    private EstadoARR estadoARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos get y set mapeo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n    \/\/ MAPEO: ACTIVIDAD_RESPUESTA_RIESGO-&gt;ESTADO_ARR\n    \/\/ ***************************************\n    public EstadoARR getEstadoARR() {\n        return estadoARR;\n    }\n\n    public void setEstadoARR(EstadoARR estadoARR) {\n        this.estadoARR = estadoARR;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n    \/\/ MAPEO: ACTIVIDAD_RESPUESTA_RIESGO-&gt;ESTADO_ARR\n    \/\/ ***************************************\n    @Transient\n    private String nombreEstadoARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos get y set trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ***************************************\n    \/\/ TRASIENT: ACTIVIDAD_RESPUESTA_RIESGO-&gt;ESTADO_ARR\n    \/\/ ***************************************\n\n    \/\/ ESTADO_ARR: GET Nombre\n    public String getNombreEstadoARR() {\n        nombreEstadoARR = \"\";\n        \n        if (estadoARR != null) {\n            nombreEstadoARR = estadoARR.getNombre();\n        }\n        \n        return nombreEstadoARR;\n    }\n    \/\/ ESTADO_ARR: SET Nombre\n    public void setNombreEstadoARR(String nombreEstadoARR) {\n        this.nombreEstadoARR = nombreEstadoARR;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Modificaci\u00f3n JPA: ActividadMejora.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos mapeo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name = \"ESTADO_AM\", nullable = false)\n    private EstadoAM estadoAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los get y set de mapeo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public EstadoAM getEstadoAM() {\n        return estadoAM;\n    }\n\n    public void setEstadoAM(EstadoAM estadoAM) {\n        this.estadoAM = estadoAM;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos el trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    @Transient\n    private String nombreEstadoAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Get y set trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public String getNombreEstadoAM() {\n        nombreEstadoAM = \"\";\n        \n        if (estadoAM != null) {\n            nombreEstadoAM = estadoAM.getNombre();\n        }\n        \n        return nombreEstadoAM;\n    }\n    public void setNombreEstadoAM(String nombreEstadoAM) {\n        this.nombreEstadoAM = nombreEstadoAM;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos agregarle el autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;\n\n@Autowired\nEstadoARRService estadoARRService;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ActividadMejoraServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;\n\n@Autowired\n    EstadoAMService estadoAMService;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de autocomplete<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos imports necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoARR&gt; seg\u00fan su nombre y la condici\u00f3n de activo\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoARR&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos import&#8217;s necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoAM&gt; seg\u00fan su nombre y la condici\u00f3n de activo\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoAM&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoARR&gt; seg\u00fan su nombre y la condici\u00f3n de activo\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoARR&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoAM&gt; seg\u00fan su nombre y la condici\u00f3n de activo\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoAM&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Ver {@link EstadoARRService#findAllByNombreIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoARR&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable) {\n\n        return repository.findAllByNombreIgnoreCaseLikeAndActivo(\"%\" + nombre + \"%\", activo, pageable);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Ver {@link EstadoAMService#findAllByNombreIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }\n     * \n     * @param nombre : nombre por buscar\n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoAM&gt; findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable) {\n\n        return repository.findAllByNombreIgnoreCaseLikeAndActivo(\"%\" + nombre + \"%\", activo, pageable);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n   \/**\n    * Definici\u00f3n autocomplete EstadoARR\n    * \n    * @param query : consulta del usuario\n    * @param pgbl : para paginaci\u00f3n\n    * @return \n    *\/\n   \/**********************************************************************\/\n   public Page&lt;EstadoARR&gt; autoCompleteEstadoARR(String query, Pageable pgbl);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n        * Definici\u00f3n autocomplete EstadoAM\n        * \n        * @param query : consulta del usuario\n        * @param pgbl : para paginaci\u00f3n\n        * @return \n        *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoAM&gt; autoCompleteEstadoAM(String query, Pageable pgbl);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    EstadoARRService estadoARRService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/*********** FUNCI\u00d3N: autoCompleteEstadoARR               *************\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoARR&gt; autoCompleteEstadoARR(String query, Pageable pgbl) {\n        return estadoARRService.findAllByNombreIgnoreCaseLikeAndActivo(query,Boolean.TRUE, pgbl);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    EstadoAMService estadoAMService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Ver {@link ActividadMejoraService#findAllByNombreIgnoreCaseLikeAndActivo }\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 14\/04\/2023\n     * @issue PPI-381  \n     * @param query\n     * @param pgbl\n     * @return Page&lt;EstadoAM&gt;\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoAM&gt; autoCompleteEstadoAM(String query, Pageable pgbl) {\n        return estadoAMService.findAllByNombreIgnoreCaseLikeAndActivo(query,Boolean.TRUE, pgbl);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Estado ARR         ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public Page&lt;EstadoARR&gt; completeEstadoARR(String query, Pageable pageable) {\n        return service.autoCompleteEstadoARR(query, pageable);\n    }\n\n\/* Clear: Estado ARR *\/\n    public void handleClearEstadoARR() {\n        this.getEntity().setEstadoARR(null);\n    }\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: Estado ARR         ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Page&lt;EstadoAM&gt; completeEstadoAM(String query, Pageable pageable) {\n        return service.autoCompleteEstadoAM(query, pageable);\n    }\n\/* Clear: Estado AM *\/\n    public void handleClearEstadoAM() {\n        this.getEntity().setEstadoAM(null);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################      ESTADO_ARR        ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel  id=\"actividadRespuestaRiesgo_estadoARR_OutputLabel\"\n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                            value=\"#{i18n.actividadRespuestaRiesgo_estadoARR_label}\"\/&gt;\n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel  id=\"actividadRespuestaRiesgo_estadoARR_OutputPanel\"&gt;\n                \n                &lt;!-- AUTOCOMPLETE --&gt;\n                &lt;una:autoCompletePaginator  id=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                            paginator=\"true\"\n                                            paginationRows=\"10\"\n                                            dropdown=\"true\"\n                                            value=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                            var=\"estadoARR\"\n                                            itemLabel=\"#{estadoARR.nombre}\"\n                                            itemValue=\"#{estadoARR}\"\n                                            completeMethod=\"#{actividadRespuestaRiesgoBean.completeEstadoARR}\"\n                                            converter=\"#{estadoARRBean.converter}\"\n                                            forceSelection=\"true\"\n                                            noSelectedOption=\"true\"\n                                            noSelectedLabel=\"#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}\"\n                                            onNoSelectedOption=\"#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}\"\n                                            size=\"40\"\n                                            scrollHeight=\"200\"\n                                            required=\"true\"&gt;\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"@this\"\/&gt;\n                        \n                &lt;\/una:autoCompletePaginator&gt;\n\n                &lt;!-- LOV --&gt;\n                &lt;!--components:dialogFrameworkData id=\"actividadRespuestaRiesgo_periodoAnualFinal_ListDialog\"\n                                                lOVBean=\"#{periodoAnualLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.periodoAnualFinal}\"\n                                                update=\"actividadRespuestaRiesgo_periodoAnualFinal_AutoComplete\"\n                                                methodName=\"findAllOrderByAnoDesc\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_periodoAnualFinal_lov_label}\"\/--&gt;\n\n                &lt;!--MENSAJE--&gt;\n                &lt;p:message  id=\"actividadRespuestaRiesgo_estadoARR_Message\" \n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\/&gt;\n            &lt;\/p:outputPanel&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadMejoraEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--  estado AM --&gt;\n                &lt;p:outputLabel id=\"estadoAMOutputLabel\"\n                               for=\"estadoAMAutoComplete\"\n                               value=\"#{i18n.actividadMejora_estadoAM_label}\"\/&gt;\n\n                &lt;p:outputPanel id=\"estadoAMOutputPanel\"&gt;\n                    &lt;una:autoCompletePaginator id=\"estadoAMAutoComplete\" \n                                               paginator=\"true\"\n                                               disabled=\"false\"\n                                               paginationRows=\"10\"\n                                               dropdown=\"true\"\n                                               value=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                               var=\"estadoAM\"\n                                               itemLabel=\"#{estadoAM.nombre}\"\n                                               itemValue=\"#{estadoAM}\"\n                                               completeMethod=\"#{actividadMejoraBean.completeEstadoAM}\"\n                                               converter=\"#{estadoAMBean.converter}\"\n                                               forceSelection=\"true\"\n                                               noSelectedOption=\"true\"\n                                               noSelectedLabel=\"#{i18n.actividadMejora_estadoAM_select_label}\"\n                                               onNoSelectedOption=\"#{actividadMejoraBean.handleClearEstadoAM()}\"\n                                               size=\"40\"\n                                               scrollHeight=\"200\"\n                                               required=\"true\"&gt;\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\/&gt;\n                    &lt;\/una:autoCompletePaginator&gt;\n                    &lt;!--components:dialogFrameworkData id=\"periodoAnualFinalListDialog\"\n                                                    lOVBean=\"#{periodoAnualLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.periodoAnualFinal}\"\n                                                    update=\"periodoAnualFinalAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_periodoAnualFinal_lov_label}\"\/--&gt;\n                &lt;\/p:outputPanel&gt;\n                &lt;p:outputPanel id=\"estadoAMMessageOutPutPanel\"&gt;\n                    &lt;p:message id=\"estadoAMMessage\" \n                               for=\"estadoAMAutoComplete\"\/&gt;\n                &lt;\/p:outputPanel&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de LOV<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRLOVBean.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.view.LOV;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOV;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;\n\n\n\/**********************************************************************\/\n\/*********************  DOCUMENTACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**\n * Spring LOVBean Session para la administraci\u00f3n de la entidad {@link EstadoARR}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fecha 14\/04\/2023\n *\/\n@Component\n@Scope(\"session\")\npublic class EstadoARRLOVBean extends LOVImpl&lt;EstadoARR, EstadoARRService&gt; implements LOV, Serializable {\n\n    public EstadoARRLOVBean() {\n\n    }\n\n    @PostConstruct\n    public void init() {\n\n        List&lt;LOVColumn&gt; columns = new ArrayList&lt;&gt;();\n\n        LOVColumn column1 = new LOVColumn(\"nombre\",             getI18n(\"estadoARR_nombre_label\"),            true);\n\n        columns.add(column1);\n\n        this.setTableColumns(columns);\n\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMLOVBean.java<\/h3>\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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\npackage cr.ac.una.cgi.sigesa.ppi.mcg.view.LOV;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOV;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;\n\n\/**********************************************************************\/\n\/*********************  DOCUMENTACI\u00d3N    ******************************\/\n\/**********************************************************************\/\n\/**\n * Spring LOVBean Session para la administraci\u00f3n de la entidad {@link EstadoAM}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @fecha 14\/04\/2023\n *\/\n@Component\n@Scope(\"session\")\npublic class EstadoAMLOVBean extends LOVImpl&lt;EstadoAM, EstadoAMService&gt; implements LOV, Serializable {\n\n    public EstadoAMLOVBean() {\n\n    }\n\n    @PostConstruct\n    public void init() {\n\n        List&lt;LOVColumn&gt; columns = new ArrayList&lt;&gt;();\n\n        LOVColumn column1 = new LOVColumn(\"nombre\",             getI18n(\"estadoAM_nombre_label\"),            true);\n\n        columns.add(column1);\n\n        this.setTableColumns(columns);\n\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoARR&gt; seg\u00fan la condici\u00f3n de activo\n     * \n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoARR&gt; findAllByActivo(Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoAM&gt; seg\u00fan la condici\u00f3n de activo\n     * \n     * @param activo : 1 = activo \/ 0 = Inactivo\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoAM&gt; findAllByActivo(Boolean activo, Pageable pageable);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.ArrayList;\nimport cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;\nimport java.util.Map;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoARR&gt; seg\u00fan la condici\u00f3n de activo para LOV\n     * \n     * @param filterSpecifications : filterSpecifications\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @param params: para envi\u00f3 de parametros del LOV\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoARR&gt; findAllByActivoLOV(ArrayList&lt;FilterSpecification&gt; filterSpecifications, Pageable pageable, Map&lt;String, Object&gt; params);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.ArrayList;\nimport cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;\nimport java.util.Map;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que retorna un Page&lt;EstadoAM&gt; seg\u00fan la condici\u00f3n de activo para LOV\n     * \n     * @param filterSpecifications : filterSpecifications\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @param params: para envi\u00f3 de parametros del LOV\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    public Page&lt;EstadoAM&gt; findAllByActivoLOV(ArrayList&lt;FilterSpecification&gt; filterSpecifications, Pageable pageable, Map&lt;String, Object&gt; params);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.ArrayList;\nimport cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;\nimport java.util.Map;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * M\u00e9todo que retorna un Page&lt;EstadoARR&gt; seg\u00fan la condici\u00f3n de activo para LOV\n     * \n     * @param filterSpecifications : filterSpecifications\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @param params: para envi\u00f3 de parametros del LOV\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoARR&gt; findAllByActivoLOV(ArrayList&lt;FilterSpecification&gt; filterSpecifications, Pageable pageable, Map&lt;String, Object&gt; params){\n        this.setFilterSpecifications(filterSpecifications);\n        return repository.findAllByActivo(Boolean.TRUE,pageable);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.ArrayList;\nimport cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;\nimport java.util.Map;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * M\u00e9todo que retorna un Page&lt;EstadoAM&gt; seg\u00fan la condici\u00f3n de activo para LOV\n     * \n     * @param filterSpecifications : filterSpecifications\n     * @param pageable : parametro utilizado para paginaci\u00f3n\n     * @param params: para envi\u00f3 de parametros del LOV\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @sice: 14\/04\/2023\n     * @Version: 1.0.0\n     * @modulo: PPI-MCG\n     * @issue: PPI-380\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public Page&lt;EstadoAM&gt; findAllByActivoLOV(ArrayList&lt;FilterSpecification&gt; filterSpecifications, Pageable pageable, Map&lt;String, Object&gt; params){\n        this.setFilterSpecifications(filterSpecifications);\n        return repository.findAllByActivo(Boolean.TRUE,pageable);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actulizamos el componente<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_estadoARR_ListDialog\"\n                                                lOVBean=\"#{estadoARRLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                                update=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                                methodName=\"findAllByActivoLOV\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}\"\/&gt;<\/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>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################      ESTADO_ARR        ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel  id=\"actividadRespuestaRiesgo_estadoARR_OutputLabel\"\n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                            value=\"#{i18n.actividadRespuestaRiesgo_estadoARR_label}\"\/&gt;\n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel  id=\"actividadRespuestaRiesgo_estadoARR_OutputPanel\"&gt;\n                \n                &lt;!-- AUTOCOMPLETE --&gt;\n                &lt;una:autoCompletePaginator  id=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                            paginator=\"true\"\n                                            paginationRows=\"10\"\n                                            dropdown=\"true\"\n                                            value=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                            var=\"estadoARR\"\n                                            itemLabel=\"#{estadoARR.nombre}\"\n                                            itemValue=\"#{estadoARR}\"\n                                            completeMethod=\"#{actividadRespuestaRiesgoBean.completeEstadoARR}\"\n                                            converter=\"#{estadoARRBean.converter}\"\n                                            forceSelection=\"true\"\n                                            noSelectedOption=\"true\"\n                                            noSelectedLabel=\"#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}\"\n                                            onNoSelectedOption=\"#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}\"\n                                            size=\"40\"\n                                            scrollHeight=\"200\"\n                                            required=\"true\"&gt;\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"@this\"\/&gt;\n                        \n                &lt;\/una:autoCompletePaginator&gt;\n\n                &lt;!-- LOV --&gt;\n                &lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_estadoARR_ListDialog\"\n                                                lOVBean=\"#{estadoARRLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                                update=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                                methodName=\"findAllByActivoLOV\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}\"\/&gt;\n\n                &lt;!--MENSAJE--&gt;\n                &lt;p:message  id=\"actividadRespuestaRiesgo_estadoARR_Message\" \n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\/&gt;\n            &lt;\/p:outputPanel&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadMejoraEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actualizamos el componente<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;components:dialogFrameworkData id=\"estadoAMListDialog\"\n                                                    lOVBean=\"#{estadoAMLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                                    update=\"estadoAMAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_estadoAM_lov_label}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FINAL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--  estado AM --&gt;\n                &lt;p:outputLabel id=\"estadoAMOutputLabel\"\n                               for=\"estadoAMAutoComplete\"\n                               value=\"#{i18n.actividadMejora_estadoAM_label}\"\/&gt;\n\n                &lt;p:outputPanel id=\"estadoAMOutputPanel\"&gt;\n                    &lt;una:autoCompletePaginator id=\"estadoAMAutoComplete\" \n                                               paginator=\"true\"\n                                               disabled=\"false\"\n                                               paginationRows=\"10\"\n                                               dropdown=\"true\"\n                                               value=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                               var=\"estadoAM\"\n                                               itemLabel=\"#{estadoAM.nombre}\"\n                                               itemValue=\"#{estadoAM}\"\n                                               completeMethod=\"#{actividadMejoraBean.completeEstadoAM}\"\n                                               converter=\"#{estadoAMBean.converter}\"\n                                               forceSelection=\"true\"\n                                               noSelectedOption=\"true\"\n                                               noSelectedLabel=\"#{i18n.actividadMejora_estadoAM_select_label}\"\n                                               onNoSelectedOption=\"#{actividadMejoraBean.handleClearEstadoAM()}\"\n                                               size=\"40\"\n                                               scrollHeight=\"200\"\n                                               required=\"true\"&gt;\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\/&gt;\n                    &lt;\/una:autoCompletePaginator&gt;\n                    &lt;components:dialogFrameworkData id=\"estadoAMListDialog\"\n                                                    lOVBean=\"#{estadoAMLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                                    update=\"estadoAMAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_estadoAM_lov_label}\"\/&gt;\n                &lt;\/p:outputPanel&gt;\n                &lt;p:outputPanel id=\"estadoAMMessageOutPutPanel\"&gt;\n                    &lt;p:message id=\"estadoAMMessage\" \n                               for=\"estadoAMAutoComplete\"\/&gt;\n                &lt;\/p:outputPanel&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de parametros Estados<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear los parametros que van a almacear los diferentes estados<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos los siguientes parametros en SIGESA<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th><strong>Parametro<\/strong><\/th><th><strong>Valor Desarrollo<\/strong><\/th><th><strong>Valor Producci\u00f3n<\/strong><\/th><\/tr><tr><td>param_ppi_mcg_actividadRespuestaRiesgo_estado_sinIniciar<\/td><td>2<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadRespuestaRiesgo_estado_enProceso<\/td><td>1<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadRespuestaRiesgo_estado_completado<\/td><td>4<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadRespuestaRiesgo_estado_implementada<\/td><td>23<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadRespuestaRiesgo_estado_descartada<\/td><td>3<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos metodos que permitan obtener estos parametros<\/li>\n\n\n\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sdkuna.domain.Parametro;\nimport cr.ac.una.cgi.sdkuna.service.ParametroService;\nimport org.springframework.beans.factory.annotation.Autowired;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nprivate ParametroService parametroService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto vamos a poder agregar los siguientes metodos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que obtiene el esatdo ARR por tipo de parametro.\n     *\n     * @param parametro\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR segun parametro\n     *\/\n    public EstadoARR findEstadoARRByParametro(Parametro parametro) {\n        try {\n            return findOne(Long.valueOf(parametro.getValor()));\n        } catch (Exception ex) {\n            return null;\n        }\n    }\n\n    \/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRSinIniciar() {\n        return findEstadoARRByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadRespuestaRiesgo_estado_sinIniciar\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARREnProceso() {\n        return findEstadoARRByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadRespuestaRiesgo_estado_enProceso\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado completado.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRCompletado() {\n        return findEstadoARRByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadRespuestaRiesgo_estado_completado\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRImplementada() {\n        return findEstadoARRByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadRespuestaRiesgo_estado_implementada\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRDescartada() {\n        return findEstadoARRByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadRespuestaRiesgo_estado_descartada\"));\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoARRService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la definiciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRSinIniciar();\n\n    \/**\n     * Definici\u00f3n que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARREnProceso();\n\n    \/**\n     * Definici\u00f3n que obtiene el estado completado.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRCompletado();\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRImplementada();\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRDescartada();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Parametros EstadoAM<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los sigioentes parametros en desarrollo y producci\u00f3n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th><strong>Par\u00e1metro<\/strong><\/th><th><strong>Valor Desarrollo<\/strong><\/th><th><strong>Valor Producci\u00f3n<\/strong><\/th><\/tr><tr><td>param_ppi_mcg_actividadMejora_estado_sinIniciar<\/td><td>2<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadMejora_estado_enProceso<\/td><td>1<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadMejora_estado_completado<\/td><td>4<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadMejora_estado_implementada<\/td><td>22<\/td><td>&nbsp;<\/td><\/tr><tr><td>param_ppi_mcg_actividadMejora_estado_descartada<\/td><td>3<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos metodos que permitan obtener estos parametros<\/li>\n\n\n\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sdkuna.domain.Parametro;\nimport cr.ac.una.cgi.sdkuna.service.ParametroService;\nimport org.springframework.beans.factory.annotation.Autowired;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nprivate ParametroService parametroService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto vamos a poder agregar los siguientes metodos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que obtiene el esatdo AM por tipo de parametro.\n     *\n     * @param parametro\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM segun parametro\n     *\/\n    public EstadoAM findEstadoAMByParametro(Parametro parametro) {\n        try {\n            return findOne(Long.valueOf(parametro.getValor()));\n        } catch (Exception ex) {\n            return null;\n        }\n    }\n\n    \/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMSinIniciar() {\n        return findEstadoAMByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadMejora_estado_sinIniciar\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMEnProceso() {\n        return findEstadoAMByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadMejora_estado_enProceso\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado completado.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMCompletado() {\n        return findEstadoAMByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadMejora_estado_completado\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMImplementada() {\n        return findEstadoAMByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadMejora_estado_implementada\"));\n    }\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMDescartada() {\n        return findEstadoAMByParametro(parametroService.findOneByLlave(\"param_ppi_mcg_actividadMejora_estado_descartada\"));\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">EstadoAMService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la definiciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMSinIniciar();\n\n    \/**\n     * Definici\u00f3n que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMEnProceso();\n\n    \/**\n     * Definici\u00f3n que obtiene el estado completado.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMCompletado();\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMImplementada();\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMDescartada();<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Justificaci\u00f3n<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a trabajar en la justificaci\u00f3n <\/li>\n\n\n\n<li>Esta justificaci\u00f3n pertenece a la entidad Bitacora y no al propio objeto <\/li>\n\n\n\n<li>Y va ser requerida cuando el usuario modifique el estado<\/li>\n\n\n\n<li>por tanto dentro del Bean vamos a crear una bandera que detemine si el usuario a modificado o no el estado<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************     VARIABLES        *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/\/ Variable para paso de parametros en LOV\n    private Map&lt;String, Object&gt; beanParams = new HashMap();\n\n\n\n    \/\/variable que detemina si se modific\u00f3 o no el estado\n    private Boolean existeCambioEstado;\n\n    \/\/Variable que almacena la justificaci\u00f3n de la Bitacora\n    private String justificacionBitacoraARR;\n\n    \/\/ Variable que almacena el estado Inicial para determinar si fue o no modificado\n    private EstadoARR estadoARRInicial;\n\n    \/\/ Variable para determinar si es una actividad nueva \n    private Boolean actividadNueva;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora le agregamos los respectivos get y set<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: existeCambioEstado   **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public Boolean isExisteCambioEstado() {\n        return this.existeCambioEstado;\n    }\n\n    public void setExisteCambioEstado(Boolean existeCambioEstado) {\n        this.existeCambioEstado = existeCambioEstado;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: existeCambioEstado   **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************   FUNCIONES: justificacionBitacoraARR   **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public String getJustificacionBitacoraARR() {\n        return justificacionBitacoraARR;\n    }\n\n    public void setJustificacionBitacoraARR(String justificacionBitacoraARR) {\n        this.justificacionBitacoraARR = justificacionBitacoraARR;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************** FIN  FUNCIONES: justificacionBitacoraARR  **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FUNCIONES: actividadNueva           **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public Boolean isActividadNueva() {\n        return this.actividadNueva;\n    }\n\n    public void setActividadNueva(Boolean actividadNueva) {\n        this.actividadNueva = actividadNueva;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/********************   FIN  FUNCIONES: actividadNueva          **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora con estas variables debemos inicializarlas en initDetails<\/li>\n\n\n\n<li>agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Si existe una entidad es una modificaci\u00f3n\n            if(this.getEntity().getId() != null){\n\n                \/\/ obtenemos el estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n                \n                \/\/ No es una actividad nueva\n                this.setActividadNueva(false);\n\n            \/\/Es una actividad Nueva\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            \/\/ Inicializamos la justificaci\u00f3n de bitacora en vaci\u00f3\n            this.setJustificacionBitacoraARR(\"\");\n\n            \/\/ Indicamos que no existe un cambio de estado\n            this.setExisteCambioEstado(false);<\/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    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n\n            \/\/ Si existe una entidad es una modificaci\u00f3n\n            if(this.getEntity().getId() != null){\n\n                \/\/ obtenemos el estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n                \n                \/\/ No es una actividad nueva\n                this.setActividadNueva(false);\n\n            \/\/Es una actividad Nueva\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            \/\/ Inicializamos la justificaci\u00f3n de bitacora en vaci\u00f3\n            this.setJustificacionBitacoraARR(\"\");\n\n            \/\/ Indicamos que no existe un cambio de estado\n            this.setExisteCambioEstado(false);\n\n\n            \/\/ Inicializar la lista de bitacora\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos la funci\u00f3n que se va a encargar de de actulizar la variable ExistejCambioEstado<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que actualiza el estado \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 18\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioEstado(){\n\n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoARRInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                this.setJustificacionBitacoraARR(\"\");\n                this.setExisteCambioEstado(false);\n            }else{\n                this.setExisteCambioEstado(true);\n            }\n        }else{\n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n        \n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a agregar el c\u00f3digo necesario para mostrar la justificaci\u00f3n<\/li>\n\n\n\n<li>Lo primero ser\u00eda aplicar el siguiente c\u00f3digo para cuando se seleccione un nuevo estado actualice la variable ExisteCambioEstado<\/li>\n\n\n\n<li>Por tanto dentro de autoCompletePaginator agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax event=\"itemSelect\" \n                                listener=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                update= \"@this,\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\n                                process=\"@this\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y para el LOV agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n                                                process=\"@this\"\n                                                action=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                                update=\"@this,\n                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora al LOV debemos agregarle los siguientes parametros para que mande a ejecutar el comando remoto<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updateEstadoAutoComplete()\"\nbeanFilters=\"#{actividadRespuestaRiesgoBean.beanParams}\"<\/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>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################      ESTADO_ARR        ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel  id=\"actividadRespuestaRiesgo_estadoARR_OutputLabel\"\n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                            value=\"#{i18n.actividadRespuestaRiesgo_estadoARR_label}\"\/&gt;\n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel  id=\"actividadRespuestaRiesgo_estadoARR_OutputPanel\"&gt;\n                \n                &lt;!-- AUTOCOMPLETE --&gt;\n                &lt;una:autoCompletePaginator  id=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                            paginator=\"true\"\n                                            paginationRows=\"10\"\n                                            dropdown=\"true\"\n                                            value=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                            var=\"estadoARR\"\n                                            itemLabel=\"#{estadoARR.nombre}\"\n                                            itemValue=\"#{estadoARR}\"\n                                            completeMethod=\"#{actividadRespuestaRiesgoBean.completeEstadoARR}\"\n                                            converter=\"#{estadoARRBean.converter}\"\n                                            forceSelection=\"true\"\n                                            noSelectedOption=\"true\"\n                                            noSelectedLabel=\"#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}\"\n                                            onNoSelectedOption=\"#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}\"\n                                            size=\"40\"\n                                            scrollHeight=\"200\"\n                                            required=\"true\"&gt;\n                        \n                        &lt;p:ajax event=\"itemSelect\" \n                                listener=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                update= \"@this,\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\n                                process=\"@this\"\/&gt;\n\n                        \n                &lt;\/una:autoCompletePaginator&gt;\n\n                &lt;!-- LOV --&gt;\n                &lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_estadoARR_ListDialog\"\n                                                lOVBean=\"#{estadoARRLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                                update=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}\"\n                                                oncomplete=\"updateEstadoAutoComplete()\"\n                                                beanFilters=\"#{actividadRespuestaRiesgoBean.beanParams}\"\n                                                methodName=\"findAllByActivoLOV\"\n                                                \/&gt;\n                &lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n                                                process=\"@this\"\n                                                action=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                                update=\"@this,\n                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\/&gt;\n\n                &lt;!--MENSAJE--&gt;\n                &lt;p:message  id=\"actividadRespuestaRiesgo_estadoARR_Message\" \n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\/&gt;\n            &lt;\/p:outputPanel&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos agregar el campo de justificaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################     JUSTIFICACION      ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            \n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel          id=\"actividadRespuestaRiesgo_justificacionOutputLabel\" \n                                    for=\"actividadRespuestaRiesgo_justificacionInputTextArea\" \n                                    value=\"#{i18n.actividadRespuestaRiesgo_justificacion_label}\"\n                                    rendered=\"#{!actividadRespuestaRiesgoBean.isActividadNueva()}\"\n                                    \/&gt;  \n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel          id=\"actividadRespuestaRiesgo_justificacionOutputPanel\"\n                                    rendered=\"#{!actividadRespuestaRiesgoBean.isActividadNueva()}\"&gt;\n\n                &lt;p:inputTextarea    id=\"actividadRespuestaRiesgo_justificacionInputTextArea\"\n                                    value=\"#{actividadRespuestaRiesgoBean.justificacionBitacoraARR}\"\n                                    counter=\"actividadRespuestaRiesgo_contador\"\n                                    cols=\"25\"\n                                    rows=\"4\"\n                                    maxlength=\"500\"\n                                    placeholder=\"#{i18n.actividadRespuestaRiesgo_justificacion_placeholder}\"\n                                    counterTemplate=\"{0} #{i18n.actividadRespuestaRiesgo_justificacion_remaining_label}\"\n                                    autoResize=\"false\" \n                                    disabled=\"#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"\n                                    required=\"#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"\n                                    \/&gt;\n                &lt;h:outputText       id=\"actividadRespuestaRiesgo_contador\"\/&gt;\n\n                &lt;p:message          id=\"actividadRespuestaRiesgo_justificacionMessage\" \n                                    for=\"actividadRespuestaRiesgo_justificacionInputTextArea\" \n                                    \/&gt;\n            &lt;\/p:outputPanel&gt;\n            \n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed es importante que:<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Va ser requerido si  existeCambioEstado esta en true<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>required=\"#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y esta deshabilitado si no hay cambio de estado<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>disabled=\"#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos aplicarle lo mismo a Actividad de Mejora<\/li>\n\n\n\n<li>Agregamos las variables<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>private Boolean existeCambioEstado;\n    private String justificacionBitacoraAM;\n    private EstadoAM estadoAMInicial;\n    private Boolean actividadNueva;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora le agregamos los respectivos get y set<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Boolean isExisteCambioEstado() {\n        return existeCambioEstado;\n    }\n\n    public void setExisteCambioEstado(Boolean existeCambioEstado) {\n        this.existeCambioEstado = existeCambioEstado;\n    }\n\n    \/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public String getJustificacionBitacoraAM() {\n        return justificacionBitacoraAM;\n    }\n\n    public void setJustificacionBitacoraAM(String justificacionBitacoraAM) {\n        this.justificacionBitacoraAM = justificacionBitacoraAM;\n    }\n\n    \/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Boolean isActividadNueva() {\n        return this.actividadNueva;\n    }\n\n    public void setActividadNueva(Boolean actividadNueva) {\n        this.actividadNueva = actividadNueva;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora con estas variables debemos inicializarlas en initDetails<\/li>\n\n\n\n<li>agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if(this.getEntity().getId() != null){\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n                 this.setActividadNueva(false);\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);<\/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>public void initDetails() {\n        if (!isPostBack()) {\n\n            if(this.getEntity().getId() != null){\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n                 this.setActividadNueva(false);\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n\n            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));\n            bitacoraAMBean.init();\n        }\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos la funci\u00f3n que se va a encargar de de actualizar la variable ExisteCambioEstado<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que actualiza el estado \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 18\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioEstado(){\n\n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoAMInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                this.setJustificacionBitacoraAM(\"\");\n                this.setExisteCambioEstado(false);\n            }else{\n                this.setExisteCambioEstado(true);\n            }\n        }else{\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n        \n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadMejoraEditForm.xhtml<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a agregar el c\u00f3digo necesario para mostrar la justificaci\u00f3n<\/li>\n\n\n\n<li>Lo primero ser\u00eda aplicar el siguiente c\u00f3digo para cuando se seleccione un nuevo estado actualice la variable ExisteCambioEstado<\/li>\n\n\n\n<li>Por tanto dentro de autoCompletePaginator agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax                event=\"itemSelect\" \n                                               listener=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                               update= \"@this,\n                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\n                                               process=\"@this\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y para el LOV agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n                                                    process=\"@this\"\n                                                    action=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                                    update=\"@this,\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora al LOV debemos agregarle los siguientes parametros para que mande a ejecutar el comando remoto<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updateEstadoAutoComplete()\"\nbeanFilters=\"#{actividadMejoraBean.beanParams}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>final<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--  estado AM --&gt;\n                &lt;p:outputLabel id=\"estadoAMOutputLabel\"\n                               for=\"estadoAMAutoComplete\"\n                               value=\"#{i18n.actividadMejora_estadoAM_label}\"\/&gt;\n\n                &lt;p:outputPanel id=\"estadoAMOutputPanel\"&gt;\n                    &lt;una:autoCompletePaginator id=\"estadoAMAutoComplete\" \n                                               paginator=\"true\"\n                                               disabled=\"false\"\n                                               paginationRows=\"10\"\n                                               dropdown=\"true\"\n                                               value=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                               var=\"estadoAM\"\n                                               itemLabel=\"#{estadoAM.nombre}\"\n                                               itemValue=\"#{estadoAM}\"\n                                               completeMethod=\"#{actividadMejoraBean.completeEstadoAM}\"\n                                               converter=\"#{estadoAMBean.converter}\"\n                                               forceSelection=\"true\"\n                                               noSelectedOption=\"true\"\n                                               noSelectedLabel=\"#{i18n.actividadMejora_estadoAM_select_label}\"\n                                               onNoSelectedOption=\"#{actividadMejoraBean.handleClearEstadoAM()}\"\n                                               size=\"40\"\n                                               scrollHeight=\"200\"\n                                               required=\"true\"&gt;\n                        \n                        &lt;p:ajax                event=\"itemSelect\" \n                                               listener=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                               update= \"@this,\n                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\n                                               process=\"@this\"\/&gt;\n\n                    &lt;\/una:autoCompletePaginator&gt;\n\n                    &lt;components:dialogFrameworkData id=\"estadoAMListDialog\"\n                                                    lOVBean=\"#{estadoAMLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                                    update=\"estadoAMAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_estadoAM_lov_label}\"\n                                                    oncomplete=\"updateEstadoAutoComplete()\"\n                                                    beanFilters=\"#{actividadMejoraBean.beanParams}\"\n                                                    \/&gt;\n                    \n                    &lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n                                                    process=\"@this\"\n                                                    action=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                                    update=\"@this,\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\/&gt;\n                &lt;\/p:outputPanel&gt;\n                &lt;p:outputPanel id=\"estadoAMMessageOutPutPanel\"&gt;\n                    &lt;p:message id=\"estadoAMMessage\" \n                               for=\"estadoAMAutoComplete\"\/&gt;\n                &lt;\/p:outputPanel&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos agregar el campo de justificaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--Justificaci\u00f3n--&gt;\n                &lt;p:outputLabel          id=\"actividadMejora_justificacionOutputLabel\" \n                                        for=\"actividadMejora_justificacionInputTextArea\" \n                                        value=\"#{i18n.actividadMejora_justificacion_label}\"\n                                        rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"\n                            \n                            \/&gt;  \n                &lt;p:outputPanel          id=\"actividadMejora_justificacionOutputPanel\"\n                                        rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"&gt;\n\n                    &lt;p:inputTextarea    id=\"actividadMejora_justificacionInputTextArea\"\n                                        value=\"#{actividadMejoraBean.justificacionBitacoraAM}\"\n                                        counter=\"actividadMejora_contador\"\n                                        cols=\"25\"\n                                        rows=\"4\"\n                                        maxlength=\"500\"\n                                        placeholder=\"#{i18n.actividadMejora_justificacion_placeholder}\"\n                                        counterTemplate=\"{0} #{i18n.actividadMejora_justificacion_remaining_label}\"\n                                        autoResize=\"false\" \n                                        disabled=\"#{!actividadMejoraBean.isExisteCambioEstado()}\"\n                                        required=\"#{actividadMejoraBean.isExisteCambioEstado()}\"\n                                \/&gt;\n                &lt;h:outputText       id=\"actividadMejora_contador\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n                &lt;p:message          id=\"actividadMejora_justificacionMessage\" \n                                    for=\"actividadMejora_justificacionInputTextArea\"\n                                    rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"\/&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Guardado en la BitacoraARR<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a iniciar en el proceso de crear un registro en bitacora<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear un servicio que permita guardar un registro de bitacora y lo agrege a la lista<\/li>\n\n\n\n<li>NOTA: como ARR contiene una lista de bitacora con solo agregar el registro a la lista al guardar se guardaran sus hijos<\/li>\n\n\n\n<li>Pero tenemos la situaci\u00f3n que la justificaci\u00f3n o pertenece a la entidad si no como una variale del bean<\/li>\n\n\n\n<li>Entonces para poder pasar al valor del Bean a Service debemos sobre escribir el m\u00e9todo de update para indcarle que agregue a la lista y continue guardando<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @Override\n    public String update(){\n        String form;\n       \n        \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n        service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);\n\n        form = super.update();\n\n        \/\/ Limpiamos la Justificaci\u00f3n\n        if(!this.justificacionBitacoraARR.isEmpty()){                 \n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n        }\n\n        return form;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto estamos pasando la justificaci\u00f3n del Bean al service<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los import necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;\nimport cr.ac.una.cgi.sdkuna.service.UsuarioService;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport java.util.Date;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los AutoWired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    EstadoARRService estadoARRService;\n\n    @Autowired\n    BitacoraARRService bitacoraARRService;\n\n    @Autowired\n    UsuarioService usuarioService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el m\u00e9todo para insertar registros en la bitacora<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \/*****************************      UPDATE         **************************************\/\n    \/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \n    \/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion){\n        BitacoraARR bitacoraARR = new BitacoraARR();\n        bitacoraARR.setActividadRespuestaRiesgo(actividadRespuestaRiesgo);\n        bitacoraARR.setEstadoARR(actividadRespuestaRiesgo.getEstadoARR());\n        bitacoraARR.setFecha(new Date());\n        bitacoraARR.setUsuario(usuarioService.getUsuarioActual());\n        bitacoraARR.setJustificacion(justificacion);\n        actividadRespuestaRiesgo.getListaBitacoraARR().add(bitacoraARR);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoARRService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos la definici\u00f3n del servicio<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y con esto al momento de actulizar se almacenar\u00e1 un registro en bitacora<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear un servicio que permita guardar un registro de bitacora y lo agrege a la lista<\/li>\n\n\n\n<li>NOTA: como AM contiene una lista de bitacora con solo agregar el registro a la lista al guardar se guardaran sus hijos<\/li>\n\n\n\n<li>Pero tenemos la situaci\u00f3n que la justificaci\u00f3n o pertenece a la entidad si no como una variale del bean<\/li>\n\n\n\n<li>Entonces para poder pasar al valor del Bean a Service debemos sobre escribir el m\u00e9todo de update para indcarle que agregue a la lista y continue guardando<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public String update(){\n        String form;\n       \n        \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n        service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);\n\n        form = super.update();\n\n        \/\/ Limpiamos la Justificaci\u00f3n\n        if(!this.justificacionBitacoraAM.isEmpty()){                 \n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n        }\n\n        return form;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto estamos pasando la justificaci\u00f3n del Bean al service<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los import necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;\nimport cr.ac.una.cgi.sdkuna.service.UsuarioService;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport java.util.Date;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos los AutoWired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    EstadoAMService estadoAMService;\n\n    @Autowired\n    BitacoraARRService bitacoraARRService;\n\n    @Autowired\n    UsuarioService usuarioService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el m\u00e9todo para insertar registros en la bitacora<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \/*****************************      UPDATE         **************************************\/\n    \/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \n    \/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    @Override\n    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion){\n        BitacoraARR bitacoraARR = new BitacoraARR();\n        bitacoraARR.setActividadRespuestaRiesgo(actividadRespuestaRiesgo);\n        bitacoraARR.setEstadoARR(actividadRespuestaRiesgo.getEstadoARR());\n        bitacoraARR.setFecha(new Date());\n        bitacoraARR.setUsuario(usuarioService.getUsuarioActual());\n        bitacoraARR.setJustificacion(justificacion);\n        actividadRespuestaRiesgo.getListaBitacoraARR().add(bitacoraARR);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraAMService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos la definici\u00f3n del servicio<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que crea un objetivo tipo BitacoraAM y lo agrega a listaBitacoraAM\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 19\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void creaBitacoraAMModificado(ActividadMejora actividadMejora, String justificacion);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y con esto al momento de actuliazar se almacenar\u00e1 un registro en bitacora<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaci\u00f3n de actividadMejoraEditForm.xhtml<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se solicita darle el correcto formato html al edit ya que se presenta de forma incorrecta<\/li>\n\n\n\n<li>Correccci\u00f3n<\/li>\n<\/ul>\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--&gt;\n\n&lt;!--********************************************************************************************--&gt;\n&lt;!--********************************************************************************************--&gt;\n&lt;!--*****************************   COMPOSICI\u00d3N   **********************************************--&gt;\n&lt;!--********************************************************************************************--&gt;\n&lt;!--********************************************************************************************--&gt;\n&lt;ui:composition template=\"\/templates\/crud.xhtml\"\n                xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\n                xmlns:f=\"http:\/\/java.sun.com\/jsf\/core\"\n                xmlns:h=\"http:\/\/java.sun.com\/jsf\/html\"\n                xmlns:p=\"http:\/\/primefaces.org\/ui\"\n                xmlns:ui=\"http:\/\/java.sun.com\/jsf\/facelets\"\n                xmlns:una=\"http:\/\/una.ac.cr\/ui\/components\"\n                xmlns:components=\"http:\/\/java.sun.com\/jsf\/composite\/components\"&gt;\n\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************      PRERENDER     *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;ui:define name=\"preRender\"&gt;\n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.find()}\"\/&gt;        \n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.initProperties()}\"\/&gt;    \n        &lt;f:event type=\"preRenderView\" listener=\"#{actividadMejoraBean.initDetails()}\"\/&gt;    \n    &lt;\/ui:define&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************  FIN PRERENDER     *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n\n\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************       TITLE        *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;ui:define name=\"title\"&gt;#{i18n.actividadMejora_edit_form_title}&lt;\/ui:define&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************   FIN TITLE        *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n\n\n    &lt;!--********************************************************************************************--&gt;\n    &lt;!--*****************************       DEFINE       *******************************************--&gt;\n    &lt;!--********************************************************************************************--&gt;\n    &lt;ui:define name=\"contentCRUD\"&gt;\n\n\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;components:toolbar editMode=\"true\" \n                            bean=\"#{actividadMejoraBean}\"\n                            listForm=\"actividadMejoraListForm\" \n                            editForm=\"actividadMejoraEditForm\"\n                            container=\"panelForm\" \/&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;una:panelForm  id=\"panelForm\"\n                        i18nKey=\"actividadMejora_edit_form_header\"\n                        binding=\"#{panelForm}\"\n                        header=\"#{i18n.actividadMejora_edit_form_header}\"&gt;\n\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++    INSTRUCTIONS     ++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;          \n            &lt;components:requiredInstructions focus=\"panelForm\" \/&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++  FIN INSTRUCTIONS     +++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--######################## CAMPO OCULTO PARA VALIDACI\u00d3N   ############################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--Entrada oculta para validaciones--&gt;\n            &lt;h:inputHidden id=\"actividadMejoraValidator\" value=\"true\" &gt;\n                &lt;f:attribute name=\"actividadMejora\" value=\"#{actividadMejoraBean.entity}\"\/&gt;\n                &lt;f:validator binding=\"#{actividadMejoraValidator}\"\/&gt;\n            &lt;\/h:inputHidden&gt; \n            &lt;!--####################################################################################--&gt;\n            &lt;!--###################  FIN CAMPO OCULTO PARA VALIDACI\u00d3N   ############################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++++    PANELGRID       +++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;h:panelGrid columns=\"2\" styleClass=\"una-panelgrid\"&gt;                              \n\n                &lt;!--####################################################################################--&gt;\n                &lt;!--#############################    C\u00d3DIGO    #########################################--&gt;\n                &lt;!--####################################################################################--&gt;\n                \n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"codigoActividadMejoraOutputLabel\" \n                                for=\"codigoActividadMejoraInputText\" \n                                value=\"#{i18n.actividadMejora_codigo_label}\"\/&gt;  \n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel  id=\"codigoActividadMejoraOutputPanel\"&gt;\n\n                    &lt;p:inputText    id=\"codigoActividadMejoraInputText\" \n                                    value=\"#{actividadMejoraBean.entity.codigo}\" \n                                    required=\"false\" \n                                    maxlength=\"30\" \n                                    size=\"30\" \n                                    disabled=\"true\"\n                                 \/&gt;   \n\n                    &lt;p:message  id=\"codigoActividadMejoraMessage\" \n                                for=\"codigoActividadMejoraInputText\" \/&gt;  \n\n                &lt;\/p:outputPanel&gt;\n                \n                \n                &lt;!--####################################################################################--&gt;\n                &lt;!--#############################   DESCRIPCI\u00d3N  #######################################--&gt;\n                &lt;!--####################################################################################--&gt;\n                \n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"descripcionActividadMejoraOutputLabel\" \n                                for=\"descripcionActividadMejoraInputTextArea\" \n                                value=\"#{i18n.actividadMejora_descripcion_label}\"\/&gt; \n                \n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel  id=\"descripcionActividadMejoraOutputPanel\"&gt;\n\n                    &lt;p:inputTextarea    id=\"descripcionActividadMejoraInputTextArea\"\n                                        value=\"#{actividadMejoraBean.entity.descripcion}\"\n                                        counter=\"contador1\"\n                                        cols=\"70\"\n                                        rows=\"4\"\n                                        maxlength=\"500\"\n                                        placeholder=\"#{i18n.actividadMejora_descripcionplaceholder}\"\n                                        counterTemplate=\"{0} #{i18n.actividadMejora_caracteresRestantes_label}\"\n                                        autoResize=\"false\"\n                                        disabled=\"false\"\/&gt;  \n                    &lt;h:outputText   id=\"contador1\"\/&gt;\n\n                    &lt;p:message  id=\"descripcionActividadMejoraMessage\" \n                                for=\"descripcionActividadMejoraInputTextArea\" \/&gt; \n                &lt;\/p:outputPanel&gt;\n                \n                \n                \n                \n                &lt;!--####################################################################################--&gt;\n                &lt;!--#####################   UNIDAD EJECUTORA: AUTOCOMPLETE Y LOV #######################--&gt;\n                &lt;!--####################################################################################--&gt;\n                \n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"unidadEjecutoraOutputLabel\"\n                                for=\"unidadEjecutoraAutoComplete\"\n                                value=\"#{i18n.actividadMejora_nombreUnidadEjecutora_label}\"\/&gt;\n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel  id=\"unidadEjecutoraOutputPanel\"&gt;\n                    &lt;una:autoCompletePaginator  id=\"unidadEjecutoraAutoComplete\"\n                                                paginator=\"true\"\n                                                paginationRows=\"10\"\n                                                dropdown=\"true\"\n                                                value=\"#{actividadMejoraBean.entity.unidadEjecutora}\"\n                                                var=\"unidadEjecutora\"\n                                                itemLabel=\"#{unidadEjecutora.codigo}\"\n                                                itemValue=\"#{unidadEjecutora}\"\n                                                completeMethod=\"#{actividadMejoraBean.completeUnidadEjecutora}\"\n                                                converter=\"#{unidadEjecutoraBean.converter}\"\n                                                forceSelection=\"true\"\n                                                disabled=\"false\"\n                                                noSelectedOption=\"true\"\n                                                noSelectedLabel=\"#{i18n.actividadMejora_unidadEjecutora_select_label}\"\n                                                onNoSelectedOption=\"#{actividadMejoraBean.handleClearUnidadEjecutora()}\"\n                                                size=\"40\"\n                                                scrollHeight=\"200\"\n                                                required=\"true\"&gt;\n\n                        &lt;p:ajax event=\"itemSelect\"\n                                update=\"@this, :#{p:resolveFirstComponentWithId('nombreUnidadInputText', view).clientId}\"\n                                process=\"@this\"&gt;     \n                        &lt;\/p:ajax&gt;\n\n                    &lt;\/una:autoCompletePaginator&gt;\n\n                    &lt;components:dialogFrameworkData id=\"unidadEjecutoraListDialog\"\n                                                    lOVBean=\"#{unidadEjecutoraLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.unidadEjecutora}\"\n                                                    disabled=\"false\"\n                                                    update=\"unidadEjecutoraAutoComplete\"  \n                                                    oncomplete=\"updateUnidadEjecutoraAutoComplete()\"\n                                                    title=\"#{i18n.actividadMejora_unidadEjecutora_lov_label}\"\/&gt;\n                    \n                    &lt;p:remoteCommand    name=\"updateUnidadEjecutoraAutoComplete\"\n                                        process=\"@this\"\n                                        update=\":#{p:resolveFirstComponentWithId('nombreUnidadInputText', view).clientId}\"\/&gt;\n\n                    &lt;p:message  id=\"unidadEjecutoraMessage\" \n                                for=\"unidadEjecutoraAutoComplete\"\/&gt;\n                    \n                &lt;\/p:outputPanel&gt;\n                \n                \n                &lt;!--####################################################################################--&gt;\n                &lt;!--#####################        UNIDAD EJECUTORA: DISPLAY       #######################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"nombreUnidadOutputLabel\" \n                                for=\"nombreUnidadInputText\"\n                                value=\"#{i18n.actividadMejora_nombreUnidad_select_label}\"\/&gt;\n                \n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel&gt;\n                    &lt;p:inputText    id=\"nombreUnidadInputText\"\n                                    disabled=\"true\"\n                                    value=\"#{actividadMejoraBean.entity.unidadEjecutora.nombre}\"\n                                    size=\"80\"\/&gt;\n\n                    &lt;p:message  id=\"nombreUnidadMessage\" \n                                for=\"nombreUnidadInputText\"\/&gt;\n                &lt;\/p:outputPanel&gt;\n                \n                \n                \n                &lt;!--####################################################################################--&gt;\n                &lt;!--########################## PERIODO ANUAL INICIAL  ##################################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"periodoAnualInicialOutputLabel\"\n                                for=\"periodoAnualInicialAutoComplete\"\n                                value=\"#{i18n.actividadMejora_periodoAnualInicial_label}\"\/&gt;\n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel  id=\"periodoAnualInicialOutputPanel\"&gt;\n                    &lt;una:autoCompletePaginator  id=\"periodoAnualInicialAutoComplete\"\n                                                paginator=\"true\"\n                                                paginationRows=\"10\"\n                                                dropdown=\"true\"\n                                                value=\"#{actividadMejoraBean.entity.periodoAnualInicial}\"\n                                                var=\"periodoAnualInicial\"\n                                                itemLabel=\"#{periodoAnualInicial.ano}\"\n                                                itemValue=\"#{periodoAnualInicial}\"\n                                                completeMethod=\"#{actividadMejoraBean.completePeriodoAnual}\"\n                                                converter=\"#{periodoAnualBean.converter}\"\n                                                forceSelection=\"true\"\n                                                noSelectedOption=\"true\"\n                                                noSelectedLabel=\"#{i18n.actividadMejora_periodoAnualInicial_select_label}\"\n                                                onNoSelectedOption=\"#{actividadMejoraBean.handleClearPeriodoAnualInicial()}\"\n                                                size=\"40\"\n                                                scrollHeight=\"200\"\n                                                required=\"true\"&gt;\n\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"periodoAnualInicialAutoComplete,periodoAnualFinalAutoComplete\"\/&gt;\n\n                    &lt;\/una:autoCompletePaginator&gt;\n\n                    &lt;components:dialogFrameworkData id=\"periodoAnualInicialListDialog\"\n                                                    lOVBean=\"#{periodoAnualLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.periodoAnualInicial}\"\n                                                    update=\"periodoAnualInicialAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_periodoAnualInicial_lov_label}\"\/&gt;\n\n                    &lt;p:message  id=\"periodoAnualInicialMessage\" \n                                for=\"periodoAnualInicialAutoComplete\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n                \n\n                &lt;!--####################################################################################--&gt;\n                &lt;!--########################## PERIODO ANUAL FINAL    ##################################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"periodoAnualFinalOutputLabel\"\n                                for=\"periodoAnualFinalAutoComplete\"\n                                value=\"#{i18n.actividadMejora_periodoAnualFinal_label}\"\/&gt;\n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel id=\"periodoAnualFinalOutputPanel\"&gt;\n\n                    &lt;una:autoCompletePaginator  id=\"periodoAnualFinalAutoComplete\" \n                                                paginator=\"true\"\n                                                disabled=\"false\"\n                                                paginationRows=\"10\"\n                                                dropdown=\"true\"\n                                                value=\"#{actividadMejoraBean.entity.periodoAnualFinal}\"\n                                                var=\"periodoAnualFinal\"\n                                                itemLabel=\"#{periodoAnualFinal.ano}\"\n                                                itemValue=\"#{periodoAnualFinal}\"\n                                                completeMethod=\"#{actividadMejoraBean.completePeriodoAnual}\"\n                                                converter=\"#{periodoAnualBean.converter}\"\n                                                forceSelection=\"true\"\n                                                noSelectedOption=\"true\"\n                                                noSelectedLabel=\"#{i18n.actividadMejora_periodoAnualFinal_select_label}\"\n                                                onNoSelectedOption=\"#{actividadMejoraBean.handleClearPeriodoAnualFinal()}\"\n                                                size=\"40\"\n                                                scrollHeight=\"200\"\n                                                required=\"true\"&gt;\n\n                        &lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\/&gt;\n\n                    &lt;\/una:autoCompletePaginator&gt;\n\n                    &lt;components:dialogFrameworkData id=\"periodoAnualFinalListDialog\"\n                                                    lOVBean=\"#{periodoAnualLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.periodoAnualFinal}\"\n                                                    update=\"periodoAnualFinalAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_periodoAnualFinal_lov_label}\"\/&gt;\n\n                    &lt;p:message  id=\"periodoAnualFinalMessage\" \n                                for=\"periodoAnualFinalAutoComplete\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n\n\n                &lt;!--####################################################################################--&gt;\n                &lt;!--##########################      ESTADO_AM         ##################################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"estadoAMOutputLabel\"\n                                for=\"estadoAMAutoComplete\"\n                                value=\"#{i18n.actividadMejora_estadoAM_label}\"\/&gt;\n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel id=\"estadoAMOutputPanel\"&gt;\n\n                    &lt;una:autoCompletePaginator  id=\"estadoAMAutoComplete\" \n                                                paginator=\"true\"\n                                                disabled=\"false\"\n                                                paginationRows=\"10\"\n                                                dropdown=\"true\"\n                                                value=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                                var=\"estadoAM\"\n                                                itemLabel=\"#{estadoAM.nombre}\"\n                                                itemValue=\"#{estadoAM}\"\n                                                completeMethod=\"#{actividadMejoraBean.completeEstadoAM}\"\n                                                converter=\"#{estadoAMBean.converter}\"\n                                                forceSelection=\"true\"\n                                                noSelectedOption=\"true\"\n                                                noSelectedLabel=\"#{i18n.actividadMejora_estadoAM_select_label}\"\n                                                onNoSelectedOption=\"#{actividadMejoraBean.handleClearEstadoAM()}\"\n                                                size=\"40\"\n                                                scrollHeight=\"200\"\n                                                required=\"true\"&gt;\n                        \n                        &lt;p:ajax     event=\"itemSelect\" \n                                    listener=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                    update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\n                                    process=\"@this\"\/&gt;\n\n                    &lt;\/una:autoCompletePaginator&gt;\n\n                    &lt;components:dialogFrameworkData id=\"estadoAMListDialog\"\n                                                    lOVBean=\"#{estadoAMLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.estadoAM}\"\n                                                    update=\"estadoAMAutoComplete\"                                                    \n                                                    title=\"#{i18n.actividadMejora_estadoAM_lov_label}\"\n                                                    oncomplete=\"updateEstadoAutoComplete()\"\n                                                    beanFilters=\"#{actividadMejoraBean.beanParams}\"\n                                                    \/&gt;\n                    \n                    &lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n                                                    process=\"@this\"\n                                                    action=\"#{actividadMejoraBean.actualizaExisteCambioEstado()}\"\n                                                    update=\"@this,\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}\"\/&gt;\n                    \n                        &lt;p:message  id=\"estadoAMMessage\" \n                                    for=\"estadoAMAutoComplete\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n                \n                            \n                &lt;!--####################################################################################--&gt;\n                &lt;!--##########################     JUSTIFICACION      ##################################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel          id=\"actividadMejora_justificacionOutputLabel\" \n                                        for=\"actividadMejora_justificacionInputTextArea\" \n                                        value=\"#{i18n.actividadMejora_justificacion_label}\"\n                                        rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"\n                            \n                            \/&gt;  \n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel          id=\"actividadMejora_justificacionOutputPanel\"\n                                        rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"&gt;\n\n                    &lt;p:inputTextarea    id=\"actividadMejora_justificacionInputTextArea\"\n                                        value=\"#{actividadMejoraBean.justificacionBitacoraAM}\"\n                                        counter=\"actividadMejora_contador\"\n                                        cols=\"25\"\n                                        rows=\"4\"\n                                        maxlength=\"500\"\n                                        placeholder=\"#{i18n.actividadMejora_justificacion_placeholder}\"\n                                        counterTemplate=\"{0} #{i18n.actividadMejora_justificacion_remaining_label}\"\n                                        autoResize=\"false\" \n                                        disabled=\"#{!actividadMejoraBean.isExisteCambioEstado()}\"\n                                        required=\"#{actividadMejoraBean.isExisteCambioEstado()}\"\n                                \/&gt;\n                    \n                    &lt;h:outputText       id=\"actividadMejora_contador\"\/&gt;\n\n                    &lt;p:message          id=\"actividadMejora_justificacionMessage\" \n                                        for=\"actividadMejora_justificacionInputTextArea\"\n                                        rendered=\"#{!actividadMejoraBean.isActividadNueva()}\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n                \n\n                &lt;!--####################################################################################--&gt;\n                &lt;!--##########################        ACTIVO          ##################################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"activoOutputLabel\" \n                                for=\"activoSelectBooleanCheckbox\"\/&gt;\n\n                \n                &lt;p:outputPanel  id=\"activoSelectOuputPanel\"&gt;\n\n                    &lt;p:selectBooleanCheckbox    id=\"activoSelectBooleanCheckbox\" \n                                                value=\"#{actividadMejoraBean.entity.activo}\"\n                                                itemLabel=\"#{i18n.actividadMejora_activo_label}\"&gt;\n                    &lt;\/p:selectBooleanCheckbox&gt;\n\n                    &lt;p:message  id=\"activoMessage\" \n                                for=\"activoSelectBooleanCheckbox\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n                &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n                &lt;!-- +++++++++++++++++++++++++  FIN PANELGRID       +++++++++++++++++++++++++++++++++++++++ --&gt;\n                &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n                \n\n            &lt;\/h:panelGrid&gt;\n\n\n\n\n            &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n            &lt;!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n            &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n            &lt;p:tabView id=\"AM_TabView\" activeIndex=\"#{actividadMejoraBean.activeTab}\"&gt;   \n\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- +++++++++++++++++++++++++  TAB: BITACORA AM      +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;p:tab  id=\"bitacoraAMTab\" \n                    title=\"#{i18n.actividadMejora_bitacoraAM_tab_label}\" &gt;\n\n                \n                &lt;p:outputPanel id =\"actividadMejoraOutputPanel\"&gt;\n\n                    &lt;!--####################################################################################--&gt;\n                    &lt;!--##########################   NO EDIT TABLE        ##################################--&gt;\n                    &lt;!--####################################################################################--&gt;\n                    &lt;components:detailNoEditTableHorizontal     id=\"actividadMejoraDetailNoEditTableHorizontal\"\n                                                                header=\"#{i18n.actividadMejora_bitacoraAM_label}\"\n                                                                bean=\"#{bitacoraAMBean}\"\n                                                                masterBean=\"#{actividadMejoraBean}\"\n                                                                showNewButton=\"false\"\n                                                                showEditButton=\"false\"\n                                                                showDeleteButton=\"false\"\n                                                                showActions=\"false\"\n                                                                container=\"AM_TabView:\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n            &lt;\/p:tab&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ --&gt;\n            &lt;!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --&gt;\n\n        &lt;\/p:tabView&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++--&gt;\n        &lt;!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--&gt;\n\n        &lt;\/una:panelForm&gt;\n\n        \n    &lt;\/ui:define&gt;\n&lt;\/ui:composition&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Modificaci\u00f3n fecha bitacora por fecha hora AM\/PM<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a modificar la fecha de la bitacora para que se presente como fecha y hora<\/li>\n\n\n\n<li>Para esto vamos a crear un trasient que permita mostrar la fecha con la hora<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARR.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>import<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.text.SimpleDateFormat;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Transient\nprivate String fechaHora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego le creamos el get<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public String getFechaHora() {\n\n        try {\n            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"dd\/MM\/yyyy hh:mm:ss aa\");\n            return simpleDateFormat.format(fecha); \n        }\n        catch (Exception e) {\n            return \"\";\n        }   \n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraARRBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos inidicarle al bean que utilice este campo en vez de la fecha<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ASERColumn column2 = new ASERColumn(\"fecha\",                            getI18n(\"bitacoraARR_fecha_label\"),                                 true);\nX\nASERColumn column2 = new ASERColumn(\"fechaHora\",                            getI18n(\"bitacoraARR_fecha_label\"),                                 true);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAM.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>import<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.text.SimpleDateFormat;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Transient\nprivate String fechaHora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>get<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public String getFechaHora() {\n\n        try {\n            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"dd\/MM\/yyyy hh:mm:ss aa\");\n            return simpleDateFormat.format(fecha); \n        }\n        catch (Exception e) {\n            return \"\";\n        }   \n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">BitacoraAMBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora le indicamos que utlice este campo en vez de fecha<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ASERColumn column2 = new ASERColumn(\"fecha\",                                getI18n(\"bitacoraAM_fecha_label\"),                        true);        \nX\nASERColumn column2 = new ASERColumn(\"fechaHora\",                                getI18n(\"bitacoraAM_fecha_label\"),                        true);        <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ordenar Lista bitacora ASER por fecha DESC<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para ordenar la bitacora por fecha hora en forma desendente<\/li>\n\n\n\n<li>Debemos agregar en el initDetails<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Import<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.Collections;\nimport java.util.Comparator;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregar funcion de ordenamiento<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Odernar descendente l2 -&gt; l1\n            final Comparator&lt;BitacoraARR&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraARR&gt;() {\n                public int compare(BitacoraARR l1, BitacoraARR l2) {\n                    return l2.getFechaHora().compareTo(l1.getFechaHora());\n                }\n            };\n\n            if (this.getEntity().getListaBitacoraARR() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n            }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Antes de la inicializaci\u00f3n de la lista<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Inicializar la lista de bitacora\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();<\/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    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n\n            \/\/ Si existe una entidad es una modificaci\u00f3n\n            if(this.getEntity().getId() != null){\n\n                \/\/ obtenemos el estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n                \n                \/\/ No es una actividad nueva\n                this.setActividadNueva(false);\n\n            \/\/Es una actividad Nueva\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            \/\/ Inicializamos la justificaci\u00f3n de bitacora en vaci\u00f3\n            this.setJustificacionBitacoraARR(\"\");\n\n            \/\/ Indicamos que no existe un cambio de estado\n            this.setExisteCambioEstado(false);\n\n\n            \n            \/\/ Odernar descendente l2 -&gt; l1\n            final Comparator&lt;BitacoraARR&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraARR&gt;() {\n                public int compare(BitacoraARR l1, BitacoraARR l2) {\n                    return l2.getFechaHora().compareTo(l1.getFechaHora());\n                }\n            };\n\n            if (this.getEntity().getListaBitacoraARR() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n            }\n\n            \/\/ Inicializar la lista de bitacora\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();\n\n\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.Collections;\nimport java.util.Comparator;<\/code><\/pre>\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>\/\/ Odernar descendente l2 -&gt; l1\n            final Comparator&lt;BitacoraAM&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraAM&gt;() {\n                public int compare(BitacoraAM l1, BitacoraAM l2) {\n                    return l2.getFechaHora().compareTo(l1.getFechaHora());\n                }\n            };\n\n            if (this.getEntity().getListaBitacoraAM() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n            }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Final<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void initDetails() {\n        if (!isPostBack()) {\n\n            if(this.getEntity().getId() != null){\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n                 this.setActividadNueva(false);\n            }else{\n                this.setActividadNueva(true);\n            }\n\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n\n\n            \/\/ Odernar descendente l2 -&gt; l1\n            final Comparator&lt;BitacoraAM&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraAM&gt;() {\n                public int compare(BitacoraAM l1, BitacoraAM l2) {\n                    return l2.getFechaHora().compareTo(l1.getFechaHora());\n                }\n            };\n\n            if (this.getEntity().getListaBitacoraAM() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n            }\n\n            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));\n            bitacoraAMBean.init();\n        }\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaci\u00f3n:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En este punto se corrigueron varios errores de programaci\u00f3n por lo que se corrigen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\n\/**********************************************************************\/\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUD;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport javax.annotation.PostConstruct;\nimport javax.faces.context.FacesContext;\nimport org.omnifaces.util.Ajax;\n\n\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\n\/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*\/\n\/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*\/\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.BitacoraARRService;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.TipoActividadRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;\n\n \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************     VARIABLES        *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/\/ Variable para paso de parametros en LOV\n    private Map&lt;String, Object&gt; beanParams = new HashMap();\n\n\n\n    \/\/variable que detemina si se modific\u00f3 o no el estado\n    private Boolean existeCambioEstado;\n\n    \/\/Variable que almacena la justificaci\u00f3n de la Bitacora\n    private String justificacionBitacoraARR;\n\n    \/\/ Variable que almacena el estado Inicial para determinar si fue o no modificado\n    private EstadoARR estadoARRInicial;\n\n\n    \/\/variable que detemina si es una actividad nueva o no\n    private Boolean actividadNueva;\n\n\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n\n            \/\/ Si existe una entidad es una modificaci\u00f3n\n            if(this.getEntity().getId() != null){\n\n                \/\/ obtenemos el estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n                \n                \/\/ Inidicamos que no es una actividad nueva\n                this.setActividadNueva(false);\n\n                \/\/ Limpiamos la justificaci\u00f3n\n                this.setJustificacionBitacoraARR(\"\");\n\n            \/\/Es una actividad Nueva\n            }else{\n                \/\/ Indicamos que es una actividad nueva\n                this.setActividadNueva(true);\n            }\n\n            \/\/ Indicamos que no existe un cambio de estado tanto para agregar como modificar\n            this.setExisteCambioEstado(false);\n\n\n            \/*********************************************\/\n            \/********* Lista de BITACORA *****************\/\n            \/*********************************************\/\n            if (this.getEntity().getListaBitacoraARR() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n            }\n\n            \/\/ Inicializar la lista de bitacora\n            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n            bitacoraARRBean.init();\n\n\n        }\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @Override\n    public String update(){\n        String form;\n       \n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoARRInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                this.setJustificacionBitacoraARR(\"\");\n                this.setExisteCambioEstado(false);\n\n            \/\/ Si son diferentes\n            }else{\n\n                \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);\n\n                \/\/ Ordenamos la lista\n                if (this.getEntity().getListaBitacoraARR() != null) {\n                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n                }\n\n                \/\/ obtenemos el nuevo estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n\n                \/\/ Limpiamos la Justificaci\u00f3n\n                if(!this.justificacionBitacoraARR.isEmpty()){                 \n                    this.setJustificacionBitacoraARR(\"\");\n                    this.setExisteCambioEstado(false);\n                }\n                Ajax.update(\"formMantenimiento\");\n\n                \n            }\n        }else{\n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n\n\n        form = super.update();\n\n        return form;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      ORDENAMIENTO                *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    final Comparator&lt;BitacoraARR&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraARR&gt;() {\n        public int compare(BitacoraARR l1, BitacoraARR l2) {\n            return l2.getFechaHora().compareTo(l1.getFechaHora());\n        }\n    };\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      ORDENAMIENTO                *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\n\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************   FUNCIONES: justificacionBitacoraARR   **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public String getJustificacionBitacoraARR() {\n        return justificacionBitacoraARR;\n    }\n\n    public void setJustificacionBitacoraARR(String justificacionBitacoraARR) {\n        this.justificacionBitacoraARR = justificacionBitacoraARR;\n    }\n\n    public Boolean isActividadNueva() {\n        return this.actividadNueva;\n    }\n\n    public void setActividadNueva(Boolean actividadNueva) {\n        this.actividadNueva = actividadNueva;\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************** FIN  FUNCIONES: justificacionBitacoraARR  **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n\n\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que actualiza el estado \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 18\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioEstado(){\n\n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoARRInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                this.setJustificacionBitacoraARR(\"\");\n                this.setExisteCambioEstado(false);\n            }else{\n                this.setExisteCambioEstado(true);\n            }\n        }else{\n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n        \n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################      ESTADO_ARR        ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel  id=\"actividadRespuestaRiesgo_estadoARR_OutputLabel\"\n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                            value=\"#{i18n.actividadRespuestaRiesgo_estadoARR_label}\"\/&gt;\n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel  id=\"actividadRespuestaRiesgo_estadoARR_OutputPanel\"&gt;\n                \n                &lt;!-- AUTOCOMPLETE --&gt;\n                &lt;una:autoCompletePaginator  id=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                            paginator=\"true\"\n                                            paginationRows=\"10\"\n                                            dropdown=\"true\"\n                                            value=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                            var=\"estadoARR\"\n                                            itemLabel=\"#{estadoARR.nombre}\"\n                                            itemValue=\"#{estadoARR}\"\n                                            completeMethod=\"#{actividadRespuestaRiesgoBean.completeEstadoARR}\"\n                                            converter=\"#{estadoARRBean.converter}\"\n                                            forceSelection=\"true\"\n                                            noSelectedOption=\"true\"\n                                            noSelectedLabel=\"#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}\"\n                                            onNoSelectedOption=\"#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}\"\n                                            size=\"40\"\n                                            scrollHeight=\"200\"\n                                            required=\"true\"&gt;\n                        \n                        &lt;p:ajax event=\"itemSelect\" \n                                listener=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                \n                                update= \"@this,\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\n                                \/&gt;\n\n                   \n                &lt;\/una:autoCompletePaginator&gt;\n\n                &lt;!-- LOV --&gt;\n                &lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_estadoARR_ListDialog\"\n                                                lOVBean=\"#{estadoARRLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.estadoARR}\"\n                                                update=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}\"\n                                                oncomplete=\"updateEstadoAutoComplete()\"\n                                                beanFilters=\"#{actividadRespuestaRiesgoBean.beanParams}\"\n                                                methodName=\"findAllByActivoLOV\"\n                                                \/&gt;\n                &lt;p:remoteCommand name=\"updateEstadoAutoComplete\"\n            \n                                                action=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}\"\n                                                update= \"@this,\n                                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}\"\/&gt;\n\n                &lt;!--MENSAJE--&gt;\n                &lt;p:message  id=\"actividadRespuestaRiesgo_estadoARR_Message\" \n                            for=\"actividadRespuestaRiesgo_estadoARR_AutoComplete\"\/&gt;\n            &lt;\/p:outputPanel&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--##########################     JUSTIFICACION      ##################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            \n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel          id=\"actividadRespuestaRiesgo_justificacionOutputLabel\" \n                                    for=\"actividadRespuestaRiesgo_justificacionInputTextArea\" \n                                    value=\"#{i18n.actividadRespuestaRiesgo_justificacion_label}\"\n                                    rendered=\"#{!actividadRespuestaRiesgoBean.isActividadNueva()}\"\n                                    \/&gt;  \n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel          id=\"actividadRespuestaRiesgo_justificacionOutputPanel\"\n                                    rendered=\"#{!actividadRespuestaRiesgoBean.isActividadNueva()}\"&gt;\n\n                &lt;p:inputTextarea    id=\"actividadRespuestaRiesgo_justificacionInputTextArea\"\n                                    value=\"#{actividadRespuestaRiesgoBean.justificacionBitacoraARR}\"\n                                    counter=\"actividadRespuestaRiesgo_contador\"\n                                    cols=\"25\"\n                                    rows=\"4\"\n                                    maxlength=\"500\"\n                                    placeholder=\"#{i18n.actividadRespuestaRiesgo_justificacion_placeholder}\"\n                                    counterTemplate=\"{0} #{i18n.actividadRespuestaRiesgo_justificacion_remaining_label}\"\n                                    autoResize=\"false\" \n                                    disabled=\"#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"\n                                    required=\"#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}\"\n                                    \/&gt;\n                &lt;h:outputText       id=\"actividadRespuestaRiesgo_contador\"\/&gt;\n\n                &lt;p:message          id=\"actividadRespuestaRiesgo_justificacionMessage\" \n                                    for=\"actividadRespuestaRiesgo_justificacionInputTextArea\" \n                                    \/&gt;\n            &lt;\/p:outputPanel&gt;\n            \n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sdkuna.view.commons.CRUD;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadMejoraService;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;\n\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.stereotype.Component;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.omnifaces.util.Ajax;\n\n\nprivate Boolean existeCambioEstado;\n    private String justificacionBitacoraAM;\n    private EstadoAM estadoAMInicial;\n    private Boolean actividadNueva;\n\n\n\/\/ Odernar descendente l2 -&gt; l1\n    final Comparator&lt;BitacoraAM&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraAM&gt;() {\n        public int compare(BitacoraAM l1, BitacoraAM l2) {\n            return l2.getFechaHora().compareTo(l1.getFechaHora());\n        }\n    };\n\n    public void initDetails() {\n        if (!isPostBack()) {\n\n            if(this.getEntity().getId() != null){\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n                this.setActividadNueva(false);\n                this.setJustificacionBitacoraAM(\"\");\n\n            }else{\n                this.setActividadNueva(true);\n            }\n            this.setExisteCambioEstado(false);\n\n            if (this.getEntity().getListaBitacoraAM() != null) {\n                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n            }\n\n            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));\n            bitacoraAMBean.init();\n        }\n    }\n\n\n\n\n@Override\n    public String update(){\n        String form;\n       \n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoAMInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                this.setJustificacionBitacoraAM(\"\");\n                this.setExisteCambioEstado(false);\n\n            \/\/ Si son diferentes\n            }else{\n\n                \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n                service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);\n\n                \/\/ Ordenamos la lista\n                if (this.getEntity().getListaBitacoraAM() != null) {\n                    Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n                }\n\n                \/\/ obtenemos el nuevo estado Actual para luego compararlo\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n\n                \/\/ Limpiamos la Justificaci\u00f3n\n                if(!this.justificacionBitacoraAM.isEmpty()){                 \n                    this.setJustificacionBitacoraAM(\"\");\n                    this.setExisteCambioEstado(false);\n                }\n                Ajax.update(\"formMantenimiento\");\n\n                \n            }\n        }else{\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n\n        form = super.update();\n\n        return form;\n    }\n    \n\n\/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public String getJustificacionBitacoraAM() {\n        return justificacionBitacoraAM;\n    }\n\n    public void setJustificacionBitacoraAM(String justificacionBitacoraAM) {\n        this.justificacionBitacoraAM = justificacionBitacoraAM;\n    }\n\n    \/**\n     * PPI-380\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Boolean isActividadNueva() {\n        return this.actividadNueva;\n    }\n\n    public void setActividadNueva(Boolean actividadNueva) {\n        this.actividadNueva = actividadNueva;\n    }\n\n\n\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que actualiza el estado \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 18\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioEstado(){\n\n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoAMInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                this.setJustificacionBitacoraAM(\"\");\n                this.setExisteCambioEstado(false);\n            }else{\n                this.setExisteCambioEstado(true);\n            }\n        }else{\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n        \n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Validaciones<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para hacerla las validaciones \n<ul class=\"wp-block-list\">\n<li>El usuario administrador del m\u00f3dulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificaci\u00f3n de manera obligatoria.<\/li>\n\n\n\n<li>Al descartar una actividad pasa a estar inactivo el registro.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos una funci\u00f3n que nos determine si el estado es descartada <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/*********** VALIDACI\u00d3N: Estado ARR DESCARTADA            *************\/\n    \/**********************************************************************\/\n    \/**\n     * Metodo que determina si el EstadoARR pasado por parametro es igual a descartada\n     * Ver {@link ActividadRespuestaRiesgoService#esEstadoARRDescartada()) }\n     * \n     * @param estadoARR_descartada\n     * @return Boolean\n     *\/\n     @Override\n     public Boolean esEstadoARRDescartada(EstadoARR estadoARR_descartada) {\n\n        if(estadoARRService.obtenerEstadoARRDescartada().equals(estadoARR_descartada)){\n            return true;\n        }\n        return false;\n\n     }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/*********** VALIDACI\u00d3N: Estado ARR DESCARTADA            *************\/\n    \/**********************************************************************\/\n    \/**\n     * Definici\u00f3n que determina si el EstadoARR pasado por parametro es igual a descartada\n     * Ver {@link ActividadRespuestaRiesgoService#esEstadoARRDescartada()) }\n     * \n     * @param estadoARR_descartada\n     * @return Boolean\n     *\/\n    public Boolean esEstadoARRDescartada(EstadoARR estadoARR_descartada);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sdkuna.view.controller.AdjuntoController;\nimport cr.ac.una.cgi.sdkuna.view.controller.MessagesController;\nimport javax.faces.application.FacesMessage;\nimport javax.faces.validator.ValidatorException;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    AdjuntoController adjuntoController;\n\n    @Autowired\n    MessagesController messagesController;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y en la funci\u00f3n update agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/******************************************\/\n                \/**********  VALIDACI\u00d3N: descartada *******\/\n                \/******************************************\/\n                \/\/ PPI-380 \/ PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto\n                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){\n\n                    \/\/ Validar que tiene adjunto\n                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {\n                        this.errorMessage(\"actividadRespuestaRiesgo_falta_adjunto_error_summary\");\n                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, \"actividadRespuestaRiesgo_falta_adjunto_error_summary\", \"actividadRespuestaRiesgo_falta_adjunto_error_detail\"));\n                    }\n                    \/\/ Desactivar registro\n                    this.getEntity().setActivo(false);\n                }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Final<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @Override\n    public String update(){\n\n        String form;\n       \n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoARRInicial !=null){\n\n            \/\/ El estado Inicial es igual al actual\n            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                this.setJustificacionBitacoraARR(\"\");\n                this.setExisteCambioEstado(false);\n\n            \/\/ Si son diferentes\n            }else{\n\n                \/******************************************\/\n                \/**********  VALIDACI\u00d3N: descartada *******\/\n                \/******************************************\/\n                \/\/ PPI-380 \/ PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto\n                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){\n\n                    \/\/ Validar que tiene adjunto\n                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {\n                        this.errorMessage(\"actividadRespuestaRiesgo_falta_adjunto_error_summary\");\n                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, \"actividadRespuestaRiesgo_falta_adjunto_error_summary\", \"actividadRespuestaRiesgo_falta_adjunto_error_detail\"));\n                    }\n                    \/\/ Desactivar registro\n                    this.getEntity().setActivo(false);\n                }\n\n                \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);\n\n                \/\/ Ordenamos la lista\n                if (this.getEntity().getListaBitacoraARR() != null) {\n                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n                }\n\n                \/\/ obtenemos el nuevo estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n\n                \/\/ Limpiamos la Justificaci\u00f3n\n                if(!this.justificacionBitacoraARR.isEmpty()){                 \n                    this.setJustificacionBitacoraARR(\"\");\n                    this.setExisteCambioEstado(false);\n                }\n  \n            }\n        }else{\n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n            \n        }\n\n        form = super.update();\n\n        return form;\n    }\n\n    \n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de m\u00e9todo de calculo de porcentaje de avance<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero que vamos hacer es modificar la interfa para que cuando exista un cambio de periodo llame a un metodo que realice el calculo del promedio y ejecute las tareas respectivas<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionSpecs.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero que vamos hacer es crear un archivo de especificaci\u00f3n que nos devuelva una lista lista ordenada por fecha de etapa_plan ordenada DESC, para planes operativos activos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>package cr.ac.una.cgi.sigesa.ppi.ppo.specs;\n\nimport javax.persistence.criteria.CriteriaBuilder;\nimport javax.persistence.criteria.CriteriaQuery;\nimport javax.persistence.criteria.Expression;\nimport javax.persistence.criteria.Join;\nimport javax.persistence.criteria.Predicate;\nimport javax.persistence.criteria.Root;\n\nimport org.springframework.data.jpa.domain.Specification;\n\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.EtapaPlan;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ObjetivoPOA;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;\n\n\n\/**\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @version 0.0.1\n * 24\/04\/2023\n *\n *\/\npublic class MetaPoaEvaluacionSpecs {\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******       SPECIFICATION: actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals  ****************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n     SELECT \n        *\n        FROM PPI.META_POA_EVALUACION MPE\n\n        INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)\n\n        INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n        INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)\n\n        INNER JOIN PPI.META_POA_ACTIVIDAD_RIESGO MPAR ON (MPAR.META_POA = MP.ID_META_POA)\n        INNER JOIN PPI.ACTIVIDAD_RESPUESTA_RIESGO ARR ON (ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = MPAR.ACTIVIDAD_RESPUESTA_RIESGO)\n        WHERE\n        ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = 49 \n        AND\n        EP.PERIODO_ANUAL = 202\n            *\/\n    \n            public static Specification&lt;MetaPoaEvaluacion&gt; actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals(final ActividadRespuestaRiesgo actividadRespuestaRiesgo, final PeriodoAnual periodoAnual) {\n                return new Specification&lt;MetaPoaEvaluacion&gt;() {\n                    @Override\n                    public Predicate toPredicate(Root&lt;MetaPoaEvaluacion&gt; root, CriteriaQuery&lt;?&gt; cq,\n                            CriteriaBuilder cb) {\n        \n                        \/\/INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)\n                        Join&lt;EtapaPlan, MetaPoaEvaluacion&gt; joinEtapaPlan = root.join(\"etapaPlan\");\n        \n                        \/\/INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n                        Join&lt;MetaPoa, MetaPoaEvaluacion&gt; joinMetaPoa = root.join(\"metaPoa\");\n                        \n                        \/\/INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n                        Join&lt;ObjetivoPOA, MetaPoa&gt; joinObjetivoPOA = joinMetaPoa.join(\"objetivoPOA\");\n        \n                        \/\/INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)\n                        Join&lt;PlanOperativo, ObjetivoPOA&gt; joinPlanOperativo = joinObjetivoPOA.join(\"planOperativo\");\n        \n                        \n                        \/\/ INNER JOIN PPI.META_POA_ACTIVIDAD_RIESGO MPAR ON (MPAR.META_POA = MP.ID_META_POA)\n                        Join&lt;MetaPoaActividadRiesgo, MetaPoa&gt; joinMetaPoaActividadRiesgo = joinMetaPoa.join(\"listaMetaPoaActividadesRiesgo\");\n        \n                        \/\/ INNER JOIN PPI.ACTIVIDAD_RESPUESTA_RIESGO ARR ON (ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = MPAR.ACTIVIDAD_RESPUESTA_RIESGO\n                        Join&lt;ActividadRespuestaRiesgo, MetaPoaActividadRiesgo&gt; joinActividadRespuestaRiesgo = joinMetaPoaActividadRiesgo.join(\"actividadRespuestaRiesgo\");\n        \n                        if(actividadRespuestaRiesgo !=null &amp;&amp; periodoAnual != null){\n\n                                \/\/ Actividad Respuesta Riesgo Equals\n                                Expression arrExp = joinActividadRespuestaRiesgo.get(\"id\");\n                                Expression arrLit = cb.literal(actividadRespuestaRiesgo.getId());\n        \n                                \/\/ Plan Operativo Activo\n                                Expression planOperativoExp = joinPlanOperativo.get(\"activo\");\n                                Expression planOperativoLit = cb.literal(true);\n        \n                                \/\/ Periodo Anual Equals\n                                Expression periodoAnualExp = joinEtapaPlan.get(\"periodoAnual\");\n                                Expression periodoAnualLit = cb.literal(periodoAnual);\n                                \n                                \/\/ Ordenar por etapaPlan.fechaFinal descendente\n                                Expression fechaFinal = joinEtapaPlan.get(\"fechaFinal\");\n                                cq.orderBy(cb.desc(fechaFinal));\n\n        \n                                return cb.and(cb.equal(planOperativoExp, planOperativoLit),cb.equal(arrExp, arrLit),cb.equal(periodoAnualExp, periodoAnualLit));\n                        }\n                       \n                       return null;\n                        \n                    }\n                };\n            }\n            \/*************************************************************************************************\/\n            \/*************************************************************************************************\/\n            \/*************************************************************************************************\/\n            \/*************************************************************************************************\/\n            \/*************************************************************************************************\/\n\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos un servicio que utilice esta especificacion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definicion que retorna un list&lt;MetaPoaEvaluacion&gt; para un planOperativo activo\n     * Ver {@link MetaPoaEvaluacionService#findAllByByActividadRespuestaRiesgoAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }\n     * \n     * @param actividadRespuestaRiesgo \n     * @author: Gustavo Matamoros Gonz\u00e1lez\n     * @issue PPI-380 \/ PPI-381\n     * @param actividadRespuestaRiesgo\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    \/**********************************************************************\/\n    public List&lt;MetaPoaEvaluacion&gt; findAllByByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el m\u00e9todo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n  \/**\n   * M\u00e9todo que retorna un list&lt;MetaPoaEvaluacion&gt; para un planOperativo activo\n   * Ver {@link MetaPoaEvaluacionService#findAllByByActividadRespuestaRiesgoAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }\n   * \n   * @param actividadRespuestaRiesgo \n   * @author: Gustavo Matamoros Gonz\u00e1lez\n   * @issue PPI-380 \/ PPI-381\n   * @param actividadRespuestaRiesgo\n   * @param periodoAnual\n   * @return List&lt;MetaPoaEvaluacion&gt;\n   *\/\n  \/**********************************************************************\/\n  @Override\n  public List&lt;MetaPoaEvaluacion&gt; findAllByByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual) {\n      \n    \/\/ Definimos una variable de tipo especificacion MetaPoaEvaluacion\n    Specification&lt;MetaPoaEvaluacion&gt; specFinal;\n    \n    \/\/ Obtenemos la especificaci\u00f3n de actividadRespuestaRiesgoEquals\n    Specification specActividadRespuestaRiesgoEqualsAndPeriodoAnualEquals = MetaPoaEvaluacionSpecs.actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals(actividadRespuestaRiesgo, periodoAnual);\n\n    \n    \/\/ Creamos la especificaci\u00f3n final\n    specFinal = Specification.where(specActividadRespuestaRiesgoEqualsAndPeriodoAnualEquals);\n    \n    return repository.findAll(specFinal);\n  }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadRespuestaRiesgoEditForm.xhtml<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Periodo Inicial<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En periodo Inicial modificamos el ajax del autocomplete<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"@this\"\/&gt;<\/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>&lt;p:ajax event=\"itemSelect\" \n                                listener=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}\"\n                                process=\"@this\"\n                                update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}\"\n                                \/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y para el LOV vamos a agregar el siguiente remoteCommand<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand    name=\"updatePeriodoInicialAutoComplete\"\n                                    action=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}\"\n                                    update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y al components:dialogFrameworkData debemos agregarle <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updatePeriodoInicialAutoComplete()\"<\/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>&lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_periodoAnualInicial_ListDialog\"\n                                                lOVBean=\"#{periodoAnualLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.periodoAnualInicial}\"\n                                                update=\"actividadRespuestaRiesgo_periodoAnualInicial_AutoComplete\"\n                                                methodName=\"findAllOrderByAnoDesc\"\n                                                oncomplete=\"updatePeriodoInicialAutoComplete()\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_periodoAnualInicial_lov_label}\"\/&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Periodo Final<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos hacer lo mismo para el periodo final y asi poder evaluar la modificaci\u00f3n de ambos casos<\/li>\n\n\n\n<li>autocomplete modificamos este<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"@this\"\/&gt;<\/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>&lt;p:ajax     event=\"itemSelect\" \n                                listener=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}\"\n                                process=\"@this\"\n                                update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}\"\n                                \/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos el remoteCommand<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand    name=\"updatePeriodoFinalAutoComplete\"\n                                    action=\"#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}\"\n                                    update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y a components:dialogFrameworkData le agregamos <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updatePeriodoFinalAutoComplete()\"<\/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>&lt;components:dialogFrameworkData id=\"actividadRespuestaRiesgo_periodoAnualFinal_ListDialog\"\n                                                lOVBean=\"#{periodoAnualLOVBean}\"\n                                                target=\"#{actividadRespuestaRiesgoBean.entity.periodoAnualFinal}\"\n                                                update=\"actividadRespuestaRiesgo_periodoAnualFinal_AutoComplete\"\n                                                methodName=\"findAllOrderByAnoDesc\"\n                                                oncomplete=\"updatePeriodoFinalAutoComplete()\"\n                                                title=\"#{i18n.actividadRespuestaRiesgo_periodoAnualFinal_lov_label}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a agregar una progressBar para que muestre el porcentaje de avance, despues de los periodos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--####################################################################################--&gt;\n            &lt;!--##########################    PORCENTAJE EJECUCION     #############################--&gt;\n            &lt;!--####################################################################################--&gt;\n\n            &lt;!--LABEL--&gt;\n            &lt;p:outputLabel  id=\"actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel\"\n                            for=\"actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar\"\n                            value=\"#{i18n.actividadRespuestaRiesgo_porcentajeEjecucion_label}\"\n                            rendered=\"#{actividadRespuestaRiesgoBean.isHabilitarPorcentajeEjecucion()}\"\n                            style=\"vertical-align: top;\" \/&gt;\n\n            &lt;!--PANEL--&gt;\n            &lt;p:outputPanel  id=\"actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel\"\n                            rendered=\"#{actividadRespuestaRiesgoBean.isHabilitarPorcentajeEjecucion()}\" &gt;\n                \n                &lt;p:progressBar \n                        id=\"actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar\" \n                        value=\"#{actividadRespuestaRiesgoBean.porcentajeEjecucion}\" \n                        labelTemplate=\"#{actividadRespuestaRiesgoBean.porcentajeEjecucion}%\" \n                        style=\"width:350px; font-size:12px;background: #efefef;\"\n                        styleClass=\"#{actividadRespuestaRiesgoBean.styleProgressBar}\"\/&gt;\n\n                &lt;!--MENSAJE--&gt;\n                &lt;p:message  id=\"actividadRespuestaRiesgo_porcentajeEjecucion_Message\" \n                            for=\"actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar\"\/&gt;\n            &lt;\/p:outputPanel&gt;\n\n\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;\n            &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y ahora antes de la etiqueta de cierre de &lt;\/ui:define&gt; agregamos los estilos CSS necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;style&gt;\n\n            .colorBarraMenor50.ui-progressbar .ui-widget-header {\n                background-color: #ff3806 !important;\n                border: 1px solid #ff3806 !important;\n            }\n\n            .colorBarraMenor100.ui-progressbar .ui-widget-header {\n                background-color: #ffb006 !important;\n                border: 1px solid #ffb006 !important;\n            }\n\n            .colorBarra100.ui-progressbar .ui-widget-header {\n                background-color: #38a15b !important;\n                border: 1px solid #38a15b !important;\n            }\n            .ui-panelgrid-cell {\n                vertical-align: top;\n            }\n\n        &lt;\/style&gt;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"834\" height=\"617\" src=\"\/wp-content\/uploads\/2023\/04\/Seleccion_040.png\" alt=\"\" class=\"wp-image-14758\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_040.png 834w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_040-300x222.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/04\/Seleccion_040-768x568.png 768w\" sizes=\"(max-width: 834px) 100vw, 834px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos importes necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sdkuna.service.ParametroService;\nimport org.springframework.data.jpa.domain.Specification;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\nimport cr.ac.una.cgi.sigesa.epf.cpr.service.PeriodoAnualService;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPoaEvaluacionService;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Date;\nimport java.math.BigDecimal;\nimport java.math.RoundingMode;\n\nimport cr.ac.una.cgi.sigesa.ppi.mcg.specs.ActividadRespuestaRiesgoSpecs;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    MetaPoaEvaluacionService metaPoaEvaluacionService;\n@Autowired\n    ParametroService parametroService;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos una funci\u00f3n que obtenga una lista de MetaPoaEvaluacion segun ARR y PeriodoAnual<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \/*****************************    BITACORA         **************************************\/\n    \/****************************************************************************************\/\n    \/****************************************************************************************\/\n\/**\n     * Metodo que obtiene una List&lt;MetaPoaEvaluacion&gt; seg\u00fan una Actividad de Respuesta al Riesgo y un periodo\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/04\/2023\n     * @param actividadRespuestaRiesgo\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    @Override\n    public List&lt;MetaPoaEvaluacion&gt; obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual) {\n         return metaPoaEvaluacionService.findAllByByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo, periodoAnual);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>y seguido creammos una funci\u00f3n que calcule el porcentaje de ejecuci\u00f3n de la actividad<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que calcula el porcentaje de ejecuci\u00f3n de una actividad \n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/04\/2023\n     * @param actividadRespuestaRiesgo\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    @Override\n    public BigDecimal calculaPorcentajeEjecucionARR(ActividadRespuestaRiesgo actividadRespuestaRiesgo){\n\n        \/\/ Obtener el a\u00f1o inicial y final de la entidad\n        Integer annoInicial = actividadRespuestaRiesgo.getPeriodoAnualInicial().getAno();\n        Integer annoFinal = actividadRespuestaRiesgo.getPeriodoAnualFinal().getAno();\n\n        \/\/ Variable para obtener la cantidad de periodos seleccionados\n        Integer cantidadPeriodos = 0;\n\n        \/\/ Variable para obtener la totalidad de ejecucion de todos los periodos\n        BigDecimal totalEjecucionPeriodos = BigDecimal.ZERO;\n\n        \/\/ Creamos una lista temporal limpia\n        List&lt;MetaPoaEvaluacion&gt; listaMetaPoaEvaluacionPorPeriodo = new ArrayList&lt;&gt;();\n\n        \/\/NOTA: Obtener el a\u00f1o del periodo inicial de las evaluaciones esto por que inician a partir del a\u00f1o 2023\n        PeriodoAnual periodoInicialEvaluaciones = periodoAnualService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_mcg_periodoInicialEvaluacionesActividadesARRyAM\").getValor()));\n        \n        \/\/ Obtenemos el a\u00f1o del periodo\n        Integer annoInicialEvaluaciones = periodoInicialEvaluaciones.getAno();\n\n        \/\/ Determinar si annoInicial es menor al inicio de la evaluaciones \n        if (annoInicial &lt; annoInicialEvaluaciones){\n            annoInicial = annoInicialEvaluaciones;\n        }\n\n        \/\/ Recorrer los periodos anuales para obtener la \u00faltima evaluaci\u00f3n de cada periodo\n        for (int i = annoInicial; i &lt;= annoFinal; i++) {\n            \n            \/\/ limpiamos la lista\n            listaMetaPoaEvaluacionPorPeriodo.clear();\n\n            \/\/ Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente\n            listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo,periodoAnualService.findPeriodoAnualByAnno(i));\n\n            \/\/ Si la lista no esta vacia para el a\u00f1o existen evaluaciones \n            if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){\n                \n                \/\/ Se convierte a String\n                String strPorcentajeEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getEjecucion());\n\n                \/\/ Se convierte a BigDecimal con 2 digitos\n                BigDecimal montoEjecucion = new BigDecimal(strPorcentajeEvaluacion).setScale(2, BigDecimal.ROUND_HALF_EVEN);\n\n                \/\/ Obtenemos el primer elemento o la \u00faltima evaluacion y se lo sumamos al total\n                totalEjecucionPeriodos = totalEjecucionPeriodos.add(montoEjecucion);\n            }\n            \/\/ aumentamos la cantidad de periodos\n            cantidadPeriodos++;\n        }\n\n        \/\/ Si existe al menos un periodo\n        if(cantidadPeriodos &gt; 0){\n            BigDecimal cantidadPeriodosBD = new BigDecimal(cantidadPeriodos);\n\n            \/\/ Verificar la divisi\u00f3n de cero\n            if(totalEjecucionPeriodos.compareTo(BigDecimal.ZERO) == 0){\n                return totalEjecucionPeriodos;\n            \n            \/\/ Si existen valores\n            }else{\n                \/\/ eliminar decimales\n                return totalEjecucionPeriodos.divide(cantidadPeriodosBD,2,RoundingMode.CEILING);\n            }\n        }\n\n        return totalEjecucionPeriodos;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos las funciones para poder obtener los diferentes estados<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \/*****************************    ESTADOS ARR      **************************************\/\n    \/****************************************************************************************\/\n    \/****************************************************************************************\/\n    \n    \/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRSinIniciar() {\n        return estadoARRService.obtenerEstadoARRSinIniciar();\n    }\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARREnProceso() {\n        return estadoARRService.obtenerEstadoARREnProceso();\n    }\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRDescartada() {\n        return estadoARRService.obtenerEstadoARRDescartada();\n    }\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    @Override\n    public EstadoARR obtenerEstadoARRImplementada() {\n        return estadoARRService.obtenerEstadoARRImplementada();\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;\nimport java.math.BigDecimal;\nimport java.util.List;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos las definiciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que obtiene una List&lt;MetaPoaEvaluacion&gt; seg\u00fan una Actividad de Respuesta al Riesgo y un periodo\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/04\/2023\n     * @param actividadRespuestaRiesgo\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    public List&lt;MetaPoaEvaluacion&gt; obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual);\n\n    \/**\n     * Metodo que calcula el porcentaje de ejecuci\u00f3n de una actividad \n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/04\/2023\n     * @param actividadRespuestaRiesgo\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    public BigDecimal calculaPorcentajeEjecucionARR(ActividadRespuestaRiesgo actividadRespuestaRiesgo);\n\n    \/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRSinIniciar();\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARREnProceso();\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRDescartada();\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoARR\n     *\/\n    public EstadoARR obtenerEstadoARRImplementada();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;\n\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Variables, agregamos estas<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/variable que detemina si se debe habilitar o no la barra de progreso de porcentaje de Ejecucion\n    private Boolean habilitarPorcentajeEjecucion;\n\n    \/\/ variable que almacena el porcentaje de ejecuci\u00f3n de la actividad\n    private BigDecimal porcentajeEjecucion;\n\n    \/\/ Variable que almacena el nombre de la clase que se debe asignar al progressBar\n    private String styleProgressBar;<\/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    \/*************************************************************************************************\/\n    \/******************************     VARIABLES        *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/\/ Variable para paso de parametros en LOV\n    private Map&lt;String, Object&gt; beanParams = new HashMap();\n\n    \/\/variable que detemina si se modific\u00f3 o no el estado\n    private Boolean existeCambioEstado;\n\n    \/\/Variable que almacena la justificaci\u00f3n de la Bitacora\n    private String justificacionBitacoraARR;\n\n    \/\/ Variable que almacena el estado Inicial para determinar si fue o no modificado\n    private EstadoARR estadoARRInicial;\n\n    \/\/variable que detemina si es una actividad nueva o no\n    private Boolean actividadNueva;\n\n    \/\/variable que detemina si se debe habilitar o no el campo de Estado\n    private Boolean deshabilitarEstadoARR;\n\n    \/\/variable que detemina si se debe habilitar o no la barra de progreso de porcentaje de Ejecucion\n    private Boolean habilitarPorcentajeEjecucion;\n\n    \/\/ variable que almacena el porcentaje de ejecuci\u00f3n de la actividad\n    private BigDecimal porcentajeEjecucion;\n\n    \/\/ Variable que almacena el nombre de la clase que se debe asignar al progressBar\n    private String styleProgressBar;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modificamos la funcion initdetails<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void initDetails() {\n        if (!isPostBack()) {\n\n            \/\/ Si existe una entidad es una modificaci\u00f3n\n            if(this.getEntity().getId() != null){\n\n                \/\/ obtenemos el estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n                \n                \/\/ Inidicamos que no es una actividad nueva\n                this.setActividadNueva(false);\n\n                \/\/ Limpiamos la justificaci\u00f3n\n                this.setJustificacionBitacoraARR(\"\");\n\n                \/\/ Habilitar la selecci\u00f3n del estado\n                this.setDeshabilitarEstadoARR(false);\n\n                \/\/ habilitar porcentaje ejecucion\n                this.setHabilitarPorcentajeEjecucion(true);\n\n                \/\/ falta obtener el valor inicial\n                BigDecimal porcentaje = service.calculaPorcentajeEjecucionARR(this.getEntity());\n                this.setPorcentajeEjecucion(porcentaje);\n                this.determinarColorProgressBar(porcentaje);\n\n\n            \/\/Es una actividad Nueva\n            }else{\n                \/\/ Indicamos que es una actividad nueva\n                this.setActividadNueva(true);\n                \n                \/\/ Habilitar la selecci\u00f3n del estado\n                this.setDeshabilitarEstadoARR(false);\n\n                \/\/ Deshabilitar porcentaje ejecucion\n                this.setHabilitarPorcentajeEjecucion(false);\n\n\n            }\n\n            \/\/ Indicamos que no existe un cambio de estado tanto para agregar como modificar\n            this.setExisteCambioEstado(false);\n\n        }\n        \/*********************************************\/\n        \/********* Lista de BITACORA *****************\/\n        \/*********************************************\/\n        if (this.getEntity().getListaBitacoraARR() != null) {\n            Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n        }\n\n        \/\/ Inicializar la lista de bitacora\n        this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));\n        bitacoraARRBean.init();\n\n        \n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N  INITDETAILS        *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La funcion update <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************      FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    @Override\n    public String update(){\n\n        String form;\n       \n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoARRInicial !=null){\n\n            \/\/ El estado Inicial es igual al actual\n            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                this.setJustificacionBitacoraARR(\"\");\n                this.setExisteCambioEstado(false);\n                this.setDeshabilitarEstadoARR(false);\n\n            \/\/ Si son diferentes\n            }else{\n\n                \/******************************************\/\n                \/**********  VALIDACI\u00d3N: descartada *******\/\n                \/******************************************\/\n                \/\/ PPI-380 \/ PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto\n                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){\n\n                    \/\/ Validar que tiene adjunto\n                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {\n                        this.errorMessage(\"actividadRespuestaRiesgo_falta_adjunto_error_summary\",\"actividadRespuestaRiesgo_falta_adjunto_error_detail\");\n                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\"), getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\")));\n                    }\n                    \/\/ Desactivar registro\n                    this.getEntity().setActivo(false);\n                }\n\n                \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);\n\n                \/\/ Ordenamos la lista\n                if (this.getEntity().getListaBitacoraARR() != null) {\n                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n                }\n\n                \/\/ obtenemos el nuevo estado Actual para luego compararlo\n                this.estadoARRInicial = this.getEntity().getEstadoARR();\n\n                \/\/ Limpiamos la Justificaci\u00f3n\n                if(!this.justificacionBitacoraARR.isEmpty()){                 \n                    this.setJustificacionBitacoraARR(\"\");\n                    this.setExisteCambioEstado(false);\n                    this.setDeshabilitarEstadoARR(false);\n                }\n  \n            }\n        }else{\n            this.setJustificacionBitacoraARR(\"\");\n            this.setExisteCambioEstado(false);\n            this.setDeshabilitarEstadoARR(false);\n        }\n\n        form = super.update();\n\n        return form;\n    }\n\n    \n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******************************  FIN FUNCI\u00d3N UPDATE  *********************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos las funciones de procentaje de ejecuaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Porcentaje Ejecucion  *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public Boolean isHabilitarPorcentajeEjecucion() {\n        return habilitarPorcentajeEjecucion;\n    }\n\n    public void setHabilitarPorcentajeEjecucion(Boolean habilitarPorcentajeEjecucion) {\n        this.habilitarPorcentajeEjecucion = habilitarPorcentajeEjecucion;\n    }\n\n    public BigDecimal getPorcentajeEjecucion() {\n        return porcentajeEjecucion;\n    }\n    public void setPorcentajeEjecucion(BigDecimal porcentajeEjecucion) {\n        this.porcentajeEjecucion = porcentajeEjecucion;\n    }\n\n    public String getStyleProgressBar() {\n        return styleProgressBar;\n    }\n\n    public void setStyleProgressBar(String styleProgressBar) {\n        this.styleProgressBar = styleProgressBar;\n    }\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************    FIN  FUNCIONES: Porcentaje Ejecucion  *********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos las funciones de deshabilitar estadoARR<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************         FUNCIONES: Estado ARR         ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public Page&lt;EstadoARR&gt; completeEstadoARR(String query, Pageable pageable) {\n        return service.autoCompleteEstadoARR(query, pageable);\n    }\n\n    \/* Clear: Estado ARR *\/\n    public void handleClearEstadoARR() {\n        this.getEntity().setEstadoARR(null);\n    }\n\n    public Boolean isDeshabilitarEstadoARR() {\n        return this.deshabilitarEstadoARR;\n    }\n\n    public void setDeshabilitarEstadoARR(Boolean deshabilitarEstadoARR) {\n        this.deshabilitarEstadoARR = deshabilitarEstadoARR;\n    }\n\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**********************     FIN FUNCIONES: Estado ARR         ************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la funci\u00f3n que actulizar el cambio de periodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que verifica un cambio de periodo \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioPeriodo(){\n\n        if(!this.isActividadNueva()){\n\n            Integer annofechaInicial = this.getEntity().getAnnoPeriodoAnualInicial();\n            Integer annofechaFinal = this.getEntity().getAnnoPeriodoAnualFinal();\n\n            if((annofechaFinal != null) &amp;&amp; (annofechaInicial != null)){\n\n                \/\/ VALIDACI\u00d3N: A\u00f1oInicial &gt; A\u00f1oFinal\n                if (annofechaFinal.compareTo(annofechaInicial) &lt; 0) {\n                    \/\/this.errorMessage(\"actividadRespuestaRiesgo_falta_adjunto_error_summary\",\"actividadRespuestaRiesgo_falta_adjunto_error_detail\");\n                    \/\/throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\"), getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\")));\n                    \/\/throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"AAA\"), getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\")));\n                }else{\n\n                    \/\/Obtenemos el procentaje de ejecucion \n                    BigDecimal porcentaje = service.calculaPorcentajeEjecucionARR(this.getEntity());\n\n                    BigDecimal indicador = new BigDecimal(100);\n\n                    \n                    \/\/ Si porcentaje es menor a 100 es en proceso\n                    if(porcentaje.compareTo(indicador) &lt; 0){\n\n                        if(this.estadoARRInicial !=null){\n\n\n\n                            \/\/ El estado actual es igual en proceso\n                            if(this.getEntity().getEstadoARR().equals(service.obtenerEstadoARREnProceso())){\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setExisteCambioEstado(false);\n                                this.setDeshabilitarEstadoARR(false);\n                                this.setPorcentajeEjecucion(porcentaje);\n                \n                            \/\/ Si el estado inicial es diferente a en proceso\n                            }else{\n                                this.getEntity().setEstadoARR(service.obtenerEstadoARREnProceso());\n                                this.setExisteCambioEstado(true);\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setDeshabilitarEstadoARR(true);\n                                this.setPorcentajeEjecucion(porcentaje);\n                              \n                            }\n                            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                                this.setExisteCambioEstado(false);\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setDeshabilitarEstadoARR(false);\n                            }\n                        }\n\n                        this.determinarColorProgressBar(porcentaje);\n\n                        \n                    \n                    \/\/ Si porcentaje es igual a 100 es implementada\n                    }else if(porcentaje.compareTo(indicador) == 0){\n\n                        if(this.estadoARRInicial !=null){\n\n                            \/\/ El estado Inicial es igual al actual\n                            if(this.getEntity().getEstadoARR().equals(service.obtenerEstadoARRImplementada())){\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setExisteCambioEstado(false);\n                                this.setDeshabilitarEstadoARR(false);\n                                this.setPorcentajeEjecucion(porcentaje);\n                \n                            \/\/ Si el estado inicial es diferente a implementada\n                            }else{\n                                this.getEntity().setEstadoARR(service.obtenerEstadoARRImplementada());\n                                this.setExisteCambioEstado(true);\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setDeshabilitarEstadoARR(true);\n                                this.setPorcentajeEjecucion(porcentaje);\n                                \n                            }\n\n                            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){\n                                this.setExisteCambioEstado(false);\n                                this.setJustificacionBitacoraARR(\"\");\n                                this.setDeshabilitarEstadoARR(false);\n                            }\n                        }\n                        this.determinarColorProgressBar(porcentaje);\n\n                    }\n                }\n            }\n        }\n        \n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos la funci\u00f3n que se encarga de establecer la clase de la barra de progreso<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/********************                 DISE\u00d1O                    **********************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    public void determinarColorProgressBar(BigDecimal porcentaje){\n\n        BigDecimal indicador1 = new BigDecimal(0);\n        BigDecimal indicador2 = new BigDecimal(50);\n        BigDecimal indicador3 = new BigDecimal(100);\n        \n        if( (porcentaje.compareTo(indicador1)&gt;= 0) &amp;&amp; (porcentaje.compareTo(indicador2)&lt;= 0)){\n            this.setStyleProgressBar(\"colorBarraMenor50\");\n        }else if((porcentaje.compareTo(indicador2)&gt;= 0) &amp;&amp; (porcentaje.compareTo(indicador3)&lt; 0)){\n            this.setStyleProgressBar(\"colorBarraMenor100\");\n        }else if (porcentaje.compareTo(indicador3)== 0){\n            this.setStyleProgressBar(\"colorBarra100\");\n        }\n\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Calculo para Actividad Mejora<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear la especificaci\u00f3n para obtener la META_POA_EVALUACION para una actividad de mejora<\/li>\n\n\n\n<li>SQL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n\n*\n\nFROM PPI.META_POA_EVALUACION MPE\n\nINNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)\n\nINNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\nINNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\nINNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)\n\nINNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)\nINNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)\nWHERE\nAM.ID_ACTIVIDAD_MEJORA = 15 \nAND\nEP.PERIODO_ANUAL = 202<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionSpecs.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la espec\u00edficaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******          SPECIFICATION: actividadMejoraEqualsAndPeriodoAnualEquals        ****************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n     SELECT \n        *\n        FROM PPI.META_POA_EVALUACION MPE\n\n        INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)\n\n        INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n        INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)\n\n        INNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)\n        INNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)\n        WHERE\n        AM.ID_ACTIVIDAD_MEJORA = 15 \n        AND\n        EP.PERIODO_ANUAL = 202\n    *\/\n\n    public static Specification&lt;MetaPoaEvaluacion&gt; actividadMejoraEqualsAndPeriodoAnualEquals(final ActividadMejora actividadMejora, final PeriodoAnual periodoAnual) {\n        return new Specification&lt;MetaPoaEvaluacion&gt;() {\n            @Override\n            public Predicate toPredicate(Root&lt;MetaPoaEvaluacion&gt; root, CriteriaQuery&lt;?&gt; cq,\n                    CriteriaBuilder cb) {\n\n                \/\/INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)\n                Join&lt;EtapaPlan, MetaPoaEvaluacion&gt; joinEtapaPlan = root.join(\"etapaPlan\");\n\n                \/\/INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n                Join&lt;MetaPoa, MetaPoaEvaluacion&gt; joinMetaPoa = root.join(\"metaPoa\");\n                \n                \/\/INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n                Join&lt;ObjetivoPOA, MetaPoa&gt; joinObjetivoPOA = joinMetaPoa.join(\"objetivoPOA\");\n\n                \/\/INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)\n                Join&lt;PlanOperativo, ObjetivoPOA&gt; joinPlanOperativo = joinObjetivoPOA.join(\"planOperativo\");\n\n                \n                \/\/ INNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)\n                Join&lt;MetaPoaActividadMejora, MetaPoa&gt; joinMetaPoaActividadMejora = joinMetaPoa.join(\"listaMetaPoaActividadesMejora\");\n\n                \/\/ INNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)\n                Join&lt;ActividadMejora, MetaPoaActividadMejora&gt; joinActividadMejora = joinMetaPoaActividadMejora.join(\"actividadMejora\");\n\n                if(actividadMejora !=null &amp;&amp; periodoAnual != null){\n\n                        \/\/ Actividad Mejora Equals\n                        Expression arrExp = joinActividadMejora.get(\"id\");\n                        Expression arrLit = cb.literal(actividadMejora.getId());\n\n                        \/\/ Plan Operativo Activo\n                        Expression planOperativoExp = joinPlanOperativo.get(\"activo\");\n                        Expression planOperativoLit = cb.literal(true);\n\n                        \/\/ Periodo Anual Equals\n                        Expression periodoAnualExp = joinEtapaPlan.get(\"periodoAnual\");\n                        Expression periodoAnualLit = cb.literal(periodoAnual);\n                        \n                        \/\/ Ordenar por etapaPlan.fechaFinal descendente\n                        Expression fechaFinal = joinEtapaPlan.get(\"fechaFinal\");\n                        cq.orderBy(cb.desc(fechaFinal));\n\n\n                        return cb.and(cb.equal(planOperativoExp, planOperativoLit),cb.equal(arrExp, arrLit),cb.equal(periodoAnualExp, periodoAnualLit));\n                }\n            \n            return null;\n                \n            }\n        };\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos un servicio que utilice esta especificacion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definicion que retorna un list&lt;MetaPoaEvaluacion&gt; para un planOperativo activo\n     * Ver {@link MetaPoaEvaluacionService#findAllByByActividadMejoraAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }\n     * \n     * @author: Gustavo Matamoros Gonz\u00e1lez\n     * @issue PPI-380 \/ PPI-381\n     * @param actividadMejora\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    \/**********************************************************************\/\n    public List&lt;MetaPoaEvaluacion&gt; findAllByByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el m\u00e9todo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n  \/**\n   * M\u00e9todo que retorna un list&lt;MetaPoaEvaluacion&gt; para un planOperativo activo\n   * Ver {@link MetaPoaEvaluacionService#findAllByByActividadMejoraAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }\n   * \n   * @author: Gustavo Matamoros Gonz\u00e1lez\n   * @issue PPI-380 \/ PPI-381\n   * @param actividadMejora\n   * @param periodoAnual\n   * @return List&lt;MetaPoaEvaluacion&gt;\n   *\/\n  \/**********************************************************************\/\n  @Override\n  public List&lt;MetaPoaEvaluacion&gt; findAllByByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual) {\n      \n    \/\/ Definimos una variable de tipo especificacion MetaPoaEvaluacion\n    Specification&lt;MetaPoaEvaluacion&gt; specFinal;\n    \n    \/\/ Obtenemos la especificaci\u00f3n de actividadMejoraEquals\n    Specification specActividadMejoraEqualsAndPeriodoAnualEquals = MetaPoaEvaluacionSpecs.actividadMejoraEqualsAndPeriodoAnualEquals(actividadMejora, periodoAnual);\n\n    \n    \/\/ Creamos la especificaci\u00f3n final\n    specFinal = Specification.where(specActividadMejoraEqualsAndPeriodoAnualEquals);\n    \n    return repository.findAll(specFinal);\n  }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">actividadMejoraEditForm.xhtml<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Periodo Inicial<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En periodo Inicial modificamos el ajax del autocomplete<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\n                                update=\"periodoAnualInicialAutoComplete,periodoAnualFinalAutoComplete\"\/&gt;<\/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>&lt;p:ajax event=\"itemSelect\" \n                                listener=\"#{actividadMejoraBean.actualizaExisteCambioPeriodo()}\"\n                                process=\"@this\"\n                                update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('periodoAnualInicialAutoComplete', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('periodoAnualFinalAutoComplete', view).clientId},\n\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}\"\n                                \/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y para el LOV vamos a agregar el siguiente remoteCommand<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand    name=\"updatePeriodoInicialAutoComplete\"\n                                        action=\"#{actividadMejoraBean.actualizaExisteCambioPeriodo()}\"\n                                        update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('periodoAnualInicialAutoComplete', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('periodoAnualFinalAutoComplete', view).clientId},\n\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y al components:dialogFrameworkData debemos agregarle<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updatePeriodoInicialAutoComplete()\"<\/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>&lt;components:dialogFrameworkData id=\"periodoAnualInicialListDialog\"\n                                                    lOVBean=\"#{periodoAnualLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.periodoAnualInicial}\"\n                                                    update=\"periodoAnualInicialAutoComplete\"  \n                                                    oncomplete=\"updatePeriodoInicialAutoComplete()\"                                                  \n                                                    title=\"#{i18n.actividadMejora_periodoAnualInicial_lov_label}\"\/&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Periodo Final<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora debemos hacer lo mismo para el periodo final y asi poder evaluar la modificaci\u00f3n de ambos casos<\/li>\n\n\n\n<li>autocomplete modificamos este<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:ajax event=\"itemSelect\"\n                                process=\"@this\"\/&gt;<\/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>&lt;p:ajax     event=\"itemSelect\" \n                                listener=\"#{actividadMejoraBean.actualizaExisteCambioPeriodo()}\"\n                                process=\"@this\"\n                                update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}\"\n                    \/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos el remoteCommand<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:remoteCommand    name=\"updatePeriodoFinalAutoComplete\"\n                                        action=\"#{actividadMejoraBean.actualizaExisteCambioPeriodo()}\"\n                                        update= \"@this,\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},\n                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y a components:dialogFrameworkData le agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>oncomplete=\"updatePeriodoFinalAutoComplete()\"<\/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>&lt;components:dialogFrameworkData id=\"periodoAnualFinalListDialog\"\n                                                    lOVBean=\"#{periodoAnualLOVBean}\"\n                                                    target=\"#{actividadMejoraBean.entity.periodoAnualFinal}\"\n                                                    update=\"periodoAnualFinalAutoComplete\"    \n                                                    oncomplete=\"updatePeriodoFinalAutoComplete()\"                                                \n                                                    title=\"#{i18n.actividadMejora_periodoAnualFinal_lov_label}\"\/&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a agregar una progressBar para que muestre el porcentaje de avance, despues de los periodos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--####################################################################################--&gt;\n                &lt;!--##########################    PORCENTAJE EJECUCION     #############################--&gt;\n                &lt;!--####################################################################################--&gt;\n\n                &lt;!--LABEL--&gt;\n                &lt;p:outputLabel  id=\"actividadMejora_porcentajeEjecucion_OutputLabel\"\n                                for=\"actividadMejora_porcentajeEjecucion_ProgressBar\"\n                                value=\"#{i18n.actividadMejora_porcentajeEjecucion_label}\"\n                                rendered=\"#{actividadMejoraBean.isHabilitarPorcentajeEjecucion()}\"\n                                style=\"vertical-align: top;\" \/&gt;\n\n                &lt;!--PANEL--&gt;\n                &lt;p:outputPanel  id=\"actividadMejora_porcentajeEjecucion_OutputPanel\"\n                                rendered=\"#{actividadMejoraBean.isHabilitarPorcentajeEjecucion()}\" &gt;\n\n                    &lt;p:progressBar \n                                    id=\"actividadMejora_porcentajeEjecucion_ProgressBar\" \n                                    value=\"#{actividadMejoraBean.porcentajeEjecucion}\" \n                                    labelTemplate=\"#{actividadMejoraBean.porcentajeEjecucion}%\" \n                                    style=\"width:350px; font-size:12px;background: #efefef;\"\n                                    styleClass=\"#{actividadMejoraBean.styleProgressBar}\"\/&gt;\n\n                    &lt;!--MENSAJE--&gt;\n                    &lt;p:message  id=\"actividadMejora_porcentajeEjecucion_Message\" \n                                for=\"actividadMejora_porcentajeEjecucion_ProgressBar\"\/&gt;\n\n                &lt;\/p:outputPanel&gt;\n\n\n                &lt;!--####################################################################################--&gt;\n                &lt;!--####################################################################################--&gt;\n                &lt;!--####################################################################################--&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y ahora antes de la etiqueta de cierre de &lt;\/ui:define&gt; agregamos los estilos CSS necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;style&gt;\n\n            .colorBarraMenor50.ui-progressbar .ui-widget-header {\n                background-color: #ff3806 !important;\n                border: 1px solid #ff3806 !important;\n            }\n\n            .colorBarraMenor100.ui-progressbar .ui-widget-header {\n                background-color: #ffb006 !important;\n                border: 1px solid #ffb006 !important;\n            }\n\n            .colorBarra100.ui-progressbar .ui-widget-header {\n                background-color: #38a15b !important;\n                border: 1px solid #38a15b !important;\n            }\n            .ui-panelgrid-cell {\n                vertical-align: top;\n            }\n\n        &lt;\/style&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos importes necesarios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPoaEvaluacionService;\n\nimport java.util.ArrayList;\nimport java.math.BigDecimal;\nimport java.math.RoundingMode;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    MetaPoaEvaluacionService metaPoaEvaluacionService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos una funci\u00f3n que obtenga una lista de MetaPoaEvaluacion segun AM y PeriodoAnual<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que obtiene una List&lt;MetaPoaEvaluacion&gt; seg\u00fan una Actividad de Mejora y un periodo\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 28\/04\/2023\n     * @param actividadMejora\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    @Override\n    public List&lt;MetaPoaEvaluacion&gt; obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual) {\n         return metaPoaEvaluacionService.findAllByByActividadMejoraAndPeriodoAnual(actividadMejora, periodoAnual);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>y seguido creammos una funci\u00f3n que calcule el porcentaje de ejecuci\u00f3n de la actividad<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que calcula el porcentaje de ejecuci\u00f3n de una actividad \n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 28\/04\/2023\n     * @param actividadMejora\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    @Override\n    public BigDecimal calculaPorcentajeEjecucionAM(ActividadMejora actividadMejora){\n\n        \/\/ Obtener el a\u00f1o inicial y final de la entidad\n        Integer annoInicial = actividadMejora.getPeriodoAnualInicial().getAno();\n        Integer annoFinal = actividadMejora.getPeriodoAnualFinal().getAno();\n\n        \/\/ Variable para obtener la cantidad de periodos seleccionados\n        Integer cantidadPeriodos = 0;\n\n        \/\/ Variable para obtener la totalidad de ejecucion de todos los periodos\n        BigDecimal totalEjecucionPeriodos = BigDecimal.ZERO;\n\n        \/\/ Creamos una lista temporal limpia\n        List&lt;MetaPoaEvaluacion&gt; listaMetaPoaEvaluacionPorPeriodo = new ArrayList&lt;&gt;();\n\n        \/\/NOTA: Obtener el a\u00f1o del periodo inicial de las evaluaciones esto por que inician a partir del a\u00f1o 2023\n        PeriodoAnual periodoInicialEvaluaciones = periodoAnualService.findOne(Long.parseLong(parametroService.findOneByLlave(\"param_ppi_mcg_periodoInicialEvaluacionesActividadesARRyAM\").getValor()));\n        \n        \/\/ Obtenemos el a\u00f1o del periodo\n        Integer annoInicialEvaluaciones = periodoInicialEvaluaciones.getAno();\n\n        \/\/ Determinar si annoInicial es menor al inicio de la evaluaciones \n        if (annoInicial &lt; annoInicialEvaluaciones){\n            annoInicial = annoInicialEvaluaciones;\n        }\n\n        \/\/ Recorrer los periodos anuales para obtener la \u00faltima evaluaci\u00f3n de cada periodo\n        for (int i = annoInicial; i &lt;= annoFinal; i++) {\n            \n            \/\/ limpiamos la lista\n            listaMetaPoaEvaluacionPorPeriodo.clear();\n\n            \/\/ Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente\n            listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(actividadMejora,periodoAnualService.findPeriodoAnualByAnno(i));\n\n            \/\/ Si la lista no esta vacia para el a\u00f1o existen evaluaciones \n            if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){\n                \n                \/\/ Se convierte a String\n                String strPorcentajeEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getEjecucion());\n\n                \/\/ Se convierte a BigDecimal con 2 digitos\n                BigDecimal montoEjecucion = new BigDecimal(strPorcentajeEvaluacion).setScale(2, BigDecimal.ROUND_HALF_EVEN);\n\n                \/\/ Obtenemos el primer elemento o la \u00faltima evaluacion y se lo sumamos al total\n                totalEjecucionPeriodos = totalEjecucionPeriodos.add(montoEjecucion);\n            }\n            \/\/ aumentamos la cantidad de periodos\n            cantidadPeriodos++;\n        }\n\n        \/\/ Si existe al menos un periodo\n        if(cantidadPeriodos &gt; 0){\n            BigDecimal cantidadPeriodosBD = new BigDecimal(cantidadPeriodos);\n\n            \/\/ Verificar la divisi\u00f3n de cero\n            if(totalEjecucionPeriodos.compareTo(BigDecimal.ZERO) == 0){\n                return totalEjecucionPeriodos;\n            \n            \/\/ Si existen valores\n            }else{\n                \/\/ eliminar decimales\n                return totalEjecucionPeriodos.divide(cantidadPeriodosBD,2,RoundingMode.CEILING);\n            }\n        }\n\n        return totalEjecucionPeriodos;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos las funciones para poder obtener los diferentes estados<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 28\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMSinIniciar() {\n        return estadoAMService.obtenerEstadoAMSinIniciar();\n    }\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMEnProceso() {\n        return estadoAMService.obtenerEstadoAMEnProceso();\n    }\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMDescartada() {\n        return estadoAMService.obtenerEstadoAMDescartada();\n    }\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    @Override\n    public EstadoAM obtenerEstadoAMImplementada() {\n        return estadoAMService.obtenerEstadoAMImplementada();\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;\nimport java.math.BigDecimal;\nimport java.util.List;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos las definiciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que obtiene una List&lt;MetaPoaEvaluacion&gt; seg\u00fan una Actividad de Mejora y un periodo\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 28\/04\/2023\n     * @param actividadMejora\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    public List&lt;MetaPoaEvaluacion&gt; obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual);\n\n    \/**\n     * Metodo que calcula el porcentaje de ejecuci\u00f3n de una actividad \n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 27\/04\/2023\n     * @param actividadMejora\n     * @param periodoAnual\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    public BigDecimal calculaPorcentajeEjecucionARR(ActividadMejora actividadMejora);\n\n    \/**\n     * Metodo que obtiene el estado sinIniciar.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMSinIniciar();\n\n    \/**\n     * Metodo que obtiene el estado enProceso.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMEnProceso();\n\n    \/**\n     * Metodo que obtiene el estado descartada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMDescartada();\n\n    \/**\n     * Metodo que obtiene el estado implementada.\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return EstadoAM\n     *\/\n    public EstadoAM obtenerEstadoAMImplementada();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.HashMap;\nimport java.util.Map;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Variables, agregamos estas<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>private Boolean habilitarPorcentajeEjecucion;\n    private BigDecimal porcentajeEjecucion;\n    private String styleProgressBar;\nprivate Boolean deshabilitarEstadoAM;<\/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>private Boolean existeCambioEstado;\n    private String justificacionBitacoraAM;\n    private EstadoAM estadoAMInicial;\n    private Boolean actividadNueva;\n    private Boolean deshabilitarEstadoAM;\n    private Boolean habilitarPorcentajeEjecucion;\n    private BigDecimal porcentajeEjecucion;\n    private String styleProgressBar;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modificamos la funcion initdetails<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void initDetails() {\n        if (!isPostBack()) {\n\n            if(this.getEntity().getId() != null){\n\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n                this.setActividadNueva(false);\n                this.setJustificacionBitacoraAM(\"\");\n                this.setDeshabilitarEstadoAM(false);\n                this.setHabilitarPorcentajeEjecucion(true);\n\n                BigDecimal porcentaje = service.calculaPorcentajeEjecucionAM(this.getEntity());\n                this.setPorcentajeEjecucion(porcentaje);\n                this.determinarColorProgressBar(porcentaje);\n\n            }else{\n                this.setActividadNueva(true);\n                this.setDeshabilitarEstadoARR(false);\n                this.setHabilitarPorcentajeEjecucion(false);\n            }\n            \n            this.setExisteCambioEstado(false);\n\n            \n        }\n\n        if (this.getEntity().getListaBitacoraAM() != null) {\n            Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n        }\n\n        this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));\n        bitacoraAMBean.init();\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funcion update<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public String update(){\n        String form;\n       \n        \/\/ Si es una actualizaci\u00f3n\n        if(this.estadoAMInicial !=null){\n\n            \/\/ Preguntamos si es igual al estado inicial reiniciamos la justificaci\u00f3n\n            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                this.setJustificacionBitacoraAM(\"\");\n                this.setExisteCambioEstado(false);\n                this.setDeshabilitarEstadoAM(false);\n\n            \/\/ Si son diferentes\n            }else{\n\n                \/******************************************\/\n                \/**********  VALIDACI\u00d3N: descartada *******\/\n                \/******************************************\/\n                \/\/ PPI-380 \/ PPI-381: Al descartar una actividad pasa a estar inactivo el registro.\n                if(service.esEstadoAMDescartada( this.getEntity().getEstadoAM() )){\n\n                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {\n                        this.errorMessage(\"actividadMejora_falta_adjunto_error_summary\",\"actividadMejora_falta_adjunto_error_detail\");\n                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"actividadMejora_falta_adjunto_error\"), getI18n(\"actividadMejora_falta_adjunto_error\")));\n                    }\n                    this.getEntity().setActivo(false);\n                }\n\n                \/\/ Mandamos a crear una Bitacora y agregarla a la lista \n                service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);\n\n                \/\/ Ordenamos la lista\n                if (this.getEntity().getListaBitacoraAM() != null) {\n                    Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n                }\n\n                \/\/ obtenemos el nuevo estado Actual para luego compararlo\n                this.estadoAMInicial = this.getEntity().getEstadoAM();\n\n                \/\/ Limpiamos la Justificaci\u00f3n\n                if(!this.justificacionBitacoraAM.isEmpty()){                 \n                    this.setJustificacionBitacoraAM(\"\");\n                    this.setExisteCambioEstado(false);\n                    this.setDeshabilitarEstadoAM(false);\n                }\n            }\n        }else{\n            this.setJustificacionBitacoraAM(\"\");\n            this.setExisteCambioEstado(false);\n            this.setDeshabilitarEstadoAM(false);\n            \n        }\n\n        form = super.update();\n\n        return form;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos las funciones de procentaje de ejecuaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public Boolean isHabilitarPorcentajeEjecucion() {\n        return habilitarPorcentajeEjecucion;\n    }\n\n    public void setHabilitarPorcentajeEjecucion(Boolean habilitarPorcentajeEjecucion) {\n        this.habilitarPorcentajeEjecucion = habilitarPorcentajeEjecucion;\n    }\n\n    public BigDecimal getPorcentajeEjecucion() {\n        return porcentajeEjecucion;\n    }\n    public void setPorcentajeEjecucion(BigDecimal porcentajeEjecucion) {\n        this.porcentajeEjecucion = porcentajeEjecucion;\n    }\n\n    public String getStyleProgressBar() {\n        return styleProgressBar;\n    }\n\n    public void setStyleProgressBar(String styleProgressBar) {\n        this.styleProgressBar = styleProgressBar;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos las funciones de deshabilitar estadoARR<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public Boolean isDeshabilitarEstadoAM() {\n        return this.deshabilitarEstadoAM;\n    }\n\n    public void setDeshabilitarEstadoAM(Boolean deshabilitarEstadoAM) {\n        this.deshabilitarEstadoAM = deshabilitarEstadoAM;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la funci\u00f3n que actulizar el cambio de periodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Funci\u00f3n que verifica un cambio de periodo \n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 28\/04\/2023\n     * @issue PPI-380  \n     * @return void\n     *\/\n    \/**********************************************************************\/\n    public void actualizaExisteCambioPeriodo(){\n\n        if(!this.isActividadNueva()){\n\n            Integer annofechaInicial = this.getEntity().getAnnoPeriodoAnualInicial();\n            Integer annofechaFinal = this.getEntity().getAnnoPeriodoAnualFinal();\n\n            if((annofechaFinal != null) &amp;&amp; (annofechaInicial != null)){\n\n                \/\/ VALIDACI\u00d3N: A\u00f1oInicial &gt; A\u00f1oFinal\n                if (annofechaFinal.compareTo(annofechaInicial) &lt; 0) {\n                    \/\/this.errorMessage(\"actividadRespuestaRiesgo_falta_adjunto_error_summary\",\"actividadRespuestaRiesgo_falta_adjunto_error_detail\");\n                    \/\/throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\"), getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\")));\n                    \/\/throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n(\"AAA\"), getI18n(\"actividadRespuestaRiesgo_falta_adjunto_error\")));\n                }else{\n\n                    \/\/Obtenemos el procentaje de ejecucion \n                    BigDecimal porcentaje = service.calculaPorcentajeEjecucionAM(this.getEntity());\n\n                    BigDecimal indicador = new BigDecimal(100);\n\n                    \n                    \/\/ Si porcentaje es menor a 100 es en proceso\n                    if(porcentaje.compareTo(indicador) &lt; 0){\n\n                        if(this.estadoAMInicial !=null){\n\n\n\n                            \/\/ El estado actual es igual en proceso\n                            if(this.getEntity().getEstadoAM().equals(service.obtenerEstadoAMEnProceso())){\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setExisteCambioEstado(false);\n                                this.setDeshabilitarEstadoAM(false);\n                                this.setPorcentajeEjecucion(porcentaje);\n                \n                            \/\/ Si el estado inicial es diferente a en proceso\n                            }else{\n                                this.getEntity().setEstadoAM(service.obtenerEstadoAMEnProceso());\n                                this.setExisteCambioEstado(true);\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setDeshabilitarEstadoAM(true);\n                                this.setPorcentajeEjecucion(porcentaje);\n                              \n                            }\n                            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                                this.setExisteCambioEstado(false);\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setDeshabilitarEstadoAM(false);\n                            }\n                        }\n\n                        this.determinarColorProgressBar(porcentaje);\n\n                        \n                    \n                    \/\/ Si porcentaje es igual a 100 es implementada\n                    }else if(porcentaje.compareTo(indicador) == 0){\n\n                        if(this.estadoAMInicial !=null){\n\n                            \/\/ El estado Inicial es igual al actual\n                            if(this.getEntity().getEstadoAM().equals(service.obtenerEstadoAMImplementada())){\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setExisteCambioEstado(false);\n                                this.setDeshabilitarEstadoAM(false);\n                                this.setPorcentajeEjecucion(porcentaje);\n                \n                            \/\/ Si el estado inicial es diferente a implementada\n                            }else{\n                                this.getEntity().setEstadoAM(service.obtenerEstadoAMImplementada());\n                                this.setExisteCambioEstado(true);\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setDeshabilitarEstadoAM(true);\n                                this.setPorcentajeEjecucion(porcentaje);\n                                \n                            }\n\n                            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){\n                                this.setExisteCambioEstado(false);\n                                this.setJustificacionBitacoraAM(\"\");\n                                this.setDeshabilitarEstadoAM(false);\n                            }\n                        }\n                        this.determinarColorProgressBar(porcentaje);\n\n                    }\n                }\n            }\n        }\n        \n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos la funci\u00f3n que se encarga de establecer la clase de la barra de progreso<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void determinarColorProgressBar(BigDecimal porcentaje){\n\n        BigDecimal indicador1 = new BigDecimal(0);\n        BigDecimal indicador2 = new BigDecimal(50);\n        BigDecimal indicador3 = new BigDecimal(100);\n        \n        if( (porcentaje.compareTo(indicador1)&gt;= 0) &amp;&amp; (porcentaje.compareTo(indicador2)&lt;= 0)){\n            this.setStyleProgressBar(\"colorBarraMenor50\");\n        }else if((porcentaje.compareTo(indicador2)&gt;= 0) &amp;&amp; (porcentaje.compareTo(indicador3)&lt; 0)){\n            this.setStyleProgressBar(\"colorBarraMenor100\");\n        }else if (porcentaje.compareTo(indicador3)== 0){\n            this.setStyleProgressBar(\"colorBarra100\");\n        }\n\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejora.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora para que sirva que sirva la funci\u00f3n de calculo de cambio de perido dentro del domain deben existir las funciones de obtenci\u00f3n del a\u00f1o del periodo las vamos a crear<\/li>\n\n\n\n<li>Agregamos trasient<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    @Transient\n    private Integer annoPeriodoAnualInicial;\n\n    @Transient\n    private Integer annoPeriodoAnualFinal;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funciones<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Integer getAnnoPeriodoAnualInicial() {\n\n        this.annoPeriodoAnualInicial = null;\n\n        if (this.periodoAnualInicial != null) {\n            this.annoPeriodoAnualInicial = this.periodoAnualInicial.getAno();\n        }\n\n        return annoPeriodoAnualInicial;\n    }\n\n    public void setAnnoPeriodoAnualInicial(Integer annoPeriodoAnualInicial) {\n        this.annoPeriodoAnualInicial = annoPeriodoAnualInicial;\n    }\n\n\n\/**\n     * PPI-381\n     * @autor: Gustavo Matamoros Gonz\u00e1lez\n     *\/\n    public Integer getAnnoPeriodoAnualFinal() {\n\n        this.annoPeriodoAnualFinal = null;\n\n        if (this.periodoAnualFinal != null) {\n            this.annoPeriodoAnualFinal = this.periodoAnualFinal.getAno();\n        }\n\n        return annoPeriodoAnualFinal;\n    }\n\n    public void setAnnoPeriodoAnualFinal(Integer annoPeriodoAnualFinal) {\n        this.annoPeriodoAnualFinal = annoPeriodoAnualFinal;\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MetaPoaEvaluacion.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Finalmente para que el BigDecimal sirva de forma correcta enn el domain se debe definir de la siguiente manera la columna ejecuci\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Column(name = \"EJECUCION\", columnDefinition = \"NUMBER(19,2)\")\n    private BigDecimal ejecucion = BigDecimal.ZERO;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Correcci\u00f3n de ordenamiento por fecha<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Posteriormente ten\u00edamos que el ordenamiento de la fecha DESC se hiciera en el Bean<\/li>\n\n\n\n<li>Pero esto no funcionaba de forma correcta <\/li>\n\n\n\n<li>getListaBitacoraARRpor tanto lo vamos a mover a que el ordenamiento se de en la el domain y cada vez que se solicite la fecha ya venga ordenado<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgo.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modificamos el metodo  <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;BitacoraARR&gt; getListaBitacoraARR() {\n        return listaBitacoraARR;\n    }<\/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>public List&lt;BitacoraARR&gt; getListaBitacoraARR() {\n        if (listaBitacoraARR != null) {\n            Collections.sort(listaBitacoraARR, new Comparator&lt;BitacoraARR&gt;() {\n                @Override\n                public int compare(BitacoraARR o1, BitacoraARR o2) {\n                    return o1.getFecha().compareTo(o2.getFecha());\n                }\n            });\n            Collections.reverse(listaBitacoraARR);\n        }\n        return listaBitacoraARR;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora podemos eliminar el c\u00f3digo de ordenamiento del bean<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if (this.getEntity().getListaBitacoraARR() != null) {\n          \/\/  Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);\n        \/\/}\n\nfinal Comparator&lt;BitacoraARR&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraARR&gt;() {\n\n        @Override\n        public int compare(BitacoraARR l1, BitacoraARR l2) {\n            return l2.getFecha().compareTo(l2.getFecha());\n        }\n    };<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejora.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.Collections;\nimport java.util.Comparator;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hacemos los mismo y modificamos la funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;BitacoraAM&gt; getListaBitacoraAM() {\n        return listaBitacoraAM;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;BitacoraAM&gt; getListaBitacoraAM() {\n        if (listaBitacoraAM != null) {\n            Collections.sort(listaBitacoraAM, new Comparator&lt;BitacoraAM&gt;() {\n                @Override\n                public int compare(BitacoraAM o1, BitacoraAM o2) {\n                    return o1.getFecha().compareTo(o2.getFecha());\n                }\n            });\n            Collections.reverse(listaBitacoraAM);\n        }\n        return listaBitacoraAM;\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraBean.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quitamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Odernar descendente l2 -&gt; l1\n    final Comparator&lt;BitacoraAM&gt; ORDENAR_FECHA = new Comparator&lt;BitacoraAM&gt;() {\n        public int compare(BitacoraAM l1, BitacoraAM l2) {\n            return l2.getFechaHora().compareTo(l1.getFechaHora());\n        }\n    };\n\n\nif (this.getEntity().getListaBitacoraAM() != null) {\n            Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);\n        }\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizar ARRbyEvaluacionOperativo<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoSpecs.jav<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero que debemos hacer es corregir la siguiente especificaci\u00f3n que se encuentra errorena<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/****    SPECIFICATION: actividadRespuestaActividadRespuestaRiesgoByPlanOperativo    *************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n     * Subquery: SELECT * FROM ACTIVIDAD_RESPUESTA_RIESGO\n     *                 WHERE ID_ACTIVIDAD_RESPUESTA_RIESGO IN(\n     *                 SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO AR\n     *                 INNER JOIN META_POA MP ON (MP.ID_META_POA = AR.META_POA)\n     *                 INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n     *                 INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n     *                 WHERE PO.ID_PLAN_OPERATIVO = 212 )\n     *\n     * \n     * \n     * @param planOperativo\n     * @return\n     *\/\n    public static Specification actividadRespuestaActividadRespuestaRiesgoByPlanOperativo(final PlanOperativo planOperativo) {\n        return new Specification&lt;ActividadRespuestaRiesgo&gt;() {\n            @Override\n            public Predicate toPredicate(Root&lt;ActividadRespuestaRiesgo&gt; root, CriteriaQuery&lt;?&gt; cq, CriteriaBuilder cb) {\n                \n                Subquery&lt;MetaPoaActividadRiesgo&gt; qMetaPoaActividadRiesgo = cq.subquery(MetaPoaActividadRiesgo.class);\n                Root&lt;MetaPoaActividadRiesgo&gt; rMetaPoaActividadRiesgo = qMetaPoaActividadRiesgo.from(MetaPoaActividadRiesgo.class);\n\n                Join&lt;MetaPoa,       MetaPoaActividadRiesgo&gt; joinMetaPoa         = rMetaPoaActividadRiesgo.join(\"metaPoa\");\n                Join&lt;ObjetivoPOA,   MetaPoa&gt;                joinObjetivoPoa     = joinMetaPoa.join(\"objetivoPOA\");\n                \/\/Join&lt;PlanOperativo, ObjetivoPOA&gt;            joinPlanOperativo   = joinObjetivoPoa.join(\"planOperativo\");\n\n                Expression planOpe = joinObjetivoPoa.get(\"planOperativo\");\n                Join&lt;MetaPoaActividadRiesgo, MetaPoaActividadRiesgo&gt; joinActividadMejora = rMetaPoaActividadRiesgo.join(\"actividadRespuestaRiesgo\");\n\n                Expression selectMetaPoaActividadRiesgo = joinActividadMejora.get(\"id\");\n\n\n                qMetaPoaActividadRiesgo.select(selectMetaPoaActividadRiesgo).where(cb.equal(planOpe, planOperativo));\n\n                return root.get(\"id\").in(qMetaPoaActividadRiesgo);\n                \n            }\n        };\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por esta<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/****               SPECIFICATION: actividadRespuestaRiesgoByPlanOperativo           *************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n      SELECT \n        * \n        FROM ACTIVIDAD_RESPUESTA_RIESGO \n        WHERE ID_ACTIVIDAD_RESPUESTA_RIESGO IN(\n                        SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO MPAR\n                        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAR.META_POA)\n                        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n                        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n                        WHERE PO.ID_PLAN_OPERATIVO = 90);\n     * \n     * \n     * @param planOperativo\n     * @return\n     *\/\n    public static Specification actividadRespuestaRiesgoByPlanOperativo(final PlanOperativo planOperativo) {\n        return new Specification&lt;ActividadRespuestaRiesgo&gt;() {\n            @Override\n            public Predicate toPredicate(Root&lt;ActividadRespuestaRiesgo&gt; root, CriteriaQuery&lt;?&gt; cq, CriteriaBuilder cb) {\n                \n                \/\/ SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO MPAR\n                Subquery&lt;MetaPoaActividadRiesgo&gt; subMetaPoaActividadRiesgo = cq.subquery(MetaPoaActividadRiesgo.class);\n                Root&lt;MetaPoaActividadRiesgo&gt; rootMetaPoaActividadRiesgo = subMetaPoaActividadRiesgo.from(MetaPoaActividadRiesgo.class);\n\n                \/\/ INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAR.META_POA)\n                Join&lt;MetaPoa, MetaPoaActividadRiesgo&gt; joinMetaPoa = rootMetaPoaActividadRiesgo.join(\"metaPoa\");\n                \n                \/\/ INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA\n                Join&lt;ObjetivoPOA,   MetaPoa&gt;   joinObjetivoPoa = joinMetaPoa.join(\"objetivoPOA\");\n                \n                Expression expIdPlanOperativo = joinObjetivoPoa.join(\"planOperativo\").get(\"id\"); \n                Expression litIdPlanOperativo = cb.literal(planOperativo.getId());\n\n                \/\/ SELECT ACTIVIDAD_RESPUESTA_RIESGO \n                Expression expActividadRespuestaRiesgo = rootMetaPoaActividadRiesgo.get(\"actividadRespuestaRiesgo\");\n                \n                \/\/ WHERE PO.ID_PLAN_OPERATIVO = 90\n                subMetaPoaActividadRiesgo.select(expActividadRespuestaRiesgo).where(cb.equal(litIdPlanOperativo, expIdPlanOperativo)).distinct(true);\n                \n                Expression idARR = root.get(\"id\");\n                return idARR.in(subMetaPoaActividadRiesgo);\n                \n            }\n        };\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraSpecs.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hacemos los mismo para actividad Mejora<\/li>\n\n\n\n<li>remplazamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/******                 SPECIFICATION: actividadMejoraByPlanOperativo         ********************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n     * Subquery: SELECT * FROM ACTIVIDAD_MEJORA\n     *                  WHERE ID_ACTIVIDAD_MEJORA IN(\n     *                  SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA AM\n     *                  INNER JOIN META_POA MP ON (MP.ID_META_POA = AM.META_POA)\n     *                  INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n     *                  INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n     *                  WHERE PO.ID_PLAN_OPERATIVO = 212 )\n     *\n     * \n     * \n     * @param planOperativo\n     * @return\n     *\/\n    public static Specification actividadMejoraByPlanOperativo(final PlanOperativo planOperativo) {\n        return new Specification&lt;ActividadMejora&gt;() {\n            @Override\n            public Predicate toPredicate(Root&lt;ActividadMejora&gt; root, CriteriaQuery&lt;?&gt; cq, CriteriaBuilder cb) {\n                \n                Subquery&lt;MetaPoaActividadMejora&gt; qMetaPoaActividadMejora = cq.subquery(MetaPoaActividadMejora.class);\n                Root&lt;MetaPoaActividadMejora&gt; rMetaPoaActividadMejora = qMetaPoaActividadMejora.from(MetaPoaActividadMejora.class);\n\n                Join&lt;MetaPoa,       MetaPoaActividadMejora&gt; joinMetaPoa         = rMetaPoaActividadMejora.join(\"metaPoa\");\n                Join&lt;ObjetivoPOA,   MetaPoa&gt;                joinObjetivoPoa     = joinMetaPoa.join(\"objetivoPOA\");\n                \/\/Join&lt;PlanOperativo, ObjetivoPOA&gt;            joinPlanOperativo   = joinObjetivoPoa.join(\"planOperativo\");\n\n                Expression planOpe = joinObjetivoPoa.get(\"planOperativo\");\n                Join&lt;ActividadMejora, MetaPoaActividadMejora&gt; joinActividadMejora = rMetaPoaActividadMejora.join(\"actividadMejora\");\n\n                Expression selectMetaPoaActividadMejora = joinActividadMejora.get(\"id\");\n\n\n                qMetaPoaActividadMejora.select(selectMetaPoaActividadMejora).where(cb.equal(planOpe, planOperativo));\n\n                return root.get(\"id\").in(qMetaPoaActividadMejora);\n                \n            }\n        };\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Por esta<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/****                  SPECIFICATION: actividadMejoraByPlanOperativo                 *************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/**\n      SELECT \n        * \n        FROM ACTIVIDAD_MEJORA\n        WHERE ID_ACTIVIDAD_MEJORA IN(\n                        SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA MPAM\n                        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAM.META_POA)\n                        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n                        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n                        WHERE PO.ID_PLAN_OPERATIVO = 90);\n     * \n     * \n     * @param planOperativo\n     * @return\n     *\/\n    public static Specification actividadMejoraByPlanOperativo(final PlanOperativo planOperativo) {\n        return new Specification&lt;ActividadMejora&gt;() {\n            @Override\n            public Predicate toPredicate(Root&lt;ActividadMejora&gt; root, CriteriaQuery&lt;?&gt; cq, CriteriaBuilder cb) {\n                \n                \/\/ SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA MPAM\n                Subquery&lt;MetaPoaActividadMejora&gt; subMetaPoaActividadMejora = cq.subquery(MetaPoaActividadMejora.class);\n                Root&lt;MetaPoaActividadMejora&gt; rootMetaPoaActividadMejora = subMetaPoaActividadMejora.from(MetaPoaActividadMejora.class);\n\n                \/\/ INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAM.META_POA)\n                Join&lt;MetaPoa, MetaPoaActividadMejora&gt; joinMetaPoa = rootMetaPoaActividadMejora.join(\"metaPoa\");\n                \n                \/\/ INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA\n                Join&lt;ObjetivoPOA,   MetaPoa&gt;   joinObjetivoPoa = joinMetaPoa.join(\"objetivoPOA\");\n                \n                Expression expIdPlanOperativo = joinObjetivoPoa.join(\"planOperativo\").get(\"id\"); \n                Expression litIdPlanOperativo = cb.literal(planOperativo.getId());\n\n                \/\/ SELECT ACTIVIDAD_MEJORA \n                Expression expActividadMejora = rootMetaPoaActividadMejora.get(\"actividadMejora\");\n                \n                \/\/ WHERE PO.ID_PLAN_OPERATIVO = 90\n                subMetaPoaActividadMejora.select(expActividadMejora).where(cb.equal(litIdPlanOperativo, expIdPlanOperativo)).distinct(true);\n                \n                Expression idAM = arroot.get(\"id\");\n                return idAM.in(subMetaPoaActividadMejora);\n                \n            }\n        };\n    }\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/\n    \/*************************************************************************************************\/<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Primero debemos crear una funci\u00f3n que nos obtenga la MetaPoaEvaluacion seg\u00fan una MetaPoa<\/li>\n\n\n\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.List;<\/code><\/pre>\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>public List&lt;MetaPoaEvaluacion&gt; findAllByMetaPoa(MetaPoa metaPoa);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Import<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos la definici\u00f3n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definicion que retorna un list&lt;MetaPoaEvaluacion&gt; para una metaPoa\n     * Ver {@link MetaPoaEvaluacionService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa) }\n     * \n     * @author: Gustavo Matamoros Gonz\u00e1lez\n     * @issue PPI-380 \/ PPI-381\n     * @param metaPoa\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    \/**********************************************************************\/\n    public List&lt;MetaPoaEvaluacion&gt; findAllByMetaPoa(MetaPoa metaPoa);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaEvaluacionServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n  \/**\n   * M\u00e9todo que retorna un list&lt;MetaPoaEvaluacion&gt; para una metaPoa\n   * Ver {@link MetaPoaEvaluacionService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa) }\n   * \n   * @author: Gustavo Matamoros Gonz\u00e1lez\n   * @issue PPI-380 \/ PPI-381\n   * @param metaPoa\n   * @return List&lt;MetaPoaEvaluacion&gt;\n   *\/\n  \/**********************************************************************\/\n  @Override\n  public List&lt;MetaPoaEvaluacion&gt; findAllByMetaPoa(MetaPoa metaPoa){\n    return repository.findAllByMetaPoa(metaPoa);\n\n  }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaActividadRiesgoRepository.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport java.util.List;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;MetaPoaActividadRiesgo&gt; findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaActividadRiesgoService.java<\/h3>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport java.util.List;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Definicion que retorna un list&lt;MetaPoaActividadRiesgo&gt; para una actividad de Respuesta al Riesgo\n     * Ver {@link MetaPoaActividadRiesgoService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo) }\n     * \n     * @author: Gustavo Matamoros Gonz\u00e1lez\n     * @issue PPI-380 \/ PPI-381\n     * @param actividadRespuetasRiesgo\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    \/**********************************************************************\/\n    public List&lt;MetaPoaActividadRiesgo&gt; findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MetaPoaActividadRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport java.util.List;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**********************************************************************\/\n    \/**\n     * Metodo que retorna un list&lt;MetaPoaActividadRiesgo&gt; para una actividad de Respuesta al Riesgo\n     * Ver {@link MetaPoaActividadRiesgoService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo) }\n     * \n     * @author: Gustavo Matamoros Gonz\u00e1lez\n     * @issue PPI-380 \/ PPI-381\n     * @param actividadRespuetasRiesgo\n     * @return List&lt;MetaPoaEvaluacion&gt;\n     *\/\n    \/**********************************************************************\/\n    public List&lt;MetaPoaActividadRiesgo&gt; findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo){\n        return repository.findAllByActividadRespuestaRiesgo(actividadRespuetasRiesgo);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definimos un servicio que va a actualizar las ARR segun una EvaluacionOperativa<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Metodo que actualiza las Actividades de Respuesta al Riesgo seg\u00fan una evaluaci\u00f3n operativa\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return void\n     *\/\n    public void actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadRespuestaRiesgoServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.EvaluacionOperativaService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nEvaluacionOperativaService evaluacionOperativaService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que actualiza las Actividades de Respuesta al Riesgo seg\u00fan una evaluaci\u00f3n operativa\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 26\/04\/2023\n     * @return void\n     *\/\n    public void actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa){\n\n        \/\/ Obtenemos el plan operativo\n        PlanOperativo planOperativo = evaluacionOperativa.getPlanOperativo();\n\n        \/\/ Creamos una lista para almacenar las ARR\n        List&lt;ActividadRespuestaRiesgo&gt; listaActividadRespuestaRiesgo = new ArrayList&lt;&gt;();\n\n        \/\/ Obtenemos las ARR por plan operativo\n        listaActividadRespuestaRiesgo = this.findAllActividadRespuestaRiesgoByPlanOperativo(planOperativo);\n\n        \/\/ Si la lista no se encuetra vacia\n        if(!listaActividadRespuestaRiesgo.isEmpty()){\n\n            \/\/ Recorremos la lista\n            for(ActividadRespuestaRiesgo actividadRespuestaRiesgo : listaActividadRespuestaRiesgo){\n                \n\n                \/\/ **********************************************\n                \/\/ PROCESO: ACTUALIZACI\u00d3N DE ESTADO\n                \/\/ **********************************************\n                BigDecimal porcentaje = BigDecimal.ZERO;\n\n                \/\/ Obtenemos el porcentaje de ejecuci\u00f3n\n                porcentaje = this.calculaPorcentajeEjecucionARR(actividadRespuestaRiesgo);\n\n                \/\/ Indicador de condici\u00f3n de cambio de estado\n                BigDecimal indicador = new BigDecimal(100);\n\n                \/\/ Obtenemos el estado inicial de la actividad para determinar si existe o no cambio de estado\n                EstadoARR estadoInicial = actividadRespuestaRiesgo.getEstadoARR();\n                \n                \/\/ Bandera que determina si existe o no cambio de estado\n                Boolean existeCambioEstado = false;\n\n                \/\/ Si porcentaje &lt; 100 resultado: \"En Proceso\"\n                if(porcentaje.compareTo(indicador) &lt; 0){\n\n                    if(!estadoInicial.equals(this.obtenerEstadoARREnProceso())){\n                        actividadRespuestaRiesgo.setEstadoARR(this.obtenerEstadoARREnProceso());\n                        existeCambioEstado = true;\n                    }else{\n                        existeCambioEstado = false;\n                    }\n                    \n                \/\/ Si porcentaje == 100 resultado: \"Implementada\"\n                }else if(porcentaje.compareTo(indicador) == 0){\n                    \n                    if(!estadoInicial.equals(this.obtenerEstadoARRImplementada())){\n                        actividadRespuestaRiesgo.setEstadoARR(this.obtenerEstadoARRImplementada());\n                        existeCambioEstado = true;\n                    }else{\n                        existeCambioEstado = false;\n                    }\n                }\n\n                \n\n\n                \/\/ **********************************************\n                \/\/ PROCESO: ACTUALIZACI\u00d3N DE BITACORA\n                \/\/ **********************************************\n               \n                \/\/ Si existe cambio de estado guardamos\n                if(existeCambioEstado){\n\n                    \/\/ Guardamos el registro\n                    this.save(actividadRespuestaRiesgo);\n \n                    \/\/ Creamos una lista de MetaPoaEvaluacion limpia\n                    List&lt;MetaPoaEvaluacion&gt; listaMetaPoaEvaluacionPorPeriodo = new ArrayList&lt;&gt;();\n\n                    \/\/ Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente\n                    listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo,planOperativo.getPeriodoAnual());\n\n                    \/\/ Si la lista no esta vacia para el a\u00f1o es decir \"existen evaluaciones\"\n                    if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){\n                    \n                        \/\/ Se obtiene la justificaci\u00f3n de la evaluaci\u00f3n\n                        String justificacionEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getJustificacion());\n        \n                        \/\/ Se guarda el registro en bitacora\n                        this.creaBitacoraARRModificado(actividadRespuestaRiesgo,justificacionEvaluacion);\n                    }\n                }\n\n            }\n        }\n    }<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraService.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Definimos un servicio que va a actualizar las AM segun una EvaluacionOperativa<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * Definici\u00f3n que actualiza las Actividades de mejora seg\u00fan una evaluaci\u00f3n operativa\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 02\/05\/2023\n     * @return void\n     *\/\n    public void actualizarActividadesMejoraByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ActividadMejoraServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.service.EvaluacionOperativaService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowired<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\nEvaluacionOperativaService evaluacionOperativaService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>funcion<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * M\u00e9todo que actualiza las Actividades de Mejora seg\u00fan una evaluaci\u00f3n operativa\n     *\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 02\/05\/2023\n     * @return void\n     *\/\n    public void actualizarActividadesMejoraByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa){\n\n        \/\/ Obtenemos el plan operativo\n        PlanOperativo planOperativo = evaluacionOperativa.getPlanOperativo();\n\n        \/\/ Creamos una lista para almacenar las ARR\n        List&lt;ActividadMejora&gt; listaActividadMejora = new ArrayList&lt;&gt;();\n\n        \/\/ Obtenemos las ARR por plan operativo\n        listaActividadMejora = this.findAllActividadMejoraByPlanOperativo(planOperativo);\n\n        \/\/ Si la lista no se encuetra vacia\n        if(!listaActividadMejora.isEmpty()){\n\n            \/\/ Recorremos la lista\n            for(ActividadMejora actividadMejora : listaActividadMejora){\n                \n\n                \/\/ **********************************************\n                \/\/ PROCESO: ACTUALIZACI\u00d3N DE ESTADO\n                \/\/ **********************************************\n                BigDecimal porcentaje = BigDecimal.ZERO;\n\n                \/\/ Obtenemos el porcentaje de ejecuci\u00f3n\n                porcentaje = this.calculaPorcentajeEjecucionAM(actividadMejora);\n\n                \/\/ Indicador de condici\u00f3n de cambio de estado\n                BigDecimal indicador = new BigDecimal(100);\n\n                \/\/ Obtenemos el estado inicial de la actividad para determinar si existe o no cambio de estado\n                EstadoAM estadoInicial = actividadMejora.getEstadoAM();\n                \n                \/\/ Bandera que determina si existe o no cambio de estado\n                Boolean existeCambioEstado = false;\n\n                \/\/ Si porcentaje &lt; 100 resultado: \"En Proceso\"\n                if(porcentaje.compareTo(indicador) &lt; 0){\n\n                    if(!estadoInicial.equals(this.obtenerEstadoAMEnProceso())){\n                        actividadMejora.setEstadoAM(this.obtenerEstadoAMEnProceso());\n                        existeCambioEstado = true;\n                    }else{\n                        existeCambioEstado = false;\n                    }\n                    \n                \/\/ Si porcentaje == 100 resultado: \"Implementada\"\n                }else if(porcentaje.compareTo(indicador) == 0){\n                    \n                    if(!estadoInicial.equals(this.obtenerEstadoAMImplementada())){\n                        actividadMejora.setEstadoAM(this.obtenerEstadoAMImplementada());\n                        existeCambioEstado = true;\n                    }else{\n                        existeCambioEstado = false;\n                    }\n                }\n\n                \n\n\n                \/\/ **********************************************\n                \/\/ PROCESO: ACTUALIZACI\u00d3N DE BITACORA\n                \/\/ **********************************************\n               \n                \/\/ Si existe cambio de estado guardamos\n                if(existeCambioEstado){\n\n                    \/\/ Guardamos el registro\n                    this.save(actividadMejora);\n \n                    \/\/ Creamos una lista de MetaPoaEvaluacion limpia\n                    List&lt;MetaPoaEvaluacion&gt; listaMetaPoaEvaluacionPorPeriodo = new ArrayList&lt;&gt;();\n\n                    \/\/ Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente\n                    listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(actividadMejora,planOperativo.getPeriodoAnual());\n\n                    \/\/ Si la lista no esta vacia para el a\u00f1o es decir \"existen evaluaciones\"\n                    if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){\n                    \n                        \/\/ Se obtiene la justificaci\u00f3n de la evaluaci\u00f3n\n                        String justificacionEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getJustificacion());\n        \n                        \/\/ Se guarda el registro en bitacora\n                        this.creaBitacoraAMModificado(actividadMejora,justificacionEvaluacion);\n                    }\n                }\n\n            }\n        }\n    }<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Probar funcionamiento dentro de Evaluacion Opertativa<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">EvaluacionOperativaServiceImpl.java<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora el m\u00e9todo anterior debe ser llamado al momento de actualizar una evaluacion operativa<\/li>\n\n\n\n<li>por esto vamos TEMPORALMENTE a sobre escribir el m\u00e9todo \u00abupdate\u00bb para llamar la los metodos de actulizaci\u00f3n de ARR y AM<\/li>\n\n\n\n<li>Imports<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;\nimport cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadMejoraService;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Autowored<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Autowired\n    ActividadRespuestaRiesgoService actividadRespuestaRiesgoService;\n\n    @Autowired\n    ActividadMejoraService actividadMejoraService;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sobre escritura de\u00f1 m\u00e9todo update<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public EvaluacionOperativa update(EvaluacionOperativa evaluacionOperativa) {\n\n        actividadRespuestaRiesgoService.actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(evaluacionOperativa);\n\n        actividadMejoraService.actualizarActividadesMejoraByEvaluacionOperativa(evaluacionOperativa);\n\n        return super.update(evaluacionOperativa);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que ya los probamos que funcionan<\/li>\n\n\n\n<li>vamos a eliminar la funci\u00f3n de sobre escritura de update<\/li>\n\n\n\n<li>Y vamos a buscar la funci\u00f3n public EvaluacionOperativa actualizarEstado<\/li>\n\n\n\n<li>Modificamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public EvaluacionOperativa actualizarEstado(EvaluacionOperativa entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {\n        EstadoEvaluacionPOA estadoAprobadoUnidadIntegradora = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnidadIntegradora();\n        EstadoEvaluacionPOA estadoAprobadoUnSoloNivel = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnSoloNivel();\n\n        TipoPlanOperativo tipoUnidad = tipoPlanOperativoService.findTipoPlanUnidad();\n\n        if ((nextStatus.equals(estadoAprobadoUnidadIntegradora.getId())) || (nextStatus.equals(estadoAprobadoUnSoloNivel.getId()))) {\n\n          \n\n            if (entity.getPlanOperativo().getTipoPlanOperativo().getId().equals(tipoUnidad.getId())) {\n                entity = this.calculaCompromisoLocalAndGiradoLocal(entity);\n            }\n        }\n\n        crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);\n\n        return super.actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y la dejamos as\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>@Override\n    public EvaluacionOperativa actualizarEstado(EvaluacionOperativa entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {\n        EstadoEvaluacionPOA estadoAprobadoUnidadIntegradora = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnidadIntegradora();\n        EstadoEvaluacionPOA estadoAprobadoUnSoloNivel = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnSoloNivel();\n\n        TipoPlanOperativo tipoUnidad = tipoPlanOperativoService.findTipoPlanUnidad();\n\n        if ((nextStatus.equals(estadoAprobadoUnidadIntegradora.getId())) || (nextStatus.equals(estadoAprobadoUnSoloNivel.getId()))) {\n\n            \/**\n             * PPI-381\n             * @autor: Gustavo Matamoros Gonz\u00e1lez\n             * Actualizar las Actividades de mejora\n             *\/\n            actividadRespuestaRiesgoService.actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(entity);\n            \/**\n             * PPI-381\n             * @autor: Gustavo Matamoros Gonz\u00e1lez\n             * Actualizar las Actividades de mejora\n             *\/\n            actividadMejoraService.actualizarActividadesMejoraByEvaluacionOperativa(entity);\n\n            if (entity.getPlanOperativo().getTipoPlanOperativo().getId().equals(tipoUnidad.getId())) {\n                entity = this.calculaCompromisoLocalAndGiradoLocal(entity);\n            }\n        }\n\n        crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);\n\n        return super.actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ademas le estamos agregando esta funci\u00f3n de una tarea anterios<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y en esta funci\u00f3n tambien le agregamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void crearEvaluacionOperativa<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esto<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>this.crearRegistroBitacoraEvaluacionPOA(planOperativo, 0L, true);<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Tarea BITACORA ARR TAREA: BITACORA AM Creaci\u00f3n de Bitacora BitacoraARRCreate.sql BitacoraAMCreate.sql DOMAIN BitacoraARR.java BitacoraAM.java Repository BitacoraARRRepository.java BitacoraAMRepository.java Service BitacoraARRService.java BitacoraAMService.java ServiceImpl BitacoraARRServiceImpl.java BitacoraAMServiceImpl.java MAPEOS 1. MAPEO: ActividadRespuestaRiesgo.java -&gt;BitacoraARR.java (JPA-ARR) 2. MAPEO: BitacoraARR.java -&gt; ActividadRespuestaRiesgo.java (JPA-ARR) Mapeo: ActividadMejora -&gt; BitacoraAM 2. MAPEO: BitacoraAM.java -&gt; ActividadMejora.java (JPA-AM) Beans BitacoraARRBean.java BitacoraAMBean.java ActividadRespuestaRiesgoBean.java Creaci\u00f3n de TabView: ARR actividadRespuestaRiesgoEditForm.xhtml ActividadRespuestaRiesgoBean.java [&hellip;]<\/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":[497,496,463,442,498,462,444,500],"class_list":["post-14557","post","type-post","status-publish","format-standard","hentry","category-sigesa","tag-am","tag-arr","tag-autocomplete","tag-bitacora","tag-justificacion","tag-lov","tag-sigesa","tag-tabview"],"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\/14557","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=14557"}],"version-history":[{"count":167,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14557\/revisions"}],"predecessor-version":[{"id":14819,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/14557\/revisions\/14819"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}