SIGESA: Validaciones de Fechas y configuración de min y max de fechas para componente PrimeFaces calendar

    Configuración de fechas Min y Max

    • Para este caso vamos a utilizar una función que obtiene la fecha Inicio y Fin de del añoFormulación de PeriodoAnualService

    MetaPOAIService.java

    • Agregamos los imports necesarios
    import java.util.Date;
    import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
    • Se definen dos métodos
    • El primero obtiene el periodo Anual de Formulación
    • Y el segundo que valida si la fecha inicial es menor que la Fecha Final
    /**
         * Método que retorna el PeriodoAnual de Formulación
         *
         * @return:PeriodoAnual
         *
         * @author Gustavo Matamoros González
         * @sice: 20/09/2023
         * @issue: BTPPI-299
         */
        public PeriodoAnual obtenerPeriodoAnualFormulacion();
    
        /**
         * Validación que verifica si la fecha Final esta antes de la Fecha Inicio
         *
         * @return:PeriodoAnual
         *
         * @author Gustavo Matamoros G.
         * @param annofechaInicial
         * @param annofechaFinal
         * @sice: 20/09/2023
         * @issue: BTPPI-299
         */
        public void validarFechaInicioMenorQueFechaFin(Date FechaInicio, Date FechaFin) throws Exception;

    MetaPOAIServiceImpl.java

    • Importamos las dependencias
    import java.util.Date;
    import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
    import cr.ac.una.cgi.sigesa.epf.cpr.service.PeriodoAnualService;
    • Creamos el Autowired
    @Autowired
    PeriodoAnualService periodoAnualService;
    • Creamos los métodos
    /*
         * Ver {@link MetaPOAIService#obtenerPeriodoAnualFormulacion}
         */
        @Override
        public PeriodoAnual obtenerPeriodoAnualFormulacion(){
            return periodoAnualService.findAnoFormulacion();
        }
    
        /****************************************************************************************/
        /****************************************************************************************/
        /*****************************    VALIDACIONES     **************************************/
        /****************************************************************************************/
        /****************************************************************************************/
        
    
        /**********************************************************************/
        /*********** VALIDACIÓN: Fecha Inicial < Fecha Fin        *************/
        /**********************************************************************/
        /*
         * Ver {@link MetaPOAIService#validarFechaFinal}
         */
    
        @Override
        public void validarFechaInicioMenorQueFechaFin(Date FechaInicio, Date FechaFin) throws Exception {
     
     
             // VALIDACIÓN: Las variables existen
             if((FechaInicio != null) && (FechaFin != null)){
     
                 // VALIDACIÓN: FechaInicio > FechaFin
                 if (FechaFin.before(FechaInicio)) {
     
                     // MENSAJES: cause y message
                     Throwable cause = new Throwable(getI18n("metaPOAI_message_error_validacion_fechas_detail"));
                     throw new Exception(getI18n("metaPOAI_message_error_validacion_fechas_summary"), cause);
     
                 }
             }
     
        }

      MetaPOAIBean.java

      • Imports
      import cr.ac.una.cgi.sigesa.epf.cpr.domain.PeriodoAnual;
      
      • Creamos las variables necesarias
      /* Periodo Anual Formulación */
      private PeriodoAnual periodoAnualFormulacion;
      private String calendarioFechaInicio;
      private String calendarioFechaFin;
      • Y en la función Init() obtenemos el periodoAnualFormulacion
      /****************************************************************/
      // Obtener Periodo Anual de Formulación
      /****************************************************************/
      periodoAnualFormulacion = service.obtenerPeriodoAnualFormulacion();
      calendarioFechaInicio = (new SimpleDateFormat("dd/MM/yyyy").format(periodoAnualFormulacion.getFechaInicio()));
      calendarioFechaFin = (new SimpleDateFormat("dd/MM/yyyy").format(periodoAnualFormulacion.getFechaFin()));

      • Y creamos los get’s y set’s necesarios
      public PeriodoAnual getPeriodoAnualFormulacion() {
              return periodoAnualFormulacion;
          }
      
          public void setPeriodoAnualFormulacion(PeriodoAnual periodoAnualFormulacion) {
              this.periodoAnualFormulacion = periodoAnualFormulacion;
          }
          public String getCalendarioFechaInicio() {
              return calendarioFechaInicio;
          }
      
          public void setCalendarioFechaInicio(String calendarioFechaInicio) {
              this.calendarioFechaInicio = calendarioFechaInicio;
          }
      
          public String getCalendarioFechaFin() {
              return calendarioFechaFin;
          }
      
          public void setCalendarioFechaFin(String calendarioFechaFin) {
              this.calendarioFechaFin = calendarioFechaFin;
          }
      • Creamos el archivo en el ubicación PPO->WEB-> VIEW -> Validator
      • MetaPOAIValidator.java

      MetaPOAIValidator.java

      /*
       * Copyright (C) 2022.
       *
       * Centro de Gestion Informatica
       * Direccion de Tecnologias de la Informacion y Comunicacion
       * Universidad Nacional - Costa Rica
       * http://www.una.ac.cr
       * 
       */
      /**********************************************************************/
      /*********************       PACKAGE     ******************************/
      /**********************************************************************/
      package cr.ac.una.cgi.sigesa.ppi.ppo.view.validator;
      
      /**********************************************************************/
      /*********************       IMPORT'S    ******************************/
      /**********************************************************************/
      import cr.ac.una.cgi.sdkuna.view.controller.MessagesController;
      import javax.faces.application.FacesMessage;
      import javax.faces.component.UIComponent;
      import javax.faces.context.FacesContext;
      import javax.faces.validator.Validator;
      import javax.faces.validator.ValidatorException;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.context.annotation.Scope;
      import org.springframework.stereotype.Component;
      
      import cr.ac.una.cgi.sigesa.ppi.ppo.domain.MetaPOAI;
      import cr.ac.una.cgi.sigesa.ppi.ppo.service.MetaPOAIService;
      
      /**********************************************************************/
      /*********************   DOCUMENTACIÓN   ******************************/
      /**********************************************************************/
      /**
       *
       * @author Gustavo Matamoros González
       * @version 0.0.1
       * 20/09/2023
       *
       */
      @Component
      @Scope("request")
      public class MetaPOAIValidator implements Validator{
          
          @Autowired
          MessagesController messagesController;
          
          @Autowired
          MetaPOAIService metaPOAIService;
          
          @Override
          public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException{
            
              // Obtenemos la meta por trabajar
              MetaPOAI metaPOAI = (MetaPOAI) component.getAttributes().get("metaPOAI");
      
              // Si es null regrese
              if(metaPOAI == null){
                  return;
              }
              try {            
                  /*******************************************************************/
                  // VALIDACIÓN: fechaInicial < fechaFinal
                  /*******************************************************************/
                  metaPOAIService.validarFechaInicioMenorQueFechaFin(metaPOAI.getFechaInicial(), metaPOAI.getFechaFinal());
              } catch (Exception exception) {
                  String summary = exception.getMessage();
                  String detail = exception.getCause().getMessage();
                  messagesController.addError(summary, detail);
                  throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));
              }
      
          }
      }
      

      metaPOAIEditForm.xhtml

      • De bajo de
       <components:requiredInstructions focus="panelForm" />
      • Agregamos el llamado al archivo de validación
      <!--####################################################################################-->
                  <!--########################       VALIDACIÓN               ############################-->
                  <!--####################################################################################-->
      
                  <!--Entrada oculta para validaciones-->
                  <h:inputHidden id="metaPOAIValidator" value="true" >
                      <f:attribute name="metaPOAI" value="#{metaPOAIBean.entity}"/>
                      <f:validator binding="#{metaPOAIValidator}" />
                  </h:inputHidden>
      • Y a la fecha inicial y final les agregamos
      mindate="#{metaPOAIBean.calendarioFechaInicio}" 
                                      maxdate="#{metaPOAIBean.calendarioFechaFin}">
      • Quedando así
      <!-- Fecha Inicial -->
                      <p:outputLabel id="fechaInicialOutputLabel"
                                     for="fechaInicialCalendar"
                                     value="#{i18n.metaPoai_fechaInicial_label}" />
                      <p:outputPanel>
                          <p:calendar id="fechaInicialCalendar"
                                      value="#{metaPOAIBean.entity.fechaInicial}"
                                      showOn="button"
                                      locale="es"
                                      pattern="dd/MM/yyyy"
                                      required="true"
                                      navigator="true"
                                      timeZone="America/Costa_Rica"
                                      mindate="#{metaPOAIBean.calendarioFechaInicio}" 
                                      maxdate="#{metaPOAIBean.calendarioFechaFin}">
                              <p:ajax event="dateSelect"
                                      process="@this" />
                          </p:calendar>
                          <p:message id="fechaInicialMessage"
                                     for="fechaInicialCalendar" />
                      </p:outputPanel>
      
                      <!-- Fecha Final -->
                      <p:outputLabel id="fechaFinalOutputLabel"
                                     for="fechaFinalCalendar"
                                     value="#{i18n.metaPoai_fechaFinal_label}" />
                      <p:outputPanel>
                          <p:calendar id="fechaFinalCalendar"
                                      value="#{metaPOAIBean.entity.fechaFinal}"
                                      showOn="button"
                                      locale="es"
                                      required="true"
                                      pattern="dd/MM/yyyy"
                                      navigator="true"
                                      timeZone="America/Costa_Rica"
                                      mindate="#{metaPOAIBean.calendarioFechaInicio}" 
                                      maxdate="#{metaPOAIBean.calendarioFechaFin}">
                              <p:ajax event="dateSelect"
                                      process="@this" />
                          </p:calendar>
                          <p:message id="fechaFinalMessage"
                                     for="fechaFinalCalendar" />
                      </p:outputPanel>