SIGESA: Agregar botón de Acción

planOperativoListForm

  • Aquí lo primero que se debe hacer es agregar la referencia a Bean que maneje a los botones
  • Esto se hace con la siguiente linea:
additionalButtonsBean="#{planOperativoListBeanButtons}"
  • Y esto se debe agregar en el componet «noEditTable» quedando así
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <components:noEditTable id="noEditTable"
                                header="#{i18n.planOperativo_list_form_table_header}"
                                bean="#{planOperativoBean}"
                                showEditButton="#{!planOperativoBean.deshabilitarEdicion(row)}"
                                i18nKey="planOperativo_list_form_table_header"
                                additionalButtonsBean="#{planOperativoListBeanButtons}"
                                editForm="planOperativoEditForm"/>

PlanOperativoListBeanButtons.java

  • Este será el archivo que se encargará de manejar los botones
  • Este se crea en la ruta Proyecto->Web->view->buttons
  • Este debe contener
/*
 * 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.buttons;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createMethodExpression;
import static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createValueExpression;
import cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++        PRIMEFACES           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.primefaces.component.commandbutton.CommandButton;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             OTROS           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import com.sun.faces.taglib.jsf_core.SetPropertyActionListenerImpl;
import javax.annotation.PostConstruct;
import javax.el.MethodExpression;
import javax.el.ValueExpression;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++   Proyecto: PPI/MCG         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;


/**********************************************************************/
/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 *
 * @author Greivin Barrantes S.
 * @version 0.0.1
 * Fecha_creación: 29/08/2022
 * 
 * Modificado por: Gustavo Matamoros González
 * Fecha_modificación: 1/01/2023
 * Tarea: PPI-267
 */

/**********************************************************************/
/**********************************************************************/
/*********************  CONFIGURACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
@Component
@Scope("request")

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

public class PlanOperativoListBeanButtons extends AdditionalButtons {



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



    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Luego se debe agregar la creación del botón con sus propiedades
/*************************************************************************************************/
        /**************************** BOTÓN: DUPLICACIÓN PLAN OPERATIVO **********************************/
        /*************************************************************************************************/
        
        // Creamos nuevo botón
        CommandButton duplicarPlanOperativoButton = new CommandButton();

        // Propiedades del botón
        duplicarPlanOperativoButton.setId("duplicarPlanOperativoButton");
        duplicarPlanOperativoButton.setIcon("ui-icon-filter-none");
        duplicarPlanOperativoButton.setStyleClass("actions");
        duplicarPlanOperativoButton.setTitle(getI18n("plan_operativo_duplicarPlanOperativo_button"));
        duplicarPlanOperativoButton.setProcess("@this");
        duplicarPlanOperativoButton.setAjax(true);

        // Establecer el objetivo y valor para listener del botón
        //ValueExpression entityValue = createValueExpression("#{row}", PlanOperativo.class);
        //ValueExpression entityTarget = createValueExpression("#{planOperativoBean.entity}", PlanOperativo.class);
        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));

        // Acción: click
        duplicarPlanOperativoButton.setOnclick("PF('duplicarPlanOperativoButton').show()");

        // Función para renderizar el botón

        duplicarPlanOperativoButton.setValueExpression("rendered", createValueExpression("#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}", Boolean.class));

        // Agregar el botón
        this.additionalActionButtons.add(duplicarPlanOperativoButton);
  • EXPLICACIÓN:
    • CommandButton duplicarPlanOperativoButton = new CommandButton(): crea un objeto tipo botón
    • duplicarPlanOperativoButton.setIcon(«ui-icon-filter-none»): establece el icono
    • duplicarPlanOperativoButton.setStyleClass(«actions»): establece la clase del framework
    • duplicarPlanOperativoButton.setTitle(getI18n(«plan_operativo_duplicarPlanOperativo_button»)): texto del botón
    • duplicarPlanOperativoButton.setProcess(«@this»);
    • duplicarPlanOperativoButton.setAjax(true);

plan_operativo_duplicarPlanOperativo_button: «duplicar plan operativo»

  • La Relación del objetivo y su valor con las siguientes lineas
  • Nota: como ya existe un botón anterior las lineas de entityValue y entityTarget no se utilizan solo la relación con el botón
// Establecer el objetivo y valor para listener del botón
        ValueExpression entityValue = createValueExpression("#{row}", PlanOperativo.class);
        ValueExpression entityTarget = createValueExpression("#{planOperativoBean.entity}", PlanOperativo.class);
        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));
  • Ahora toca agregar el botón
// Agregar el botón
this.additionalActionButtons.add(duplicarPlanOperativoButton);
  • Ahora si compilamos el botón ya debe aparecer
  • Ahora el siguiente paso es crear una ventana modal que nos muestre el «aceptar» y cancelar
  • Para esto en el listForm agregamos

planOperativoListForm.xhtml (Ventana modal)

  • Aquí debemos agregar el componente de la ventana modal
  • CORREGIR
<!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++     MODAL: DUPLICAR PLAN OPERATIVO      +++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
            <p:confirmDialog    id="confirmDialog_duplicarPlanOperativo" 
                                message="#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}" 
                                header="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}" 
                                severity="alert" 
                                widgetVar="duplicarPlanOperativoButton" 
                                appendTo="@(body)"
                                appendToBody="true">  

            <p:commandButton    id="confirm_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}"                              
                                oncomplete="PF('duplicarPlanOperativoButton').hide()"
                                actionListener="#{planOperativoBean.duplicarPlanOperativoDesdeButton()}" 
                                update=":formMantenimiento"
                                process="@this">             
            </p:commandButton>

            <p:commandButton    id="decline_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}" 
                                onclick="PF('duplicarPlanOperativoButton').hide()" 
                                type="button"/>   

            </p:confirmDialog> 
  • EXPLICACIÓN:
    • CommandButton duplicarPlanOperativoButton = new CommandButton(): crea un objeto tipo botón
    • duplicarPlanOperativoButton.setIcon(«ui-icon-filter-none»): establece el icono
    • duplicarPlanOperativoButton.setStyleClass(«actions»): establece la clase del framework
    • duplicarPlanOperativoButton.setTitle(getI18n(«plan_operativo_duplicarPlanOperativo_button»)): texto del botón
    • duplicarPlanOperativoButton.setProcess(«@this»);
    • duplicarPlanOperativoButton.setAjax(true);

PlanOperativoListBeanButtons.java

  • Ahora debemos agregar la acción del click del botón, para nuestro caso es abrir una ventana modal
  • Para esto agregamos antes de agregar el botón
// Acción: click sobre el botón
        duplicarPlanOperativoButton.setOnclick("PF('duplicarPlanOperativoButton').show()")
  • Quedando así:
/*************************************************************************************************/
        /**************************** BOTÓN: DUPLICACIÓN PLAN OPERATIVO **********************************/
        /*************************************************************************************************/
        
        // Creamos nuevo botón
        CommandButton duplicarPlanOperativoButton = new CommandButton();

        // Propiedades del botón
        duplicarPlanOperativoButton.setId("duplicarPlanOperativoButton");
        duplicarPlanOperativoButton.setIcon("ui-icon-filter-none");
        duplicarPlanOperativoButton.setStyleClass("actions");
        duplicarPlanOperativoButton.setTitle(getI18n("plan_operativo_duplicarPlanOperativo_button"));
        duplicarPlanOperativoButton.setProcess("@this");
        duplicarPlanOperativoButton.setAjax(true);

        // Establecer el objetivo y valor para listener del botón
        //ValueExpression entityValue = createValueExpression("#{row}", PlanOperativo.class);
        //ValueExpression entityTarget = createValueExpression("#{planOperativoBean.entity}", PlanOperativo.class);
        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));

        // Acción: click sobre el botón
        duplicarPlanOperativoButton.setOnclick("PF('duplicarPlanOperativoButton').show()");

        // Función para renderizar el botón

        duplicarPlanOperativoButton.setValueExpression("rendered", createValueExpression("#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}", Boolean.class));

        // Agregar el botón
        this.additionalActionButtons.add(duplicarPlanOperativoButton);

Función para validar el renderizado del botón

  • Ahora para poder establecer cuando debe aparecer el botón vamos a utilizar la siguiente instrucción
// Función para renderizar el botón
        duplicarPlanOperativoButton.setValueExpression("rendered", createValueExpression("#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}", Boolean.class));
  • Esta instrucción indica va estar definida en el Bean del plan Operativo ya que cualquier interfaz se comunica a traves de Bean’s y esta función entonces llama a un servicio definido.
  • Por tanto el Bean de gestión del botón queda finalmente así

PlanOperativoListForm.xhtml (final)

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

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

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


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


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

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar"
                            editMode="false"
                            bean="#{planOperativoBean}"
                            showNewButton="#{false}"
                            listForm="planOperativoListForm"
                            editForm="planOperativoEditForm"
                            backForm="planOperativoListForm"
                            container="noEditTable:dataTable"/>

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <components:noEditTable id="noEditTable"
                                header="#{i18n.planOperativo_list_form_table_header}"
                                bean="#{planOperativoBean}"
                                showEditButton="#{!planOperativoBean.deshabilitarEdicion(row)}"
                                i18nKey="planOperativo_list_form_table_header"
                                additionalButtonsBean="#{planOperativoListBeanButtons}"
                                editForm="planOperativoEditForm"/>
        
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++     MODAL: APROBAR FLUJO       ++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <p:confirmDialog id="confirmDialogAprobarFlujo" 
                         message="#{i18n.plan_operativo_aprobar_flujo_confirm_message}"  
                             header="#{i18n.plan_operativo_aprobar_flujo_confirm_header}" 
                             severity="alert" 
                             widgetVar="aprobarFlujoButton" 
                             appendTo="@(body)">  

                <p:commandButton id="confirmAprobarFlujo" 
                                 disabled="#{false}"
                                 value="#{i18n.plan_operativo_aprobar_flujo_confirm_accept_button_label}"                              
                                 oncomplete="PF('aprobarFlujoButton').hide()"
                                 actionListener="#{planOperativoBean.aprobarFlujoDesdeButton()}" 
                                 update=":formMantenimiento"
                                 process="@this">             
                </p:commandButton>

                <p:commandButton id="declineAprobarFlujo" 
                                 disabled="#{false}"
                                 value="#{i18n.plan_operativo_aprobar_flujo_cancel_button_label}" 
                                 onclick="PF('aprobarFlujoButton').hide()" 
                                 type="button" />   

            </p:confirmDialog> 
            
            <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++     MODAL: DUPLICAR PLAN OPERATIVO      +++++++++++++++++++++++++-->
            <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
            <p:confirmDialog    id="confirmDialog_duplicarPlanOperativo" 
                                message="#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}" 
                                header="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}" 
                                severity="alert" 
                                widgetVar="duplicarPlanOperativoButton" 
                                appendTo="@(body)"
                                appendToBody="true">  

            <p:commandButton    id="confirm_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}"                              
                                oncomplete="PF('duplicarPlanOperativoButton').hide()"
                                actionListener="#{planOperativoBean.duplicarPlanOperativoDesdeButton()}" 
                                update=":formMantenimiento"
                                process="@this">             
            </p:commandButton>

            <p:commandButton    id="decline_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}" 
                                onclick="PF('duplicarPlanOperativoButton').hide()" 
                                type="button"/>   

            </p:confirmDialog> 


    </ui:define>
    <!--********************************************************************************************-->
    <!--*****************************   FIN DEFINE     *********************************************-->
    <!--********************************************************************************************-->

</ui:composition>
<!--********************************************************************************************-->
<!--********************************************************************************************-->
<!--**************************     FIN COMPOSICIÓN   *******************************************-->
<!--********************************************************************************************-->
<!--********************************************************************************************-->

PlanOperativoListBeanButtons.java (Final)

  • Archivo Final:
/*
 * 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.buttons;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createMethodExpression;
import static cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons.createValueExpression;
import cr.ac.una.cgi.sdkuna.view.commons.AdditionalButtons;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++        PRIMEFACES           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.primefaces.component.commandbutton.CommandButton;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             OTROS           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import com.sun.faces.taglib.jsf_core.SetPropertyActionListenerImpl;
import javax.annotation.PostConstruct;
import javax.el.MethodExpression;
import javax.el.ValueExpression;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++   Proyecto: PPI/MCG         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.PlanOperativo;


/**********************************************************************/
/**********************************************************************/
/*********************  DOCUMENTACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 *
 * @author Greivin Barrantes S.
 * @version 0.0.1
 * Fecha_creación: 29/08/2022
 * 
 * Modificado por: Gustavo Matamoros González
 * Fecha_modificación: 1/01/2023
 * Tarea: PPI-267
 */

/**********************************************************************/
/**********************************************************************/
/*********************  CONFIGURACIÓN    ******************************/
/**********************************************************************/
/**********************************************************************/
@Component
@Scope("request")

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

public class PlanOperativoListBeanButtons extends AdditionalButtons {



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

        /*************************************************************************************************/
        /**************************** BOTÓN: APROBACIÓN PLAN OPERATIVO ***********************************/
        /*************************************************************************************************/

        // BOTON PARA APROBAR UN FLUJO DEL PLAN OPERATIVO DESDE EL LISTFORM
        CommandButton aprobarFlujoButton = new CommandButton();
        aprobarFlujoButton.setId("aprobarFlujoButton");
        aprobarFlujoButton.setIcon("ui-icon-done");
        aprobarFlujoButton.setStyleClass("actions");
        aprobarFlujoButton.setTitle(getI18n("plan_operativo_aprobar_flujo_button"));
        aprobarFlujoButton.setProcess("@this");
        aprobarFlujoButton.setAjax(true);
        
        ValueExpression entityValue = createValueExpression("#{row}", PlanOperativo.class);
        ValueExpression entityTarget = createValueExpression("#{planOperativoBean.entity}", PlanOperativo.class);
        aprobarFlujoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));


        aprobarFlujoButton.setValueExpression("rendered", createValueExpression("#{planOperativoBean.renderButtonAprobarFlujo(row)}", Boolean.class));
        aprobarFlujoButton.setOnclick("PF('aprobarFlujoButton').show()");
//        MethodExpression targetExpressionEdit = createMethodExpression("#{planOperativoBean.aprobarFlujoDesdeButton()}", null, String.class);
//        aprobarFlujoButton.setActionExpression(targetExpressionEdit);

        this.additionalActionButtons.add(aprobarFlujoButton);

        /*************************************************************************************************/
        /**************************** BOTÓN: DUPLICACIÓN PLAN OPERATIVO **********************************/
        /*************************************************************************************************/
        
        // Creamos nuevo botón
        CommandButton duplicarPlanOperativoButton = new CommandButton();

        // Propiedades del botón
        duplicarPlanOperativoButton.setId("duplicarPlanOperativoButton");
        duplicarPlanOperativoButton.setIcon("ui-icon-filter-none");
        duplicarPlanOperativoButton.setStyleClass("actions");
        duplicarPlanOperativoButton.setTitle(getI18n("plan_operativo_duplicarPlanOperativo_button"));
        duplicarPlanOperativoButton.setProcess("@this");
        duplicarPlanOperativoButton.setAjax(true);

        // Establecer el objetivo y valor para listener del botón
        //ValueExpression entityValue = createValueExpression("#{row}", PlanOperativo.class);
        //ValueExpression entityTarget = createValueExpression("#{planOperativoBean.entity}", PlanOperativo.class);
        duplicarPlanOperativoButton.addActionListener(new SetPropertyActionListenerImpl(entityTarget, entityValue));

        // Acción: click sobre el botón
        duplicarPlanOperativoButton.setOnclick("PF('duplicarPlanOperativoButton').show()");

        // Función para renderizar el botón
        duplicarPlanOperativoButton.setValueExpression("rendered", createValueExpression("#{planOperativoBean.renderButtonDuplicarPlanOperativo(row)}", Boolean.class));

        // Agregar el botón
        this.additionalActionButtons.add(duplicarPlanOperativoButton);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Ahora vamos a ir al bean principal PlanOperativoBean.java

PlanOperativoBean.java

Funcion: renderizado del botón

  • Ahora creamos una función que va invocar un servicio que va a verificar todas las condiciones para la aparición del botón.
/**
     * Metodo que valida cuando el botón de duplicación de Plan Operativo debe aparecer y permite relizar la duplicación
     *
     * @param planOperativo
     * @author Gustavo Matamoros González
     * Fecha_Creación:  12/01/2023
     * Tarea: PPI-267
     * @return True si se cumplen todas las condiciones
     */
    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo){
        return service.renderButtonDuplicarPlanOperativo(planOperativo);
    }
  • Ahora vamos a crear la función que se va a ejecutar cuando se de clic en el botón de aceptar

Función de duplicarPlanOperativoDesdeButton

  • Función
/**
     * Metodo que manda a duplicar un plan operativo desde el botón de duplicación de Plan Operativo
     * 
     * @author Gustavo Matamoros González
     * Fecha_Creación:  17/01/2023
     * Tarea: PPI-267
     */
    public void duplicarPlanOperativoDesdeButton() {
        service.duplicarPlanOperativoDesdeButton(this.getEntity());
    }
  • Esta función es llamada con la siguiente instrucción dentro de planOperativoListForm.xhtml
actionListener="#{planOperativoBean.duplicarPlanOperativoDesdeButton()}" 
  • Esto desde la ventana modal
<p:confirmDialog    id="confirmDialog_duplicarPlanOperativo" 
                                message="#{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message1} #{i18n.plan_operativo_duplicarPlanOperativo_flujo_confirm_message2}" 
                                header="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_header}" 
                                severity="alert" 
                                widgetVar="duplicarPlanOperativoButton" 
                                appendTo="@(body)"
                                appendToBody="true">  

            <p:commandButton    id="confirm_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_confirm_accept_button_label}"                              
                                oncomplete="PF('duplicarPlanOperativoButton').hide()"
                                actionListener="#{planOperativoBean.duplicarPlanOperativoDesdeButton()}" 
                                update=":formMantenimiento"
                                process="@this">             
            </p:commandButton>

            <p:commandButton    id="decline_duplicarPlanOperativo" 
                                disabled="#{false}"
                                value="#{i18n.plan_operativo_duplicarPlanOperativo_cancel_button_label}" 
                                onclick="PF('duplicarPlanOperativoButton').hide()" 
                                type="button"/>   

            </p:confirmDialog> 
  • Por tanto al Bean queda de la siguiente forma

PlanOperativoBean.java (Funciones finales)

/**
     * Metodo que valida cuando el botón de duplicación de Plan Operativo debe aparecer y permite relizar la duplicación
     *
     * @param planOperativo
     * @author Gustavo Matamoros González
     * Fecha_Creación:  12/01/2023
     * Tarea: PPI-267
     * @return True si se cumplen todas las condiciones
     */
    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo){
        return service.renderButtonDuplicarPlanOperativo(planOperativo);
    }

    /**
     * Metodo que manda a duplicar un plan operativo desde el botón de duplicación de Plan Operativo
     * 
     * @author Gustavo Matamoros González
     * Fecha_Creación:  17/01/2023
     * Tarea: PPI-267
     */
    public void duplicarPlanOperativoDesdeButton() {
        service.duplicarPlanOperativoDesdeButton(this.getEntity());
    }

PlanOperativoServiceImpl.java (Final)

  • Ahora dentro del Service creamos las siguientes funciones
/**
     * 
     * Método que muestra el botón de "Duplicar Plan Operativo" según las siguientes validaciones:
     * 
     * 01. El usuario no puede tener el rol de UNA_PPI_PPO_CONSULTA_TOTAL
     * 02. El plan Operativo debe estar Activo
     * 03· El Periodo Anual del Plan Operativo debe ser igual al Periodo Actual en Ejecución
     * 04. Existe una etapa de Modificación
     * 05. Existen Plan Operativos Duplicados
     * 06. Existen Etapas de Planificación con Excepciones
     *
     * @param planOperativo
     * @author Gustavo Matamoros González
     * @since 12/01/2023
     * @issue: PPI-267
     * @return true (Pintar botón) / false (No pintar botón)
     */
    @Override
    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo) {

        /****************************************************************************/
        // VALIDACIÓN-01: El usuario NO Rol de Consulta "param_ppi_ppo_rol_consulta"
        /****************************************************************************/

        // Obtenemos los datos del usuario actual 
        Usuario usuarioActual = usuarioService.getUsuarioActual();

        // Obtenemos el ID del Rol PPI_PPO_CONSULTA de Paramteros SIGESA "param_ppi_ppo_rol_consulta"
        Rol rol_PPI_PPO_CONSULTA = rolService.findOne(Long.parseLong(parametroService.findOneByLlave("param_ppi_ppo_rol_consulta").getValor()));

        // Obtenemos todos los usuarios que tengan el rol de consulta
        List<Usuario> usuariosRolConsulta = rolUsuarioService.getByRolActivo(rol_PPI_PPO_CONSULTA);

        // Si el usuario contiene el rol de consulta no muestre botón
        if (!usuariosRolConsulta.contains(usuarioActual)) {


            
            /****************************************************************************/
            // VALIDACIÓN-02: El Plan Operativo debe estar Activo
            /****************************************************************************/

            // Si el Plan Operativo esta Activo
            if (planOperativo.getActivo() ) {



                /****************************************************************************/
                // VALIDACIÓN-03: El periodo anual debe ser el de Ejecución   
                /****************************************************************************/
                
                // Obtenemos el Periodo Anual en Ejecución
                PeriodoAnual periodoActual = periodoAnualService.findAnoEjecucion();

                // Verificamos si el Periodo Anual en ejecución == planOperativo.periodoAnual
                if(planOperativo.getPeriodoAnual().equals(periodoActual)){
                    
                    /****************************************************************************/
                    // VALIDACIÓN-04: Existe una etapa de Modificación
                    /****************************************************************************/

                    // Obtenemos el Tipo de Etapa Modificación
                    TipoEtapa tipoEtapaModificacion = tipoEtapaService.obtenerTipoEtapaModificacion();

                    // Obtenemos la Etapa Plan de modificación según:
                    // TipoEtapa:  Modificación
                    // TipoPlan: planOperativo.getTipoPlan()
                    // TipoPlanOperativo: planOperativo.getTipoPlanOperativo()
                    // PeriodoAnual: planOperativo.getPeriodoAnual()
                    EtapaPlan etapaPlan =  etapaPlanService.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapaModificacion, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(), planOperativo.getPeriodoAnual());
                    

                    // Si la etapa de Plan de Modificación existe
                    if(etapaPlan != null){

                        /****************************************************************************/
                        // VALIDACIÓN-05: Existen Plan Operativos Duplicados
                        /****************************************************************************/

                        // Preguntamos si existen planes Operativos Duplicados
                        // True: Pinte el botón
                        // False: No pinte el botón
                        return existePlanOperativoDuplicado (tipoEtapaModificacion, planOperativo, etapaPlan );

                    }else{


                        /****************************************************************************/
                        // VALIDACIÓN-06: Existen Etapas de Planificación con Excepciones
                        /****************************************************************************/

                        // Preguntamos si existe una Excepción para el Plan Operativo con Etapa de Modificación
                        ExcepcionPlanificacion excepcionPlanificacion = findByTipoEtapaAndPlanOperativo(tipoEtapaModificacion, planOperativo);

                        // Si existe una excepción 
                        if(excepcionPlanificacion != null){
                            

                            /****************************************************************************/
                            // VALIDACIÓN-05: Existen Plan Operativos Duplicados
                            /****************************************************************************/
                            // Preguntamos si existen planes Operativos Duplicados
                            // True: Pinte el botón
                            // False: No pinte el botón
                            return existePlanOperativoDuplicado (tipoEtapaModificacion, planOperativo, excepcionPlanificacion.getEtapaPlan());
                            
                        }

                    }

                }

            }

        }

        
        // *************************************************   
        // Si una condición no se cumple no pinte el botón
        // *************************************************
        return false;

    }

    
    /**
     * 
     * Método que retorna una excepción de Planificación Si existe para un Tipo de Etapa Y Plan Operativo
     * 
     * @param tipoEtapa: Tipo de Etapa
     * @param planOperativo: Plan Operativo
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return ExcepcionPlanificacion
     */

    @Override
    public ExcepcionPlanificacion findByTipoEtapaAndPlanOperativo(TipoEtapa tipoEtapa, PlanOperativo planOperativo){
        
        // Obtenemos la Fecha Actual
        Date fechaActual = new Date();

        // Obtenemos la lista de excepciones para una unidad Ejecutora para la fecha de hoy
        List<ExcepcionPlanificacion> listaExcepciones = excepcionPlanificacionService.findByUnidadEjecutoraAndFechaHoyBetween(planOperativo.getUnidadEjecutora(), fechaActual);

        // Si la lista no esta vacia
        if (!listaExcepciones.isEmpty()) {

            // Recorremos la lista
            for (ExcepcionPlanificacion excepcion : listaExcepciones) {

                // Si el tipo de etapa de la excepción ==  (modificacion)
                if (excepcion.getEtapaPlan().getTipoEtapa().equals(tipoEtapa)){

                    // Si el tipo de plan == tipo de Plan del plan operativo
                    if(excepcion.getEtapaPlan().getTipoPlan().equals(planOperativo.getTipoPlan())){

                        // Si el periodo anual del plan == periodo anual del plan
                        if(excepcion.getEtapaPlan().getPeriodoAnual().equals(planOperativo.getPeriodoAnual())){

                            // Retorne la excepción
                            return excepcion;
                        }
                    }
                }
               
            }
        }
        // No existen excepciones
        return null;

    }
    


    /**
     * 
     * Método que verifica si existe ya un Plan Operativo según:
     * 
     * @param tipoEtapa
     * @param planOperativo
     * @param etapaPlan
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return true (Existe un duplicado) / false (No existe duplicado)
     */

    @Override
    public boolean existePlanOperativoDuplicado (TipoEtapa tipoEtapa, PlanOperativo planOperativo, EtapaPlan etapaPlan ){

        
        // Obtener Lista de Planes Operativos Duplicados según el Tipo de Etapa (Modificación) y Etapa Plan (Modificación) 
        List <PlanOperativo> listaPlanOperativoDuplicados = this.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(tipoEtapa, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(),planOperativo.getPeriodoAnual(),etapaPlan, planOperativo.getUnidadEjecutora());

        // Si la lista no esta vacia
        if (!listaPlanOperativoDuplicados.isEmpty()) {

            // Recorremos la lista 
            for (PlanOperativo planOperativoDuplicado : listaPlanOperativoDuplicados) {

               
                // Si el plan Operativo Duplicado su Estado de Fomulación es diferente de "Anulado"
                if(!planOperativoDuplicado.getEstadoFormulacionOpe().equals(estadoFormulacionOpeService.obtenerEstadoAnulado()) ){


                    // Return false
                    return false;
                }
            }
        }

        // Si la lista esta vacia (NO existe dupicados)
        return true;
    }

    /**
     * 
     * Método que retorna una lista de Planes Operativos según:
     * 
     * @param tipoEtapa
     * @param tipoPlan
     * @param tipoPlanOperativo
     * @param periodoAnual
     * @param etapaPlan
     * @param unidadEjecutora
     * 
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return List<PlanOperativo>
     */
    @Override
    public List <PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora) {

        // Llamamos al repository
        return repository.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(tipoEtapa, tipoPlan, tipoPlanOperativo, periodoAnual, etapaPlan, unidadEjecutora);
    }


    /**
     * 
     * Método que retorna una lista de Planes Operativos según:
     * 
     * @param tipoEtapa
     * @param tipoPlan
     * @param tipoPlanOperativo
     * @param periodoAnual
     * @param etapaPlan
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return true (Existe un duplicado) / false (No existe duplicado)
     */
    public void duplicarPlanOperativoDesdeButton(PlanOperativo planOperativo) {


        
        // Obtenemos el Tipo de Etapa Modificación
        TipoEtapa tipoEtapaModificacion = tipoEtapaService.obtenerTipoEtapaModificacion();

        // Obtenemos la Etapa Plan de modificación según:
        // TipoEtapa:  Modificación
        // TipoPlan: planOperativo.getTipoPlan()
        // TipoPlanOperativo: planOperativo.getTipoPlanOperativo()
        // PeriodoAnual: planOperativo.getPeriodoAnual()
        EtapaPlan etapaPlan =  etapaPlanService.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapaModificacion, planOperativo.getTipoPlan(), planOperativo.getTipoPlanOperativo(), planOperativo.getPeriodoAnual());

        // Si Etapa Plan == null es porque las fechas de la etapa pasarón y se debe obtener por excepción
        if(etapaPlan == null){
            
            // Preguntamos si existe una Excepción para el Plan Operativo con Etapa de Modificación
            ExcepcionPlanificacion excepcionPlanificacion = findByTipoEtapaAndPlanOperativo(tipoEtapaModificacion, planOperativo);

            // Si existe una excepción 
            if(excepcionPlanificacion != null){

                // Obtenga la etapa Plan de la excepción
                etapaPlan = excepcionPlanificacion.getEtapaPlan();
            }
        }

        // mandamos a duplicar el plans
        duplicaPlanOpertativo(planOperativo, etapaPlan);
    }


    /**
     * 
     * Método que duplica un Plan Operativo:
     * 
     * @param planOperativo Plan operativo a Duplicar
     * @param etapaPlan  Etapa del Plan    
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return 
     */
    public void duplicaPlanOpertativo(PlanOperativo planOperativo, EtapaPlan etapaPlan) {

        // Obtenemos el estado de borrador
        EstadoFormulacionOpe estadoBorrador = estadoFormulacionOpeService.obtenerEstadoBorrador();

        // Obtenemos el Periodo Anual en Ejecución
        PeriodoAnual periodoAnualEjecucion = periodoAnualService.findAnoEjecucion();

        // Creamos un nuevo Plan operativo Temporal
        PlanOperativo planOperativoTMP = new PlanOperativo();

        // Cargamos en el nuevo Plan Operativo los valores del Plan Operativo a Duplicar
        planOperativoTMP.setCodigo(this.obtenerSiguienteConsecutivo(periodoAnualEjecucion));
        planOperativoTMP.setUnidadEjecutora(planOperativo.getUnidadEjecutora());
        planOperativoTMP.setPeriodoAnual(planOperativo.getPeriodoAnual());
        planOperativoTMP.setTipoPlanOperativo(planOperativo.getTipoPlanOperativo());
        planOperativoTMP.setTipoPlan(planOperativo.getTipoPlan());
        planOperativoTMP.setEtapaPlan(etapaPlan);
        planOperativoTMP.setTipoEtapa(etapaPlan.getTipoEtapa());
        planOperativoTMP.setFechaAprobacion(null);
        planOperativoTMP.setPresupuestoFormulado(planOperativo.getPresupuestoFormulado());
        planOperativoTMP.setActivo(false);
        planOperativoTMP.setEstadoFormulacionOpe(estadoBorrador);

     

        // Mandamos a guardar el Plan Operativo Temporal
        PlanOperativo planOperativoNuevo = this.saveWithoutStartingFlow(planOperativoTMP);

        // Mandamos a iniciar el flujo de este Nuevo Plan Operativo Borrador
        this.iniciarFlujo(planOperativoNuevo);

        // Mandamos a Guardar los objetivos POA
        guardarObjetivosPoa(planOperativo.getListaObjetivosPOA(), planOperativoNuevo);

        // Obtenemos la Lista de Objetivos POA
        List<ObjetivoPOA> listaObjetivosActualizados = objetivoPOAService.findObjetivoPoaByPlanOperativo(planOperativoNuevo);


        // Proceso de recorrer los Objetivos para guardar las metas POA
        for (ObjetivoPOA objetivo : planOperativo.getListaObjetivosPOA()) {

            for (ObjetivoPOA objetivoNuevo : listaObjetivosActualizados) {

                if (objetivo.getCodigo().equals(objetivoNuevo.getCodigo())) {

                    guardarMetasPoa(objetivo.getListaMetasPoa(), objetivoNuevo);

                }
            }
        }

        

    }

PlanOperativoService.java (Final)

/**
     * 
     * Definición que muestra el botón de "Duplicar Plan Operativo" según las siguientes validaciones:
     * 
     * 01. El usuario no puede tener el rol de UNA_PPI_PPO_CONSULTA_TOTAL
     * 02. El plan Operativo debe estar Activo
     * 03· El Periodo Anual del Plan Operativo debe ser igual al Periodo Actual en Ejecución
     * 04. Existe una etapa de Modificación
     * 05. Existen Plan Operativos Duplicados
     * 06. Existen Etapas de Planificación con Excepciones
     *
     * @param planOperativo
     * @author Gustavo Matamoros González
     * @since 12/01/2023
     * @issue: PPI-267
     * @return true (Pintar botón) / false (No pintar botón)
     */
    public boolean renderButtonDuplicarPlanOperativo(PlanOperativo planOperativo);

    /**
     * 
     * Método que retorna una excepción de Planificación Si existe para un Tipo de Etapa Y Plan Operativo
     * 
     * @param tipoEtapa: Tipo de Etapa
     * @param planOperativo: Plan Operativo
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return ExcepcionPlanificacion
     */
    public ExcepcionPlanificacion findByTipoEtapaAndPlanOperativo(TipoEtapa tipoEtapa, PlanOperativo planOperativo);


    /**
     * 
     * Método que verifica si existe ya un Plan Operativo según:
     * 
     * @param tipoEtapa
     * @param planOperativo
     * @param etapaPlan
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return true (Existe un duplicado) / false (No existe duplicado)
     */
    public boolean existePlanOperativoDuplicado (TipoEtapa tipoEtapa, PlanOperativo planOperativo, EtapaPlan etapaPlan );


    /**
     * 
     * Método que retorna una lista de Planes Operativos según:
     * 
     * @param tipoEtapa
     * @param tipoPlan
     * @param tipoPlanOperativo
     * @param periodoAnual
     * @param etapaPlan
     * @param unidadEjecutora
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return List<PlanOperativo>
     */
    public List <PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora);







    /**
     * 
     * Método que retorna una lista de Planes Operativos según:
     * 
     * @param tipoEtapa
     * @param tipoPlan
     * @param tipoPlanOperativo
     * @param periodoAnual
     * @param etapaPlan
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return true (Existe un duplicado) / false (No existe duplicado)
     */
    public void duplicarPlanOperativoDesdeButton(PlanOperativo planOperativo);

PlanOperativoRepository.java (final)

/**
     * 
     * Defnición que retorna una lista de Planes Operativos según:
     * 
     * @param tipoEtapa
     * @param tipoPlan
     * @param tipoPlanOperativo
     * @param periodoAnual
     * @param etapaPlan
     * @param unidadEjecutora
     * @author Gustavo Matamoros González
     * @since 17/01/2023
     * @issue: PPI-267
     * @return List<PlanOperativo>
     */
    public List<PlanOperativo> findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndEtapaPlanAndUnidadEjecutora (TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual, EtapaPlan etapaPlan, UnidadEjecutora unidadEjecutora);
  • Ademas se tuvo que trabajar en uns funciones de Etpa Plan

EtapaPlanRepository.java (final)

/**
     * Definición que obtiene una Etapa Plan de acuerdo a:
     * Tipo de Etapa
     * Tipo Plan
     * Tipo Plan Operativo
     * Periodo Anual
     * Fecha Actual este entre Fecha_Inicial y Fecha_Final
     * 
     * @author Gustavo Matamoros González
     * @param tipoEtapa: Tipo de Etapa a consultar
     * @param tipoPlan: Tipo de Plan a consultar
     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar
     * @param periodoAnual; Periodo Anual a consultar
     * @return EtapaPlan
     * @since 13/01/2023
     * @issue: PPI-267
     */
    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo,PeriodoAnual periodoAnual, Date fechaActualInicial, Date fechaActualFinal);

EtapaPlanService.java (Final)

 /**
     * Definición que obtiene una Etapa Plan de acuerdo a:
     * Tipo de Etapa
     * Tipo Plan
     * Tipo Plan Operativo
     * Periodo Anual
     * Fecha Actual este entre Fecha_Inicial y Fecha_Final
     * 
     * @author Gustavo Matamoros González
     * @param tipoEtapa: Tipo de Etapa a consultar
     * @param tipoPlan: Tipo de Plan a consultar
     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar
     * @param periodoAnual; Periodo Anual a consultar
     * @return EtapaPlan
     * @since 13/01/2023
     * @issue: PPI-267
     */
    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual);

EtapaPlanServiceImpl.java (Final)

/**
     * Método que obtiene una Etapa Plan de acuerdo a:
     * Tipo de Etapa
     * Tipo Plan
     * Tipo Plan Operativo
     * Periodo Anual
     * Fecha Actual este entre Fecha_Inicial y Fecha_Final
     * 
     * @author Gustavo Matamoros González
     * @param tipoEtapa: Tipo de Etapa a consultar
     * @param tipoPlan: Tipo de Plan a consultar
     * @param tipoPlanOperativo: Tipo de Plan Operativo a consultar
     * @param periodoAnual; Periodo Anual a consultar
     * @return EtapaPlan
     * @since 13/01/2023
     * @issue: PPI-267
     */
    
    @Override
    public EtapaPlan findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(TipoEtapa tipoEtapa, TipoPlan tipoPlan, TipoPlanOperativo tipoPlanOperativo, PeriodoAnual periodoAnual) {

        // obtener fecha actual
        Date fechaActual = new Date();

        // Ejecutar función del repository
        return repository.findByTipoEtapaAndTipoPlanAndTipoPlanOperativoAndPeriodoAnualAndFechaInicialLessThanEqualAndFechaFinalGreaterThanEqual(tipoEtapa, tipoPlan, tipoPlanOperativo, periodoAnual, fechaActual, fechaActual);
    }

TipoEtapaServiceImpl.java (Final)

/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Método que devuelve el TipoEtapa de acuerdo al parametro param_ppi_ppo_tipoEtapa_modificacion
     *
     * @return: TipoEtapa
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 13/01/2023
     * @fechaModificacion: 13/01/2023
     * @módulo: PPI-PPE
     * @issue: PPI-267
     */
    @Override
    public TipoEtapa obtenerTipoEtapaModificacion(){
        return findTipoEtapaByParametro("param_ppi_ppo_tipoEtapa_modificacion");
    }