SIGESA: Crear Datable Para Presupuestos Formulados

PlanOperativoAnualInstitucionalService.java

  • Se crean las definiciones de las funciones que obtienen los programas presupuestarios
/**
         * Retorna el Programa Presupuestario Academico
         * 
         * @author Gustavo Matamoros González
         * @issue BTPPI-276 11/09/2023
         * @return {@link ProgramaPresupuestario}
         */
        public ProgramaPresupuestario findProgramaPresupuestarioAcademico();

        /**
         * Retorna el Programa Presupuestario Vida Estudiantil
         * 
         * @author Gustavo Matamoros González
         * @issue BTPPI-276 11/09/2023
         * @return {@link ProgramaPresupuestario}
         */
        public ProgramaPresupuestario findProgramaPresupuestarioVidaUniversitaria();

        /**
         * Retorna el Programa Presupuestario Administrativo
         * 
         * @author Gustavo Matamoros González
         * @issue BTPPI-276 11/09/2023
         * @return {@link ProgramaPresupuestario}
         */
        public ProgramaPresupuestario findProgramaPresupuestarioAdministrativo();

PlanOperativoAnualInstitucionalServiceImpl.java

  • Se crean los servicios necesarios
/**     
     * Ver {@link PlanOperativoAnualInstitucionalService#findProgramaPresupuestarioAcademico()} 
     */
    @Override
    public ProgramaPresupuestario findProgramaPresupuestarioAcademico() {
        return programaPresupuestarioService.getProgramaPresupuestarioAcademico();
    }

    /**     
    * Ver {@link PlanOperativoAnualInstitucionalService#findProgramaPresupuestarioVidaUniversitaria()} 
    */
    @Override
    public ProgramaPresupuestario findProgramaPresupuestarioVidaUniversitaria() {
        return programaPresupuestarioService.getProgramaPresupuestarioVidaEstudiantil();
    }

    /**     
    * Ver {@link PlanOperativoAnualInstitucionalService#findProgramaPresupuestarioAdministrativo()} 
    */
    @Override
    public ProgramaPresupuestario findProgramaPresupuestarioAdministrativo() {
        return programaPresupuestarioService.getProgramaPresupuestarioAdministrativo();
    }

PlanOperativoAnualInstitucionalBean.java

  • Primero al final de documento creamos un objeto especial para que sea mostrado en el datatable
/**
     * Objeto para almacenar los Totales de los Presupuestos Formulados
     * 
     * @author Gustavo Matamoros González
     * @issue BTPPI-276 13/09/2023
     * @return {@link ProgramaPresupuestario}
     */
    static public class TotalPresupuestoFormuladoModel implements Serializable {

        private String titulo;
        private BigDecimal colones;
        private BigDecimal millones;
        private BigDecimal redondeo;

       
        public TotalPresupuestoFormuladoModel() {

        }

        public TotalPresupuestoFormuladoModel(String titulo, BigDecimal colones) {
            this.titulo = titulo;
            this.colones = colones;
            this.millones = colones.divide(new BigDecimal("1000000"));
            this.redondeo = colones.setScale(0, RoundingMode.HALF_UP);

            
        }

        public void setTitulo(String titulo) {
            this.titulo = titulo;
        }

        public String getTitulo() {
            return titulo;
        }

        public BigDecimal getColones() {
            return colones;
        }

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

        public BigDecimal getMillones() {
            return millones;
        }

        public void setMillones(BigDecimal millones) {
            this.millones = millones;
        }

        public BigDecimal getRedondeo() {
            return redondeo;
        }

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


    }
  • Agregamos los imports necesarios
import java.math.RoundingMode;
  • Creamos las variables necesarias
// Programas Presupuestarios
    private ProgramaPresupuestario programaPresupuestarioAcademico;
    private ProgramaPresupuestario programaPresupuestarioVidaUniversitaria;
    private ProgramaPresupuestario programaPresupuestarioAdministrativo;

    // Totales de Presupuestos Formulados
    private BigDecimal totalPresupuestoFormulado;
    private BigDecimal totalPresupuestoFormuladoAcademico;
    private BigDecimal totalPresupuestoFormuladoVidaUniversitaria;
    private BigDecimal totalPresupuestoFormuladoAdministrativo;
    
    
    // Lista para desplegar en el data table de presupuestos formulados
    private List<TotalPresupuestoFormuladoModel> listaDeTotalesPresupuestosFormulados;
  • Y los set y gets necesarios
 public List<TotalPresupuestoFormuladoModel> getListaDeTotalesPresupuestosFormulados() {
        return listaDeTotalesPresupuestosFormulados;
    }

    public void setListaDeTotalesPresupuestosFormulados(List<TotalPresupuestoFormuladoModel>listaDeTotalesPresupuestosFormulados) {
        this.listaDeTotalesPresupuestosFormulados = listaDeTotalesPresupuestosFormulados;
    }
  • Ahora en el initDetails en la sección después de isPostBack para que se repita siempre agregamos
/*****************************************************************************/
        // Calculo de totales de Presupuestos Formulados
        /*****************************************************************************/

        // Inicialiar variables
        this.programaPresupuestarioAcademico = service.findProgramaPresupuestarioAcademico();
        this.programaPresupuestarioVidaUniversitaria = service.findProgramaPresupuestarioVidaUniversitaria();
        this.programaPresupuestarioAdministrativo = service.findProgramaPresupuestarioAdministrativo();

        this.totalPresupuestoFormuladoAcademico = new BigDecimal(0);
        this.totalPresupuestoFormuladoVidaUniversitaria = new BigDecimal(0);
        this.totalPresupuestoFormuladoAdministrativo = new BigDecimal(0);
        this.totalPresupuestoFormulado = new BigDecimal(0);
        
        // Recorrer las metas para sumar los presupuestos dependiendo del programa presupuestario
        for (ObjetivoPoai objetivo : this.getEntity().getListaObjetivosPoai()) {
            if (this.getProgramaPresupuestario().getId() != null) {
                for (MetaPOAI meta : objetivo.getListaMetasPoai()) {
                    if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioAcademico) &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoAcademico = this.totalPresupuestoFormuladoAcademico.add(meta.getPresupuestoFormulado());
                    }else if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioVidaUniversitaria)  &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoVidaUniversitaria = this.totalPresupuestoFormuladoVidaUniversitaria.add(meta.getPresupuestoFormulado());
                    }else if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioAdministrativo) &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoAdministrativo = this.totalPresupuestoFormuladoAdministrativo.add(meta.getPresupuestoFormulado());
                    }
                    // Total
                    if(meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormulado = this.totalPresupuestoFormulado.add(meta.getPresupuestoFormulado());
                    }
                }
            }
        }

        // agregar lso totales a la lista de ListaDeTotalesPresupuestosFormulados
        this.setListaDeTotalesPresupuestosFormulados(new ArrayList());
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(this.getI18n("planOperativoAnualInstitucional_presupuestoFormuladoTabla_Total"),this.totalPresupuestoFormulado));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioAcademico.getNombre(),this.totalPresupuestoFormuladoAcademico));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioVidaUniversitaria.getNombre(),this.totalPresupuestoFormuladoVidaUniversitaria));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioAdministrativo.getNombre(),this.totalPresupuestoFormuladoAdministrativo));
  • Quedando así
public void initDetails() {
        if (!isPostBack()) {
            
            this.setListaEscenarioPresupuestarioSeleccionados(new ArrayList());
            this.setListaAllEscenarioPresupuestarios(this.obtieneAllEscenarioPresupuestariosByPeriodoAnual());
            
            //QUITAR ESTE SET DE ESTADO CUANDO EXISTA UN FLUJO
            EstadoFormulacionPOAI estadoBorrador = service.obtenerEstadoFormulacionPOAIBorrador();
            this.getEntity().setEstadoFormulacionPOAI(estadoBorrador);
            
            
            this.getEntity().setListaPOAIEscenarios(pOAIEscenarioBean.setDetails(this.getEntity().getListaPOAIEscenarios()));
            for (POAIEscenario poaiEscenario : this.getEntity().getListaPOAIEscenarios()) {
                this.listaEscenarioPresupuestarioSeleccionados.add(poaiEscenario.getEscenarioPresupuestario());
            }
            pOAIEscenarioBean.init();
            
            
        }

        /*****************************************************************************/
        // Calculo de totales de Presupuestos Formulados
        /*****************************************************************************/

        // Inicialiar variables
        this.programaPresupuestarioAcademico = service.findProgramaPresupuestarioAcademico();
        this.programaPresupuestarioVidaUniversitaria = service.findProgramaPresupuestarioVidaUniversitaria();
        this.programaPresupuestarioAdministrativo = service.findProgramaPresupuestarioAdministrativo();

        this.totalPresupuestoFormuladoAcademico = new BigDecimal(0);
        this.totalPresupuestoFormuladoVidaUniversitaria = new BigDecimal(0);
        this.totalPresupuestoFormuladoAdministrativo = new BigDecimal(0);
        this.totalPresupuestoFormulado = new BigDecimal(0);
        
        // Recorrer las metas para sumar los presupuestos dependiendo del programa presupuestario
        for (ObjetivoPoai objetivo : this.getEntity().getListaObjetivosPoai()) {
            if (this.getProgramaPresupuestario().getId() != null) {
                for (MetaPOAI meta : objetivo.getListaMetasPoai()) {
                    if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioAcademico) &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoAcademico = this.totalPresupuestoFormuladoAcademico.add(meta.getPresupuestoFormulado());
                    }else if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioVidaUniversitaria)  &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoVidaUniversitaria = this.totalPresupuestoFormuladoVidaUniversitaria.add(meta.getPresupuestoFormulado());
                    }else if(objetivo.getProgramaPresupuestario().equals(this.programaPresupuestarioAdministrativo) &&  meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormuladoAdministrativo = this.totalPresupuestoFormuladoAdministrativo.add(meta.getPresupuestoFormulado());
                    }
                    // Total
                    if(meta.getPresupuestoFormulado() != null){
                        this.totalPresupuestoFormulado = this.totalPresupuestoFormulado.add(meta.getPresupuestoFormulado());
                    }
                }
            }
        }

        // agregar lso totales a la lista de ListaDeTotalesPresupuestosFormulados
        this.setListaDeTotalesPresupuestosFormulados(new ArrayList());
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(this.getI18n("planOperativoAnualInstitucional_presupuestoFormuladoTabla_Total"),this.totalPresupuestoFormulado));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioAcademico.getNombre(),this.totalPresupuestoFormuladoAcademico));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioVidaUniversitaria.getNombre(),this.totalPresupuestoFormuladoVidaUniversitaria));
        this.getListaDeTotalesPresupuestosFormulados().add(new TotalPresupuestoFormuladoModel(programaPresupuestarioAdministrativo.getNombre(),this.totalPresupuestoFormuladoAdministrativo));
        
    }

planOperativoAnualInstitucionalEditForm.xhtml

  • Eliminamos el código anterior de presupuestos
<!-- Presupuesto Formulado-->
                    <p:outputLabel id="presupuestoFormuladoOutputLabel" for="presupuestoFormuladoInputNumber"
                        value="#{i18n.planOperativoAnualInstitucional_presupuestoFormulado_label}" />
                    <p:outputPanel id="presupuestoFormuladoOutputPanel">
                        <una:inputNumber id="presupuestoFormuladoInputNumber"
                            value="#{planOperativoAnualInstitucionalBean.entity.presupuestoFormulado}"
                            maxValue="9223372036854775807" minValue="-9223372036854775807" dir="RTL" maxlength="50"
                            decimalPlaces="2" overrideProperties="true">
                        </una:inputNumber>
                        <p:message id="presupuestoFormuladoMessage" for="presupuestoFormuladoInputNumber" />
                    </p:outputPanel>
  • Y agregamos el nuevo código
!-- Presupuesto Formulado-->
            <p:outputPanel id="presupuestoFormulado2OutputPanel" >
                <p:fieldset legend="Presupuesto Formulado" toggleable="false" toggleSpeed="500">
                    <p:ajax event="toggle" />
                        <p:dataTable var="total" id="presupuestoFormuladoDataTable" value="#{planOperativoAnualInstitucionalBean.listaDeTotalesPresupuestosFormulados}" styleClass="una-dataTablePresupuesto">
                                <p:column headerText="#{i18n.planOperativoAnualInstitucional_presupuestoFormuladoTabla_descripcion}" >
                                    <h:outputText value="#{total.titulo}"/>
                                </p:column>
                                <p:column headerText="#{i18n.planOperativoAnualInstitucional_presupuestoFormuladoTabla_colones}">
                                    <h:outputText value="#{total.colones}">
                                        <f:convertNumber pattern="₡###,###.###"/>
                                    </h:outputText>
                                </p:column>
                                <p:column headerText="#{i18n.planOperativoAnualInstitucional_presupuestoFormuladoTabla_millonesColones}">
                                    <h:outputText value="#{total.millones}">
                                        <f:convertNumber pattern="₡###,###.###"/>
                                    </h:outputText>
                                </p:column>
                                <p:column headerText="#{i18n.planOperativoAnualInstitucional_presupuestoFormuladoTabla_redondeo}">
                                    <h:outputText value="#{total.redondeo}">
                                        <f:convertNumber  pattern="₡#,##0"/>
                                    </h:outputText>
                                </p:column>
                            </p:dataTable>
                </p:fieldset>
                <p:message id="presupuestoFormulado2Message" for="presupuestoFormuladoDataTable" />
            </p:outputPanel>
  • Finalmente agregamos las siguientes clases para darle el estilo necesario
<style>
            .una-selectManyMenu{
                width: 600px;
            }
            .una-dataTablePresupuesto table tr th {
                background-color: #cdcdce;
                font-weight: 600;
                text-align: right;
            }
            .una-dataTablePresupuesto table tr th:first-child {
                text-align: left;
            }
            .una-dataTablePresupuesto table tr td:first-child {
                text-align: left;
            }
            .una-dataTablePresupuesto table tr td {
                text-align: right;
            }
        </style>