CGI: Capacitación FrameWork SK-UNA SIGESA

  • En el siguiente documento se explica como crear un CRUD de un mantenimiento de una tabla en SIGESA
  • http://10.0.100.30:8080/sigesa-webapp

Instalación de programas

  • Para esto debemos tener disponible SQLDeveloper 21.4.2 y la versión 1.8 de java

Java 1.8

  • Para instalar java 8 ejecutamos
sudo apt-get install openjdk-8-jdk openjfx -y

SQL Developer

  • Para esto debemos tener disponible SQLDeveloper y la versión 1.8 de java
  • Descargamos el programa SQLDeveloper
  • Luego para poder configurarlo debemos descargar la carpeta oculta de configuración UNA-SQLDeveloper que la podemos descargar de aquí
  • Una vez descargado debemos moverlos a la carpeta /home/usuario
  • Luego descomprimimos ambos archivos y dentro del archivo de configuración existe una carpeta oculta «.sqldeveloper» que debemos mover de ubicación a /home/usuario
  • Quedando así
  • Ahora para ejecutar el programa
  • Para poder ejecutar la aplicación debemos abrir una terminal en la ubicación del programa sqldeveloper
cd /home/tavo/sqldeveloper/
o
cd /home/cgi/sqldeveloper/
  • Ahora debos establecer java 1.8 como defecto para esto ejecutamos
sudo update-alternatives --config java
  • Nos listará las versiones de java instaladas
  • Seleccionamos la versón java 1.8 (5)

Variable JAVA_HOME

  • Para crear la variable JAVA_HOME abrimos
sudo nano /etc/environment
  • Agregamos al final del archivo
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_333
  • Recargamos
source /etc/environment
  • Ejecutamos
echo $JAVA_HOME
  • Resultado
/usr/lib/jvm/jdk1.8.0_333
  • Podemos verificar la versión
java -version
javac -version
  • Resultado
javac -version
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)
javac 18.0.2-ea
  • Y ahora volvemos a la carpeta del SQLDeveloper
cd /home/tavo/sqldeveloper
o
cd /home/cgi/sqldeveloper
  • Volvemos a ejecutar
./sqldeveloper.sh
  • Y luego ejecutar el siguiente comando para ejecutar el programa
  • Así nos abre el programa ya con la conexiones necesarias
  • Para crear una acceso directo al programa
sudo gedit /usr/share/applications/sqldeveloper.desktop
  • Le agregamos
[Desktop Entry]
Name=SQL Developer
Comment=Editor Python HTML
Exec=/home/tavo/sqldeveloper/sqldeveloper.sh
Icon=/home/tavo/sqldeveloper/icon.icns
Terminal=false
Type=Application
  • Y listo

Encabezado

  • Para la capacitación vamos a crear la siguiente estructura de tabla

Dia 01: Paso #01: Creación de tabla

  • Una vez que tenemos la conexión a la BD
  • Ingresamos a la BD sigesa_desa01_adm haciendo clic sobre lla y nos abre el editor de consultas
  • Y aquí podemos crear nuestra tabla
/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM CLIENTE_TAVO;

/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."CLIENTE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_CLIENTE_TAVO"       number (19,0)       NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "CEDULA"                VARCHAR2(11)        NOT NULL ENABLE,
    "NOMBRE"                VARCHAR2(120)       NOT NULL ENABLE,
    "FECHA_NACIMIENTO"      DATE                NOT NULL ENABLE,
    "ACTIVO"                NUMBER(1,0)         NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"        DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"      NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"    DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"  NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"               NUMBER(19,0),
    "CAMPO_CONFIGURABLE"    NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_CLIENTE_TAVO" PRIMARY KEY("ID_CLIENTE_TAVO"),
    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_CLI_TAV_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_CLI_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_CLI_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."CEDULA"             IS 'Número de identificación del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."NOMBRE"             IS 'Nombre completo del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."FECHA_NACIMIENTO"   IS 'Fecha de nacimiento del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."ACTIVO"             IS '1 = Activo / 0 = Inactivo';


/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_CLIENTE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM CLIENTE_TAVO FOR "PBS"."CLIENTE_TAVO";
CREATE PUBLIC SYNONYM SQ_CLIENTE_TAVO FOR PBS.SQ_CLIENTE_TAVO;


/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM CLIENTE_TAVO;


/********************************************************/
/********************************************************/
/* ELIMINAR TABLA                                       */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_CLIENTE_TAVO;
DROP PUBLIC SYNONYM CLIENTE_TAVO;
DROP PUBLIC SYNONYM SQ_CLIENTE_TAVO;
DROP TABLE "PBS".CLIENTE_TAVO;

/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.CLIENTE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_CLIENTE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."CLIENTE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";
  • Quedando así
  • Para ejecutar la consulta podemos hacer
CTRL+ENTER
  • O en el icono

NOTAS: Importantes

Estándar de Nombres

Tablas y campos

  • Los nombres de las tablas se manejan en singular
  • Si esta compuesto de más de un nombre lo podemos separar por «_»
  • Se deben poner los campos en mayúscula
  • Todos los campos que sean ID deben ser de tipo NUMBER(19,0) y deben empesar por «ID_»
"ID_CLIENTE_TAVO"       number (19,0)       NOT NULL ENABLE,
  • Para campos boolean se utiliza
NUMBER(1,0)         NOT NULL ENABLE,
  • Para crear llaves primarias
/********************************************************/
/* LLAVE: PRIMARIA                                      */
/********************************************************/
CONSTRAINT "PK_CLIENTE_TAVO" PRIMARY KEY("ID_CLIENTE_TAVO"),
  • Luego por el framework SDK-UNA debemos agregar los siguientes campos en TODAS las Tablas
/********************************************************/
/* CAMPOS: FRAMEWORK SDK-UNA                            */
/********************************************************/
    "FECHA_CREACION"        DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"      NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"    DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"  NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"               NUMBER(19,0),
    "CAMPO_CONFIGURABLE"    NUMBER(19,0),
  • Y además se debe agregar las llaves foraneas a los campos del Framework
  • Todas las llaves foraneas deben iniciar en FK_
  • Y solo deben tener 3 letras por significado «FK_CLI_TAV_USU_CRE»
/********************************************************/
/* LLAVE: FORANEAS                                      */
/********************************************************/
CONSTRAINT FK_CLI_TAV_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
CONSTRAINT FK_CLI_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
CONSTRAINT FK_CLI_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)

Comentarios

  • Además es necesario agregar comentarios a TODOS los campos para esto
/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."CEDULA"             IS 'Número de identificación del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."NOMBRE"             IS 'Nombre completo del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."FECHA_NACIMIENTO"   IS 'Fecha de nacimiento del cliente';
COMMENT ON COLUMN "PBS"."CLIENTE_TAVO"."ACTIVO"             IS '1 = Activo / 0 = Inactivo';

Secuencia

  • Aquí es importate que el siguiente código, este crea una secuencia que indica que el id de la tabla debe comenzar en 1 y se debe incrementar en 1
  • El nombre de la secuencia debe iniciar con «SQ_»
/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_CLIENTE_TAVO START WITH 1 INCREMENT BY 1;

Sinónimos

  • Además para que la tabla pueda ser visible y no sea necesario agregar el Esquema para su consumo creamos los siguientes sinónimos
/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM CLIENTE_TAVO FOR "PBS"."CLIENTE_TAVO";
CREATE PUBLIC SYNONYM SQ_CLIENTE_TAVO FOR PBS.SQ_CLIENTE_TAVO;

Permisos

  • Se le debe otrogar los siguientes permisos sobre la tabla a los siguientes usuarios
/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.CLIENTE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_CLIENTE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."CLIENTE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";

NOTA Aggregator (JPA)

  • Dentro del proyecto SIGESA existen una serie de proyecto entre ellos uno de nombre AGGREGATOR
  • Dentro de este proyecto en la ruta sigesa-jpa->src->main->java->cr->ac->una-cgi->sigesa
  • Se encuentran todas las definiciones de las Entity’s que utilizan los diferentes proyectos
  • Para nuestro proyecto vamos a trabajar en el módulos de PBS (Proveduría) ->ABS
  • Por esto debemos ubicar la carperta de PBS->ABS y dentro de esta existen dos carpetas
    • domain
    • repository
  • Dominio: es donde debemos crear la CLASE Entity para la tabla que hemos creado
  • Repository: es donde debemos creare la interfaz para esa clase

Paso #02: DOMAIN->Clase Entity

  • Dentro de la carpeta domain del módulo creamos una nueva clase donde vamos a relacionar la tabla que creamos
  • Agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.domain;



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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


// *********************************************************************
// Para hacer mapeos
// *********************************************************************
// import javax.persistence.ManyToOne;
// import javax.persistence.FetchType;
// import javax.persistence.JoinColumn;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import javax.persistence.Temporal;

/**
 * Entity para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González´
 * @fecha 06/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "CLIENTE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id",         column = @Column(name = "ID_CLIENTE_TAVO"))
´´
// Relacionamos la secuencia
@SequenceGenerator(name = "sequence",   sequenceName = "SQ_CLIENTE_TAVO", allocationSize = 1)


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavo extends BaseEntity<Usuario, CampoConfigurable> {




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Cedula
    @Column(name = "CEDULA")
    private String cedula;

    // Nombre
    @Column(name = "NOMBRE")
    private String nombre;

    // Fecha de Nacimiento
    @Column(name = "FECHA_NACIMIENTO")´´´
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fechaNacimiento;

    // Activo: 1 = activo / 0 = Inactivo
    @Column(name = "ACTIVO")
    private Boolean activo;




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET       ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // Cedula
    // ***************************************
    public String getCedula() {
        return cedula;
    }

    public void setCedula(String cedula) {´´
        this.cedula = cedula;
    }

    // ***************************************
    // Nombre
    // ***************************************
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ***************************************
    // Fecha de Nacimiento
    // ***************************************
    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    // ***************************************
    // Activo
    // ***************************************
    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

   
}

/*****************************************************´´*****************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Notas: DOMAIN

  • FrameWork SDK-UNA, se deben agregar los siguientes import’s para poder utilizar el framework

´

  • Y para conexión de BD
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;´´
import javax.persistence.Table;
  • En cuanto a la configuración debemos establecer
  • @Entity: Definimos que es una entidad (tabla BD)
// Definimos que es una entidad (tabla BD)
@Entity
  • @Table: es donde indicamos el nombre de la tabla
@Table(name = "CLIENTE_TAVO")
  • @AttributeOverride / ID: es donde indicamos que debemos hacer una sobre escritura del campos id de la tabla (ID_CLIENTE_TAVO) para que se interprete como «id»´
@AttributeOverride(name = "id",         column = @Column(name = "ID_CLIENTE_TAVO"))
  • @SequenceGenerator: es donde relacionamos la entidad con la secuencia respectiva
@SequenceGenerator(name = "sequence",   sequenceName = "SQ_CLIENTE_TAVO", allocationSize = 1)
  • Ahora es importrante indicar que la clase ba extender de dos clases del SDK-UNA:
    • Usuario: es utilizado por SDK-UNA para obtener los datos del usuario actual
    • CampoConfigurable: es utilizado por SDK-UNA para obtener los campos que tienen alguna configuración
  • A nivel del código lo que se debe hacer es:
public class ClienteTavo extends BaseEntity<Usuario, CampoConfigurable> {
  • Luego pasamos a la definicipón de los atributos donde:
    • Donde debemos crear la relación del campo de la BD y el nombre del atributo que vamos a utilizar en la aplicación
    • NOTA: los atributos deben venir sin espacios y la primera letra en minuscula
// Cedula
@Column(name = "CEDULA")
private String cedula;
  • Y finalmente debemos hacer los get y set de los campos
  • vs code java crear get y set hacemos clic derecho ->Sourtce Action -> Generate Getters and Setters

´

  • Y los generamos
// ***************************************
    // Cedula
    // ***************************************
    public String getCedula() {
        return cedula;
    }

    public void setCedula(String cedula) {
        this.cedula = cedula;
    }

Paso #03: Repository

  • Ahora dentro del AGGREGATOR->Proyecto(sigesa->jpa->src->main->java->cr->ac->una->cgi->sigesa->pbs->abs->repository)->repository (ACTULIZAR RUTA)
  • Debemos crear una interfaz para el manejo de la tabla CLIENTE_TAVO
  • Creamos una interfaz
  • Para facilitar la creación de dnetro del pulgin SDK-UNA ya existe una funcionalidad que nos permite crear la interfaz UNA-Templates->Repository
  • Luego nos abre una ventana para digitar su nombre
  • NOTA: para SIGESA el nombre que se le debe dar es NombreClaseRepository.java pera la aplicación agrega Repository.java así que es solo dar el nombre
  • Y nos crea la plantilla, para nuestro ejemplo queda así
/*
 * 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.pbs.abs.repository;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Repository;



/**
 * Repository para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Estable que es un repositorio
@Repository

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface ClienteTavoRepository extends GenericRepository<ClienteTavo> {
   
    
}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/
  • Ahora dentro de esta clase es donde debemos crear las consultas adicionales (que no son de una mantenimiento normal),
  • Es importante que estas consultas deben seguir el siguiente uso de prioridad
    • Consultas find:
      • Para documentación https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
      • Son consutas de Spring que nos ofrecen con un idioma humano
      • Son el primer tipo que debemos tratar de generar
      • Esta consultas pueden devolver listas o pages
        • Listas: son más faciles de trabajar List<ClienteTavo>
        • Page: son el tipo de datos que requiere SIGESA para para hacer los listas y poder paginar, sin embargo para un mantenimiento normal no es necesario crear ninguno ya que el FrameWork lo hace
    • Ejemplos:
public List<Cliente> findAllByApellidosIgnoreCaseLike(String apellidos);    
   
public List<Cliente> findAllByFechaDeNacimiento(Date fechaDeNacimiento);
   
public List<Cliente> findAllByApellidosIgnoreCaseLikeAndFechaDeNacimiento(String apellidos, Date fechaDeNacimiento);  
   
public List<Cliente> findAllByApellidosIgnoreCaseLikeOrFechaDeNacimiento(String apellidos, Date fechaDeNacimiento);  
   
public Cliente findOneByNombre(String nombre);
   
public List<Cliente> findAllByViva(Boolean viva);
   
public List<Cliente> findAllByVivaTrue();
   
public List<Cliente> findAllByVivaFalse();
   
public List<Cliente> findTop3ByApellidosIgnoreCaseLike(String apellidos);

public List<Cliente> findAllByFechaDeNacimientoOrderByNombre(Date fechaDeNacimiento);  
   
public List<Cliente> findAllByFechaDeNacimientoAndVivaAndApellidosIgnoreCaseLikeOrderByNombre
        (Date fechaDeNacimiento, Boolean viva, String apellidos);  
       
public List<Cliente> findAllByFechaDeNacimientoBetween(Date fechaInicio, Date fechaFin);
   
public Page<Cliente> findAllByViva(Boolean viva, Pageable pageable);
  • Consultas HQL:
    • Son el segundo tipo de consultas
    • Si las consultas find no son suficientes debemos pasar a este tipo de consultas
    • aquí podemos encontrar información

https://docs.jboss.org/hibernate/orm/3.5/reference/es-ES/html/queryhql.html

  @Query("select c as c from Cliente c where c.fechaDeNacimiento = :fechaDeNacimiento")
    public List<Cliente> findAllByFechaDeNacimientoConHQL(@Param("fechaDeNacimiento") Date fechaDeNacimiento);
   
    @Query("select c as c from Cliente c where c.nombre = :nombre and c.apellidos = :apellidos")
    public List<Cliente> findAllByNombreAndApellidosConHQL(@Param("nombre") String nombre, @Param("apellidos") String apellidos);
  • Consultas SQL:
    • estas consultas las debe aprobar ERICK
    • Y son consultas SQL
    • Ejemplos:
//NO USAR, es lo último de lo último
@Query(value = "select * from cliente where nombre = :nombre", nativeQuery = true)
public List<Cliente> findAllByNombreConSQL(@Param("nombre") String nombre);

Paso #04: Service

  • El siguiente paso es crear una interfaz para el servicio para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-interface-service
  • Aquí le damos UNA-Templates->Service y nos crea una plantilla (Solo debemos poner el nombre)
  • Para nuestro ejemplo
/*
 * 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.pbs.abs.service;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;


/**
 * Interface para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface ClienteTavoService extends EntityService<ClienteTavo> {

  
}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #05: Service Implementación

  • El siguiente paso es crear la implenetación del servicio creado anterior mente para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-service
  • Aquí le damos UNA-Templates->ServiceImpl y nos crea una plantilla (Solo debemos poner el nombre)
  • Para nuestro ejemplo
/*
 * 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.pbs.abs.service;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.repository.ClienteTavoRepository;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Clase que implementa el servicio {@link ClienteTavoService} para la entidad
 * {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

// Estabece que es un servicio
@Service

// Y que es de tipo transaccional
@Transactional

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoServiceImpl extends EntityServiceImpl<ClienteTavo, ClienteTavoRepository> implements ClienteTavoService {
 
   
}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #06: Bean

  • El bean es la clase que va relacionar la clase de acceso de datos con la interfaz web
  • El siguiente paso es crear el bean del servicio creado anteriormente para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->model
  • Aquí le damos UNA-Templates->CRUD y nos crea una plantilla (Solo debemos poner el nombre)
  • Para nuestro ejemplo
/*
 * 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.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.ClienteTavoService;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;


/**
 * Spring Bean Session para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoBean extends CRUDImpl<ClienteTavo, ClienteTavoService> implements CRUD {

    

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct

    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("cedula",           getI18n("cliente_cedula_label"),                true);
        CRUDColumn column2 = new CRUDColumn("nombre",           getI18n("cliente_nombre_label"),                true);
        CRUDColumn column3 = new CRUDColumn("fechaNacimiento",  getI18n("cliente_fechaNacimiento_label"),       true);
        CRUDColumn column4 = new CRUDColumn("activo",           getI18n("cliente_activo_label"),                true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #08: ListForm

  • El siguiente pao es crear el archivo LIstForm para crear la interfaz para el listado de la información
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->resources->META-INF->resources->pages
  • Aquí le damos UNA-Templates->ListForm y nos crea una plantilla (Solo debemos poner el nombre)
  • Para nuestro ejemplo
<!--
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: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="#{clienteTavoBean.list()}" />  
    </ui:define> 

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->




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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


    <!--********************************************************************************************-->
    <!--*****************************       DEFINE       *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="contentCRUD">
    
    
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar"
                            editMode="false"
                            bean="#{clienteTavoBean}"
                            listForm="clienteTavoListForm"
                            editForm="clienteTavoEditForm"          
                            backForm="clienteTavoListForm"
                            container="n++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->     
        <components:noEditTable id="noEditTable"
                                header="#{i18n.clienteTavo_list_form_table_header}"
                                bean="#{clienteTavoBean}"                              
                                editForm="clienteTavoEditForm"/>
    </ui:define>

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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

Paso #09: EditForm

El siguiente pao es crear el archivo EditForm para crear la interfaz para la edición de la información
sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->resources->META-INF->resources->pages

  • Aquí le damos UNA-Templates->EditForm y nos crea una plantilla (Solo debemos poner el nombre)
  • Para nuestro ejemplo
<!--
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:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:una="http://una.ac.cr/ui/components"
                xmlns:components="http://java.sun.com/jsf/composite/components">


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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->




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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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




        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar editMode="true"
                            bean="#{clienteTavoBean}"
                            listForm="clienteTavoListForm"
                            editForm="clienteTavoEditForm"
                            container="panelForm" />

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->


        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <una:panelForm id="panelForm"
                       binding="#{panelForm}"
                       header="#{i18n.clienteTavo_edit_form_header}">

            <!-------------------------------------------------------------------------------------------->
            <!------------------------------    INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <components:requiredInstructions focus="panelForm" />
            <!-------------------------------------------------------------------------------------------->
            <!----------------------------  FIN INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


            <!-------------------------------------------------------------------------------------------->
            <!------------------------------     PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <p:panelGrid columns="2" styleClass="una-panelgrid">                              

                
                <!--####################################################################################-->
                <!--#############################    CEDULA    #########################################-->
                <!--####################################################################################-->
               
                <!--LABEL-->
                <p:outputLabel id="cedulaClienteTavoOutputLabel"
                               for="cedulaClienteTavoInputText"
                               value="#{i18n.clienteTavo_cedula_label}"/>  
                <!--PANEL-->
                <p:outputPanel id="cedulaOutputPanel">
                    
                    <!--CAMPO-->
                    <p:inputText id="cedulaClienteTavoInputText"
                                 value="#{clienteTavoBean.entity.cedula}"
                                 required="true" maxlength="50" size="50"
                                 />    
                    
                    <!--MENSAJE-->
                    <p:message id="cedulaClienteTavoMessage"
                               for="cedulaClienteTavoInputText" />

                </p:outputPanel>

                <!--####################################################################################-->
                <!--####################################################################################-->
                <!--####################################################################################-->





                <!--####################################################################################-->
                <!--#############################    NOMBRE    #########################################-->
                <!--####################################################################################-->
               
                <!--LABEL-->
                <p:outputLabel id="nombreClienteTavoOutputLabel"
                               for="nombreClienteTavoInputText"
                               value="#{i18n.clienteTavo_nombre_label}"/>  

                <!--PANEL-->
                <p:outputPanel id="nombreOutputPanel">

                    <!--CAMPO-->
                    <p:inputText id="nombreClienteTavoInputText"
                                 value="#{clienteTavoBean.entity.nombre}"
                                 required="true" maxlength="50" size="50"
                                 />    

                    <!--MENSAJE-->
                    <p:message id="nombreClienteTavoMessage"
                               for="nombreClienteTavoInputText" />

                </p:outputPanel>
                <!--####################################################################################-->
                <!--####################################################################################-->
                <!--####################################################################################-->






                <!--####################################################################################-->
                <!--####################     FECHA DE NACIMIENTO    ####################################-->
                <!--####################################################################################-->
                
                <!--LABEL-->
                <p:outputLabel id="fechaNacimientoClienteTavoOutputLabel"
                               for="fechaNacimientoClienteTavoCalendar"
                               value="#{i18n.clienteTavo_fechaNacimiento_label}"/>  

                <!--PANEL-->
                <p:outputPanel id="fechaNacimientoOutputPanel">

                    <!--CAMPO-->
                    <p:calendar id="fechaNacimientoClienteTavoCalendar"
                                value="#{clienteTavoBean.entity.fechaNacimiento}"
                                showOn="button"
                                pattern="dd/MM/yyyy"
                                navigator="true"
                                locale="es"
                                size="50"
                                required="#{true}"
                                >
                    </p:calendar>

                    <!--MENSAJE-->
                    <p:message id="fechaNacimientoMessage"
                               for="fechaNacimientoClienteTavoCalendar" />

                </p:outputPanel>
                <!--####################################################################################-->
                <!--####################################################################################-->
                <!--####################################################################################-->



                <!--####################################################################################-->
                <!--####################           ACTIVO           ####################################-->
                <!--####################################################################################-->
                
                <!--LABEL-->
                <p:outputLabel id="activoClienteTavoOutputLabel"
                               for="activoClienteTavoSelectBooleanCheckbox"
                               value="#{i18n.clienteTavo_activo_label}"/>  

                <!--PANEL-->
                <p:outputPanel id="activoOutputPanel">

                    <!--CAMPO-->
                    <p:selectBooleanCheckbox id="activoClienteTavoSelectBooleanCheckbox"
                                             value="#{clienteTavoBean.entity.activo}"
                                             itemLabel="#{i18n.clienteTavo_activo_label}"
                                             required="#{true}">
                    </p:selectBooleanCheckbox>

                    <!--MENSAJE-->
                    <p:message id="activoMessage"
                               for="activoClienteTavoSelectBooleanCheckbox"/>
                    
                </p:outputPanel>
                <!--####################################################################################-->
                <!--####################################################################################-->
                <!--####################################################################################-->



                

            </p:panelGrid>
            <!-------------------------------------------------------------------------------------------->
            <!-----------------------------  FIN PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->

        </una:panelForm>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->


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

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

Paso #10: Registrar la página en SIGESA

  • Ingresamos a SAS Seguridad y Administración ->SAS Seguridad y Administración ->Lista de recursos
  • Luego ingresamos a Lista de Recursos
  • Nos lista los recursos existentes y le damos nuevo
  • Registramos la paginas con los siguientes datos
  • Le agregamos un rol de admin, para esto damos clic en el icono de nuevo
  • Agregamos el rol
  • Le damos agregar
  • Regresamos
  • Podemos verifciar que el rol se agrego
  • Ahora para que apliquen los cambios le damos guardar
  • Nos muestra el mensaje
  • Ahora para hacer el editar copiamos el registro
  • Nos indica que que el registro se copio
  • Ahora podemos crear el registro del EditForm
  • Verificamos que tenga el rol
  • Si si guardamos
  • Regresamos
  • Ahora podemos ingresar a la pagina ListForm ya que no se puede ingresar directamente a edit
  • Probamos el editar dandole clic al icono de nuevo
  • Nos aparece la ventana y completamos
  • Le damos guardar y nos muestra el mensaje
  • f

Proyecto

  • Tiene
    • Interface-service
    • Service
    • web

Inferce-Service

  • Para crear las definiciones

Service

  • Implementaciones
  • CTRL+SHIFT+I importar las librerias

Web

  • bean-> Model
    • controller
    • @Scope(«sSession»): el bean esta vivo mientras la sesión este abierta
    • metodo init
    • PostConstruct despues del constructor
  • Other Source
  • META-INF.resources.pages
  • XHTML-> En minuscula
  • Creamos lista y edit ListForm y EditForm
  • root-juan / xxxxxxxx 115080868
  • Sas->Sas-> Lista Recursos ->
  • /pages/clienteListFormxhtml
  • tipo recuros pagina
  • visible chec
  • secuencia 1
  • Estado activo
  • Roles Nuevo
  • rol ADMIn
  • Check todo
  • MAS icono
  • GUARDAR
  • hacerlos con LIstForm y EditForm
  • localhost:8080/sigesa-webapp/pages/clienteListForm.xhtml

Dia 02: Creación de tabla Relacionada

  • Ahora vamos a crear una tabla relaciona a la tabla CLIENTE_TAVO

  • Abrimos el SQL Developer y ejecutamos
/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM TIQUETE_TAVO;

/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."TIQUETE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_TIQUETE_TAVO"               NUMBER (19,0)       NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "CLIENTE"                       NUMBER (19,0)       NOT NULL ENABLE,
    "FECHA"                         DATE                NOT NULL ENABLE,
    "TOTAL"                         NUMBER(22,2)        NOT NULL ENABLE,

    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"                DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"              NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"            DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"          NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"                       NUMBER(19,0),
    "CAMPO_CONFIGURABLE"            NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_TIQUETE_TAVO" PRIMARY KEY("ID_TIQUETE_TAVO"),
    
    
    /********************************************************/
    /* LLAVE: FORANEAS CLIENTE_TAVO                         */
    /********************************************************/
    CONSTRAINT FK_TIQ_TAV_CLI_TAV FOREIGN KEY(CLIENTE)        REFERENCES PBS.CLIENTE_TAVO(ID_CLIENTE_TAVO),

    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_TIQ_TAO_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_TIQ_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_TIQ_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."CLIENTE"            IS 'Relaciona el cliente del tiquete con la tabla cliente tavo';
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."FECHA"              IS 'Fecha de creación del tiquete';
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."TOTAL"              IS 'Monto del tiquete';



/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_TIQUETE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM TIQUETE_TAVO FOR "PBS"."TIQUETE_TAVO";
CREATE PUBLIC SYNONYM SQ_TIQUETE_TAVO FOR PBS.SQ_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."TIQUETE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";



/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* ELIMINAR TABLA                                       */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_TIQUETE_TAVO;
DROP PUBLIC SYNONYM TIQUETE_TAVO;
DROP PUBLIC SYNONYM SQ_TIQUETE_TAVO;
DROP TABLE "PBS".TIQUETE_TAVO;

Paso #02 Aggregator (JPA)

  • Dentro de este proyecto en la ruta sigesa-jpa->src->main->java->cr->ac->una-cgi->sigesa
  • Se encuentran todas las definiciones de las Entity’s que utilizan los diferentes proyectos
/*
 * 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.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import javax.persistence.Temporal;





/**
 * Entity para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_TIQUETE_TAVO", allocationSize = 1)



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

public class TiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Cliente Definición para Mapeos
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;

    // Fecha
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fecha;

    // Total
    @Column(name = "TOTAL")
    private double total;

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET       ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // Cliente
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }

    // ***************************************
    // Fecha
    // ***************************************
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    // ***************************************
    // Total
    // ***************************************
    public double geTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }
    

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #03: Repository

Ahora dentro del AGGREGATOR->Proyecto(sigesa->jpa->src->main->java->cr->ac->una->cgi->sigesa->pbs->abs->repository)->repository

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

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/

package cr.ac.una.cgi.sigesa.pbs.abs.repository;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Repository;

/**
 * Repository para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Estable que es un repositorio
@Repository

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface TiqueteTavoRepository extends GenericRepository<TiqueteTavo> {

}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #04: Service

  • El siguiente paso es crear una interfaz para el servicio para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-interface-service
/*
 * 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.pbs.abs.service;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;



/**
 * Interface para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface TiqueteTavoService extends EntityService<TiqueteTavo> {

}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #05: Service Implementación

  • El siguiente paso es crear la implenetación del servicio creado anterior mente para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-service
/*
 * 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.pbs.abs.service;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.repository.TiqueteTavoRepository;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


/**
 * Clase que implementa el servicio {@link TiqueteTavoService} para la entidad
 * {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

// Estabece que es un servicio
@Service

// Y que es de tipo transaccional
@Transactional

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoServiceImpl extends EntityServiceImpl<TiqueteTavo, TiqueteTavoRepository> implements TiqueteTavoService {

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #06: Bean

  • El bean es la clase que va relacionar la clase de acceso de datos con la interfaz web
  • El siguiente paso es crear el bean del servicio creado anteriormente para esto vamos a la ruta
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->model
/*
 * 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.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;




/**
 * Spring Bean Session para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoBean extends CRUDImpl<TiqueteTavo, TiqueteTavoService> implements CRUD {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct
    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("clienteTavo", getI18n("tiqueteTavo_clienteTavo_label"), true);
        CRUDColumn column2 = new CRUDColumn("fecha", getI18n("tiqueteTavo_fecha_label"), true);
        CRUDColumn column3 = new CRUDColumn("total", getI18n("tiqueteTavo_total_label"), true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    
}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso #07: ListForm

  • El siguiente pao es crear el archivo LIstForm para crear la interfaz para el listado de la información
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->resources->META-INF->resources->pages
<!--
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:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    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="#{tiqueteTavoBean.list()}" />
    </ui:define>

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar" 
                            editMode="false"
                            bean="#{tiqueteTavoBean}"
                            listForm="tiqueteTavoListForm"
                            editForm="tiqueteTavoEditForm"
                            backForm="tiqueteTavoListForm"
                            container="noEditTable:dataTable"
                            header="#{i18n.tiqueteTavo_list_form_table_title}"/>

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   NOEDITTABLE  ++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> 
        <components:noEditTable id="noEditTable"
                                i18nKey="tiqueteTavo_list_form_table_title"
                                header="#{i18n.tiqueteTavo_list_form_table_title}"
                                bean="#{tiqueteTavoBean}"
                                editForm="tiqueteTavoEditForm"
                                responsive="true"/>
    </ui:define>
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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

Paso #08: tiqueteEditForm.xhtml

  • El siguiente pao es crear el archivo EditForm para crear la interfaz para la edición de la información
  • sigesa->sigesa-pbs-abs->sigesa-ps-abs-web->src->main->java->cr->una->cgi->sigesa->pbs->abs->view->resources->META-INF->resources->pages
<!--
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:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:components="http://java.sun.com/jsf/composite/components"
                xmlns:sdkuna="http://cgi.una.ac.cr/sdkuna"
                xmlns:una="http://una.ac.cr/ui/components">




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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->



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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->




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



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar"
                            editMode="true"
                            bean="#{tiqueteTavoBean}"
                            listForm="tiqueteTavoListForm"
                            editForm="tiqueteTavoEditForm"
                            container="panelForm"
                            header="#{i18n.tiqueteTavo_edit_form_header}"/>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        <una:panelForm id="panelForm"
                       i18nKey="tiqueteTavo_edit_form_header"
                       binding="#{panelForm}"
                       header="#{i18n.tiqueteTavo_edit_form_header}">

            <!-------------------------------------------------------------------------------------------->
            <!------------------------------    INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <components:requiredInstructions focus="panelForm" />
            <!-------------------------------------------------------------------------------------------->
            <!----------------------------  FIN INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


            <!-------------------------------------------------------------------------------------------->
            <!------------------------------     PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <p:panelGrid columns="1"
                         layout="grid"
                         styleClass="una-panelgrid-responsive">

                <p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-panelgrid-cl1-responsive">




                    <!--####################################################################################-->
                    <!--#############################    CLIENTE   #########################################-->
                    <!--####################################################################################-->
                
                    <!--LABEL-->        
                    <p:outputLabel id="clienteTiqueteTavoOutputLabel"
                                for="clienteTiqueteTavoInputText"
                                value="#{i18n.tiqueteTavo_clienteTavo_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="clienteOutputPanel">}

                        <!--CAMPO-->
                        <p:inputText id="clienteTiqueteTavoInputText"
                                    value="#{tiqueteTavoBean.entity.clienteTavo}"
                                    required="true" maxlength="200" size="200"
                                    />    

                        <!--MENSAJE-->
                        <p:message id="clienteTiqueteTavoMessage"
                                for="clienteTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    FECHA     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="fechaTiqueteTavoOutputLabel"
                                    for="fechaTiqueteTavoCalendar"
                                    value="#{i18n.tiqueteTavo_fecha_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="fechaOutputPanel">

                        <!--CAMPO-->
                        <p:calendar id="fechaTiqueteTavoCalendar"
                                    value="#{tiqueteTavoBean.entity.fecha}"
                                    showOn="button"
                                    pattern="dd/MM/yyyy"
                                    navigator="true"
                                    locale="es"
                                    size="50"
                                    required="#{true}"
                                    >
                        </p:calendar>

                        <!--MENSAJE-->
                        <p:message id="fechaMessage"
                                    for="fechaTiqueteTavoCalendar" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    TOTAL     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="totalTiqueteTavoOutputLabel"
                                for="totalTiqueteTavoInputText"
                                value="#{i18n.tiqueteTavo_total_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="totalOutputPanel">

                        <!--CAMPO-->
                        <p:inputNumber id="totalTiqueteTavoInputNumber"
                                    value="#{tiqueteTavoBean.entity.total}"
                                    thousandSeparator=","
                                    decimalSeparator="."
                                    size="50"
                                    required="true" maxlength="50" size="50"
                                    />    

                        <!--MENSAJE-->
                        <p:message id="totalTiqueteTavoMessage"
                                for="totalTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->

                </p:panelGrid>






            </p:panelGrid>
            <!-------------------------------------------------------------------------------------------->
            <!-----------------------------  FIN PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


        </una:panelForm>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

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


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

Relación ManyToOne y OneToMany

  • Para crear la representación de una relación de tablas en la BD, debemos utilizar en el sistema una relación de ManyToOne y OneToMany dependiendo de la relación de la tabla
  • Por ejemplo tenemos la siguiente relación enla bd
  • Y deseamos llevar esta relación al sistema debemos hacer

Tiquete.java

  • cuando estamos creado la Entity de la tabla que se relaciona para este caso tiquetesTavo
  • Se debe crear un campo especial (EN ESTE CASO CLIENTE) que va ser el campo que se relacione con la clase o el objeto «cliente», debemos agregarle las siguientes propiedades adicionales
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    // Cliente Definición para Mapeos
    // LAZY: solo va traer la primera relación
    // JoinColumn: va crear una relación JOIN
    // nullable = false: este valor no puede ser nulo
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;
// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
  • RESUMEN: se crea la relación de la BD donde mucho tiquetes puede tener UN usuario
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/

package cr.ac.una.cgi.sigesa.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import java.math.BigDecimal;
import javax.persistence.Temporal;





/**
 * Entity para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_TIQUETE_TAVO", allocationSize = 1)



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

public class TiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    // Cliente Definición para Mapeos
    // LAZY: solo va traer la primera relación
    // JoinColumn: va crear una relación JOIN del campo de la BD 
    // nullable = false: este valor no puede ser nulo
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    

    // Fecha
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fecha;

    // Total
    @Column(name = "TOTAL")
    private BigDecimal total;





    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET       ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // Cliente
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }

    // ***************************************
    // Fecha
    // ***************************************
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    // ***************************************
    // Total
    // ***************************************
    public BigDecimal geTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }
    

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Cliente.java

  • Para que el sistema funciones se debe crear también dentro de «CLIENTE» debe existir la relación de OneToMany
  • para esto abrimos la clase y debemos los import’s necesarios
// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.OneToMany;
import javax.persistence.FetchType;
  • Ahora agregamos la columna que lo va relacionar
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    //MAPEO
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "clienteTavo")
    private List<TiqueteTavo> tiqueteTavo;     
  • Así
  • Y ahora debeos crearle los métodos para el atributo «tiqueteTavo»
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET  MAPEO   +++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // tiqueteTavo
    // ***************************************
    public List<TiqueteTavo> getTiquetesTavo() {
        return tiqueteTavo;
    }

    public void setTiqueteTavo(List<TiqueteTavo> tiqueteTavo) {
        this.tiqueteTavo = tiqueteTavo;
    }
  • Con esto abremos creado el mapeo
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.domain;




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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.OneToMany;
import javax.persistence.FetchType;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import javax.persistence.Temporal;
import java.util.List;

/**
 * Entity para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "CLIENTE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id",         column = @Column(name = "ID_CLIENTE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence",   sequenceName = "SQ_CLIENTE_TAVO", allocationSize = 1)


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavo extends BaseEntity<Usuario, CampoConfigurable> {


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    //MAPEO
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "clienteTavo")
    private List<TiqueteTavo> tiqueteTavo;     


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Cedula
    @Column(name = "CEDULA")
    private String cedula;

    // Nombre
    @Column(name = "NOMBRE")
    private String nombre;

    // Fecha de Nacimiento
    @Column(name = "FECHA_NACIMIENTO")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fechaNacimiento;

    // Activo: 1 = activo / 0 = Inactivo
    @Column(name = "ACTIVO")
    private Boolean activo;


     




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET  CAMPOS  +++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // Cedula
    // ***************************************
    public String getCedula() {
        return cedula;
    }

    public void setCedula(String cedula) {
        this.cedula = cedula;
    }

    // ***************************************
    // Nombre
    // ***************************************
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ***************************************
    // Fecha de Nacimiento
    // ***************************************
    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    // ***************************************
    // Activo
    // ***************************************
    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET  MAPEO   +++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // tiqueteTavo
    // ***************************************
    public List<TiqueteTavo> getTiquetesTavo() {
        return tiqueteTavo;
    }

    public void setTiqueteTavo(List<TiqueteTavo> tiqueteTavo) {
        this.tiqueteTavo = tiqueteTavo;
    }
   
}

/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • rasient crea atributos sin que estos tengan una columna en la tabla
  • creaer sets y get’s
  • en el get hay diferencia

TRASIENT (COLUMNAS DESDE OTRAS CLASES)

  • Ahora con el mapeo de las clases creado podemos crear atributos dentro de «TiquetesTavo» y que sean sean obtenidos desde la clase «Cliente»
  • Para hacer esta relación de atributos debemos utilizar Trasient
  • Donde indicamos que «este» atributo trasiende de «X» clase o ubucación
  • Para hacer esto primero agregamos los imports necesarios
import javax.persistence.Transient;
  • Y luegos agregamos las definiciones
  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       DEFINICIÓN DE TRASIENT      ++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//
    
    // Cliente: Cédula
    @Transient
    private String clienteCedula;

    // Cliente: Fecha Nacimiento
    @Transient
    private Date clienteFechaNacimiento;

    // Cliente: Nombre
    @Transient
    private String clienteNombre;

    // Cliente: Activo
    @Transient
    private Boolean clienteActivo;
  • Y debemos crear sus respesctivos get y set’s
  • Pero estos tiene la peculiariad de que son obtenidos desde un objeto cliente
  • Podemos hacerlos con una validación simple
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  TRASIENT    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // Cliente: Cédula
    public String getClienteCedula() {
        clienteCedula = "";
        
        if (cliente != null) {
            clienteCedula = clienteTavo.getCedula();
        }
        
        return clienteCedula;
    }

    public void setClienteCedula(String clienteCedula) {
        this.clienteCedula = clienteCedula;
    }

  • O una en un solo bloque
// Cliente: Cédula
    public String getClienteCedula() {
       
        return clienteCedula = cliente != null ? clienteCedula = clienteTavo.getCedula() : "";
    }
public void setClienteCedula(String clienteCedula) {
        this.clienteCedula = clienteCedula;
    }

Tipo: Fecha

// Cliente: Fecha de Nacimiento
    public Date getClienteFechaNacimiento() {
        clienteFechaNacimiento = null;
        
        if (cliente != null) {
            clienteFechaNacimiento = clienteTavo.getFechaNacimiento();
        }
        
        return clienteFechaNacimiento;
    }

  • Ejemplo

  • Entonces este proceso lo realizamos para todos los campos
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  TRASIENT    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // Cliente: Cédula
    public String getClienteCedula() {
        clienteCedula = "";
        
        if (cliente != null) {
            clienteCedula = clienteTavo.getCedula();
        }
        
        return clienteCedula;
    }

    public void setClienteCedula(String clienteCedula) {
        this.clienteCedula = clienteCedula;
    }


    // Cliente: Nombre
    public String getClienteNombre() {
        clienteNombre = "";
        
        if (cliente != null) {
            clienteNombre = clienteTavo.getNombre();
        }
        
        return clienteNombre;
    }

    public void setClienteNombre(String clienteNombre) {
        this.clienteNombre = clienteNombre;
    }


    // Cliente: Fecha de Nacimiento
    public Date getClienteFechaNacimiento() {
        clienteFechaNacimiento = null;
        
        if (cliente != null) {
            clienteFechaNacimiento = clienteTavo.getFechaNacimiento();
        }
        
        return clienteFechaNacimiento;
    }

    public void setClienteFechaNacimiento(Date clienteFechaNacimiento) {
        this.clienteFechaNacimiento = clienteFechaNacimiento;
    }



    // Cliente: Activo
    public Boolean getClienteActivo() {
        clienteActivo = null;
        
        if (clienteActivo != null) {
            clienteActivo = clienteTavo.getActivo();
        }
        
        return clienteActivo;
    }

    public void setClienteActivo(Boolean clienteActivo) {
        this.clienteActivo = clienteActivo;
    }
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/

package cr.ac.una.cgi.sigesa.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Transient;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import java.math.BigDecimal;
import javax.persistence.Temporal;





/**
 * Entity para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_TIQUETE_TAVO", allocationSize = 1)



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

public class TiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    // Cliente Definición para Mapeos
    // LAZY: solo va traer la primera relación
    // JoinColumn: va crear una relación JOIN del campo de la BD 
    // nullable = false: este valor no puede ser nulo
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;



    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE TRASIENT      ++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Cliente: Cédula
    @Transient
    private String clienteCedula;

    // Cliente: Fecha Nacimiento
    @Transient
    private Date clienteFechaNacimiento;

    // Cliente: Nombre
    @Transient
    private String clienteNombre;

    // Cliente: Activo
    @Transient
    private Boolean clienteActivo;




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    

    // Fecha
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fecha;

    // Total
    @Column(name = "TOTAL")
    private BigDecimal total;





    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET  CAMPOS    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // Cliente
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }

    // ***************************************
    // Fecha
    // ***************************************
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    // ***************************************
    // Total
    // ***************************************
    public BigDecimal geTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }
    


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  TRASIENT    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // Cliente: Cédula
    public String getClienteCedula() {
        clienteCedula = "";
        
        if (clienteCedula != null) {
            clienteCedula = clienteTavo.getCedula();
        }
        
        return clienteCedula;
    }


    // Cliente: Nombre
    public String getClienteNombre() {
        clienteNombre = "";
        
        if (cliente != null) {
            clienteNombre = clienteTavo.getNombre();
        }
        
        return clienteNombre;
    }


    // Cliente: Fecha de Nacimiento
    public Date getClienteFechaNacimiento() {
        clienteFechaNacimiento = null;
        
        if (cliente != null) {
            clienteFechaNacimiento = clienteTavo.getFechaNacimiento();
        }
        
        return clienteFechaNacimiento;
    }


    // Cliente: Activo
    public Boolean getClienteActivo() {
        clienteActivo = null;
        
        if (cliente != null) {
            clienteActivo = clienteTavo.getActivo();
        }
        
        return clienteActivo;
    }


}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Crear campo AutoComplete

  • Vamos a crear un campo autocomplete que «complete» o «liste» a los clientes dentro de tiquetes
  • Como la tarea que vamos a realizar es un servicio de busqueda de clientes y más clases los pueden consumir es lógico que este «servicio» sea implementado dentro de «cliente» y no «tiquete»
  • Pero SIGESA tiene la particularidad que por estándar a pesar de implementar el servicio en cliente y poder ser accedido directamente por un componente de ya sea el edit o list de tiquete esto NO SE DEBE HACER, sino que debemos serguir el estandar que un bean se puede comunicar con una Bean o un servicio solo con un servicio

ClienteRepository.java

  • Por esta razón anterior lo primero que debemos hacer es en el repositorio de «CLIENTE» una nueva definición de método que nos permita obtener todos los clientes por número de cédula y que en el estado estén activos
  • Para esto abrimos el archivo y agregamos los import’s necesarios para la paginación
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.repository;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * Repository para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Estable que es un repositorio
@Repository

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface ClienteTavoRepository extends GenericRepository<ClienteTavo> {
   

    /**********************************************************************/
    /**********************************************************************/
    /****************          DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/



    

    /**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable);





    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/
    
}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/
  • A este punto hemos creado el servicio a este punto

ClienteService.java

  • Una vez que creamos la definición en el repositorio ahora toca definirlo en la interfaz de «ClienteService» para el pryecto ABS para esto abrimos el archivo y agregamos los import’s para paginación
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Y con esto agregamos la definición
/**********************************************************************/
    /**********************************************************************/
    /****************          DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable);

    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.service;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;


/**
 * Interface para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface ClienteTavoService extends EntityService<ClienteTavo> {




    /**********************************************************************/
    /**********************************************************************/
    /****************          DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable);

    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/
  • este punto vamos por aquí

ClienteServiceImpl.java

  • Una vez tenemos la definición del método toca implementarlo para esto
  • Agregamos los import’s necesarios para paginar
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Y agregamos la implementación del método
/**********************************************************************/
    /**********************************************************************/
    /****************          MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findAllByCedulaIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    
    // Indicamos que vamos a sobreescribir el método
    @Override

    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable) {

        // NOTA: para campos de tipo String debemos agregar los '%'
        return repository.findAllByCedulaIgnoreCaseLikeAndActivo("%" + cedula + "%", activo, pageable);
    }

    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/
  • NOTAS:
    • El servicio devolvera una page de tipo ClienteTavo
    • @Override: Indicamos que vamos a sobreescribir el método
    • repository. : crea la relación de la funcipon definida en ClienteTavoRepository
    • STRING: para campos de tipo String debemos agregar los ‘%’
  • Resultado
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.service;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.repository.ClienteTavoRepository;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * Clase que implementa el servicio {@link ClienteTavoService} para la entidad
 * {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

// Estabece que es un servicio
@Service

// Y que es de tipo transaccional
@Transactional

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoServiceImpl extends EntityServiceImpl<ClienteTavo, ClienteTavoRepository> implements ClienteTavoService {
 

    /**********************************************************************/
    /**********************************************************************/
    /****************          MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findAllByCedulaIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    
    // Indicamos que vamos a sobreescribir el método
    @Override

    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable) {

        // NOTA: para campos de tipo String debemos agregar los '%'
        return repository.findAllByCedulaIgnoreCaseLikeAndActivo("%" + cedula + "%", activo, pageable);
    }

    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Para este punto vamos por aquí

ClienteBean.java

  • Ahora para poder comunicar la interfaz web con el servicio creado anteriormente se hace a través de un Bean para este caso ClienteBean
  • Para esto debemos crear una función que consuma el servicio anteriormente creado en y para esto tiene ya un service que puede consumir
  • Primero agregamos los import’s necesarios para paginar
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Y luego podemos agregar el método
/*************************************************************************************************/
    /*************************************************************************************************/
    /*******               FUNCIÓN:  findAllByNombreIgnoreCaseLikeAndViva          *******************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    /**
     * Método que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable) {
        return service.findAllByCedulaIgnoreCaseLikeAndActivo(cedula, activo, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • NOTAS:
    • como podemos ver lo que se hace es crear una función que va a llamar a otra función definida en ClieteTavoServiceImpl pasandole los parámetros
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.ClienteTavoService;



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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;


/**
 * Spring Bean Session para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoBean extends CRUDImpl<ClienteTavo, ClienteTavoService> implements CRUD {

    

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct

    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("cedula",           getI18n("cliente_cedula_label"),                true);
        CRUDColumn column2 = new CRUDColumn("nombre",           getI18n("cliente_nombre_label"),                true);
        CRUDColumn column3 = new CRUDColumn("fechaNacimiento",  getI18n("cliente_fechaNacimiento_label"),       true);
        CRUDColumn column4 = new CRUDColumn("activo",           getI18n("cliente_activo_label"),                true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /*******               FUNCIÓN:  findAllByNombreIgnoreCaseLikeAndViva          *******************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    /**
     * Método que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable) {
        return service.findAllByCedulaIgnoreCaseLikeAndActivo(cedula, activo, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • A este punto ya contamos un bean capas de devolver una page de ClienteTavo por lo tanto estamos aquí
  • Por tanto ya podemos saltar a tiquetesBean para poder realizar la comunicación de ClienteBean con TiqueteBean

Autowired: Creación de relación de Bean A Bean (TiqueteBean.java)

  • Para poder crear una relación de un bean a otro bean debemos utilizar el atributo @Autowired
  • Entonces primero agregamos los import’s necesarios
// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;
  • Y tambien los necesarios para la paginación
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
  • Y la necesaria para ingresar a la clase ClienteTavo
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
  • Y ahora agregamos la variable de la clase que va a manejar el ClienteTavoBean
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************************    ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Nos indica que vamos a utilizar el Bean de ClienteTavo
    @Autowired
    ClienteTavoBean clienteTavoBean;

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************** FIN ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Así podemos agregar el método
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************           FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  consume el servicio de ClienteBean -> findAllByCedulaIgnoreCaseLikeAndActivo
    // EJEMPLO: completeClienteTavo("juan", pageable) 
    
    public Page<ClienteTavo> autocompleteClienteTavo(String query, Pageable pageable) {

        //NOTA: Boolean.TRUE: solo los clientes activos
        return clienteTavoBean.findAllByCedulaIgnoreCaseLikeAndActivo(query, Boolean.TRUE, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************       FIN FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


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

// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;




/**
 * Spring Bean Session para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoBean extends CRUDImpl<TiqueteTavo, TiqueteTavoService> implements CRUD {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************************    ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Nos indica que vamos a utilizar el Bean de ClienteTavo
    @Autowired
    ClienteTavoBean clienteTavoBean;

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************** FIN ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/






    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los clienteTavo


    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct
    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("clienteTavo",      getI18n("tiqueteTavo_clienteTavo_label"),   true);
        CRUDColumn column2 = new CRUDColumn("fecha",            getI18n("tiqueteTavo_fecha_label"),         true);
        CRUDColumn column3 = new CRUDColumn("total",            getI18n("tiqueteTavo_total_label"),         true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************  FIN  FUNCIÓN INIT   *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************           FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  consume el servicio de ClienteBean -> findAllByCedulaIgnoreCaseLikeAndActivo
    // EJEMPLO: completeClienteTavo("juan", pageable) 
    
    public Page<ClienteTavo> autocompleteClienteTavo(String query, Pageable pageable) {

        //NOTA: Boolean.TRUE: solo los clientes activos
        return clienteTavoBean.findAllByCedulaIgnoreCaseLikeAndActivo(query, Boolean.TRUE, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************       FIN FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • A este punto dentro del TiqueteBean tenemos una conexión con ClienteBean

tiqueteEditForm.xhtml

  • Una vez que tenemos todo lo necesario funcionando para porder crear el autocomplete del cliente en la edición tiquetes, vamos a modificar el campo InputText de cliente para que sea un componente de tipo autocomplete
  • Por tanto modificamos esto
<!--####################################################################################-->
                    <!--#############################    CLIENTE   #########################################-->
                    <!--####################################################################################-->
                
                    <!--LABEL-->        
                    <p:outputLabel id="clienteTiqueteTavoOutputLabel"
                                for="clienteTiqueteTavoInputText"
                                value="#{i18n.tiqueteTavo_clienteTavo_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="clienteOutputPanel">}

                        <!--CAMPO-->
                        <p:inputText id="clienteTiqueteTavoInputText"
                                    value="#{tiqueteTavoBean.entity.clienteTavo}"
                                    required="true" maxlength="200" size="200"
                                    />    

                        <!--MENSAJE-->
                        <p:message id="clienteTiqueteTavoMessage"
                                for="clienteTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->
  • Por esto:
 <!--####################################################################################-->
                    <!--#############################    CLIENTE   #########################################-->
                    <!--####################################################################################-->
                
                    <!--LABEL-->        
                    <p:outputLabel id="clienteTiqueteTavoOutputLabel"
                                for="clienteTiqueteTavoAutoComplete"
                                value="#{i18n.tiqueteTavo_clienteTavoNombre_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="clienteOutputPanel">}

                        <!--CAMPO-->
                        <una:autoCompletePaginator  id="clienteTiqueteTavoAutoComplete"

                                                    paginator="true"
                                                    paginationRows="10"
                                                    dropdown="true"
                                                    forceSelection="true"
                                                    size="50"
                                                    required="true"

                                                    value="#{tiqueteTavoBean.entity.clienteTavo}"
                                                    var="clienteTavo"
                                                    itemLabel="#{clienteTavo.cedula}"
                                                    itemValue="#{clienteTavo}"
converter="#{clienteTavoBean.converter}"

                                                    completeMethod="#{tiqueteTavoBean.autocompleteClienteTavo}"
                                                    
                                                    >

                        </una:autoCompletePaginator> 

                        <!--MENSAJE-->
                        <p:message id="clienteTiqueteTavoMessage"
                                for="clienteTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->
  • Aquí tenemos varias secciones de parametros
  • las de configuración de componete
    • paginator: true = pagina / false = no pagina
    • paginationRows: número de filas antes de páginar
    • dropdown: que se muestre debajo del componente como un dropdown
    • forceSelection: true = debe selecccionar uno elemento para funcionar
    • size: tamaño
    • required: true = requerido
  • Las de la relación al campo encargado de buscar
    • value: atributo de la clase TiqueteTavo para manejar objetos tipo clienteTavo
  • continuamos
    • var: clienteTavo creación de la variable que vamos a utilizar para trabajar con el componente
    • itemLabel: Valor que se va mostar en el autocomplete
    • itemValue: objeto total
  • Y la configuración del autocomplete
    • completeMethod: método creado en TiqueteTavoBean para realizar el autocomplete
    • converter: este autocomplte debe tener este tipo
  • Y con esto hemos configurado el funcionamiento del autocomplete
  • Sin embargo todavía podemos crear más funcionalidades

Opción de [SELECCCIONE]

  • Para configurar un option en el combo que indique que seleccione al menos una opción y que tambien sirve para limpiar el combo vamos hacer lo siguiente
  • Primero le agregamos las opciones de:
    • noSelectedOption: true muestre el elemento
    • noSelectedLabel: texto que va a presentar
    • onNoSelectedOption: función por ejecutar
noSelectedOption="true"
                                                    noSelectedLabel="#{i18n.tiquetetavo_clienteTavo_select_label}"
                                                    onNoSelectedOption="#{tiqueteTavoBean.handleClearClienteTavo()}"
  • Como vemos nos muestra un error en onNoSelectedOption y esto por que esta función no existe dentro del bean de TiqueteBean
  • Vamos a crearla

TiqueteTavoBean.java

  • Creamos la función que va limpiar la selección del combo
  • Aquí dependiendo del tipo de campo se debe enviar un valor u otro
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleClearClienteTavo            *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  limpia la seleccion del autocomplete para clienteTavo
    // EJEMPLO: handleClearClienteTavo() 
    
    public void handleClearClienteTavo() {
        this.getEntity().setClienteTavo(null);
        this.getEntity().setClienteNombre("");
        this.getEntity().setClienteCedula("");
        this.getEntity().setClienteFechaNacimiento(null);
        this.getEntity().setClienteActivo(null);
    }

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

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


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

// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;




/**
 * Spring Bean Session para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoBean extends CRUDImpl<TiqueteTavo, TiqueteTavoService> implements CRUD {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************************    ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Nos indica que vamos a utilizar el Bean de ClienteTavo
    @Autowired
    ClienteTavoBean clienteTavoBean;

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************** FIN ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/






    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los clienteTavo


    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct
    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("clienteTavo",      getI18n("tiqueteTavo_clienteTavo_label"),   true);
        CRUDColumn column2 = new CRUDColumn("fecha",            getI18n("tiqueteTavo_fecha_label"),         true);
        CRUDColumn column3 = new CRUDColumn("total",            getI18n("tiqueteTavo_total_label"),         true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************           FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  consume el servicio de ClienteBean -> findAllByCedulaIgnoreCaseLikeAndActivo
    // EJEMPLO: completeClienteTavo("juan", pageable) 
    
    public Page<ClienteTavo> autocompleteClienteTavo(String query, Pageable pageable) {

        //NOTA: Boolean.TRUE: solo los clientes activos
        return clienteTavoBean.findAllByCedulaIgnoreCaseLikeAndActivo(query, Boolean.TRUE, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleClearClienteTavo            *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  limpia la seleccion del autocomplete para clienteTavo
    // EJEMPLO: handleClearClienteTavo() 
    
    public void handleClearClienteTavo() {
        this.getEntity().setClienteTavo(null);
        this.getEntity().setClienteNombre("");
        this.getEntity().setClienteCedula("");
        this.getEntity().setClienteFechaNacimiento(null);
        this.getEntity().setClienteActivo(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Envento itemSelect: cuando se selecciona una opción (TiqueteTavoEdit.xhtml)

  • A este punto tenemos la funcionalidad de que se carguen lo clientes
  • Una opción para limpiar la selección
  • Y nos falta que va pasar cuando el usuario seleccione un cliente válido
  • para esto vamos agregar la siguiente funcionalidad
<p:ajax event="itemSelect"
                                process="@this" global="true"
                                listener="#{tiqueteBean.handleSelectCliente()}"
                                update="apellidosPanelGrid"/>
  • Esto va invocar a una función que se va a ejecutar al momento que se de la selcción de una opción por parte del cliente
  • La función se va a llamar handleSelectClienteTavo

TiqueteTavoBean.java: Función/ Evento ItemSelect

  • Para crear la función agregamos al Bean la función que obtiene y almacena en al objeto los valores el elemento seleccionado por el usuario
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleSelectClienteTavo           *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encragar de "pintar" los valores del cliente seleccionado por el usuario
    // EJEMPLO: handleSelectClienteTavo() 
    
    public void handleSelectClienteTavo() {
        if (this.getEntity().getClienteTavo() != null) {

            this.getEntity().setClienteCedula(this.getEntity().getClienteTavo().getCedula());
            this.getEntity().setClienteNombre(this.getEntity().getClienteTavo().getNombre());
            this.getEntity().setClienteFechaNacimiento(this.getEntity().getClienteTavo().getFechaNacimiento());
            this.getEntity().setClienteActivo(this.getEntity().getClienteTavo().getActivo());
        }
    }

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

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


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

// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;




/**
 * Spring Bean Session para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoBean extends CRUDImpl<TiqueteTavo, TiqueteTavoService> implements CRUD {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************************    ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Nos indica que vamos a utilizar el Bean de ClienteTavo
    @Autowired
    ClienteTavoBean clienteTavoBean;

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************** FIN ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/






    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los clienteTavo


    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct
    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("clienteTavo",      getI18n("tiqueteTavo_clienteTavo_label"),   true);
        CRUDColumn column2 = new CRUDColumn("fecha",            getI18n("tiqueteTavo_fecha_label"),         true);
        CRUDColumn column3 = new CRUDColumn("total",            getI18n("tiqueteTavo_total_label"),         true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas
        this.setTableColumns(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************           FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  consume el servicio de ClienteBean -> findAllByCedulaIgnoreCaseLikeAndActivo
    // EJEMPLO: completeClienteTavo("juan", pageable) 
    
    public Page<ClienteTavo> autocompleteClienteTavo(String query, Pageable pageable) {

        //NOTA: Boolean.TRUE: solo los clientes activos
        return clienteTavoBean.findAllByCedulaIgnoreCaseLikeAndActivo(query, Boolean.TRUE, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleClearClienteTavo            *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  limpia la seleccion del autocomplete para clienteTavo
    // EJEMPLO: handleClearClienteTavo() 
    
    public void handleClearClienteTavo() {

        //Objeto
        this.getEntity().setClienteTavo(null);
        
        //Campos
        this.getEntity().setClienteCedula("");
        this.getEntity().setClienteNombre(""); 
        this.getEntity().setClienteFechaNacimiento(null);
        this.getEntity().setClienteActivo(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleSelectClienteTavo           *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encragar de "pintar" los valores del cliente seleccionado por el usuario
    // EJEMPLO: handleSelectClienteTavo() 
    
    public void handleSelectClienteTavo() {
        if (this.getEntity().getClienteTavo() != null) {

            this.getEntity().setClienteCedula(this.getEntity().getClienteTavo().getCedula());
            this.getEntity().setClienteNombre(this.getEntity().getClienteTavo().getNombre());
            this.getEntity().setClienteFechaNacimiento(this.getEntity().getClienteTavo().getFechaNacimiento());
            this.getEntity().setClienteActivo(this.getEntity().getClienteTavo().getActivo());
        }
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/




    
}


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

Componente LOVBean: dialogFrameworkData

  • Ahora para que el usuario puede buscar a un cliente no solamente por su número de cédula sino que podamos abrir una ventana modal que enliste los clientes y los permita filtrar por sus campos como en clienteTavoListForm.xhtml el Framework posee la posibilidad de crear una bean de tipo LOV (XXXXX)
  • Para esto vamos vamos a crear un ClienteTavoLOVBean.java

ClienteTavoLOVBean.java

  • Para crear un archivo LOVBean debe hacerlo dentro de la dirección del proyecto
  • sigesa-pbs-abs-web->src->main->java->->cr->ac->una->cgi->sigesa->pbs->abs->view-LOV
  • Creamos el archivo y le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.LOV;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.LOV;
import cr.ac.una.cgi.sdkuna.view.commons.LOVColumn;
import cr.ac.una.cgi.sdkuna.view.commons.LOVImpl;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++   Proyecto: PBS/ABS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.ClienteTavoService;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;






/**
 * Spring LOVBean Session para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 10/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoLOVBean extends LOVImpl<ClienteTavo, ClienteTavoService> implements LOV, Serializable {


    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      CONSTRUCTOR     *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public ClienteTavoLOVBean() {

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



    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct


    public void init() {

        // Retorna una List de tipo  LOVColumn
        List<LOVColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        LOVColumn column1 = new LOVColumn("cedula",             getI18n("clienteTavo_cedula_label"),            true);
        LOVColumn column2 = new LOVColumn("nombre",             getI18n("clienteTavo_nombre_label"),            true);
        LOVColumn column3 = new LOVColumn("fechaNacimiento",    getI18n("clienteTavo_fechaNacimiento_label"),   true);
        LOVColumn column4 = new LOVColumn("activo",             getI18n("clienteTavo_activo_label"),            true);

        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);

        // Enviamos las columnas
        this.setTableColumns(columns);

    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

}

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

tiqueteTavoEditForm.xhtml

  • Ahora entonces podemos crear un componete web que consuma el LOVBean creado anteriormente
  • Para esto agregamos al archivo despues del campo autocomplete
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--CAMPO: AUTOCOMPLETE/ VENTANA -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <components:dialogFrameworkData 
                        
                                                        id="clienteDialogFrameworkData"
                                                        title="#{i18n.tiquete_cliente_select_label}"
                                                        contentWidth="800"

                                                        lOVBean="#{clienteTavoLOVBean}"
                                                        target="#{tiqueteTavoBean.entity.clienteTavo}"
                                                        
                                                        
                                                        methodName="findClientesVivos"
                                                        
                              
                                                        oncomplete="updateClienteAutocomplete();"/>
                                                        <p:remoteCommand name="updateClienteAutocomplete"
                                                                        action="#{tiqueteTavoBean.handleSelectClienteTavo()}"
                                                                        process="@this" global="true"
                                                                        />
  • Donde existen los parametros de configuración del proyecto
  • La relación al LOVBean
  • NOTA IMPORTANTE: este tipo de servicio no va hacer una conexión de Bean -> Bean sino que este es el único servicio que va acceder directamente a un servicio de clienteTavo
  • Es decir
  • Por esto vamos a tener una sección de configuración que estable cual médoto de cliente va a invocar de foma directa
  • Y finalmente tenemos la configuración donde establecemos que al completarse la accion de seleccionar un cliente que debe hacer
  • En nuestro caso invocar de nuevo a la función de TiqueteTavoBean -> handleSelectClienteTavo()
  • Ahora que tenemos configurado el componente podemos ir a crear la definición e implentación del método requerido
  • RESULTADO
<!--
Copyright (c) 2022.
Centro de Gestion Informatica
Direccion de Tecnologias de la Informacion y Comunicacion
Universidad Nacional - Costa Rica
http://www.una.ac.cr
-->

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




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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->



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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->




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



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar"
                            editMode="true"
                            bean="#{tiqueteTavoBean}"
                            listForm="tiqueteTavoListForm"
                            editForm="tiqueteTavoEditForm"
                            container="panelForm"
                            header="#{i18n.tiqueteTavo_edit_form_header}"/>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        <una:panelForm id="panelForm"
                       i18nKey="tiqueteTavo_edit_form_header"
                       binding="#{panelForm}"
                       header="#{i18n.tiqueteTavo_edit_form_header}">

            <!-------------------------------------------------------------------------------------------->
            <!------------------------------    INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <components:requiredInstructions focus="panelForm" />
            <!-------------------------------------------------------------------------------------------->
            <!----------------------------  FIN INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


            <!-------------------------------------------------------------------------------------------->
            <!------------------------------     PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <p:panelGrid columns="1"
                         layout="grid"
                         styleClass="una-panelgrid-responsive">

                <p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-panelgrid-cl1-responsive">




                    <!--####################################################################################-->
                    <!--#############################    CLIENTE   #########################################-->
                    <!--####################################################################################-->
                
                    <!--LABEL-->        
                    <p:outputLabel id="clienteTiqueteTavoOutputLabel"
                                for="clienteTiqueteTavoAutoComplete"
                                value="#{i18n.tiqueteTavo_clienteTavoNombre_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="clienteOutputPanel">}

                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--CAMPO: AUTOCOMPLETE-->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <una:autoCompletePaginator  id="clienteTiqueteTavoAutoComplete"

                                                    paginator="true"
                                                    paginationRows="10"
                                                    dropdown="true"
                                                    forceSelection="true"
                                                    size="50"
                                                    required="true"
                                                    

                                                    value="#{tiqueteTavoBean.entity.clienteTavo}"
                                                    var="clienteTavo"
                                                    itemValue="#{clienteTavo}"
                                                    itemLabel="#{clienteTavo.cedula}"
                                                    
                                                    converter="#{clienteTavoBean.converter}"


                                                    completeMethod="#{tiqueteTavoBean.autocompleteClienteTavo()}"
                                                    

                                                    noSelectedOption="true"
                                                    noSelectedLabel="#{i18n.tiquetetavo_clienteTavo_select_label}"
                                                    onNoSelectedOption="#{tiqueteTavoBean.handleClearClienteTavo()}"
                                                    >
                                                    
                                                    <p:ajax event="itemSelect"
                                                    process="@this" global="true"
                                                    listener="#{tiqueteBean.handleSelectClienteTavo()}"
                                                    update="apellidosPanelGrid"/>

                        </una:autoCompletePaginator> 

                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--CAMPO: AUTOCOMPLETE/ VENTANA -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <components:dialogFrameworkData 
                        
                                                        id="clienteDialogFrameworkData"
                                                        title="#{i18n.tiqueteTavo_clienteTavo_select_label}"
                                                        contentWidth="800"

                                                        lOVBean="#{clienteTavoLOVBean}"
                                                        target="#{tiqueteTavoBean.entity.clienteTavo}"
                                                        
                                                        
                                                        methodName="findClientesVivos"
                                                        
                              
                                                        oncomplete="updateClienteAutocomplete();"/>
                                                        <p:remoteCommand name="updateClienteAutocomplete"
                                                                        action="#{tiqueteTavoBean.handleSelectClienteTavo()}"
                                                                        process="@this" global="true"
                                                                        />


                        <!--MENSAJE-->
                        <p:message id="clienteTiqueteTavoMessage"
                                for="clienteTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    FECHA     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="fechaTiqueteTavoOutputLabel"
                                    for="fechaTiqueteTavoCalendar"
                                    value="#{i18n.tiqueteTavo_fecha_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="fechaOutputPanel">

                        <!--CAMPO-->
                        <p:calendar id="fechaTiqueteTavoCalendar"
                                    value="#{tiqueteTavoBean.entity.fecha}"
                                    showOn="button"
                                    pattern="dd/MM/yyyy"
                                    navigator="true"
                                    locale="es"
                                    size="50"
                                    required="#{true}"
                                    >
                        </p:calendar>

                        <!--MENSAJE-->
                        <p:message id="fechaMessage"
                                    for="fechaTiqueteTavoCalendar" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    TOTAL     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="totalTiqueteTavoOutputLabel"
                                for="totalTiqueteTavoInputText"
                                value="#{i18n.tiqueteTavo_total_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="totalOutputPanel">

                        <!--CAMPO-->
                        <p:inputNumber id="totalTiqueteTavoInputNumber"
                                    value="#{tiqueteTavoBean.entity.total}"
                                    thousandSeparator=","
                                    decimalSeparator="."
                                    size="50"
                                    required="true" maxlength="50" size="50"
                                    />    

                        <!--MENSAJE-->
                        <p:message id="totalTiqueteTavoMessage"
                                for="totalTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->

                </p:panelGrid>






            </p:panelGrid>
            <!-------------------------------------------------------------------------------------------->
            <!-----------------------------  FIN PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


        </una:panelForm>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

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


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

ClienteTavoService.java

  • Abrimos el archivo y agregamos los imports necesarios
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
  • Y los import’s para los tipos de datos
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.Map;
  • Y agregamos la definición del método
/**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param filterSpecifications : filtros de especificación
     * @param pageable : parametro utilizado para paginación
     * @param params : objeto que permite el envió de paramentros especiales o adicionales
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findClientesTavoActivos(
            ArrayList<FilterSpecification> filterSpecifications,
            Pageable pageable, Map<String, Object> params);
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.service;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.Map;

/**
 * Interface para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface ClienteTavoService extends EntityService<ClienteTavo> {




    /**********************************************************************/
    /**********************************************************************/
    /****************          DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable);



    /**********************************************************************/
    /**
     * Definición que retorna un Page<ClienteTavo> según su cédula y la condición de activo
     * 
     * @param filterSpecifications : filtros de especificación
     * @param pageable : parametro utilizado para paginación
     * @param params : objeto que permite el envió de paramentros especiales o adicionales
     * @return 
     */
    /**********************************************************************/
    public Page<ClienteTavo> findClientesTavoActivo(
            ArrayList<FilterSpecification> filterSpecifications,
            Pageable pageable, Map<String, Object> params);



    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

ClienteTavoImpl.java

  • El siguiente paso después de la definición de la función es crear la implementación
  • Para esto agregamos los import’s necesarios
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import cr.ac.una.cgi.sdkuna.api.filter.LogicFunction;
import cr.ac.una.cgi.sdkuna.api.filter.Operator;
  • Y las de los tipos de campos
  • Y agregamos la implmentación del método
/**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findClientesTavoActivo(cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification, org.springframework.data.domain.Pageable, java.util.Map) }
     * 
     * @param filterSpecifications : filtros de especificación
     * @param pageable : parametro utilizado para paginación
     * @param params : objeto que permite el envió de paramentros especiales o adicionales
     * @return 
     */
    /**********************************************************************/
    
    // Indicamos que vamos a sobreescribir el método
    @Override
    public Page<ClienteTavo> findClientesTavoActivo(
            ArrayList<FilterSpecification> filterSpecifications,
            Pageable pageable, Map<String, Object> params) {

        FilterSpecification filterSpecificationQueryActivo = new FilterSpecification();
        filterSpecificationQueryActivo.setField("ACTIVO");
        filterSpecificationQueryActivo.setLogicFunction(LogicFunction.AND.getExpression());
        filterSpecificationQueryActivo.setOperator(Operator.EQUAL.getExpression());
        filterSpecificationQueryActivo.setValue(true);

        filterSpecifications.add(filterSpecificationQueryActivo);

        this.setFilterSpecifications(filterSpecifications);

        return repository.findAll(this, pageable);
    }
  • RSULTADO
/*
 * 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.pbs.abs.service;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;
import cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification;
import cr.ac.una.cgi.sdkuna.api.filter.LogicFunction;
import cr.ac.una.cgi.sdkuna.api.filter.Operator;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.repository.ClienteTavoRepository;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.Map;



/**
 * Clase que implementa el servicio {@link ClienteTavoService} para la entidad
 * {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

// Estabece que es un servicio
@Service

// Y que es de tipo transaccional
@Transactional

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoServiceImpl extends EntityServiceImpl<ClienteTavo, ClienteTavoRepository> implements ClienteTavoService {
 

    /**********************************************************************/
    /**********************************************************************/
    /****************          MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findAllByCedulaIgnoreCaseLikeAndActivo(java.lang.String, java.lang.Boolean, org.springframework.data.domain.Pageable) }
     * 
     * @param cedula : cédula por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/
    
    // Indicamos que vamos a sobreescribir el método
    @Override

    public Page<ClienteTavo> findAllByCedulaIgnoreCaseLikeAndActivo(String cedula, Boolean activo, Pageable pageable) {

        // NOTA: para campos de tipo String debemos agregar los '%'
        return repository.findAllByCedulaIgnoreCaseLikeAndActivo("%" + cedula + "%", activo, pageable);
    }




    /**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findClientesTavoActivo(cr.ac.una.cgi.sdkuna.api.filter.FilterSpecification, org.springframework.data.domain.Pageable, java.util.Map) }
     * 
     * @param filterSpecifications : filtros de especificación
     * @param pageable : parametro utilizado para paginación
     * @param params : objeto que permite el envió de paramentros especiales o adicionales
     * @return 
     */
    /**********************************************************************/
    
    // Indicamos que vamos a sobreescribir el método
    @Override
    public Page<ClienteTavo> findClientesTavoActivo(
            ArrayList<FilterSpecification> filterSpecifications,
            Pageable pageable, Map<String, Object> params) {

        FilterSpecification filterSpecificationQueryActivo = new FilterSpecification();
        filterSpecificationQueryActivo.setField("ACTIVO");
        filterSpecificationQueryActivo.setLogicFunction(LogicFunction.AND.getExpression());
        filterSpecificationQueryActivo.setOperator(Operator.EQUAL.getExpression());
        filterSpecificationQueryActivo.setValue(true);

        filterSpecifications.add(filterSpecificationQueryActivo);

        this.setFilterSpecifications(filterSpecifications);

        return repository.findAll(this, pageable);
    }



    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/



}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Campo oculta de nombre cliente (tiqueteTavoEditForm.xhtml)

  • Ahora vamos a agregar un campo deshabilitado que cuando el usuario seleccione un cliente obtenga su nombre y lo despliegue en este campo
<!--####################################################################################-->
                    <!--#########################    NOMBRE CLIENTE     ####################################-->
                    <!--####################################################################################-->
              
                    
                    <!--LABEL-->   
                    <p:outputLabel id="nombreOutputLabel"
                                    for="nombreInputText"
                                    value="" />

                    <!--PANEL-->       
                    <p:outputPanel id="nombrePanelGrid">

                        <!--CAMPO-->
                        <p:inputText id="nombreInputText"
                                    value="#{tiqueteTavoBean.entity.clienteNombre}"
                                        size="50"
                                        disabled="true"/>  

                        <!--MENSAJE-->
                        <p:message id="nombreMessage"
                                    for="nombreInputText" />
                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->
  • RESULTADO
<!--
Copyright (c) 2022.
Centro de Gestion Informatica
Direccion de Tecnologias de la Informacion y Comunicacion
Universidad Nacional - Costa Rica
http://www.una.ac.cr
-->

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




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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->



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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->




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



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <components:toolbar id="toolbar"
                            editMode="true"
                            bean="#{tiqueteTavoBean}"
                            listForm="tiqueteTavoListForm"
                            editForm="tiqueteTavoEditForm"
                            container="panelForm"
                            header="#{i18n.tiqueteTavo_edit_form_header}"/>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        <una:panelForm id="panelForm"
                       i18nKey="tiqueteTavo_edit_form_header"
                       binding="#{panelForm}"
                       header="#{i18n.tiqueteTavo_edit_form_header}">

            <!-------------------------------------------------------------------------------------------->
            <!------------------------------    INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <components:requiredInstructions focus="panelForm" />
            <!-------------------------------------------------------------------------------------------->
            <!----------------------------  FIN INSTRUCTIONS     ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


            <!-------------------------------------------------------------------------------------------->
            <!------------------------------     PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->
            <p:panelGrid columns="1"
                         layout="grid"
                         styleClass="una-panelgrid-responsive">

                <p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-panelgrid-cl1-responsive">




                    <!--####################################################################################-->
                    <!--#############################    CLIENTE   #########################################-->
                    <!--####################################################################################-->
                
                    <!--LABEL-->        
                    <p:outputLabel id="clienteTiqueteTavoOutputLabel"
                                for="clienteTiqueteTavoAutoComplete"
                                value="#{i18n.tiqueteTavo_clienteTavoNombre_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="clienteOutputPanel">}

                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--CAMPO: AUTOCOMPLETE-->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <una:autoCompletePaginator  id="clienteTiqueteTavoAutoComplete"

                                                    paginator="true"
                                                    paginationRows="10"
                                                    dropdown="true"
                                                    forceSelection="true"
                                                    size="50"
                                                    required="true"
                                                    

                                                    value="#{tiqueteTavoBean.entity.clienteTavo}"
                                                    var="clienteTavo"
                                                    itemValue="#{clienteTavo}"
                                                    itemLabel="#{clienteTavo.cedula}"
                                                    
                                                    converter="#{clienteTavoBean.converter}"


                                                    completeMethod="#{tiqueteTavoBean.autocompleteClienteTavo()}"
                                                    

                                                    noSelectedOption="true"
                                                    noSelectedLabel="#{i18n.tiquetetavo_clienteTavo_select_label}"
                                                    onNoSelectedOption="#{tiqueteTavoBean.handleClearClienteTavo()}"
                                                    >
                                                    
                                                    <p:ajax event="itemSelect"
                                                    process="@this" global="true"
                                                    listener="#{tiqueteBean.handleSelectClienteTavo()}"
                                                    update="apellidosPanelGrid"/>

                        </una:autoCompletePaginator> 

                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--CAMPO: AUTOCOMPLETE/ VENTANA -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                        <components:dialogFrameworkData 
                        
                                                        id="clienteDialogFrameworkData"
                                                        title="#{i18n.tiqueteTavo_clienteTavo_select_label}"
                                                        contentWidth="800"

                                                        lOVBean="#{clienteTavoLOVBean}"
                                                        target="#{tiqueteTavoBean.entity.clienteTavo}"
                                                        
                                                        
                                                        methodName="findClientesVivos"
                                                        
                              
                                                        oncomplete="updateClienteAutocomplete();"/>
                                                        <p:remoteCommand name="updateClienteAutocomplete"
                                                                        action="#{tiqueteTavoBean.handleSelectClienteTavo()}"
                                                                        process="@this" global="true"
                                                                        />


                        <!--MENSAJE-->
                        <p:message id="clienteTiqueteTavoMessage"
                                for="clienteTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->





                    <!--####################################################################################-->
                    <!--#########################    NOMBRE CLIENTE     ####################################-->
                    <!--####################################################################################-->
              
                    
                    <!--LABEL-->   
                    <p:outputLabel id="nombreOutputLabel"
                                    for="nombreInputText"
                                    value="" />

                    <!--PANEL-->       
                    <p:outputPanel id="nombrePanelGrid">

                        <!--CAMPO-->
                        <p:inputText id="nombreInputText"
                                    value="#{tiqueteTavoBean.entity.clienteNombre}"
                                        size="50"
                                        disabled="true"/>  

                        <!--MENSAJE-->
                        <p:message id="nombreMessage"
                                    for="nombreInputText" />
                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    FECHA     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="fechaTiqueteTavoOutputLabel"
                                    for="fechaTiqueteTavoCalendar"
                                    value="#{i18n.tiqueteTavo_fecha_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="fechaOutputPanel">

                        <!--CAMPO-->
                        <p:calendar id="fechaTiqueteTavoCalendar"
                                    value="#{tiqueteTavoBean.entity.fecha}"
                                    showOn="button"
                                    pattern="dd/MM/yyyy"
                                    navigator="true"
                                    locale="es"
                                    size="50"
                                    required="#{true}"
                                    >
                        </p:calendar>

                        <!--MENSAJE-->
                        <p:message id="fechaMessage"
                                    for="fechaTiqueteTavoCalendar" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->



                    <!--####################################################################################-->
                    <!--#############################    TOTAL     #########################################-->
                    <!--####################################################################################-->
                    
                    <!--LABEL-->   
                    <p:outputLabel id="totalTiqueteTavoOutputLabel"
                                for="totalTiqueteTavoInputText"
                                value="#{i18n.tiqueteTavo_total_label}"/>  

                    <!--PANEL-->
                    <p:outputPanel id="totalOutputPanel">

                        <!--CAMPO-->
                        <p:inputNumber id="totalTiqueteTavoInputNumber"
                                    value="#{tiqueteTavoBean.entity.total}"
                                    thousandSeparator=","
                                    decimalSeparator="."
                                    size="50"
                                    required="true" maxlength="50" size="50"
                                    />    

                        <!--MENSAJE-->
                        <p:message id="totalTiqueteTavoMessage"
                                for="totalTiqueteTavoInputText" />

                    </p:outputPanel>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################-->

                </p:panelGrid>






            </p:panelGrid>
            <!-------------------------------------------------------------------------------------------->
            <!-----------------------------  FIN PANELGRID       ----------------------------------------->
            <!-------------------------------------------------------------------------------------------->


        </una:panelForm>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

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


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

Actualización de campos

  • Ahora que los componentes están listos solo nos queda decirle que cada vez que el usuario seleccione un cliente actualice los campos necesarios para est caso el campo autocomplete y el campo deshabilitado de nombre
  • Para esto exite la función de «update»
update="clienteOutputPanel, nombrePanelGrid"
  • entonces la aagregamos a los componentes de
    • autocomplete – ajax
    • modal
  • Modificamos autocomplete
<p:ajax event="itemSelect"
                                                    process="@this" global="true"
                                                    listener="#{tiqueteBean.handleSelectClienteTavo()}"
                                                    update="apellidosPanelGrid"/>


X

<p:ajax event="itemSelect"
                                                    process="@this" global="true"
                                                    listener="#{tiqueteBean.handleSelectClienteTavo()}"
                                                    update="clienteOutputPanel, nombrePanelGrid"/>
  • Modal
 <components:dialogFrameworkData 
                        
                                                        id="clienteDialogFrameworkData"
                                                        title="#{i18n.tiqueteTavo_clienteTavo_select_label}"
                                                        contentWidth="800"

                                                        lOVBean="#{clienteTavoLOVBean}"
                                                        target="#{tiqueteTavoBean.entity.clienteTavo}"
                                                        
                                                        
                                                        methodName="findClientesVivos"
                                                        
                              
                                                        oncomplete="updateClienteAutocomplete();"
                                                        
                                                        update="clienteOutputPanel, nombrePanelGrid"
                                                        />
                                                        <p:remoteCommand name="updateClienteAutocomplete"
                                                                        action="#{tiqueteTavoBean.handleSelectClienteTavo()}"
                                                                        process="@this" 
                                                                        global="true"
                                                                        update="clienteOutputPanel, nombrePanelGrid"
                                                                        />
  • Y así le indicamos que debe actualizar los paneles de
    • clienteOutputPanel
    • nombrePanelGrid

Compilación

  • Ahora procedemos a compilar los proyectos de
    • aggregator
    • pbs-abs
    • webapp

Registro de páginas

  • Ingresamos a sas-> sas-> sas mantenimiento ->Lista de Recursos
  • Agregamos el rol
  • Guardamos
  • Registramos la página de edición
  • copiando
  • Agregamos rol
  • Regresamos y guardamos
  • Ahora podemos ingresar a la páginas
  • Salimos del usuario y ingresamos con root-juan/xxxxxxxx
  • http://10.0.100.30:8080/sigesa-webapp/pages/tiquetesTavoListForm.xhtml

Dia 3: Maestro detalle

Paso 01: Creación de tabla

  • Aquí vamos a crear tabla «DETALLE_TIQUETE»
  • abrimos SQL y ejecutamos
  • NOTA-SIGEGA: El nombre de columna de referecia debe ser el nombre de la tabla a la que hace referencia
/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM DETALLE_TIQUETE_TAVO;

/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."DETALLE_TIQUETE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_DETALLE_TIQUETE_TAVO"       NUMBER (19,0)       NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "TIQUETE"                       NUMBER (19,0)       NOT NULL ENABLE,
    "NOMBRE"                        VARCHAR2(50)        NOT NULL ENABLE,
    "CANTIDAD"                      NUMBER(5,2)         NOT NULL ENABLE,
    "PRECIO_TOTAL"                  NUMBER(22,2)        NOT NULL ENABLE,

    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"                DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"              NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"            DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"          NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"                       NUMBER(19,0),
    "CAMPO_CONFIGURABLE"            NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_DETALLE_TIQUETE_TAVO" PRIMARY KEY("ID_DETALLE_TIQUETE_TAVO"),
    
    
    /********************************************************/
    /* LLAVE: FORANEAS CLIENTE_TAVO                         */
    /********************************************************/
    CONSTRAINT FK_DET_TIQ_TAV_TIQ_TAV FOREIGN KEY(TIQUETE)        REFERENCES PBS.TIQUETE_TAVO(ID_TIQUETE_TAVO),

    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_DET_TIQ_TAV_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_DET_TIQ_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_DET_TIQ_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."TIQUETE"            IS 'Relaciona el detalle tiquete con el tiquete';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."NOMBRE"             IS 'Nombre del producto';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."CANTIDAD"           IS 'Cantidad del producto';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."PRECIO_TOTAL"       IS 'Precio total del producto';



/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_DETALLE_TIQUETE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM DETALLE_TIQUETE_TAVO FOR "PBS"."DETALLE_TIQUETE_TAVO";
CREATE PUBLIC SYNONYM SQ_DETALLE_TIQUETE_TAVO FOR PBS.SQ_DETALLE_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.DETALLE_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_DETALLE_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."DETALLE_TIQUETE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";



/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM DETALLE_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* ELIMINAR TABLA                                       */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_DETALLE_TIQUETE_TAVO;
DROP PUBLIC SYNONYM DETALLE_TIQUETE_TAVO;
DROP PUBLIC SYNONYM SQ_DETALLE_TIQUETE_TAVO;
DROP TABLE "PBS".DETALLE_TIQUETE_TAVO;

Paso 02: DetalleTiqueteTavo.java

  • Ahora vamos a crear el archivo entity para la tabla «DETALLE_TIQUETE_TAVO»
  • RUTA: sigesa-jpa/src/main/java/cr/ac/una/cgi/sigesa/pbs/abs/domain
/*
 * 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.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import javax.persistence.Temporal;





/**
 * Entity para la administración de la entidad {@link DetalleTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 11/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "DETALLE_TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_DETALLE_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_DETALLE_TIQUETE_TAVO", allocationSize = 1)



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

public class DetalleTiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {



    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  +++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE ATRIBUTOS  +++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Nombre
    @Column(name = "NOMBRE")
    private String nombre;

    // Cantidad
    @Column(name = "CANTIDAD")
    private double cantidad;

    // Precio total
    @Column(name = "PRECIO_TOTAL")
    private double precioTotal;

    




    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET       ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


    // ***************************************
    // Nombre
    // ***************************************
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ***************************************
    // Cantidad
    // ***************************************
    public double getCantidad() {
        return cantidad;
    }

    public void setCantidad(double cantidad) {
        this.cantidad = cantidad;
    }

    // ***************************************
    // Precio total
    // ***************************************
    public double getPrecioTotal() {
        return precioTotal;
    }

    public void setPrecioTotal(double precioTotal) {
        this.precioTotal = precioTotal;
    }
    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  MAPEO       +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
   
   
  

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

Paso 03: DetalleTiqueteTavo.java

  • Ahora vamos a crear el archivo repository para la tabla «DETALLE_TIQUETE_TAVO»
  • RUTA: sigesa-jpa/src/main/java/cr/ac/una/cgi/sigesa/pbs/abs/repository
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.repository;



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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiqueteTavo;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Repository;


/**
 * Repository para la administración de la entidad {@link DetalleTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 11/10/2022
 */

 // Estable que es un repositorio
@Repository


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/

public interface DetalleTiqueteTavoRepository extends GenericRepository<DetalleTiqueteTavo> {
    
    
    /**********************************************************************/
    /**********************************************************************/
    /****************          DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/



    /**********************************************************************/
    /**********************************************************************/
    /****************     FIN  DEFINICIONES        ************************/
    /**********************************************************************/
    /**********************************************************************/

}

/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

  • ManyToOne: para solicitudes
  • OneToMany: para mantenimientos
  • cascadeTYPE.ALL: permite gestionar los datos de bases de datos en cascada
  • orphanRemoval = true: establece que los hierfanos se eliminen

Crear mapeo Maestro – Detalle

  • Para crear un mapeo de una Entity Marestro con un Detalle
  • Debemos utilizar:OneToMany
  • Otro detalle que no se va devolver un objeto sino una lista de objetos List<DetalleTiqueteTavo>

TiqueteTavo.java

  • Vamos a crear la relación OneTo Many -> Un tiquete tiene muchos detalles
  • Debemos agregar los import’s para mapeos
// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
  • Y los import’s para BD y CascadeType
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.CascadeType;
  • Y el necesario para manejar listas
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.List;
  • Ahora debemos crear la relación
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


    // Mapeo para detalleTiquete
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "TIQUETE", nullable = false)
    private List<DetalleTiqueteTavo> detalleTiqueteTavo;
  • Y ahora creamos los get’s y set’s de la variable para que devuelva una lista
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  MAPEO       +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
   
   
    // ***************************************
    // Cliente
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }


    // ***************************************
    // DetalleTiquete
    // ***************************************
    public List<DetalleTiqueteTavo> getDetalleTiqueteTavo() {
        return detalleTiqueteTavo;
    }

    public void setDetalleTiqueteTavo(List<DetalleTiqueteTavo> detalleTiqueteTavo) {
        this.detalleTiqueteTavo = detalleTiqueteTavo;
    }
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;




/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.CascadeType;



// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Transient;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import java.util.List;
import java.math.BigDecimal;







/**
 * Entity para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_TIQUETE_TAVO", allocationSize = 1)



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

public class TiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE MAPEO  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // ***************************************
    // MAPEO: Tiquete->ClienteTavo
    // ***************************************
    // Cliente Definición para Mapeos
    // LAZY: solo va traer la primera relación
    // JoinColumn: va crear una relación JOIN del campo de la BD 
    // nullable = false: este valor no puede ser nulo
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;


    // ***************************************
    // MAPEO: Tiquete->DetalleTiqueteTavo
    // ***************************************
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "TIQUETE", nullable = false)
    private List<DetalleTiqueteTavo> detalleTiqueteTavo;

    



    
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE TRASIENT      ++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // Cliente: Cédula
    @Transient
    private String clienteCedula;

    // Cliente: Fecha Nacimiento
    @Transient
    private Date clienteFechaNacimiento;

    // Cliente: Nombre
    @Transient
    private String clienteNombre;

    // Cliente: Activo
    @Transient
    private Boolean clienteActivo;




    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       DEFINICIÓN DE CAMPOS  ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    

    // Fecha
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fecha;

    // Total
    @Column(name = "TOTAL")
    private BigDecimal total;





    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++             GET y SET  CAMPOS    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    

    // ***************************************
    // Fecha
    // ***************************************
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    // ***************************************
    // Total
    // ***************************************
    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }
    

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  MAPEO       +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
   
   
    // ***************************************
    // MAPEO: Tiquete->ClienteTavo
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }


    // ***************************************
    // MAPEO: Tiquete->DetalleTiqueteTavo
    // ***************************************
    public List<DetalleTiqueteTavo> getDetalleTiqueteTavo() {
        return detalleTiqueteTavo;
    }

    public void setDetalleTiqueteTavo(List<DetalleTiqueteTavo> detalleTiqueteTavo) {
        this.detalleTiqueteTavo = detalleTiqueteTavo;
    }

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++           GET y SET  TRASIENT    +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // Cliente: Cédula
    public String getClienteCedula() {
        clienteCedula = "";
        
        if (clienteTavo != null) {
            clienteCedula = clienteTavo.getCedula();
        }
        
        return clienteCedula;
    }

    public void setClienteCedula(String clienteCedula) {
        this.clienteCedula = clienteCedula;
    }


    // Cliente: Nombre
    public String getClienteNombre() {
        clienteNombre = "";
        
        if (clienteTavo != null) {
            clienteNombre = clienteTavo.getNombre();
        }
        
        return clienteNombre;
    }

    public void setClienteNombre(String clienteNombre) {
        this.clienteNombre = clienteNombre;
    }


    // Cliente: Fecha de Nacimiento
    public Date getClienteFechaNacimiento() {
        clienteFechaNacimiento = null;
        
        if (clienteTavo != null) {
            clienteFechaNacimiento = clienteTavo.getFechaNacimiento();
        }
        
        return clienteFechaNacimiento;
    }

    public void setClienteFechaNacimiento(Date clienteFechaNacimiento) {
        this.clienteFechaNacimiento = clienteFechaNacimiento;
    }



    // Cliente: Activo
    public Boolean getClienteActivo() {
        clienteActivo = null;
        
        if (clienteTavo != null) {
            clienteActivo = clienteTavo.getActivo();
        }
        
        return clienteActivo;
    }

    public void setClienteActivo(Boolean clienteActivo) {
        this.clienteActivo = clienteActivo;
    }


}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

DetalleTiqueteTavo.java

  • Una vez que tenemos el mapeo OneToMany dentro de TiqueteTavo.java debemos hacer la bidirección de ManyToOne dentro del detalle ya que Muchos detalles pertenecen a UN Tiquete
  • Donde:
    • @ManyToOne: Muchos a UNO
    • fetch = FetchType.LAZY: solo primera relación
    • optional = false:
    • name = «TIQUETE»: Nombre del campo de la BD donde se va a relacionar
    • referencedColumnName = «ID_TIQUETE»,: Campo de la BD de la tabla «TIQUETE_TAVO» que va a relacionar
    • nullable = false,
    • insertable = false
    • updatable = false
// ***************************************
// MAPEO: Detalle->TiqueteTavo
    // ***************************************
    // Mapeo para tiqueteTavo (los nombres son de la BD)
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "TIQUETE",
            referencedColumnName = "ID_TIQUETE_TAVO",
            nullable = false,
            insertable = false,
            updatable = false)
    private TiqueteTavo tiqueteTavo;
  • Ahora debemos agregar los get’s y set’s para poder trabajar con la variables
// ***************************************
    // MAPEO: Detalle->TiqueteTavo
    // ***************************************
    public TiqueteTavo getTiqueteTavo() {
        return tiqueteTavo;
    }

    public void setTiqueteTavo(TiqueteTavo tiqueteTavo) {
        this.tiqueteTavo = tiqueteTavo;
    }

Proyecto abs -web->model

  • Creamos archivo DetalleTiqueteASERBean.java
  • ASER: Add / Select / Edit / Remove
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;

import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiquete;

/**
 *
 * @author 
 */
@Component
@Scope("session")
public class DetalleTiqueteBean extends ASERImpl<DetalleTiquete> implements ASER {

    public void init() {

        List<ASERColumn> columns = new ArrayList<>();
        
        /*
        columns.add(new ASERColumn("nombre", getI18n("xxx_xxx_label"), true));
        */

        this.setColumnsDetails(columns);
    }
}
  • Agregamos initi
/*************************************************************************************************/
        /*************************************************************************************************/
        /******************************      FUNCIÓN INIT    *********************************************/
        /*************************************************************************************************/
        /*************************************************************************************************/
        // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los clienteTavo


        // Establece que después de ejectar el constructor debe ejecutar la siguiente función
        @PostConstruct
        public void init() {

            //Crea una lista de columnas
            List<ASERColumn> columns = new ArrayList<>();

            // Creamos las relaciones y ordenes de las columnas para el listado
            ASERColumn column1 = new ASERColumn("nombre",                   getI18n("detalleTiquete_cnombre_label"),            true);
            ASERColumn column2 = new ASERColumn("cantidad",                 getI18n("detalleTiquete_cantidad_label"),           true);
            ASERColumn column3 = new ASERColumn("precio",                   getI18n("detalleTiquete_precio_label"),             true);
           
    
            
            //Agregamos las columnas a la variable
            columns.add(column1);
            columns.add(column2);
            columns.add(column3);

            // Enviamos las columnas
            this.setTableColumns(columns);
        }
        /*************************************************************************************************/
        /*************************************************************************************************/
        /*************************************************************************************************/
        /*************************************************************************************************/
  • Con esto hemos creado el mapeo de Maestro Detalle

Maestro Detalle – ASER (DetalleTiqueteASERBean.java)

  • Ahora vamos a crear un mantenimiento de tipo SIGESA – ASER
  • ASER:
  • RUTA: PROYECTO: sigesa-pbs-abs-web->src->main->java->cr->ac->una->cgi->sigesa->pbs->abs->view->model
  • y creamos el ASER DetalleTiqueteASERBean.java que va contener la función init()
/*
 * 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.pbs.abs.view.model;



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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiqueteTavo;

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

// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;



/**
 * Spring Bean Session para la administración de la entidad {@link DetalleTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 11/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")



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

public class DetalleTiqueteASERBean extends ASERImpl<DetalleTiqueteTavo> implements ASER {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los detalleTiqueteTavo


    // Establece que después de ejecutar el constructor debe ejecutar la siguiente función
    @PostConstruct


    public void init() {

        //Crea una lista de columnas
        List<ASERColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        ASERColumn column1 = new ASERColumn("nombre",                   getI18n("detalleTiquete_cnombre_label"),            true);
        ASERColumn column2 = new ASERColumn("cantidad",                 getI18n("detalleTiquete_cantidad_label"),           true);
        ASERColumn column3 = new ASERColumn("precio",                   getI18n("detalleTiquete_precio_label"),             true);
        

        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas pero con spublic class DetalleTiqueteASERBean extends ASERImpl<DetalleTiqueteTavo> implements ASER {etColumnsDetails
        this.setColumnsDetails(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Ahora es importante comprender que de momento hemos crear la clase detalleTiqueteTavo, su repositorio y un bean que contiene su función init()
  • Pero ahora debemos tomar en cuenta que este componete va se invocado desde tiquete

TiqueteTavoBea.java

  • Por esta razón debemos crear dentro de tiquetesBean.java una función que verifique
    • Que obtenga los datos del detalle del tiquete seleccionado
    • Los inserte en una instancia de memoria
    • Actualice los detalles de la propia instancia
    • Y que para evitar errores verifique si la instancia a sido creada y si no la cre y ejecute la función de init(), creada anteriormente
  • Entonces los primero que debemos hacer es un @AutoWired de la relación Tiquete->detalleTiquete
// ***************************************
// MAPEO: Tiquete->detalleTiquete
// ***************************************
@Autowired
DetalleTiqueteASERBean detalleTiqueteASERBean;
  • Luego podemos crear la función
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************                 FUNCION: initDetails                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encargar de inicializar la lista de detalles de tiquete
    // EJEMPLO: initDetails()


    public void initDetails() {
        this.getEntity().setDetalleTiqueteTavo(     detalleTiqueteASERBean.setDetails(    this.getEntity().getDetalleTiqueteTavo()   )      );
   
        if (!isPostBack()) {
            detalleTiqueteASERBean.init();
        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • RESULTADO:
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


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

// *********************************************************************
// Para hacer autowired
// *********************************************************************
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;





/**
 * Spring Bean Session para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TiqueteTavoBean extends CRUDImpl<TiqueteTavo, TiqueteTavoService> implements CRUD {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************************    ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // ***************************************
    // MAPEO: Tiquete->clienteTavo
    // ***************************************
    @Autowired
    ClienteTavoBean clienteTavoBean;

    // ***************************************
    // MAPEO: Tiquete->detalleTiquete
    // ***************************************
    @Autowired
    DetalleTiqueteASERBean detalleTiqueteASERBean;

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************** FIN ATRIBUTOS: AUTOWIRED   ******************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/






    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los clienteTavo


    // Establece que después de ejecutar el constructor debe ejecutar la siguiente función
    @PostConstruct


    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        CRUDColumn column1 = new CRUDColumn("clienteCedula",            getI18n("tiqueteTavo_clienteCedula_label"),             true, "clienteTavo.clienteCedula");
        CRUDColumn column2 = new CRUDColumn("clienteNombre",            getI18n("tiqueteTavo_clienteNombre_label"),             true, "clienteTavo.clienteNombre");
        CRUDColumn column3 = new CRUDColumn("clienteFechaNacimiento",   getI18n("tiqueteTavo_cclienteFechaNacimiento_label"),   true, "clienteTavo.clienteFechaNacimiento");
        CRUDColumn column4 = new CRUDColumn("clienteActivo",            getI18n("tiqueteTavo_clienteActivo_label"),             true, "clienteTavo.clienteActivo");

        CRUDColumn column5 = new CRUDColumn("fecha",                    getI18n("tiqueteTavo_fecha_label"),                     true);
        CRUDColumn column6 = new CRUDColumn("total",                    getI18n("tiqueteTavo_total_label"),                     true);
 
        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);
        columns.add(column4);
        columns.add(column5);
        columns.add(column6);

        // Enviamos las columnas con setTableColumns
        this.setTableColumns(columns);
        
        /**********************************************************************/
        /**********************************************************************/
        /***************      FIN DEFINICIÓN DE CLASE   ***********************/
        /**********************************************************************/
        /**********************************************************************/
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************           FUNCION-AUTOWIRED: completeClienteTavo       *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  consume el servicio de ClienteBean -> findAllByCedulaIgnoreCaseLikeAndActivo
    // EJEMPLO: completeClienteTavo("juan", pageable) 
    
    public Page<ClienteTavo> autocompleteClienteTavo(String query, Pageable pageable) {

        //NOTA: Boolean.TRUE: solo los clientes activos
        return clienteTavoBean.findAllByCedulaIgnoreCaseLikeAndActivo(query, Boolean.TRUE, pageable);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleClearClienteTavo            *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  limpia la seleccion del autocomplete para clienteTavo
    // EJEMPLO: handleClearClienteTavo() 
    
    public void handleClearClienteTavo() {

        //Objeto
        this.getEntity().setClienteTavo(null);
        
        //Campos
        this.getEntity().setClienteCedula("");
        this.getEntity().setClienteNombre(""); 
        this.getEntity().setClienteFechaNacimiento(null);
        this.getEntity().setClienteActivo(null);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************             FUNCION: handleSelectClienteTavo           *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encargar de "pintar" los valores del cliente seleccionado por el usuario
    // EJEMPLO: handleSelectClienteTavo() 
    
    public void handleSelectClienteTavo() {
        if (this.getEntity().getClienteTavo() != null) {

            this.getEntity().setClienteCedula(this.getEntity().getClienteTavo().getCedula());
            this.getEntity().setClienteNombre(this.getEntity().getClienteTavo().getNombre());
            this.getEntity().setClienteFechaNacimiento(this.getEntity().getClienteTavo().getFechaNacimiento());
            this.getEntity().setClienteActivo(this.getEntity().getClienteTavo().getActivo());
        }
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************                 FUNCION: initDetails                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encargar de inicializar la lista de detalles de tiquete
    // EJEMPLO: initDetails()


    public void initDetails() {
        this.getEntity().setDetalleTiqueteTavo(     detalleTiqueteASERBean.setDetails(    this.getEntity().getDetalleTiqueteTavo()   )      );
   
        if (!isPostBack()) {
            detalleTiqueteASERBean.init();
        }
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    
}


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

tiqueteEditForm.xhtml

  • Ahora como el componente los vamos a agregar para que salga en tiqueteEditForm
  • Vamos a abrir este archivo y darle que tambien renderice este componente
  • Modificamos
<!--********************************************************************************************-->
    <!--*****************************      PRERENDER     *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="preRender">
        <f:event type="preRenderView" listener="#{tiqueteTavoBean.find()}" />
    </ui:define>

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
  • Quedando así
<!--********************************************************************************************-->
    <!--*****************************      PRERENDER     *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="preRender">
        <f:event type="preRenderView" listener="#{tiqueteTavoBean.find()}" />
        <f:event type="preRenderView" listener="#{tiqueteTavoBean.initDetails()}"/>  
    </ui:define>

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
  • Y ahora podemos agregar en componete de TabView justo después del panelGrid y antes del panelForm
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++        TABLEVIEW        ++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:tabView 
                        id="tiqueteTabView"
                        activeIndex="#{tiqueteTavoBean.activeTab}" >

                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++        TAB01            ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <p:tab id="tabDetalleTiquete" title="#{i18n.tiqueteTavo_tab01_label}">


          

                </p:tab>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++     FIN TAB01           ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->





                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++        TAB02            ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <p:tab id="tabDetalleTavo" title="#{i18n.tiqueteTavo_tab02_label}">

                </p:tab>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++     FIN TAB02           ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->





                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++        TAB03            ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <p:tab id="tabDetalleLuis" title="#{i18n.tiqueteTavo_tab03_label}">
                </p:tab>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++     FIN TAB03           ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

            </p:tabView>

            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++    FIN TABLEVIEW        ++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
  • Con esto abremos creado un componete TabView
  • Ahora dentro del Tab01 vamos agregar el componente utilizado por SIGESA para crear detalles detailNoEditTableHorizontal
  • Agregamos
<!--####################################################################################-->
                    <!--##################     detailNoEditTableHorizontal    ##############################-->
                    <!--####################################################################################-->
                    <components:detailNoEditTableHorizontal
                        id="detalleTiqueteTavo_DetailNoEditTableHorizontal"
                        header="#{i18n.tiqueteTavo_detalleTiquete_label}"
                        bean="#{detalleTiqueteASERBean}"
                        masterBean="#{tiqueteTavoBean}"
                        editForm="detalleTiqueteTavoEditForm"
                        container="tiqueteTabView:"/>
                    <!--####################################################################################-->
                    <!--####################################################################################-->
                    <!--####################################################################################--
  • Con esto estamos haciendo que tiqueteTavo pueda desplegar un tabView que contiene en el tab 01 un componete detailNoEditTableHorizontal que va listar el detalle de los tiquetes

detalleTiqueteTavoEditForm.xhtml

  • Para que en tiquetes podamos listar los detalles debemos crear el archivo de interfaz
  • RUTA: sigesa-pbs-abs-web/src/main/resources/pages/
  • Y le agregamos
<!--
Copyright (c) 2022.
Centro de Gestion Informatica
Direccion de Tecnologias de la Informacion y Comunicacion
Universidad Nacional - Costa Rica
http://www.una.ac.cr
-->

<!--********************************************************************************************-->
<!--********************************************************************************************-->
<!--*****************************   COMPOSICIÓN   **********************************************-->
<!--********************************************************************************************-->
<!--********************************************************************************************-->

<ui:composition template="/templates/crud.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:components="http://java.sun.com/jsf/composite/components"
                xmlns:sdkuna="http://cgi.una.ac.cr/sdkuna"
                xmlns:una="http://una.ac.cr/ui/components">


    <!--********************************************************************************************-->
    <!--*****************************      PRERENDER     *******************************************-->
    <!--********************************************************************************************-->
    <ui:define name="preRender">
        <!-- Debemos eliminar esto ya que se invoco desde tiquete --->
        <!-- f:event type="preRenderView" listener="#{detalleTiqueteTavoBean.find()}" / -->
    </ui:define>
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->



    <!--********************************************************************************************-->
    <!--*****************************       TITLE        *******************************************-->
    <!--********************************************************************************************-->

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

    <!--********************************************************************************************-->
    <!--********************************************************************************************-->
    <!--********************************************************************************************-->


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


        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->

        <components:detailToolbar
                            masterBean="#{tiqueteTavoBean}"      
                            bean="#{detalleTiqueteTavoASERBean}"    
                            listForm="tiqueteTavoEditForm"
                            editForm="detalleTiqueteTavoEditForm"
                            container="panelForm"/>

        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN TOOLBAR  ++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->



        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++   PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <una:panelForm id="panelForm"
                       i18nKey="detalleTiqueteTavo_edit_form_header"
                       binding="#{panelForm}"
                       header="#{i18n.detalleTiqueteTavo_edit_form_header}">


            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++    INSTRUCTIONS     ++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <components:requiredInstructions focus="panelForm" />
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++  FIN INSTRUCTIONS     +++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->



            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++++    PANELGRID 1     +++++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <p:panelGrid columns="1"
                         layout="grid"
                         styleClass="una-panelgrid-responsive">
            
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++++    PANELGRID 2     +++++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-panelgrid-cl1-responsive">



                            <!--####################################################################################-->
                            <!--#########################    NOMBRE PRODUCTO    ####################################-->
                            <!--####################################################################################-->
                                    
                                            
                            <!--LABEL-->   
                            <p:outputLabel id="nombreOutputLabel"
                            for="nombreInputText"
                            value="#{i18n.detalleTiqueteTavo_nombre_label}" />

                            <!--PANEL-->       
                            <p:outputPanel id="nombreOutputPanel">

                                <!--CAMPO-->
                                <p:inputText 
                                            id="nombreInputText"
                                            value="#{detalleTiqueteTavoASERBean.entity.nombre}"
                                            size="50"
                                            disabled="true"/>  

                                <!--MENSAJE-->
                                <p:message id="nombreMessage"
                                            for="nombreInputText" />
                            </p:outputPanel>
                            <!--####################################################################################-->
                            <!--####################################################################################-->
                            <!--####################################################################################-->


                            <!--####################################################################################-->
                            <!--#############################     CANTIDAD     #####################################-->
                            <!--####################################################################################-->
                            
                            <!--LABEL-->   
                            <p:outputLabel      id="cantidadOutputLabel"
                                                for="cantidadInputNumber"
                                                value="#{i18n.detalleTiqueteTavo_total_label}"/>  

                            <!--PANEL-->
                            <p:outputPanel      id="cantidadOutputPanel">

                                <!--CAMPO-->
                                <p:inputNumber  id="cantidadInputNumber"
                                                value="#{detalleTiqueteTavoASERBean.entity.cantidad}"
                                                thousandSeparator=","
                                                decimalSeparator="."
                                                size="50"
                                                required="true" 
                                                maxlength="50" 
                                            />    

                                <!--MENSAJE-->
                                <p:message      id="cantidadMessage"
                                                for="cantidadInputNumber" />

                            </p:outputPanel>
                            <!--####################################################################################-->
                            <!--####################################################################################-->
                            <!--####################################################################################-->



                            <!--####################################################################################-->
                            <!--########################     PRECIO TOTAL      #####################################-->
                            <!--####################################################################################-->
                            
                            <!--LABEL-->   
                            <p:outputLabel      id="precioTotalOutputLabel"
                                                for="precioTotalInputNumber"
                                                value="#{i18n.detalleTiqueteTavo_total_label}"/>  

                            <!--PANEL-->
                            <p:outputPanel      id="precioTotalOutputPanel">

                                <!--CAMPO-->
                                <p:inputNumber  id="precioTotalInputNumber"
                                                value="#{detalleTiqueteTavoASERBean.entity.precioTotal}"
                                                thousandSeparator=","
                                                decimalSeparator="."
                                                size="50"
                                                required="true" 
                                                maxlength="50" 
                                            />    

                                <!--MENSAJE-->
                                <p:message      id="precioTotalMessage"
                                                for="precioTotalInputNumber" />

                            </p:outputPanel>
                            <!--####################################################################################-->
                            <!--####################################################################################-->
                            <!--####################################################################################-->





                </p:panelGrid>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++     FIN PANELGRID 2     ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

            </p:panelGrid>
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
            <!-- +++++++++++++++++++++++++     FIN PANELGRID 1     ++++++++++++++++++++++++++++++++++++ -->
            <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

        </una:panelForm>
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
        <!--+++++++++++++++++++++++++++++++  FIN PANELFORM  ++++++++++++++++++++++++++++++++++++++++++++-->
        <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->


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


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

Reportar la pagina detalleTiqueteTavoEditForm.xhtml

detailToolbar Unlock (detalleTiqueteTavoEditForm.xhtml)

  • Cuando se trabaja con Maestro detalle y se le dice ver a un registro del detalle lo lleva a una ventana que tiene la opción de desbloquear el registro para editarlo
  • Pero este no es un comportamiento deseado por esto vamos a indicarle que oculte este botón
  • Abrimos el archivo y en components:detailToolbar le agregamos
showUnlockButton="#{false}"
  • Quedando así
<components:detailToolbar
                            masterBean="#{tiqueteTavoBean}"      
                            bean="#{detalleTiqueteTavoASERBean}"    
                            listForm="tiqueteTavoEditForm"
                            editForm="detalleTiqueteTavoEditForm"
                            container="panelForm"
                            showUnlockButton="#{false}"
  • Asi cuando ingresamos de nuevo el botón esta ocultado

Día 04 : Internacionalización

  • Para realizar la internacionalización dentro de SIGESA existe una tabla en la BD de nombre «i18n»
  • Por lo que para poder agregar los texto es simplemente agregarlos en dicha tabla
  • Para esto ingresamos a SIGESA->SAS – Seguridad y Administración -> SAS – Seguridad y Administración -> SAS -Mantenimiento -> Lista de Internacionalización
  • Le damos la opción de «Nuevo»
  • Completamos el formulario yle damos «Guardar»
  • NOTAS:
    • Lo nombres deben ser el nombre completo de la clase. Ej: clienteTavo_XXX
    • Los datos de referencia de los campos deben ser igual al campo de la clase, es decir en minuscula Ej: clienteTavo_nombreCampo_XXX
    • Podemos agregar información adicional sobre el componete. Ej:
      • tiqueteTavo_dnrth_detalleTiqueteTavo_label : components:detailNoEditTableHorizontal
      • tiqueteTavo_tab_detalleTiqueteTavo_label: TAB
    • Aunque los campos puedan ser los mismos para List o Edit deberíamos tener uno para cada uno en caso de que requieran cambiar uno
  • Cuando se clona el servidor de BD todos los datos en desarrollo se pierden por lo que debemos respaldarlos y insertarlos en todos los nodos de producción
INSERT INTO I18N(ID_I18N, LLAVE, IDIOMA, VALOR, USUARIO_CREACION, FECHA_CREACION, USUARIO_MODIFICACION, FECHA_MODIFICACION, VERSION)
VALUES (SQ_I18N.NEXTVAL,'estadoEntradaMalla_nombre_unico_error_detail','es','Este nombre de estado ya se encuentra registrado',246,SYSDATE,246,SYSDATE,0);

Tarea 02: Realizar cálculo de precio de productos

  • El proceso que se va a realizar es que cuando se agregue un nuevo producto se sume su monto al monto total del tiquete
  • Para esto existen varias formas de hacerlos
    • METODO- 01: Cada vez que se agregue un producto al detalle se sumen todos los productos y luego se actualice el campo del tiqueteTavo pero existe un problema que es que del objeto detalleTavo puede acceder al objeto padre, pero no puede actualizar la vias es decir a tiqueteTavoEditForm.xhtml, sin embargo lo vamos hacer para comprensión
    • METODO-02: es dentro de tiquete cuando el usuario le dede guardar se actulice el monto, y este no tiene problema por que este si tiene acceso a la vista tiqueteTavoEditForm.xhtml
  • Pero para ambos casos debemos hacer una sobreescritura de los métodos de los botones de SIGESA

Sobre escritura métodos botones

  • Paso # 01: antes de empezar es importante defnir que el botó de Total sea deshabilitado para que el usuario no pueda modificarlo
  • Abrimos el archivo

tiqueteTavoEditForm.xhtml

  • Le agregamos
disabled="#{true}"
  • Quedando así
<p:inputNumber id="totalTiqueteTavoInputNumber"
                                value="#{tiqueteTavoBean.entity.total}"
                                thousandSeparator=","
                                decimalSeparator="."
                                size="50"
                                required="true" 
                                maxlength="50" 
                                disabled="#{true}"
                                /> 

MÉTODO-01:

  • METODO- 01: Cada vez que se agregue un producto al detalle se sumen todos los productos y luego se actualice el campo del tiqueteTavo pero existe un problema que es que del objeto detalleTavo puede acceder al objeto padre, pero no puede actualizar la vias es decir a tiqueteTavoEditForm.xhtml, sin embargo lo vamos hacer para comprensión
  • Es decir cuando estemos en «Mantenimiento de Detalle Tiquete» y agreguemos uno
  • Se actualice en tiquetesTavo
  • Entonces debemos sobre escribir el botón de agregar para modificar su comportamiento básico y agregarle la función del cálculo
  • Para hacer esto abrimos

DetalleTiqueteTavoASERBean.java

NOTA: Obtención del objeto maestro (Padre) desde un detalle (hijo)
  • Para obtener el objeto padre desde un hijo debemos utilizar un «FacesContext» que obtiene todos los objetos de la sessión del usuario actual
FacesContext context = FacesContext.getCurrentInstance();
  • Y con este context podemos obtener la aplicación y evaluzar una expresión, donde:
    • TiqueteBean tiqueteBean: vamos a almacenar u obtener un objeto de tipo TiqueteTavoBean (Padre)
    • context.getApplication().evaluateExpressionGet: obtener y evaluar
    • context: todo el contenido de la sesión
    • «#{tiqueteTavoBean}»: String de lo que buscamos
    • TiqueteTavoBean.class: clase de tipo esperada
FacesContext context = FacesContext.getCurrentInstance();
TiqueteTavoBean tiqueteTavoBean = context.getApplication().evaluateExpressionGet(context, "#{tiqueteTavoBean}", TiqueteTavoBean.class);
Continuamos..
Función: calculoTotal
  • Agregamos el siguiente código que crea una función que calcula el monto y que va servir tanto para editar como agregar
  • Primero agregamos los import’s
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.math.BigDecimal;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          FacesContext       ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.faces.context.FacesContext;
  • Función
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************************     FUNCIÓN: calculaTotal     **************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: calculaTotal() / Realiza la sumatoria de los productos dentro de detalleTavo
    
    
    public void calculaTotal() {

        // Obtiene el FacesContext de la sesión del usuario
        FacesContext context = FacesContext.getCurrentInstance();

        // Con base al context obtenido "Busca" el objeto tiqueteTavoBean
        TiqueteTavoBean tiqueteTavoBean = context.getApplication().evaluateExpressionGet(context, "#{tiqueteTavoBean}", TiqueteTavoBean.class);
       
        // Inicializa la variable a zero 
        BigDecimal total = BigDecimal.ZERO;
       
        // Obtenemos todo el detalle tiqueteTavoBean.getEntity().getDetalleTiqueteTavo del tiquete
        for (DetalleTiqueteTavo detalleTiqueteTavo : tiqueteTavoBean.getEntity().getDetalleTiqueteTavo()) {
            
            // Y los recorremos agregando a la variable total el valor anterior + el nuevo
            total = total.add(detalleTiqueteTavo.getPrecioTotal());
        }
       
        tiqueteTavoBean.getEntity().setTotal(total);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Teniendo ya una función capaz de calcular el monto total podemos sobreecribir los métodos de los botones
BOTON: Edit
  • Agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /***********************     SOBRESCRITURA: BOTON EDITAR     *************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Indicamos que vamos a sobrescribir
    @Override

    // Boton Editar
    public String edit() {   
        
        // Le indicamos que recalcule el total
        calculaTotal();

        // Y continue con su funcionamiento normal
        return super.edit();
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
BOTON: Agregar
  • Agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /***********************     SOBRESCRITURA: BOTON AGREGAR    *************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Indicamos que vamos a sobrescribir
    @Override

    // Boton Agregar
    public String add() {   
        
        // Le indicamos que recalcule el total
        calculaTotal();

        // Y continue con su funcionamiento normal
        return super.add();
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.view.model;



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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.ASER;
import cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;
import cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiqueteTavo;

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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          FacesContext       ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.faces.context.FacesContext;




/**
 * Spring Bean Session para la administración de la entidad {@link DetalleTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 11/10/2022
 */

 // Establece que es un componente
@Component

// Establece que existe mientras la session de usuario este activa
@Scope("session")



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

public class DetalleTiqueteTavoASERBean extends ASERImpl<DetalleTiqueteTavo> implements ASER {



    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: init() se ejecuta después de construtor y obtiene una lista de todos los detalleTiqueteTavo


    // Establece que después de ejecutar el constructor debe ejecutar la siguiente función
    @PostConstruct


    public void init() {

        //Crea una lista de columnas
        List<ASERColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
        ASERColumn column1 = new ASERColumn("nombre",                   getI18n("detalleTiqueteTavo_nombre_label"),            true);
        ASERColumn column2 = new ASERColumn("cantidad",                 getI18n("detalleTiqueteTavo_cantidad_label"),          true);
        ASERColumn column3 = new ASERColumn("precioTotal",              getI18n("detalleTiqueteTavo_precioTotal_label"),       true);
        

        
        //Agregamos las columnas a la variable
        columns.add(column1);
        columns.add(column2);
        columns.add(column3);

        // Enviamos las columnas pero con setColumnsDetails
        this.setColumnsDetails(columns);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


   

    /*************************************************************************************************/
    /*************************************************************************************************/
    /****************************     FUNCIÓN: calculaTotal     **************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCION: calculaTotal() / Realiza la sumatoria de los productos dentro de detalleTavo
    
    
    public void calculaTotal() {

        // Obtiene el FacesContext de la sesión del usuario
        FacesContext context = FacesContext.getCurrentInstance();

        // Con base al context obtenido "Busca" el objeto tiqueteTavoBean
        TiqueteTavoBean tiqueteTavoBean = context.getApplication().evaluateExpressionGet(context, "#{tiqueteTavoBean}", TiqueteTavoBean.class);
       
        // Inicializa la variable a zero 
        BigDecimal total = BigDecimal.ZERO;
       
        // Obtenemos todo el detalle tiqueteTavoBean.getEntity().getDetalleTiqueteTavo del tiquete
        for (DetalleTiqueteTavo detalleTiqueteTavo : tiqueteTavoBean.getEntity().getDetalleTiqueteTavo()) {
            
            // Y los recorremos agregando a la variable total el valor anterior + el nuevo
            total = total.add(detalleTiqueteTavo.getPrecioTotal());
        }
       
        tiqueteTavoBean.getEntity().setTotal(total);
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    /*************************************************************************************************/
    /*************************************************************************************************/
    /***********************     SOBRESCRITURA: BOTON AGREGAR    *************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Indicamos que vamos a sobrescribir
    @Override

    // Boton Agregar
    public String add() {   
        
        // Le indicamos que recalcule el total
        calculaTotal();

        // Y continue con su funcionamiento normal
        return super.add();
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


    

    /*************************************************************************************************/
    /*************************************************************************************************/
    /***********************     SOBRESCRITURA: BOTON EDITAR     *************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Indicamos que vamos a sobrescribir
    @Override

    // Boton Editar
    public String edit() {   
        
        // Le indicamos que recalcule el total
        calculaTotal();

        // Y continue con su funcionamiento normal
        return super.edit();
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/


}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • y con esto hemos realizado el MÉTODO-01

METODO-02

METODO-02: es dentro de tiquete cuando el usuario le dede guardar se actualice el monto, y este no tiene problema por que este si tiene acceso a la vista tiqueteTavoEditForm.xhtml

TiqueteTavoBean.java

  • Agregamos los import’s necesarios
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.math.BigDecimal;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;
  • Luego agregamos la función que va sobreescribir el botón de guardar en tiqueteTavoBean
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************                 OVERRIDE: BOTON SAVE                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    // FUNCIÓN:  se encarga de sobreescribir el método del botón save en tiquete, para realizar el calculo del monto
    // EJEMPLO: save()

    // Sobreescribe el método
    @Override

    // Botón Save
    public String save() {

        // Inicializa la variable a zero
        BigDecimal total = BigDecimal.ZERO;
       
        // Obtenemos los elementos del detalle de tiquete
        for (DetalleTiqueteTavo detalleTiquete : this.getEntity().getDetalleTiqueteTavo()) {

            // Realizamos la suma
            total = total.add(detalleTiquete.getPrecioTotal());
        }
       
        // Al objeto tiquete a su campo total le asignamos la sumatoria
        this.getEntity().setTotal(total);
       
        // Continue con el funcionamiento normal
        return super.save();
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

Tarea 03: Especificaciones (Specs)

  • Una específicación es otra forma dentro de SIGESA para realizar consultas a la base de datos
  • Tema: hibernate specification
  • Y se puede utilizar como estandar en vez de los find’s o cuando una consulta puede tronarse complicada
  • Por lo que se podría decir que el nuevo orden de consultas a la base de datos es:
    • find
    • HQL
    • SPECS
    • SQL
  • O podríamos hacerlo así
    • SPECS
    • find
    • HQL
    • SQL
  • Todo va depender de la modularidad o facilidad requerida
  • Para crear una especificación debemos hacerlo en la ruta
  • proyecto: sigesa-pbs-abs->sigesa-pbs-abs-service->src->main->java->cr->ac->una->cgi->sigesa->pbs->abs->specs

ClienteTavoSpecs.java

  • Creamos el archivo ClienteTavoSpecs.java
  • Con el siguiente contenido
/*
 * 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.pbs.abs.specs;



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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.ClienteTavo;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++            BD               ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       Specification         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.data.jpa.domain.Specification;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/**
 * Especificación para la administración de la entidad {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class ClienteTavoSpecs {




}

/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Ahora vamos a crear la especificación de «cliente activo», agregamos
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: activoEquals                   *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/

    public static Specification<ClienteTavo> activoEquals(final Boolean activo) {
        return new Specification<ClienteTavo>() {
            @Override
            public Predicate toPredicate(Root<ClienteTavo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("activo");
                Expression y = cb.literal(activo);
                return cb.equal(x, y);
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Creamos la específicación de nombreLike
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: nombreLikeOrdenadoByNombre     *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public static Specification<ClienteTavo> nombreLikeOrdenadoByNombre(final String query) {
        return new Specification<ClienteTavo>() {
            @Override
            public Predicate toPredicate(Root<ClienteTavo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("nombre");
                Expression y = cb.literal("%" + query + "%");

                cq.orderBy(cb.asc(x));
                return cb.like(cb.upper(x), cb.upper(y));
            }
        };
    }
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Y la última especificación es que la Fecha de Nacimiento sea menor a 2022
/*************************************************************************************************/
    /*************************************************************************************************/
    /****************          SPECIFICATION: nombreLikeOrdenadoByNombre     *************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public static Specification<ClienteTavo> fechaDeNacimientoLessThan(final Date fechaNacimiento) {
        return new Specification<ClienteTavo>() {
            @Override
            public Predicate toPredicate(Root<ClienteTavo> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                Expression x = root.get("fechaNacimiento");
                Expression y = cb.literal(fechaNacimiento);
                return cb.lessThan(x, y);
            }
        };
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
  • Con esto ya tenemos las especificaciones necesarias

ClienteServiceImpl.java

  • Ahora vamos a crear la funciones que utilicen las especificaciones creadas
  • Agregamos los import’s
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.specs.ClienteTavoSpecs;
  • Agregamos la función
/**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findAllByNombreIgnoreCaseLikeAndActivoAndFechaNacimientoLessThanPorSpec(java.lang.String, java.lang.Boolean, java.util.Date, org.springframework.data.domain.Pageable) }
     * 
     * @param nombre : nombre cliente por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param fecha : Fecha de nacimiento del cliente
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/

    public Page<ClienteTavo> findAllByNombreIgnoreCaseLikeAndActivoAndFechaNacimientoLessThanPorSpec(String nombre, Boolean activo, Date fecha, Pageable pageable) {
        
        // Definimos una variable de tipo especificacione ClienteTavo
        Specification<ClienteTavo> specFinal;
       
        // Obtenemos la especificación de activo
        Specification specActivoEquals = ClienteTavoSpecs.activoEquals(activo);

        // Obtenemos la especificación de nombre
        Specification specNombreLikeOrdenadoByNombre = ClienteTavoSpecs.nombreLikeOrdenadoByNombre(nombre);


        // Obtenemos la especificación de fecha
        Specification specFechaNacimientoLessThan = ClienteTavoSpecs.fechaNacimientoLessThan(fecha);
       

        // Creamos la especificación final
        specFinal = Specification.where(specNombreLikeOrdenadoByNombre)
                .and(specActivoEquals)
                .and(specFechaNacimientoLessThan);
       
        return repository.findAll(specFinal, pageable);
    }
  • Ahora vamos a crear una función findClientesVivos2 pero que utilice las especificaciones

ClienteTavoService.java

  • Ahora debemos agregar la definición de la función
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;



/**********************************************************************/
    /**
     * Ver {@link ClienteTavoService#findAllByNombreIgnoreCaseLikeAndActivoAndFechaNacimientoLessThanPorSpec(java.lang.String, java.lang.Boolean, java.util.Date, org.springframework.data.domain.Pageable) }
     * 
     * @param nombre : nombre cliente por buscar
     * @param activo : 1 = activo / 0 = Inactivo
     * @param fecha : Fecha de nacimiento del cliente
     * @param pageable : parametro utilizado para paginación
     * @return 
     */
    /**********************************************************************/

    public Page<ClienteTavo> findAllByNombreIgnoreCaseLikeAndActivoAndFechaNacimientoLessThanPorSpec(
            String nombre, 
            Boolean activo, 
            Date fecha, 
            Pageable pageable);

FALTAN TODAS LAS FUNCIONES

Parametros

  • SIEGESA: Maneja parametros por Bases de Datos para datos de configuración y se administran por la interfaz web
  • En SIEGSA existen varios nodos de producción
http://10.0.3.213:8080/sigesa-webapp-1.0.0-SNAPSHOT/security/login.xhtml
http://10.0.2.153:8080/sigesa-webapp-1.0.0-SNAPSHOT/security/login.xhtml
http://10.0.2.154:8080/sigesa-webapp-1.0.0-SNAPSHOT/security/login.xhtml
http://10.0.2.155:8080/sigesa-webapp-1.0.0-SNAPSHOT/security/login.xhtml
http://10.0.2.156:8080/sigesa-webapp-1.0.0-SNAPSHOT/
http://10.0.2.162:8080/sigesa-webapp-1.0.0-SNAPSHOT/
http://10.0.2.163:8080/sigesa-webapp-1.0.0-SNAPSHOT/
  • Esto quiere decir que que cuando creamos en producción un parametro debemos meterlo en todos los nodos
  • El formato es: param_nombreProyecto_nombreModulo_nombre. Ejemplo: param_pbs_abs_tiq_maximo_por_cliente

Tarea: Crear parametro de límite de productos

  • Ingresamos a SIGESA a Lista de Parámetros
  • Le damos nuevo
  • Y agregamos

TiqueteTavoValidator.java (Dentro proyecto-Web)

  • Ahora vamos a crear el archivo que va contener las validaciones
  • Ruta: sigesa-pbs-abs->sigesa-pbs-abs-web->src->main->java->cr->ac->una->cgi->sigesa->pbs->abs->view->validator
  • Creamos el archivo TiqueteTavoValidator.java
  • Le agreagamos el código
/*
 * 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.pbs.abs.view.validator;


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


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.TiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.TiqueteTavoService;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       VALIDACIÓN            ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
// Para Mensajes al usuario
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;


/**
 * Clase que implementa el servicio {@link ClienteTavoService} para la entidad
 * {@link ClienteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 06/10/2022
 */

 // Es un componete
@Component

// Scope del usuario request
@Scope("request")

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

public class TiqueteTavoValidator implements Validator {
   
    // Clase para el manejo de los mensajes al usuario
    @Autowired
    MessagesController messagesController;
   
    // Clase para el manejo de TiquetesTavo
    @Autowired
    TiqueteTavoService tiqueteTavoService;

    
    /**********************************************************************/
    /**********************************************************************/
    /****************          MÉTODOS             ************************/
    /**********************************************************************/
    /**********************************************************************/

    /**********************************************************************/
    /**
     * Ver {@link TiqueteTavoService#validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, javax.faces.validator.ValidatorException) }
     * 
     * @param fc : faceContext que para este caso es request
     * @param uic : la interfaz gráfica
     * @param o : objeto a validar
     * @return 
     */
    /**********************************************************************/
    @Override
    public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {

        // Obtenemos el objeto de tipo TiqueteTavo, obteniendolo del uic (interfaz del usuario) y que tiene el nombre de attribute
        TiqueteTavo tiqueteTavo = (TiqueteTavo) uic.getAttributes().get("tiqueteTavo");
       
        // Si el tiquete es null no tenemos con que trabajar regrese
        if (tiqueteTavo == null) {
            return;
        }
       
        // Si existe un objeto de tipo tiqueteTavo
        try {

            // invocamos el método del tiqueteTavoService que realiza la valización pasandole el objeto tiqueteTavo
            tiqueteTavoService.validaCantidadMaximaProductos(tiqueteTavo);
           
        } catch(Exception ex) {
            String summary = messagesController.getI18n("tiqueteTavo_message_error_validacion_cantidadMaximaProductos");//Error
            String detail = ex.getMessage();
            messagesController.addError(summary, detail);
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail));
        }
       
    }

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/
  • Y vemos que tenemos que agregar una internacionalización
  • tiqueteTavo_message_error_validacion_cantidadMaximaProductos
  • que debe tener el texto «Error»

TiqueteTavoServiceImpl.java

  • Aquí vamos a crear la función que realiza la validación
  • Primero para poder acceder a los parametros debemos hacer un Autowired y debemos poder accedecer al manejador de parametros, agregamos
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         AUTOWIRED           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.beans.factory.annotation.Autowired;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.service.ParametroService;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.DetalleTiqueteTavo;


/**********************************************************************/
    /**********************************************************************/
    /****************          AUTOWIRED           ************************/
    /**********************************************************************/
    /**********************************************************************/
    @Autowired
    ParametroService parametroService;

    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
  • Para utilizar mensajes en consola
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         MENSAJES CONSOLA    ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.logging.Level;
import java.util.logging.Logger;
  • Ahora vamos a crear dos funciones
  • La primera que se encarga de obtener el parametro de SIEGESA
/**********************************************************************/
    /**
     * Ver {@link TiqueteTavoService#obtieneParamCantidadProductoMaximo() }
     * 
     * 
     * @return 
     */
    /**********************************************************************/
    // Sobreescribir
    @Override

    // Indicamos que vamos a sobreescribir el método
    public BigDecimal obtieneParamCantidadProductoMaximo() {



        // Declaramos una variable para almacenar el parametro como BigDecimal
        BigDecimal cantidadMaxima = BigDecimal.ZERO;

        // Declaramos una variable String para almacenar el valor del parametro
        String cantidadMaximaStr = parametroService.findOneByLlave("param_pbs_abs_tiqTavo_cantidad_maxima_x_producto").getValor();

        // Lo convertimos a int y lo almacenamos
        cantidadMaxima =   new BigDecimal(cantidadMaximaStr); 

        //retornamos el valor
        return cantidadMaxima;
    }
  • Y la segunda que va a recorrer la lista del detalle y verificar que
    • tiquete no sea nulo
    • que la lista del productos no este vacia
    • Y si algún producto en su cantidad es mayor > 3
 /**********************************************************************/
    /**
     * Ver {@link TiqueteTavoService#validaCantidadMaximaProductos() }
     * 
     * @param tiqueteTavo : tiquete a trabajar
     * 
     * @return 
     */
    /**********************************************************************/
    // Sobreescribir
    @Override
    
    public void validaCantidadMaximaProductos(TiqueteTavo tiqueteTavo) throws Exception {
        
        // Validación:  no exite un tiquete
        if (tiqueteTavo == null) {
            
            // Error: no existe el objeto 
            throw new Exception(this.getI18n("tiqueteTavo_error_tiqueteTavo_nulo"));
        
        // Validación: si la lista esta vacia motramos mensaje
        } else if (tiqueteTavo.getDetalleTiqueteTavo().isEmpty()) {

            // Error: lista vacia
            throw new Exception(this.getI18n("tiqueteTavo_error_tiqueteTavo_listaVacia"));

        // Validación: si la lista esta vacia motramos mensaje
        } else{
            
            // Obtenemos la cantidad máxima de productos
            BigDecimal cantidadMaxima = obtieneParamCantidadProductoMaximo();

            // Obtenemos el detalleTiquete y lo recorremos
            for (DetalleTiqueteTavo detalle : tiqueteTavo.getDetalleTiqueteTavo()) {

                // realizamos la comprobación b1(detalle.getCantidad) b2(cantidadMaxima) b1>=b2 >= 0

                if(detalle.getCantidad().compareTo(cantidadMaxima) >= 0 ){
                    throw new Exception(this.getI18n("tiqueteTavo_error_cantidadMaximaProducto"));
                }
            }
            
            
        }
    }

tiqueteTavoEditFrom.xhtml

  • Ahora que tenemos la funcionalidad de una validación solo nos falta el llamado a dicha función para esto agregamos en la sección de donde estan los campos
    • <h:inputHidden id=»tiqueteTavoValidator»: id del componente
    • <f:attribute name=»tiqueteTavo»: es el nombre del atributo que esta definido en TiqueteTavoValidator
    • value=»#{tiqueteTavoBean.entity}»: Bean encargado del manejo de tiquetes
    • <f:validator binding=»#{TiqueteTavoValidator}» : clase que contiene el la función validate
    • disabled=»#{empty param[‘formMantenimiento:toolbar:toolbar_saveBtn’]}»: boton donde se va aplicar la validación
<!--####################################################################################-->
                    <!--######################## CAMPO OCULTO PARA VALIDACIÓN   ############################-->
                    <!--####################################################################################-->

                    <!--Entrada oculta para validaciones-->
                    <h:inputHidden id="tiqueteTavoValidator" value="true" >
                        <f:attribute name="tiqueteTavo" value="#{tiqueteTavoBean.entity}"/>
                        <f:validator binding="#{tiqueteTavoValidator}" disabled="#{empty param['formMantenimiento:toolbar:toolbar_saveBtn']}" />
                    </h:inputHidden>
                    <!--####################################################################################-->
                    <!--###################  FIN CAMPO OCULTO PARA VALIDACIÓN   ############################-->
                    <!--####################################################################################-->

Día 05: Menú

  • En SIGESA las opciones se manejan con las siguiente distribución
  • Procesos: cuando son procesos batch
  • Administración: tablas de tipos y estados
  • Mantenimiento: administración de tablas catalogo
  • Transacciones: tablas cores
  • Parametros: tablas de paramatros (ya no se usa)
  • Reportes: reportes
  • Para crear un menú
  • existen dos opciones de un módulos (Sistemas)
  • O de

  • Agregamos los datos
  • Secuencia: posición donde queremos se muestre

Creación de menú

  • Buscamos lista de menú
  • Nuevo
  • Crear menú de un menú padre y completamos la información

  • Clonamos para clientes
  • Ahora al roles de Admin debemos asignarle derechos buscamos roles
  • Buscamos ADMIN
  • Y como ya habíamos relacionado el recurso al rol de ADMIN ya podemos ingresar

Botones

  • Botones existen 2 disponibles
    • https://universidadnacional.atlassian.net/wiki/spaces/CGI/pages/2384396295/Migraci+n+de+SDKUNA+1.x+a+SDKUNA+2.x
    • https://api.jqueryui.com/theming/icons/
  • Existen3 posiciones
AdditionalButtonsY en las accionesadditionalActionButtons
AdditionalButtonsEn la listaadditionalListToolbarButtons
AdditionalButtonsEn el editadditionalEditToolbarButtons

Día 06: Reportes

Creación de conexión

  • Ahora abrimos jasperStudio
  • Y le damos File->New->JasperReport
  • Seleccionamos donde vamos a guardar el reporte y su nombre
  • Le damos nuevo Data Adapter->New
  • Seleccionamos Databe JDBC Connection
  • Agregamos los datos de conexión
jdbc:oracle:thin:@sigesa-desa.una.ac.cr:1521:DESA01
adm
sigesa2015
  • Agregamos el driver
  • Probamos la conexión
  • Resultado
  • d

Creación de nuevo reporte

  • Una vez que ya tenemos una conexión a desa01, por demos crear un nuevo reporte
  • File->Jasper Report
  • Establecemos el nombre del reporte y donde lo vamos almacenar
    • FORMATO: R-PBS-ABS_NOMBRE / R=REPORTE PBS=PROYECTO ABS=MÓDULO
  • Para este punto nos va solictar el select de obtención de datos, así que ahora podemos abrir SQLDeveloper y crear la consulta
SELECT 
    TA.ID_TIQUETE_TAVO, 
    TA.FECHA, 
    TA.TOTAL,
    CT.CEDULA,
    CT.NOMBRE
FROM TIQUETE_TAVO TA
INNER JOIN CLIENTE_TAVO CT ON (TA.CLIENTE = CT.ID_CLIENTE_TAVO)
ORDER BY TA.ID_TIQUETE_TAVO ASC;
  • Y una vez que la tenemos la pegamos en JasterStudio
  • NOTA IMPORTANTE: NO DEBE TERMINAR EN ;: COMO EN LA IMAGEN
  • Ahora nos solicita que seleccionemos las comlumnas a utilizar para este caso todas
  • Nos pregunta si deseamos agrupar columnas para ordenar le decimos que no
  • Nos indica que todo salió correctamente
  • Nos crea el reporte
  • Ahora para empezar a trabajarlo vamos a ocultar las secciones
    • Page Header
    • Column Header
    • Column Footer
    • Page Footer
    • Summary
  • Para esto en el menú inferior izquierdo «Outline» se encuentran todas las secciones le damos clic derecho «Delete»
  • Quedando así
  • Para crear el encabezado agregamos un campo «Static Text»
  • Con las siguientes propiedades
    • Font: SansSerif
    • Tamaño: 10
    • Centrado: horizontal y vertical
    • Negrita
  • Con las siguientes propiedades para PPI
    • Font: Dejavu Sans
    • Tamaño: 7 – 10
    • Centrado: horizontal y vertical
    • Negrita
    • Fecha: dd/MM/yyyy
    • Para simbolo de colones de debe poner la text filed->Inheritance->PDF Embedded
  • Y debe tener la siguiente estructura
  • EL formato del título es:
    • UNA
    • Sistema
    • Módulo
    • Reporte de
  • Ahora debemos agregar un título descriptor del módulo, graegamos dentro de title
  • Y debemos agregar la fecha de la generación del reporte
  • agregamos una etiqueta
  • Y para que la fecha se toma de la herramienta utilizamos el componete de «Currente Date»
  • Y le indicamos el formato requerido en:
  • Ahora para listar los campos, dentro del menpu inferior izquierdo, existe una sección de «Fields» donde debemos arrastrar los campos al formulario, para luego acomodarlos
  • Esto nos tira de una vez una label del nombre de la columna, este lo acomadmos den la sección| title
  • Asi solo queda acomodar las columnas
  • Importante quitar magenes , ajustar tamaño a máximo total y la opción de ignore pagination
  • Ahora podemo ver un preview
  • Debemos revisar en formato pdf como excel

Agregar los archivos al proyecto

  • Como estamos trabajando con jasperStudio en local y los archivos se encuentra en la MV debemos conectarnos por ssh y pegar los archivos en la ruta, si no existe la creamos
  • sigesa-pbs-abs->sigesa-pbs-abs-web->src->main->java->resources->META-INF->resources->reports
  • Y antes de pasar los archivos debemos compilarlo
  • Pasamos los archivos
  • Ahora para probar los reportes de forma local enla MV debemos crear una carpeta de nombre «reportes» en «/»
ssh cgi@10.0.100.30
sudo mkdir /reportes
sudo chmod 777 -R /reportes/
  • Y debemos pegar los reportes ahi tambien
  • Luego debemos registrar el nuevo reporte dentro del sistema
  • ingresamos a:
  • Completamos:
  • NOTA: los nombre son de 3 digitos debia ser R-PBS-ABS-TIQTAV
  • Luego debemos reportar el recurso
  • Nuevo, pero aqupi debemos registrarlo de la siguiente forma
/pages/reporteJobLauncher.xhtml?reporte=R-PBS-ABS-TiquetesTavo
  • Y le debemos asiganar un rol
  • Ahora debemos regitsrar el recurso en lista de menu

Subreporte

Paso 01:Crerar subreporte

  • Para crear un reporte de tiquetes y que tenga su detalle
  • Primero creamos el reporte del detalle
  • Creamos la consulta

Paso02: maestros

  • Agregamos un componente subreport y le agregamos el subreport desde archivo

  • Ahora es importante cuando se agrega que le agregamos la variable SUBREPORT_DIR a la dirección del subreporte
  • Ahora creamos la variable en reporte padre creamos un parametro «/reportes» para ubuntu y «C:/reportes/» para Windows
  • Maestros agregamos un nuevio paramentroe patra eñl id de tyiqwuete
  • Otros ejemplos Name: parametro de maestro / Expression : detalle
  • Ahora dentro del detalle debemo decirle que que ya no va ser 1 sino un paremetro
  • Ya tenemos los parametros disponibles dentro de detalle en la modificación de la consulta

  • Luego hay que marcar que el reporte tiene subreportes
  • Parametros dentro del reporte podemos agregar parametros
  • Para tipos Object (Autocomplete) primero creamos el parametro y luego lo editamos para que nos apareca un nuevo boton de propiedades del parametros
  • Editamos
  • Guradar regrsa y de nuievo a
  • ya aparece avanzado

Tema: Creción de Flujos

PASO-01: CRECIÓN DE TABLA

  • Para el ejemplo de la creación de flujos dentro de SIGESA vamos a crear una tabla «ESTADO_TIQUETE_TAVO» que va a manejar los estados de los tiquetes
  • Para esto abrimos SQLDEVELOPER y creamos la siguiente tabla
/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM ESTADO_TIQUETE_TAVO;

/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."ESTADO_TIQUETE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_ESTADO_TIQUETE_TAVO"    NUMBER (19,0)       NOT NULL ENABLE,
    

    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "NOMBRE"                   VARCHAR2(255)       NOT NULL ENABLE,
    "ACTIVO"                   NUMBER(1,0)         NOT NULL ENABLE,

    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"                DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"              NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"            DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"          NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"                       NUMBER(19,0),
    "CAMPO_CONFIGURABLE"            NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_ESTADO_TIQUETE_TAVO" PRIMARY KEY("ID_ESTADO_TIQUETE_TAVO"),


    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_EST_TIQ_TAV_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_EST_TIQ_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_EST_TIQ_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."ESTADO_TIQUETE_TAVO"."NOMBRE"        IS 'Nombre del estado del tiquete';
COMMENT ON COLUMN "PBS"."ESTADO_TIQUETE_TAVO"."ACTIVO"             IS 'Activo 1=activo / 0 = inactivo';



/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_ESTADO_TIQUETE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM ESTADO_TIQUETE_TAVO FOR "PBS"."ESTADO_TIQUETE_TAVO";
CREATE PUBLIC SYNONYM SQ_ESTADO_TIQUETE_TAVO FOR PBS.SQ_ESTADO_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.ESTADO_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_ESTADO_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."ESTADO_TIQUETE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";



/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM ESTADO_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* ELIMINAR TABLA                                       */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_ESTADO_TIQUETE_TAVO;
DROP PUBLIC SYNONYM ESTADO_TIQUETE_TAVO;
DROP PUBLIC SYNONYM SQ_ESTADO_TIQUETE_TAVO;
DROP TABLE "PBS".ESTADO_TIQUETE_TAVO CASCADE CONSTRAINTS;

Relación EstadoTiqueteTavo -> TiqueteTavo

  • Ahora debemos modificar la tabla de TiqueteTavo para que tenga un campo que soporte EstadoTiqueteTavo
  • Para esto vamos a eliminar la tabla TiqueteTavo y le aplicamos las modificaciones
/********************************************************/
/********************************************************/
/* ELIMINAR TABLA  DETALLE_TIQUETE                      */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_DETALLE_TIQUETE_TAVO;
DROP PUBLIC SYNONYM DETALLE_TIQUETE_TAVO;
DROP PUBLIC SYNONYM SQ_DETALLE_TIQUETE_TAVO;
DROP TABLE "PBS".DETALLE_TIQUETE_TAVO;

/********************************************************/
/********************************************************/
/* ELIMINAR TABLA  TIQUETE_TAVO                         */
/********************************************************/
/********************************************************/
DROP SEQUENCE "PBS".SQ_TIQUETE_TAVO;
DROP PUBLIC SYNONYM TIQUETE_TAVO;
DROP PUBLIC SYNONYM SQ_TIQUETE_TAVO;
DROP TABLE "PBS".TIQUETE_TAVO CASCADE CONSTRAINTS;


/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA  TIQUETE_TAVO         */
/********************************************************/
/********************************************************/
SELECT * FROM TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."TIQUETE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_TIQUETE_TAVO"               NUMBER (19,0)       NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: FK                                           */
    /********************************************************/
    "CLIENTE"                       NUMBER (19,0)       NOT NULL ENABLE,
    "ESTADO_TIQUETE_TAVO"           NUMBER (19,0)       ,
    
    
    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "FECHA"                         DATE                NOT NULL ENABLE,
    "TOTAL"                         NUMBER(22,2)        NOT NULL ENABLE,

    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"                DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"              NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"            DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"          NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"                       NUMBER(19,0),
    "CAMPO_CONFIGURABLE"            NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_TIQUETE_TAVO" PRIMARY KEY("ID_TIQUETE_TAVO"),
    
    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    
    --TIQUETE_TAVO->CLIENTE_TAVO
    CONSTRAINT FK_TIQ_TAV_CLI_TAV FOREIGN KEY(CLIENTE)                          REFERENCES PBS.CLIENTE_TAVO(ID_CLIENTE_TAVO),

    -- TIQUETE_TAVO->ESTADO_TIQUETE_TAVO
    CONSTRAINT FK_TIQ_TAV_EST_TIQ_TAV FOREIGN KEY(ESTADO_TIQUETE_TAVO)          REFERENCES PBS.ESTADO_TIQUETE_TAVO(ID_ESTADO_TIQUETE_TAVO),
    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_TIQ_TAO_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_TIQ_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_TIQ_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."CLIENTE"                IS 'Relaciona la tabla TIQUETE_TAVO con la tabla CLIENTE_TAVO';
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."ESTADO_TIQUETE_TAVO"    IS 'Relaciona la tabla TIQUETE_TAVO con la tabla TIQUETE_TAVO_ESTADO';
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."FECHA"                  IS 'Fecha de creación del tiquete';
COMMENT ON COLUMN "PBS"."TIQUETE_TAVO"."TOTAL"                  IS 'Monto del tiquete';



/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_TIQUETE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM TIQUETE_TAVO FOR "PBS"."TIQUETE_TAVO";
CREATE PUBLIC SYNONYM SQ_TIQUETE_TAVO FOR PBS.SQ_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."TIQUETE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";



/********************************************************/
/********************************************************/
/* VERIFICACIÓN  EXISTENCIA TABLA                       */
/********************************************************/
/********************************************************/
SELECT * FROM TIQUETE_TAVO;
  • Creación de la tabla detalle
/********************************************************/
/********************************************************/
/* CREACIÓN DE TABLA                                    */
/********************************************************/
/********************************************************/
CREATE TABLE "PBS"."DETALLE_TIQUETE_TAVO"
(
    /********************************************************/
    /* CAMPOS: ID                                           */
    /********************************************************/
    "ID_DETALLE_TIQUETE_TAVO"       NUMBER (19,0)       NOT NULL ENABLE,
    
    /********************************************************/
    /* CAMPOS: GENERALES                                    */
    /********************************************************/
    "TIQUETE"                       NUMBER (19,0)       NOT NULL ENABLE,
    "NOMBRE"                        VARCHAR2(50)        NOT NULL ENABLE,
    "CANTIDAD"                      NUMBER(5,2)         NOT NULL ENABLE,
    "PRECIO_TOTAL"                  NUMBER(22,2)        NOT NULL ENABLE,

    
    /********************************************************/
    /* CAMPOS: FRAMEWORK SDK-UNA                            */
    /********************************************************/
    "FECHA_CREACION"                DATE                NOT NULL ENABLE,
    "USUARIO_CREACION"              NUMBER(19,0)        NOT NULL ENABLE,
    "FECHA_MODIFICACION"            DATE                NOT NULL ENABLE,
    "USUARIO_MODIFICACION"          NUMBER(19,0)        NOT NULL ENABLE,
    "VERSION"                       NUMBER(19,0),
    "CAMPO_CONFIGURABLE"            NUMBER(19,0),
    
    /********************************************************/
    /* LLAVE: PRIMARIA                                      */
    /********************************************************/
    CONSTRAINT "PK_DETALLE_TIQUETE_TAVO" PRIMARY KEY("ID_DETALLE_TIQUETE_TAVO"),
    
    
    /********************************************************/
    /* LLAVE: FORANEAS CLIENTE_TAVO                         */
    /********************************************************/
    CONSTRAINT FK_DET_TIQ_TAV_TIQ_TAV FOREIGN KEY(TIQUETE)        REFERENCES PBS.TIQUETE_TAVO(ID_TIQUETE_TAVO),

    
    /********************************************************/
    /* LLAVE: FORANEAS                                      */
    /********************************************************/
    CONSTRAINT FK_DET_TIQ_TAV_USU_CRE FOREIGN KEY(USUARIO_CREACION)        REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_DET_TIQ_TAV_USU_MOD FOREIGN KEY(USUARIO_MODIFICACION)    REFERENCES SAS.USUARIO(ID_USUARIO),
    CONSTRAINT FK_DET_TIQ_TAV_CAM_CON FOREIGN KEY(CAMPO_CONFIGURABLE)      REFERENCES SAS.CAMPO_CONFIGURABLE(ID_CAMPO_CONFIGURABLE)
);

/********************************************************/
/********************************************************/
/* COMENTARIOS                                          */
/********************************************************/
/********************************************************/
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."TIQUETE"            IS 'Relaciona el detalle tiquete con el tiquete';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."NOMBRE"             IS 'Nombre del producto';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."CANTIDAD"           IS 'Cantidad del producto';
COMMENT ON COLUMN "PBS"."DETALLE_TIQUETE_TAVO"."PRECIO_TOTAL"       IS 'Precio total del producto';



/********************************************************/
/********************************************************/
/* SECUENCIA                                            */
/********************************************************/
/********************************************************/
CREATE SEQUENCE "PBS".SQ_DETALLE_TIQUETE_TAVO START WITH 1 INCREMENT BY 1;

/********************************************************/
/********************************************************/
/* SINONIMOS                                            */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM DETALLE_TIQUETE_TAVO FOR "PBS"."DETALLE_TIQUETE_TAVO";
CREATE PUBLIC SYNONYM SQ_DETALLE_TIQUETE_TAVO FOR PBS.SQ_DETALLE_TIQUETE_TAVO;


/********************************************************/
/********************************************************/
/* GRANT PERMISOS SOBRE LA TABLA                        */
/********************************************************/
/********************************************************/
GRANT SELECT, DELETE, UPDATE, INSERT ON PBS.DETALLE_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT, ALTER ON PBS.SQ_DETALLE_TIQUETE_TAVO TO WWW_SIGESA, WWW_TEUNA;
GRANT SELECT ON "PBS"."DETALLE_TIQUETE_TAVO" TO "ANALISTA", "ANALISTA_SIGESA";

PASO-02: CRECIÓN DE DOMAIN: EstadoTiqueteTavo.java

  • Ahora dentro del proyecto aggegator -> proyecto -> modulo -> domain
  • Creamos el archivo y le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.domain;

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

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;


// *********************************************************************
// Para hacer mapeos
// *********************************************************************
import javax.persistence.OneToMany;
import javax.persistence.FetchType;




/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.List;

/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

/**
 * Entity para la administración de la entidad {@link EstadoTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion       20/10/2022
 * @fechaModificacion   20/10/2022
 */

/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "ESTADO_TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column
        = @Column(name = "ID_ESTADO_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_ESTADO_TIQUETE_TAVO", allocationSize = 1)


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class EstadoTiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++      MAPEO: DEFINICIÓN      ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // ***************************************
    // MAPEO: TiqueteTavoEstado->TiqueteTavo
    // ***************************************
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "estadoTiqueteTavo")
    private List<TiqueteTavo> tiqueteTavo;     


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++          MAPEO: GET/SET        +++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    // ***************************************
    // MAPEO: TiqueteTavoEstado->Tiquete
    // ***************************************
    public List<TiqueteTavo> getTiqueteTavo() {
        return tiqueteTavo;
    }

    public void setTiqueteTavo(List<TiqueteTavo> tiqueteTavo) {
        this.tiqueteTavo = tiqueteTavo;
    }

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++      CAMPOS: DEFINICIÓN     ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // ***************************************
    // CAMPO: NOMBRE
    // ***************************************
    @Column(name = "NOMBRE")
    private String nombre;


    /// ***************************************
    // CAMPO: ACTIVO
    // ***************************************
    @Column(name = "ACTIVO")
    private Boolean activo;


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++      CAMPOS:  GET/SET       ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

    // ***************************************
    // CAMPO: NOMBRE
    // ***************************************
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ***************************************
    // Activo
    // ***************************************
    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }
    
}

PASO-03: CRECIÓN DE REPOSITORY: EstadoTiqueteTavoRepository.java

  • Ahora dentro del proyecto aggegator -> proyecto -> modulo -> repository
  • Creamos el archivo y le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.repository;

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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.generic.GenericRepository;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.EstadoTiqueteTavo;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Repository;




/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Repository para la administración de la entidad {@link EstadoTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion 20/10/2022
 * @fechaCModificacion 20/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

 // Estable que es un repositorio
@Repository


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/

public interface EstadoTiqueteTavoRepository extends GenericRepository<EstadoTiqueteTavo> {

}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

PASO-04: CRECIÓN DE SERVICE: EstadoTiqueteTavoService.java

  • Ahora dentro del proyecto proyecto -> modulo -> PRO-MOD-interface-service
  • Creamos el archivo y le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.service;



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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityService;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             DOMAIN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.EstadoTiqueteTavo;

/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Interface para la administración de la entidad {@link EstadoTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion 20/10/2022
 * @fechaModificacion 20/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/




/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE INTERFACE   ************************/
/**********************************************************************/
/**********************************************************************/
public interface EstadoTiqueteTavoService extends EntityService<EstadoTiqueteTavo> {

}
/**********************************************************************/
/**********************************************************************/
/**********     FIN DEFINICIÓN DE INTERFACE     ***********************/
/**********************************************************************/
/**********************************************************************/

PASO-05: CRECIÓN DE SERVICE-implementation: EstadoTiqueteTavoServiceImpl.java

  • Ahora dentro del proyecto proyecto -> modulo -> PRO-MOD-interface-service
  • Creamos el archivo y le agregamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.service;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;

// Para acceder a parametros
import cr.ac.una.cgi.sdkuna.service.ParametroService;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       SPRING-BOOT           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y REPOSITRY         ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.EstadoTiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.repository.EstadoTiqueteTavoRepository;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         AUTOWIRED           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import org.springframework.beans.factory.annotation.Autowired;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++         MENSAJES CONSOLA    ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//import java.util.logging.Level;
//import java.util.logging.Logger;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*import java.util.ArrayList;
import java.util.Map;
import java.util.Date;
import java.text.SimpleDateFormat;  
import java.text.ParseException;
import java.math.BigDecimal;*/



/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Clase que implementa el servicio {@link EstadoTiqueteTavoService} para la entidad
 * {@link EstadoTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion 20/10/2022
 * @fechaModificacion 20/10/2022
 */


/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Estabece que es un servicio
@Service

// Y que es de tipo transaccional
@Transactional


/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class EstadoTiqueteTavoServiceImpl extends EntityServiceImpl<EstadoTiqueteTavo, EstadoTiqueteTavoRepository> implements EstadoTiqueteTavoService {

}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

PASO-06: CRECIÓN DE BEAN: EstadoTiqueteTavoBean.java

  • Aunque no es necesario creamos el bean de EstadoTiqueteTavo
  • Proyecto->módulo->web->view->model
/*
 * 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.pbs.abs.view.model;


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


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.view.commons.CRUD;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDColumn;
import cr.ac.una.cgi.sdkuna.view.commons.CRUDImpl;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*++++++++++++         DOMAIN Y SERVICE           ++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.pbs.abs.domain.EstadoTiqueteTavo;
import cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService;


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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++          CAMPOS             ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;



/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

/**
 * Spring Bean Session para la administración de la entidad {@link EstadoTiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fecha 20/10/2022
 */

 
/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/


 // Establece que es un componente
 @Component

 // Establece que existe mientras la session de usuario este activa
 @Scope("session")

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

public class EstadoTiqueteTavoBean extends CRUDImpl<EstadoTiqueteTavo, EstadoTiqueteTavoService> implements CRUD {


    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      FUNCIÓN INIT    *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    
    // Establece que después de ejectar el constructor debe ejecutar la siguiente función
    @PostConstruct

    public void init() {

        //Crea una lista de columnas
        List<CRUDColumn> columns = new ArrayList<>();

     

        this.setTableColumns(columns);
    }

    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/



}

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

PASO-07: Modificación de TiqueteTavo

  • Ahora debemos modificar a TiqueteTavo para que soporte el campo «ESTADO_TIQUETE_TAVO» con TIQUETE_TAVO

Agreggator-dominan: TiqueteTavo.java

  • Agregamos la relación
// ***************************************
    // MAPEO: Tiquete->EstadoTiqueteTavo
    // ***************************************
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ESTADO_TIQUETE_TAVO", nullable = false)
    private EstadoTiqueteTavo estadoTiqueteTavo;
  • Agregamos los get y set de la relación
// ***************************************
    // MAPEO: Tiquete->EstadoTiqueteTavo
    // ***************************************
    public EstadoTiqueteTavo getEstadoTiqueteTavo() {
        return estadoTiqueteTavo;
    }

    public void setEstadoTiqueteTavo(EstadoTiqueteTavo estadoTiqueteTavo) {
        this.estadoTiqueteTavo = estadoTiqueteTavo;
    }
  • Agregamos los TRASIENT
// ***************************************
    // TRASIENT: Tiquete->EstadoTiqueteTavo
    // ***************************************

    // EstadoTiqueteTavo: Nombre
    @Transient
    private String estadoTiqueteTavoNombre;

    // EstadoTiqueteTavo: Activo
    @Transient
    private Boolean estadoTiqueteTavoActivo;
  • Y los get y set de TRASIENT
// ***************************************
    // TRASIENT: Tiquete->EstadoTiqueteTavo
    // ***************************************

    // EstadoTiqueteTavo: Nombre
    public String getEstadoTiqueteTavoNombre() {
        estadoTiqueteTavoNombre = "";
        
        if (EstadoTiqueteTavo != null) {
            estadoTiqueteTavoNombre = estadoTiqueteTavo.getNombre();
        }
        
        return estadoTiqueteTavoNombre;
    }

    public void setEstadoTiqueteTavoNombre(String estadoTiqueteTavoNombre) {
        this.estadoTiqueteTavoNombre = estadoTiqueteTavoNombre;
    }


    // EstadoTiqueteTavo: Activo
    public Boolean getEstadoTiqueteTavoActivo() {
        estadoTiqueteTavoActivo = null;
        
        if (EstadoTiqueteTavo != null) {
            estadoTiqueteTavoActivo = estadoTiqueteTavo.getActivo();
        }
        
        return estadoTiqueteTavoActivo;
    }

    public void setEstadoTiqueteTavoActivo(Boolean estadoTiqueteTavoActivo) {
        this.estadoTiqueteTavoActivo = estadoTiqueteTavoActivo;
    }
  • RESULTADO
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.pbs.abs.domain;




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



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++             SDK-UNA         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sdkuna.domain.Usuario;
import cr.ac.una.cgi.sdkuna.generic.BaseEntity;
import cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++                BD           ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.AttributeOverride;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.CascadeType;



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++           MAPEOS            ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Transient;


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      TIPOS DE DATOS         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import java.util.Date;
import java.util.List;
import java.math.BigDecimal;






/**********************************************************************/
/**********************************************************************/
/*********************    DOCUMENTACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/
/**
 * Entity para la administración de la entidad {@link TiqueteTavo}
 *
 * @author Gustavo Matamoros González
 * @fechaCreacion: 06/10/2022
 * @fechaModificacion 19/10/2022
 */




/**********************************************************************/
/**********************************************************************/
/*********************    CONFIGURACIÓN  ******************************/
/**********************************************************************/
/**********************************************************************/

// Definimos que es una entidad (tabla BD)
@Entity

// Idenficamos el nombre de la tabla
@Table(name = "TIQUETE_TAVO")

// Relacionamos el id con el ID de la tabla
@AttributeOverride(name = "id", column  = @Column(name = "ID_TIQUETE_TAVO"))

// Relacionamos la secuencia
@SequenceGenerator(name = "sequence", sequenceName = "SQ_TIQUETE_TAVO", allocationSize = 1)





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

public class TiqueteTavo extends BaseEntity<Usuario, CampoConfigurable> {


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++        MAPEOS: DEFINICIÓN       ++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/



    // ***************************************
    // MAPEO: Tiquete->ClienteTavo
    // ***************************************
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENTE", nullable = false)
    private ClienteTavo clienteTavo;
    

    // ***************************************
    // MAPEO: Tiquete->EstadoTiqueteTavo
    // ***************************************
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ESTADO_TIQUETE_TAVO", nullable = false)
    private EstadoTiqueteTavo estadoTiqueteTavo;






    // ***************************************
    // MAPEO: DetalleTiqueteTavo->Tiquete
    // ***************************************
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "TIQUETE", nullable = false)
    private List<DetalleTiqueteTavo> detalleTiqueteTavo;

    

    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       MAPEOS:  GET/SET           +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
   
   
    // ***************************************
    // MAPEO: Tiquete->ClienteTavo
    // ***************************************
    public ClienteTavo getClienteTavo() {
        return clienteTavo;
    }

    public void setClienteTavo(ClienteTavo clienteTavo) {
        this.clienteTavo = clienteTavo;
    }


    // ***************************************
    // MAPEO: Tiquete->EstadoTiqueteTavo
    // ***************************************
    public EstadoTiqueteTavo getEstadoTiqueteTavo() {
        return estadoTiqueteTavo;
    }

    public void setEstadoTiqueteTavo(EstadoTiqueteTavo estadoTiqueteTavo) {
        this.estadoTiqueteTavo = estadoTiqueteTavo;
    }






    // ***************************************
    // MAPEO: Tiquete->DetalleTiqueteTavo
    // ***************************************
    public List<DetalleTiqueteTavo> getDetalleTiqueteTavo() {
        return detalleTiqueteTavo;
    }

    public void setDetalleTiqueteTavo(List<DetalleTiqueteTavo> detalleTiqueteTavo) {
        this.detalleTiqueteTavo = detalleTiqueteTavo;
    }




   
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++      TRASIENT: DEFINICIÓN         ++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    

    // ***************************************
    // TRASIENT: Tiquete->ClienteTavo
    // ***************************************

    // Cliente: Cédula
    @Transient
    private String clienteCedula;

    // Cliente: Fecha Nacimiento
    @Transient
    private Date clienteFechaNacimiento;

    // Cliente: Nombre
    @Transient
    private String clienteNombre;

    // Cliente: Activo
    @Transient
    private Boolean clienteActivo;


    // ***************************************
    // TRASIENT: Tiquete->EstadoTiqueteTavo
    // ***************************************

    // EstadoTiqueteTavo: Nombre
    @Transient
    private String estadoTiqueteTavoNombre;

    // EstadoTiqueteTavo: Activo
    @Transient
    private Boolean estadoTiqueteTavoActivo;


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++         TRASIENT: GET/SET        +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


    // ***************************************
    // TRASIENT: Tiquete->ClienteTavo
    // ***************************************

    // Cliente: Cédula
    public String getClienteCedula() {
        clienteCedula = "";
        
        if (clienteTavo != null) {
            clienteCedula = clienteTavo.getCedula();
        }
        
        return clienteCedula;
    }

    public void setClienteCedula(String clienteCedula) {
        this.clienteCedula = clienteCedula;
    }


    // Cliente: Nombre
    public String getClienteNombre() {
        clienteNombre = "";
        
        if (clienteTavo != null) {
            clienteNombre = clienteTavo.getNombre();
        }
        
        return clienteNombre;
    }

    public void setClienteNombre(String clienteNombre) {
        this.clienteNombre = clienteNombre;
    }


    // Cliente: Fecha de Nacimiento
    public Date getClienteFechaNacimiento() {
        clienteFechaNacimiento = null;
        
        if (clienteTavo != null) {
            clienteFechaNacimiento = clienteTavo.getFechaNacimiento();
        }
        
        return clienteFechaNacimiento;
    }

    public void setClienteFechaNacimiento(Date clienteFechaNacimiento) {
        this.clienteFechaNacimiento = clienteFechaNacimiento;
    }

    // Cliente: Activo
    public Boolean getClienteActivo() {
        clienteActivo = null;
        
        if (clienteTavo != null) {
            clienteActivo = clienteTavo.getActivo();
        }
        
        return clienteActivo;
    }

    public void setClienteActivo(Boolean clienteActivo) {
        this.clienteActivo = clienteActivo;
    }


    // ***************************************
    // TRASIENT: Tiquete->EstadoTiqueteTavo
    // ***************************************

    // EstadoTiqueteTavo: Nombre
    public String getEstadoTiqueteTavoNombre() {
        estadoTiqueteTavoNombre = "";
        
        if (EstadoTiqueteTavo != null) {
            estadoTiqueteTavoNombre = estadoTiqueteTavo.getNombre();
        }
        
        return estadoTiqueteTavoNombre;
    }

    public void setEstadoTiqueteTavoNombre(String estadoTiqueteTavoNombre) {
        this.estadoTiqueteTavoNombre = estadoTiqueteTavoNombre;
    }


    // EstadoTiqueteTavo: Activo
    public Boolean getEstadoTiqueteTavoActivo() {
        estadoTiqueteTavoActivo = null;
        
        if (EstadoTiqueteTavo != null) {
            estadoTiqueteTavoActivo = estadoTiqueteTavo.getActivo();
        }
        
        return estadoTiqueteTavoActivo;
    }

    public void setEstadoTiqueteTavoActivo(Boolean estadoTiqueteTavoActivo) {
        this.estadoTiqueteTavoActivo = estadoTiqueteTavoActivo;
    }


    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++       CAMPOS: DEFINICIÓN    ++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    

    // Fecha
    @Column(name = "FECHA")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fecha;

    // Total
    @Column(name = "TOTAL")
    private BigDecimal total;





    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++          CAMPOS: GET/SET         +++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    
    

    // ***************************************
    // Fecha
    // ***************************************
    public Date getFecha() {
        return fecha;
    }
    
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    // ***************************************
    // Total
    // ***************************************
    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }
    

   

    


}
/**********************************************************************/
/**********************************************************************/
/***************      FIN DEFINICIÓN DE CLASE   ***********************/
/**********************************************************************/
/**********************************************************************/

tiqueteTavoEditForm.xhtml

  • Primero como vamos a crear más adelante el campo para el soporte de estadoTiqueteTavo
  • debemos modificar la configuración de los PanelGrid que tenemos actualmente generados por la platilla de VS code
  • Primero modificamos el panel principal para que se un panel de 2 columnas
  • Modificamos esto:
<p:panelGrid columns="1"
                         layout="grid"
                         styleClass="una-panelgrid-responsive">
  • Por esto
<p:panelGrid columns="2"
                         layout="grid"
                         columnClasses="una-columnclasses-vertical-align, una-columnclasses-vertical-align"
                         styleClass="una-panelgrid una-width-100">
  • Ahora modificamos el Panel 1.1
  • Modificando esto:
<p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-panelgrid-cl1-responsive">
  • Por esto:
<p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-float-right">
  • Así tenemos la primera columna del panel 1
  • ahora vamos a crear la segunda columna de panel 1 que contendrá el PanelGrid de EstadoTiqueteTavo
  • Así que al final el panelGrid 1.1 y antes que finalice el PaneGrid 1 agregamos el siguiente codigo
  • Agregamos el campo de EstadoTiquete
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++++    PANELGRID 1.2   +++++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <p:panelGrid columns="2"
                             layout="grid"
                             styleClass="una-float-right">

                        <!--####################################################################################-->
                        <!--#############################    NOMBRE  ESTADO   ##################################-->
                        <!--####################################################################################-->
                                    
                        <!--LABEL-->
                        <p:outputLabel id="nombreEstadoTiqueteTavoOutputLabel"
                                        for="nombreEstadoTiqueteTavoInputText"
                                        value="#{i18n.tiqueteTavo_estadoTiqueteTavo_nombre_label}"/>  

                        <!--PANEL-->
                        <p:outputPanel id="nombreEstadoTiqueteTavoOutputPanel">

                            <!--CAMPO-->
                            <p:inputText id="nombreEstadoTiqueteTavoInputText"
                                        value="#{tiqueteTavoBean.entity.estadoTiqueteTavoNombre}"
                                        
                                        maxlength="100" 
                                        size="25"
                                        disabled="#{true}"
                                        />    

                            <!--MENSAJE-->
                            <p:message id="nombreEstadoTiqueteTavoMessage"
                                        for="nombreEstadoTiqueteTavoInputText" />

                        </p:outputPanel>
                        <!--####################################################################################-->
                        <!--####################################################################################-->
                        <!--####################################################################################-->

                </p:panelGrid>
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
                <!-- +++++++++++++++++++++++++     FIN PANELGRID 1.2   ++++++++++++++++++++++++++++++++++++ -->
                <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
  • Ahora además de agregar el campo de estado, debemos hacer algo con respecto a las validaciónes
  • Y esta que actualmente se encuentra solamente para el botón de Guardar un tiquete, por tanto solo se ejecutarán si le damos este botón sin embargo
  • Cuando se agrega un flujo a un formulario el modifica el botón de GUARDAR por un botón de GURDAR E INICIAR EL FLUJO
  • Por tanto debemos agregar este botón en nuetro componente de validate para que tambien la funcionalidad de validar se ejecute cuando se de guardar en este botón
  • Para esto modificamos el componente
<!--####################################################################################-->
            <!--######################## CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->

            <!--Entrada oculta para validaciones-->
            <h:inputHidden id="tiqueteTavoValidator" value="true" >
                <f:attribute name="tiqueteTavo" value="#{tiqueteTavoBean.entity}"/>
                <f:validator binding="#{tiqueteTavoValidator}" disabled="#{empty param['formMantenimiento:toolbar:toolbar_saveBtn']}" />
            </h:inputHidden>
            <!--####################################################################################-->
            <!--###################  FIN CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->
  • Y le agregamos el botón de flujo que es igual pero con una letra «F» adicional
<f:validator binding="#{tiqueteTavoValidator}" disabled="#{empty param['formMantenimiento:toolbar:toolbar_saveBtnF']}" />
  • Quedando así
<!--####################################################################################-->
            <!--######################## CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->

            <!--Entrada oculta para validaciones-->
            <h:inputHidden id="tiqueteTavoValidator" value="true" >
                <f:attribute name="tiqueteTavo" value="#{tiqueteTavoBean.entity}"/>
                <f:validator binding="#{tiqueteTavoValidator}" disabled="#{empty param['formMantenimiento:toolbar:toolbar_saveBtn']}" />
                <f:validator binding="#{tiqueteTavoValidator}" disabled="#{empty param['formMantenimiento:toolbar:toolbar_saveBtnF']}" />
            </h:inputHidden>
            <!--####################################################################################-->
            <!--###################  FIN CAMPO OCULTO PARA VALIDACIÓN   ############################-->
            <!--####################################################################################-->
  • Como paso adicional agregamos la internacionalización

Creación de estados

  • En la base de datos creamos los estados necesarios para el ejemplo
  • Entonces vamos a tener 3 estados
    • 1- Nuevo: cuando se crea el tiquete o es rechazado por el superior
    • 2- Aprobado por funcionario
    • 3- Aprobado por Superior
    • 4- Anulado
  • Insertamos los estados
INSERT INTO ESTADO_TIQUETE_TAVO (
            ID_ESTADO_TIQUETE_TAVO, 
            NOMBRE, 
            ACTIVO, 
          
            FECHA_CREACION, 
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            VERSION,
            CAMPO_CONFIGURABLE) 
VALUES (
            1,
            'NUEVO', 
            1,
            
            SYSDATE,
            246,
            SYSDATE,
            246,
            0,
            NULL
            );
INSERT INTO ESTADO_TIQUETE_TAVO (
            ID_ESTADO_TIQUETE_TAVO, 
            NOMBRE, 
            ACTIVO, 
          
            FECHA_CREACION, 
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            VERSION,
            CAMPO_CONFIGURABLE) 
VALUES (
            2,
            'APROBADO POR FUNCIONARIO', 
            1,
            
            SYSDATE,
            246,
            SYSDATE,
            246,
            0,
            NULL
            );


INSERT INTO ESTADO_TIQUETE_TAVO (
            ID_ESTADO_TIQUETE_TAVO, 
            NOMBRE, 
            ACTIVO, 
          
            FECHA_CREACION, 
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            VERSION,
            CAMPO_CONFIGURABLE) 
VALUES (
            3,
            'APROBADO POR SUPERIOR', 
            1,
            
            SYSDATE,
            246,
            SYSDATE,
            246,
            0,
            NULL
            );


INSERT INTO ESTADO_TIQUETE_TAVO (
            ID_ESTADO_TIQUETE_TAVO, 
            NOMBRE, 
            ACTIVO, 
          
            FECHA_CREACION, 
            USUARIO_CREACION,
            FECHA_MODIFICACION,
            USUARIO_MODIFICACION,
            VERSION,
            CAMPO_CONFIGURABLE) 
VALUES (
            4,
            'ANULADO', 
            1,
            
            SYSDATE,
            246,
            SYSDATE,
            246,
            0,
            NULL
            );

SELECT * FROM ESTADO_TIQUETE_TAVO;
  • IMPORTANTE:
  • Despues de insertarlo se debe aplicar commit
  • Y ademas ejecutar el siguiente comando para que el NEXTVal se acualice se dee ejecutar hasta llegar el valor correcto
SELECT SQ_ESTADO_TIQUETE_TAVO.nextval  from dual;

Creación de flujo

admin
unacgi2019activiti
  • Ahora por los paramteros de configuración que deben tener los flujos de SIGESA
  <dataObject id="idFormMode" name="formMode" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>false</activiti:value>
      </extensionElements>
    </dataObject>
    <dataObject id="idApprovalCondition" name="approvalCondition" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>true</activiti:value>
      </extensionElements>
    </dataObject>
    <dataObject id="idCancelOption" name="cancelOption" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <activiti:value>true</activiti:value>
      </extensionElements>
    </dataObject>
  • Es más facil exportar uno y luego renombrarlo
  • para vamos a PROCESO->MODEL WORKSPACE Y buscamos uno y lo exportamos
  • Ahora debemos importar el archivo
  • PROCESO->MODEL WORKSPACE->IMPORT
  • Una vez que no cargo le damos Edit
  • Y le cambiamos
    • Process identifier: TiqueteTavo (nombre de la clase)
    • Name: Flujo para Tiquetes Tavo (PBS-ABS-TIQTAV) -> Nombre clave
    • Excution listenners: estado con el que debe iniciar el flujo (es uno que no se ve y siempre es nuevo)
#{tiqueteTavoBean.estadoInicial(1,"ESTADO_TIQUETE_TAVO","cr.ac.una.cgi.sigesa.pbs.abs.view.model.TiqueteTavoBean","cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService","NOMBRE")}
  • quedando así

  • Con esto ya podemos eliminar todos sus elementos y nos aseguramos que tenemos los parametros de configuración
  • Y con esto podemos comenzar a crear el flujo
  • Guardamos Flujo para TiquetesTavo (PBS-ABS-TIQTAV)
  • Le creamos el nombre Flujo para TiquetesTavo (PBS-ABS-TIQTAV)
  • Ahora agregamos el inicio del flujo
  • Ha este elemento debemos establecerle a que form pertenece para nuestro caso tiqueteTavoEditForm
  • Ahora el siguiente paso es crear la aprobación del usuario para esto buscamos Activities -> User Task
  • y lo agregamos y le configuramos
    • name: TAREA USUARIO: APROBAR POR FUNCIONARIO
    • Assignments: Candidate group: ROLE_UNA_PBS_ABS_TIQTAV_APROBAR_POR_FUNCIONARIO
    • Form Key: tiqueteTavoEditForm

NOTA IMPORTANTE:

  • El rol que se debe crear es UNA_PBS_ABS_TIQTAV_APROBAR_POR_FUNCIONARIO pero para que la aplicación funcione se le debe agregar la palabra «ROLE_» quedando así ROLE_UNA_PBS_ABS_TIQTAV_APROBAR_POR_FUNCIONARIO

Agregar Candidate (ROL-SIGESA)

  • Y ahora le agregamos el comentario
  • Ahora vamos a relacionar el inicio del flujo con el proceso
  • Agregamos la condicional
  • Y creamos la relación
  • Ahora creamos un tarea de servicio
  • Lo relacionamos
  • Y para modificar la linea podemos agregar puntos con la herramienta
  • Quedando así
  • Ahora esta línea va a responder a el caso que funcionario rechace la solicitud para indicar esto en el flujo sobre la línea debemos agregar la propiedad:
    • Flow condition
${!tiqueteTavoBean.isApproveTask()}
  • Agregamos
  • Ahora continuando con el rechazo por parte del funcionario lo que vamos hacer que si se rechaza la regresamos al estado inicial de nuevo
  • Le agregamos las propiedades para anular el flujo (4-Anulado)
    • name: Anular (ANULADO)
    • Expression:
#{tiqueteTavoBean.actualizarEstado(tiqueteTavoBean.entity,"ESTADO_TIQUETE_TAVO","cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService",4,"NOMBRE")}
  • Y así podemos agregar el elemento de cierre de flujo y relacionarlo
  • Ahora para probar que esta funcionando correctamente vamos a cerrrar el flujo aquí para probar su funcionamiento
  • Cerramos el flujo y creamos la condicional Sí
${tiqueteTavoBean.isApproveTask()}
  • Cerramos la edición y vamos a deploy

  • Si sale bien nos lleva Gestionar y lo podemos encontrar
  • Ahora debemos ir a SIGESA y logeanos como usuario funcionario 115080868
  • Y vamos a lista de roles y agregamos el rol UNA_PBS_ABS_TIQTAV_APROBAR_POR_FUNCIONARIO
  • Salimos y volvemos a ingresar
  • Y ingresamos a nuevo tiquete y si el botón de guardar tiene un nuevo formato de guardar e iniciar el flujo el flujo esta funcionando correctamente
  • Completamos los datos y le damos guardar
  • Y ahora podemos ver como aparecne los botones de aprobar / rechazar / ver flujo / Auditoría
  • Podemos entonces rechazar la tarea y ver su flujo
  • Para ver el flujo
  • Lo mismo pasaría para el caso de aprobado por funcionario
  • Así que podemos continuar editando el flujo para aprobación de SUPERIOR
  • agregamos la tarea de aprobado por funcionario

  • le creamos la relación y le agregamos la acción de aprobar por funcionario
  • Acción aprobar
${tiqueteTavoBean.isApproveTask()}
  • Y ademas la vamos a asignar el cambio de estado a APROBADO POR FUNCIONARIO (2)
#{tiqueteTavoBean.actualizarEstado(tiqueteTavoBean.entity,"ESTADO_TIQUETE_TAVO","cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService",2,"NOMBRE")}
  • Le agregamos comentario
  • Al igual que en el caso anterior vamos a crear un nuevo rol para que se le asigne al superior, para esta caso vamos hacer que sea root-juan el que deba aprobar
  • Rol: UNA_PBS_ABS_TIQTAV_APROBAR_POR_SUPERIOR
  • ingresamos a SIGESA -> LISTA DE ROLES -> NUEVO
  • Lo ceamos y se lo asignamos al usuario root-juan (SUPERIOR)
  • Regresamos al activity
  • y agregamos el candidate group
  • Y le agregamos ROLE_
  • Y le agregamos el Form Key: tiqueteTavoEditForm
  • Ahora vamos a agregar el proceso de el rechazo por parte del superior
  • agregamos la tarea
  • Le agregamos el cambio de estado por RECHADO POR SUPERIOR – NUEVO
#{tiqueteTavoBean.actualizarEstado(tiqueteTavoBean.entity,"ESTADO_TIQUETE_TAVO","cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService",1,"NOMBRE")}
  • Ahora creamos la relación de rechado por superior
  • Flow condition:
${!tiqueteTavoBean.isApproveTask()}
  • Y creamos la relación para regresar al inicio del flujo
  • Ahora creamos la tarea automática para cambiar el estado del tiquete a APROBADO POR SUPERIOR
  • Le agregamos
#{tiqueteTavoBean.actualizarEstado(tiqueteTavoBean.entity,"ESTADO_TIQUETE_TAVO","cr.ac.una.cgi.sigesa.pbs.abs.service.EstadoTiqueteTavoService",3,"NOMBRE")}
  • Ahora creamos la relación de APROBADO POR SUPERIOR
  • Creamos la relación final y el cierre del flujo
  • Para mejorar el ejemplo hemos modificado los datos de los procesos y comentarios quedando así en la versión final
  • Ahora guardamos y desplegamos el proyecto
  • Y podemos probar los diferentes casos
  1. El funcionario crea el tiquete y lo Anula

  1. Que superior lo rechace
  • Y que superior lo apruebe