{"id":16468,"date":"2024-05-02T14:47:32","date_gmt":"2024-05-02T20:47:32","guid":{"rendered":"https:\/\/sada.services\/?p=16468"},"modified":"2024-05-03T16:13:03","modified_gmt":"2024-05-03T22:13:03","slug":"sigesa-crear-bitacora-con-trasient","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=16468","title":{"rendered":"SIGESA: Crear Bitacora con TRASIENT Maestro detalle"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>REFERENCIAS: \n<ul class=\"wp-block-list\">\n<li>ORGINAL BitacoraPXE->PlanAccionEstrategica (BTPPI-452)<\/li>\n\n\n\n<li>TRABAJADA: BitacoraEvaluacionPOA -> EvaluacionOperativa<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Vamos a crear un maestro detalle para crear la relaci\u00f3n de maestro (evaluacionOperativa) y detalle (bitacoraEvaluacionPOA)<\/li>\n\n\n\n<li>TAREA: BTPPI-457 Crear pesta\u00f1a de visualizaci\u00f3n de la bit\u00e1cora de aprobaci\u00f3n de las evaluaciones operativas<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Crear una pesta\u00f1a en la pantalla de Mantenimiento de Evaluaci\u00f3n Operativa (evaluacionOperativaEditForm.xhtml)\n\nBit\u00e1cora de Aprobaci\u00f3n\n\nCrear una tabla para visualizar la bit\u00e1cora de aprobaci\u00f3n de las Evaluaciones Operativas\n\nLa tabla debe mostrar los siguientes campos:\n\nEstado\n\nFecha y hora\n\nUsuario\n\nMostrar la c\u00e9dula\n\nNombre\n\nMostrar el nombre completo\n\nRol\n\nMostrar los roles del usuario que pertenezcan al m\u00f3dulo PPI-PPO\n\nUnidad Ejecutora\n\nMostrar la unidad ejecutora del usuario con la cual tenga rol ACL para el m\u00f3dulo PPI-PPO-POA<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed lo que cabe explicar es que la bitacora solo tiene el id del usuario por tanto la siguiente informaci\u00f3n la vamos a sacar directamente del JPA\n<ul class=\"wp-block-list\">\n<li>EstadoFormulacionPXENombre<\/li>\n\n\n\n<li>usuarioIdentificacion<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Pero la informaci\u00f3n de los\n<ul class=\"wp-block-list\">\n<li>usuarioNombreCompleto<\/li>\n\n\n\n<li>usuarioRoles<\/li>\n\n\n\n<li>usuarioUnidadEjecutora<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>La debemos obtener del servicio ya que lleva todo un proceso de obtenci\u00f3n de la informaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">BitacoraEvaluacionPOA.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ac\u00e1 vamos a crear unos campos tipo trasient String que nos permitan almacenar la informaci\u00f3n adicional a la entidad <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># ******************************************************\n# Imports\n# ******************************************************\nimport javax.persistence.Transient;\n\n# ******************************************************\n# Creamos campos trasient para almacenar la informaci\u00f3n faltante\n# ******************************************************\n@Transient\n    private String estadoEvaluacionPOANombre;\n\n    @Transient\n    private String usuarioIdentificacion;\n\n    @Transient\n    private String usuarioNombreCompleto;\n\n    @Transient\n    private String usuarioRoles;\n\n    @Transient\n    private String usuarioUnidadEjecutora;\n\n# ******************************************************\n# Datos que podemos obtener directamente del JPA\n# ******************************************************\npublic String getEstadoEvaluacionPOANombre() {\n        this.estadoEvaluacionPOANombre = \"\";\n        if (this.estadoEvaluacionPOA != null) {\n            this.estadoEvaluacionPOANombre = estadoEvaluacionPOA.getNombre();\n        }\n        return this.estadoEvaluacionPOANombre;\n    }\n\n    public void setEstadoEvaluacionPOANombre(String estadoEvaluacionPOANombre) {\n        this.estadoEvaluacionPOANombre = estadoEvaluacionPOANombre;\n    }\n\n    public String getUsuarioIdentificacion() {\n        this.usuarioIdentificacion =\"\";\n        if (this.usuario != null) {\n            this.usuarioIdentificacion = usuario.getNombreUsuario();\n        }\n        return this.usuarioIdentificacion;\n    }\n\n    public void setUsuarioIdentificacion(String usuarioIdentificacion) {\n        this.usuarioIdentificacion = usuarioIdentificacion;\n    }\n\n# ******************************************************\n# Datos que debemos de obtener desde un service\n# ******************************************************\npublic String getUsuarioNombreCompleto() {\n        return this.usuarioNombreCompleto;\n    }\n\n    public void setUsuarioNombreCompleto(String usuarioNombreCompleto) {\n        this.usuarioNombreCompleto = usuarioNombreCompleto;\n    }\n\n    public String getUsuarioRoles() {\n        return this.usuarioRoles;\n    }\n\n    public void setUsuarioRoles(String usuarioRoles) {\n        this.usuarioRoles = usuarioRoles;\n    }\n\n    public String getUsuarioUnidadEjecutora() {\n        return this.usuarioUnidadEjecutora;\n    }\n\n    public void setUsuarioUnidadEjecutora(String usuarioUnidadEjecutora) {\n        this.usuarioUnidadEjecutora = usuarioUnidadEjecutora;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto estamos cargando los datos que podemos de una vez y los dem\u00e1s los obtendremos luego<\/li>\n\n\n\n<li>RESULTADO<\/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\/*********************       PACKAGE     ******************************\/\n\/**********************************************************************\/\n\npackage cr.ac.una.cgi.sigesa.ppi.ppo.domain;\n\n\/**********************************************************************\/\n\/*********************       IMPORT'S    ******************************\/\n\/**********************************************************************\/\nimport java.util.Date;\n\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;\n\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 BitacoraEvaluacionPOA}\n *\n * @author: Gustavo Matamoros Gonz\u00e1lez\n * @fechaCreacion:  31\/03\/2023\n * @Version:        1.0.0\n *\/\n@Entity\n@Table(name = \"BITACORA_EVALUACION_POA\")\n@AttributeOverride(name = \"id\", column = @Column(name = \"ID_BITACORA_EVALUACION_POA\"))\n@SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_BITACORA_EVALUACION_POA\", allocationSize = 1)\npublic class BitacoraEvaluacionPOA extends BaseEntity&lt;Usuario, CampoConfigurable> {\n\n    @ManyToOne\n    @JoinColumn(name = \"EVALUACION_OPERATIVA\")\n    private EvaluacionOperativa evaluacionOperativa;\n\n    @ManyToOne\n    @JoinColumn(name = \"ESTADO_EVALUACION_POA\")\n    private EstadoEvaluacionPOA estadoEvaluacionPOA;\n\n    @ManyToOne\n    @JoinColumn(name = \"USUARIO\")\n    private Usuario usuario;\n\n    @Column(name = \"FECHA\")\n    @Temporal(javax.persistence.TemporalType.TIMESTAMP)\n    private Date fecha;\n\n    @Transient\n    private String estadoEvaluacionPOANombre;\n\n    @Transient\n    private String usuarioIdentificacion;\n\n    @Transient\n    private String usuarioNombreCompleto;\n\n    @Transient\n    private String usuarioRoles;\n\n    @Transient\n    private String usuarioUnidadEjecutora;\n\n\n    public EvaluacionOperativa getEvaluacionOperativa() {\n        return evaluacionOperativa;\n    }\n\n    public void setEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa) {\n        this.evaluacionOperativa = evaluacionOperativa;\n    }\n\n    public EstadoEvaluacionPOA getEstadoEvaluacionPOA() {\n        return estadoEvaluacionPOA;\n    }\n\n    public void setEstadoEvaluacionPOA(EstadoEvaluacionPOA estadoEvaluacionPOA) {\n        this.estadoEvaluacionPOA = estadoEvaluacionPOA;\n    }\n\n    public Usuario getUsuario() {\n        return usuario;\n    }\n\n    public void setUsuario(Usuario usuario) {\n        this.usuario = usuario;\n    }\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 getEstadoEvaluacionPOANombre() {\n        this.estadoEvaluacionPOANombre = \"\";\n        if (this.estadoEvaluacionPOA != null) {\n            this.estadoEvaluacionPOANombre = estadoEvaluacionPOA.getNombre();\n        }\n        return this.estadoEvaluacionPOANombre;\n    }\n\n    public void setEstadoEvaluacionPOANombre(String estadoEvaluacionPOANombre) {\n        this.estadoEvaluacionPOANombre = estadoEvaluacionPOANombre;\n    }\n\n    public String getUsuarioIdentificacion() {\n        this.usuarioIdentificacion =\"\";\n        if (this.usuario != null) {\n            this.usuarioIdentificacion = usuario.getNombreUsuario();\n        }\n        return this.usuarioIdentificacion;\n    }\n\n    public void setUsuarioIdentificacion(String usuarioIdentificacion) {\n        this.usuarioIdentificacion = usuarioIdentificacion;\n    }\n\n    public String getUsuarioNombreCompleto() {\n        return this.usuarioNombreCompleto;\n    }\n\n    public void setUsuarioNombreCompleto(String usuarioNombreCompleto) {\n        this.usuarioNombreCompleto = usuarioNombreCompleto;\n    }\n\n    public String getUsuarioRoles() {\n        return this.usuarioRoles;\n    }\n\n    public void setUsuarioRoles(String usuarioRoles) {\n        this.usuarioRoles = usuarioRoles;\n    }\n\n    public String getUsuarioUnidadEjecutora() {\n        return this.usuarioUnidadEjecutora;\n    }\n\n    public void setUsuarioUnidadEjecutora(String usuarioUnidadEjecutora) {\n        this.usuarioUnidadEjecutora = usuarioUnidadEjecutora;\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">BitacoraEvaluacionPOABean.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego vamos a crear en bean para el manejo del listform del framework<\/li>\n\n\n\n<li>Aqupi lo que hacemos que cada campo del BitacoraEvaluacionPOA.java que deseamos mostrar debe estar presente <\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"219\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_514-1024x219.png\" alt=\"\" class=\"wp-image-16479\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_514-1024x219.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_514-300x64.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_514-768x164.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_514.png 1320w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESULTADO<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\npackage cr.ac.una.cgi.sigesa.ppi.ppo.view.model;\n\/*\n * Copyright (c) 2023.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * \nhttp:&#47;&#47;www.una.ac.cr\/\n\n *\n *\/\n\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.ppo.domain.BitacoraEvaluacionPOA;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\n\n\/**\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @since 03\/05\/2024\n * @version 1.0.0\n * \n *\/\n@Component\n@Scope(\"session\")\npublic class BitacoraEvaluacionPOABean extends ASERImpl&lt;BitacoraEvaluacionPOA> implements ASER {\n\n    public BitacoraEvaluacionPOABean() {\n\n    }\n\n    @PostConstruct\n    public void init() {\n        List&lt;ASERColumn> columns = new ArrayList();\n\n        ASERColumn column1 = new ASERColumn(\"estadoEvaluacionPOANombre\",    getI18n(\"bitacoraEvaluacionPOA_estadoEvaluacionPOANombre_header\"),  true);\n        ASERColumn column2 = new ASERColumn(\"fecha\",                        getI18n(\"bitacoraEvaluacionPOA_fecha_header\"),                      true);\n        ASERColumn column3 = new ASERColumn(\"usuarioIdentificacion\",        getI18n(\"bitacoraEvaluacionPOA_usuarioIdentificacion_header\"),      true);\n        ASERColumn column4 = new ASERColumn(\"usuarioNombreCompleto\",        getI18n(\"bitacoraEvaluacionPOA_usuarioNombreCompleto_header\"),      true);\n        ASERColumn column5 = new ASERColumn(\"usuarioRoles\",                 getI18n(\"bitacoraEvaluacionPOA_usuarioRoles_header\"),               true);\n        ASERColumn column6 = new ASERColumn(\"usuarioUnidadEjecutora\",       getI18n(\"bitacoraEvaluacionPOA_usuarioUnidadEjecutora_header\"),     true);\n\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\n        this.setColumnsDetails(columns);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">EvaluacionOperativa.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ya que tenemos los campos adicionales en la bitacora y tenemos un bean que puede presentar la informaci\u00f3n necesaria <\/li>\n\n\n\n<li>Debemos hacer que el maestro en este caso EvaluacionOperativa tenga una lista de bitacora <\/li>\n\n\n\n<li>Para esto hacemos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Agregamos una lista hija donde de van a relacionar EvaluacionOperativa->BitacoraEvaluacionPOA a trav\u00e9s del campo de bitacora llamado \"evaluacionOperativa\"\n\n\n@OneToMany(fetch = FetchType.LAZY, mappedBy = \"evaluacionOperativa\")\nprivate List&lt;BitacoraEvaluacionPOA> listaBitacoraEvaluacionPOA;\n\n# SET y GET\npublic List&lt;BitacoraEvaluacionPOA> getListaBitacoraEvaluacionPOA() {\n        return this.listaBitacoraEvaluacionPOA;\n    }\n\n    public void setListaBitacoraEvaluacionPOA(List&lt;BitacoraEvaluacionPOA> listaBitacoraEvaluacionPOA) {\n        this.listaBitacoraEvaluacionPOA = listaBitacoraEvaluacionPOA;\n    }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_516-1024x538.png\" alt=\"\" class=\"wp-image-16482\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_516-1024x538.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_516-300x158.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_516-768x404.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_516.png 1514w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">EvaluacionOperativaService.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que tenemos dentro de la evaluaci\u00f3n operativa una lista de bitacora debemos crear un servicio que no retorne nada pero obtenga el resto de informaci\u00f3n que requerimos como roles, nombre de usuario y unidades ejecutoras <\/li>\n\n\n\n<li>Creamos el servicio<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n     * M\u00e9todo que retorna la bit\u00e1cora de EvaluacionOperativa pasada como par\u00e1metro\n     * @param evaluacionOperativa\n     * @bug BTPPI-457\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 02\/05\/2024\n     *\/\n    public void obtenerBitacoraEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">EvaluacionOperativaServiceImpl.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora creamos el servcio que obtenga los datos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Nuevos Imports\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport cr.ac.una.cgi.sdkuna.domain.DetalleGrupoRol;\nimport cr.ac.una.cgi.sdkuna.domain.GrupoRol;\nimport cr.ac.una.cgi.sdkuna.domain.UsuarioGrupoRol;\nimport cr.ac.una.cgi.sdkuna.domain.UsuarioRol;\nimport cr.ac.una.cgi.sdkuna.service.GrupoRolService;\nimport cr.ac.una.cgi.sdkuna.service.DetalleGrupoRolService;\nimport cr.ac.una.cgi.sigesa.pge.pge.domain.Persona;\nimport cr.ac.una.cgi.sigesa.pge.pge.service.PersonaService;\n\n# Nuevos Autowired\n@Autowired\nPersonaService personaService;\n\n@Autowired\nGrupoRolService grupoRolService;\n\n@Autowired\nDetalleGrupoRolService detalleGrupoRolService;\n\n#nuevos metodos\n\/**\n     * M\u00e9todo que retorna la bit\u00e1cora de EvaluacionOperativa pasada como par\u00e1metro\n     * @param evaluacionOperativa\n     * @bug BTPPI-457\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 02\/05\/2024\n     *\/\n    @Override\n    public void obtenerBitacoraEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa) {\n        \n        String usuarioNombre =\"\"; \n        String listaRoles = \"\";\n        String listaUnidadesEjecutoras = \"\";\n\n        Pattern pattern = Pattern.compile(\"unidad_(.*?)_acl\", Pattern.CASE_INSENSITIVE);\n\n        for (BitacoraEvaluacionPOA bitacora : evaluacionOperativa.getListaBitacoraEvaluacionPOA()) {\n                 \n            usuarioNombre =\"\";\n            listaRoles = \"\";\n            listaUnidadesEjecutoras = \"\";\n\n            Usuario usuarioActual = usuarioService.find(bitacora.getUsuario().getId());\n\n            \/\/ Nombre Usuario\n            if(bitacora.getUsuario().getId()>3){\n                Persona persona = personaService.findOneByIdentificacion(bitacora.getUsuario().getUsername());\n                usuarioNombre = persona.getNombre();\n            }else{\n                usuarioNombre = bitacora.getUsuario().getNombreUsuario() + ' ' + bitacora.getUsuario().getNombreUsuario();\n            } \n\n            \/\/ Roles Directos\n            for(UsuarioRol usuarioRol : usuarioActual.getUsuarioRoles()){\n                if (usuarioRol.getRol().getNombre().contains(\"PPI_PPO\")) {\n                    if(bitacora.getFecha().compareTo(usuarioRol.getFechaDesde()) >= 0 &amp;&amp; bitacora.getFecha().compareTo(usuarioRol.getFechaHasta()) &lt;= 0){\n                        listaRoles += usuarioRol.getRolNombre()+ \"|\";\n                    }\n                }\n            }\n\n            \/\/ Grupo de Rol\n            for(UsuarioGrupoRol usuarioGrupoRol : usuarioActual.getUsuarioGrupoRoles()){\n                if(bitacora.getFecha().compareTo(usuarioGrupoRol.getFechaDesde()) >= 0 &amp;&amp; bitacora.getFecha().compareTo(usuarioGrupoRol.getFechaHasta()) &lt;= 0){\n                    listaRoles += buscaRolACL(usuarioGrupoRol.getGrupoRol());\n                }\n            }\n\n            \/\/ Eliminar roles repetidos\n            String&#91;] arrayTmp = listaRoles.split(\"\\\\|\");\n            Set&lt;String> arrayListaRoles = new HashSet&lt;>(Arrays.asList(arrayTmp));\n            String&#91;] arrayRolesSinRepetidos = arrayListaRoles.toArray(new String&#91;arrayListaRoles.size()]);\n\n            \/\/ Construir cadenas de roles y unidades Ejecutoras\n            listaRoles = \"\";\n            if(arrayRolesSinRepetidos.length >0){\n                listaUnidadesEjecutoras += \"&lt;ul \"+ \"class=\"+ '\"' + \"ulUnidades\" + '\"'+ \">\";\n            }\n            for (String rol : arrayRolesSinRepetidos){\n                listaRoles += rol+\"&lt;\/br>\";\n\n                Matcher matcher = pattern.matcher(rol);\n                if (matcher.find()) {\n                    String codigoUnidadEjecutora = matcher.group(1);\n                    UnidadEjecutora unidadEjecutoraActual = unidadEjecutoraService.findByCodigo(codigoUnidadEjecutora);\n\n                    listaUnidadesEjecutoras += \"&lt;li>\" + unidadEjecutoraActual.getNombre() + \"&lt;\/li>\";    \n                }\n            }\n            if(arrayRolesSinRepetidos.length >0){\n                listaUnidadesEjecutoras += \"&lt;\/ul>\";\n            }\n\n            \/\/ Cargamos los valores faltantes\n            bitacora.setUsuarioNombreCompleto(usuarioNombre);\n            bitacora.setUsuarioRoles(listaRoles);\n            bitacora.setUsuarioUnidadEjecutora(listaUnidadesEjecutoras);\n\n        }\n    }\n\n    \/**\n     * M\u00e9todo que retorna el rol ACL de Unidad seg\u00fan un Grupo Rol\n     * @param grupoRol\n     * @bug BTPPI-457\n     * @author Gustavo Matamoros Gonz\u00e1lez\n     * @since 02\/05\/2024\n     *\/\n    public String buscaRolACL(GrupoRol grupoRol){\n        String rolesPPIPPO =\"\";\n        List&lt;DetalleGrupoRol> listaDetalleGrupoRoles = grupoRol.getDetallesGrupoRol();\n        \n        if(!listaDetalleGrupoRoles.isEmpty()){\n        \n            for(DetalleGrupoRol detalle : listaDetalleGrupoRoles){\n                    Rol rol = detalle.getRol();                   \n                                        \n                    if(rol != null){\n                        if(rol.getNombre().contains(\"PPI_PPO\") &amp;&amp; rol.getNombre().contains(\"ACL\")) {\n                            return rol.getNombre() + \"|\";\n                        }\n                    }                   \n                    \n                    if(detalle.getGrupo()!= null){\n                        rolesPPIPPO += buscaRolACL(detalle.getGrupo());\n                    }\n            }\n        }\n        return rolesPPIPPO;\n    }\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">EvaluacionOperativaBean.java<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora que tenemos un metodo desde el service que nos completa la informaci\u00f3n faltante<\/li>\n\n\n\n<li>Vamos a en el bean del maestro mandar a cargar los datos con la funcion en el initDetails cuando id no sea null<\/li>\n\n\n\n<li>Ahora para este caso espefico la evaluacion operativa bena no tenia un metodo initDetails por tanto lo creamos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Agregamos el autowired que nos permite relaciona 2 Bean's\n@Autowired\n    BitacoraEvaluacionPOABean bitacoraEvaluacionPOABean;\n\n\/\/ Inicializa los ddetalles\n    public void initDetails() {\n\n        \/\/ Si la entidad.id != null existe y puede tener detalles\n        if(this.getEntity().getId() != null){\n            \n            \/\/ Cargamos los valores requeridos\n            service.obtenerBitacoraEvaluacionOperativa(this.getEntity());\n            \n            \/\/ Cargamos los valores obtenidos en la lista de la entidad\n            this.getEntity().setListaBitacoraEvaluacionPOA(bitacoraEvaluacionPOABean.setDetails(this.getEntity().getListaBitacoraEvaluacionPOA()));\n\n            \/\/ Inicializamos el bean para que se muestre\n            bitacoraEvaluacionPOABean.init();\n        }\n    }\n\n\/\/ Sin comentarios\npublic void initDetails() {\n\n        if(this.getEntity().getId() != null){\n            service.obtenerBitacoraEvaluacionOperativa(this.getEntity());\n            this.getEntity().setListaBitacoraEvaluacionPOA(bitacoraEvaluacionPOABean.setDetails(this.getEntity().getListaBitacoraEvaluacionPOA()));\n            bitacoraEvaluacionPOABean.init();\n        }\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto ya cargamos los valores necesarios<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">evaluacionOperativaEditForm.xhtml<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a cambiar el dise\u00f1o de como se presentan los datos<\/li>\n\n\n\n<li>En este ya se cuenta con un tab view per la estructura es <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:tabView id=\"evaluacionOperativaTabView\" activeIndex=\"#{evaluacionOperativaBean.activeTab}\">\n&lt;p:ajax event=\"tabChange\" process=\"@this\"\/>\n\n&lt;p:tab \n                    id=\"BitacoraEvaluacionPOATab\" \n                    title=\"#{i18n.evaluacionOperativa_bitacoraEvaluacionPOA_tab}\">\n&lt;p:panelGrid columns=\"1\" styleClass=\"una-panelgrid una-width-100\">\n&lt;\/p:panelGrid>\n&lt;\/p:tab>\n\n&lt;\/p:tabView><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego dentro del panel grid agregamos el componente detailNoEditTableHorizontal<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:panelGrid columns=\"1\" styleClass=\"una-panelgrid una-width-100\">\n                        &lt;components:detailNoEditTableHorizontal \n                            id=\"bitacoraDetailNoEditTableHorizontal\"\n                            header=\"#{i18n.evaluacionOperativa_bitacoraEvaluacionPOA_label}\"\n                            bean=\"#{bitacoraEvaluacionPOABean}\"\n                            masterBean=\"#{evaluacionOperativaBean}\"\n                            container=\"evaluacionOperativaTabView:\"\n                            showNewButton=\"false\"\n                            showActions=\"false\" \/> \n                    &lt;\/p:panelGrid><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>id=\u00bbbitacoraDetailNoEditTableHorizontal\u00bb: es un id<\/li>\n\n\n\n<li>header=\u00bb#{i18n.evaluacionOperativa_bitacoraEvaluacionPOA_label}\u00bb: es el titulo<\/li>\n\n\n\n<li>bean=\u00bb#{bitacoraEvaluacionPOABean}\u00bb: el bean que va a presentar (el que hicimos anteriormente)<\/li>\n\n\n\n<li>masterBean=\u00bb#{evaluacionOperativaBean}\u00bb: bean principal el que estamos trabajando actualmente<\/li>\n\n\n\n<li>container=\u00bbevaluacionOperativaTabView:\u00bb: es el ID del compmente princpal tabview<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"924\" height=\"643\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_517.png\" alt=\"\" class=\"wp-image-16488\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_517.png 924w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_517-300x209.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_517-768x534.png 768w\" sizes=\"(max-width: 924px) 100vw, 924px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESULTADO<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:tabView id=\"evaluacionOperativaTabView\" activeIndex=\"#{evaluacionOperativaBean.activeTab}\">\n                \n                &lt;p:ajax event=\"tabChange\" process=\"@this\"\/>\n\n&lt;p:tab \n                    id=\"BitacoraEvaluacionPOATab\" \n                    title=\"#{i18n.evaluacionOperativa_bitacoraEvaluacionPOA_tab}\">\n                    &lt;p:panelGrid columns=\"1\" styleClass=\"una-panelgrid una-width-100\">\n                        &lt;components:detailNoEditTableHorizontal \n                            id=\"bitacoraDetailNoEditTableHorizontal\"\n                            header=\"#{i18n.evaluacionOperativa_bitacoraEvaluacionPOA_label}\"\n                            bean=\"#{bitacoraEvaluacionPOABean}\"\n                            masterBean=\"#{evaluacionOperativaBean}\"\n                            container=\"evaluacionOperativaTabView:\"\n                            showNewButton=\"false\"\n                            showActions=\"false\" \/> \n                    &lt;\/p:panelGrid>\n                &lt;\/p:tab>\n\n            &lt;\/p:tabView><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y como en esta pagina no se tenia el llamado a initDetails que creamos debemos agregar la linea dentro de preRender<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;f:event type=\"preRenderView\" listener=\"#{evaluacionOperativaBean.initDetails()}\"\/><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESULATDO<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;ui:define name=\"preRender\">\n        &lt;f:event type=\"preRenderView\" listener=\"#{evaluacionOperativaBean.find()}\"\/>\n        &lt;f:event type=\"preRenderView\" listener=\"#{evaluacionOperativaBean.initProperties()}\"\/>\n        &lt;f:event type=\"preRenderView\" listener=\"#{evaluacionOperativaBean.initDetails()}\"\/>\n    &lt;\/ui:define><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>BitacoraEvaluacionPOA.java BitacoraEvaluacionPOABean.java EvaluacionOperativa.java EvaluacionOperativaService.java EvaluacionOperativaServiceImpl.java EvaluacionOperativaBean.java evaluacionOperativaEditForm.xhtml<\/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":[442,444,617],"class_list":["post-16468","post","type-post","status-publish","format-standard","hentry","category-sigesa","tag-bitacora","tag-sigesa","tag-trasient"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16468","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=16468"}],"version-history":[{"count":18,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16468\/revisions"}],"predecessor-version":[{"id":16490,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16468\/revisions\/16490"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}