SIGESA Crear vista: con filtro

  • Vamos a crear la siguiente consulta

Descripción

  • Se requiere crear una consulta que muestre la distribución presupuestaria distribuida por el presupuesto institucional de las metas POAI.
  • Debe mostrar los siguientes campos:
    • Código programa presupuestario
    • Nombre Programa Presupuestario
    • Código de Objetivo POAI
      • Compuesto por la siguiente concatenación:
        • Código del programa presupuestario.
        • Para los códigos de objetivo y meta POAI debe usarse obligatoriamente 2 dígitos, rellenando con un cero a la izquierda los casos que sólo cuenten con un dígito.
        • Ejemplos: ACAD01, VID_U01 y ADM01
    • Descripción Objetivo POAI
    • Código de Meta POAI
      • Compuesto por la siguiente concatenación:
        • Código del programa presupuestario.
          • Código de objetivo POAI
        • Código de meta POAI
        • Para los códigos de objetivo y meta POAI debe usarse obligatoriamente 2 dígitos, rellenando con un cero a la izquierda los casos que sólo cuenten con un dígito.
        • Ejemplos: ACAD0101, VID_U0101 y ADM0101
    • Descripción Meta POAI
    • Código de fondo
    • Nombre de Fondo
    • Código de Cuenta Presupuestaria
    • Nombre de Cuenta Presupuestaria
    • Tipo de Presupuesto
    • Colones
    • Millones de Colones
    • Redondeo
  • La consulta debe indicar obligatoriamente la fecha y hora en que se generó y generarse en cualquier momento.
  • El único parámetro a utilizar es el Plan Operativo Anual Institucional.
    • Debe poder seleccionarse por una lista o directamente por el código
    • Usa el o los escenarios del POAI seleccionado para filtrar la información.
  • Debe aparecer debajo del parámetro las sumatorias de los presupuestos en los espacios:
    • Total en Colones
    • Total en Millones de Colones
    • Total Redondeado
    • Los montos deben estar justificados a la derecha con el siguiente formato ₡55 408,89 a excepción de los redondeados que no llevan decimales
    • Debe ser una tabla que permita seleccionar sus datos
    • Debe tener en negrita los Títulos de las columnas y las filas
    • Los montos no deben estar en negrita
  • Toda la consulta debe poder descargarse en excel.
  • Ver prototipo:
  • Se requiere crear una consulta que muestre todos los programas presupuestarios con su respectiva asignación de objetivos y metas POAI y distribución presupuestaria indicada en el prototipo.
  • Que tenga todos los campos que aparecen en el prototipo.
  • Debe mostrar el presupuesto formulado tanto en colones como en miles de colones (los miles de colones corresponde a los colones / 1000).
  • Debe mostrar una sumatoria de presupuesto formulado total general.
  • Se puede generar la consulta en cualquier momento.
  • La consulta debe indicar obligatoriamente la fecha y hora en que se generó.
  • El único parámetro a utilizar es el Plan Operativo Anual Institucional.
  • Toda la consulta debe poder descargarse en excel como muestra el prototipo.
  • Ver prototipo:
  • Creamos la consulta SQL
  • NOTA IMPORTANTE: las vista no llevan parámetros obtienen todos los datos a nivel de código se filtran
SELECT 
ROWNUM                              AS ID,
POAI.ID_PLAN_OPERATIVO_ANUAL_INST   AS PLAN_OPERATIVO_ANUAL_INST,
PP.CODIGO                           AS CODIGO_PROGRAMA_PRESUPUESTARIO,
PP.NOMBRE                           AS NOMBRE_PROGRAMA_PRESUPUESTARIO,
CONCAT(PP.CODIGO,CASE WHEN OP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(OP.CODIGO),2,'0') ELSE TO_CHAR(OP.CODIGO) END) AS CODIGO_OBJETIVO_POAI,
OP.DESCRIPCION                      AS DESCRIPCION_OBJETIVO_POAI,

CONCAT(
        CONCAT(
            PP.CODIGO,
            CASE WHEN OP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(OP.CODIGO),2,'0') ELSE TO_CHAR(OP.CODIGO) END),
        CASE WHEN MP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(MP.CODIGO),2,'0') ELSE TO_CHAR(MP.CODIGO) END) CODIGO_META_POAI,
MP.DESCRIPCION                      AS DESCRIPCION_META_POAI,
F.CODIGO                            AS CODIGO_FONDO,
F.NOMBRE                            AS NOMBRE_FONDO,
CP.CODIGO                           AS CODIGO_CUENTA_PRESUPUESTARIA,
CP.NOMBRE                           AS NOMBRE_CUENTA_PRESUPUESTARIA,
TP.NOMBRE                           AS TIPO_PRESUPUESTO,
MPP.MONTO                           AS COLONES,
ROUND((MPP.MONTO/1000000),2)        AS MILLONES_COLONES,
CEIL(MPP.MONTO)                     AS REDONDEO

FROM        PPI.META_POAI                   MP
INNER JOIN  PPI.OBJETIVO_POAI               OP      ON(OP.ID_OBJETIVO_POAI = MP.OBJETIVO_POAI)
INNER JOIN  PPI.PLAN_OPERATIVO_ANUAL_INST   POAI    ON(POAI.ID_PLAN_OPERATIVO_ANUAL_INST = OP.PLAN_OPERATIVO_ANUAL_INST)
INNER JOIN  EPF.PROGRAMA_PRESUPUESTARIO     PP      ON(PP.ID_PROGRAMA_PRESUPUESTARIO = OP.PROGRAMA_PRESUPUESTARIO)
INNER JOIN  PPI.META_POAI_PRESUPUESTO       MPP     ON(MPP.META_POAI = MP.ID_META_POAI)
INNER JOIN  EPF.FONDO                       F       ON(F.ID_FONDO = MPP.FONDO)
INNER JOIN  EPF.CUENTA_PRESUPUESTARIA       CP      ON(CP.ID_CUENTA_PRESUPUESTARIA = MPP.CUENTA_PRESUPUESTARIA)
INNER JOIN  EPF.TIPO_PRESUPUESTO            TP      ON(TP.ID_TIPO_PRESUPUESTO = CP.TIPO_PRESUPUESTO)
ORDER BY 
PP.CODIGO,
PP.NOMBRE,
OP.CODIGO,
OP.DESCRIPCION,
MP.CODIGO,
MP.DESCRIPCION,
F.CODIGO,
F.NOMBRE,
CP.CODIGO,
CP.NOMBRE,
TP.NOMBRE;

Notas:

  • Podemos observar que estamos agregando el numero de fila para que funcione como ID
ROWNUM                              AS ID,
  • Y ademas aunque en la vista no hay que mostrar el POAI lo estamos obteniendo ya que este es el campo que nos va a permitir filtrar
POAI.ID_PLAN_OPERATIVO_ANUAL_INST   AS PLAN_OPERATIVO_ANUAL_INST,

VistaPOAIMetaFondoCuentaPresupuestariaCreate.sql

  • Ahora debemos crear el siguiente archivo
  • Ubicación: PPI-PPO-> service -> src -> main -> resources -> sql
  • Para almacenar el respaldo de la creación de la vista
  • Le agregamos
/* 
 * Copyright (C) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 * 
 */

/********************************************************/
/********************************************************/
/* DOCUMENTACIÓN                                        */
/********************************************************/
/********************************************************/
/**
 * @author:  Gustavo Matamoros González
 * @since: 27/09/2023
 * @bug: PPI-432 
 * @funcion: Obtener los programas presupuestarios, objetivos, metas, fondos, cuentas presupuestarias y presupuestos según un Plan Operativo Anual Institucional
 */

--MP:   PPI.META_POAI
--OP:   PPI.OBJETIVO_POAI
--POAI: PPI.PLAN_OPERATIVO_ANUAL_INST
--PP:   EPF.PROGRAMA_PRESUPUESTARIO
--MPP:  PPI.META_POAI_PRESUPUESTO
--F:    EPF.FONDO
--CP:   EPF.CUENTA_PRESUPUESTARIA
--TP:   EPF.TIPO_PRESUPUESTO



/********************************************************/
/********************************************************/
/* ELIMINAR LA VISTA                                    */
/********************************************************/
/********************************************************/
DROP PUBLIC SYNONYM VISTA_POAI_META_FONDO_CODIGO_PRESUP;

DROP VIEW PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP;


/********************************************************/
/********************************************************/
/* CREACIÓN DE LA VISTA                                 */
/********************************************************/
/********************************************************/
CREATE OR REPLACE FORCE EDITIONABLE VIEW  PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP AS

SELECT 
ROWNUM                              AS ID,
POAI.ID_PLAN_OPERATIVO_ANUAL_INST   AS PLAN_OPERATIVO_ANUAL_INST,
PP.CODIGO                           AS CODIGO_PROGRAMA_PRESUPUESTARIO,
PP.NOMBRE                           AS NOMBRE_PROGRAMA_PRESUPUESTARIO,
CONCAT(PP.CODIGO,CASE WHEN OP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(OP.CODIGO),2,'0') ELSE TO_CHAR(OP.CODIGO) END) AS CODIGO_OBJETIVO_POAI,
OP.DESCRIPCION                      AS DESCRIPCION_OBJETIVO_POAI,

CONCAT(
        CONCAT(
            PP.CODIGO,
            CASE WHEN OP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(OP.CODIGO),2,'0') ELSE TO_CHAR(OP.CODIGO) END),
        CASE WHEN MP.CODIGO BETWEEN 1 AND 9 THEN LPAD(TO_CHAR(MP.CODIGO),2,'0') ELSE TO_CHAR(MP.CODIGO) END) CODIGO_META_POAI,
MP.DESCRIPCION                      AS DESCRIPCION_META_POAI,
F.CODIGO                            AS CODIGO_FONDO,
F.NOMBRE                            AS NOMBRE_FONDO,
CP.CODIGO                           AS CODIGO_CUENTA_PRESUPUESTARIA,
CP.NOMBRE                           AS NOMBRE_CUENTA_PRESUPUESTARIA,
TP.NOMBRE                           AS TIPO_PRESUPUESTO,
MPP.MONTO                           AS COLONES,
ROUND((MPP.MONTO/1000000),2)        AS MILLONES_COLONES,
CEIL(MPP.MONTO)                     AS REDONDEO

FROM        PPI.META_POAI                   MP
INNER JOIN  PPI.OBJETIVO_POAI               OP      ON(OP.ID_OBJETIVO_POAI = MP.OBJETIVO_POAI)
INNER JOIN  PPI.PLAN_OPERATIVO_ANUAL_INST   POAI    ON(POAI.ID_PLAN_OPERATIVO_ANUAL_INST = OP.PLAN_OPERATIVO_ANUAL_INST)
INNER JOIN  EPF.PROGRAMA_PRESUPUESTARIO     PP      ON(PP.ID_PROGRAMA_PRESUPUESTARIO = OP.PROGRAMA_PRESUPUESTARIO)
INNER JOIN  PPI.META_POAI_PRESUPUESTO       MPP     ON(MPP.META_POAI = MP.ID_META_POAI)
INNER JOIN  EPF.FONDO                       F       ON(F.ID_FONDO = MPP.FONDO)
INNER JOIN  EPF.CUENTA_PRESUPUESTARIA       CP      ON(CP.ID_CUENTA_PRESUPUESTARIA = MPP.CUENTA_PRESUPUESTARIA)
INNER JOIN  EPF.TIPO_PRESUPUESTO            TP      ON(TP.ID_TIPO_PRESUPUESTO = CP.TIPO_PRESUPUESTO)
ORDER BY 
PP.CODIGO,
PP.NOMBRE,
OP.CODIGO,
OP.DESCRIPCION,
MP.CODIGO,
MP.DESCRIPCION,
F.CODIGO,
F.NOMBRE,
CP.CODIGO,
CP.NOMBRE,
TP.NOMBRE;



/********************************************************/
/********************************************************/
/* CREACIÓN DE SINONIMO                                 */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM VISTA_POAI_META_FONDO_CODIGO_PRESUP FOR PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP;


/********************************************************/
/********************************************************/
/* GRANT'S                                              */
/********************************************************/
/********************************************************/
--GRANT TAB EPF TO PPI
GRANT SELECT, REFERENCES ON EPF.PROGRAMA_PRESUPUESTARIO     TO PPI WITH GRANT OPTION;
GRANT SELECT, REFERENCES ON EPF.FONDO                       TO PPI WITH GRANT OPTION;
GRANT SELECT, REFERENCES ON EPF.CUENTA_PRESUPUESTARIA       TO PPI WITH GRANT OPTION;
GRANT SELECT, REFERENCES ON EPF.TIPO_PRESUPUESTO            TO PPI WITH GRANT OPTION;

--GRANT WWW_SIGESA / ANALISTA / ANALISTA_SIGESA
GRANT SELECT, REFERENCES ON  PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP TO WWW_SIGESA;
GRANT SELECT, REFERENCES ON  PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP TO ANALISTA, ANALISTA_SIGESA;




/********************************************************/
/********************************************************/
/* CONSULTAR VISTA                                      */
/********************************************************/
/********************************************************/
SELECT * FROM VISTA_POAI_META_FONDO_CODIGO_PRESUP;

VistaPOAIMetaFondoCuentaPresupuestariaI18n.sql

  • Ahora debemos crear un script que inserte la internacionalizació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
 * 
 */

/********************************************************/
/********************************************************/
/* DOCUMENTACIÓN                                        */
/********************************************************/
/********************************************************/
/**
 * @author:  Gustavo Matamoros González
 * @since: 27/09/2023
 * @bug: PPI-432 
 * @funcion: Insertar internacionalización para VISTA_POAI_META_FONDO_CODIGO_PRESUP
 */

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioCodigo_header', 'Programa Presupuestario', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioNombre_header', 'Nombre Programa', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAICodigo_header', 'Código Objetivo', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAIDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAICodigo_header', 'Código Meta POAI', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAIDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_fondoCodigo_header', 'Fondo', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_fondoNombre_header', 'Nombre Fondo', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupCodigo_header', 'Cuenta Presupuestaria', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupNombre_header', 'Nombre Cuenta', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_tipoCuenta_header', 'Tipo de Cuenta', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoColones_header', 'Colones', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoMiles_header', 'Miles de Colones', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoRedondeo_header', 'Redondeo', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_list_form_title', 'Consulta Planes Operativos Institucionales', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_list_form_table_header', 'Consulta Planes Operativos Institucionales', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_list_form_table_title', 'Consulta Planes Operativos Institucionales', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_planOperativoAnualInstitucional_select_label', 'Seleccione un Plan Operativo Anual Institucional', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaPOAIMetaFondoCuentaPresupuestaria_planOperativoAnualInstitucional_LOV_title', 'Seleccione un Plan Operativo Anual Institucional', SQ_I18N.nextval);



DOMAIN JPA: VistaPOAIMetaFondoCuentaPresupuestaria.java

  • Ahora debemos crear el domain para acceder a los datos
/*
 * 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.ppo.domain;

/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;

import org.hibernate.annotations.Subselect;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Entity para la consulta de la vista {@link PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP}
 *
 * @author Gustavo Matamoros González´
 * @since 27/09/2023
 * @version 1.0.0 
 */

/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
@Entity
@Subselect("SELECT * FROM VISTA_POAI_META_FONDO_CODIGO_PRESUP")


/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/

public class VistaPOAIMetaFondoCuentaPresupuestaria implements Serializable {

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "PLAN_OPERATIVO_ANUAL_INST",
            referencedColumnName = "ID_PLAN_OPERATIVO_ANUAL_INST",
            nullable = false,
            insertable = false,
            updatable = false)
    private PlanOperativoAnualInstitucional planOperativoAnualInstitucional;

    @Id
    @Column(name = "ID")
    private int id;

    @Column(name = "CODIGO_PROGRAMA_PRESUPUESTARIO")
    private String codigoProgramaPresupuestario;

    @Column(name = "NOMBRE_PROGRAMA_PRESUPUESTARIO")
    private String nombreProgramaPresupuestario;

    @Column(name = "CODIGO_OBJETIVO_POAI")
    private String codigoObjetivoPOAI;

    @Column(name = "DESCRIPCION_OBJETIVO_POAI")
    private String descripcionObjetivoPOAI;

    @Column(name = "CODIGO_META_POAI")
    private String codigoMetaPOAI;

    @Column(name = "DESCRIPCION_META_POAI")
    private String descripcionMetaPOAI;

    @Column(name = "CODIGO_FONDO")
    private String codigoFondo;

    @Column(name = "NOMBRE_FONDO")
    private String nombreFondo;

    @Column(name = "CODIGO_CUENTA_PRESUPUESTARIA")
    private String codigoCuentaPresupuestaria;

    @Column(name = "NOMBRE_CUENTA_PRESUPUESTARIA")
    private String nombreCuentaPresupuestaria;

    @Column(name = "TIPO_PRESUPUESTO")
    private String tipoPresupuesto;

    @Column(name = "COLONES")
    private BigDecimal colones;

    @Column(name = "MILLONES_COLONES")
    private BigDecimal millonesColones;

    @Column(name = "REDONDEO")
    private BigDecimal redondeo;

    @Transient
    private String colonesConEspacios;
    
    @Transient
    private String millonesColonesConEspacios;

    @Transient
    private String redondeoConEspacios;
    
    public VistaPOAIMetaFondoCuentaPresupuestaria() {
    }

    public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {
        return planOperativoAnualInstitucional;
    }

    public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
        this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCodigoProgramaPresupuestario() {
        return codigoProgramaPresupuestario;
    }

    public void setCodigoProgramaPresupuestario(String codigoProgramaPresupuestario) {
        this.codigoProgramaPresupuestario = codigoProgramaPresupuestario;
    }

    public String getNombreProgramaPresupuestario() {
        return nombreProgramaPresupuestario;
    }

    public void setNombreProgramaPresupuestario(String nombreProgramaPresupuestario) {
        this.nombreProgramaPresupuestario = nombreProgramaPresupuestario;
    }

    public String getCodigoObjetivoPOAI() {
        return codigoObjetivoPOAI;
    }

    public void setCodigoObjetivoPOAI(String codigoObjetivoPOAI) {
        this.codigoObjetivoPOAI = codigoObjetivoPOAI;
    }

    public String getDescripcionObjetivoPOAI() {
        return descripcionObjetivoPOAI;
    }

    public void setDescripcionObjetivoPOAI(String descripcionObjetivoPOAI) {
        this.descripcionObjetivoPOAI = descripcionObjetivoPOAI;
    }

    public String getCodigoMetaPOAI() {
        return codigoMetaPOAI;
    }

    public void setCodigoMetaPOAI(String codigoMetaPOAI) {
        this.codigoMetaPOAI = codigoMetaPOAI;
    }

    public String getDescripcionMetaPOAI() {
        return descripcionMetaPOAI;
    }

    public void setDescripcionMetaPOAI(String descripcionMetaPOAI) {
        this.descripcionMetaPOAI = descripcionMetaPOAI;
    }

    public String getCodigoFondo() {
        return codigoFondo;
    }

    public void setCodigoFondo(String codigoFondo) {
        this.codigoFondo = codigoFondo;
    }

    public String getNombreFondo() {
        return nombreFondo;
    }

    public void setNombreFondo(String nombreFondo) {
        this.nombreFondo = nombreFondo;
    }

    public String getCodigoCuentaPresupuestaria() {
        return codigoCuentaPresupuestaria;
    }

    public void setCodigoCuentaPresupuestaria(String codigoCuentaPresupuestaria) {
        this.codigoCuentaPresupuestaria = codigoCuentaPresupuestaria;
    }

    public String getNombreCuentaPresupuestaria() {
        return nombreCuentaPresupuestaria;
    }

    public void setNombreCuentaPresupuestaria(String nombreCuentaPresupuestaria) {
        this.nombreCuentaPresupuestaria = nombreCuentaPresupuestaria;
    }

    public String getTipoPresupuesto() {
        return tipoPresupuesto;
    }

    public void setTipoPresupuesto(String tipoPresupuesto) {
        this.tipoPresupuesto = tipoPresupuesto;
    }

    public BigDecimal getColones() {
        return colones;
    }

    public void setColones(BigDecimal colones) {
        this.colones = colones;
    }

    public BigDecimal getMillonesColones() {
        return millonesColones;
    }

    public void setMillonesColones(BigDecimal millonesColones) {
        this.millonesColones = millonesColones;
    }

    public BigDecimal getRedondeo() {
        return redondeo;
    }

    public void setRedondeo(BigDecimal redondeo) {
        this.redondeo = redondeo;
    }

    private DecimalFormatSymbols getDecimalFormatSymbols() {
        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setDecimalSeparator(',');
        decimalFormatSymbols.setGroupingSeparator(' ');
        return decimalFormatSymbols;
    }

    public String getColonesConEspacios() {
        return "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(this.getColones());
    }

    public void setColonesConEspacios(String colonesConEspacios) {
        this.colonesConEspacios = colonesConEspacios;
    }

    public String getMillonesColonesConEspacios() {
        return "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(this.getMillonesColones());
    }

    public void setMillonesColonesConEspacios(String millonesColonesConEspacios) {
        this.millonesColonesConEspacios = millonesColonesConEspacios;
    }

    public String getRedondeoConEspacios() {
        return "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(this.getRedondeo());
    }

    public void setRedondeoConEspacios(String redondeoConEspacios) {
        this.redondeoConEspacios = redondeoConEspacios;
    }
 
}

VistaPOAIMetaFondoCuentaPresupuestariaRepository.java

  • Ahora creamos el Repository
/*
 * 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.ppo.repository;

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

import java.util.List;

import org.springframework.stereotype.Repository;

import cr.ac.una.cgi.sdkuna.generic.GenericRepository;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativoAnualInstitucional;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaPOAIMetaFondoCuentaPresupuestaria;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Repository para la administración de la vista {@link VistaPOAIMetaFondoCuentaPresupuestaria}
 *
 * @author Gustavo Matamoros González
 * @since: 28/09/2023
 * @Version: 1.0.0
 */

/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
@Repository
public interface VistaPOAIMetaFondoCuentaPresupuestariaRepository extends GenericRepository<VistaPOAIMetaFondoCuentaPresupuestaria> {

    public List<VistaPOAIMetaFondoCuentaPresupuestaria> findByPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);

}
  • NOTA: aquí podemos observa que estamos agregando la funcion findByPlanOperativoAnualInstitucional para avanzar con el filtro
public List<VistaPOAIMetaFondoCuentaPresupuestaria> findByPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);

Service: VistaPOAIMetaFondoCuentaPresupuestariaService.java

  • Creamos el service de la vista
/*
 * 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.ppo.service;


/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import cr.ac.una.cgi.sdkuna.api.service.EntityService;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativoAnualInstitucional;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaPOAIMetaFondoCuentaPresupuestaria;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Interface para la administración de la vista {@link VistaPOAIMetaFondoCuentaPresupuestaria}
 *
 * @author Gustavo Matamoros González
 * @since: 28/09/2023
 * @Version: 1.0.0.
 */

/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
public interface VistaPOAIMetaFondoCuentaPresupuestariaService extends EntityService<VistaPOAIMetaFondoCuentaPresupuestaria> {

    /**
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     * @return {@link PlanOperativoAnualInstitucional}
     */
    public PlanOperativoAnualInstitucional primerPOAIActivo();

    /**
     * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
     * @param query
     * @param filterSpecifications
     * @param pageable
     * @return {@link Page<PlanOperativoAnualInstitucional>}
     */
    public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable);

    /**
     * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
     * 
     * @param planOperativoAnualInstitucional
     * @return List<VistaPOAIMetaFondoCuentaPresupuestaria>
     */
    public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);

}

Notas

  • Estamos agregando un método que va obtener el primer POAI activo para que sea mostrado en el filtro como selecionado y sean los datos de este los que esten cargados al ingresar y así los resgistros no se muestren todos cada vez que ingresa el usuario
    /**
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     * @return {@link PlanOperativoAnualInstitucional}
     */
    public PlanOperativoAnualInstitucional primerPOAIActivo();
  • Creamos ademas un complete que obtenga todos los POAI que esten activos y los agrege al combobox
 /**
     * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
     * @param query
     * @param filterSpecifications
     * @param pageable
     * @return {@link Page<PlanOperativoAnualInstitucional>}
     */
    public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable);
  • Y finalmente estamos agregando un método que va realizar el el filtro de los datos de la vista según el parametro del POAI
 /**
     * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
     * 
     * @param planOperativoAnualInstitucional
     * @return List<VistaPOAIMetaFondoCuentaPresupuestaria>
     */
    public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);

VistaPOAIMetaFondoCuentaPresupuestariaServiceImpl.java

  • Agregamos
/*
 * 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.ppo.service;

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

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativoAnualInstitucional;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaPOAIMetaFondoCuentaPresupuestaria;
import cr.ac.una.cgi.sigesa.ppi.ppo.repository.VistaPOAIMetaFondoCuentaPresupuestariaRepository;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Clase que implementa el servicio {@link VistaPOAIMetaFondoCuentaPresupuestaria} 
 *
 * @author: Gustavo Matamoros González
 * @since: 28/09/2023
 * @version: 1.0.0
 */

/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
@Service
@Transactional
public class VistaPOAIMetaFondoCuentaPresupuestariaServiceImpl extends EntityServiceImpl<VistaPOAIMetaFondoCuentaPresupuestaria, VistaPOAIMetaFondoCuentaPresupuestariaRepository> implements VistaPOAIMetaFondoCuentaPresupuestariaService {

    /**********************************************************************/
    /****************        AUTOWIRED'S      *****************************/
    /**********************************************************************/
    @Autowired
    PlanOperativoAnualInstitucionalService planOperativoAnualInstitucionalService;

    /**********************************************************************/
    /****************         MÉTODOS         *****************************/
    /**********************************************************************/
    /**     
     * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#primerPOAIActivo()} 
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     */
    @Override
    public PlanOperativoAnualInstitucional primerPOAIActivo(){
        return planOperativoAnualInstitucionalService.primerPOAIActivo();
    }

    /**     
     * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#completePlanOperativoAnualInstitucional()} 
     * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
     */
    @Override
    public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable){
        return planOperativoAnualInstitucionalService.obtenerPOAISinAnulados(query, filterSpecifications, pageable);
    }

    /**
     * Ver
     * {@link VistaPOAIMetaFondoCuentaPresupuestariaService#getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional)}
     * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
     */
    @Override
    public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
        return repository.findByPlanOperativoAnualInstitucional(planOperativoAnualInstitucional);
    }

}

Notas

  • Ahora creamos ademas los métodos que utilizan el autowired de planOperativoAnualInstitucionalService y que obtiene el primerPOAIActivo y todos los POAI activos
/**     
     * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#primerPOAIActivo()} 
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     */
    @Override
    public PlanOperativoAnualInstitucional primerPOAIActivo(){
        return planOperativoAnualInstitucionalService.primerPOAIActivo();
    }

    /**     
     * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#completePlanOperativoAnualInstitucional()} 
     * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
     */
    @Override
    public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable){
        return planOperativoAnualInstitucionalService.obtenerPOAISinAnulados(query, filterSpecifications, pageable);
    }
  • Y el que utiliza el repository de la vista para filtrar los datos por POAI
/**
     * Ver
     * {@link VistaPOAIMetaFondoCuentaPresupuestariaService#getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional)}
     * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
     */
    @Override
    public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
        return repository.findByPlanOperativoAnualInstitucional(planOperativoAnualInstitucional);
    }

VistaPOAIMetaFondoCuentaPresupuestariaBean.java

  • Ahora debemos crear el Bean
/*
 * 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.ppo.view.model;


/**********************************************************************/
/*********************       IMPORT'S    ******************************/
/**********************************************************************/
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

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 cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import cr.ac.una.cgi.sdkuna.api.filter.LogicFunction;
import cr.ac.una.cgi.sdkuna.api.filter.Operator;
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.bco.service.MonedaService;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativoAnualInstitucional;
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaPOAIMetaFondoCuentaPresupuestaria;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.VistaPOAIMetaFondoCuentaPresupuestariaService;
import org.springframework.beans.factory.annotation.Autowired;

/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**
 * Spring Bean Session para la administración de la entidad {@link VistaPOAIMetaFondoCuentaPresupuestaria}
 *
 * @author Gustavo Matamoros González
 * @since 28/09/2023
 * @version: 1.0.0
 * @bug: PPI-432
 */


/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
@Component
@Scope("session")
public class VistaPOAIMetaFondoCuentaPresupuestariaBean extends CRUDImpl<VistaPOAIMetaFondoCuentaPresupuestaria, VistaPOAIMetaFondoCuentaPresupuestariaService> implements CRUD {
    
    /**********************************************************************/
    /****************        AUTOWIRED'S      *****************************/
    /**********************************************************************/
    @Autowired
    MonedaService monedaService;
    
    /**********************************************************************/
    /****************       VARIABLES         *****************************/
    /**********************************************************************/
    private PlanOperativoAnualInstitucional planOperativoAnualInstitucional;


    /**********************************************************************/
    /****************         MÉTODOS         *****************************/
    /**********************************************************************/
    @PostConstruct
    public void init() {
        List<CRUDColumn> columns = new ArrayList<>();

        CRUDColumn column1  = new CRUDColumn("codigoProgramaPresupuestario", getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioCodigo_header"),      true);
        CRUDColumn column2  = new CRUDColumn("nombreProgramaPresupuestario", getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioNombre_header"),      true);         
        CRUDColumn column3  = new CRUDColumn("codigoObjetivoPOAI",           getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAICodigo_header"),                true);         
        CRUDColumn column4  = new CRUDColumn("descripcionObjetivoPOAI",      getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAIDescripcion_header"),           true);
        CRUDColumn column5  = new CRUDColumn("codigoMetaPOAI",               getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAICodigo_header"),                    true);
        CRUDColumn column6  = new CRUDColumn("descripcionMetaPOAI",          getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAIDescripcion_header"),               true);
        CRUDColumn column7  = new CRUDColumn("codigoFondo",                  getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_fondoCodigo_header"),                       true);
        CRUDColumn column8  = new CRUDColumn("nombreFondo",                  getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_fondoNombre_header"),                       true);
        CRUDColumn column9  = new CRUDColumn("codigoCuentaPresupuestaria",   getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupCodigo_header"),                true);
        CRUDColumn column10 = new CRUDColumn("nombreCuentaPresupuestaria",   getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupNombre_header"),                true);
        CRUDColumn column11 = new CRUDColumn("tipoPresupuesto",              getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_tipoCuenta_header"),                        true);
        CRUDColumn column12 = new CRUDColumn("colones",                      getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoColones_header"),       true, "", true, "¤#,##0.00",    "currency", monedaService.getSimboloLocal());
        CRUDColumn column13 = new CRUDColumn("millonesColones",              getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoMiles_header"),         true, "", true, "¤#,##0.00",    "currency", monedaService.getSimboloLocal());
        CRUDColumn column14 = new CRUDColumn("redondeo",                     getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoRedondeo_header"),      true, "", true, "¤#,##0",       "currency", monedaService.getSimboloLocal());



        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);
        columns.add(column5);
        columns.add(column6);
        columns.add(column7);
        columns.add(column8);
        columns.add(column9);
        columns.add(column10);
        columns.add(column11);
        columns.add(column12);
        columns.add(column13);
        columns.add(column14);

        this.setTableColumns(columns);
    }

    public void initDetails() {
        if (!isPostBack()) {
            // cuando inicia cargamos el primero POAI Activo
            this.setPlanOperativoAnualInstitucional(service.primerPOAIActivo());
        }
    }
    
    public Page<PlanOperativoAnualInstitucional> completePlanOperativoAnualInstitucional(String query, Pageable pageable) {
        ArrayList<FilterSpecification> filterSpecifications = new ArrayList<FilterSpecification>();
        return this.service.completePOAISinAnulados(query, filterSpecifications, pageable);
    }

    public void handleClearPlanOperativoAnualInstitucional() {
        
    }

    public void handlePOAIItemSelectEvent() {
        
    }

    public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {
        return this.planOperativoAnualInstitucional;
    }

    public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {

        // Limpiamos la especificación
        removeSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression());

        // Si el POAI es diferente de null
        if (planOperativoAnualInstitucional != null) {

            // Agregamos la especificación
            addSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression(), planOperativoAnualInstitucional);
        }

        // Actualizamos la variable
        this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;

    }
   
    
}

Notas

  • Aquí en initDetails() estamos estableciendo que el primer POAI se va ser el primer POAI Activo
public void initDetails() {
        if (!isPostBack()) {
            this.setPlanOperativoAnualInstitucional(service.primerPOAIActivo());
        }
    }
  • Aquí estamos creando el metodo para manejar el complete del POAI
public Page<PlanOperativoAnualInstitucional> completePlanOperativoAnualInstitucional(String query, Pageable pageable) {
        ArrayList<FilterSpecification> filterSpecifications = new ArrayList<FilterSpecification>();
        return this.service.completePOAISinAnulados(query, filterSpecifications, pageable);
    }
  • Aquí cuando se limpia el filtro sin embargo actualmente no se utiliza para que siempre es necesario filtrar para que no traiga todos los datos de la vista
public void handleClearPlanOperativoAnualInstitucional() {
        
    }
  • Aquí actualizamos la variable POAI
public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {
        return this.planOperativoAnualInstitucional;
    }

    public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {

        // Limpiamos la especificación
        removeSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression());

        // Si el POAI es diferente de null
        if (planOperativoAnualInstitucional != null) {

            // Agregamos la especificación
            addSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression(), planOperativoAnualInstitucional);
        }

        // Actualizamos la variable
        this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;

    }

ListForm: vistaPOAIMetaFondoCuentaPresupuestariaListForm.xhtml

  • Le agregamos
<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:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:sdkuna="http://cgi.una.ac.cr/sdkuna"
    xmlns:una="http://una.ac.cr/ui/components"
    xmlns:pe="http://primefaces.org/ui/extensions"
    xmlns:components="http://java.sun.com/jsf/composite/components">

    <ui:define name="preRender">
        <f:event type="preRenderView" listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.list()}" />
        <!--f:event type="preRenderView" listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.initDetails()}"/-->
    </ui:define>

    <ui:define name="title">#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_list_form_title}</ui:define>

    <ui:define name="contentCRUD">
        <components:toolbar id="toolbar" 
                            editMode="false"
                            bean="#{vistaPOAIMetaFondoCuentaPresupuestariaBean}"
                            listForm="vistaPOAIMetaFondoCuentaPresupuestariaListForm"
                            editForm="vistaPOAIMetaFondoCuentaPresupuestariaEditForm"
                            backForm="vistaPOAIMetaFondoCuentaPresupuestariaListForm"
                            container="noEditTable:dataTable"
                            header="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_list_form_table_title}"
                            showNewButton="false"       
                            showSaveButton="false"
                            showDeleteButton="false"
                            showCopyButton="false"
                            showBackButton="false"/>


        <components:noEditTable id="noEditTable"
                                i18nKey="VistaPOAIMetaFondoCuentaPresupuestaria_list_form_table_title"
                                header="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_list_form_table_title}"
                                bean="#{vistaPOAIMetaFondoCuentaPresupuestariaBean}"
                                editForm="vistaPOAIMetaFondoCuentaPresupuestariaEditForm"
                                showEditButton="false"
                                showViewButton="false"
                                showDeleteButton="false"
                                responsive="true"/>
    </ui:define>
</ui:composition>

Registramos el recurso en SIGESA en Desarrollo y Producción PENDIENTE: PRODUCCIÖN

Lista de Recursos
  • Datos
Nombre: /pages/vistaPOAIMetaFondoCuentaPresupuestariaListForm.xhtml
Tipo de recurso: Página
Visible: true
Secuencia: 1
Notas: PPI-PPO-POAI: Vista de POAI que presenta las metas con Fondo y Cuenta Presupuestaria
Estado: Activo
  • Le asignamos los roles de:
    • UNA_PPI_PPO_ANALISTA
    • UNA_PPI_PPO_CONSULTA
    • UNA_PPI_PPO_ADMIN

Creamos el menú

  • Buscamos
Lista de Menú
  • Datos:
Tipo de Menú: Crear menú de un menú padre
Menú: PPO - Consultas
Recurso: /pages/vistaPOAIMetaFondoCuentaPresupuestariaListForm.xhtml
Nombre: Consulta POAI: Fondos y Cuentas Presupuestarias por Metas POAI  
Notas: PPI-PPO-POAI: Vista de POAI que presenta las metas con Fondo y Cuenta Presupuestaria
Estado: Activo
Secuencia: 1

Vista visible

  • Y con esto ya tendremos la vista funcionando

Agregar filtro

  • Primero lo que se debe entender es que el bean y servicio de POAI ya contiene las funciones necesarias para crear un autocomplete y LOV por tanto lo mas sencillo es utilizarlo

1.Cargar el Primer POAI Activo

  • SERVICE: Para esto el el service tenemos
/**
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     * @return {@link PlanOperativoAnualInstitucional}
     */
    public PlanOperativoAnualInstitucional primerPOAIActivo();
  • IMPLEMENT: tenemos
/**     
     * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#primerPOAIActivo()} 
     * Retorna el primer Plan Operativo Anual Institucional que se encuentre guardado en estado Activo.
     */
    @Override
    public PlanOperativoAnualInstitucional primerPOAIActivo(){
        return planOperativoAnualInstitucionalService.primerPOAIActivo();
    }
  • BEAN: tenemos
public void initDetails() {
        if (!isPostBack()) {
            // cuando inicia cargamos el primero POAI Activo
            this.setPlanOperativoAnualInstitucional(service.primerPOAIActivo());
        }
    }
  • XHTML:
  • Debemos agrega la siguiente instrucción que invoca a la función initDetails para que cargue el primer POAI Activo
<f:event type="preRenderView" listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.initDetails()}"/>
  • Quedando así:
<ui:define name="preRender">
        <f:event type="preRenderView" listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.list()}" />
        <f:event type="preRenderView" listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.initDetails()}"/>
    </ui:define>

    2: Crear Autocomplete

    • SERVICE: tenemos
    /**
         * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
         * @param query
         * @param filterSpecifications
         * @param pageable
         * @return {@link Page<PlanOperativoAnualInstitucional>}
         */
        public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable);
    • IMPLEMENT: tenemos
    /**     
         * Ver {@link VistaPOAIMetaFondoCuentaPresupuestariaService#completePlanOperativoAnualInstitucional()} 
         * Retorna los Planes Operativos Anuales Institucionales que no esten en Estado Anulado.
         */
        @Override
        public Page<PlanOperativoAnualInstitucional> completePOAISinAnulados(String query, ArrayList<FilterSpecification> filterSpecifications, Pageable pageable){
            return planOperativoAnualInstitucionalService.obtenerPOAISinAnulados(query, filterSpecifications, pageable);
        }
    • BEAN: tenemos la funcion que relaciona la pagina con el bean y servicio
    public Page<PlanOperativoAnualInstitucional> completePlanOperativoAnualInstitucional(String query, Pageable pageable) {
            ArrayList<FilterSpecification> filterSpecifications = new ArrayList<FilterSpecification>();
            return this.service.completePOAISinAnulados(query, filterSpecifications, pageable);
        }
    • XHTML: debemos agregar
    • Primero un panelgrid de 2 columnas
    <p:panelGrid columns="2" styleClass="una-panelgrid">
    </p:panelGrid>
    • Ahora debemos agregar dentro del panelGrid el componente de autocomplete
    <una:autoCompletePaginator id="planOperativoAnualInstitucionalAutocomplete"
                                               paginator="true"
                                               paginationRows="10"
                                               dropdown="true"
                                               value="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
                                               var="planOperativoAnualInstitucional"
                                               styleClass="una-autocomplete-lov"
                                               itemLabel="#{planOperativoAnualInstitucional.codigo}"
                                               itemValue="#{planOperativoAnualInstitucional}"
                                               completeMethod="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.completePlanOperativoAnualInstitucional}"
                                               converter="#{planOperativoAnualInstitucionalBean.converter}"
                                               forceSelection="true"
                                               noSelectedOption="true"
                                               noSelectedLabel="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_planOperativoAnualInstitucional_select_label}"
                                               onNoSelectedOption="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handleClearPlanOperativoAnualInstitucional()}"
                                               size="60"
                                               scrollHeight="200"
                                               required="true">
                        <p:ajax event="itemSelect"
                                listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handlePOAIItemSelectEvent()}"
                                process="@this"
                                update="noEditTable:dataTable" />
                    </una:autoCompletePaginator>

      NOTAS:

      • Aquí relacionamos al varable del bean
      value="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
      • Aqui indicamos por que filtrar
      itemLabel="#{planOperativoAnualInstitucional.codigo}"
                                                 itemValue="#{planOperativoAnualInstitucional}"
      • Que metodo utilizar y como debe comportarse
      completeMethod="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.completePlanOperativoAnualInstitucional}"
                                                 converter="#{planOperativoAnualInstitucionalBean.converter}"
      • Cuando se selecciona «Selecicone una POAI»
      onNoSelectedOption="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handleClearPlanOperativoAnualInstitucional()}"
      • Y aquí que debemos hacer cuando el usuario seleccione una opción, en este caso actualizarse a si mismo y atualizar la vista noEditTable:dataTable
      <p:ajax event="itemSelect"
                                  listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handlePOAIItemSelectEvent()}"
                                  process="@this"
                                  update="noEditTable:dataTable" />

        3. Crear LOV

        • Para este caso le vamos a indicar que utilice directamente el Bean de POAI
        • XHTML dentro del panelGrid despues del autocomplete vamos a agregar
        <components:dialogFrameworkData lOVBean="#{planOperativoAnualInstitucionalLOVBean}"
                                                        target="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
                                                        id="planOperativoAnualInstitucionalListDialog"
                                                        title="#{i18n.vistaFUCCMetaPOAI_planOperativoAnualInstitucional_LOV_title}"
                                                        methodName="planOperativoAnualInstitucionalSinAnuladosLOV"/>

        NOTAS:

        • Este indica cual bean utilizar
        lOVBean="#{planOperativoAnualInstitucionalLOVBean}"
        • Que objeto de nuestro bean va a utilizar
        target="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
        • Y que metodo el POAIBean va a utilizar
        methodName="planOperativoAnualInstitucionalSinAnuladosLOV"/>

        Continuamos

        • Le agregamos el mesage
        <p:message id="planOperativoAnualInstitucionalAutoCompleteMessage"
                                   for="planOperativoAnualInstitucionalAutocomplete" />
        • Finalmente queda así
        <p:panelGrid columns="2" styleClass="una-panelgrid">
                    <p:outputLabel id="planOperativoAnualInstitucionalOutputLabel" 
                                    for="planOperativoAnualInstitucionalAutocomplete"  
                                    value="#{i18n.vistaFUCCMetaPOAI_planOperativoAnualInstitucional_label}" />
        
                    <p:outputPanel id="planOperativoAnualInstitucionalOutputPanel">
                        <una:autoCompletePaginator id="planOperativoAnualInstitucionalAutocomplete"
                                                   paginator="true"
                                                   paginationRows="10"
                                                   dropdown="true"
                                                   value="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
                                                   var="planOperativoAnualInstitucional"
                                                   styleClass="una-autocomplete-lov"
                                                   itemLabel="#{planOperativoAnualInstitucional.codigo}"
                                                   itemValue="#{planOperativoAnualInstitucional}"
                                                   completeMethod="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.completePlanOperativoAnualInstitucional}"
                                                   converter="#{planOperativoAnualInstitucionalBean.converter}"
                                                   forceSelection="true"
                                                   noSelectedOption="true"
                                                   noSelectedLabel="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_planOperativoAnualInstitucional_select_label}"
                                                   onNoSelectedOption="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handleClearPlanOperativoAnualInstitucional()}"
                                                   size="60"
                                                   scrollHeight="200"
                                                   required="true">
                            <p:ajax event="itemSelect"
                                    listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handlePOAIItemSelectEvent()}"
                                    process="@this"
                                    update="noEditTable:dataTable" />
                        </una:autoCompletePaginator>
        
                        <components:dialogFrameworkData lOVBean="#{planOperativoAnualInstitucionalLOVBean}"
                                                        target="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
                                                        id="planOperativoAnualInstitucionalListDialog"
                                                        title="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_planOperativoAnualInstitucional_LOV_title}"
                                                        methodName="planOperativoAnualInstitucionalSinAnuladosLOV"/>
        
                        <p:message id="planOperativoAnualInstitucionalAutoCompleteMessage"
                                   for="planOperativoAnualInstitucionalAutocomplete" />
                    </p:outputPanel>
                </p:panelGrid>

          4. filtrar vista

          • Primero debemos recordar que en el autocomplete tenemos
          value="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.planOperativoAnualInstitucional}"
          • Que va a relacionar el autocomplete con la variable del Bean planOperativoAnualInstitucional
          • Y esto hacer que cuando se seleccione un dato se aplique el set de la variable en este caso
          public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
          
                  // Limpiamos la especificación
                  removeSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression());
          
                  // Si el POAI es diferente de null
                  if (planOperativoAnualInstitucional != null) {
          
                      // Agregamos la especificación
                      addSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression(), planOperativoAnualInstitucional);
                  }
          
                  // Actualizamos la variable
                  this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;
          
              }
          • Que que cuando se procese actualialice la vista
          <p:ajax event="itemSelect"
                                      listener="#{vistaPOAIMetaFondoCuentaPresupuestariaBean.handlePOAIItemSelectEvent()}"
                                      process="@this"
                                      update="noEditTable:dataTable" />
          • aquí
          update="noEditTable:dataTable"
            • Podemo probar como funciona el autocomplete y LOV

            Tabla de Totales

            • Ahora vamos a crear la tabla que muestra los totales por POAI

            Domain: VistaPOAIMetaFondoCuentaPresupuestaria.java

            • Agregamos los trasient para almacenar los nombres de los programas
            @Transient
                private String programaAcademico;
            
                @Transient
                private String programaVidaUniversitaria;
                
                @Transient
                private String programaAdministrativo;
                
                @Transient
                private String  programaTotal; 
            • Y otros para almacenar los texto de colones Millones y redondeo
            @Transient
                private String textoColones;
                
                @Transient
                private String textoMillones;
                
                @Transient
                private String  textoRedondeo; 

            • Y los respectivos get y set’s
            public String getProgramaAcademico() {
                    return programaAcademico;
                }
            
                public void setProgramaAcademico(String programaAcademico, boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaAcademico = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAcademico));
                        
                    }else{
                        this.programaAcademico = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAcademico));
                        
                    }
                }
            
                public String getProgramaVidaUniversitaria() {
                    return programaVidaUniversitaria;
                }
            
                public void setProgramaVidaUniversitaria(String programaVidaUniversitaria,boolean isRedondeo) {
                    if(isRedondeo){
                    this.programaVidaUniversitaria = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaVidaUniversitaria));
                    }else{
                    this.programaVidaUniversitaria = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaVidaUniversitaria))  ;
                    }
                }
            
                public String getProgramaAdministrativo() {
                    return programaAdministrativo;
                }
            
                public void setProgramaAdministrativo(String programaAdministrativo,boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaAdministrativo = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAdministrativo));
                    }else{
                    this.programaAdministrativo = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAdministrativo))    ;
                    }
                }
            
                public String getProgramaTotal() {
                    return programaTotal;
                }
            
                public void setProgramaTotal(String programaTotal,boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaTotal = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaTotal));
                    }else{
                        this.programaTotal = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaTotal));
                    }
                }
            
            public String getTextoColones() {
                    return textoColones;
                }
            
                public void setTextoColones(String textoColones) {
                    this.textoColones = textoColones;
                }
            
                public String getTextoMillones() {
                    return textoMillones;
                }
            
                public void setTextoMillones(String textoMillones) {
                    this.textoMillones = textoMillones;
                }
            
                public String getTextoRedondeo() {
                    return textoRedondeo;
                }
            
                public void setTextoRedondeo(String textoRedondeo) {
                    this.textoRedondeo = textoRedondeo;
                }
            • RESULTADO
            /*
             * 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.ppo.domain;
            
            /**********************************************************************/
            /*********************       IMPORT'S    ******************************/
            /**********************************************************************/
            import java.io.Serializable;
            import java.math.BigDecimal;
            import java.text.DecimalFormat;
            import java.text.DecimalFormatSymbols;
            
            import javax.persistence.Column;
            import javax.persistence.Entity;
            import javax.persistence.FetchType;
            import javax.persistence.Id;
            import javax.persistence.JoinColumn;
            import javax.persistence.ManyToOne;
            import javax.persistence.Transient;
            
            import org.hibernate.annotations.Subselect;
            
            /**********************************************************************/
            /*********************    DOCUMENTACIÓN  ******************************/
            /**********************************************************************/
            /**
             * Entity para la consulta de la vista {@link PPI.VISTA_POAI_META_FONDO_CODIGO_PRESUP}
             *
             * @author Gustavo Matamoros González´
             * @since 27/09/2023
             * @version 1.0.0 
             */
            
            /**********************************************************************/
            /*********************    CONFIGURACIÓN  ******************************/
            /**********************************************************************/
            @Entity
            @Subselect("SELECT * FROM VISTA_POAI_META_FONDO_CODIGO_PRESUP")
            
            
            /**********************************************************************/
            /****************    DEFINICIÓN DE CLASE  *****************************/
            /**********************************************************************/
            
            public class VistaPOAIMetaFondoCuentaPresupuestaria implements Serializable {
            
                @ManyToOne(fetch = FetchType.LAZY, optional = false)
                @JoinColumn(name = "PLAN_OPERATIVO_ANUAL_INST",
                        referencedColumnName = "ID_PLAN_OPERATIVO_ANUAL_INST",
                        nullable = false,
                        insertable = false,
                        updatable = false)
                private PlanOperativoAnualInstitucional planOperativoAnualInstitucional;
            
                @Id
                @Column(name = "ID")
                private int id;
            
                @Column(name = "CODIGO_PROGRAMA_PRESUPUESTARIO")
                private String codigoProgramaPresupuestario;
            
                @Column(name = "NOMBRE_PROGRAMA_PRESUPUESTARIO")
                private String nombreProgramaPresupuestario;
            
                @Column(name = "CODIGO_OBJETIVO_POAI")
                private String codigoObjetivoPOAI;
            
                @Column(name = "DESCRIPCION_OBJETIVO_POAI")
                private String descripcionObjetivoPOAI;
            
                @Column(name = "CODIGO_META_POAI")
                private String codigoMetaPOAI;
            
                @Column(name = "DESCRIPCION_META_POAI")
                private String descripcionMetaPOAI;
            
                @Column(name = "CODIGO_FONDO")
                private String codigoFondo;
            
                @Column(name = "NOMBRE_FONDO")
                private String nombreFondo;
            
                @Column(name = "CODIGO_CUENTA_PRESUPUESTARIA")
                private String codigoCuentaPresupuestaria;
            
                @Column(name = "NOMBRE_CUENTA_PRESUPUESTARIA")
                private String nombreCuentaPresupuestaria;
            
                @Column(name = "TIPO_PRESUPUESTO")
                private String tipoPresupuesto;
            
                @Column(name = "COLONES")
                private BigDecimal colones;
            
                @Column(name = "MILLONES_COLONES")
                private BigDecimal millonesColones;
            
                @Column(name = "REDONDEO")
                private BigDecimal redondeo;
            
                @Transient
                private String colonesConEspacios;
                
                @Transient
                private String millonesColonesConEspacios;
            
                @Transient
                private String redondeoConEspacios;
            
                @Transient
                private String programaAcademico;
            
                @Transient
                private String programaVidaUniversitaria;
                
                @Transient
                private String programaAdministrativo;
                
                @Transient
                private String  programaTotal; 
            
            
                @Transient
                private String textoColones;
                
                @Transient
                private String textoMillones;
                
                @Transient
                private String  textoRedondeo; 
            
            
                
                public VistaPOAIMetaFondoCuentaPresupuestaria() {
                }
            
                public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {
                    return planOperativoAnualInstitucional;
                }
            
                public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
                    this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;
                }
            
                public int getId() {
                    return id;
                }
            
                public void setId(int id) {
                    this.id = id;
                }
            
                public String getCodigoProgramaPresupuestario() {
                    return codigoProgramaPresupuestario;
                }
            
                public void setCodigoProgramaPresupuestario(String codigoProgramaPresupuestario) {
                    this.codigoProgramaPresupuestario = codigoProgramaPresupuestario;
                }
            
                public String getNombreProgramaPresupuestario() {
                    return nombreProgramaPresupuestario;
                }
            
                public void setNombreProgramaPresupuestario(String nombreProgramaPresupuestario) {
                    this.nombreProgramaPresupuestario = nombreProgramaPresupuestario;
                }
            
                public String getCodigoObjetivoPOAI() {
                    return codigoObjetivoPOAI;
                }
            
                public void setCodigoObjetivoPOAI(String codigoObjetivoPOAI) {
                    this.codigoObjetivoPOAI = codigoObjetivoPOAI;
                }
            
                public String getDescripcionObjetivoPOAI() {
                    return descripcionObjetivoPOAI;
                }
            
                public void setDescripcionObjetivoPOAI(String descripcionObjetivoPOAI) {
                    this.descripcionObjetivoPOAI = descripcionObjetivoPOAI;
                }
            
                public String getCodigoMetaPOAI() {
                    return codigoMetaPOAI;
                }
            
                public void setCodigoMetaPOAI(String codigoMetaPOAI) {
                    this.codigoMetaPOAI = codigoMetaPOAI;
                }
            
                public String getDescripcionMetaPOAI() {
                    return descripcionMetaPOAI;
                }
            
                public void setDescripcionMetaPOAI(String descripcionMetaPOAI) {
                    this.descripcionMetaPOAI = descripcionMetaPOAI;
                }
            
                public String getCodigoFondo() {
                    return codigoFondo;
                }
            
                public void setCodigoFondo(String codigoFondo) {
                    this.codigoFondo = codigoFondo;
                }
            
                public String getNombreFondo() {
                    return nombreFondo;
                }
            
                public void setNombreFondo(String nombreFondo) {
                    this.nombreFondo = nombreFondo;
                }
            
                public String getCodigoCuentaPresupuestaria() {
                    return codigoCuentaPresupuestaria;
                }
            
                public void setCodigoCuentaPresupuestaria(String codigoCuentaPresupuestaria) {
                    this.codigoCuentaPresupuestaria = codigoCuentaPresupuestaria;
                }
            
                public String getNombreCuentaPresupuestaria() {
                    return nombreCuentaPresupuestaria;
                }
            
                public void setNombreCuentaPresupuestaria(String nombreCuentaPresupuestaria) {
                    this.nombreCuentaPresupuestaria = nombreCuentaPresupuestaria;
                }
            
                public String getTipoPresupuesto() {
                    return tipoPresupuesto;
                }
            
                public void setTipoPresupuesto(String tipoPresupuesto) {
                    this.tipoPresupuesto = tipoPresupuesto;
                }
            
                public BigDecimal getColones() {
                    return colones;
                }
            
                public void setColones(BigDecimal colones) {
                    this.colones = colones;
                }
            
                public BigDecimal getMillonesColones() {
                    return millonesColones;
                }
            
                public void setMillonesColones(BigDecimal millonesColones) {
                    this.millonesColones = millonesColones;
                }
            
                public BigDecimal getRedondeo() {
                    return redondeo;
                }
            
                public void setRedondeo(BigDecimal redondeo) {
                    this.redondeo = redondeo;
                }
            
                private DecimalFormatSymbols getDecimalFormatSymbols() {
                    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
                    decimalFormatSymbols.setDecimalSeparator(',');
                    decimalFormatSymbols.setGroupingSeparator(' ');
                    return decimalFormatSymbols;
                }
            
                public String getColonesConEspacios() {
                    return "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(this.getColones());
                }
            
                public void setColonesConEspacios(String colonesConEspacios) {
                    this.colonesConEspacios = colonesConEspacios;
                }
            
                public String getMillonesColonesConEspacios() {
                    return "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(this.getMillonesColones());
                }
            
                public void setMillonesColonesConEspacios(String millonesColonesConEspacios) {
                    this.millonesColonesConEspacios = millonesColonesConEspacios;
                }
            
                public String getRedondeoConEspacios() {
                    return "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(this.getRedondeo());
                }
            
                public void setRedondeoConEspacios(String redondeoConEspacios) {
                    this.redondeoConEspacios = redondeoConEspacios;
                }
            
            
                public String getProgramaAcademico() {
                    return programaAcademico;
                }
            
                public void setProgramaAcademico(String programaAcademico, boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaAcademico = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAcademico));
                        
                    }else{
                        this.programaAcademico = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAcademico));
                        
                    }
                }
            
                public String getProgramaVidaUniversitaria() {
                    return programaVidaUniversitaria;
                }
            
                public void setProgramaVidaUniversitaria(String programaVidaUniversitaria,boolean isRedondeo) {
                    if(isRedondeo){
                    this.programaVidaUniversitaria = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaVidaUniversitaria));
                    }else{
                    this.programaVidaUniversitaria = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaVidaUniversitaria))  ;
                    }
                }
            
                public String getProgramaAdministrativo() {
                    return programaAdministrativo;
                }
            
                public void setProgramaAdministrativo(String programaAdministrativo,boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaAdministrativo = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAdministrativo));
                    }else{
                    this.programaAdministrativo = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaAdministrativo))    ;
                    }
                }
            
                public String getProgramaTotal() {
                    return programaTotal;
                }
            
                public void setProgramaTotal(String programaTotal,boolean isRedondeo) {
                    if(isRedondeo){
                        this.programaTotal = "₡" + new DecimalFormat("#,##0", this.getDecimalFormatSymbols()).format(new BigDecimal(programaTotal));
                    }else{
                        this.programaTotal = "₡" + new DecimalFormat("#,##0.00", this.getDecimalFormatSymbols()).format(new BigDecimal(programaTotal));
                    }
                }
            
                public String getTextoColones() {
                    return textoColones;
                }
            
                public void setTextoColones(String textoColones) {
                    this.textoColones = textoColones;
                }
            
                public String getTextoMillones() {
                    return textoMillones;
                }
            
                public void setTextoMillones(String textoMillones) {
                    this.textoMillones = textoMillones;
                }
            
                public String getTextoRedondeo() {
                    return textoRedondeo;
                }
            
                public void setTextoRedondeo(String textoRedondeo) {
                    this.textoRedondeo = textoRedondeo;
                }
             
            }

            VistaPOAIMetaFondoCuentaPresupuestariaRepository.java

            • Ahora en el repository tenemos la función que revise el POAI y obtiene sus datos
            public List<VistaPOAIMetaFondoCuentaPresupuestaria> findByPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);

            VistaPOAIMetaFondoCuentaPresupuestariaService.java

            • Tenemos la definición del metdo que utiliza el repository para obtener los datos del plan
            /**
                 * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
                 * 
                 * @param planOperativoAnualInstitucional
                 * @return List<VistaPOAIMetaFondoCuentaPresupuestaria>
                 */
                public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional);
            
            • Agregamos
             /**
                 * Retorna una lista de valores tipo BigDecimal con el cálculo de los valores para los totales 
                 * de los Programas Académico, Vida Universitaria y Administrativo.
                 * @param listaVistaPOAIMetaFondoCuentaPresupuestaria
                 * @return List<BigDecimal>
                 */
                public List<BigDecimal> calcularTotales(List<VistaPOAIMetaFondoCuentaPresupuestaria> listaVistaPOAIMetaFondoCuentaPresupuestaria);

            VistaPOAIMetaFondoCuentaPresupuestariaServiceImpl.java

            • Tenemos la implementación del metodo
            /**
                 * Ver
                 * {@link VistaPOAIMetaFondoCuentaPresupuestariaService#getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional)}
                 * Retorna una lista de elementos VistaPOAIMetaFondoCuentaPresupuestaria obtenida por la busqueda con PlanOperativoAnualInstitucional por parámetro.
                 */
                @Override
                public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
                    return repository.findByPlanOperativoAnualInstitucional(planOperativoAnualInstitucional);
                }
            • Agregamos la implementación del metodo que realiza el calculo
            /**     
                 * Ver {@link VistaPOAIMetaFondoCuentaPresupuestaria#calcularTotales(List<VistaPOAIMetaFondoCuentaPresupuestaria> listaVistaPOAIMetaFondoCuentaPresupuestaria)} 
                 */
                @Override
                public List<BigDecimal> calcularTotales(List<VistaPOAIMetaFondoCuentaPresupuestaria> listaVistaPOAIMetaFondoCuentaPresupuestaria){
                    BigDecimal acadColones = BigDecimal.ZERO;
                    BigDecimal acadMillonesColones = BigDecimal.ZERO;
                    BigDecimal acadRedondeo = BigDecimal.ZERO;
                    BigDecimal viduColones = BigDecimal.ZERO;
                    BigDecimal viduMillonesColones = BigDecimal.ZERO;
                    BigDecimal viduRedondeo = BigDecimal.ZERO;
                    BigDecimal admColones = BigDecimal.ZERO;
                    BigDecimal admMillonesColones = BigDecimal.ZERO;
                    BigDecimal admRedondeo = BigDecimal.ZERO;
                    BigDecimal totalColones = BigDecimal.ZERO;
                    BigDecimal totalMillonesColones = BigDecimal.ZERO;
                    BigDecimal totalRedondeo = BigDecimal.ZERO;
            
                    List<BigDecimal> totales = new ArrayList<BigDecimal>();
                    for (VistaPOAIMetaFondoCuentaPresupuestaria detalle : listaVistaPOAIMetaFondoCuentaPresupuestaria) {
                        if (detalle.getCodigoProgramaPresupuestario().equals("ACAD")){
                            acadColones = acadColones.add(detalle.getColones());
                            acadMillonesColones = acadMillonesColones.add(detalle.getMillonesColones());
                            acadRedondeo = acadRedondeo.add(detalle.getRedondeo());
                        }
                        if (detalle.getCodigoProgramaPresupuestario().equals("VID_U")){
                            viduColones = viduColones.add(detalle.getColones());
                            viduMillonesColones = viduMillonesColones.add(detalle.getMillonesColones());
                            viduRedondeo = viduRedondeo.add(detalle.getRedondeo());
                        }
                        if (detalle.getCodigoProgramaPresupuestario().equals("ADM")){
                            admColones = admColones.add(detalle.getColones());
                            admMillonesColones = admMillonesColones.add(detalle.getMillonesColones());
                            admRedondeo = admRedondeo.add(detalle.getRedondeo());
                        }
                    }
                    totalColones = totalColones.add(acadColones).add(viduColones).add(admColones);
                    totalMillonesColones = totalMillonesColones.add(acadMillonesColones).add(viduMillonesColones).add(admMillonesColones);
                    totalRedondeo = totalRedondeo.add(acadRedondeo).add(viduRedondeo).add(admRedondeo);
            
                    totales.add(acadColones);
                    totales.add(acadMillonesColones);
                    totales.add(acadRedondeo);
                    totales.add(viduColones);
                    totales.add(viduMillonesColones);
                    totales.add(viduRedondeo);
                    totales.add(admColones);
                    totales.add(admMillonesColones);
                    totales.add(admRedondeo);
                    totales.add(totalColones);
                    totales.add(totalMillonesColones);
                    totales.add(totalRedondeo);
            
                    return totales;
                }

            VistaPOAIMetaFondoCuentaPresupuestariaBean.java

            • Agregamos las variables necesarias
            private BigDecimal colonesProgramaAcademico, colonesProgramaVidaUniversitaria, colonesProgramaAdministrativo, totalColones, millonesColonesProgramaAcademico, millonesColonesProgramaVidaUniversitaria, millonesColonesProgramaAdministrativo, totalMillonesColones, redondeoProgramaAcademico, redondeoProgramaVidaUniversitaria, redondeoProgramaAdministrativo, totalRedondeo;
            
            List<VistaPOAIMetaFondoCuentaPresupuestaria> listaTotales = new ArrayList();
            • Y los respectivos get y set’s
            public BigDecimal getColonesProgramaAcademico() {
                    return colonesProgramaAcademico;
                }
            
                public void setColonesProgramaAcademico(BigDecimal colonesProgramaAcademico) {
                    this.colonesProgramaAcademico = colonesProgramaAcademico;
                }
            
                public BigDecimal getColonesProgramaVidaUniversitaria() {
                    return colonesProgramaVidaUniversitaria;
                }
            
                public void setColonesProgramaVidaUniversitaria(BigDecimal colonesProgramaVidaUniversitaria) {
                    this.colonesProgramaVidaUniversitaria = colonesProgramaVidaUniversitaria;
                }
            
                public BigDecimal getColonesProgramaAdministrativo() {
                    return colonesProgramaAdministrativo;
                }
            
                public void setColonesProgramaAdministrativo(BigDecimal colonesProgramaAdministrativo) {
                    this.colonesProgramaAdministrativo = colonesProgramaAdministrativo;
                }
            
                public BigDecimal getTotalColones() {
                    return totalColones;
                }
            
                public void setTotalColones(BigDecimal totalColones) {
                    this.totalColones = totalColones;
                }
            
                public BigDecimal getMillonesColonesProgramaAcademico() {
                    return millonesColonesProgramaAcademico;
                }
            
                public void setMillonesColonesProgramaAcademico(BigDecimal millonesColonesProgramaAcademico) {
                    this.millonesColonesProgramaAcademico = millonesColonesProgramaAcademico;
                }
            
                public BigDecimal getMillonesColonesProgramaVidaUniversitaria() {
                    return millonesColonesProgramaVidaUniversitaria;
                }
            
                public void setMillonesColonesProgramaVidaUniversitaria(BigDecimal millonesColonesProgramaVidaUniversitaria) {
                    this.millonesColonesProgramaVidaUniversitaria = millonesColonesProgramaVidaUniversitaria;
                }
            
                public BigDecimal getMillonesColonesProgramaAdministrativo() {
                    return millonesColonesProgramaAdministrativo;
                }
            
                public void setMillonesColonesProgramaAdministrativo(BigDecimal millonesColonesProgramaAdministrativo) {
                    this.millonesColonesProgramaAdministrativo = millonesColonesProgramaAdministrativo;
                }
            
                public BigDecimal getTotalMillonesColones() {
                    return totalMillonesColones;
                }
            
                public void setTotalMillonesColones(BigDecimal totalMillonesColones) {
                    this.totalMillonesColones = totalMillonesColones;
                }
            
                public BigDecimal getRedondeoProgramaAcademico() {
                    return redondeoProgramaAcademico;
                }
            
                public void setRedondeoProgramaAcademico(BigDecimal redondeoProgramaAcademico) {
                    this.redondeoProgramaAcademico = redondeoProgramaAcademico;
                }
            
                public BigDecimal getRedondeoProgramaVidaUniversitaria() {
                    return redondeoProgramaVidaUniversitaria;
                }
            
                public void setRedondeoProgramaVidaUniversitaria(BigDecimal redondeoProgramaVidaUniversitaria) {
                    this.redondeoProgramaVidaUniversitaria = redondeoProgramaVidaUniversitaria;
                }
            
                public BigDecimal getRedondeoProgramaAdministrativo() {
                    return redondeoProgramaAdministrativo;
                }
            
                public void setRedondeoProgramaAdministrativo(BigDecimal redondeoProgramaAdministrativo) {
                    this.redondeoProgramaAdministrativo = redondeoProgramaAdministrativo;
                }
            
                public BigDecimal getTotalRedondeo() {
                    return totalRedondeo;
                }
            
                public void setTotalRedondeo(BigDecimal totalRedondeo) {
                    this.totalRedondeo = totalRedondeo;
                }
            
                public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaTotales() {
                    return listaTotales;
                }
            
                public void setListaTotales(List<VistaPOAIMetaFondoCuentaPresupuestaria> listaTotales) {
                    this.listaTotales = listaTotales;
                }
            • Y la función que se encarga de realizar los calculos
            private void calcularTotales() {
                    List<VistaPOAIMetaFondoCuentaPresupuestaria> listaConTotales = new ArrayList();
                    List<VistaPOAIMetaFondoCuentaPresupuestaria> listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional = service.getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(this.planOperativoAnualInstitucional);
                    if (listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional != null && !listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional.isEmpty()) {
                        List<BigDecimal> totales = service.calcularTotales(listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional);
                        VistaPOAIMetaFondoCuentaPresupuestaria vistaColonesTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                        vistaColonesTemporal.setTextoColones("Colones");
                        vistaColonesTemporal.setProgramaAcademico(totales.get(0).toString(),false);
                        vistaColonesTemporal.setProgramaVidaUniversitaria(totales.get(3).toString(),false);
                        vistaColonesTemporal.setProgramaAdministrativo(totales.get(6).toString(),false);
                        vistaColonesTemporal.setProgramaTotal(totales.get(9).toString(),false);
                        listaConTotales.add(vistaColonesTemporal);
            
                        VistaPOAIMetaFondoCuentaPresupuestaria vistaMillonesTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                        vistaMillonesTemporal.setTextoMillones("Millones de Colones");
                        vistaMillonesTemporal.setProgramaAcademico(totales.get(1).toString(),false);
                        vistaMillonesTemporal.setProgramaVidaUniversitaria(totales.get(4).toString(),false);
                        vistaMillonesTemporal.setProgramaAdministrativo(totales.get(7).toString(),false);
                        vistaMillonesTemporal.setProgramaTotal(totales.get(10).toString(),false);
                        listaConTotales.add(vistaMillonesTemporal);
            
            
                        VistaPOAIMetaFondoCuentaPresupuestaria vistaRedondeoTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                        vistaRedondeoTemporal.setTextoRedondeo("Redondeo");
                        vistaRedondeoTemporal.setProgramaAcademico(totales.get(2).toString(),true);
                        vistaRedondeoTemporal.setProgramaVidaUniversitaria(totales.get(5).toString(),true);
                        vistaRedondeoTemporal.setProgramaAdministrativo(totales.get(8).toString(),true);
                        vistaRedondeoTemporal.setProgramaTotal(totales.get(11).toString(),true);
                        listaConTotales.add(vistaRedondeoTemporal);
                        
                        setListaTotales(listaConTotales);
                        
            
                    } else {
                        this.colonesProgramaAcademico = this.colonesProgramaVidaUniversitaria = this.colonesProgramaAdministrativo = this.totalColones = this.millonesColonesProgramaAcademico = this.millonesColonesProgramaVidaUniversitaria = this.millonesColonesProgramaAdministrativo = this.totalMillonesColones = this.redondeoProgramaAcademico = this.redondeoProgramaVidaUniversitaria = this.redondeoProgramaAdministrativo = this.totalRedondeo = BigDecimal.ZERO;
                    }
                }
            • Y en initDetails indicamos que se realice el calculo
              public void initDetails() {
                      if (!isPostBack()) {
                          // cuando inicia cargamos el primero POAI Activo
                          this.setPlanOperativoAnualInstitucional(service.primerPOAIActivo());
              
                          // Realizar calculo de totales
                          calcularTotales();
                      }
                  }
              • Y tambien cuando se seta el POAI
              public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
              
                      // Limpiamos la especificación
                      removeSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression());
              
                      // Si el POAI es diferente de null
                      if (planOperativoAnualInstitucional != null) {
              
                          // Agregamos la especificación
                          addSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression(), planOperativoAnualInstitucional);
                      }
              
                      // Actualizamos la variable
                      this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;
              
                      // Realizar calculo de totales
                      this.calcularTotales();
              
                  }
              • RESULTADO
              /*
               * 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.ppo.view.model;
              
              
              /**********************************************************************/
              /*********************       IMPORT'S    ******************************/
              /**********************************************************************/
              import java.math.BigDecimal;
              import java.util.ArrayList;
              import java.util.List;
              
              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 cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
              import cr.ac.una.cgi.sdkuna.api.filter.LogicFunction;
              import cr.ac.una.cgi.sdkuna.api.filter.Operator;
              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.bco.service.MonedaService;
              import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativoAnualInstitucional;
              import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaFUCCMetaPOAI;
              import cr.ac.una.cgi.sigesa.ppi.ppo.domain.VistaPOAIMetaFondoCuentaPresupuestaria;
              import cr.ac.una.cgi.sigesa.ppi.ppo.service.VistaPOAIMetaFondoCuentaPresupuestariaService;
              import org.springframework.beans.factory.annotation.Autowired;
              
              /**********************************************************************/
              /*********************    DOCUMENTACIÓN  ******************************/
              /**********************************************************************/
              /**
               * Spring Bean Session para la administración de la entidad {@link VistaPOAIMetaFondoCuentaPresupuestaria}
               *
               * @author Gustavo Matamoros González
               * @since 28/09/2023
               * @version: 1.0.0
               * @bug: PPI-432
               */
              
              
              /**********************************************************************/
              /****************    DEFINICIÓN DE CLASE  *****************************/
              /**********************************************************************/
              @Component
              @Scope("session")
              public class VistaPOAIMetaFondoCuentaPresupuestariaBean extends CRUDImpl<VistaPOAIMetaFondoCuentaPresupuestaria, VistaPOAIMetaFondoCuentaPresupuestariaService> implements CRUD {
                  
                  /**********************************************************************/
                  /****************        AUTOWIRED'S      *****************************/
                  /**********************************************************************/
                  @Autowired
                  MonedaService monedaService;
                  
                  /**********************************************************************/
                  /****************       VARIABLES         *****************************/
                  /**********************************************************************/
                  private PlanOperativoAnualInstitucional planOperativoAnualInstitucional;
                  
                  private BigDecimal colonesProgramaAcademico, colonesProgramaVidaUniversitaria, colonesProgramaAdministrativo, totalColones, millonesColonesProgramaAcademico, millonesColonesProgramaVidaUniversitaria, millonesColonesProgramaAdministrativo, totalMillonesColones, redondeoProgramaAcademico, redondeoProgramaVidaUniversitaria, redondeoProgramaAdministrativo, totalRedondeo;
              
                  List<VistaPOAIMetaFondoCuentaPresupuestaria> listaTotales = new ArrayList();
              
              
                  /**********************************************************************/
                  /****************         MÉTODOS         *****************************/
                  /**********************************************************************/
                  @PostConstruct
                  public void init() {
                      List<CRUDColumn> columns = new ArrayList<>();
              
                      CRUDColumn column1  = new CRUDColumn("codigoProgramaPresupuestario", getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioCodigo_header"),      true);
                      CRUDColumn column2  = new CRUDColumn("nombreProgramaPresupuestario", getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_programaPresupuestarioNombre_header"),      true);         
                      CRUDColumn column3  = new CRUDColumn("codigoObjetivoPOAI",           getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAICodigo_header"),                true);         
                      CRUDColumn column4  = new CRUDColumn("descripcionObjetivoPOAI",      getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_objetivoPOAIDescripcion_header"),           true);
                      CRUDColumn column5  = new CRUDColumn("codigoMetaPOAI",               getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAICodigo_header"),                    true);
                      CRUDColumn column6  = new CRUDColumn("descripcionMetaPOAI",          getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_metaPOAIDescripcion_header"),               true);
                      CRUDColumn column7  = new CRUDColumn("codigoFondo",                  getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_fondoCodigo_header"),                       true);
                      CRUDColumn column8  = new CRUDColumn("nombreFondo",                  getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_fondoNombre_header"),                       true);
                      CRUDColumn column9  = new CRUDColumn("codigoCuentaPresupuestaria",   getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupCodigo_header"),                true);
                      CRUDColumn column10 = new CRUDColumn("nombreCuentaPresupuestaria",   getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_cuentaPresupNombre_header"),                true);
                      CRUDColumn column11 = new CRUDColumn("tipoPresupuesto",              getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_tipoCuenta_header"),                        true);
                      CRUDColumn column12 = new CRUDColumn("colones",                      getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoColones_header"),       true, "", true, "¤#,##0.00",    "currency", monedaService.getSimboloLocal());
                      CRUDColumn column13 = new CRUDColumn("millonesColones",              getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoMillones_header"),      true, "", true, "¤#,##0.00",    "currency", monedaService.getSimboloLocal());
                      CRUDColumn column14 = new CRUDColumn("redondeo",                     getI18n("VistaPOAIMetaFondoCuentaPresupuestaria_presupuestoFormuladoRedondeo_header"),      true, "", true, "¤#,##0",       "currency", monedaService.getSimboloLocal());
              
              
              
                      columns.add(column1);
                      columns.add(column2);
                      columns.add(column3);
                      columns.add(column4);
                      columns.add(column5);
                      columns.add(column6);
                      columns.add(column7);
                      columns.add(column8);
                      columns.add(column9);
                      columns.add(column10);
                      columns.add(column11);
                      columns.add(column12);
                      columns.add(column13);
                      columns.add(column14);
              
                      this.setTableColumns(columns);
                  }
              
                  public void initDetails() {
                      if (!isPostBack()) {
                          // cuando inicia cargamos el primero POAI Activo
                          this.setPlanOperativoAnualInstitucional(service.primerPOAIActivo());
              
                          // Realizar calculo de totales
                          calcularTotales();
                      }
                  }
                  
                  public Page<PlanOperativoAnualInstitucional> completePlanOperativoAnualInstitucional(String query, Pageable pageable) {
                      ArrayList<FilterSpecification> filterSpecifications = new ArrayList<FilterSpecification>();
                      return this.service.completePOAISinAnulados(query, filterSpecifications, pageable);
                  }
              
                  public void handleClearPlanOperativoAnualInstitucional() {
                      
                  }
              
                  public void handlePOAIItemSelectEvent() {
                      
                  }
              
                  public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {
                      return this.planOperativoAnualInstitucional;
                  }
              
                  public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {
              
                      // Limpiamos la especificación
                      removeSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression());
              
                      // Si el POAI es diferente de null
                      if (planOperativoAnualInstitucional != null) {
              
                          // Agregamos la especificación
                          addSpecification("planOperativoAnualInstitucional", LogicFunction.AND.getExpression(), Operator.EQUAL.getExpression(), planOperativoAnualInstitucional);
                      }
              
                      // Actualizamos la variable
                      this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;
              
                      // Realizar calculo de totales
                      this.calcularTotales();
              
                  }
                 
                  public BigDecimal getColonesProgramaAcademico() {
                      return colonesProgramaAcademico;
                  }
              
                  public void setColonesProgramaAcademico(BigDecimal colonesProgramaAcademico) {
                      this.colonesProgramaAcademico = colonesProgramaAcademico;
                  }
              
                  public BigDecimal getColonesProgramaVidaUniversitaria() {
                      return colonesProgramaVidaUniversitaria;
                  }
              
                  public void setColonesProgramaVidaUniversitaria(BigDecimal colonesProgramaVidaUniversitaria) {
                      this.colonesProgramaVidaUniversitaria = colonesProgramaVidaUniversitaria;
                  }
              
                  public BigDecimal getColonesProgramaAdministrativo() {
                      return colonesProgramaAdministrativo;
                  }
              
                  public void setColonesProgramaAdministrativo(BigDecimal colonesProgramaAdministrativo) {
                      this.colonesProgramaAdministrativo = colonesProgramaAdministrativo;
                  }
              
                  public BigDecimal getTotalColones() {
                      return totalColones;
                  }
              
                  public void setTotalColones(BigDecimal totalColones) {
                      this.totalColones = totalColones;
                  }
              
                  public BigDecimal getMillonesColonesProgramaAcademico() {
                      return millonesColonesProgramaAcademico;
                  }
              
                  public void setMillonesColonesProgramaAcademico(BigDecimal millonesColonesProgramaAcademico) {
                      this.millonesColonesProgramaAcademico = millonesColonesProgramaAcademico;
                  }
              
                  public BigDecimal getMillonesColonesProgramaVidaUniversitaria() {
                      return millonesColonesProgramaVidaUniversitaria;
                  }
              
                  public void setMillonesColonesProgramaVidaUniversitaria(BigDecimal millonesColonesProgramaVidaUniversitaria) {
                      this.millonesColonesProgramaVidaUniversitaria = millonesColonesProgramaVidaUniversitaria;
                  }
              
                  public BigDecimal getMillonesColonesProgramaAdministrativo() {
                      return millonesColonesProgramaAdministrativo;
                  }
              
                  public void setMillonesColonesProgramaAdministrativo(BigDecimal millonesColonesProgramaAdministrativo) {
                      this.millonesColonesProgramaAdministrativo = millonesColonesProgramaAdministrativo;
                  }
              
                  public BigDecimal getTotalMillonesColones() {
                      return totalMillonesColones;
                  }
              
                  public void setTotalMillonesColones(BigDecimal totalMillonesColones) {
                      this.totalMillonesColones = totalMillonesColones;
                  }
              
                  public BigDecimal getRedondeoProgramaAcademico() {
                      return redondeoProgramaAcademico;
                  }
              
                  public void setRedondeoProgramaAcademico(BigDecimal redondeoProgramaAcademico) {
                      this.redondeoProgramaAcademico = redondeoProgramaAcademico;
                  }
              
                  public BigDecimal getRedondeoProgramaVidaUniversitaria() {
                      return redondeoProgramaVidaUniversitaria;
                  }
              
                  public void setRedondeoProgramaVidaUniversitaria(BigDecimal redondeoProgramaVidaUniversitaria) {
                      this.redondeoProgramaVidaUniversitaria = redondeoProgramaVidaUniversitaria;
                  }
              
                  public BigDecimal getRedondeoProgramaAdministrativo() {
                      return redondeoProgramaAdministrativo;
                  }
              
                  public void setRedondeoProgramaAdministrativo(BigDecimal redondeoProgramaAdministrativo) {
                      this.redondeoProgramaAdministrativo = redondeoProgramaAdministrativo;
                  }
              
                  public BigDecimal getTotalRedondeo() {
                      return totalRedondeo;
                  }
              
                  public void setTotalRedondeo(BigDecimal totalRedondeo) {
                      this.totalRedondeo = totalRedondeo;
                  }
              
                  public List<VistaPOAIMetaFondoCuentaPresupuestaria> getListaTotales() {
                      return listaTotales;
                  }
              
                  public void setListaTotales(List<VistaPOAIMetaFondoCuentaPresupuestaria> listaTotales) {
                      this.listaTotales = listaTotales;
                  }
              
                  private void calcularTotales() {
                      List<VistaPOAIMetaFondoCuentaPresupuestaria> listaConTotales = new ArrayList();
                      List<VistaPOAIMetaFondoCuentaPresupuestaria> listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional = service.getListaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional(this.planOperativoAnualInstitucional);
                      if (listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional != null && !listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional.isEmpty()) {
                          List<BigDecimal> totales = service.calcularTotales(listaVistaPOAIMetaFondoCuentaPresupuestariabyPlanOperativoAnualInstitucional);
                          VistaPOAIMetaFondoCuentaPresupuestaria vistaColonesTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                          vistaColonesTemporal.setTextoColones("Colones");
                          vistaColonesTemporal.setProgramaAcademico(totales.get(0).toString(),false);
                          vistaColonesTemporal.setProgramaVidaUniversitaria(totales.get(3).toString(),false);
                          vistaColonesTemporal.setProgramaAdministrativo(totales.get(6).toString(),false);
                          vistaColonesTemporal.setProgramaTotal(totales.get(9).toString(),false);
                          listaConTotales.add(vistaColonesTemporal);
              
                          VistaPOAIMetaFondoCuentaPresupuestaria vistaMillonesTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                          vistaMillonesTemporal.setTextoMillones("Millones de Colones");
                          vistaMillonesTemporal.setProgramaAcademico(totales.get(1).toString(),false);
                          vistaMillonesTemporal.setProgramaVidaUniversitaria(totales.get(4).toString(),false);
                          vistaMillonesTemporal.setProgramaAdministrativo(totales.get(7).toString(),false);
                          vistaMillonesTemporal.setProgramaTotal(totales.get(10).toString(),false);
                          listaConTotales.add(vistaMillonesTemporal);
              
              
                          VistaPOAIMetaFondoCuentaPresupuestaria vistaRedondeoTemporal = new VistaPOAIMetaFondoCuentaPresupuestaria();
                          vistaRedondeoTemporal.setTextoRedondeo("Redondeo");
                          vistaRedondeoTemporal.setProgramaAcademico(totales.get(2).toString(),true);
                          vistaRedondeoTemporal.setProgramaVidaUniversitaria(totales.get(5).toString(),true);
                          vistaRedondeoTemporal.setProgramaAdministrativo(totales.get(8).toString(),true);
                          vistaRedondeoTemporal.setProgramaTotal(totales.get(11).toString(),true);
                          listaConTotales.add(vistaRedondeoTemporal);
                          
                          setListaTotales(listaConTotales);
                          
              
                      } else {
                          this.colonesProgramaAcademico = this.colonesProgramaVidaUniversitaria = this.colonesProgramaAdministrativo = this.totalColones = this.millonesColonesProgramaAcademico = this.millonesColonesProgramaVidaUniversitaria = this.millonesColonesProgramaAdministrativo = this.totalMillonesColones = this.redondeoProgramaAcademico = this.redondeoProgramaVidaUniversitaria = this.redondeoProgramaAdministrativo = this.totalRedondeo = BigDecimal.ZERO;
                      }
                  }
                  
              }
              

              vistaPOAIMetaFondoCuentaPresupuestariaListForm.xhtml

              • Despues del panelGrid de autocomplete y antes de la vista agregamos un nuevo panel que presente la información
              <!--Sumatorias de los FUCC-->
                      <p:panelGrid columns="1" styleClass="una-panelgrid">        
                          <p:outputPanel id="VistaPOAIMetaFondoCuentaPresupuestariaOutputPanel"> 
                               <p:dataTable var="vista" value="#{VistaPOAIMetaFondoCuentaPresupuestariaBean.listaTotales}">
                                   <p:column>
                                       <h:outputText value="#{vista.indicador}" />
                                   </p:column>
              
                                   <p:column headerText="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_programaAcademico_label}" style="font-weight:bold">
                                       <h:outputText value="#{vista.programaAcademico}" />
                                   </p:column>
              
                                   <p:column headerText="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_programaVidaUniversitaria_label}" style="font-weight:bold">
                                       <h:outputText value="#{vista.programaVidaUniversitaria}" />
                                   </p:column>
              
                                   <p:column headerText="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_programaAdministrativo_label}" style="font-weight:bold">
                                       <h:outputText value="#{vista.programaAdministrativo}" />
                                   </p:column>
              
                                   <p:column headerText="#{i18n.VistaPOAIMetaFondoCuentaPresupuestaria_total_label}" style="font-weight:bold">
                                       <h:outputText value="#{vista.programaTotal}" />  
                                   </p:column>
                               </p:dataTable>
              
                           </p:outputPanel>
                      </p:panelGrid>