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);
- Los iconos se pueden encontrar en
- https://universidadnacional.atlassian.net/wiki/spaces/CGI/pages/2384396295/Migraci+n+de+SDKUNA+1.x+a+SDKUNA+2.x
- Ahora agregamos el texto de internacionalización
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");
}