SIGESA: Bitacora ARR, Justificacion, Tab de bitacora, progress bar, especificación

Tarea BITACORA ARR

  • Crear una bitácora de cambios de estado de las actividades
    • BITACORA_AM
      • ACTIVIDAD_MEJORA
      • ESTADO_AM
      • FECHA
      • USUARIO
      • Justificación
  • Crear pestaña que contenga una tabla que muestre la bitácora de la actividad.
    • Ordenado por fecha DES
  • Asignarles el estado en proceso a todos los registros (En proceso).
  • Agregar autocomplete para la selección del estado.
    • Sólo se puede seleccionar manualmente los valores (Sin iniciar y Descartada)
    • Si se cambia el estado debe registrar la bitácora incluyendo la justificación.
  • Agregar área de texto (remaining)
    • Obligatoria para los cambios de estado.
  • 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:
    • En proceso, si el cálculo del avance o cumplimiento es inferior a 100%
    • Implementada, si el cálculo del avance o cumplimiento es 100%
    • Debe registrar la bitácora incluyendo la justificación.
  • El usuario administrador del módulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificación de manera obligatoria.
  • Al descartar una actividad pasa a estar inactivo el registro.
  • Cuando el avance y/o cumplimiento de los planes operativos obtengan el estado APROBADO por unidad integradora o en un sólo 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:
    • En proceso, si el cálculo del avance o cumplimiento es inferior a 100%
    • Implementada, si el cálculo del avance o cumplimiento es 100%
    • Debe crear un registro en la bitácora de AM
      • Estado calculado en esta tarea
      • Usuario, debe registrar el que cambió el avance o cumplimiento a los estados Aprobado Unidad Integradora o Aprobado en un sólo nivel.
      • Fecha, debe registrar la fecha de aprobación (APROBADO por unidad integradora o en un sólo nivel) del avance o cumplimiento.
      • Justificación de la META_POA asociada a la AM

TAREA: BITACORA AM

  • Crear una bitácora de cambios de estado de las actividades
    • BITACORA_AM
      • ACTIVIDAD_MEJORA
      • ESTADO_AM
      • FECHA
      • USUARIO
      • Justificación
  • Crear pestaña que contenga una tabla que muestre la bitácora de la actividad.
    • Ordenado por fecha DES
  • Asignarles el estado en proceso a todos los registros (En proceso).
  • Agregar autocomplete para la selección del estado.
    • Sólo se puede seleccionar manualmente los valores (Sin iniciar y Descartada)
    • Si se cambia el estado debe registrar la bitácora incluyendo la justificación.
  • Agregar área de texto (remaining)
    • Obligatoria para los cambios de estado.
  • 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:
    • En proceso, si el cálculo del avance o cumplimiento es inferior a 100%
    • Implementada, si el cálculo del avance o cumplimiento es 100%
    • Debe registrar la bitácora incluyendo la justificación.
  • El usuario administrador del módulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificación de manera obligatoria.
  • Al descartar una actividad pasa a estar inactivo el registro.
  • Cuando el avance y/o cumplimiento de los planes operativos obtengan el estado APROBADO por unidad integradora o en un sólo 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:
    • En proceso, si el cálculo del avance o cumplimiento es inferior a 100%
    • Implementada, si el cálculo del avance o cumplimiento es 100%
    • Debe crear un registro en la bitácora de AM
      • Estado calculado en esta tarea
      • Usuario, debe registrar el que cambió el avance o cumplimiento a los estados Aprobado Unidad Integradora o Aprobado en un sólo nivel.
      • Fecha, debe registrar la fecha de aprobación (APROBADO por unidad integradora o en un sólo nivel) del avance o cumplimiento.
      • Justificación de la META_POA asociada a la AM

Creación de Bitacora

  • Como se ve vamos a crear 2 bitacoras una ARR (Actividad Respuesta al Riesgo) y otra AM (Actividad Mejora)
  • Por lo que creamos los script de creación

BitacoraARRCreate.sql

/* 
 * Copyright (C) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 * 
 * Author:  Gustavo Matamoros González
 * Created: 11/04/2023
 */

/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
CREATE TABLE "PPI"."BITACORA_ARR"
(
    "ID_BITACORA_ARR"            NUMBER (19,0)       NOT NULL ENABLE,
    "ACTIVIDAD_RIESGO"           NUMBER (19,0)       NOT NULL ENABLE,
    "ESTADO_ARR"                 NUMBER (19,0)       NOT NULL ENABLE,    
    "USUARIO"                    NUMBER (19,0)       NOT NULL ENABLE,        
    "FECHA"                     DATE                NOT NULL ENABLE,
    "JUSTIFICACION"             VARCHAR2(500 BYTE),

    "FECHA_CREACION"        DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"      NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"    DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"  NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"               NUMBER(19,0),
    "CAMPO_CONFIGURABLE"    NUMBER(19,0),

    CONSTRAINT "PK_BITACORA_ARR" PRIMARY KEY("ID_BITACORA_ARR"),
    
    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    --BITACORA_ARR->ACTIVIDAD_RESPUESTA_RIESGO
    CONSTRAINT FK_BIT_ARR_ARR FOREIGN KEY(ACTIVIDAD_RIESGO)                 REFERENCES PPI.ACTIVIDAD_RESPUESTA_RIESGO(ID_ACTIVIDAD_RESPUESTA_RIESGO),

    --BITACORA_ARR->ESTADO_ARR
    CONSTRAINT FK_BIT_ARR_EST_ARR FOREIGN KEY(ESTADO_ARR)                   REFERENCES PPI.ESTADO_ARR(ID_ESTADO_ARR),
    
     --BITACORA_ARR->USUARIO
    CONSTRAINT FK_BIT_ARR_USU FOREIGN KEY(USUARIO)                          REFERENCES SAS.USUARIO (ID_USUARIO),
    
    
    
    
    /********************************************************/
    /* LLAVE: FORANEAS SIGESA                               */
    /********************************************************/
    CONSTRAINT FK_BIT_ARR_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_BIT_ARR_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_BIT_ARR_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
    
    
);


/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
COMMENT ON COLUMN "PPI"."BITACORA_ARR"."ACTIVIDAD_RIESGO"                   IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla ACTIVIDAD_RESPUESTA_RIESGO';
COMMENT ON COLUMN "PPI"."BITACORA_ARR"."ESTADO_ARR"                         IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla ESTADO_ARR';
COMMENT ON COLUMN "PPI"."BITACORA_ARR"."USUARIO"                            IS 'Campo que relaciona la tabla BITACORA_ARR con la tabla USUARIO';
COMMENT ON COLUMN "PPI"."BITACORA_ARR"."FECHA"                              IS 'Fecha y hora en que se realiza la transacción';
COMMENT ON COLUMN "PPI"."BITACORA_ARR"."JUSTIFICACION"                      IS 'Campo para almacenar la justificación de un cambio de estado de actividad';





/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
CREATE SEQUENCE PPI.SQ_BITACORA_ARR START WITH 1 INCREMENT BY 1 MINVALUE 1 NOCACHE  NOCYCLE  NOORDER;




/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
CREATE PUBLIC SYNONYM BITACORA_ARR FOR "PPI"."BITACORA_ARR";
CREATE PUBLIC SYNONYM SQ_BITACORA_ARR FOR PPI.SQ_BITACORA_ARR;



/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
GRANT DELETE, INSERT, UPDATE, SELECT, REFERENCES ON PPI.BITACORA_ARR TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PPI.SQ_BITACORA_ARR TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PPI"."BITACORA_ARR" TO "ANALISTA", "ANALISTA_SIGESA";



/********************************************************/
/* ELIMINAR TABLA  (ROLLBACK)                           */
/********************************************************/
DROP SEQUENCE "PPI".SQ_BITACORA_ARR;
DROP PUBLIC SYNONYM BITACORA_ARR;
DROP PUBLIC SYNONYM SQ_BITACORA_ARR;
DROP TABLE "PPI".BITACORA_ARR;

BitacoraAMCreate.sql

/* 
 * Copyright (C) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 * 
 * Author:  Gustavo Matamoros González
 * Created: 11/04/2023
 */

/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
CREATE TABLE "PPI"."BITACORA_AM"
(

    "ID_BITACORA_AM"             NUMBER (19,0)       NOT NULL ENABLE,
    "ACTIVIDAD_MEJORA"           NUMBER (19,0)       NOT NULL ENABLE,
    "ESTADO_AM"                  NUMBER (19,0)       NOT NULL ENABLE,    
    "USUARIO"                    NUMBER (19,0)       NOT NULL ENABLE,        
    "FECHA"                     DATE                NOT NULL ENABLE,
    "JUSTIFICACION"             VARCHAR2(500 BYTE),

    "FECHA_CREACION"        DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"      NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"    DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"  NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"               NUMBER(19,0),
    "CAMPO_CONFIGURABLE"    NUMBER(19,0),
    

    CONSTRAINT "PK_BITACORA_AM" PRIMARY KEY("ID_BITACORA_AM"),
    
   
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    --BITACORA_AM->ACTIVIDAD_MEJORA
    CONSTRAINT FK_BIT_AM_AM FOREIGN KEY(ACTIVIDAD_MEJORA)                   REFERENCES PPI.ACTIVIDAD_MEJORA(ID_ACTIVIDAD_MEJORA),

    --BITACORA_AM->ESTADO_AM
    CONSTRAINT FK_BIT_AM_EST_AM FOREIGN KEY(ESTADO_AM)                      REFERENCES PPI.ESTADO_AM(ID_ESTADO_AM),
    
     --BITACORA_AM->USUARIO
    CONSTRAINT FK_BIT_AM_USU FOREIGN KEY(USUARIO)                           REFERENCES SAS.USUARIO (ID_USUARIO),
    

    /********************************************************/
    /* LLAVE: FORANEAS SIGESA                               */
    /********************************************************/
    CONSTRAINT FK_BIT_AM_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_BIT_AM_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_BIT_AM_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
    
    
);


/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
COMMENT ON COLUMN "PPI"."BITACORA_AM"."ACTIVIDAD_MEJORA"                   IS 'Campo que relaciona la tabla BITACORA_AM con la tabla ACTIVIDAD_MEJORA';
COMMENT ON COLUMN "PPI"."BITACORA_AM"."ESTADO_AM"                          IS 'Campo que relaciona la tabla BITACORA_AM con la tabla ESTADO_AM';
COMMENT ON COLUMN "PPI"."BITACORA_AM"."USUARIO"                            IS 'Campo que relaciona la tabla BITACORA_AM con la tabla USUARIO';
COMMENT ON COLUMN "PPI"."BITACORA_AM"."FECHA"                              IS 'Fecha y hora en que se realiza la transacción';
COMMENT ON COLUMN "PPI"."BITACORA_AM"."JUSTIFICACION"                      IS 'Campo para almacenar la justificación de un cambio de estado de actividad';


/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
CREATE SEQUENCE PPI.SQ_BITACORA_AM START WITH 1 INCREMENT BY 1 MINVALUE 1 NOCACHE  NOCYCLE  NOORDER;



/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
CREATE PUBLIC SYNONYM BITACORA_AM FOR "PPI"."BITACORA_AM";
CREATE PUBLIC SYNONYM SQ_BITACORA_AM FOR PPI.SQ_BITACORA_AM;



/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
GRANT DELETE, INSERT, UPDATE, SELECT, REFERENCES ON PPI.BITACORA_AM TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PPI.SQ_BITACORA_AM TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PPI"."BITACORA_AM" TO "ANALISTA", "ANALISTA_SIGESA";




/********************************************************/
/* ELIMINAR TABLA  (ROLLBACK)                           */
/********************************************************/
DROP SEQUENCE "PPI".SQ_BITACORA_AM;
DROP PUBLIC SYNONYM BITACORA_AM;
DROP PUBLIC SYNONYM SQ_BITACORA_AM;
DROP TABLE "PPI".BITACORA_AM;

DOMAIN

  • Ahora vamos a crear los domain’s de ambas tablas
  • Primero se deben agregar los siguientes import’s
import java.util.Date;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

BitacoraARR.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.domain;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.Transient;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;




/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Entity para la administración de la entidad {@link BitacoraARR}
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion:       11/04/2023
 * @Version: 1.0.0
 */
@Entity
@Table(name = "BITACORA_ARR")
@AttributeOverride(name = "id", column
        = @Column(name = "ID_BITACORA_ARR"))
@SequenceGenerator(name = "sequence", sequenceName = "SQ_BITACORA_ARR", allocationSize = 1)
public class BitacoraARR extends BaseEntity<Usuario, CampoConfigurable> {

    /***************************************/
    // MAPEO'S
    /***************************************/
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "ACTIVIDAD_RIESGO",
            referencedColumnName = "ID_ACTIVIDAD_RESPUESTA_RIESGO",
            nullable = false,
            insertable = false,
            updatable = false)
    private ActividadRespuestaRiesgo actividadRespuestaRiesgo;

    @ManyToOne
    @JoinColumn(name = "ESTADO_ARR")
    private EstadoARR estadoARR;

    @ManyToOne
    @JoinColumn(name = "USUARIO")
    private Usuario usuario;

    /***************************************/
    // CAMPOS
    /***************************************/
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date fecha;

    @Column(name = "JUSTIFICACION")
    private String justificacion;

    /***************************************/
    // TRASIENT'S
    /***************************************/
    @Transient
    private String estadoNombre;

    @Transient
    private String actividadRespuestaRiesgoCodigo;

    @Transient
    private String actividadRespuestaRiesgoDescripcion;

    @Transient
    private String usuarioCedula;


    /***************************************/
    // MAPEO'S GET Y SET
    /***************************************/
    public ActividadRespuestaRiesgo getActividadRespuestaRiesgo() {
        return actividadRespuestaRiesgo;
    }

    public void setActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuestaRiesgo) {
        this.actividadRespuestaRiesgo = actividadRespuestaRiesgo;
    }

    public EstadoARR getEstadoARR() {
        return estadoARR;
    }

    public void setEstadoARR(EstadoARR estadoARR) {
        this.estadoARR = estadoARR;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /***************************************/
    // CAMPOS GET Y SET
    /***************************************/
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getJustificacion() {
        return justificacion;
    }

    public void setJustificacion(String justificacion) {
        this.justificacion = justificacion;
    }

    /***************************************/
    // TRASIENT GET Y SET
    /***************************************/
    public String getEstadoNombre() {
        estadoNombre = "";
        if (estadoARR != null) {
            estadoNombre = estadoARR.getNombre();
        }
        return estadoNombre;
    }
    public void setEstadoNombre(String estadoNombre) {
        this.estadoNombre = estadoNombre;
    }


    public String getActividadRespuestaRiesgoCodigo() {
        actividadRespuestaRiesgoCodigo = "";
        if (actividadRespuestaRiesgo != null) {
            actividadRespuestaRiesgoCodigo = actividadRespuestaRiesgo.getCodigo();
        }
        return actividadRespuestaRiesgoCodigo;
    }
    public void setActividadRespuestaRiesgoCodigo(String actividadRespuestaRiesgoCodigo) {
        this.actividadRespuestaRiesgoCodigo = actividadRespuestaRiesgoCodigo;
    }


    public String getActividadRespuestaRiesgoDescripcion() {
        actividadRespuestaRiesgoDescripcion = "";
        if (actividadRespuestaRiesgo != null) {
            actividadRespuestaRiesgoDescripcion = actividadRespuestaRiesgo.getDescripcion();
        }
        return actividadRespuestaRiesgoDescripcion;
    }
    public void setActividadRespuestaRiesgoDescripcion(String actividadRespuestaRiesgoDescripcion) {
        this.actividadRespuestaRiesgoDescripcion = actividadRespuestaRiesgoDescripcion;
    }
    

    public String getUsuarioCedula() {
        usuarioCedula = "";
        if (usuario != null) {
            usuarioCedula = usuario.getNombreUsuario();
        }
        return usuarioCedula;
    }

    public void setUsuarioCedula(String usuarioCedula) {
        this.usuarioCedula = usuarioCedula;
    }
}

BitacoraAM.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.domain;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.Transient;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Entity para la administración de la entidad {@link BitacoraAM}
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion:       11/04/2023
 * @Version: 1.0.0
 */
@Entity
@Table(name = "BITACORA_AM")
@AttributeOverride(name = "id", column
        = @Column(name = "ID_BITACORA_AM"))
@SequenceGenerator(name = "sequence", sequenceName = "SQ_BITACORA_AM", allocationSize = 1)
public class BitacoraAM extends BaseEntity<Usuario, CampoConfigurable> {

    /***************************************/
    // MAPEO'S
    /***************************************/
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "ACTIVIDAD_MEJORA",
            referencedColumnName = "ID_ACTIVIDAD_MEJORA",
            nullable = false,
            insertable = false,
            updatable = false)
    private ActividadMejora actividadMejora;

    @ManyToOne
    @JoinColumn(name = "ESTADO_AM")
    private EstadoAM estadoAM;

    @ManyToOne
    @JoinColumn(name = "USUARIO")
    private Usuario usuario;

    /***************************************/
    // CAMPOS
    /***************************************/
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date fecha;

    @Column(name = "JUSTIFICACION")
    private String justificacion;

    /***************************************/
    // TRASIENT'S
    /***************************************/
    @Transient
    private String estadoNombre;

    @Transient
    private String actividadMejoraCodigo;

    @Transient
    private String actividadMejoraDescripcion;

    @Transient
    private String usuarioNombre;
    
    /***************************************/
    // MAPEO'S GET Y SET
    /***************************************/
    public ActividadMejora getActividadMejora() {
        return actividadMejora;
    }

    public void setActividadMejora(ActividadMejora actividadMejora) {
        this.actividadMejora = actividadMejora;
    }

    public EstadoAM getEstadoAM() {
        return estadoAM;
    }

    public void setEstadoAM(EstadoAM estadoAM) {
        this.estadoAM = estadoAM;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /***************************************/
    // CAMPOS GET Y SET
    /***************************************/
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getJustificacion() {
        return justificacion;
    }

    public void setJustificacion(String justificacion) {
        this.justificacion = justificacion;
    }

    /***************************************/
    // TRASIENT GET Y SET
    /***************************************/
    public String getEstadoNombre() {
        estadoNombre = "";
        if (estadoAM != null) {
            estadoNombre = estadoAM.getNombre();
        }
        return estadoNombre;
    }
    public void setEstadoNombre(String estadoNombre) {
        this.estadoNombre = estadoNombre;
    }


    public String getActividadMejoraCodigo() {
        actividadMejoraCodigo = "";
        if (actividadMejora != null) {
            actividadMejoraCodigo = actividadMejora.getCodigo();
        }
        return actividadMejoraCodigo;
    }
    public void setActividadMejoraCodigo(String actividadMejoraCodigo) {
        this.actividadMejoraCodigo = actividadMejoraCodigo;
    }


    public String getActividadMejoraDescripcion() {
        actividadMejoraDescripcion = "";
        if (actividadMejora != null) {
            actividadMejoraDescripcion = actividadMejora.getDescripcion();
        }
        return actividadMejoraDescripcion;
    }
    public void setActividadMejoraDescripcion(String actividadMejoraDescripcion) {
        this.actividadMejoraDescripcion = actividadMejoraDescripcion;
    }
    

    public String getUsuarioNombre() {
        usuarioNombre = "";
        if (usuario != null) {
            usuarioNombre = usuario.getNombreUsuario();
        }
        return usuarioNombre;
    }

    public void setUsuarioNombre(String usuarioNombre) {
        this.usuarioNombre = usuarioNombre;
    }

    
}

Repository

  • Ahora creamos los repository

BitacoraARRRepository.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.repository;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import org.springframework.stereotype.Repository;
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;


/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Repository para la administración de la entidad {@link BitacoraARR}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion: 11/04/2o23
  * @Version: 1.0.0
 */
@Repository
public interface BitacoraARRRepository extends GenericRepository<BitacoraARR> {

}

BitacoraAMRepository.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.repository;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import org.springframework.stereotype.Repository;
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Repository para la administración de la entidad {@link BitacoraAM}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion: 11/04/2o23
  * @Version: 1.0.0
 */
@Repository
public interface BitacoraAMRepository extends GenericRepository<BitacoraAM> {

}

Service

  • Creamos service

BitacoraARRService.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.service;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Interface para la administración de la entidad {@link BitacoraARR}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion: 11/04/2023
 * @Version: 1.0.0.
 */
public interface BitacoraARRService extends EntityService<BitacoraARR> {

}

BitacoraAMService.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.service;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Interface para la administración de la entidad {@link BitacoraAM}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion: 11/04/2023
 * @Version: 1.0.0.
 */
public interface BitacoraAMService extends EntityService<BitacoraAM> {

}

ServiceImpl

  • Ahora creamos la implementaciones

BitacoraARRServiceImpl.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.service;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;
import cr.ac.una.cgi.sigesa.ppi.mcg.repository.BitacoraARRRepository;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Clase que implementa el servicio {@link BitacoraARRService} para la entidad
 * {@link BitacoraARR}
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion: 11/04/2023
 * @version: 1.0.0
 */
@Service
@Transactional
public class BitacoraARRServiceImpl extends EntityServiceImpl<BitacoraARR, BitacoraARRRepository> implements BitacoraARRService {

}

BitacoraAMServiceImpl.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.service;


/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;
import cr.ac.una.cgi.sigesa.ppi.mcg.repository.BitacoraAMRepository;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Clase que implementa el servicio {@link BitacoraAMService} para la entidad
 * {@link BitacoraAM}
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion: 11/04/2023
 * @version: 1.0.0
 */
@Service
@Transactional
public class BitacoraAMServiceImpl extends EntityServiceImpl<BitacoraAM, BitacoraAMRepository> implements BitacoraAMService {

}

MAPEOS

1. MAPEO: ActividadRespuestaRiesgo.java ->BitacoraARR.java (JPA-ARR)

  • Para crear el mapeo dentro de ActividadRespuestaRiesgos.java
  • Agregamos los import’s necesarios
import javax.persistence.OneToMany;
import java.util.List;
import javax.persistence.CascadeType;
  • Ahora debemos crear la relación (mapeo) que existe entre la entidad «ActividadRespuestaRiesgo» y «BitacoraARR»
  • Esta relación se da a través del la columna de «ACTIVIDAD_RIESGO» dentro de bitacora
  • Entonces a ARR le vamos a decir usted tiene un hijo que es una lista de BitacoraARR, con la siguiente instrucción
// ***************************************
// MAPEO: ACTIVIDAD_RESPUESTA_RIESGO->BITACORA_ARR
// ***************************************
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "ACTIVIDAD_RIESGO", nullable = false)
private List<BitacoraARR> listaBitacoraARR;
  • Y ademas de esto debemos crear los GET’s y Set’s de la lista
// ***************************************
    // MAPEO: ACTIVIDAD_RESPUESTA_RIESGO->BITACORA_ARR
    // ***************************************
    public List<BitacoraARR> getListaBitacoraARR() {
        return listaBitacoraARR;
    }

    public void setListaBitacoraARR(List<BitacoraARR> listaBitacoraARR) {
        this.listaBitacoraARR = listaBitacoraARR;
    } 

2. MAPEO: BitacoraARR.java -> ActividadRespuestaRiesgo.java (JPA-ARR)

  • Ahora como ya le indicamos al padre quien es su hijo ahora debemos indicarle al hijo quien es su padre
  • Para esto sobre el archivo BitacoraARR.java
  • Primero agregamos los inports necesarios
import javax.persistence.FetchType;
  • Y le vamos a modificar la definición del siguiente campo
@ManyToOne
@JoinColumn(name = "ACTIVIDAD_RIESGO")
private ActividadRespuestaRiesgo actividadRespuestaRiesgo;
  • Y la vamos a dejar así
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ACTIVIDAD_RIESGO",
            referencedColumnName = "ID_ACTIVIDAD_RESPUESTA_RIESGO",
            nullable = false,
            insertable = false,
            updatable = false)
private ActividadRespuestaRiesgo actividadRespuestaRiesgo;
  • Aquí estamos indicando que la columna «ACTIVIDAD_RIESGO», referencia a ActividadRespuestaRiesgo por el campo «ID_ACTIVIDAD_RESPUESTA_RIESGO»

Mapeo: ActividadMejora -> BitacoraAM

  • Para crear el mapeo dentro de ActividadRespuestaRiesgos.java
  • Agregamos los import’s necesarios
import javax.persistence.OneToMany;
import java.util.List;
import javax.persistence.CascadeType;
  • Ahora debemos crear la relación (mapeo) que existe entre la entidad “ActividadMejora” y “BitacoraAM”
  • Esta relación se da a través del la columna de “ACTIVIDAD_MEJORA” dentro de bitacora
  • Entonces a ARR le vamos a decir usted tiene un hijo que es una lista de BitacoraARR, con la siguiente instrucción
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "ACTIVIDAD_MEJORA", nullable = false)
private List<BitacoraAM> listaBitacoraAM;
  • Y ademas de esto debemos crear los GET’s y Set’s de la lista
public List<BitacoraAM> getListaBitacoraAM() {
        return listaBitacoraAM;
    }

    public void setListaBitacoraAM(List<BitacoraAM> listaBitacoraAM) {
        this.listaBitacoraAM = listaBitacoraAM;
    }

2. MAPEO: BitacoraAM.java -> ActividadMejora.java (JPA-AM)

  • Ahora como ya le indicamos al padre quien es su hijo ahora debemos indicarle al hijo quien es su padre
  • Para esto sobre el archivo BitacoraARR.java
  • Primero agregamos los inports necesarios
import javax.persistence.FetchType;
  • Y le vamos a modificar la definición del siguiente campo
@ManyToOne
@JoinColumn(name = "ACTIVIDAD_MEJORA")
private ActividadMejora actividadMejora;
  • Y la vamos a dejar así
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ACTIVIDAD_MEJORA",
            referencedColumnName = "ID_ACTIVIDAD_MEJORA",
            nullable = false,
            insertable = false,
            updatable = false)
private ActividadMejora actividadMejora;
  • Aquí estamos indicando que la columna “ACTIVIDAD_MEJORA”, referencia a ActividadMejora por el campo “ID_ACTIVIDAD_MEJORA”

Beans

  • Como lo que estamos haciendo en un mastero / detalle debemos crear los Beans para las bitacoras pero que sean de tipo ASER
  • Creamos los bean’s tipo ASER

BitacoraARRBean.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.view.model;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion: 12/04/2023
 * @version: 1.0.0
 */
@Component
@Scope("session")
public class BitacoraARRBean extends ASERImpl<BitacoraARR> implements ASER {

    public BitacoraARRBean() {

    }

    @PostConstruct
    public void init() {

        List<ASERColumn> columns = new ArrayList<>();
        
     
        ASERColumn column1 = new ASERColumn("estadoNombre",                         getI18n("bitacoraARR_estadoNombre_label"),                          true);
        ASERColumn column2 = new ASERColumn("fecha",                                getI18n("bitacoraARR_fecha_label"),                                 true);        
        ASERColumn column3 = new ASERColumn("usuarioCedula",                        getI18n("bitacoraARR_usuarioCedula_label"),                         true);
        ASERColumn column4 = new ASERColumn("justificacion",                        getI18n("bitacoraARR_justificacion_label"),                         true);

        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);


        this.setColumnsDetails(columns);
    }
}

BitacoraAMBean.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.view.model;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;



/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 *
 * @author: Gustavo Matamoros González
 * @fechaCreacion: 12/04/2023
 * @version: 1.0.0
 */
@Component
@Scope("session")
public class BitacoraAMBean extends ASERImpl<BitacoraAM> implements ASER {

    public BitacoraAMBean() {

    }
    
    @PostConstruct
    public void init() {

        List<ASERColumn> columns = new ArrayList<>();
        
        ASERColumn column1 = new ASERColumn("estadoNombre",                         getI18n("bitacoraARR_estadoNombre_label"),                 true);
        ASERColumn column2 = new ASERColumn("fecha",                                getI18n("bitacoraARR_fecha_label"),                        true);        
        ASERColumn column3 = new ASERColumn("usuarioNombre",                        getI18n("bitacoraARR_usuarioNombre_label"),                true);
        ASERColumn column4 = new ASERColumn("justificacion",                        getI18n("bitacoraARR_justificacion_label"),                true);

        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);

        this.setColumnsDetails(columns);
    }
}
  • Con esto ya tenemos los necesario para que se pueda mostrar el contenido de las bitacoras
  • Ahora falta definir donde deseamos que se muestre o se inicialicen los valores
  • Para BitacoraARR sería en el editForm de ActividadRespuestaRiesgo
  • Para BitacoraAM sería en el editForm de ActividadMejora

ActividadRespuestaRiesgoBean.java

  • El archivo actualmente se encuentra así
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.view.model;


/**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.beans.factory.annotation.Autowired;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.TipoActividadRiesgo;

/**********************************************************************/
/**********************************************************************/
/*********************   DOCUMENTACIÓN   ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Spring Bean Session para la administración de la entidad {@link ActividadRespuestaRiesgo}
 *
 * @author Gustavo Matamoros González
 * @fecha 16/12/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ActividadRespuestaRiesgoBean extends CRUDImpl<ActividadRespuestaRiesgo, ActividadRespuestaRiesgoService> implements CRUD {



     /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @PostConstruct
    public void init() {

        this.activeTab = 0;
        List<CRUDColumn> columns = new ArrayList<>();

        CRUDColumn column1 = new CRUDColumn("codigo",                               getI18n("actividadRespuestaRiesgo_codigo_label"),                       true);
        CRUDColumn column2 = new CRUDColumn("descripcion",                          getI18n("actividadRespuestaRiesgo_descripcion_label"),                  true);
        
        CRUDColumn column3 = new CRUDColumn("nombreTipoActividadRiesgo",            getI18n("actividadRespuestaRiesgo_tipoActividadRiesgoNombre_label"),    true, "tipoActividadRiesgo.nombre");
        CRUDColumn column4 = new CRUDColumn("codigoUnidadEjecutora",                getI18n("actividadRespuestaRiesgo_unidadEjecutoraCodigo_label"),        true, "unidadEjecutora.codigo");
        CRUDColumn column5 = new CRUDColumn("nombreUnidadEjecutora",                getI18n("actividadRespuestaRiesgo_nombreUnidadEjecutora_header"),                    true, "unidadEjecutora.nombre");       
        CRUDColumn column6 = new CRUDColumn("annoPeriodoAnualInicial",              getI18n("actividadRespuestaRiesgo_periodoAnualInicialAnno_label"),      true, "periodoAnualInicial.ano");
        CRUDColumn column7 = new CRUDColumn("annoPeriodoAnualFinal",                getI18n("actividadRespuestaRiesgo_periodoAnualFinalAnno_label"),        true, "periodoAnualFinal.ano");

        CRUDColumn column8 = new CRUDColumn("activo",                               getI18n("actividadRespuestaRiesgo_activo_label"),                       true);

        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);
        columns.add(column5);
        columns.add(column6);
        columns.add(column7);
        columns.add(column8);


        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************           VARIABLES              *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    // Variable para paso de parametros en LOV
    private Map<String, Object> beanParams = new HashMap();


    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************       FIN VARIABLES              *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITPROPERTIES     *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initProperties() {
        if (!isPostBack()) {
            beanParams.put("activo", true);
        }
    }

    //-----------------------------------------------------------------
    //Variables para manejo de params
    //-----------------------------------------------------------------
    public Map<String, Object> getBeanParams() {
        return beanParams;
    }

    public void setBeanParams(Map<String, Object> beanParams) {
        this.beanParams = beanParams;
    }
    
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITPROPERTIES     *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/










    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {

       

        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/





   


    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Unidad Ejecutora   ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    /* AutoComplete */
    public Page<UnidadEjecutora> completeUnidadEjecutora(String query, Pageable pgbl) {
        return service.autoCompleteUnidadEjecutora(query, pgbl);
    }

    /* Clear: Unidad Ejecutora  */
    public void handleClearUnidadEjecutora() {
        this.getEntity().setUnidadEjecutora(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: Unidad Ejecutora   ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Tipo Actividad Riesgo   *******************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    /* AutoComplete */
    public Page<TipoActividadRiesgo> completeTipoActividadRiesgo(String query, Pageable pageable) {
        return service.autoCompleteTipoActividadRiesgo(query, pageable);
    }

    /* Clear: Tipo Actividad Riesgo  */
    public void handleClearTipoActividadRiesgo() {
        this.getEntity().setTipoActividadRiesgo(null);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: Tipo Actividad Riesgo   *******************************/
    /*************************************************************************************************/
    /*************************************************************************************************/




    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Periodo Anual      ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    /* AutoComplete: Periodo Anual Inicial  */
    public Page<PeriodoAnual> completePeriodoAnualInicial(String query, Pageable pageable) {
        return service.autoCompletePeriodoAnualInicial(query, pageable);
    }

    /* Clear: Periodo Anual Inicial  */
    public void handleClearPeriodoAnualInicial() {
        this.getEntity().setPeriodoAnualInicial(null);
    }

    /* AutoComplete: Periodo Anual Final */
    public Page<PeriodoAnual> completePeriodoAnualFinal(String query, Pageable pageable) {
        return service.autoCompletePeriodoAnualFinal(query, pageable);
    }

    /* Clear: Periodo Anual Final */
    public void handleClearPeriodoAnualFinal() {
        this.getEntity().setPeriodoAnualFinal(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: Periodo Anual      ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Vamos a agregarle el autowired para que pueda acceder al bean de BitacoraARR

Creación de TabView: ARR

  • Ahora vamos a crear el TabView para mostrar la bitacora dentro de la actividad
  • primero le agregamos el import necesario
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;
  • Le agregamos el autowired
@Autowired
BitacoraARRBean bitacoraARRBean;
  • Y en el initDetails debemos indicarle que cargue la lista
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();
        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

actividadRespuestaRiesgoEditForm.xhtml

  • Lo primero que debemos hacer es ubicar el final del PanelGrid
  • Ya que es ahí donde debemos agregar el TabView
  • Agregamos
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <p:tabView id="ARR_TabView" activeIndex="#{actividadRespuestaRiesgoBean.activeTab}">   

        </p:tabView>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
  • Donde:
    • id=»ARR_TabView»: es un id que identifica el tabVieq
    • activeIndex=»#{actividadRespuestaRiesgoBean.activeTab}»: establece en el Bean cual es el tab inicial

ActividadRespuestaRiesgoBean.java

  • ACTIVEINDEX:
    • Como se ve dentro de ActividadRespuestaRiesgoBean.java en la función init(), se debe difinir cual es el número del tab inicial, com la siguiente instrucción
this.activeTab = 0;
  • Ahora este campo se encuentra definido por herencia de SIGESA dentro de «CRUDImpl»
  • Por tanto con solo que indiquemos el valor es suficiente
  • Quedando así
public void init() {
   this.activeTab = 0;
}
  • Ahora para que se inicialice el componete
  • en initDetails debemos agregar
this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();
  • Quedando así
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();
        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Ahora agregamos el import necesario
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;
  • Y le agregamos un Autowired para poder acceder al Bean de la bitacora
@Autowired
BitacoraARRBean bitacoraARRBean;

ActividadMejoraBean.java

  • Hacemos lo mismo
this.activeTab = 0;

public void init() {
   this.activeTab = 0;
}
  • Ahora para que se inicialice el componente
  • en el el InitDetail debemos agregar
public void initDetails() {
        if (!isPostBack()) {
            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));
            bitacoraAMBean.init();
        }
    }
  • Ahora agregamos el import necesario
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;
import org.springframework.beans.factory.annotation.Autowired;
  • Y le agregamos un Autowired para poder acceder al Bean de la bitacora
@Autowired
    BitacoraAMBean bitacoraAMBean;

actividadRespuestaRiesgoEditForm.xhtml

  • Ahora que ya sabemos cual es el tab que se va a mostrar
  • Vamos a crearlo
  • Con esto creamos el tab
  • que tiene que estar despues del fin del panelForm
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++  TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:tab  id="bitacoraARRTab" 
                    title="#{i18n.actividadRespuestaRiesgo_bitacoraARR_tab_label}" >

            </p:tab>
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
  • NOTA: Si requerimos que se muestre solo en ciertos casos podemmom utilizar un render como el siguiente, sin embargo aquí no aplica
rendered="#{planOperativoBean.isTipoEtapaModificacion()}"
  • ahora dentro de tab todos los elementos deben estar dentro de un outputPanel, por tanto le agregamos
<p:outputPanel id ="actividadRespuestaRiesgoOutputPanel">

</p:outputPanel>
  • Y finalmente le agregamos el componete «detailNoEditTableHorizontal» que permite listar el contenido de una tabla solo de consulta
<components:detailNoEditTableHorizontal     id="actividadRespuestaRiesgoDetailNoEditTableHorizontal"
                                                                header="#{i18n.actividadRespuestaRiesgo_bitacoraARR_label}"
                                                                bean="#{bitacoraARRBean}"
                                                                masterBean="#{actividadRespuestaRiesgoBean}"
                                                                showNewButton="false"
                                                                showEditButton="false"
                                                                showDeleteButton="false"
showActions="false"
                                                                container="ARR_TabView:"/>
  • FINAL
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <p:tabView id="ARR_TabView" activeIndex="#{actividadRespuestaRiesgoBean.activeTab}">   

            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++  TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:tab  id="bitacoraARRTab" 
                    title="#{i18n.actividadRespuestaRiesgo_bitacoraARR_tab_label}" >

                
                <p:outputPanel id ="actividadRespuestaRiesgoOutputPanel">

                    <!--####################################################################################-->
                    <!--##########################   NO EDIT TABLE        ##################################-->
                    <!--####################################################################################-->
                    <components:detailNoEditTableHorizontal     id="actividadRespuestaRiesgoDetailNoEditTableHorizontal"
                                                                header="#{i18n.actividadRespuestaRiesgo_bitacoraARR_label}"
                                                                bean="#{bitacoraARRBean}"
                                                                masterBean="#{actividadRespuestaRiesgoBean}"
                                                                showNewButton="false"
                                                                showEditButton="false"
                                                                showDeleteButton="false"
showActions="false"
                                                                container="ARR_TabView:"/>

                </p:outputPanel>

            </p:tab>
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        </p:tabView>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
  • Y finalmente debemos indicar que se ejecute el initDetails
<f:event type="preRenderView" listener="#{actividadRespuestaRiesgoBean.initDetails()}"/>
  • Final
<!--********************************************************************************************-->
    <!--*****************************      PRERENDER     *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="preRender">
        <f:event type="preRenderView" listener="#{actividadRespuestaRiesgoBean.find()}" />
        <f:event type="preRenderView" listener="#{actividadRespuestaRiesgoBean.initProperties()}" />
        <f:event type="preRenderView" listener="#{planOperativoBean.initDetails()}"/>
    </ui:define>
    <!--********************************************************************************************-->
    <!--*****************************  FIN PRERENDER     *******************************************-->
    <!--********************************************************************************************-->

actividadMejoraEditForm.xhtml

  • Ahora que ya sabemos cual es el tab que se va a mostrar
  • Vamos a crearlo
  • Con esto creamos el tab
  • que tiene que estar despues del fin del panelForm
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <p:tabView id="AM_TabView" activeIndex="#{actividadMejoraBean.activeTab}">   

            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++  TAB: BITACORA AM      +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:tab  id="bitacoraAMTab" 
                    title="#{i18n.actividadMejora_bitacoraAM_tab_label}" >

                
                <p:outputPanel id ="actividadMejoraOutputPanel">

                    <!--####################################################################################-->
                    <!--##########################   NO EDIT TABLE        ##################################-->
                    <!--####################################################################################-->
                    <components:detailNoEditTableHorizontal     id="actividadMejoraDetailNoEditTableHorizontal"
                                                                header="#{i18n.actividadMejora_bitacoraAM_label}"
                                                                bean="#{bitacoraAMBean}"
                                                                masterBean="#{actividadMejoraBean}"
                                                                showNewButton="false"
                                                                showEditButton="false"
                                                                showDeleteButton="false"
showActions="false"                                                               container="ARR_TabView:"/>

                </p:outputPanel>

            </p:tab>
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        </p:tabView>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
  • Y finalmente debemos indicar que se ejecute el initDetails
<f:event type="preRenderView" listener="#{actividadMejoraBean.initDetails()}"/>   
  • Final
<ui:define name="preRender">
        <f:event type="preRenderView" listener="#{actividadMejoraBean.find()}"/>        
        <f:event type="preRenderView" listener="#{actividadMejoraBean.initProperties()}"/>    
        <f:event type="preRenderView" listener="#{actividadMejoraBean.initDetails()}"/>    
    </ui:define>
  • Y con esto tenemos el tabView

Actualización de BD relacionar ActividadRespuestaRiesgo->EstadoARR

  • Ahora vamos a crear la siguiente relación y vamos a isertar los datos correctos de los estados
  • Para esto ejecutamos
--*********************************************************************
-- MODIFICACIÓN TABLA: ACTIVIDAD_RESPUESTA_RIESGO
--*********************************************************************

-- ++++++++++++++++++++++++++++++++++
--PASO1: LIMPIAR TABLA: BITACORA_ARR
-- ++++++++++++++++++++++++++++++++++
TRUNCATE TABLE PPI.BITACORA_ARR;

-- ++++++++++++++++++++++++++++++++++
--PASO2: LIMPIAR TABLA DE ESTADOS
-- ++++++++++++++++++++++++++++++++++
TRUNCATE TABLE PPI.ESTADO_ARR;

-- ++++++++++++++++++++++++++++++++++
-- PASO3: REINICIAR SECUENCIA
-- ++++++++++++++++++++++++++++++++++

-- Deteminar valor actual
SELECT PPI.SQ_ESTADO_ARR.CURRVAL FROM DUAL;

-- Modificamos la secuencia para que quede en 1
ALTER SEQUENCE PPI.SQ_ESTADO_ARR INCREMENT by -4;

--Reiniciar la secuencia
SELECT PPI.SQ_ESTADO_ARR.NEXTVAL FROM DUAL;

--Establecemos el incremento
ALTER SEQUENCE PPI.SQ_ESTADO_ARR INCREMENT by 1;

-- ++++++++++++++++++++++++++++++++++
-- PASO4: INSERTAR ESTADOS 
-- ++++++++++++++++++++++++++++++++++
INSERT INTO
ESTADO_ARR (
            ID_ESTADO_ARR,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '1',
            'En Proceso',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_ARR (
            ID_ESTADO_ARR,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '2',
            'Sin Iniciar',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_ARR (
            ID_ESTADO_ARR,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '3',
            'Descartada',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_ARR (
            ID_ESTADO_ARR,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '4',
            'Completado',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;


-- ++++++++++++++++++++++++++++++++++
-- PASO5: AGREGAR COLUMNA ESTADO_ARR 
-- ++++++++++++++++++++++++++++++++++

--Agregar COLUMNA ESTADO_ARR
ALTER TABLE PPI.ACTIVIDAD_RESPUESTA_RIESGO ADD ESTADO_ARR NUMBER (19,0);
  

-- Agregar llave foranea
ALTER TABLE PPI.ACTIVIDAD_RESPUESTA_RIESGO ADD CONSTRAINT FK_ACT_RES_RIE_EST_ARR FOREIGN KEY ( ESTADO_ARR ) REFERENCES PPI.ESTADO_ARR ( ID_ESTADO_ARR );

-- Actualizar los registros de ACTIVIDAD_MEJORA para asignarles el estado 1 "En Proceso
UPDATE "PPI".ACTIVIDAD_RESPUESTA_RIESGO SET ESTADO_ARR='1';

-- Establecer coluna ESTADO_ARR NOT NULL
ALTER TABLE "PPI".ACTIVIDAD_RESPUESTA_RIESGO MODIFY ( ESTADO_ARR NOT NULL);

Relación ActividadMejora->Estado_AM

  • Ejecutamos
--*********************************************************************
-- MODIFICACIÓN TABLA: ACTIVIDAD_MEJORA
--*********************************************************************

-- ++++++++++++++++++++++++++++++++++
--PASO1: LIMPIAR TABLA: BITACORA_AM
-- ++++++++++++++++++++++++++++++++++
TRUNCATE TABLE PPI.BITACORA_AM;

-- ++++++++++++++++++++++++++++++++++
--PASO2: LIMPIAR TABLA DE ESTADOS
-- ++++++++++++++++++++++++++++++++++
TRUNCATE TABLE PPI.ESTADO_AM;

-- ++++++++++++++++++++++++++++++++++
-- PASO3: REINICIAR SECUENCIA
-- ++++++++++++++++++++++++++++++++++

-- Deteminar valor actual
SELECT PPI.SQ_ESTADO_AM.CURRVAL FROM DUAL;

-- Modificamos la secuencia para que quede en 1
ALTER SEQUENCE PPI.SQ_ESTADO_AM INCREMENT by -2;

--Reiniciar la secuencia
SELECT PPI.SQ_ESTADO_AM.NEXTVAL FROM DUAL;

--Establecemos el incremento
ALTER SEQUENCE PPI.SQ_ESTADO_AM INCREMENT by 1;

-- ++++++++++++++++++++++++++++++++++
-- PASO4: INSERTAR ESTADOS 
-- ++++++++++++++++++++++++++++++++++
INSERT INTO
ESTADO_AM (
            ID_ESTADO_AM,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '1',
            'En Proceso',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_AM (
            ID_ESTADO_AM,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '2',
            'Sin Iniciar',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_AM (
            ID_ESTADO_AM,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '3',
            'Descartada',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;

INSERT INTO
ESTADO_AM (
            ID_ESTADO_AM,
            NOMBRE,
            ACTIVO,
            FECHA_CREACION,
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            CAMPO_CONFIGURABLE,
            VERSION) 
values (
            '4',
            'Completado',
            '1',
            SYSDATE,
            '55998',
            SYSDATE,
            '55998',
            null,
            '0'
);
SELECT PPI.SQ_ESTADO_ARR.nextval  from dual;


-- ++++++++++++++++++++++++++++++++++
-- PASO5: AGREGAR COLUMNA ESTADO_AM 
-- ++++++++++++++++++++++++++++++++++

--Agregar COLUMNA ESTADO_AM
ALTER TABLE PPI.ACTIVIDAD_MEJORA ADD ESTADO_AM NUMBER (19,0);
  

-- Agregar llave foranea
ALTER TABLE PPI.ACTIVIDAD_MEJORA ADD CONSTRAINT FK_ACT_MEJ_EST_AM FOREIGN KEY ( ESTADO_AM ) REFERENCES PPI.ESTADO_AM ( ID_ESTADO_AM );

-- Actualizar los registros de ACTIVIDAD_MEJORA para asignarles el estado 1 "En Proceso"
UPDATE "PPI".ACTIVIDAD_MEJORA SET ESTADO_AM='1';

-- Establecer coluna ESTADO_AM NOT NULL
ALTER TABLE "PPI".ACTIVIDAD_MEJORA MODIFY ( ESTADO_AM NOT NULL);

Modificación JPA: ActividadRespuestaRiesgo.java

  • Agregamos mapeo
// ***************************************
    // MAPEO: ACTIVIDAD_RESPUESTA_RIESGO->ESTADO_ARR
    // ***************************************
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ESTADO_ARR", nullable = false)
    private EstadoARR estadoARR;
  • Agregamos get y set mapeo
// ***************************************
    // MAPEO: ACTIVIDAD_RESPUESTA_RIESGO->ESTADO_ARR
    // ***************************************
    public EstadoARR getEstadoARR() {
        return estadoARR;
    }

    public void setEstadoARR(EstadoARR estadoARR) {
        this.estadoARR = estadoARR;
    }
  • Agregamos trasient
// ***************************************
    // MAPEO: ACTIVIDAD_RESPUESTA_RIESGO->ESTADO_ARR
    // ***************************************
    @Transient
    private String nombreEstadoARR;
  • Agregamos get y set trasient
// ***************************************
    // TRASIENT: ACTIVIDAD_RESPUESTA_RIESGO->ESTADO_ARR
    // ***************************************

    // ESTADO_ARR: GET Nombre
    public String getNombreEstadoARR() {
        nombreEstadoARR = "";
        
        if (estadoARR != null) {
            nombreEstadoARR = estadoARR.getNombre();
        }
        
        return nombreEstadoARR;
    }
    // ESTADO_ARR: SET Nombre
    public void setNombreEstadoARR(String nombreEstadoARR) {
        this.nombreEstadoARR = nombreEstadoARR;

Modificación JPA: ActividadMejora.java

  • Agregamos mapeo
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ESTADO_AM", nullable = false)
    private EstadoAM estadoAM;
  • Agregamos los get y set de mapeo
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    public EstadoAM getEstadoAM() {
        return estadoAM;
    }

    public void setEstadoAM(EstadoAM estadoAM) {
        this.estadoAM = estadoAM;
    }
  • Agregamos el trasient
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    @Transient
    private String nombreEstadoAM;
  • Get y set trasient
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    public String getNombreEstadoAM() {
        nombreEstadoAM = "";
        
        if (estadoAM != null) {
            nombreEstadoAM = estadoAM.getNombre();
        }
        
        return nombreEstadoAM;
    }
    public void setNombreEstadoAM(String nombreEstadoAM) {
        this.nombreEstadoAM = nombreEstadoAM;
    }

ActividadRespuestaRiesgoServiceImpl.java

  • Ahora debemos agregarle el autowired
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;

@Autowired
EstadoARRService estadoARRService;

ActividadMejoraServiceImpl.java

  • Autowired
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;

@Autowired
    EstadoAMService estadoAMService;

Creación de autocomplete

EstadoARRRepository.java

  • Agregamos imports necesarios
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Creamos metodo
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoARR> según su nombre y la condición de activo
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoARR> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);

EstadoAMRepository.java

  • Agregamos import’s necesarios
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Creamos metodo
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoAM> según su nombre y la condición de activo
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoAM> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);

EstadoARRService.java

  • Imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoARR> según su nombre y la condición de activo
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoARR> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);

EstadoAMService.java

  • imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoAM> según su nombre y la condición de activo
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoAM> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable);

EstadoARRServiceImpl.java

  • imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable
  • metodo
/**********************************************************************/
    /**
     * Ver {@link EstadoARRService#findAllByNombreIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    @Override
    public Page<EstadoARR> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable) {

        return repository.findAllByNombreIgnoreCaseLikeAndActivo("%" + nombre + "%", activo, pageable);
    }

EstadoAMServiceImpl.java

  • Imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • metodo
/**********************************************************************/
    /**
     * Ver {@link EstadoAMService#findAllByNombreIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }
     * 
     * @param nombre : nombre por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    @Override
    public Page<EstadoAM> findAllByNombreIgnoreCaseLikeAndActivo(String nombre, Boolean activo, Pageable pageable) {

        return repository.findAllByNombreIgnoreCaseLikeAndActivo("%" + nombre + "%", activo, pageable);
    }

ActividadRespuestaRiesgoService.java

  • imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
  • definición
/**********************************************************************/
   /**
    * Definición autocomplete EstadoARR
    * 
    * @param query : consulta del usuario
    * @param pgbl : para paginación
    * @return 
    */
   /**********************************************************************/
   public Page<EstadoARR> autoCompleteEstadoARR(String query, Pageable pgbl);

ActividadMejoraService.java

  • Imports
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
  • Definición
/**********************************************************************/
    /**
        * Definición autocomplete EstadoAM
        * 
        * @param query : consulta del usuario
        * @param pgbl : para paginación
        * @return 
        */
    /**********************************************************************/
    public Page<EstadoAM> autoCompleteEstadoAM(String query, Pageable pgbl);

ActividadRespuestaRiesgoServiceImpl.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;
  • autowired
@Autowired
    EstadoARRService estadoARRService;
  • metodo
/**********************************************************************/
    /*********** FUNCIÓN: autoCompleteEstadoARR               *************/
    /**********************************************************************/
    @Override
    public Page<EstadoARR> autoCompleteEstadoARR(String query, Pageable pgbl) {
        return estadoARRService.findAllByNombreIgnoreCaseLikeAndActivo(query,Boolean.TRUE, pgbl);
    }

ActividadMejoraServiceImpl.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;
  • autowired
@Autowired
    EstadoAMService estadoAMService;
  • Metodo
/**********************************************************************/
    /**
     * Ver {@link ActividadMejoraService#findAllByNombreIgnoreCaseLikeAndActivo }
     * @author Gustavo Matamoros González
     * @since 14/04/2023
     * @issue PPI-381  
     * @param query
     * @param pgbl
     * @return Page<EstadoAM>
     */
    /**********************************************************************/
    @Override
    public Page<EstadoAM> autoCompleteEstadoAM(String query, Pageable pgbl) {
        return estadoAMService.findAllByNombreIgnoreCaseLikeAndActivo(query,Boolean.TRUE, pgbl);
    }

ActividadRespuestaRiesgoBean.java

/*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Estado ARR         ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public Page<EstadoARR> completeEstadoARR(String query, Pageable pageable) {
        return service.autoCompleteEstadoARR(query, pageable);
    }

/* Clear: Estado ARR */
    public void handleClearEstadoARR() {
        this.getEntity().setEstadoARR(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: Estado ARR         ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

ActividadMejoraBean.java

/**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public Page<EstadoAM> completeEstadoAM(String query, Pageable pageable) {
        return service.autoCompleteEstadoAM(query, pageable);
    }
/* Clear: Estado AM */
    public void handleClearEstadoAM() {
        this.getEntity().setEstadoAM(null);
    }

actividadRespuestaRiesgoEditForm.xhtml

  • Agregamos
<!--####################################################################################-->
            <!--##########################      ESTADO_ARR        ##################################-->
            <!--####################################################################################-->

            <!--LABEL-->
            <p:outputLabel  id="actividadRespuestaRiesgo_estadoARR_OutputLabel"
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                            value="#{i18n.actividadRespuestaRiesgo_estadoARR_label}"/>

            <!--PANEL-->
            <p:outputPanel  id="actividadRespuestaRiesgo_estadoARR_OutputPanel">
                
                <!-- AUTOCOMPLETE -->
                <una:autoCompletePaginator  id="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                            paginator="true"
                                            paginationRows="10"
                                            dropdown="true"
                                            value="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                            var="estadoARR"
                                            itemLabel="#{estadoARR.nombre}"
                                            itemValue="#{estadoARR}"
                                            completeMethod="#{actividadRespuestaRiesgoBean.completeEstadoARR}"
                                            converter="#{estadoARRBean.converter}"
                                            forceSelection="true"
                                            noSelectedOption="true"
                                            noSelectedLabel="#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}"
                                            onNoSelectedOption="#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}"
                                            size="40"
                                            scrollHeight="200"
                                            required="true">
                        <p:ajax event="itemSelect"
                                process="@this"
                                update="@this"/>
                        
                </una:autoCompletePaginator>

                <!-- LOV -->
                <!--components:dialogFrameworkData id="actividadRespuestaRiesgo_periodoAnualFinal_ListDialog"
                                                lOVBean="#{periodoAnualLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.periodoAnualFinal}"
                                                update="actividadRespuestaRiesgo_periodoAnualFinal_AutoComplete"
                                                methodName="findAllOrderByAnoDesc"
                                                title="#{i18n.actividadRespuestaRiesgo_periodoAnualFinal_lov_label}"/-->

                <!--MENSAJE-->
                <p:message  id="actividadRespuestaRiesgo_estadoARR_Message" 
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"/>
            </p:outputPanel>


            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->

actividadMejoraEditForm.xhtml

  • agregamos
<!--  estado AM -->
                <p:outputLabel id="estadoAMOutputLabel"
                               for="estadoAMAutoComplete"
                               value="#{i18n.actividadMejora_estadoAM_label}"/>

                <p:outputPanel id="estadoAMOutputPanel">
                    <una:autoCompletePaginator id="estadoAMAutoComplete" 
                                               paginator="true"
                                               disabled="false"
                                               paginationRows="10"
                                               dropdown="true"
                                               value="#{actividadMejoraBean.entity.estadoAM}"
                                               var="estadoAM"
                                               itemLabel="#{estadoAM.nombre}"
                                               itemValue="#{estadoAM}"
                                               completeMethod="#{actividadMejoraBean.completeEstadoAM}"
                                               converter="#{estadoAMBean.converter}"
                                               forceSelection="true"
                                               noSelectedOption="true"
                                               noSelectedLabel="#{i18n.actividadMejora_estadoAM_select_label}"
                                               onNoSelectedOption="#{actividadMejoraBean.handleClearEstadoAM()}"
                                               size="40"
                                               scrollHeight="200"
                                               required="true">
                        <p:ajax event="itemSelect"
                                process="@this"/>
                    </una:autoCompletePaginator>
                    <!--components:dialogFrameworkData id="periodoAnualFinalListDialog"
                                                    lOVBean="#{periodoAnualLOVBean}"
                                                    target="#{actividadMejoraBean.entity.periodoAnualFinal}"
                                                    update="periodoAnualFinalAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_periodoAnualFinal_lov_label}"/-->
                </p:outputPanel>
                <p:outputPanel id="estadoAMMessageOutPutPanel">
                    <p:message id="estadoAMMessage" 
                               for="estadoAMAutoComplete"/>
                </p:outputPanel>

Creación de LOV

EstadoARRLOVBean.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.view.LOV;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import cr.ac.una.cgi.sdkuna.view.commons.LOV;
import cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;
import cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoARRService;


/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**
 * Spring LOVBean Session para la administración de la entidad {@link EstadoARR}
 *
 * @author Gustavo Matamoros González
 * @fecha 14/04/2023
 */
@Component
@Scope("session")
public class EstadoARRLOVBean extends LOVImpl<EstadoARR, EstadoARRService> implements LOV, Serializable {

    public EstadoARRLOVBean() {

    }

    @PostConstruct
    public void init() {

        List<LOVColumn> columns = new ArrayList<>();

        LOVColumn column1 = new LOVColumn("nombre",             getI18n("estadoARR_nombre_label"),            true);

        columns.add(column1);

        this.setTableColumns(columns);

    }

}

EstadoAMLOVBean.java

/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.mcg.view.LOV;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import cr.ac.una.cgi.sdkuna.view.commons.LOV;
import cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;
import cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.EstadoAMService;

/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**
 * Spring LOVBean Session para la administración de la entidad {@link EstadoAM}
 *
 * @author Gustavo Matamoros González
 * @fecha 14/04/2023
 */
@Component
@Scope("session")
public class EstadoAMLOVBean extends LOVImpl<EstadoAM, EstadoAMService> implements LOV, Serializable {

    public EstadoAMLOVBean() {

    }

    @PostConstruct
    public void init() {

        List<LOVColumn> columns = new ArrayList<>();

        LOVColumn column1 = new LOVColumn("nombre",             getI18n("estadoAM_nombre_label"),            true);

        columns.add(column1);

        this.setTableColumns(columns);

    }

}

EstadoARRRepository.java

  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoARR> según la condición de activo
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoARR> findAllByActivo(Boolean activo, Pageable pageable);

EstadoAMRepository.java

  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoAM> según la condición de activo
     * 
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoAM> findAllByActivo(Boolean activo, Pageable pageable);

EstadoARRService.java

  • Imports
import java.util.ArrayList;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import java.util.Map;
  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoARR> según la condición de activo para LOV
     * 
     * @param filterSpecifications : filterSpecifications
     * @param pageable : parametro utilizado para paginación
     * @param params: para envió de parametros del LOV
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoARR> findAllByActivoLOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params);

EstadoAMService.java

  • Imports
import java.util.ArrayList;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import java.util.Map;
  • Definición
/**********************************************************************/
    /**
     * Definición que retorna un Page<EstadoAM> según la condición de activo para LOV
     * 
     * @param filterSpecifications : filterSpecifications
     * @param pageable : parametro utilizado para paginación
     * @param params: para envió de parametros del LOV
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    public Page<EstadoAM> findAllByActivoLOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params);

EstadoARRServiceImpl.java

  • Imports
import java.util.ArrayList;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import java.util.Map;
  • Metodo
/**********************************************************************/
    /**
     * Método que retorna un Page<EstadoARR> según la condición de activo para LOV
     * 
     * @param filterSpecifications : filterSpecifications
     * @param pageable : parametro utilizado para paginación
     * @param params: para envió de parametros del LOV
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    @Override
    public Page<EstadoARR> findAllByActivoLOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params){
        this.setFilterSpecifications(filterSpecifications);
        return repository.findAllByActivo(Boolean.TRUE,pageable);
    }

EstadoAMServiceImpl.java

  • Imports
import java.util.ArrayList;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import java.util.Map;
  • Metodo
/**********************************************************************/
    /**
     * Método que retorna un Page<EstadoAM> según la condición de activo para LOV
     * 
     * @param filterSpecifications : filterSpecifications
     * @param pageable : parametro utilizado para paginación
     * @param params: para envió de parametros del LOV
     * @author Gustavo Matamoros González
     * @sice: 14/04/2023
     * @Version: 1.0.0
     * @modulo: PPI-MCG
     * @issue: PPI-380
     */
    /**********************************************************************/
    @Override
    public Page<EstadoAM> findAllByActivoLOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params){
        this.setFilterSpecifications(filterSpecifications);
        return repository.findAllByActivo(Boolean.TRUE,pageable);
    }

actividadRespuestaRiesgoEditForm.xhtml

  • Actulizamos el componente
<components:dialogFrameworkData id="actividadRespuestaRiesgo_estadoARR_ListDialog"
                                                lOVBean="#{estadoARRLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                                update="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                                methodName="findAllByActivoLOV"
                                                title="#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}"/>
  • Quedando así
<!--####################################################################################-->
            <!--##########################      ESTADO_ARR        ##################################-->
            <!--####################################################################################-->

            <!--LABEL-->
            <p:outputLabel  id="actividadRespuestaRiesgo_estadoARR_OutputLabel"
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                            value="#{i18n.actividadRespuestaRiesgo_estadoARR_label}"/>

            <!--PANEL-->
            <p:outputPanel  id="actividadRespuestaRiesgo_estadoARR_OutputPanel">
                
                <!-- AUTOCOMPLETE -->
                <una:autoCompletePaginator  id="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                            paginator="true"
                                            paginationRows="10"
                                            dropdown="true"
                                            value="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                            var="estadoARR"
                                            itemLabel="#{estadoARR.nombre}"
                                            itemValue="#{estadoARR}"
                                            completeMethod="#{actividadRespuestaRiesgoBean.completeEstadoARR}"
                                            converter="#{estadoARRBean.converter}"
                                            forceSelection="true"
                                            noSelectedOption="true"
                                            noSelectedLabel="#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}"
                                            onNoSelectedOption="#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}"
                                            size="40"
                                            scrollHeight="200"
                                            required="true">
                        <p:ajax event="itemSelect"
                                process="@this"
                                update="@this"/>
                        
                </una:autoCompletePaginator>

                <!-- LOV -->
                <components:dialogFrameworkData id="actividadRespuestaRiesgo_estadoARR_ListDialog"
                                                lOVBean="#{estadoARRLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                                update="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                                methodName="findAllByActivoLOV"
                                                title="#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}"/>

                <!--MENSAJE-->
                <p:message  id="actividadRespuestaRiesgo_estadoARR_Message" 
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"/>
            </p:outputPanel>


            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->

actividadMejoraEditForm.xhtml

  • Actualizamos el componente
<components:dialogFrameworkData id="estadoAMListDialog"
                                                    lOVBean="#{estadoAMLOVBean}"
                                                    target="#{actividadMejoraBean.entity.estadoAM}"
                                                    update="estadoAMAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_estadoAM_lov_label}"/>
  • FINAL
<!--  estado AM -->
                <p:outputLabel id="estadoAMOutputLabel"
                               for="estadoAMAutoComplete"
                               value="#{i18n.actividadMejora_estadoAM_label}"/>

                <p:outputPanel id="estadoAMOutputPanel">
                    <una:autoCompletePaginator id="estadoAMAutoComplete" 
                                               paginator="true"
                                               disabled="false"
                                               paginationRows="10"
                                               dropdown="true"
                                               value="#{actividadMejoraBean.entity.estadoAM}"
                                               var="estadoAM"
                                               itemLabel="#{estadoAM.nombre}"
                                               itemValue="#{estadoAM}"
                                               completeMethod="#{actividadMejoraBean.completeEstadoAM}"
                                               converter="#{estadoAMBean.converter}"
                                               forceSelection="true"
                                               noSelectedOption="true"
                                               noSelectedLabel="#{i18n.actividadMejora_estadoAM_select_label}"
                                               onNoSelectedOption="#{actividadMejoraBean.handleClearEstadoAM()}"
                                               size="40"
                                               scrollHeight="200"
                                               required="true">
                        <p:ajax event="itemSelect"
                                process="@this"/>
                    </una:autoCompletePaginator>
                    <components:dialogFrameworkData id="estadoAMListDialog"
                                                    lOVBean="#{estadoAMLOVBean}"
                                                    target="#{actividadMejoraBean.entity.estadoAM}"
                                                    update="estadoAMAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_estadoAM_lov_label}"/>
                </p:outputPanel>
                <p:outputPanel id="estadoAMMessageOutPutPanel">
                    <p:message id="estadoAMMessage" 
                               for="estadoAMAutoComplete"/>
                </p:outputPanel>

Creación de parametros Estados

  • Ahora vamos a crear los parametros que van a almacear los diferentes estados

EstadoARR

  • Creamos los siguientes parametros en SIGESA
ParametroValor DesarrolloValor Producción
param_ppi_mcg_actividadRespuestaRiesgo_estado_sinIniciar2 
param_ppi_mcg_actividadRespuestaRiesgo_estado_enProceso1 
param_ppi_mcg_actividadRespuestaRiesgo_estado_completado4 
param_ppi_mcg_actividadRespuestaRiesgo_estado_implementada23 
param_ppi_mcg_actividadRespuestaRiesgo_estado_descartada3 

EstadoARRServiceImpl.java

  • Ahora creamos metodos que permitan obtener estos parametros
  • Imports
import cr.ac.una.cgi.sdkuna.domain.Parametro;
import cr.ac.una.cgi.sdkuna.service.ParametroService;
import org.springframework.beans.factory.annotation.Autowired;
  • Autowired
@Autowired
private ParametroService parametroService;
  • Con esto vamos a poder agregar los siguientes metodos
/**
     * Metodo que obtiene el esatdo ARR por tipo de parametro.
     *
     * @param parametro
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR segun parametro
     */
    public EstadoARR findEstadoARRByParametro(Parametro parametro) {
        try {
            return findOne(Long.valueOf(parametro.getValor()));
        } catch (Exception ex) {
            return null;
        }
    }

    /**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRSinIniciar() {
        return findEstadoARRByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadRespuestaRiesgo_estado_sinIniciar"));
    }

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARREnProceso() {
        return findEstadoARRByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadRespuestaRiesgo_estado_enProceso"));
    }

    /**
     * Metodo que obtiene el estado completado.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRCompletado() {
        return findEstadoARRByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadRespuestaRiesgo_estado_completado"));
    }

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRImplementada() {
        return findEstadoARRByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadRespuestaRiesgo_estado_implementada"));
    }

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRDescartada() {
        return findEstadoARRByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadRespuestaRiesgo_estado_descartada"));
    }

EstadoARRService.java

  • Agregamos la definiciones
/**
     * Definición que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRSinIniciar();

    /**
     * Definición que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARREnProceso();

    /**
     * Definición que obtiene el estado completado.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRCompletado();

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRImplementada();
    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRDescartada();

Parametros EstadoAM

  • Agregamos los sigioentes parametros en desarrollo y producción
ParámetroValor DesarrolloValor Producción
param_ppi_mcg_actividadMejora_estado_sinIniciar2 
param_ppi_mcg_actividadMejora_estado_enProceso1 
param_ppi_mcg_actividadMejora_estado_completado4 
param_ppi_mcg_actividadMejora_estado_implementada22 
param_ppi_mcg_actividadMejora_estado_descartada3 

EstadoAMServiceImpl.java

  • Ahora creamos metodos que permitan obtener estos parametros
  • Imports
import cr.ac.una.cgi.sdkuna.domain.Parametro;
import cr.ac.una.cgi.sdkuna.service.ParametroService;
import org.springframework.beans.factory.annotation.Autowired;
  • Autowired
@Autowired
private ParametroService parametroService;
  • Con esto vamos a poder agregar los siguientes metodos
/**
     * Metodo que obtiene el esatdo AM por tipo de parametro.
     *
     * @param parametro
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM segun parametro
     */
    public EstadoAM findEstadoAMByParametro(Parametro parametro) {
        try {
            return findOne(Long.valueOf(parametro.getValor()));
        } catch (Exception ex) {
            return null;
        }
    }

    /**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMSinIniciar() {
        return findEstadoAMByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadMejora_estado_sinIniciar"));
    }

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMEnProceso() {
        return findEstadoAMByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadMejora_estado_enProceso"));
    }

    /**
     * Metodo que obtiene el estado completado.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMCompletado() {
        return findEstadoAMByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadMejora_estado_completado"));
    }

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMImplementada() {
        return findEstadoAMByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadMejora_estado_implementada"));
    }

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMDescartada() {
        return findEstadoAMByParametro(parametroService.findOneByLlave("param_ppi_mcg_actividadMejora_estado_descartada"));
    }

EstadoAMService.java

  • Agregamos la definiciones
/**
     * Definición que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMSinIniciar();

    /**
     * Definición que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMEnProceso();

    /**
     * Definición que obtiene el estado completado.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMCompletado();

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMImplementada();
    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMDescartada();

Justificación

  • Ahora vamos a trabajar en la justificación
  • Esta justificación pertenece a la entidad Bitacora y no al propio objeto
  • Y va ser requerida cuando el usuario modifique el estado
  • por tanto dentro del Bean vamos a crear una bandera que detemine si el usuario a modificado o no el estado

ActividadRespuestaRiesgoBean.java

  • Agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************     VARIABLES        *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // Variable para paso de parametros en LOV
    private Map<String, Object> beanParams = new HashMap();



    //variable que detemina si se modificó o no el estado
    private Boolean existeCambioEstado;

    //Variable que almacena la justificación de la Bitacora
    private String justificacionBitacoraARR;

    // Variable que almacena el estado Inicial para determinar si fue o no modificado
    private EstadoARR estadoARRInicial;

    // Variable para determinar si es una actividad nueva 
    private Boolean actividadNueva;
  • Ahora le agregamos los respectivos get y set
/*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: existeCambioEstado   **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public Boolean isExisteCambioEstado() {
        return this.existeCambioEstado;
    }

    public void setExisteCambioEstado(Boolean existeCambioEstado) {
        this.existeCambioEstado = existeCambioEstado;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: existeCambioEstado   **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************   FUNCIONES: justificacionBitacoraARR   **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public String getJustificacionBitacoraARR() {
        return justificacionBitacoraARR;
    }

    public void setJustificacionBitacoraARR(String justificacionBitacoraARR) {
        this.justificacionBitacoraARR = justificacionBitacoraARR;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************** FIN  FUNCIONES: justificacionBitacoraARR  **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FUNCIONES: actividadNueva           **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public Boolean isActividadNueva() {
        return this.actividadNueva;
    }

    public void setActividadNueva(Boolean actividadNueva) {
        this.actividadNueva = actividadNueva;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /********************   FIN  FUNCIONES: actividadNueva          **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Ahora con estas variables debemos inicializarlas en initDetails
  • agregamos
// Si existe una entidad es una modificación
            if(this.getEntity().getId() != null){

                // obtenemos el estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();
                
                // No es una actividad nueva
                this.setActividadNueva(false);

            //Es una actividad Nueva
            }else{
                this.setActividadNueva(true);
            }

            // Inicializamos la justificación de bitacora en vació
            this.setJustificacionBitacoraARR("");

            // Indicamos que no existe un cambio de estado
            this.setExisteCambioEstado(false);
  • Quedando así
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {

            // Si existe una entidad es una modificación
            if(this.getEntity().getId() != null){

                // obtenemos el estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();
                
                // No es una actividad nueva
                this.setActividadNueva(false);

            //Es una actividad Nueva
            }else{
                this.setActividadNueva(true);
            }

            // Inicializamos la justificación de bitacora en vació
            this.setJustificacionBitacoraARR("");

            // Indicamos que no existe un cambio de estado
            this.setExisteCambioEstado(false);


            // Inicializar la lista de bitacora
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();
        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Ahora creamos la función que se va a encargar de de actulizar la variable ExistejCambioEstado
/**********************************************************************/
    /**
     * Función que actualiza el estado 
     * @author Gustavo Matamoros González
     * @since 18/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioEstado(){

        // Si es una actualización
        if(this.estadoARRInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                this.setJustificacionBitacoraARR("");
                this.setExisteCambioEstado(false);
            }else{
                this.setExisteCambioEstado(true);
            }
        }else{
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
            
        }
        
    }

actividadRespuestaRiesgoEditForm.xhtml

  • Ahora vamos a agregar el código necesario para mostrar la justificación
  • Lo primero sería aplicar el siguiente código para cuando se seleccione un nuevo estado actualice la variable ExisteCambioEstado
  • Por tanto dentro de autoCompletePaginator agregamos
<p:ajax event="itemSelect" 
                                listener="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                update= "@this,
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"
                                process="@this"/>
  • Y para el LOV agregamos
<p:remoteCommand name="updateEstadoAutoComplete"
                                                process="@this"
                                                action="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                                update="@this,
                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"/>
  • Ahora al LOV debemos agregarle los siguientes parametros para que mande a ejecutar el comando remoto
oncomplete="updateEstadoAutoComplete()"
beanFilters="#{actividadRespuestaRiesgoBean.beanParams}"
  • Quedando así
<!--####################################################################################-->
            <!--##########################      ESTADO_ARR        ##################################-->
            <!--####################################################################################-->

            <!--LABEL-->
            <p:outputLabel  id="actividadRespuestaRiesgo_estadoARR_OutputLabel"
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                            value="#{i18n.actividadRespuestaRiesgo_estadoARR_label}"/>

            <!--PANEL-->
            <p:outputPanel  id="actividadRespuestaRiesgo_estadoARR_OutputPanel">
                
                <!-- AUTOCOMPLETE -->
                <una:autoCompletePaginator  id="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                            paginator="true"
                                            paginationRows="10"
                                            dropdown="true"
                                            value="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                            var="estadoARR"
                                            itemLabel="#{estadoARR.nombre}"
                                            itemValue="#{estadoARR}"
                                            completeMethod="#{actividadRespuestaRiesgoBean.completeEstadoARR}"
                                            converter="#{estadoARRBean.converter}"
                                            forceSelection="true"
                                            noSelectedOption="true"
                                            noSelectedLabel="#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}"
                                            onNoSelectedOption="#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}"
                                            size="40"
                                            scrollHeight="200"
                                            required="true">
                        
                        <p:ajax event="itemSelect" 
                                listener="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                update= "@this,
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"
                                process="@this"/>

                        
                </una:autoCompletePaginator>

                <!-- LOV -->
                <components:dialogFrameworkData id="actividadRespuestaRiesgo_estadoARR_ListDialog"
                                                lOVBean="#{estadoARRLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                                update="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                                title="#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}"
                                                oncomplete="updateEstadoAutoComplete()"
                                                beanFilters="#{actividadRespuestaRiesgoBean.beanParams}"
                                                methodName="findAllByActivoLOV"
                                                />
                <p:remoteCommand name="updateEstadoAutoComplete"
                                                process="@this"
                                                action="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                                update="@this,
                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                                :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"/>

                <!--MENSAJE-->
                <p:message  id="actividadRespuestaRiesgo_estadoARR_Message" 
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"/>
            </p:outputPanel>


            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->
  • Ahora debemos agregar el campo de justificación

<!--####################################################################################-->
            <!--##########################     JUSTIFICACION      ##################################-->
            <!--####################################################################################-->
            
            <!--LABEL-->
            <p:outputLabel          id="actividadRespuestaRiesgo_justificacionOutputLabel" 
                                    for="actividadRespuestaRiesgo_justificacionInputTextArea" 
                                    value="#{i18n.actividadRespuestaRiesgo_justificacion_label}"
                                    rendered="#{!actividadRespuestaRiesgoBean.isActividadNueva()}"
                                    />  

            <!--PANEL-->
            <p:outputPanel          id="actividadRespuestaRiesgo_justificacionOutputPanel"
                                    rendered="#{!actividadRespuestaRiesgoBean.isActividadNueva()}">

                <p:inputTextarea    id="actividadRespuestaRiesgo_justificacionInputTextArea"
                                    value="#{actividadRespuestaRiesgoBean.justificacionBitacoraARR}"
                                    counter="actividadRespuestaRiesgo_contador"
                                    cols="25"
                                    rows="4"
                                    maxlength="500"
                                    placeholder="#{i18n.actividadRespuestaRiesgo_justificacion_placeholder}"
                                    counterTemplate="{0} #{i18n.actividadRespuestaRiesgo_justificacion_remaining_label}"
                                    autoResize="false" 
                                    disabled="#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}"
                                    required="#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}"
                                    />
                <h:outputText       id="actividadRespuestaRiesgo_contador"/>

                <p:message          id="actividadRespuestaRiesgo_justificacionMessage" 
                                    for="actividadRespuestaRiesgo_justificacionInputTextArea" 
                                    />
            </p:outputPanel>
            

            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->
  • Aquí es importante que:
  • Va ser requerido si existeCambioEstado esta en true
required="#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}"
  • Y esta deshabilitado si no hay cambio de estado
disabled="#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}"

ActividadMejoraBean.java

  • Ahora debemos aplicarle lo mismo a Actividad de Mejora
  • Agregamos las variables
private Boolean existeCambioEstado;
    private String justificacionBitacoraAM;
    private EstadoAM estadoAMInicial;
    private Boolean actividadNueva;
  • Ahora le agregamos los respectivos get y set
/**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public Boolean isExisteCambioEstado() {
        return existeCambioEstado;
    }

    public void setExisteCambioEstado(Boolean existeCambioEstado) {
        this.existeCambioEstado = existeCambioEstado;
    }

    /**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public String getJustificacionBitacoraAM() {
        return justificacionBitacoraAM;
    }

    public void setJustificacionBitacoraAM(String justificacionBitacoraAM) {
        this.justificacionBitacoraAM = justificacionBitacoraAM;
    }

    /**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public Boolean isActividadNueva() {
        return this.actividadNueva;
    }

    public void setActividadNueva(Boolean actividadNueva) {
        this.actividadNueva = actividadNueva;
    }
  • Ahora con estas variables debemos inicializarlas en initDetails
  • agregamos
if(this.getEntity().getId() != null){
                this.estadoAMInicial = this.getEntity().getEstadoAM();
                 this.setActividadNueva(false);
            }else{
                this.setActividadNueva(true);
            }

            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
  • Quedando así
public void initDetails() {
        if (!isPostBack()) {

            if(this.getEntity().getId() != null){
                this.estadoAMInicial = this.getEntity().getEstadoAM();
                 this.setActividadNueva(false);
            }else{
                this.setActividadNueva(true);
            }

            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);

            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));
            bitacoraAMBean.init();
        }
    }
  • Ahora creamos la función que se va a encargar de de actualizar la variable ExisteCambioEstado
/**********************************************************************/
    /**
     * Función que actualiza el estado 
     * @author Gustavo Matamoros González
     * @since 18/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioEstado(){

        // Si es una actualización
        if(this.estadoAMInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                this.setJustificacionBitacoraAM("");
                this.setExisteCambioEstado(false);
            }else{
                this.setExisteCambioEstado(true);
            }
        }else{
            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
            
        }
        
    }

actividadMejoraEditForm.xhtml

  • Ahora vamos a agregar el código necesario para mostrar la justificación
  • Lo primero sería aplicar el siguiente código para cuando se seleccione un nuevo estado actualice la variable ExisteCambioEstado
  • Por tanto dentro de autoCompletePaginator agregamos
<p:ajax                event="itemSelect" 
                                               listener="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                               update= "@this,
                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"
                                               process="@this"/>
  • Y para el LOV agregamos
<p:remoteCommand name="updateEstadoAutoComplete"
                                                    process="@this"
                                                    action="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                                    update="@this,
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"/>
  • Ahora al LOV debemos agregarle los siguientes parametros para que mande a ejecutar el comando remoto
oncomplete="updateEstadoAutoComplete()"
beanFilters="#{actividadMejoraBean.beanParams}"
  • final
<!--  estado AM -->
                <p:outputLabel id="estadoAMOutputLabel"
                               for="estadoAMAutoComplete"
                               value="#{i18n.actividadMejora_estadoAM_label}"/>

                <p:outputPanel id="estadoAMOutputPanel">
                    <una:autoCompletePaginator id="estadoAMAutoComplete" 
                                               paginator="true"
                                               disabled="false"
                                               paginationRows="10"
                                               dropdown="true"
                                               value="#{actividadMejoraBean.entity.estadoAM}"
                                               var="estadoAM"
                                               itemLabel="#{estadoAM.nombre}"
                                               itemValue="#{estadoAM}"
                                               completeMethod="#{actividadMejoraBean.completeEstadoAM}"
                                               converter="#{estadoAMBean.converter}"
                                               forceSelection="true"
                                               noSelectedOption="true"
                                               noSelectedLabel="#{i18n.actividadMejora_estadoAM_select_label}"
                                               onNoSelectedOption="#{actividadMejoraBean.handleClearEstadoAM()}"
                                               size="40"
                                               scrollHeight="200"
                                               required="true">
                        
                        <p:ajax                event="itemSelect" 
                                               listener="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                               update= "@this,
                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                                       :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"
                                               process="@this"/>

                    </una:autoCompletePaginator>

                    <components:dialogFrameworkData id="estadoAMListDialog"
                                                    lOVBean="#{estadoAMLOVBean}"
                                                    target="#{actividadMejoraBean.entity.estadoAM}"
                                                    update="estadoAMAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_estadoAM_lov_label}"
                                                    oncomplete="updateEstadoAutoComplete()"
                                                    beanFilters="#{actividadMejoraBean.beanParams}"
                                                    />
                    
                    <p:remoteCommand name="updateEstadoAutoComplete"
                                                    process="@this"
                                                    action="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                                    update="@this,
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"/>
                </p:outputPanel>
                <p:outputPanel id="estadoAMMessageOutPutPanel">
                    <p:message id="estadoAMMessage" 
                               for="estadoAMAutoComplete"/>
                </p:outputPanel>
  • Ahora debemos agregar el campo de justificación
<!--Justificación-->
                <p:outputLabel          id="actividadMejora_justificacionOutputLabel" 
                                        for="actividadMejora_justificacionInputTextArea" 
                                        value="#{i18n.actividadMejora_justificacion_label}"
                                        rendered="#{!actividadMejoraBean.isActividadNueva()}"
                            
                            />  
                <p:outputPanel          id="actividadMejora_justificacionOutputPanel"
                                        rendered="#{!actividadMejoraBean.isActividadNueva()}">

                    <p:inputTextarea    id="actividadMejora_justificacionInputTextArea"
                                        value="#{actividadMejoraBean.justificacionBitacoraAM}"
                                        counter="actividadMejora_contador"
                                        cols="25"
                                        rows="4"
                                        maxlength="500"
                                        placeholder="#{i18n.actividadMejora_justificacion_placeholder}"
                                        counterTemplate="{0} #{i18n.actividadMejora_justificacion_remaining_label}"
                                        autoResize="false" 
                                        disabled="#{!actividadMejoraBean.isExisteCambioEstado()}"
                                        required="#{actividadMejoraBean.isExisteCambioEstado()}"
                                />
                <h:outputText       id="actividadMejora_contador"/>

                </p:outputPanel>
                <p:message          id="actividadMejora_justificacionMessage" 
                                    for="actividadMejora_justificacionInputTextArea"
                                    rendered="#{!actividadMejoraBean.isActividadNueva()}"/>

Guardado en la BitacoraARR

  • Ahora vamos a iniciar en el proceso de crear un registro en bitacora

ActividadRespuestaRiesgoBean.java

  • Ahora vamos a crear un servicio que permita guardar un registro de bitacora y lo agrege a la lista
  • NOTA: como ARR contiene una lista de bitacora con solo agregar el registro a la lista al guardar se guardaran sus hijos
  • Pero tenemos la situación que la justificación o pertenece a la entidad si no como una variale del bean
  • Entonces para poder pasar al valor del Bean a Service debemos sobre escribir el método de update para indcarle que agregue a la lista y continue guardando
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @Override
    public String update(){
        String form;
       
        // Mandamos a crear una Bitacora y agregarla a la lista 
        service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);

        form = super.update();

        // Limpiamos la Justificación
        if(!this.justificacionBitacoraARR.isEmpty()){                 
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
        }

        return form;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Con esto estamos pasando la justificación del Bean al service

ActividadRespuestaRiesgoServiceImpl.java

  • Agregamos los import necesarios
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
import cr.ac.una.cgi.sdkuna.service.UsuarioService;

import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;
  • Agregamos los AutoWired
@Autowired
    EstadoARRService estadoARRService;

    @Autowired
    BitacoraARRService bitacoraARRService;

    @Autowired
    UsuarioService usuarioService;
  • Creamos el método para insertar registros en la bitacora
/****************************************************************************************/
    /****************************************************************************************/
    /*****************************      UPDATE         **************************************/
    /****************************************************************************************/
    /****************************************************************************************/
    
    /**********************************************************************/
    /**
     * Función que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR 
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    @Override
    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion){
        BitacoraARR bitacoraARR = new BitacoraARR();
        bitacoraARR.setActividadRespuestaRiesgo(actividadRespuestaRiesgo);
        bitacoraARR.setEstadoARR(actividadRespuestaRiesgo.getEstadoARR());
        bitacoraARR.setFecha(new Date());
        bitacoraARR.setUsuario(usuarioService.getUsuarioActual());
        bitacoraARR.setJustificacion(justificacion);
        actividadRespuestaRiesgo.getListaBitacoraARR().add(bitacoraARR);
    }

ActividadRespuestaRiesgoARRService.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;
  • Creamos la definición del servicio
/**********************************************************************/
    /**
     * Función que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR 
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion);
  • Y con esto al momento de actulizar se almacenará un registro en bitacora

ActividadMejoraBean.java

  • Ahora vamos a crear un servicio que permita guardar un registro de bitacora y lo agrege a la lista
  • NOTA: como AM contiene una lista de bitacora con solo agregar el registro a la lista al guardar se guardaran sus hijos
  • Pero tenemos la situación que la justificación o pertenece a la entidad si no como una variale del bean
  • Entonces para poder pasar al valor del Bean a Service debemos sobre escribir el método de update para indcarle que agregue a la lista y continue guardando
@Override
    public String update(){
        String form;
       
        // Mandamos a crear una Bitacora y agregarla a la lista 
        service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);

        form = super.update();

        // Limpiamos la Justificación
        if(!this.justificacionBitacoraAM.isEmpty()){                 
            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
        }

        return form;
    }
  • Con esto estamos pasando la justificación del Bean al service

ActividadMejoraServiceImpl.java

  • Agregamos los import necesarios
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
import cr.ac.una.cgi.sdkuna.service.UsuarioService;

import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;
  • Agregamos los AutoWired
@Autowired
    EstadoAMService estadoAMService;

    @Autowired
    BitacoraARRService bitacoraARRService;

    @Autowired
    UsuarioService usuarioService;
  • Creamos el método para insertar registros en la bitacora
/****************************************************************************************/
    /****************************************************************************************/
    /*****************************      UPDATE         **************************************/
    /****************************************************************************************/
    /****************************************************************************************/
    
    /**********************************************************************/
    /**
     * Función que crea un objetivo tipo BitacoraARR y lo agrega a listaBitacoraARR 
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    @Override
    public void creaBitacoraARRModificado(ActividadRespuestaRiesgo actividadRespuestaRiesgo, String justificacion){
        BitacoraARR bitacoraARR = new BitacoraARR();
        bitacoraARR.setActividadRespuestaRiesgo(actividadRespuestaRiesgo);
        bitacoraARR.setEstadoARR(actividadRespuestaRiesgo.getEstadoARR());
        bitacoraARR.setFecha(new Date());
        bitacoraARR.setUsuario(usuarioService.getUsuarioActual());
        bitacoraARR.setJustificacion(justificacion);
        actividadRespuestaRiesgo.getListaBitacoraARR().add(bitacoraARR);
    }

ActividadMejoraAMService.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;
  • Creamos la definición del servicio
/**********************************************************************/
    /**
     * Función que crea un objetivo tipo BitacoraAM y lo agrega a listaBitacoraAM
     * @author Gustavo Matamoros González
     * @since 19/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void creaBitacoraAMModificado(ActividadMejora actividadMejora, String justificacion);
  • Y con esto al momento de actuliazar se almacenará un registro en bitacora

Actualización de actividadMejoraEditForm.xhtml

  • Se solicita darle el correcto formato html al edit ya que se presenta de forma incorrecta
  • Correccción
<!--
Copyright (c) 2022.
Centro de Gestion Informatica
Direccion de Tecnologias de la Informacion y Comunicacion
Universidad Nacional - Costa Rica
http://www.una.ac.cr
-->

<!--********************************************************************************************-->
<!--********************************************************************************************-->
<!--*****************************   COMPOSICIÓN   **********************************************-->
<!--********************************************************************************************-->
<!--********************************************************************************************-->
<ui:composition template="/templates/crud.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:una="http://una.ac.cr/ui/components"
                xmlns:components="http://java.sun.com/jsf/composite/components">

    <!--********************************************************************************************-->
    <!--*****************************      PRERENDER     *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="preRender">
        <f:event type="preRenderView" listener="#{actividadMejoraBean.find()}"/>        
        <f:event type="preRenderView" listener="#{actividadMejoraBean.initProperties()}"/>    
        <f:event type="preRenderView" listener="#{actividadMejoraBean.initDetails()}"/>    
    </ui:define>
    <!--********************************************************************************************-->
    <!--*****************************  FIN PRERENDER     *******************************************-->
    <!--********************************************************************************************-->


    <!--********************************************************************************************-->
    <!--*****************************       TITLE        *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="title">#{i18n.actividadMejora_edit_form_title}</ui:define>
    <!--********************************************************************************************-->
    <!--*****************************   FIN TITLE        *******************************************-->
    <!--********************************************************************************************-->


    <!--********************************************************************************************-->
    <!--*****************************       DEFINE       *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="contentCRUD">


        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar editMode="true" 
                            bean="#{actividadMejoraBean}"
                            listForm="actividadMejoraListForm" 
                            editForm="actividadMejoraEditForm"
                            container="panelForm" />
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <una:panelForm  id="panelForm"
                        i18nKey="actividadMejora_edit_form_header"
                        binding="#{panelForm}"
                        header="#{i18n.actividadMejora_edit_form_header}">

            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++    INSTRUCTIONS     ++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->          
            <components:requiredInstructions focus="panelForm" />
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++  FIN INSTRUCTIONS     +++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->


            <!--####################################################################################-->
            <!--######################## CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->
            <!--Entrada oculta para validaciones-->
            <h:inputHidden id="actividadMejoraValidator" value="true" >
                <f:attribute name="actividadMejora" value="#{actividadMejoraBean.entity}"/>
                <f:validator binding="#{actividadMejoraValidator}"/>
            </h:inputHidden> 
            <!--####################################################################################-->
            <!--###################  FIN CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->


            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++++    PANELGRID       +++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <h:panelGrid columns="2" styleClass="una-panelgrid">                              

                <!--####################################################################################-->
                <!--#############################    CÓDIGO    #########################################-->
                <!--####################################################################################-->
                
                <!--LABEL-->
                <p:outputLabel  id="codigoActividadMejoraOutputLabel" 
                                for="codigoActividadMejoraInputText" 
                                value="#{i18n.actividadMejora_codigo_label}"/>  
                <!--PANEL-->
                <p:outputPanel  id="codigoActividadMejoraOutputPanel">

                    <p:inputText    id="codigoActividadMejoraInputText" 
                                    value="#{actividadMejoraBean.entity.codigo}" 
                                    required="false" 
                                    maxlength="30" 
                                    size="30" 
                                    disabled="true"
                                 />   

                    <p:message  id="codigoActividadMejoraMessage" 
                                for="codigoActividadMejoraInputText" />  

                </p:outputPanel>
                
                
                <!--####################################################################################-->
                <!--#############################   DESCRIPCIÓN  #######################################-->
                <!--####################################################################################-->
                
                <!--LABEL-->
                <p:outputLabel  id="descripcionActividadMejoraOutputLabel" 
                                for="descripcionActividadMejoraInputTextArea" 
                                value="#{i18n.actividadMejora_descripcion_label}"/> 
                
                <!--PANEL-->
                <p:outputPanel  id="descripcionActividadMejoraOutputPanel">

                    <p:inputTextarea    id="descripcionActividadMejoraInputTextArea"
                                        value="#{actividadMejoraBean.entity.descripcion}"
                                        counter="contador1"
                                        cols="70"
                                        rows="4"
                                        maxlength="500"
                                        placeholder="#{i18n.actividadMejora_descripcionplaceholder}"
                                        counterTemplate="{0} #{i18n.actividadMejora_caracteresRestantes_label}"
                                        autoResize="false"
                                        disabled="false"/>  
                    <h:outputText   id="contador1"/>

                    <p:message  id="descripcionActividadMejoraMessage" 
                                for="descripcionActividadMejoraInputTextArea" /> 
                </p:outputPanel>
                
                
                
                
                <!--####################################################################################-->
                <!--#####################   UNIDAD EJECUTORA: AUTOCOMPLETE Y LOV #######################-->
                <!--####################################################################################-->
                
                <!--LABEL-->
                <p:outputLabel  id="unidadEjecutoraOutputLabel"
                                for="unidadEjecutoraAutoComplete"
                                value="#{i18n.actividadMejora_nombreUnidadEjecutora_label}"/>

                <!--PANEL-->
                <p:outputPanel  id="unidadEjecutoraOutputPanel">
                    <una:autoCompletePaginator  id="unidadEjecutoraAutoComplete"
                                                paginator="true"
                                                paginationRows="10"
                                                dropdown="true"
                                                value="#{actividadMejoraBean.entity.unidadEjecutora}"
                                                var="unidadEjecutora"
                                                itemLabel="#{unidadEjecutora.codigo}"
                                                itemValue="#{unidadEjecutora}"
                                                completeMethod="#{actividadMejoraBean.completeUnidadEjecutora}"
                                                converter="#{unidadEjecutoraBean.converter}"
                                                forceSelection="true"
                                                disabled="false"
                                                noSelectedOption="true"
                                                noSelectedLabel="#{i18n.actividadMejora_unidadEjecutora_select_label}"
                                                onNoSelectedOption="#{actividadMejoraBean.handleClearUnidadEjecutora()}"
                                                size="40"
                                                scrollHeight="200"
                                                required="true">

                        <p:ajax event="itemSelect"
                                update="@this, :#{p:resolveFirstComponentWithId('nombreUnidadInputText', view).clientId}"
                                process="@this">     
                        </p:ajax>

                    </una:autoCompletePaginator>

                    <components:dialogFrameworkData id="unidadEjecutoraListDialog"
                                                    lOVBean="#{unidadEjecutoraLOVBean}"
                                                    target="#{actividadMejoraBean.entity.unidadEjecutora}"
                                                    disabled="false"
                                                    update="unidadEjecutoraAutoComplete"  
                                                    oncomplete="updateUnidadEjecutoraAutoComplete()"
                                                    title="#{i18n.actividadMejora_unidadEjecutora_lov_label}"/>
                    
                    <p:remoteCommand    name="updateUnidadEjecutoraAutoComplete"
                                        process="@this"
                                        update=":#{p:resolveFirstComponentWithId('nombreUnidadInputText', view).clientId}"/>

                    <p:message  id="unidadEjecutoraMessage" 
                                for="unidadEjecutoraAutoComplete"/>
                    
                </p:outputPanel>
                
                
                <!--####################################################################################-->
                <!--#####################        UNIDAD EJECUTORA: DISPLAY       #######################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="nombreUnidadOutputLabel" 
                                for="nombreUnidadInputText"
                                value="#{i18n.actividadMejora_nombreUnidad_select_label}"/>
                
                <!--PANEL-->
                <p:outputPanel>
                    <p:inputText    id="nombreUnidadInputText"
                                    disabled="true"
                                    value="#{actividadMejoraBean.entity.unidadEjecutora.nombre}"
                                    size="80"/>

                    <p:message  id="nombreUnidadMessage" 
                                for="nombreUnidadInputText"/>
                </p:outputPanel>
                
                
                
                <!--####################################################################################-->
                <!--########################## PERIODO ANUAL INICIAL  ##################################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="periodoAnualInicialOutputLabel"
                                for="periodoAnualInicialAutoComplete"
                                value="#{i18n.actividadMejora_periodoAnualInicial_label}"/>

                <!--PANEL-->
                <p:outputPanel  id="periodoAnualInicialOutputPanel">
                    <una:autoCompletePaginator  id="periodoAnualInicialAutoComplete"
                                                paginator="true"
                                                paginationRows="10"
                                                dropdown="true"
                                                value="#{actividadMejoraBean.entity.periodoAnualInicial}"
                                                var="periodoAnualInicial"
                                                itemLabel="#{periodoAnualInicial.ano}"
                                                itemValue="#{periodoAnualInicial}"
                                                completeMethod="#{actividadMejoraBean.completePeriodoAnual}"
                                                converter="#{periodoAnualBean.converter}"
                                                forceSelection="true"
                                                noSelectedOption="true"
                                                noSelectedLabel="#{i18n.actividadMejora_periodoAnualInicial_select_label}"
                                                onNoSelectedOption="#{actividadMejoraBean.handleClearPeriodoAnualInicial()}"
                                                size="40"
                                                scrollHeight="200"
                                                required="true">

                        <p:ajax event="itemSelect"
                                process="@this"
                                update="periodoAnualInicialAutoComplete,periodoAnualFinalAutoComplete"/>

                    </una:autoCompletePaginator>

                    <components:dialogFrameworkData id="periodoAnualInicialListDialog"
                                                    lOVBean="#{periodoAnualLOVBean}"
                                                    target="#{actividadMejoraBean.entity.periodoAnualInicial}"
                                                    update="periodoAnualInicialAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_periodoAnualInicial_lov_label}"/>

                    <p:message  id="periodoAnualInicialMessage" 
                                for="periodoAnualInicialAutoComplete"/>

                </p:outputPanel>

                

                <!--####################################################################################-->
                <!--########################## PERIODO ANUAL FINAL    ##################################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="periodoAnualFinalOutputLabel"
                                for="periodoAnualFinalAutoComplete"
                                value="#{i18n.actividadMejora_periodoAnualFinal_label}"/>

                <!--PANEL-->
                <p:outputPanel id="periodoAnualFinalOutputPanel">

                    <una:autoCompletePaginator  id="periodoAnualFinalAutoComplete" 
                                                paginator="true"
                                                disabled="false"
                                                paginationRows="10"
                                                dropdown="true"
                                                value="#{actividadMejoraBean.entity.periodoAnualFinal}"
                                                var="periodoAnualFinal"
                                                itemLabel="#{periodoAnualFinal.ano}"
                                                itemValue="#{periodoAnualFinal}"
                                                completeMethod="#{actividadMejoraBean.completePeriodoAnual}"
                                                converter="#{periodoAnualBean.converter}"
                                                forceSelection="true"
                                                noSelectedOption="true"
                                                noSelectedLabel="#{i18n.actividadMejora_periodoAnualFinal_select_label}"
                                                onNoSelectedOption="#{actividadMejoraBean.handleClearPeriodoAnualFinal()}"
                                                size="40"
                                                scrollHeight="200"
                                                required="true">

                        <p:ajax event="itemSelect"
                                process="@this"/>

                    </una:autoCompletePaginator>

                    <components:dialogFrameworkData id="periodoAnualFinalListDialog"
                                                    lOVBean="#{periodoAnualLOVBean}"
                                                    target="#{actividadMejoraBean.entity.periodoAnualFinal}"
                                                    update="periodoAnualFinalAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_periodoAnualFinal_lov_label}"/>

                    <p:message  id="periodoAnualFinalMessage" 
                                for="periodoAnualFinalAutoComplete"/>

                </p:outputPanel>



                <!--####################################################################################-->
                <!--##########################      ESTADO_AM         ##################################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="estadoAMOutputLabel"
                                for="estadoAMAutoComplete"
                                value="#{i18n.actividadMejora_estadoAM_label}"/>

                <!--PANEL-->
                <p:outputPanel id="estadoAMOutputPanel">

                    <una:autoCompletePaginator  id="estadoAMAutoComplete" 
                                                paginator="true"
                                                disabled="false"
                                                paginationRows="10"
                                                dropdown="true"
                                                value="#{actividadMejoraBean.entity.estadoAM}"
                                                var="estadoAM"
                                                itemLabel="#{estadoAM.nombre}"
                                                itemValue="#{estadoAM}"
                                                completeMethod="#{actividadMejoraBean.completeEstadoAM}"
                                                converter="#{estadoAMBean.converter}"
                                                forceSelection="true"
                                                noSelectedOption="true"
                                                noSelectedLabel="#{i18n.actividadMejora_estadoAM_select_label}"
                                                onNoSelectedOption="#{actividadMejoraBean.handleClearEstadoAM()}"
                                                size="40"
                                                scrollHeight="200"
                                                required="true">
                        
                        <p:ajax     event="itemSelect" 
                                    listener="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                    update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"
                                    process="@this"/>

                    </una:autoCompletePaginator>

                    <components:dialogFrameworkData id="estadoAMListDialog"
                                                    lOVBean="#{estadoAMLOVBean}"
                                                    target="#{actividadMejoraBean.entity.estadoAM}"
                                                    update="estadoAMAutoComplete"                                                    
                                                    title="#{i18n.actividadMejora_estadoAM_lov_label}"
                                                    oncomplete="updateEstadoAutoComplete()"
                                                    beanFilters="#{actividadMejoraBean.beanParams}"
                                                    />
                    
                    <p:remoteCommand name="updateEstadoAutoComplete"
                                                    process="@this"
                                                    action="#{actividadMejoraBean.actualizaExisteCambioEstado()}"
                                                    update="@this,
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                                    :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId}"/>
                    
                        <p:message  id="estadoAMMessage" 
                                    for="estadoAMAutoComplete"/>

                </p:outputPanel>

                
                            
                <!--####################################################################################-->
                <!--##########################     JUSTIFICACION      ##################################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel          id="actividadMejora_justificacionOutputLabel" 
                                        for="actividadMejora_justificacionInputTextArea" 
                                        value="#{i18n.actividadMejora_justificacion_label}"
                                        rendered="#{!actividadMejoraBean.isActividadNueva()}"
                            
                            />  

                <!--PANEL-->
                <p:outputPanel          id="actividadMejora_justificacionOutputPanel"
                                        rendered="#{!actividadMejoraBean.isActividadNueva()}">

                    <p:inputTextarea    id="actividadMejora_justificacionInputTextArea"
                                        value="#{actividadMejoraBean.justificacionBitacoraAM}"
                                        counter="actividadMejora_contador"
                                        cols="25"
                                        rows="4"
                                        maxlength="500"
                                        placeholder="#{i18n.actividadMejora_justificacion_placeholder}"
                                        counterTemplate="{0} #{i18n.actividadMejora_justificacion_remaining_label}"
                                        autoResize="false" 
                                        disabled="#{!actividadMejoraBean.isExisteCambioEstado()}"
                                        required="#{actividadMejoraBean.isExisteCambioEstado()}"
                                />
                    
                    <h:outputText       id="actividadMejora_contador"/>

                    <p:message          id="actividadMejora_justificacionMessage" 
                                        for="actividadMejora_justificacionInputTextArea"
                                        rendered="#{!actividadMejoraBean.isActividadNueva()}"/>

                </p:outputPanel>
                

                <!--####################################################################################-->
                <!--##########################        ACTIVO          ##################################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="activoOutputLabel" 
                                for="activoSelectBooleanCheckbox"/>

                
                <p:outputPanel  id="activoSelectOuputPanel">

                    <p:selectBooleanCheckbox    id="activoSelectBooleanCheckbox" 
                                                value="#{actividadMejoraBean.entity.activo}"
                                                itemLabel="#{i18n.actividadMejora_activo_label}">
                    </p:selectBooleanCheckbox>

                    <p:message  id="activoMessage" 
                                for="activoSelectBooleanCheckbox"/>

                </p:outputPanel>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++  FIN PANELGRID       +++++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                

            </h:panelGrid>




            <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++++++      TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
            <p:tabView id="AM_TabView" activeIndex="#{actividadMejoraBean.activeTab}">   

            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++  TAB: BITACORA AM      +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:tab  id="bitacoraAMTab" 
                    title="#{i18n.actividadMejora_bitacoraAM_tab_label}" >

                
                <p:outputPanel id ="actividadMejoraOutputPanel">

                    <!--####################################################################################-->
                    <!--##########################   NO EDIT TABLE        ##################################-->
                    <!--####################################################################################-->
                    <components:detailNoEditTableHorizontal     id="actividadMejoraDetailNoEditTableHorizontal"
                                                                header="#{i18n.actividadMejora_bitacoraAM_label}"
                                                                bean="#{bitacoraAMBean}"
                                                                masterBean="#{actividadMejoraBean}"
                                                                showNewButton="false"
                                                                showEditButton="false"
                                                                showDeleteButton="false"
                                                                showActions="false"
                                                                container="AM_TabView:"/>

                </p:outputPanel>

            </p:tab>
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++ FIN TAB: BITACORA ARR     +++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        </p:tabView>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++  FIN TABVIEW     ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        </una:panelForm>

        
    </ui:define>
</ui:composition>

Modificación fecha bitacora por fecha hora AM/PM

  • Ahora vamos a modificar la fecha de la bitacora para que se presente como fecha y hora
  • Para esto vamos a crear un trasient que permita mostrar la fecha con la hora

BitacoraARR.java

  • import
import java.text.SimpleDateFormat;
  • Creamos trasient
@Transient
private String fechaHora;
  • Luego le creamos el get
public String getFechaHora() {

        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss aa");
            return simpleDateFormat.format(fecha); 
        }
        catch (Exception e) {
            return "";
        }   
    }

BitacoraARRBean.java

  • Ahora debemos inidicarle al bean que utilice este campo en vez de la fecha
ASERColumn column2 = new ASERColumn("fecha",                            getI18n("bitacoraARR_fecha_label"),                                 true);
X
ASERColumn column2 = new ASERColumn("fechaHora",                            getI18n("bitacoraARR_fecha_label"),                                 true);

BitacoraAM.java

  • import
import java.text.SimpleDateFormat;
  • trasient
@Transient
private String fechaHora;
  • get
public String getFechaHora() {

        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss aa");
            return simpleDateFormat.format(fecha); 
        }
        catch (Exception e) {
            return "";
        }   
    }

BitacoraAMBean.java

  • Ahora le indicamos que utlice este campo en vez de fecha
ASERColumn column2 = new ASERColumn("fecha",                                getI18n("bitacoraAM_fecha_label"),                        true);        
X
ASERColumn column2 = new ASERColumn("fechaHora",                                getI18n("bitacoraAM_fecha_label"),                        true);        

Ordenar Lista bitacora ASER por fecha DESC

  • Para ordenar la bitacora por fecha hora en forma desendente
  • Debemos agregar en el initDetails

ActividadRespuestaRiesgoBean.java

  • Import
import java.util.Collections;
import java.util.Comparator;
  • Agregar funcion de ordenamiento
// Odernar descendente l2 -> l1
            final Comparator<BitacoraARR> ORDENAR_FECHA = new Comparator<BitacoraARR>() {
                public int compare(BitacoraARR l1, BitacoraARR l2) {
                    return l2.getFechaHora().compareTo(l1.getFechaHora());
                }
            };

            if (this.getEntity().getListaBitacoraARR() != null) {
                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
            }
  • Antes de la inicialización de la lista
// Inicializar la lista de bitacora
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();
  • Quedando así
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {

            // Si existe una entidad es una modificación
            if(this.getEntity().getId() != null){

                // obtenemos el estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();
                
                // No es una actividad nueva
                this.setActividadNueva(false);

            //Es una actividad Nueva
            }else{
                this.setActividadNueva(true);
            }

            // Inicializamos la justificación de bitacora en vació
            this.setJustificacionBitacoraARR("");

            // Indicamos que no existe un cambio de estado
            this.setExisteCambioEstado(false);


            
            // Odernar descendente l2 -> l1
            final Comparator<BitacoraARR> ORDENAR_FECHA = new Comparator<BitacoraARR>() {
                public int compare(BitacoraARR l1, BitacoraARR l2) {
                    return l2.getFechaHora().compareTo(l1.getFechaHora());
                }
            };

            if (this.getEntity().getListaBitacoraARR() != null) {
                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
            }

            // Inicializar la lista de bitacora
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();


        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

ActividadMejoraBean.java

  • imports
import java.util.Collections;
import java.util.Comparator;
  • Función
// Odernar descendente l2 -> l1
            final Comparator<BitacoraAM> ORDENAR_FECHA = new Comparator<BitacoraAM>() {
                public int compare(BitacoraAM l1, BitacoraAM l2) {
                    return l2.getFechaHora().compareTo(l1.getFechaHora());
                }
            };

            if (this.getEntity().getListaBitacoraAM() != null) {
                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
            }
  • Final
public void initDetails() {
        if (!isPostBack()) {

            if(this.getEntity().getId() != null){
                this.estadoAMInicial = this.getEntity().getEstadoAM();
                 this.setActividadNueva(false);
            }else{
                this.setActividadNueva(true);
            }

            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);


            // Odernar descendente l2 -> l1
            final Comparator<BitacoraAM> ORDENAR_FECHA = new Comparator<BitacoraAM>() {
                public int compare(BitacoraAM l1, BitacoraAM l2) {
                    return l2.getFechaHora().compareTo(l1.getFechaHora());
                }
            };

            if (this.getEntity().getListaBitacoraAM() != null) {
                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
            }

            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));
            bitacoraAMBean.init();
        }
    }

Actualización:

  • En este punto se corrigueron varios errores de programación por lo que se corrigen

ActividadRespuestaRiesgoBean.java

/**********************************************************************/
/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
/**********************************************************************/


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.beans.factory.annotation.Autowired;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.Collections;
import java.util.Comparator;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import org.omnifaces.util.Ajax;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.BitacoraARRService;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.TipoActividadRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraARR;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoARR;

 /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************     VARIABLES        *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // Variable para paso de parametros en LOV
    private Map<String, Object> beanParams = new HashMap();



    //variable que detemina si se modificó o no el estado
    private Boolean existeCambioEstado;

    //Variable que almacena la justificación de la Bitacora
    private String justificacionBitacoraARR;

    // Variable que almacena el estado Inicial para determinar si fue o no modificado
    private EstadoARR estadoARRInicial;


    //variable que detemina si es una actividad nueva o no
    private Boolean actividadNueva;

/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {

            // Si existe una entidad es una modificación
            if(this.getEntity().getId() != null){

                // obtenemos el estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();
                
                // Inidicamos que no es una actividad nueva
                this.setActividadNueva(false);

                // Limpiamos la justificación
                this.setJustificacionBitacoraARR("");

            //Es una actividad Nueva
            }else{
                // Indicamos que es una actividad nueva
                this.setActividadNueva(true);
            }

            // Indicamos que no existe un cambio de estado tanto para agregar como modificar
            this.setExisteCambioEstado(false);


            /*********************************************/
            /********* Lista de BITACORA *****************/
            /*********************************************/
            if (this.getEntity().getListaBitacoraARR() != null) {
                Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
            }

            // Inicializar la lista de bitacora
            this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
            bitacoraARRBean.init();


        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @Override
    public String update(){
        String form;
       
        // Si es una actualización
        if(this.estadoARRInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                this.setJustificacionBitacoraARR("");
                this.setExisteCambioEstado(false);

            // Si son diferentes
            }else{

                // Mandamos a crear una Bitacora y agregarla a la lista 
                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);

                // Ordenamos la lista
                if (this.getEntity().getListaBitacoraARR() != null) {
                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
                }

                // obtenemos el nuevo estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();

                // Limpiamos la Justificación
                if(!this.justificacionBitacoraARR.isEmpty()){                 
                    this.setJustificacionBitacoraARR("");
                    this.setExisteCambioEstado(false);
                }
                Ajax.update("formMantenimiento");

                
            }
        }else{
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
            
        }


        form = super.update();

        return form;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      ORDENAMIENTO                *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    final Comparator<BitacoraARR> ORDENAR_FECHA = new Comparator<BitacoraARR>() {
        public int compare(BitacoraARR l1, BitacoraARR l2) {
            return l2.getFechaHora().compareTo(l1.getFechaHora());
        }
    };
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      ORDENAMIENTO                *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


/*************************************************************************************************/
    /*************************************************************************************************/
    /**********************   FUNCIONES: justificacionBitacoraARR   **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public String getJustificacionBitacoraARR() {
        return justificacionBitacoraARR;
    }

    public void setJustificacionBitacoraARR(String justificacionBitacoraARR) {
        this.justificacionBitacoraARR = justificacionBitacoraARR;
    }

    public Boolean isActividadNueva() {
        return this.actividadNueva;
    }

    public void setActividadNueva(Boolean actividadNueva) {
        this.actividadNueva = actividadNueva;
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************** FIN  FUNCIONES: justificacionBitacoraARR  **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

/**********************************************************************/
    /**
     * Función que actualiza el estado 
     * @author Gustavo Matamoros González
     * @since 18/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioEstado(){

        // Si es una actualización
        if(this.estadoARRInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                this.setJustificacionBitacoraARR("");
                this.setExisteCambioEstado(false);
            }else{
                this.setExisteCambioEstado(true);
            }
        }else{
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
            
        }
        
    }

actividadRespuestaRiesgoEditForm.xhtml

<!--####################################################################################-->
            <!--##########################      ESTADO_ARR        ##################################-->
            <!--####################################################################################-->

            <!--LABEL-->
            <p:outputLabel  id="actividadRespuestaRiesgo_estadoARR_OutputLabel"
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                            value="#{i18n.actividadRespuestaRiesgo_estadoARR_label}"/>

            <!--PANEL-->
            <p:outputPanel  id="actividadRespuestaRiesgo_estadoARR_OutputPanel">
                
                <!-- AUTOCOMPLETE -->
                <una:autoCompletePaginator  id="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                            paginator="true"
                                            paginationRows="10"
                                            dropdown="true"
                                            value="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                            var="estadoARR"
                                            itemLabel="#{estadoARR.nombre}"
                                            itemValue="#{estadoARR}"
                                            completeMethod="#{actividadRespuestaRiesgoBean.completeEstadoARR}"
                                            converter="#{estadoARRBean.converter}"
                                            forceSelection="true"
                                            noSelectedOption="true"
                                            noSelectedLabel="#{i18n.actividadRespuestaRiesgo_estadoARR_select_label}"
                                            onNoSelectedOption="#{actividadRespuestaRiesgoBean.handleClearEstadoARR()}"
                                            size="40"
                                            scrollHeight="200"
                                            required="true">
                        
                        <p:ajax event="itemSelect" 
                                listener="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                
                                update= "@this,
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"
                                />

                   
                </una:autoCompletePaginator>

                <!-- LOV -->
                <components:dialogFrameworkData id="actividadRespuestaRiesgo_estadoARR_ListDialog"
                                                lOVBean="#{estadoARRLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.estadoARR}"
                                                update="actividadRespuestaRiesgo_estadoARR_AutoComplete"
                                                title="#{i18n.actividadRespuestaRiesgo_estadoARR_lov_label}"
                                                oncomplete="updateEstadoAutoComplete()"
                                                beanFilters="#{actividadRespuestaRiesgoBean.beanParams}"
                                                methodName="findAllByActivoLOV"
                                                />
                <p:remoteCommand name="updateEstadoAutoComplete"
            
                                                action="#{actividadRespuestaRiesgoBean.actualizaExisteCambioEstado()}"
                                                update= "@this,
                                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                                        :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId}"/>

                <!--MENSAJE-->
                <p:message  id="actividadRespuestaRiesgo_estadoARR_Message" 
                            for="actividadRespuestaRiesgo_estadoARR_AutoComplete"/>
            </p:outputPanel>


            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->



            <!--####################################################################################-->
            <!--##########################     JUSTIFICACION      ##################################-->
            <!--####################################################################################-->
            
            <!--LABEL-->
            <p:outputLabel          id="actividadRespuestaRiesgo_justificacionOutputLabel" 
                                    for="actividadRespuestaRiesgo_justificacionInputTextArea" 
                                    value="#{i18n.actividadRespuestaRiesgo_justificacion_label}"
                                    rendered="#{!actividadRespuestaRiesgoBean.isActividadNueva()}"
                                    />  

            <!--PANEL-->
            <p:outputPanel          id="actividadRespuestaRiesgo_justificacionOutputPanel"
                                    rendered="#{!actividadRespuestaRiesgoBean.isActividadNueva()}">

                <p:inputTextarea    id="actividadRespuestaRiesgo_justificacionInputTextArea"
                                    value="#{actividadRespuestaRiesgoBean.justificacionBitacoraARR}"
                                    counter="actividadRespuestaRiesgo_contador"
                                    cols="25"
                                    rows="4"
                                    maxlength="500"
                                    placeholder="#{i18n.actividadRespuestaRiesgo_justificacion_placeholder}"
                                    counterTemplate="{0} #{i18n.actividadRespuestaRiesgo_justificacion_remaining_label}"
                                    autoResize="false" 
                                    disabled="#{!actividadRespuestaRiesgoBean.isExisteCambioEstado()}"
                                    required="#{actividadRespuestaRiesgoBean.isExisteCambioEstado()}"
                                    />
                <h:outputText       id="actividadRespuestaRiesgo_contador"/>

                <p:message          id="actividadRespuestaRiesgo_justificacionMessage" 
                                    for="actividadRespuestaRiesgo_justificacionInputTextArea" 
                                    />
            </p:outputPanel>
            

            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->

ActividadMejoraBean.java

import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.UnidadEjecutora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.BitacoraAM;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadMejoraService;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.EstadoAM;


import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.omnifaces.util.Ajax;


private Boolean existeCambioEstado;
    private String justificacionBitacoraAM;
    private EstadoAM estadoAMInicial;
    private Boolean actividadNueva;


// Odernar descendente l2 -> l1
    final Comparator<BitacoraAM> ORDENAR_FECHA = new Comparator<BitacoraAM>() {
        public int compare(BitacoraAM l1, BitacoraAM l2) {
            return l2.getFechaHora().compareTo(l1.getFechaHora());
        }
    };

    public void initDetails() {
        if (!isPostBack()) {

            if(this.getEntity().getId() != null){
                this.estadoAMInicial = this.getEntity().getEstadoAM();
                this.setActividadNueva(false);
                this.setJustificacionBitacoraAM("");

            }else{
                this.setActividadNueva(true);
            }
            this.setExisteCambioEstado(false);

            if (this.getEntity().getListaBitacoraAM() != null) {
                Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
            }

            this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));
            bitacoraAMBean.init();
        }
    }




@Override
    public String update(){
        String form;
       
        // Si es una actualización
        if(this.estadoAMInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                this.setJustificacionBitacoraAM("");
                this.setExisteCambioEstado(false);

            // Si son diferentes
            }else{

                // Mandamos a crear una Bitacora y agregarla a la lista 
                service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);

                // Ordenamos la lista
                if (this.getEntity().getListaBitacoraAM() != null) {
                    Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
                }

                // obtenemos el nuevo estado Actual para luego compararlo
                this.estadoAMInicial = this.getEntity().getEstadoAM();

                // Limpiamos la Justificación
                if(!this.justificacionBitacoraAM.isEmpty()){                 
                    this.setJustificacionBitacoraAM("");
                    this.setExisteCambioEstado(false);
                }
                Ajax.update("formMantenimiento");

                
            }
        }else{
            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
            
        }

        form = super.update();

        return form;
    }
    

/**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public String getJustificacionBitacoraAM() {
        return justificacionBitacoraAM;
    }

    public void setJustificacionBitacoraAM(String justificacionBitacoraAM) {
        this.justificacionBitacoraAM = justificacionBitacoraAM;
    }

    /**
     * PPI-380
     * @autor: Gustavo Matamoros González
     */
    public Boolean isActividadNueva() {
        return this.actividadNueva;
    }

    public void setActividadNueva(Boolean actividadNueva) {
        this.actividadNueva = actividadNueva;
    }


/**********************************************************************/
    /**
     * Función que actualiza el estado 
     * @author Gustavo Matamoros González
     * @since 18/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioEstado(){

        // Si es una actualización
        if(this.estadoAMInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                this.setJustificacionBitacoraAM("");
                this.setExisteCambioEstado(false);
            }else{
                this.setExisteCambioEstado(true);
            }
        }else{
            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
            
        }
        
    }

Validaciones

  • Para hacerla las validaciones
    • El usuario administrador del módulo MCG puede seleccionar el estado Descartada, para lo cual debe adjuntar un oficio y digitar la justificación de manera obligatoria.
    • Al descartar una actividad pasa a estar inactivo el registro.

ActividadRespuestaRiesgoServiceImpl.java

  • Creamos una función que nos determine si el estado es descartada
/**********************************************************************/
    /*********** VALIDACIÓN: Estado ARR DESCARTADA            *************/
    /**********************************************************************/
    /**
     * Metodo que determina si el EstadoARR pasado por parametro es igual a descartada
     * Ver {@link ActividadRespuestaRiesgoService#esEstadoARRDescartada()) }
     * 
     * @param estadoARR_descartada
     * @return Boolean
     */
     @Override
     public Boolean esEstadoARRDescartada(EstadoARR estadoARR_descartada) {

        if(estadoARRService.obtenerEstadoARRDescartada().equals(estadoARR_descartada)){
            return true;
        }
        return false;

     }

ActividadRespuestaRiesgoService.java

  • Definición
/**********************************************************************/
    /*********** VALIDACIÓN: Estado ARR DESCARTADA            *************/
    /**********************************************************************/
    /**
     * Definición que determina si el EstadoARR pasado por parametro es igual a descartada
     * Ver {@link ActividadRespuestaRiesgoService#esEstadoARRDescartada()) }
     * 
     * @param estadoARR_descartada
     * @return Boolean
     */
    public Boolean esEstadoARRDescartada(EstadoARR estadoARR_descartada);

ActividadRespuestaRiesgoBean.java

  • imports
import cr.ac.una.cgi.sdkuna.view.controller.AdjuntoController;
import cr.ac.una.cgi.sdkuna.view.controller.MessagesController;
import javax.faces.application.FacesMessage;
import javax.faces.validator.ValidatorException;
  • Autowired
@Autowired
    AdjuntoController adjuntoController;

    @Autowired
    MessagesController messagesController;
  • Y en la función update agregamos
/******************************************/
                /**********  VALIDACIÓN: descartada *******/
                /******************************************/
                // PPI-380 / PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto
                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){

                    // Validar que tiene adjunto
                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {
                        this.errorMessage("actividadRespuestaRiesgo_falta_adjunto_error_summary");
                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "actividadRespuestaRiesgo_falta_adjunto_error_summary", "actividadRespuestaRiesgo_falta_adjunto_error_detail"));
                    }
                    // Desactivar registro
                    this.getEntity().setActivo(false);
                }
  • Final
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @Override
    public String update(){

        String form;
       
        // Si es una actualización
        if(this.estadoARRInicial !=null){

            // El estado Inicial es igual al actual
            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                this.setJustificacionBitacoraARR("");
                this.setExisteCambioEstado(false);

            // Si son diferentes
            }else{

                /******************************************/
                /**********  VALIDACIÓN: descartada *******/
                /******************************************/
                // PPI-380 / PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto
                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){

                    // Validar que tiene adjunto
                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {
                        this.errorMessage("actividadRespuestaRiesgo_falta_adjunto_error_summary");
                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "actividadRespuestaRiesgo_falta_adjunto_error_summary", "actividadRespuestaRiesgo_falta_adjunto_error_detail"));
                    }
                    // Desactivar registro
                    this.getEntity().setActivo(false);
                }

                // Mandamos a crear una Bitacora y agregarla a la lista 
                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);

                // Ordenamos la lista
                if (this.getEntity().getListaBitacoraARR() != null) {
                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
                }

                // obtenemos el nuevo estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();

                // Limpiamos la Justificación
                if(!this.justificacionBitacoraARR.isEmpty()){                 
                    this.setJustificacionBitacoraARR("");
                    this.setExisteCambioEstado(false);
                }
  
            }
        }else{
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
            
        }

        form = super.update();

        return form;
    }

    
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

Creación de método de calculo de porcentaje de avance

  • 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

MetaPoaEvaluacionSpecs.java

  • Lo primero que vamos hacer es crear un archivo de especificación que nos devuelva una lista lista ordenada por fecha de etapa_plan ordenada DESC, para planes operativos activos
package cr.ac.una.cgi.sigesa.ppi.ppo.specs;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.data.jpa.domain.Specification;

import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EtapaPlan;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadRiesgo;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.ObjetivoPOA;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;


/**
 *
 * @author Gustavo Matamoros González
 * @version 0.0.1
 * 24/04/2023
 *
 */
public class MetaPoaEvaluacionSpecs {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******       SPECIFICATION: actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals  ****************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
     SELECT 
        *
        FROM PPI.META_POA_EVALUACION MPE

        INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)

        INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
        INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)

        INNER JOIN PPI.META_POA_ACTIVIDAD_RIESGO MPAR ON (MPAR.META_POA = MP.ID_META_POA)
        INNER JOIN PPI.ACTIVIDAD_RESPUESTA_RIESGO ARR ON (ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = MPAR.ACTIVIDAD_RESPUESTA_RIESGO)
        WHERE
        ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = 49 
        AND
        EP.PERIODO_ANUAL = 202
            */
    
            public static Specification<MetaPoaEvaluacion> actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals(final ActividadRespuestaRiesgo actividadRespuestaRiesgo, final PeriodoAnual periodoAnual) {
                return new Specification<MetaPoaEvaluacion>() {
                    @Override
                    public Predicate toPredicate(Root<MetaPoaEvaluacion> root, CriteriaQuery<?> cq,
                            CriteriaBuilder cb) {
        
                        //INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)
                        Join<EtapaPlan, MetaPoaEvaluacion> joinEtapaPlan = root.join("etapaPlan");
        
                        //INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
                        Join<MetaPoa, MetaPoaEvaluacion> joinMetaPoa = root.join("metaPoa");
                        
                        //INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
                        Join<ObjetivoPOA, MetaPoa> joinObjetivoPOA = joinMetaPoa.join("objetivoPOA");
        
                        //INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)
                        Join<PlanOperativo, ObjetivoPOA> joinPlanOperativo = joinObjetivoPOA.join("planOperativo");
        
                        
                        // INNER JOIN PPI.META_POA_ACTIVIDAD_RIESGO MPAR ON (MPAR.META_POA = MP.ID_META_POA)
                        Join<MetaPoaActividadRiesgo, MetaPoa> joinMetaPoaActividadRiesgo = joinMetaPoa.join("listaMetaPoaActividadesRiesgo");
        
                        // INNER JOIN PPI.ACTIVIDAD_RESPUESTA_RIESGO ARR ON (ARR.ID_ACTIVIDAD_RESPUESTA_RIESGO = MPAR.ACTIVIDAD_RESPUESTA_RIESGO
                        Join<ActividadRespuestaRiesgo, MetaPoaActividadRiesgo> joinActividadRespuestaRiesgo = joinMetaPoaActividadRiesgo.join("actividadRespuestaRiesgo");
        
                        if(actividadRespuestaRiesgo !=null && periodoAnual != null){

                                // Actividad Respuesta Riesgo Equals
                                Expression arrExp = joinActividadRespuestaRiesgo.get("id");
                                Expression arrLit = cb.literal(actividadRespuestaRiesgo.getId());
        
                                // Plan Operativo Activo
                                Expression planOperativoExp = joinPlanOperativo.get("activo");
                                Expression planOperativoLit = cb.literal(true);
        
                                // Periodo Anual Equals
                                Expression periodoAnualExp = joinEtapaPlan.get("periodoAnual");
                                Expression periodoAnualLit = cb.literal(periodoAnual);
                                
                                // Ordenar por etapaPlan.fechaFinal descendente
                                Expression fechaFinal = joinEtapaPlan.get("fechaFinal");
                                cq.orderBy(cb.desc(fechaFinal));

        
                                return cb.and(cb.equal(planOperativoExp, planOperativoLit),cb.equal(arrExp, arrLit),cb.equal(periodoAnualExp, periodoAnualLit));
                        }
                       
                       return null;
                        
                    }
                };
            }
            /*************************************************************************************************/
            /*************************************************************************************************/
            /*************************************************************************************************/
            /*************************************************************************************************/
            /*************************************************************************************************/

}

MetaPoaEvaluacionService.java

  • Creamos un servicio que utilice esta especificacion
/**********************************************************************/
    /**
     * Definicion que retorna un list<MetaPoaEvaluacion> para un planOperativo activo
     * Ver {@link MetaPoaEvaluacionService#findAllByByActividadRespuestaRiesgoAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }
     * 
     * @param actividadRespuestaRiesgo 
     * @author: Gustavo Matamoros González
     * @issue PPI-380 / PPI-381
     * @param actividadRespuestaRiesgo
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    /**********************************************************************/
    public List<MetaPoaEvaluacion> findAllByByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual);

MetaPoaEvaluacionServiceImpl.java

  • Creamos el método
/**********************************************************************/
  /**
   * Método que retorna un list<MetaPoaEvaluacion> para un planOperativo activo
   * Ver {@link MetaPoaEvaluacionService#findAllByByActividadRespuestaRiesgoAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }
   * 
   * @param actividadRespuestaRiesgo 
   * @author: Gustavo Matamoros González
   * @issue PPI-380 / PPI-381
   * @param actividadRespuestaRiesgo
   * @param periodoAnual
   * @return List<MetaPoaEvaluacion>
   */
  /**********************************************************************/
  @Override
  public List<MetaPoaEvaluacion> findAllByByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual) {
      
    // Definimos una variable de tipo especificacion MetaPoaEvaluacion
    Specification<MetaPoaEvaluacion> specFinal;
    
    // Obtenemos la especificación de actividadRespuestaRiesgoEquals
    Specification specActividadRespuestaRiesgoEqualsAndPeriodoAnualEquals = MetaPoaEvaluacionSpecs.actividadRespuestaRiesgoEqualsAndPeriodoAnualEquals(actividadRespuestaRiesgo, periodoAnual);

    
    // Creamos la especificación final
    specFinal = Specification.where(specActividadRespuestaRiesgoEqualsAndPeriodoAnualEquals);
    
    return repository.findAll(specFinal);
  }

actividadRespuestaRiesgoEditForm.xhtml

Periodo Inicial

  • En periodo Inicial modificamos el ajax del autocomplete
<p:ajax event="itemSelect"
                                process="@this"
                                update="@this"/>
  • Por este
<p:ajax event="itemSelect" 
                                listener="#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}"
                                process="@this"
                                update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}"
                                />
  • Y para el LOV vamos a agregar el siguiente remoteCommand
<p:remoteCommand    name="updatePeriodoInicialAutoComplete"
                                    action="#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}"
                                    update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}"/>
  • Y al components:dialogFrameworkData debemos agregarle
oncomplete="updatePeriodoInicialAutoComplete()"
  • Quedando así:
<components:dialogFrameworkData id="actividadRespuestaRiesgo_periodoAnualInicial_ListDialog"
                                                lOVBean="#{periodoAnualLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.periodoAnualInicial}"
                                                update="actividadRespuestaRiesgo_periodoAnualInicial_AutoComplete"
                                                methodName="findAllOrderByAnoDesc"
                                                oncomplete="updatePeriodoInicialAutoComplete()"
                                                title="#{i18n.actividadRespuestaRiesgo_periodoAnualInicial_lov_label}"/>

Periodo Final

  • Ahora debemos hacer lo mismo para el periodo final y asi poder evaluar la modificación de ambos casos
  • autocomplete modificamos este
<p:ajax event="itemSelect"
                                process="@this"
                                update="@this"/>
  • Por este
<p:ajax     event="itemSelect" 
                                listener="#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}"
                                process="@this"
                                update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}"
                                />
  • Agregamos el remoteCommand
<p:remoteCommand    name="updatePeriodoFinalAutoComplete"
                                    action="#{actividadRespuestaRiesgoBean.actualizaExisteCambioPeriodo()}"
                                    update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_estadoARR_OutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel', view).clientId}"/>
  • Y a components:dialogFrameworkData le agregamos
oncomplete="updatePeriodoFinalAutoComplete()"
  • Quedando Así
<components:dialogFrameworkData id="actividadRespuestaRiesgo_periodoAnualFinal_ListDialog"
                                                lOVBean="#{periodoAnualLOVBean}"
                                                target="#{actividadRespuestaRiesgoBean.entity.periodoAnualFinal}"
                                                update="actividadRespuestaRiesgo_periodoAnualFinal_AutoComplete"
                                                methodName="findAllOrderByAnoDesc"
                                                oncomplete="updatePeriodoFinalAutoComplete()"
                                                title="#{i18n.actividadRespuestaRiesgo_periodoAnualFinal_lov_label}"/>
  • Ahora vamos a agregar una progressBar para que muestre el porcentaje de avance, despues de los periodos
<!--####################################################################################-->
            <!--##########################    PORCENTAJE EJECUCION     #############################-->
            <!--####################################################################################-->

            <!--LABEL-->
            <p:outputLabel  id="actividadRespuestaRiesgo_porcentajeEjecucion_OutputLabel"
                            for="actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar"
                            value="#{i18n.actividadRespuestaRiesgo_porcentajeEjecucion_label}"
                            rendered="#{actividadRespuestaRiesgoBean.isHabilitarPorcentajeEjecucion()}"
                            style="vertical-align: top;" />

            <!--PANEL-->
            <p:outputPanel  id="actividadRespuestaRiesgo_porcentajeEjecucion_OutputPanel"
                            rendered="#{actividadRespuestaRiesgoBean.isHabilitarPorcentajeEjecucion()}" >
                
                <p:progressBar 
                        id="actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar" 
                        value="#{actividadRespuestaRiesgoBean.porcentajeEjecucion}" 
                        labelTemplate="#{actividadRespuestaRiesgoBean.porcentajeEjecucion}%" 
                        style="width:350px; font-size:12px;background: #efefef;"
                        styleClass="#{actividadRespuestaRiesgoBean.styleProgressBar}"/>

                <!--MENSAJE-->
                <p:message  id="actividadRespuestaRiesgo_porcentajeEjecucion_Message" 
                            for="actividadRespuestaRiesgo_porcentajeEjecucion_ProgressBar"/>
            </p:outputPanel>


            <!--####################################################################################-->
            <!--####################################################################################-->
            <!--####################################################################################-->
  • Y ahora antes de la etiqueta de cierre de </ui:define> agregamos los estilos CSS necesarios
<style>

            .colorBarraMenor50.ui-progressbar .ui-widget-header {
                background-color: #ff3806 !important;
                border: 1px solid #ff3806 !important;
            }

            .colorBarraMenor100.ui-progressbar .ui-widget-header {
                background-color: #ffb006 !important;
                border: 1px solid #ffb006 !important;
            }

            .colorBarra100.ui-progressbar .ui-widget-header {
                background-color: #38a15b !important;
                border: 1px solid #38a15b !important;
            }
            .ui-panelgrid-cell {
                vertical-align: top;
            }

        </style>

ActividadRespuestaRiesgoServiceImpl.java

  • Agregamos importes necesarios
import cr.ac.una.cgi.sdkuna.service.ParametroService;
import org.springframework.data.jpa.domain.Specification;
import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
import cr.ac.una.cgi.sigesa.epf.cpr.service.PeriodoAnualService;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPoaEvaluacionService;

import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.math.BigDecimal;
import java.math.RoundingMode;

import cr.ac.una.cgi.sigesa.ppi.mcg.specs.ActividadRespuestaRiesgoSpecs;
  • Agregamos autowired
@Autowired
    MetaPoaEvaluacionService metaPoaEvaluacionService;
@Autowired
    ParametroService parametroService;
  • Creamos una función que obtenga una lista de MetaPoaEvaluacion segun ARR y PeriodoAnual
/****************************************************************************************/
    /****************************************************************************************/
    /*****************************    BITACORA         **************************************/
    /****************************************************************************************/
    /****************************************************************************************/
/**
     * Metodo que obtiene una List<MetaPoaEvaluacion> según una Actividad de Respuesta al Riesgo y un periodo
     *
     * @author Gustavo Matamoros González
     * @since 27/04/2023
     * @param actividadRespuestaRiesgo
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    @Override
    public List<MetaPoaEvaluacion> obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual) {
         return metaPoaEvaluacionService.findAllByByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo, periodoAnual);
    }
  • y seguido creammos una función que calcule el porcentaje de ejecución de la actividad
/**
     * Metodo que calcula el porcentaje de ejecución de una actividad 
     *
     * @author Gustavo Matamoros González
     * @since 27/04/2023
     * @param actividadRespuestaRiesgo
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    @Override
    public BigDecimal calculaPorcentajeEjecucionARR(ActividadRespuestaRiesgo actividadRespuestaRiesgo){

        // Obtener el año inicial y final de la entidad
        Integer annoInicial = actividadRespuestaRiesgo.getPeriodoAnualInicial().getAno();
        Integer annoFinal = actividadRespuestaRiesgo.getPeriodoAnualFinal().getAno();

        // Variable para obtener la cantidad de periodos seleccionados
        Integer cantidadPeriodos = 0;

        // Variable para obtener la totalidad de ejecucion de todos los periodos
        BigDecimal totalEjecucionPeriodos = BigDecimal.ZERO;

        // Creamos una lista temporal limpia
        List<MetaPoaEvaluacion> listaMetaPoaEvaluacionPorPeriodo = new ArrayList<>();

        //NOTA: Obtener el año del periodo inicial de las evaluaciones esto por que inician a partir del año 2023
        PeriodoAnual periodoInicialEvaluaciones = periodoAnualService.findOne(Long.parseLong(parametroService.findOneByLlave("param_ppi_mcg_periodoInicialEvaluacionesActividadesARRyAM").getValor()));
        
        // Obtenemos el año del periodo
        Integer annoInicialEvaluaciones = periodoInicialEvaluaciones.getAno();

        // Determinar si annoInicial es menor al inicio de la evaluaciones 
        if (annoInicial < annoInicialEvaluaciones){
            annoInicial = annoInicialEvaluaciones;
        }

        // Recorrer los periodos anuales para obtener la última evaluación de cada periodo
        for (int i = annoInicial; i <= annoFinal; i++) {
            
            // limpiamos la lista
            listaMetaPoaEvaluacionPorPeriodo.clear();

            // Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente
            listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo,periodoAnualService.findPeriodoAnualByAnno(i));

            // Si la lista no esta vacia para el año existen evaluaciones 
            if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){
                
                // Se convierte a String
                String strPorcentajeEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getEjecucion());

                // Se convierte a BigDecimal con 2 digitos
                BigDecimal montoEjecucion = new BigDecimal(strPorcentajeEvaluacion).setScale(2, BigDecimal.ROUND_HALF_EVEN);

                // Obtenemos el primer elemento o la última evaluacion y se lo sumamos al total
                totalEjecucionPeriodos = totalEjecucionPeriodos.add(montoEjecucion);
            }
            // aumentamos la cantidad de periodos
            cantidadPeriodos++;
        }

        // Si existe al menos un periodo
        if(cantidadPeriodos > 0){
            BigDecimal cantidadPeriodosBD = new BigDecimal(cantidadPeriodos);

            // Verificar la división de cero
            if(totalEjecucionPeriodos.compareTo(BigDecimal.ZERO) == 0){
                return totalEjecucionPeriodos;
            
            // Si existen valores
            }else{
                // eliminar decimales
                return totalEjecucionPeriodos.divide(cantidadPeriodosBD,2,RoundingMode.CEILING);
            }
        }

        return totalEjecucionPeriodos;
    }
  • Ahora creamos las funciones para poder obtener los diferentes estados
/****************************************************************************************/
    /****************************************************************************************/
    /*****************************    ESTADOS ARR      **************************************/
    /****************************************************************************************/
    /****************************************************************************************/
    
    /**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRSinIniciar() {
        return estadoARRService.obtenerEstadoARRSinIniciar();
    }

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARREnProceso() {
        return estadoARRService.obtenerEstadoARREnProceso();
    }

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRDescartada() {
        return estadoARRService.obtenerEstadoARRDescartada();
    }

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    @Override
    public EstadoARR obtenerEstadoARRImplementada() {
        return estadoARRService.obtenerEstadoARRImplementada();
    }

ActividadRespuestaRiesgoService.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;
import java.math.BigDecimal;
import java.util.List;
  • Agregamos las definiciones
/**
     * Definición que obtiene una List<MetaPoaEvaluacion> según una Actividad de Respuesta al Riesgo y un periodo
     *
     * @author Gustavo Matamoros González
     * @since 27/04/2023
     * @param actividadRespuestaRiesgo
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    public List<MetaPoaEvaluacion> obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(ActividadRespuestaRiesgo actividadRespuestaRiesgo, PeriodoAnual periodoAnual);

    /**
     * Metodo que calcula el porcentaje de ejecución de una actividad 
     *
     * @author Gustavo Matamoros González
     * @since 27/04/2023
     * @param actividadRespuestaRiesgo
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    public BigDecimal calculaPorcentajeEjecucionARR(ActividadRespuestaRiesgo actividadRespuestaRiesgo);

    /**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRSinIniciar();

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARREnProceso();

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRDescartada();

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoARR
     */
    public EstadoARR obtenerEstadoARRImplementada();

ActividadRespuestaRiesgoBean.java

  • imports
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;

  • Variables, agregamos estas
//variable que detemina si se debe habilitar o no la barra de progreso de porcentaje de Ejecucion
    private Boolean habilitarPorcentajeEjecucion;

    // variable que almacena el porcentaje de ejecución de la actividad
    private BigDecimal porcentajeEjecucion;

    // Variable que almacena el nombre de la clase que se debe asignar al progressBar
    private String styleProgressBar;
  • Quedando así
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************     VARIABLES        *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // Variable para paso de parametros en LOV
    private Map<String, Object> beanParams = new HashMap();

    //variable que detemina si se modificó o no el estado
    private Boolean existeCambioEstado;

    //Variable que almacena la justificación de la Bitacora
    private String justificacionBitacoraARR;

    // Variable que almacena el estado Inicial para determinar si fue o no modificado
    private EstadoARR estadoARRInicial;

    //variable que detemina si es una actividad nueva o no
    private Boolean actividadNueva;

    //variable que detemina si se debe habilitar o no el campo de Estado
    private Boolean deshabilitarEstadoARR;

    //variable que detemina si se debe habilitar o no la barra de progreso de porcentaje de Ejecucion
    private Boolean habilitarPorcentajeEjecucion;

    // variable que almacena el porcentaje de ejecución de la actividad
    private BigDecimal porcentajeEjecucion;

    // Variable que almacena el nombre de la clase que se debe asignar al progressBar
    private String styleProgressBar;
  • Modificamos la funcion initdetails
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void initDetails() {
        if (!isPostBack()) {

            // Si existe una entidad es una modificación
            if(this.getEntity().getId() != null){

                // obtenemos el estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();
                
                // Inidicamos que no es una actividad nueva
                this.setActividadNueva(false);

                // Limpiamos la justificación
                this.setJustificacionBitacoraARR("");

                // Habilitar la selección del estado
                this.setDeshabilitarEstadoARR(false);

                // habilitar porcentaje ejecucion
                this.setHabilitarPorcentajeEjecucion(true);

                // falta obtener el valor inicial
                BigDecimal porcentaje = service.calculaPorcentajeEjecucionARR(this.getEntity());
                this.setPorcentajeEjecucion(porcentaje);
                this.determinarColorProgressBar(porcentaje);


            //Es una actividad Nueva
            }else{
                // Indicamos que es una actividad nueva
                this.setActividadNueva(true);
                
                // Habilitar la selección del estado
                this.setDeshabilitarEstadoARR(false);

                // Deshabilitar porcentaje ejecucion
                this.setHabilitarPorcentajeEjecucion(false);


            }

            // Indicamos que no existe un cambio de estado tanto para agregar como modificar
            this.setExisteCambioEstado(false);

        }
        /*********************************************/
        /********* Lista de BITACORA *****************/
        /*********************************************/
        if (this.getEntity().getListaBitacoraARR() != null) {
            Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
        }

        // Inicializar la lista de bitacora
        this.getEntity().setListaBitacoraARR(bitacoraARRBean.setDetails(this.getEntity().getListaBitacoraARR()));
        bitacoraARRBean.init();

        
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN  INITDETAILS        *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • La funcion update
/*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    @Override
    public String update(){

        String form;
       
        // Si es una actualización
        if(this.estadoARRInicial !=null){

            // El estado Inicial es igual al actual
            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                this.setJustificacionBitacoraARR("");
                this.setExisteCambioEstado(false);
                this.setDeshabilitarEstadoARR(false);

            // Si son diferentes
            }else{

                /******************************************/
                /**********  VALIDACIÓN: descartada *******/
                /******************************************/
                // PPI-380 / PPI-381: Al descartar una actividad pasa a estar inactivo el registro y solicitar adjunto
                if(service.esEstadoARRDescartada( this.getEntity().getEstadoARR() )){

                    // Validar que tiene adjunto
                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {
                        this.errorMessage("actividadRespuestaRiesgo_falta_adjunto_error_summary","actividadRespuestaRiesgo_falta_adjunto_error_detail");
                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("actividadRespuestaRiesgo_falta_adjunto_error"), getI18n("actividadRespuestaRiesgo_falta_adjunto_error")));
                    }
                    // Desactivar registro
                    this.getEntity().setActivo(false);
                }

                // Mandamos a crear una Bitacora y agregarla a la lista 
                service.creaBitacoraARRModificado(this.getEntity(), this.justificacionBitacoraARR);

                // Ordenamos la lista
                if (this.getEntity().getListaBitacoraARR() != null) {
                    Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
                }

                // obtenemos el nuevo estado Actual para luego compararlo
                this.estadoARRInicial = this.getEntity().getEstadoARR();

                // Limpiamos la Justificación
                if(!this.justificacionBitacoraARR.isEmpty()){                 
                    this.setJustificacionBitacoraARR("");
                    this.setExisteCambioEstado(false);
                    this.setDeshabilitarEstadoARR(false);
                }
  
            }
        }else{
            this.setJustificacionBitacoraARR("");
            this.setExisteCambioEstado(false);
            this.setDeshabilitarEstadoARR(false);
        }

        form = super.update();

        return form;
    }

    
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN FUNCIÓN UPDATE  *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Creamos las funciones de procentaje de ejecuación
/*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Porcentaje Ejecucion  *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public Boolean isHabilitarPorcentajeEjecucion() {
        return habilitarPorcentajeEjecucion;
    }

    public void setHabilitarPorcentajeEjecucion(Boolean habilitarPorcentajeEjecucion) {
        this.habilitarPorcentajeEjecucion = habilitarPorcentajeEjecucion;
    }

    public BigDecimal getPorcentajeEjecucion() {
        return porcentajeEjecucion;
    }
    public void setPorcentajeEjecucion(BigDecimal porcentajeEjecucion) {
        this.porcentajeEjecucion = porcentajeEjecucion;
    }

    public String getStyleProgressBar() {
        return styleProgressBar;
    }

    public void setStyleProgressBar(String styleProgressBar) {
        this.styleProgressBar = styleProgressBar;
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************    FIN  FUNCIONES: Porcentaje Ejecucion  *********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Agregamos las funciones de deshabilitar estadoARR
/*************************************************************************************************/
    /*************************************************************************************************/
    /**********************         FUNCIONES: Estado ARR         ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public Page<EstadoARR> completeEstadoARR(String query, Pageable pageable) {
        return service.autoCompleteEstadoARR(query, pageable);
    }

    /* Clear: Estado ARR */
    public void handleClearEstadoARR() {
        this.getEntity().setEstadoARR(null);
    }

    public Boolean isDeshabilitarEstadoARR() {
        return this.deshabilitarEstadoARR;
    }

    public void setDeshabilitarEstadoARR(Boolean deshabilitarEstadoARR) {
        this.deshabilitarEstadoARR = deshabilitarEstadoARR;
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /**********************     FIN FUNCIONES: Estado ARR         ************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Agregamos la función que actulizar el cambio de periodo
/**********************************************************************/
    /**
     * Función que verifica un cambio de periodo 
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioPeriodo(){

        if(!this.isActividadNueva()){

            Integer annofechaInicial = this.getEntity().getAnnoPeriodoAnualInicial();
            Integer annofechaFinal = this.getEntity().getAnnoPeriodoAnualFinal();

            if((annofechaFinal != null) && (annofechaInicial != null)){

                // VALIDACIÓN: AñoInicial > AñoFinal
                if (annofechaFinal.compareTo(annofechaInicial) < 0) {
                    //this.errorMessage("actividadRespuestaRiesgo_falta_adjunto_error_summary","actividadRespuestaRiesgo_falta_adjunto_error_detail");
                    //throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("actividadRespuestaRiesgo_falta_adjunto_error"), getI18n("actividadRespuestaRiesgo_falta_adjunto_error")));
                    //throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("AAA"), getI18n("actividadRespuestaRiesgo_falta_adjunto_error")));
                }else{

                    //Obtenemos el procentaje de ejecucion 
                    BigDecimal porcentaje = service.calculaPorcentajeEjecucionARR(this.getEntity());

                    BigDecimal indicador = new BigDecimal(100);

                    
                    // Si porcentaje es menor a 100 es en proceso
                    if(porcentaje.compareTo(indicador) < 0){

                        if(this.estadoARRInicial !=null){



                            // El estado actual es igual en proceso
                            if(this.getEntity().getEstadoARR().equals(service.obtenerEstadoARREnProceso())){
                                this.setJustificacionBitacoraARR("");
                                this.setExisteCambioEstado(false);
                                this.setDeshabilitarEstadoARR(false);
                                this.setPorcentajeEjecucion(porcentaje);
                
                            // Si el estado inicial es diferente a en proceso
                            }else{
                                this.getEntity().setEstadoARR(service.obtenerEstadoARREnProceso());
                                this.setExisteCambioEstado(true);
                                this.setJustificacionBitacoraARR("");
                                this.setDeshabilitarEstadoARR(true);
                                this.setPorcentajeEjecucion(porcentaje);
                              
                            }
                            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                                this.setExisteCambioEstado(false);
                                this.setJustificacionBitacoraARR("");
                                this.setDeshabilitarEstadoARR(false);
                            }
                        }

                        this.determinarColorProgressBar(porcentaje);

                        
                    
                    // Si porcentaje es igual a 100 es implementada
                    }else if(porcentaje.compareTo(indicador) == 0){

                        if(this.estadoARRInicial !=null){

                            // El estado Inicial es igual al actual
                            if(this.getEntity().getEstadoARR().equals(service.obtenerEstadoARRImplementada())){
                                this.setJustificacionBitacoraARR("");
                                this.setExisteCambioEstado(false);
                                this.setDeshabilitarEstadoARR(false);
                                this.setPorcentajeEjecucion(porcentaje);
                
                            // Si el estado inicial es diferente a implementada
                            }else{
                                this.getEntity().setEstadoARR(service.obtenerEstadoARRImplementada());
                                this.setExisteCambioEstado(true);
                                this.setJustificacionBitacoraARR("");
                                this.setDeshabilitarEstadoARR(true);
                                this.setPorcentajeEjecucion(porcentaje);
                                
                            }

                            if(this.getEntity().getEstadoARR().equals(this.estadoARRInicial)){
                                this.setExisteCambioEstado(false);
                                this.setJustificacionBitacoraARR("");
                                this.setDeshabilitarEstadoARR(false);
                            }
                        }
                        this.determinarColorProgressBar(porcentaje);

                    }
                }
            }
        }
        
    }
  • Creamos la función que se encarga de establecer la clase de la barra de progreso
/*************************************************************************************************/
    /*************************************************************************************************/
    /********************                 DISEÑO                    **********************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public void determinarColorProgressBar(BigDecimal porcentaje){

        BigDecimal indicador1 = new BigDecimal(0);
        BigDecimal indicador2 = new BigDecimal(50);
        BigDecimal indicador3 = new BigDecimal(100);
        
        if( (porcentaje.compareTo(indicador1)>= 0) && (porcentaje.compareTo(indicador2)<= 0)){
            this.setStyleProgressBar("colorBarraMenor50");
        }else if((porcentaje.compareTo(indicador2)>= 0) && (porcentaje.compareTo(indicador3)< 0)){
            this.setStyleProgressBar("colorBarraMenor100");
        }else if (porcentaje.compareTo(indicador3)== 0){
            this.setStyleProgressBar("colorBarra100");
        }

    }

Calculo para Actividad Mejora

  • Ahora vamos a crear la especificación para obtener la META_POA_EVALUACION para una actividad de mejora
  • SQL
SELECT 

*

FROM PPI.META_POA_EVALUACION MPE

INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)

INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)

INNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)
INNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)
WHERE
AM.ID_ACTIVIDAD_MEJORA = 15 
AND
EP.PERIODO_ANUAL = 202

MetaPoaEvaluacionSpecs.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaActividadMejora;
  • Agregamos la específicación
/*************************************************************************************************/
    /*************************************************************************************************/
    /******          SPECIFICATION: actividadMejoraEqualsAndPeriodoAnualEquals        ****************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
     SELECT 
        *
        FROM PPI.META_POA_EVALUACION MPE

        INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)

        INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
        INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)

        INNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)
        INNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)
        WHERE
        AM.ID_ACTIVIDAD_MEJORA = 15 
        AND
        EP.PERIODO_ANUAL = 202
    */

    public static Specification<MetaPoaEvaluacion> actividadMejoraEqualsAndPeriodoAnualEquals(final ActividadMejora actividadMejora, final PeriodoAnual periodoAnual) {
        return new Specification<MetaPoaEvaluacion>() {
            @Override
            public Predicate toPredicate(Root<MetaPoaEvaluacion> root, CriteriaQuery<?> cq,
                    CriteriaBuilder cb) {

                //INNER JOIN PPI.ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)
                Join<EtapaPlan, MetaPoaEvaluacion> joinEtapaPlan = root.join("etapaPlan");

                //INNER JOIN PPI.META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
                Join<MetaPoa, MetaPoaEvaluacion> joinMetaPoa = root.join("metaPoa");
                
                //INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
                Join<ObjetivoPOA, MetaPoa> joinObjetivoPOA = joinMetaPoa.join("objetivoPOA");

                //INNER JOIN PPI.PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO AND PO.ACTIVO = 1)
                Join<PlanOperativo, ObjetivoPOA> joinPlanOperativo = joinObjetivoPOA.join("planOperativo");

                
                // INNER JOIN PPI.META_POA_ACTIVIDAD_MEJORA MPAM ON (MPAM.META_POA = MP.ID_META_POA)
                Join<MetaPoaActividadMejora, MetaPoa> joinMetaPoaActividadMejora = joinMetaPoa.join("listaMetaPoaActividadesMejora");

                // INNER JOIN PPI.ACTIVIDAD_MEJORA AM ON (AM.ID_ACTIVIDAD_MEJORA = MPAM.ACTIVIDAD_MEJORA)
                Join<ActividadMejora, MetaPoaActividadMejora> joinActividadMejora = joinMetaPoaActividadMejora.join("actividadMejora");

                if(actividadMejora !=null && periodoAnual != null){

                        // Actividad Mejora Equals
                        Expression arrExp = joinActividadMejora.get("id");
                        Expression arrLit = cb.literal(actividadMejora.getId());

                        // Plan Operativo Activo
                        Expression planOperativoExp = joinPlanOperativo.get("activo");
                        Expression planOperativoLit = cb.literal(true);

                        // Periodo Anual Equals
                        Expression periodoAnualExp = joinEtapaPlan.get("periodoAnual");
                        Expression periodoAnualLit = cb.literal(periodoAnual);
                        
                        // Ordenar por etapaPlan.fechaFinal descendente
                        Expression fechaFinal = joinEtapaPlan.get("fechaFinal");
                        cq.orderBy(cb.desc(fechaFinal));


                        return cb.and(cb.equal(planOperativoExp, planOperativoLit),cb.equal(arrExp, arrLit),cb.equal(periodoAnualExp, periodoAnualLit));
                }
            
            return null;
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

MetaPoaEvaluacionService.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
  • Creamos un servicio que utilice esta especificacion
/**********************************************************************/
    /**
     * Definicion que retorna un list<MetaPoaEvaluacion> para un planOperativo activo
     * Ver {@link MetaPoaEvaluacionService#findAllByByActividadMejoraAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }
     * 
     * @author: Gustavo Matamoros González
     * @issue PPI-380 / PPI-381
     * @param actividadMejora
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    /**********************************************************************/
    public List<MetaPoaEvaluacion> findAllByByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual);

MetaPoaEvaluacionServiceImpl.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
  • Creamos el método
/**********************************************************************/
  /**
   * Método que retorna un list<MetaPoaEvaluacion> para un planOperativo activo
   * Ver {@link MetaPoaEvaluacionService#findAllByByActividadMejoraAndPeriodoAnual(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora,cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual) }
   * 
   * @author: Gustavo Matamoros González
   * @issue PPI-380 / PPI-381
   * @param actividadMejora
   * @param periodoAnual
   * @return List<MetaPoaEvaluacion>
   */
  /**********************************************************************/
  @Override
  public List<MetaPoaEvaluacion> findAllByByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual) {
      
    // Definimos una variable de tipo especificacion MetaPoaEvaluacion
    Specification<MetaPoaEvaluacion> specFinal;
    
    // Obtenemos la especificación de actividadMejoraEquals
    Specification specActividadMejoraEqualsAndPeriodoAnualEquals = MetaPoaEvaluacionSpecs.actividadMejoraEqualsAndPeriodoAnualEquals(actividadMejora, periodoAnual);

    
    // Creamos la especificación final
    specFinal = Specification.where(specActividadMejoraEqualsAndPeriodoAnualEquals);
    
    return repository.findAll(specFinal);
  }

actividadMejoraEditForm.xhtml

Periodo Inicial

  • En periodo Inicial modificamos el ajax del autocomplete
<p:ajax event="itemSelect"
                                process="@this"
                                update="periodoAnualInicialAutoComplete,periodoAnualFinalAutoComplete"/>
  • Por este
<p:ajax event="itemSelect" 
                                listener="#{actividadMejoraBean.actualizaExisteCambioPeriodo()}"
                                process="@this"
                                update= "@this,
                                            :#{p:resolveFirstComponentWithId('periodoAnualInicialAutoComplete', view).clientId},
                                            :#{p:resolveFirstComponentWithId('periodoAnualFinalAutoComplete', view).clientId},

                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}"
                                />
  • Y para el LOV vamos a agregar el siguiente remoteCommand
<p:remoteCommand    name="updatePeriodoInicialAutoComplete"
                                        action="#{actividadMejoraBean.actualizaExisteCambioPeriodo()}"
                                        update= "@this,
                                            :#{p:resolveFirstComponentWithId('periodoAnualInicialAutoComplete', view).clientId},
                                            :#{p:resolveFirstComponentWithId('periodoAnualFinalAutoComplete', view).clientId},

                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}"/>
  • Y al components:dialogFrameworkData debemos agregarle
oncomplete="updatePeriodoInicialAutoComplete()"
  • Quedando así:
<components:dialogFrameworkData id="periodoAnualInicialListDialog"
                                                    lOVBean="#{periodoAnualLOVBean}"
                                                    target="#{actividadMejoraBean.entity.periodoAnualInicial}"
                                                    update="periodoAnualInicialAutoComplete"  
                                                    oncomplete="updatePeriodoInicialAutoComplete()"                                                  
                                                    title="#{i18n.actividadMejora_periodoAnualInicial_lov_label}"/>

Periodo Final

  • Ahora debemos hacer lo mismo para el periodo final y asi poder evaluar la modificación de ambos casos
  • autocomplete modificamos este
<p:ajax event="itemSelect"
                                process="@this"/>
  • Por este
<p:ajax     event="itemSelect" 
                                listener="#{actividadMejoraBean.actualizaExisteCambioPeriodo()}"
                                process="@this"
                                update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}"
                    />
  • Agregamos el remoteCommand
<p:remoteCommand    name="updatePeriodoFinalAutoComplete"
                                        action="#{actividadMejoraBean.actualizaExisteCambioPeriodo()}"
                                        update= "@this,
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_justificacionOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('estadoAMOutputPanel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputLabel', view).clientId},
                                            :#{p:resolveFirstComponentWithId('actividadMejora_porcentajeEjecucion_OutputPanel', view).clientId}"/>
  • Y a components:dialogFrameworkData le agregamos
oncomplete="updatePeriodoFinalAutoComplete()"
  • Quedando Así
<components:dialogFrameworkData id="periodoAnualFinalListDialog"
                                                    lOVBean="#{periodoAnualLOVBean}"
                                                    target="#{actividadMejoraBean.entity.periodoAnualFinal}"
                                                    update="periodoAnualFinalAutoComplete"    
                                                    oncomplete="updatePeriodoFinalAutoComplete()"                                                
                                                    title="#{i18n.actividadMejora_periodoAnualFinal_lov_label}"/>
  • Ahora vamos a agregar una progressBar para que muestre el porcentaje de avance, despues de los periodos
<!--####################################################################################-->
                <!--##########################    PORCENTAJE EJECUCION     #############################-->
                <!--####################################################################################-->

                <!--LABEL-->
                <p:outputLabel  id="actividadMejora_porcentajeEjecucion_OutputLabel"
                                for="actividadMejora_porcentajeEjecucion_ProgressBar"
                                value="#{i18n.actividadMejora_porcentajeEjecucion_label}"
                                rendered="#{actividadMejoraBean.isHabilitarPorcentajeEjecucion()}"
                                style="vertical-align: top;" />

                <!--PANEL-->
                <p:outputPanel  id="actividadMejora_porcentajeEjecucion_OutputPanel"
                                rendered="#{actividadMejoraBean.isHabilitarPorcentajeEjecucion()}" >

                    <p:progressBar 
                                    id="actividadMejora_porcentajeEjecucion_ProgressBar" 
                                    value="#{actividadMejoraBean.porcentajeEjecucion}" 
                                    labelTemplate="#{actividadMejoraBean.porcentajeEjecucion}%" 
                                    style="width:350px; font-size:12px;background: #efefef;"
                                    styleClass="#{actividadMejoraBean.styleProgressBar}"/>

                    <!--MENSAJE-->
                    <p:message  id="actividadMejora_porcentajeEjecucion_Message" 
                                for="actividadMejora_porcentajeEjecucion_ProgressBar"/>

                </p:outputPanel>


                <!--####################################################################################-->
                <!--####################################################################################-->
                <!--####################################################################################-->
  • Y ahora antes de la etiqueta de cierre de </ui:define> agregamos los estilos CSS necesarios
<style>

            .colorBarraMenor50.ui-progressbar .ui-widget-header {
                background-color: #ff3806 !important;
                border: 1px solid #ff3806 !important;
            }

            .colorBarraMenor100.ui-progressbar .ui-widget-header {
                background-color: #ffb006 !important;
                border: 1px solid #ffb006 !important;
            }

            .colorBarra100.ui-progressbar .ui-widget-header {
                background-color: #38a15b !important;
                border: 1px solid #38a15b !important;
            }
            .ui-panelgrid-cell {
                vertical-align: top;
            }

        </style>

ActividadMejoraServiceImpl.java

  • Agregamos importes necesarios
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPoaEvaluacionService;

import java.util.ArrayList;
import java.math.BigDecimal;
import java.math.RoundingMode;
  • Agregamos autowired
@Autowired
    MetaPoaEvaluacionService metaPoaEvaluacionService;
  • Creamos una función que obtenga una lista de MetaPoaEvaluacion segun AM y PeriodoAnual
/**
     * Metodo que obtiene una List<MetaPoaEvaluacion> según una Actividad de Mejora y un periodo
     *
     * @author Gustavo Matamoros González
     * @since 28/04/2023
     * @param actividadMejora
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    @Override
    public List<MetaPoaEvaluacion> obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual) {
         return metaPoaEvaluacionService.findAllByByActividadMejoraAndPeriodoAnual(actividadMejora, periodoAnual);
    }
  • y seguido creammos una función que calcule el porcentaje de ejecución de la actividad
/**
     * Metodo que calcula el porcentaje de ejecución de una actividad 
     *
     * @author Gustavo Matamoros González
     * @since 28/04/2023
     * @param actividadMejora
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    @Override
    public BigDecimal calculaPorcentajeEjecucionAM(ActividadMejora actividadMejora){

        // Obtener el año inicial y final de la entidad
        Integer annoInicial = actividadMejora.getPeriodoAnualInicial().getAno();
        Integer annoFinal = actividadMejora.getPeriodoAnualFinal().getAno();

        // Variable para obtener la cantidad de periodos seleccionados
        Integer cantidadPeriodos = 0;

        // Variable para obtener la totalidad de ejecucion de todos los periodos
        BigDecimal totalEjecucionPeriodos = BigDecimal.ZERO;

        // Creamos una lista temporal limpia
        List<MetaPoaEvaluacion> listaMetaPoaEvaluacionPorPeriodo = new ArrayList<>();

        //NOTA: Obtener el año del periodo inicial de las evaluaciones esto por que inician a partir del año 2023
        PeriodoAnual periodoInicialEvaluaciones = periodoAnualService.findOne(Long.parseLong(parametroService.findOneByLlave("param_ppi_mcg_periodoInicialEvaluacionesActividadesARRyAM").getValor()));
        
        // Obtenemos el año del periodo
        Integer annoInicialEvaluaciones = periodoInicialEvaluaciones.getAno();

        // Determinar si annoInicial es menor al inicio de la evaluaciones 
        if (annoInicial < annoInicialEvaluaciones){
            annoInicial = annoInicialEvaluaciones;
        }

        // Recorrer los periodos anuales para obtener la última evaluación de cada periodo
        for (int i = annoInicial; i <= annoFinal; i++) {
            
            // limpiamos la lista
            listaMetaPoaEvaluacionPorPeriodo.clear();

            // Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente
            listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(actividadMejora,periodoAnualService.findPeriodoAnualByAnno(i));

            // Si la lista no esta vacia para el año existen evaluaciones 
            if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){
                
                // Se convierte a String
                String strPorcentajeEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getEjecucion());

                // Se convierte a BigDecimal con 2 digitos
                BigDecimal montoEjecucion = new BigDecimal(strPorcentajeEvaluacion).setScale(2, BigDecimal.ROUND_HALF_EVEN);

                // Obtenemos el primer elemento o la última evaluacion y se lo sumamos al total
                totalEjecucionPeriodos = totalEjecucionPeriodos.add(montoEjecucion);
            }
            // aumentamos la cantidad de periodos
            cantidadPeriodos++;
        }

        // Si existe al menos un periodo
        if(cantidadPeriodos > 0){
            BigDecimal cantidadPeriodosBD = new BigDecimal(cantidadPeriodos);

            // Verificar la división de cero
            if(totalEjecucionPeriodos.compareTo(BigDecimal.ZERO) == 0){
                return totalEjecucionPeriodos;
            
            // Si existen valores
            }else{
                // eliminar decimales
                return totalEjecucionPeriodos.divide(cantidadPeriodosBD,2,RoundingMode.CEILING);
            }
        }

        return totalEjecucionPeriodos;
    }
  • Ahora creamos las funciones para poder obtener los diferentes estados
/**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 28/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMSinIniciar() {
        return estadoAMService.obtenerEstadoAMSinIniciar();
    }

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMEnProceso() {
        return estadoAMService.obtenerEstadoAMEnProceso();
    }

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMDescartada() {
        return estadoAMService.obtenerEstadoAMDescartada();
    }

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    @Override
    public EstadoAM obtenerEstadoAMImplementada() {
        return estadoAMService.obtenerEstadoAMImplementada();
    }

ActividadMejoraService.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoaEvaluacion;
import java.math.BigDecimal;
import java.util.List;
  • Agregamos las definiciones
/**
     * Definición que obtiene una List<MetaPoaEvaluacion> según una Actividad de Mejora y un periodo
     *
     * @author Gustavo Matamoros González
     * @since 28/04/2023
     * @param actividadMejora
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    public List<MetaPoaEvaluacion> obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(ActividadMejora actividadMejora, PeriodoAnual periodoAnual);

    /**
     * Metodo que calcula el porcentaje de ejecución de una actividad 
     *
     * @author Gustavo Matamoros González
     * @since 27/04/2023
     * @param actividadMejora
     * @param periodoAnual
     * @return List<MetaPoaEvaluacion>
     */
    public BigDecimal calculaPorcentajeEjecucionARR(ActividadMejora actividadMejora);

    /**
     * Metodo que obtiene el estado sinIniciar.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMSinIniciar();

    /**
     * Metodo que obtiene el estado enProceso.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMEnProceso();

    /**
     * Metodo que obtiene el estado descartada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMDescartada();

    /**
     * Metodo que obtiene el estado implementada.
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return EstadoAM
     */
    public EstadoAM obtenerEstadoAMImplementada();

ActividadMejoraBean.java

  • imports
import java.util.HashMap;
import java.util.Map;
  • Variables, agregamos estas
private Boolean habilitarPorcentajeEjecucion;
    private BigDecimal porcentajeEjecucion;
    private String styleProgressBar;
private Boolean deshabilitarEstadoAM;
  • Quedando así
private Boolean existeCambioEstado;
    private String justificacionBitacoraAM;
    private EstadoAM estadoAMInicial;
    private Boolean actividadNueva;
    private Boolean deshabilitarEstadoAM;
    private Boolean habilitarPorcentajeEjecucion;
    private BigDecimal porcentajeEjecucion;
    private String styleProgressBar;
  • Modificamos la funcion initdetails
public void initDetails() {
        if (!isPostBack()) {

            if(this.getEntity().getId() != null){

                this.estadoAMInicial = this.getEntity().getEstadoAM();
                this.setActividadNueva(false);
                this.setJustificacionBitacoraAM("");
                this.setDeshabilitarEstadoAM(false);
                this.setHabilitarPorcentajeEjecucion(true);

                BigDecimal porcentaje = service.calculaPorcentajeEjecucionAM(this.getEntity());
                this.setPorcentajeEjecucion(porcentaje);
                this.determinarColorProgressBar(porcentaje);

            }else{
                this.setActividadNueva(true);
                this.setDeshabilitarEstadoARR(false);
                this.setHabilitarPorcentajeEjecucion(false);
            }
            
            this.setExisteCambioEstado(false);

            
        }

        if (this.getEntity().getListaBitacoraAM() != null) {
            Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
        }

        this.getEntity().setListaBitacoraAM(bitacoraAMBean.setDetails(this.getEntity().getListaBitacoraAM()));
        bitacoraAMBean.init();
    }
  • funcion update
@Override
    public String update(){
        String form;
       
        // Si es una actualización
        if(this.estadoAMInicial !=null){

            // Preguntamos si es igual al estado inicial reiniciamos la justificación
            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                this.setJustificacionBitacoraAM("");
                this.setExisteCambioEstado(false);
                this.setDeshabilitarEstadoAM(false);

            // Si son diferentes
            }else{

                /******************************************/
                /**********  VALIDACIÓN: descartada *******/
                /******************************************/
                // PPI-380 / PPI-381: Al descartar una actividad pasa a estar inactivo el registro.
                if(service.esEstadoAMDescartada( this.getEntity().getEstadoAM() )){

                    if (adjuntoController.getDocumentoAGDs().isEmpty()) {
                        this.errorMessage("actividadMejora_falta_adjunto_error_summary","actividadMejora_falta_adjunto_error_detail");
                        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("actividadMejora_falta_adjunto_error"), getI18n("actividadMejora_falta_adjunto_error")));
                    }
                    this.getEntity().setActivo(false);
                }

                // Mandamos a crear una Bitacora y agregarla a la lista 
                service.creaBitacoraAMModificado(this.getEntity(), this.justificacionBitacoraAM);

                // Ordenamos la lista
                if (this.getEntity().getListaBitacoraAM() != null) {
                    Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
                }

                // obtenemos el nuevo estado Actual para luego compararlo
                this.estadoAMInicial = this.getEntity().getEstadoAM();

                // Limpiamos la Justificación
                if(!this.justificacionBitacoraAM.isEmpty()){                 
                    this.setJustificacionBitacoraAM("");
                    this.setExisteCambioEstado(false);
                    this.setDeshabilitarEstadoAM(false);
                }
            }
        }else{
            this.setJustificacionBitacoraAM("");
            this.setExisteCambioEstado(false);
            this.setDeshabilitarEstadoAM(false);
            
        }

        form = super.update();

        return form;
    }
  • Creamos las funciones de procentaje de ejecuación
public Boolean isHabilitarPorcentajeEjecucion() {
        return habilitarPorcentajeEjecucion;
    }

    public void setHabilitarPorcentajeEjecucion(Boolean habilitarPorcentajeEjecucion) {
        this.habilitarPorcentajeEjecucion = habilitarPorcentajeEjecucion;
    }

    public BigDecimal getPorcentajeEjecucion() {
        return porcentajeEjecucion;
    }
    public void setPorcentajeEjecucion(BigDecimal porcentajeEjecucion) {
        this.porcentajeEjecucion = porcentajeEjecucion;
    }

    public String getStyleProgressBar() {
        return styleProgressBar;
    }

    public void setStyleProgressBar(String styleProgressBar) {
        this.styleProgressBar = styleProgressBar;
    }
  • Agregamos las funciones de deshabilitar estadoARR
public Boolean isDeshabilitarEstadoAM() {
        return this.deshabilitarEstadoAM;
    }

    public void setDeshabilitarEstadoAM(Boolean deshabilitarEstadoAM) {
        this.deshabilitarEstadoAM = deshabilitarEstadoAM;
    }
  • Agregamos la función que actulizar el cambio de periodo
/**********************************************************************/
    /**
     * Función que verifica un cambio de periodo 
     * @author Gustavo Matamoros González
     * @since 28/04/2023
     * @issue PPI-380  
     * @return void
     */
    /**********************************************************************/
    public void actualizaExisteCambioPeriodo(){

        if(!this.isActividadNueva()){

            Integer annofechaInicial = this.getEntity().getAnnoPeriodoAnualInicial();
            Integer annofechaFinal = this.getEntity().getAnnoPeriodoAnualFinal();

            if((annofechaFinal != null) && (annofechaInicial != null)){

                // VALIDACIÓN: AñoInicial > AñoFinal
                if (annofechaFinal.compareTo(annofechaInicial) < 0) {
                    //this.errorMessage("actividadRespuestaRiesgo_falta_adjunto_error_summary","actividadRespuestaRiesgo_falta_adjunto_error_detail");
                    //throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("actividadRespuestaRiesgo_falta_adjunto_error"), getI18n("actividadRespuestaRiesgo_falta_adjunto_error")));
                    //throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, getI18n("AAA"), getI18n("actividadRespuestaRiesgo_falta_adjunto_error")));
                }else{

                    //Obtenemos el procentaje de ejecucion 
                    BigDecimal porcentaje = service.calculaPorcentajeEjecucionAM(this.getEntity());

                    BigDecimal indicador = new BigDecimal(100);

                    
                    // Si porcentaje es menor a 100 es en proceso
                    if(porcentaje.compareTo(indicador) < 0){

                        if(this.estadoAMInicial !=null){



                            // El estado actual es igual en proceso
                            if(this.getEntity().getEstadoAM().equals(service.obtenerEstadoAMEnProceso())){
                                this.setJustificacionBitacoraAM("");
                                this.setExisteCambioEstado(false);
                                this.setDeshabilitarEstadoAM(false);
                                this.setPorcentajeEjecucion(porcentaje);
                
                            // Si el estado inicial es diferente a en proceso
                            }else{
                                this.getEntity().setEstadoAM(service.obtenerEstadoAMEnProceso());
                                this.setExisteCambioEstado(true);
                                this.setJustificacionBitacoraAM("");
                                this.setDeshabilitarEstadoAM(true);
                                this.setPorcentajeEjecucion(porcentaje);
                              
                            }
                            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                                this.setExisteCambioEstado(false);
                                this.setJustificacionBitacoraAM("");
                                this.setDeshabilitarEstadoAM(false);
                            }
                        }

                        this.determinarColorProgressBar(porcentaje);

                        
                    
                    // Si porcentaje es igual a 100 es implementada
                    }else if(porcentaje.compareTo(indicador) == 0){

                        if(this.estadoAMInicial !=null){

                            // El estado Inicial es igual al actual
                            if(this.getEntity().getEstadoAM().equals(service.obtenerEstadoAMImplementada())){
                                this.setJustificacionBitacoraAM("");
                                this.setExisteCambioEstado(false);
                                this.setDeshabilitarEstadoAM(false);
                                this.setPorcentajeEjecucion(porcentaje);
                
                            // Si el estado inicial es diferente a implementada
                            }else{
                                this.getEntity().setEstadoAM(service.obtenerEstadoAMImplementada());
                                this.setExisteCambioEstado(true);
                                this.setJustificacionBitacoraAM("");
                                this.setDeshabilitarEstadoAM(true);
                                this.setPorcentajeEjecucion(porcentaje);
                                
                            }

                            if(this.getEntity().getEstadoAM().equals(this.estadoAMInicial)){
                                this.setExisteCambioEstado(false);
                                this.setJustificacionBitacoraAM("");
                                this.setDeshabilitarEstadoAM(false);
                            }
                        }
                        this.determinarColorProgressBar(porcentaje);

                    }
                }
            }
        }
        
    }
  • Creamos la función que se encarga de establecer la clase de la barra de progreso
public void determinarColorProgressBar(BigDecimal porcentaje){

        BigDecimal indicador1 = new BigDecimal(0);
        BigDecimal indicador2 = new BigDecimal(50);
        BigDecimal indicador3 = new BigDecimal(100);
        
        if( (porcentaje.compareTo(indicador1)>= 0) && (porcentaje.compareTo(indicador2)<= 0)){
            this.setStyleProgressBar("colorBarraMenor50");
        }else if((porcentaje.compareTo(indicador2)>= 0) && (porcentaje.compareTo(indicador3)< 0)){
            this.setStyleProgressBar("colorBarraMenor100");
        }else if (porcentaje.compareTo(indicador3)== 0){
            this.setStyleProgressBar("colorBarra100");
        }

    }

ActividadMejora.java

  • Ahora para que sirva que sirva la función de calculo de cambio de perido dentro del domain deben existir las funciones de obtención del año del periodo las vamos a crear
  • Agregamos trasient
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    @Transient
    private Integer annoPeriodoAnualInicial;

    @Transient
    private Integer annoPeriodoAnualFinal;
  • funciones
/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    public Integer getAnnoPeriodoAnualInicial() {

        this.annoPeriodoAnualInicial = null;

        if (this.periodoAnualInicial != null) {
            this.annoPeriodoAnualInicial = this.periodoAnualInicial.getAno();
        }

        return annoPeriodoAnualInicial;
    }

    public void setAnnoPeriodoAnualInicial(Integer annoPeriodoAnualInicial) {
        this.annoPeriodoAnualInicial = annoPeriodoAnualInicial;
    }


/**
     * PPI-381
     * @autor: Gustavo Matamoros González
     */
    public Integer getAnnoPeriodoAnualFinal() {

        this.annoPeriodoAnualFinal = null;

        if (this.periodoAnualFinal != null) {
            this.annoPeriodoAnualFinal = this.periodoAnualFinal.getAno();
        }

        return annoPeriodoAnualFinal;
    }

    public void setAnnoPeriodoAnualFinal(Integer annoPeriodoAnualFinal) {
        this.annoPeriodoAnualFinal = annoPeriodoAnualFinal;
    }

MetaPoaEvaluacion.java

  • Finalmente para que el BigDecimal sirva de forma correcta enn el domain se debe definir de la siguiente manera la columna ejecución
@Column(name = "EJECUCION", columnDefinition = "NUMBER(19,2)")
    private BigDecimal ejecucion = BigDecimal.ZERO;

Corrección de ordenamiento por fecha

  • Posteriormente teníamos que el ordenamiento de la fecha DESC se hiciera en el Bean
  • Pero esto no funcionaba de forma correcta
  • 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

ActividadRespuestaRiesgo.java

  • Modificamos el metodo
public List<BitacoraARR> getListaBitacoraARR() {
        return listaBitacoraARR;
    }
  • Por este:
public List<BitacoraARR> getListaBitacoraARR() {
        if (listaBitacoraARR != null) {
            Collections.sort(listaBitacoraARR, new Comparator<BitacoraARR>() {
                @Override
                public int compare(BitacoraARR o1, BitacoraARR o2) {
                    return o1.getFecha().compareTo(o2.getFecha());
                }
            });
            Collections.reverse(listaBitacoraARR);
        }
        return listaBitacoraARR;
    }
  • Ahora podemos eliminar el código de ordenamiento del bean
if (this.getEntity().getListaBitacoraARR() != null) {
          //  Collections.sort(this.getEntity().getListaBitacoraARR(), ORDENAR_FECHA);
        //}

final Comparator<BitacoraARR> ORDENAR_FECHA = new Comparator<BitacoraARR>() {

        @Override
        public int compare(BitacoraARR l1, BitacoraARR l2) {
            return l2.getFecha().compareTo(l2.getFecha());
        }
    };

ActividadMejora.java

  • Imports
import java.util.Collections;
import java.util.Comparator;
  • Hacemos los mismo y modificamos la funcion
public List<BitacoraAM> getListaBitacoraAM() {
        return listaBitacoraAM;
    }
  • Por:
public List<BitacoraAM> getListaBitacoraAM() {
        if (listaBitacoraAM != null) {
            Collections.sort(listaBitacoraAM, new Comparator<BitacoraAM>() {
                @Override
                public int compare(BitacoraAM o1, BitacoraAM o2) {
                    return o1.getFecha().compareTo(o2.getFecha());
                }
            });
            Collections.reverse(listaBitacoraAM);
        }
        return listaBitacoraAM;
    }

ActividadMejoraBean.java

  • Quitamos
// Odernar descendente l2 -> l1
    final Comparator<BitacoraAM> ORDENAR_FECHA = new Comparator<BitacoraAM>() {
        public int compare(BitacoraAM l1, BitacoraAM l2) {
            return l2.getFechaHora().compareTo(l1.getFechaHora());
        }
    };


if (this.getEntity().getListaBitacoraAM() != null) {
            Collections.sort(this.getEntity().getListaBitacoraAM(), ORDENAR_FECHA);
        }

Actualizar ARRbyEvaluacionOperativo

ActividadRespuestaRiesgoSpecs.jav

  • Lo primero que debemos hacer es corregir la siguiente especificación que se encuentra errorena
/*************************************************************************************************/
    /*************************************************************************************************/
    /****    SPECIFICATION: actividadRespuestaActividadRespuestaRiesgoByPlanOperativo    *************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
     * Subquery: SELECT * FROM ACTIVIDAD_RESPUESTA_RIESGO
     *                 WHERE ID_ACTIVIDAD_RESPUESTA_RIESGO IN(
     *                 SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO AR
     *                 INNER JOIN META_POA MP ON (MP.ID_META_POA = AR.META_POA)
     *                 INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
     *                 INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
     *                 WHERE PO.ID_PLAN_OPERATIVO = 212 )
     *
     * 
     * 
     * @param planOperativo
     * @return
     */
    public static Specification actividadRespuestaActividadRespuestaRiesgoByPlanOperativo(final PlanOperativo planOperativo) {
        return new Specification<ActividadRespuestaRiesgo>() {
            @Override
            public Predicate toPredicate(Root<ActividadRespuestaRiesgo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                
                Subquery<MetaPoaActividadRiesgo> qMetaPoaActividadRiesgo = cq.subquery(MetaPoaActividadRiesgo.class);
                Root<MetaPoaActividadRiesgo> rMetaPoaActividadRiesgo = qMetaPoaActividadRiesgo.from(MetaPoaActividadRiesgo.class);

                Join<MetaPoa,       MetaPoaActividadRiesgo> joinMetaPoa         = rMetaPoaActividadRiesgo.join("metaPoa");
                Join<ObjetivoPOA,   MetaPoa>                joinObjetivoPoa     = joinMetaPoa.join("objetivoPOA");
                //Join<PlanOperativo, ObjetivoPOA>            joinPlanOperativo   = joinObjetivoPoa.join("planOperativo");

                Expression planOpe = joinObjetivoPoa.get("planOperativo");
                Join<MetaPoaActividadRiesgo, MetaPoaActividadRiesgo> joinActividadMejora = rMetaPoaActividadRiesgo.join("actividadRespuestaRiesgo");

                Expression selectMetaPoaActividadRiesgo = joinActividadMejora.get("id");


                qMetaPoaActividadRiesgo.select(selectMetaPoaActividadRiesgo).where(cb.equal(planOpe, planOperativo));

                return root.get("id").in(qMetaPoaActividadRiesgo);
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Por esta
/*************************************************************************************************/
    /*************************************************************************************************/
    /****               SPECIFICATION: actividadRespuestaRiesgoByPlanOperativo           *************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
      SELECT 
        * 
        FROM ACTIVIDAD_RESPUESTA_RIESGO 
        WHERE ID_ACTIVIDAD_RESPUESTA_RIESGO IN(
                        SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO MPAR
                        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAR.META_POA)
                        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
                        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
                        WHERE PO.ID_PLAN_OPERATIVO = 90);
     * 
     * 
     * @param planOperativo
     * @return
     */
    public static Specification actividadRespuestaRiesgoByPlanOperativo(final PlanOperativo planOperativo) {
        return new Specification<ActividadRespuestaRiesgo>() {
            @Override
            public Predicate toPredicate(Root<ActividadRespuestaRiesgo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                
                // SELECT ACTIVIDAD_RESPUESTA_RIESGO FROM PPI.META_POA_ACTIVIDAD_RIESGO MPAR
                Subquery<MetaPoaActividadRiesgo> subMetaPoaActividadRiesgo = cq.subquery(MetaPoaActividadRiesgo.class);
                Root<MetaPoaActividadRiesgo> rootMetaPoaActividadRiesgo = subMetaPoaActividadRiesgo.from(MetaPoaActividadRiesgo.class);

                // INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAR.META_POA)
                Join<MetaPoa, MetaPoaActividadRiesgo> joinMetaPoa = rootMetaPoaActividadRiesgo.join("metaPoa");
                
                // INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA
                Join<ObjetivoPOA,   MetaPoa>   joinObjetivoPoa = joinMetaPoa.join("objetivoPOA");
                
                Expression expIdPlanOperativo = joinObjetivoPoa.join("planOperativo").get("id"); 
                Expression litIdPlanOperativo = cb.literal(planOperativo.getId());

                // SELECT ACTIVIDAD_RESPUESTA_RIESGO 
                Expression expActividadRespuestaRiesgo = rootMetaPoaActividadRiesgo.get("actividadRespuestaRiesgo");
                
                // WHERE PO.ID_PLAN_OPERATIVO = 90
                subMetaPoaActividadRiesgo.select(expActividadRespuestaRiesgo).where(cb.equal(litIdPlanOperativo, expIdPlanOperativo)).distinct(true);
                
                Expression idARR = root.get("id");
                return idARR.in(subMetaPoaActividadRiesgo);
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

ActividadMejoraSpecs.java

  • Hacemos los mismo para actividad Mejora
  • remplazamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /******                 SPECIFICATION: actividadMejoraByPlanOperativo         ********************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
     * Subquery: SELECT * FROM ACTIVIDAD_MEJORA
     *                  WHERE ID_ACTIVIDAD_MEJORA IN(
     *                  SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA AM
     *                  INNER JOIN META_POA MP ON (MP.ID_META_POA = AM.META_POA)
     *                  INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
     *                  INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
     *                  WHERE PO.ID_PLAN_OPERATIVO = 212 )
     *
     * 
     * 
     * @param planOperativo
     * @return
     */
    public static Specification actividadMejoraByPlanOperativo(final PlanOperativo planOperativo) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                
                Subquery<MetaPoaActividadMejora> qMetaPoaActividadMejora = cq.subquery(MetaPoaActividadMejora.class);
                Root<MetaPoaActividadMejora> rMetaPoaActividadMejora = qMetaPoaActividadMejora.from(MetaPoaActividadMejora.class);

                Join<MetaPoa,       MetaPoaActividadMejora> joinMetaPoa         = rMetaPoaActividadMejora.join("metaPoa");
                Join<ObjetivoPOA,   MetaPoa>                joinObjetivoPoa     = joinMetaPoa.join("objetivoPOA");
                //Join<PlanOperativo, ObjetivoPOA>            joinPlanOperativo   = joinObjetivoPoa.join("planOperativo");

                Expression planOpe = joinObjetivoPoa.get("planOperativo");
                Join<ActividadMejora, MetaPoaActividadMejora> joinActividadMejora = rMetaPoaActividadMejora.join("actividadMejora");

                Expression selectMetaPoaActividadMejora = joinActividadMejora.get("id");


                qMetaPoaActividadMejora.select(selectMetaPoaActividadMejora).where(cb.equal(planOpe, planOperativo));

                return root.get("id").in(qMetaPoaActividadMejora);
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Por esta
/*************************************************************************************************/
    /*************************************************************************************************/
    /****                  SPECIFICATION: actividadMejoraByPlanOperativo                 *************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /**
      SELECT 
        * 
        FROM ACTIVIDAD_MEJORA
        WHERE ID_ACTIVIDAD_MEJORA IN(
                        SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA MPAM
                        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAM.META_POA)
                        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
                        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
                        WHERE PO.ID_PLAN_OPERATIVO = 90);
     * 
     * 
     * @param planOperativo
     * @return
     */
    public static Specification actividadMejoraByPlanOperativo(final PlanOperativo planOperativo) {
        return new Specification<ActividadMejora>() {
            @Override
            public Predicate toPredicate(Root<ActividadMejora> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                
                // SELECT ACTIVIDAD_MEJORA FROM PPI.META_POA_ACTIVIDAD_MEJORA MPAM
                Subquery<MetaPoaActividadMejora> subMetaPoaActividadMejora = cq.subquery(MetaPoaActividadMejora.class);
                Root<MetaPoaActividadMejora> rootMetaPoaActividadMejora = subMetaPoaActividadMejora.from(MetaPoaActividadMejora.class);

                // INNER JOIN META_POA MP ON (MP.ID_META_POA = MPAM.META_POA)
                Join<MetaPoa, MetaPoaActividadMejora> joinMetaPoa = rootMetaPoaActividadMejora.join("metaPoa");
                
                // INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA
                Join<ObjetivoPOA,   MetaPoa>   joinObjetivoPoa = joinMetaPoa.join("objetivoPOA");
                
                Expression expIdPlanOperativo = joinObjetivoPoa.join("planOperativo").get("id"); 
                Expression litIdPlanOperativo = cb.literal(planOperativo.getId());

                // SELECT ACTIVIDAD_MEJORA 
                Expression expActividadMejora = rootMetaPoaActividadMejora.get("actividadMejora");
                
                // WHERE PO.ID_PLAN_OPERATIVO = 90
                subMetaPoaActividadMejora.select(expActividadMejora).where(cb.equal(litIdPlanOperativo, expIdPlanOperativo)).distinct(true);
                
                Expression idAM = arroot.get("id");
                return idAM.in(subMetaPoaActividadMejora);
                
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

MetaPoaEvaluacionRepository.java

  • Primero debemos crear una función que nos obtenga la MetaPoaEvaluacion según una MetaPoa
  • imports
import java.util.List;
  • Función
public List<MetaPoaEvaluacion> findAllByMetaPoa(MetaPoa metaPoa);

MetaPoaEvaluacionService.java

  • Import
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;
  • Agregamos la definición
/**********************************************************************/
    /**
     * Definicion que retorna un list<MetaPoaEvaluacion> para una metaPoa
     * Ver {@link MetaPoaEvaluacionService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa) }
     * 
     * @author: Gustavo Matamoros González
     * @issue PPI-380 / PPI-381
     * @param metaPoa
     * @return List<MetaPoaEvaluacion>
     */
    /**********************************************************************/
    public List<MetaPoaEvaluacion> findAllByMetaPoa(MetaPoa metaPoa);

MetaPoaEvaluacionServiceImpl.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa;
  • Metodo
/**********************************************************************/
  /**
   * Método que retorna un list<MetaPoaEvaluacion> para una metaPoa
   * Ver {@link MetaPoaEvaluacionService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPoa) }
   * 
   * @author: Gustavo Matamoros González
   * @issue PPI-380 / PPI-381
   * @param metaPoa
   * @return List<MetaPoaEvaluacion>
   */
  /**********************************************************************/
  @Override
  public List<MetaPoaEvaluacion> findAllByMetaPoa(MetaPoa metaPoa){
    return repository.findAllByMetaPoa(metaPoa);

  }

MetaPoaActividadRiesgoRepository.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import java.util.List;
  • funcion
public List<MetaPoaActividadRiesgo> findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo);

MetaPoaActividadRiesgoService.java

  • imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import java.util.List;
  • funcion
/**********************************************************************/
    /**
     * Definicion que retorna un list<MetaPoaActividadRiesgo> para una actividad de Respuesta al Riesgo
     * Ver {@link MetaPoaActividadRiesgoService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo) }
     * 
     * @author: Gustavo Matamoros González
     * @issue PPI-380 / PPI-381
     * @param actividadRespuetasRiesgo
     * @return List<MetaPoaEvaluacion>
     */
    /**********************************************************************/
    public List<MetaPoaActividadRiesgo> findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo);
}

MetaPoaActividadRiesgoServiceImpl.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import java.util.List;
  • Funcion
/**********************************************************************/
    /**
     * Metodo que retorna un list<MetaPoaActividadRiesgo> para una actividad de Respuesta al Riesgo
     * Ver {@link MetaPoaActividadRiesgoService#findAllByMetaPoa(cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo) }
     * 
     * @author: Gustavo Matamoros González
     * @issue PPI-380 / PPI-381
     * @param actividadRespuetasRiesgo
     * @return List<MetaPoaEvaluacion>
     */
    /**********************************************************************/
    public List<MetaPoaActividadRiesgo> findAllByActividadRespuestaRiesgo(ActividadRespuestaRiesgo actividadRespuetasRiesgo){
        return repository.findAllByActividadRespuestaRiesgo(actividadRespuetasRiesgo);
    }

ActividadRespuestaRiesgoService.java

  • Definimos un servicio que va a actualizar las ARR segun una EvaluacionOperativa
/**
     * Metodo que actualiza las Actividades de Respuesta al Riesgo según una evaluación operativa
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return void
     */
    public void actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa);

ActividadRespuestaRiesgoServiceImpl.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.EvaluacionOperativaService;
  • Autowired
@Autowired
EvaluacionOperativaService evaluacionOperativaService;
  • funcion
/**
     * Definición que actualiza las Actividades de Respuesta al Riesgo según una evaluación operativa
     *
     * @author Gustavo Matamoros González
     * @since 26/04/2023
     * @return void
     */
    public void actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa){

        // Obtenemos el plan operativo
        PlanOperativo planOperativo = evaluacionOperativa.getPlanOperativo();

        // Creamos una lista para almacenar las ARR
        List<ActividadRespuestaRiesgo> listaActividadRespuestaRiesgo = new ArrayList<>();

        // Obtenemos las ARR por plan operativo
        listaActividadRespuestaRiesgo = this.findAllActividadRespuestaRiesgoByPlanOperativo(planOperativo);

        // Si la lista no se encuetra vacia
        if(!listaActividadRespuestaRiesgo.isEmpty()){

            // Recorremos la lista
            for(ActividadRespuestaRiesgo actividadRespuestaRiesgo : listaActividadRespuestaRiesgo){
                

                // **********************************************
                // PROCESO: ACTUALIZACIÓN DE ESTADO
                // **********************************************
                BigDecimal porcentaje = BigDecimal.ZERO;

                // Obtenemos el porcentaje de ejecución
                porcentaje = this.calculaPorcentajeEjecucionARR(actividadRespuestaRiesgo);

                // Indicador de condición de cambio de estado
                BigDecimal indicador = new BigDecimal(100);

                // Obtenemos el estado inicial de la actividad para determinar si existe o no cambio de estado
                EstadoARR estadoInicial = actividadRespuestaRiesgo.getEstadoARR();
                
                // Bandera que determina si existe o no cambio de estado
                Boolean existeCambioEstado = false;

                // Si porcentaje < 100 resultado: "En Proceso"
                if(porcentaje.compareTo(indicador) < 0){

                    if(!estadoInicial.equals(this.obtenerEstadoARREnProceso())){
                        actividadRespuestaRiesgo.setEstadoARR(this.obtenerEstadoARREnProceso());
                        existeCambioEstado = true;
                    }else{
                        existeCambioEstado = false;
                    }
                    
                // Si porcentaje == 100 resultado: "Implementada"
                }else if(porcentaje.compareTo(indicador) == 0){
                    
                    if(!estadoInicial.equals(this.obtenerEstadoARRImplementada())){
                        actividadRespuestaRiesgo.setEstadoARR(this.obtenerEstadoARRImplementada());
                        existeCambioEstado = true;
                    }else{
                        existeCambioEstado = false;
                    }
                }

                


                // **********************************************
                // PROCESO: ACTUALIZACIÓN DE BITACORA
                // **********************************************
               
                // Si existe cambio de estado guardamos
                if(existeCambioEstado){

                    // Guardamos el registro
                    this.save(actividadRespuestaRiesgo);
 
                    // Creamos una lista de MetaPoaEvaluacion limpia
                    List<MetaPoaEvaluacion> listaMetaPoaEvaluacionPorPeriodo = new ArrayList<>();

                    // Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente
                    listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadRespuestaRiesgoAndPeriodoAnual(actividadRespuestaRiesgo,planOperativo.getPeriodoAnual());

                    // Si la lista no esta vacia para el año es decir "existen evaluaciones"
                    if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){
                    
                        // Se obtiene la justificación de la evaluación
                        String justificacionEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getJustificacion());
        
                        // Se guarda el registro en bitacora
                        this.creaBitacoraARRModificado(actividadRespuestaRiesgo,justificacionEvaluacion);
                    }
                }

            }
        }
    }

ActividadMejoraService.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;
  • Definimos un servicio que va a actualizar las AM segun una EvaluacionOperativa
/**
     * Definición que actualiza las Actividades de mejora según una evaluación operativa
     *
     * @author Gustavo Matamoros González
     * @since 02/05/2023
     * @return void
     */
    public void actualizarActividadesMejoraByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa);

ActividadMejoraServiceImpl.java

  • Imports
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.EvaluacionOperativa;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.EvaluacionOperativaService;
  • Autowired
@Autowired
EvaluacionOperativaService evaluacionOperativaService;
  • funcion
/**
     * Método que actualiza las Actividades de Mejora según una evaluación operativa
     *
     * @author Gustavo Matamoros González
     * @since 02/05/2023
     * @return void
     */
    public void actualizarActividadesMejoraByEvaluacionOperativa(EvaluacionOperativa evaluacionOperativa){

        // Obtenemos el plan operativo
        PlanOperativo planOperativo = evaluacionOperativa.getPlanOperativo();

        // Creamos una lista para almacenar las ARR
        List<ActividadMejora> listaActividadMejora = new ArrayList<>();

        // Obtenemos las ARR por plan operativo
        listaActividadMejora = this.findAllActividadMejoraByPlanOperativo(planOperativo);

        // Si la lista no se encuetra vacia
        if(!listaActividadMejora.isEmpty()){

            // Recorremos la lista
            for(ActividadMejora actividadMejora : listaActividadMejora){
                

                // **********************************************
                // PROCESO: ACTUALIZACIÓN DE ESTADO
                // **********************************************
                BigDecimal porcentaje = BigDecimal.ZERO;

                // Obtenemos el porcentaje de ejecución
                porcentaje = this.calculaPorcentajeEjecucionAM(actividadMejora);

                // Indicador de condición de cambio de estado
                BigDecimal indicador = new BigDecimal(100);

                // Obtenemos el estado inicial de la actividad para determinar si existe o no cambio de estado
                EstadoAM estadoInicial = actividadMejora.getEstadoAM();
                
                // Bandera que determina si existe o no cambio de estado
                Boolean existeCambioEstado = false;

                // Si porcentaje < 100 resultado: "En Proceso"
                if(porcentaje.compareTo(indicador) < 0){

                    if(!estadoInicial.equals(this.obtenerEstadoAMEnProceso())){
                        actividadMejora.setEstadoAM(this.obtenerEstadoAMEnProceso());
                        existeCambioEstado = true;
                    }else{
                        existeCambioEstado = false;
                    }
                    
                // Si porcentaje == 100 resultado: "Implementada"
                }else if(porcentaje.compareTo(indicador) == 0){
                    
                    if(!estadoInicial.equals(this.obtenerEstadoAMImplementada())){
                        actividadMejora.setEstadoAM(this.obtenerEstadoAMImplementada());
                        existeCambioEstado = true;
                    }else{
                        existeCambioEstado = false;
                    }
                }

                


                // **********************************************
                // PROCESO: ACTUALIZACIÓN DE BITACORA
                // **********************************************
               
                // Si existe cambio de estado guardamos
                if(existeCambioEstado){

                    // Guardamos el registro
                    this.save(actividadMejora);
 
                    // Creamos una lista de MetaPoaEvaluacion limpia
                    List<MetaPoaEvaluacion> listaMetaPoaEvaluacionPorPeriodo = new ArrayList<>();

                    // Obtenemos la lista de MetaPoaEvaluacion por periodo que viene ordenada por fecha descendente
                    listaMetaPoaEvaluacionPorPeriodo = obtenerMetaPoaEvaluacionByActividadMejoraAndPeriodoAnual(actividadMejora,planOperativo.getPeriodoAnual());

                    // Si la lista no esta vacia para el año es decir "existen evaluaciones"
                    if(!listaMetaPoaEvaluacionPorPeriodo.isEmpty()){
                    
                        // Se obtiene la justificación de la evaluación
                        String justificacionEvaluacion = String.valueOf(listaMetaPoaEvaluacionPorPeriodo.get(0).getJustificacion());
        
                        // Se guarda el registro en bitacora
                        this.creaBitacoraAMModificado(actividadMejora,justificacionEvaluacion);
                    }
                }

            }
        }
    }

Probar funcionamiento dentro de Evaluacion Opertativa

EvaluacionOperativaServiceImpl.java

  • Ahora el método anterior debe ser llamado al momento de actualizar una evaluacion operativa
  • por esto vamos TEMPORALMENTE a sobre escribir el método «update» para llamar la los metodos de actulización de ARR y AM
  • Imports
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadRespuestaRiesgo;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadRespuestaRiesgoService;
import cr.ac.una.cgi.sigesa.ppi.mcg.domain.ActividadMejora;
import cr.ac.una.cgi.sigesa.ppi.mcg.service.ActividadMejoraService;
  • Autowored
@Autowired
    ActividadRespuestaRiesgoService actividadRespuestaRiesgoService;

    @Autowired
    ActividadMejoraService actividadMejoraService;
  • Sobre escritura deñ método update
@Override
    public EvaluacionOperativa update(EvaluacionOperativa evaluacionOperativa) {

        actividadRespuestaRiesgoService.actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(evaluacionOperativa);

        actividadMejoraService.actualizarActividadesMejoraByEvaluacionOperativa(evaluacionOperativa);

        return super.update(evaluacionOperativa);
    }
  • Ahora que ya los probamos que funcionan
  • vamos a eliminar la función de sobre escritura de update
  • Y vamos a buscar la función public EvaluacionOperativa actualizarEstado
  • Modificamos
@Override
    public EvaluacionOperativa actualizarEstado(EvaluacionOperativa entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {
        EstadoEvaluacionPOA estadoAprobadoUnidadIntegradora = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnidadIntegradora();
        EstadoEvaluacionPOA estadoAprobadoUnSoloNivel = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnSoloNivel();

        TipoPlanOperativo tipoUnidad = tipoPlanOperativoService.findTipoPlanUnidad();

        if ((nextStatus.equals(estadoAprobadoUnidadIntegradora.getId())) || (nextStatus.equals(estadoAprobadoUnSoloNivel.getId()))) {

          

            if (entity.getPlanOperativo().getTipoPlanOperativo().getId().equals(tipoUnidad.getId())) {
                entity = this.calculaCompromisoLocalAndGiradoLocal(entity);
            }
        }

        crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);

        return super.actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);
    }
  • Y la dejamos así
@Override
    public EvaluacionOperativa actualizarEstado(EvaluacionOperativa entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {
        EstadoEvaluacionPOA estadoAprobadoUnidadIntegradora = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnidadIntegradora();
        EstadoEvaluacionPOA estadoAprobadoUnSoloNivel = estadoEvaluacionPOAService.obtenerEstadoAprobadoUnSoloNivel();

        TipoPlanOperativo tipoUnidad = tipoPlanOperativoService.findTipoPlanUnidad();

        if ((nextStatus.equals(estadoAprobadoUnidadIntegradora.getId())) || (nextStatus.equals(estadoAprobadoUnSoloNivel.getId()))) {

            /**
             * PPI-381
             * @autor: Gustavo Matamoros González
             * Actualizar las Actividades de mejora
             */
            actividadRespuestaRiesgoService.actualizarActividadesRespuestaRiesgoByEvaluacionOperativa(entity);
            /**
             * PPI-381
             * @autor: Gustavo Matamoros González
             * Actualizar las Actividades de mejora
             */
            actividadMejoraService.actualizarActividadesMejoraByEvaluacionOperativa(entity);

            if (entity.getPlanOperativo().getTipoPlanOperativo().getId().equals(tipoUnidad.getId())) {
                entity = this.calculaCompromisoLocalAndGiradoLocal(entity);
            }
        }

        crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);

        return super.actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);
    }
  • ademas le estamos agregando esta función de una tarea anterios
crearRegistroBitacoraEvaluacionPOA(entity.getPlanOperativo(), nextStatus, false);
  • Y en esta función tambien le agregamos
public void crearEvaluacionOperativa
  • Esto
this.crearRegistroBitacoraEvaluacionPOA(planOperativo, 0L, true);