SIGESA: JASPER – Crear Reporte

  • En la siguente se explica como crear un reporte utilizando JASPER para SIGESA
  • Para la creación de la Herramienta se utilizará JASPER-STUDIO en la versión 6.20.0
  • Ahora si es la primera vez que se abre la herramienta lo primero que debemos hacer es crear una concexión a la base de datos, que para PPI es DESA07, para esto hacemos:

Creación de conexión

  • Ahora abrimos jasperStudio
  • Y le damos File->New->JasperReport
  • Seleccionamos donde vamos a guardar el reporte
  • Y le indicamos su nombre, para SIEGSA los nombres tienen la siguiente estructura
R-PROYECTO-MODULO-ENTIDADES (3 PRIMERAS LETRAS)

// EJEMPLO:
R-PBS-ABS.CLITAV
  • Le damos siguiente y debemos dar clic en la opción de: Data Adapter->New
  • Seleccionamos Databe JDBC Connection
  • Agregamos los datos de conexión (actualizado 2024)
Nombre: ORACLE-UNA-DESA07
JDBC Driver: Oracle (oracle.jdbc.driver.OracleDriver)
JDBC Url: jdbc:oracle:thin:@sigesadesa.una.ac.cr:1521/DESA07.una.ac.cr
Username: adm
Password: sigesa2015
  • Agregamos el driver que descargamos al inicio
  • Probamos la conexión
  • Resultado

  • Si ya hemos configurado algún «Data Adapters», pero ingresamos a un nuevo equipo y tenemos que agregar uno nuevo hacemos:

Agregar nuevo adaptador

  • Con la herramienta levantada vamos a la sección de «Data Adapters»
  • Y le damos la opción de «Create Data Adapter»
  • Seleccionamos «Database JDBC Connection»
  • Agregamos los datos de conexión
jdbc:oracle:thin:@sigesa-desa.una.ac.cr:1521:DESAXXX
adm
sigesa2015
  • Agregamos el driver que descargamos al inicio
  • Probamos la conexión
  • Resultado
  • Y con esto tendremos la nueva conexión

Creación de nuevo reporte

  • Una vez que ya tenemos una conexión a desa07, por demos crear un nuevo reporte
  • File->Jasper Report
  • Y Seleccionamos la opción de «Blank Letter Landscape»
  • Establecemos el nombre del reporte y donde lo vamos almacenar
    • FORMATO: R-PPI-PPE_NOMBRE / R=REPORTE PPI=PROYECTO PPE=MÓDULO
  • Le damos siguiente y nos solicita el Data Source
  • Luego para este punto podriamos agregarle la consulta SQL si la tenemos en la siguiente sección
  • NOTA IMPORTANTE: si contamos ya con la consulta la podemos pegar aquí, sin embargo es importante indicar que la consulta se pega sin el punto y coma «;», por que si no nos da error de consulta

  • Pero otra opción es hacer clic en el botón de «Finish» y luego agregarle al consulta cuando la tengamos
  • Para esto abrir SQLDeveloper yamos a crear la consulta
  • Para este ejemplo vamos a crear la siguiente consulta que utiliza las siguiente tablas
  • Y contiene las siguientes condiciones:
    • PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO == 1
    • PPI-ENCARGADO_MONITOERO.ACTIVO==1
  • Debe mostrar los siguientes campos:
    • Meta Estratégica (Código y Descripción concatenados)
    • Ámbito de Acción Universitaria (NOMBRE)
    • Códigos de Responsables (ENCARGADO_MONITOREO)
    • Responsables (Unión de todas las entidades que usaron la meta estratégica en alguna de sus acciones) Separado por un enter.
  • Tiene como parámetros los siguientes campos:
  • Tipo de Etapa.
    • Se mostrará en el autocomplete el nombre del tipo de etapa.
    • Generar y vincular el método que obtenga los distintos tipos de etapas de las etapas de planificación que tengan un tipo de plan de Acciones Estratégicas (PXE).
  • Periodo Anual.
    • Se mostrará en el autocomplete el año.
    • Generar y vincular el método que obtenga los distintos periodos anuales de las etapas de planificación que tengan un tipo de plan de Acciones Estratégicas (PXE).
  • Encargado de Monitoreo. Se utilizará para seleccionar el encargado específico.
  • Además como el reporte tiene parametros vamos a dejar valores fijos en la consulta que simulen los valores que serán pasados como parametros para luego remplazarlos

  • NOTA: si queremos probar los parametros en SQL Developer lo podemos hacer con dos puntos «:»
  • Y asi cuando ejecutemos la consulta nos solicita los parametros
  • Para este caso:
    • periodoAnual: 202
    • tipoEtapa:1
    • encrgadoMonitoreo: 141
  • Quedando así la consulta:
/*************************************************************************/
/***********************   DOCUMENTACIÓN   *******************************/
/*************************************************************************/
--T1: PPI_META_PMP
--T2: PPI.AMBITO_ACCION_UNIVERSITARIA 
--T3: PPI.ACCION_ESTRATEGICA
--T4: PPI.PLAN_ACCION_ESTRATEGICA
--T5: EPF.UNIDAD_EJECUTORA (PARA: PPI.PLAN_ACCION_ESTRATEGICA)
--T6: PPI.ENCARGADO_MONITOREO
--T7: EPF.UNIDAD_EJECUTORA (PARA: PPI.ENCARGADO_MONITOREO)
--T8: PPI.ETAPA_PLAN
--T9: PPI.ETAPA_PLAN (SELECT INTERNO)
--T10. EPF.PERIODO_ANUAL
--T11.PPO.TIPO_ETAPA

SELECT * FROM META_PMP;
SELECT * FROM ENCARGADO_MONITOREO;
SELECT * FROM UNIDAD_EJECUTORA;

SELECT 

        T10.ANO AS PERIODO_ANUAL, 
        T11.NOMBRE AS TIPO_ETAPA,
        T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
        T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
        T8.NOMBRE AS ETAPA,
        TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,    
        T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
        LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
        LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
        
        
        FROM PPI.META_PMP T1
        INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)        
        INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA) 
        INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
        INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
        INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
        INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
        
        WHERE 
        
                -- PARAMETRO:ENCARGADO_MONITOREO       
                (T6.UNIDAD_EJECUTORA = :encargadoMonitoreo)
            AND 
                -- PARAMETRO: ETAPA_PLAN
                (T4.ETAPA_PLAN = 
                                (SELECT 
                                        T9.ID_ETAPA_PLAN 
                                FROM ETAPA_PLAN T9
                                WHERE 
                                        T9.PERIODO_ANUAL = :periodoAnual 
                                    AND T9.TIPO_ETAPA = : tipoEtapa 
                                    AND T9.TIPO_PLAN = (
                                                SELECT 
                                                    VALOR 
                                                FROM SAS.PARAMETRO
                                                WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
                )  
            AND 
                -- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
                (T6.ACTIVO = 1)  
            AND 
                -- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
                (T4.ACTIVO = 1)
        GROUP BY 
                T10.ANO,
                T11.NOMBRE,
                T7.CODIGO, 
                T7.NOMBRE, 
                T8.NOMBRE, 
                TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION), 
                T2.NOMBRE;

        
        
 
  • Para descargarlo: aquí
  • Ahora que tenemos el SQL vamos al Jasper Studio y buscamos el icono
  • Nos abre una ventana donde vamos a pegar el SELECT
  • IMPORTANTE: quitar el punto y coma «;» utilizado en SQL Developer si no nos da error de consulta
  • Consulta final:
SELECT 

        T10.ANO AS PERIODO_ANUAL, 
        T11.NOMBRE AS TIPO_ETAPA,
        T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
        T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
        T8.NOMBRE AS ETAPA,
        TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,    
        T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
        LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
        LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
        
        
        FROM PPI.META_PMP T1
        INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)        
        INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA) 
        INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
        INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
        INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
        INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
        
        WHERE 
        
                -- PARAMETRO:ENCARGADO_MONITOREO       
                (T6.UNIDAD_EJECUTORA =  $P{encargadoMonitoreo} )
            AND 
                -- PARAMETRO: ETAPA_PLAN
                (T4.ETAPA_PLAN = 
                                (SELECT 
                                        T9.ID_ETAPA_PLAN 
                                FROM ETAPA_PLAN T9
                                WHERE 
                                        T9.PERIODO_ANUAL =  $P{periodoAnual} 
                                    AND T9.TIPO_ETAPA = $P{tipoEtapa} 
                                    AND T9.TIPO_PLAN = (
                                                SELECT 
                                                    VALOR 
                                                FROM SAS.PARAMETRO
                                                WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
                )  
            AND 
                -- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
                (T6.ACTIVO = 1)  
            AND 
                -- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
                (T4.ACTIVO = 1)
        GROUP BY 
                T10.ANO,
                T11.NOMBRE,
                T7.CODIGO, 
                T7.NOMBRE, 
                T8.NOMBRE, 
                TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION), 
                T2.NOMBRE
  • Verificamos que tenemos la conexión correcta
  • Hora este select es un caso especial ya que utiliza la función de ORACLE LISTAGG que permite agrupar datos en una sola columna
  • Por esta razón en lenguaje debemos utilizar «plsql» pero para un SELECT tradicional se debe selecionar «sql»
  • Ahora le inidcamos a JASPER que nos lea las columnas necesarias
  • Le damos OK
  • Y con esto ya podemos comenzar a trabajar en el reporte
  • Ahora como este reporte tiene un formato un poco diferente al estándar de SIGESA donde todos los campos están en una columna como se muestra en la siguiente imágen
  • Y al tener gran cantidad de datos en la columna de Meta Estratégica, se tomo la desición de presentarlo en el siguiente formato
  • Pero para un reporte tradicional lo primero que se debe hacer es
  • 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 este ejemplo vamos agregar el paso adicional que permite «Agrupar» por meta

Agrupar por metas

  • Ahora sobre el menú de “Outline” le damos “Create Group”
  • Y le damos un nombre y seleccionamos el campo principal que no se repite
  • Le indicamos que agregue footer y header
  • Esto nos agrega la seccion de METAS Group Header 1
  • Ahora solo queda que dentro del área de METAS Group Header se agregen los campos por los que se van a agrupar los registros y acomodar los campos

Formato del documento

  • Lo primero que se debe hacer es configurar el documento como tal para esto debemos
  • Hacer clic en el tpitulo del reporte y nos muestra sus propiedades
  • Vamos a la sección de Advanced y modificamos
    • Description: Descripción del reporte
    • Bottom Margin / Left Margin / Right Margin / Top Margin: los establecemos a cero
  • Además para cuando el usuario dije parametros que no devuelven datos y no presente una página en blanco y se considere un error vamos a buscar la propiedad «When No Data» y le damos el valor de All Sections No Detail
  • Dando como resultado

Encabezado

  • Para crear el encabezado agregamos un campo “Static Text”
  • Con las siguientes propiedades para PPI
    • Font: Dejavu Sans
    • Tamaño: 10
    • Centrado: horizontal y vertical
    • Negrita
    • Todos los campos deben estar a un 100% del width del reporte es decir 792 px
    • Y la altura es de 12px
    • Centrado horizontal y vertical
  • Y debe tener la siguiente estructura
  • EL formato del título es:
    • UNA
    • Sistema
    • Módulo
    • Reporte de
  • Para este ejemplo el formato se modificó un poco el diseño
  • Ahora debemos agregar un título descriptor del módulo, agregamos 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:
  • Para un campo de fecha es: dd/MM/yyyy
  • ahora debemos agregar la paginación del documento para esto vamos buscar la variables existentes en Jasper específicamente la «Page Number»
  • Y la agregamos y en sus propiedades en Expression lo modificamos para que tenga la siguiente estructura, donde le agregamos de una vez la variable de contador de paginas
"Página " + $V{PAGE_NUMBER} + " de " +$V{PAGE_COUNT}
  • Y le modificamos su altura
  • NOTA IMPORTANTE: todas las filas deben quedar a un 100% del Witdh para que cuando se exporte a excel no creen columnas en blanco o adicionales

Para reporte normal

  • 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
  • Ahora podemo sver un preview
  • Debemos revisar en formato pdf como excel

Notas importantes

  • Para campos de tipo fecha el formato es: dd/MM/yyyy
  • Para simbolo de colones de debe poner la text filed->Inheritance->PDF Embedded
  • Los campos deben tener una altura de 12
  • Pero si pueden tener una altura variable se les debe agregar
  • Como se indico antes todos los reportes deben tener sus campos al 100% de Witdh
  • Siempre se debe probar la exportación a excel para comprobar que no se creen filas o columnas en blanco
  • Reporte final jrxml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.20.0.final using JasperReports Library version 5.5.2  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="R-PPI-PPE-MetasPorEncargadoMonitoreo" pageWidth="792" pageHeight="612" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="792" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="2a308c2d-44a1-4353-9718-b01c1157286b">
	<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="DESA07"/>
	<property name="com.jaspersoft.studio.report.description" value="Reporte de Metas Estratégicas por Encargado de Monitoreo"/>
	<parameter name="encargadoMonitoreo" class="java.lang.Long">
		<parameterDescription><![CDATA[Parámetro Id de Unidad Ejecutora  Encargada de Monitoreo]]></parameterDescription>
	</parameter>
	<parameter name="periodoAnual" class="java.lang.Long">
		<parameterDescription><![CDATA[Período Anual de]]></parameterDescription>
	</parameter>
	<parameter name="tipoEtapa" class="java.lang.Long">
		<parameterDescription><![CDATA[Tipo de Etapa]]></parameterDescription>
	</parameter>
	<queryString>
		<![CDATA[SELECT 

        T10.ANO AS PERIODO_ANUAL, 
        T11.NOMBRE AS TIPO_ETAPA,
        T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
        T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
        T8.NOMBRE AS ETAPA,
        TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,    
        T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
        LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
        LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
        
        
        FROM PPI.META_PMP T1
        INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)        
        INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA) 
        INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
        INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
        INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
        INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
        
        WHERE 
        
                -- PARAMETRO:ENCARGADO_MONITOREO       
                (T6.UNIDAD_EJECUTORA =  $P{encargadoMonitoreo} )
            AND 
                -- PARAMETRO: ETAPA_PLAN
                (T4.ETAPA_PLAN = 
                                (SELECT 
                                        T9.ID_ETAPA_PLAN 
                                FROM ETAPA_PLAN T9
                                WHERE 
                                        T9.PERIODO_ANUAL =  $P{periodoAnual} 
                                    AND T9.TIPO_ETAPA = $P{tipoEtapa} 
                                    AND T9.TIPO_PLAN = (
                                                SELECT 
                                                    VALOR 
                                                FROM SAS.PARAMETRO
                                                WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
                )  
            AND 
                -- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
                (T6.ACTIVO = 1)  
            AND 
                -- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
                (T4.ACTIVO = 1)
        GROUP BY 
                T10.ANO,
                T11.NOMBRE,
                T7.CODIGO, 
                T7.NOMBRE, 
                T8.NOMBRE, 
                TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION), 
                T2.NOMBRE]]>
	</queryString>
	<field name="PERIODO_ANUAL" class="java.math.BigDecimal">
		<property name="com.jaspersoft.studio.field.name" value="PERIODO_ANUAL"/>
		<property name="com.jaspersoft.studio.field.label" value="PERIODO_ANUAL"/>
	</field>
	<field name="TIPO_ETAPA" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="TIPO_ETAPA"/>
		<property name="com.jaspersoft.studio.field.label" value="TIPO_ETAPA"/>
	</field>
	<field name="ENCARGADO_NONITOREO_CODIGO" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="ENCARGADO_NONITOREO_CODIGO"/>
		<property name="com.jaspersoft.studio.field.label" value="ENCARGADO_NONITOREO_CODIGO"/>
	</field>
	<field name="ENCARGADO_NONITOREO_NOMBRE" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="ENCARGADO_NONITOREO_NOMBRE"/>
		<property name="com.jaspersoft.studio.field.label" value="ENCARGADO_NONITOREO_NOMBRE"/>
	</field>
	<field name="ETAPA" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="ETAPA"/>
		<property name="com.jaspersoft.studio.field.label" value="ETAPA"/>
	</field>
	<field name="META_ESTRATEGICA" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="META_ESTRATEGICA"/>
		<property name="com.jaspersoft.studio.field.label" value="META_ESTRATEGICA"/>
	</field>
	<field name="AMBITO_ACCION_UNIVERSITARIA" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="AMBITO_ACCION_UNIVERSITARIA"/>
		<property name="com.jaspersoft.studio.field.label" value="AMBITO_ACCION_UNIVERSITARIA"/>
	</field>
	<field name="RESPONSABLES_COD" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="RESPONSABLES_COD"/>
		<property name="com.jaspersoft.studio.field.label" value="RESPONSABLES_COD"/>
	</field>
	<field name="RESPONSABLES" class="java.lang.String">
		<property name="com.jaspersoft.studio.field.name" value="RESPONSABLES"/>
		<property name="com.jaspersoft.studio.field.label" value="RESPONSABLES"/>
	</field>
	<group name="METAS">
		<groupExpression><![CDATA[$F{META_ESTRATEGICA}]]></groupExpression>
		<groupHeader>
			<band height="64">
				<staticText>
					<reportElement x="0" y="6" width="200" height="12" uuid="8d4bb611-d497-4baa-a578-f774f2105a3b">
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
					</reportElement>
					<textElement>
						<font fontName="DejaVu Sans" isBold="true"/>
					</textElement>
					<text><![CDATA[Meta Estratégica:]]></text>
				</staticText>
				<textField>
					<reportElement x="200" y="6" width="592" height="34" uuid="070d890b-19ed-43b9-8191-259cf077252e">
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
					</reportElement>
					<textElement>
						<font fontName="DejaVu Sans"/>
					</textElement>
					<textFieldExpression><![CDATA[$F{META_ESTRATEGICA}]]></textFieldExpression>
				</textField>
				<staticText>
					<reportElement x="0" y="40" width="200" height="12" uuid="3ec019ae-8c39-4539-8ba2-dc2a4be4a9ab">
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
					</reportElement>
					<textElement>
						<font fontName="DejaVu Sans" isBold="true"/>
					</textElement>
					<text><![CDATA[Ámbito de Acción Universitaria:]]></text>
				</staticText>
				<textField>
					<reportElement x="200" y="40" width="592" height="12" uuid="c0770fb3-b827-4dd1-909b-f19fe7379641">
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
					</reportElement>
					<textElement>
						<font fontName="DejaVu Sans"/>
					</textElement>
					<textFieldExpression><![CDATA[$F{AMBITO_ACCION_UNIVERSITARIA}]]></textFieldExpression>
				</textField>
				<staticText>
					<reportElement x="0" y="52" width="200" height="12" uuid="0ab534bc-987c-4912-982e-0a68a666c7c7">
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
						<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
					</reportElement>
					<textElement>
						<font fontName="DejaVu Sans" isBold="true"/>
					</textElement>
					<text><![CDATA[Códigos de Responsables:]]></text>
				</staticText>
				<staticText>
					<reportElement x="200" y="52" width="592" height="12" uuid="3eaafcaa-23c0-41bf-ab37-e1c4ae1ea82a">
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
					</reportElement>
					<textElement textAlignment="Left">
						<font fontName="DejaVu Sans" isBold="true"/>
					</textElement>
					<text><![CDATA[Responsables:]]></text>
				</staticText>
				<line>
					<reportElement x="0" y="5" width="792" height="1" uuid="d242e07c-172d-43bd-a639-3fbd20da7b5a">
						<property name="com.jaspersoft.studio.unit.width" value="px"/>
						<property name="com.jaspersoft.studio.unit.height" value="px"/>
					</reportElement>
					<graphicElement>
						<pen lineColor="#CCCCCC"/>
					</graphicElement>
				</line>
			</band>
		</groupHeader>
		<groupFooter>
			<band/>
		</groupFooter>
	</group>
	<background>
		<band splitType="Stretch"/>
	</background>
	<title>
		<band height="107" splitType="Stretch">
			<staticText>
				<reportElement x="0" y="0" width="792" height="12" uuid="bd45c4c8-d81a-4dfc-85d7-64e406f20b84">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement textAlignment="Center" verticalAlignment="Middle">
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[UNIVERSIDAD NACIONAL]]></text>
			</staticText>
			<staticText>
				<reportElement x="0" y="12" width="792" height="12" uuid="32d9721b-a334-4893-b1a4-f5d124ffec27">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement textAlignment="Center" verticalAlignment="Middle">
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[ÁREA DE PLANIFICACIÓN]]></text>
			</staticText>
			<staticText>
				<reportElement x="0" y="24" width="792" height="12" uuid="910be7fc-e1ad-4976-bf26-239616baa7e9">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement textAlignment="Center" verticalAlignment="Middle">
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[REPORTE METAS ESTRATÉGICAS POR ENCARGADO DE MONITOREO]]></text>
			</staticText>
			<staticText>
				<reportElement x="360" y="36" width="80" height="14" uuid="3fcf71fb-ed79-4381-891b-31e2a26cb306">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement textAlignment="Center">
					<font fontName="DejaVu Sans"/>
				</textElement>
				<text><![CDATA[SIGESA-PPI]]></text>
			</staticText>
			<textField pattern="dd/MM/yyyy">
				<reportElement x="0" y="50" width="200" height="12" uuid="1033ab71-bd80-4b63-a768-5c8b2b4bb6a5">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
			</textField>
			<textField>
				<reportElement x="200" y="95" width="592" height="12" uuid="fff7867d-4621-4e0e-b9eb-d8d565649258">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{ENCARGADO_NONITOREO_CODIGO}+ " " +$F{ENCARGADO_NONITOREO_NOMBRE}]]></textFieldExpression>
			</textField>
			<staticText>
				<reportElement x="0" y="95" width="200" height="12" uuid="7b465201-07f2-4e7f-89e5-d5d8043745ca">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[Encargado de Monitoreo:]]></text>
			</staticText>
			<staticText>
				<reportElement x="0" y="71" width="200" height="12" uuid="d4e2250d-d314-4313-b188-90cc04cf2e72">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[Perido Anual:]]></text>
			</staticText>
			<textField>
				<reportElement x="200" y="71" width="592" height="12" uuid="2e164a3e-373b-456f-895c-70867e356dc2">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{PERIODO_ANUAL}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElement x="200" y="50" width="592" height="12" uuid="e9a1193b-a423-4649-8150-55a819bf3d26">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement textAlignment="Right">
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA["Página " + $V{PAGE_NUMBER} + " de " +$V{PAGE_COUNT}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElement x="200" y="83" width="592" height="12" uuid="e7b635ae-c860-40ae-981e-b3e1a28a8f7a">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{TIPO_ETAPA}]]></textFieldExpression>
			</textField>
			<staticText>
				<reportElement x="0" y="83" width="200" height="12" uuid="1ea924b1-18b4-4d1f-a698-e82fbd48353d">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
					<property name="com.jaspersoft.studio.unit.width" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans" isBold="true"/>
				</textElement>
				<text><![CDATA[Tipo Etapa:]]></text>
			</staticText>
		</band>
	</title>
	<detail>
		<band height="30" splitType="Immediate">
			<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.FreeLayout"/>
			<property name="com.jaspersoft.studio.unit.height" value="px"/>
			<textField isStretchWithOverflow="true">
				<reportElement x="0" y="0" width="200" height="30" uuid="10444560-e9db-4129-b67c-172cfeab2b53">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{RESPONSABLES_COD}]]></textFieldExpression>
			</textField>
			<textField isStretchWithOverflow="true">
				<reportElement x="200" y="0" width="592" height="30" uuid="d297a0d6-4471-4d3a-87f0-b1ac2ff3d751">
					<property name="com.jaspersoft.studio.unit.height" value="px"/>
				</reportElement>
				<textElement>
					<font fontName="DejaVu Sans"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{RESPONSABLES}]]></textFieldExpression>
			</textField>
		</band>
	</detail>
</jasperReport>
  • Lo puede descargar desde aquí

Prueba del reporte

  • Ahora vamos a incluir este reporte dentro de SIGESA para probar su funcionamiento
  • para esto

Agregar los archivos al proyecto

  • Como estamos trabajando con jasperStudio en local y los archivos de SIGESA se encuentran en la MV debemos conectarnos por ssh y pegar los archivos en la ruta, si no existe la ruta la debemos crear
  • sigesa-ppi-ppe->sigesa-ppi-ppe-web->src->main->resources->META-INF->resources->reports
  • Y antes de pasar los archivos debemos compilarlo
  • Pasamos los archivos tanto el archivo .jasper como jrxml
  • Ahora para probar los reportes de forma local en la 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

Desplegar Reporte en SIGESA

  • Luego debemos registrar el nuevo reporte dentro del sistema
  • ingresamos a:
Lista de Reportes
  • Completamos:
  • NOTA: los nombre son de 3 digitos debia ser R-PPI-PPE-METPORENCMON
  • Luego debemos reportar el recurso
Lista de Recursos
  • Nuevo, pero aqupi debemos registrarlo de la siguiente forma
/pages/reporteJobLauncher.xhtml?reporte=R-PPI-PPE-METPORENCMON
  • Y le debemos asiganar un rol, para PPI UNA_PPI_ADMIN
  • Ahora debemos registrar el recurso en lista de menu
Lista de Menú
  • Agregamos el menú
  • Y con esto ya podremos probar su funcionamiento

Parametros

  • Ahora en el reporte vamos a crear el parametro de Encargado de Monitoreo
  • Para esto dentro de Jasper Studio en el menú de Outline->Parameters->Create Parameter
  • Creamos el parametro de ENCARGADO_MONITOREO con las siguientes propiedades:
    • Nombre: sin raya baja ú otro caracter
    • Class: Por ser llave java.lang.Long sino java.lang.String
    • Descripción: descrpcion del parametro (Parámetro Id de Unidad Ejecutora Encargada de Monitoreo)

  • Ahora debemos crear dos métodos un para el autocomplete y otro para el LOV
  • Hora para explicar mejor:
    • Dentro de la tabla ENCARGADO_MONITOREO existe una relación a UNIDAD_EJECUTORA
  • Por tanto para crear en los parametros del reporte un autocomplete que muestre solo las UNIDAD_EJECUTORA que existen en la tabla ENCARGADO_MONITOREO y que esten activos
  • Y como nota adicional como debemos mostrar en el autocomplete las UNIDADDES_EJECUTORAS, en los parametros debemos utilizar esta entidad que pertenece a EPF, por tanto aquí la modificación debe ser mínima
  • Por tanto, para ENCARGADOS_MONITOREO
    • Debemos crear un método que me devuelva los EM que estén activos
    • Y luego otra función que obtenga los EM activos y recorra la lista y obtenga los id de UNIDAD_EJECUTORA
    • Para que luego una metodo de UNIDAD_EJECUTORA obtenga esta lista y solo presente estas unidades

EncargadoMonitoreoRepository.java

  • Lo primero que hacemos es crear una función que nos devuelva una lista de EncargadosMonitoreo que tengan en su activo = true
/********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
    /**
     * Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
     * 
     * @param activo : 1 = activo / 0 = inactivo
     * @param query : codigo digitado por el usuario
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 08/11/2022
     * @fechaModificacion: 08/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public List <EncargadoMonitoreo> findAllByActivo(Boolean activo);
    /********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/

EncargadoMonitoreoService.java

  • Debemos tambien en el service declarar la función que va obtener la lista de encargadosMonitoreo donde activo = 1
/********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
    /**
     * Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
     * 
     * @param activo : 1 = activo / 0 = inactivo
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 08/11/2022
     * @fechaModificacion: 08/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public List <EncargadoMonitoreo> findAllByActivo(Boolean activo);
    /********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
  • Pero no solo requerimos obtener la lista de los EM, sino mas bien una lista de los ID de las Unidades Ejecutoras que existen dentro de EM
  • Por esta razón creamos una función adicional que va realizar esta tarea
  • Agregamos entonces la definición
/********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
    /**
     *
     * * Definición que retorna un List<Long> de Id's de Unidad Ejecutora, donde:
     * * los Id's existan en Encargado de Monitoreo
     * * Y si activo = 1
     *  
     * @author: Gustavo Matamoros g.
     * @version: 1.0.0
     * @fechaCreacion: 08/11/2022
     * @fechaModificacion: 08/11/2022 
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    /**********************************************************************/
    public List<Long> getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();

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

EncargadoMonitoreoServiceImpl.java

  • Ahorta vamos a crear la sobreescritura de los métodos
  • Primero la findAllByActivo, que practicamente le vamos a decir que busque los «true»
/********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
    /**
     * Ver {@link EncargadoMonitoreoService#findAllByActivo( java.lang.Boolean) }
     * Definición que retorna un List<EncargadoMonitoreo> de todos los Encargado de Monitoreo donde activo = 1
     * 
     * @param activo : 1 = activo / 0 = inactivo
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 08/11/2022
     * @fechaModificacion: 08/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public List <EncargadoMonitoreo> findAllByActivo(Boolean activo){

        // retornamos los true (activo=1)
        return repository.findAllByActivo(Boolean.TRUE);
    }

    /********************************************************************************************************/
    /********************************************************************************************************/
    /********************************************************************************************************/
  • Y la función «getIdsUnidadesEjecutorasEncargadoMonitoreoActivo»
  • Que va obtener todos los Encargados de Monitoreo donde EM.Activo == 1
  • Luego va aconstruir una list de id de UE
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Ver {@link EncargadoMonitoreoService#getIdsUnidadesEjecutorasEncargadoMonitoreoActivo( ) }
     *
     * * Método que retorna un List<Long> de Id's de Unidad Ejecutora, donde:
     * * los Id's existan en Encargado de Monitoreo
     * * Y si activo = 1
     *  
     * @author: Gustavo Matamoros g.
     * @version: 1.0.0
     * @fechaCreacion: 08/11/2022
     * @fechaModificacion: 08/11/2022 
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    /**********************************************************************/
    @Override

    public List<Long> getIdsUnidadesEjecutorasEncargadoMonitoreoActivo() {
    
        // Se crea una lista de Long's para almacenar los Id's de las Unidades Ejecutoras
        List <Long> unidadesEjecutorasIds = new ArrayList<>();
        
        // Obtenemos todos los encargados de monitoreo que están activos (activo=1)
        List <EncargadoMonitoreo> encargadoMonitoreoActivos = repository.findAllByActivo(Boolean.TRUE);

        // Recorremos la lista de encargados de Monitoreo, obtenemos el Id de de la Unidad Ejecutora y lo agregamos a la lista
        for (EncargadoMonitoreo encargadoMonitoreo : encargadoMonitoreoActivos) {
            unidadesEjecutorasIds.add(encargadoMonitoreo.getUnidadEjecutora().getId()); 
        }
        

        // Retornamos la lista
        return unidadesEjecutorasIds;
        
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

EPF: Unidad Ejecutora

  • Ahora dentro del proyecto EPF, se encuentran los archivos de administración de UNIDAD_EJECUTORA
  • Como es un proyecto de EPF y no PPI, solo debemos hacer cambios mínimos que serían una función que se encargue de:
    • autocomplete: findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo
    • LOV: findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV
  • Además ya dentro de UnidadEjecutoraServiceImpl.java existe una función «findAllDistinctByIdIn» que recibe la consulta (query) List <Long> de ID_UNIDADES_EJECUTORAS, pageable que va recibir la lista de id de UE que deseamos mostrar, facilitando la tarea

UnidadEjecutoraService.java

  • Creamos la definición para el autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para autocomplete
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param query: consulta del usuario
     * @param acl: paramatero de ACL
     * @param pageable: paramatro para paginación
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 07/11/2022
     * @fechaModificacion: 08/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */

    public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo(
        ArrayList<FilterSpecification> filterSpecifications,  
        String query, 
        String acl,
        Pageable pageable);
  • Y la definición para el LOV, que hacen lo mismo pero varian los parémetros
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para LOV
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param pageable: paramatro para paginación
     * @param params: parametros
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 07/11/2022
     * @fechaModificacion: 08/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV(
        ArrayList<FilterSpecification> filterSpecifications, 
        Pageable pageable, 
        Map<String,Object> params);

UnidadEjecutoraServiceImpl.java

  • Creamos la función de autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Método que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para autocomplete
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param query: consulta del usuario
     * @param acl: paramatero de ACL
     * @param pageable: paramatro para paginación
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 07/11/2022
     * @fechaModificacion: 08/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivo(
            ArrayList<FilterSpecification> filterSpecifications,  
            String query, 
            String acl,
            Pageable pageable) {
        
        // Obtenemos la lista de UE a mostrar        
        List<Long> unidadesEjecutorasId = encargadoMonitoreoService.getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();

        //Retornamos la lista de unidades ejecutoras
        return findAllDistinctByIdIn(query, unidadesEjecutorasId, pageable);
    }
  • Creamos la función del LOV
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Método que devuelve un Page<UnidadEjecutora> de Unidades Ejecutoras de acuerdo los Encargados de Monitoreo para LOV
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param pageable: paramatro para paginación
     * @param params: parametros
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 07/11/2022
     * @fechaModificacion: 08/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public Page<UnidadEjecutora> findAutoCompleteUnidadEjecutoraEncargadoMonitoreoActivoLOV(
                                                ArrayList<FilterSpecification> filterSpecifications, 
                                                Pageable pageable, 
                                                Map<String, Object> params) {

        // Le pasamos los filterSpecifications
        this.setFilterSpecifications(filterSpecifications);

        // Obtenemos la lista de UE a mostrar
        List<Long> unidadesEjecutorasId = encargadoMonitoreoService.getIdsUnidadesEjecutorasEncargadoMonitoreoActivo();

   
        //Retornamos la lista de las unidades ejecutoras                                      
        return findAllDistinctByIdIn("", unidadesEjecutorasId, pageable);
       
    }

SIGESA

  • Ahora debemos configurar el parametro
  • Vamos a ir a SIGESA a
Lista de Reportes
  • Y en la sección de parametros le damos agregar uno
  • Y le agregamos los siguientes datos
  • IMPORTANTE: Para campos autocomplete debe seleccionar tipo: Objeto
  • Ahora de damos agregar
  • Nos indica que se ha agregado correctamente pero que no se ha guardado en la BD
  • Ahora si selecionamos tipo:Objeto no aparece un nuevo botón que nos permite configurar el autocomplete
  • Y le agregamos la clase que deseamos trabajar
  • Si la clase que vamos a trabajar no se encuentra registrada dentro de SIGESA
  • Primero vamos a SAS->SAS->SAS – Mantenimiento->Lista de Entidades
  • Y le damo nuevo
Lista de Entidades
  • Reportamos la clase
    • Nombre: Nombre de la BD de la tabla
    • Clase Mapeada: ubicación de la clase
  • Ahora podemos regresar al reporte
Lista de Reportes
  • Seleccionamos el reporte a trabajar
  • Ingresamos al parametro
  • Configuramos el parametro
  • Le asignamos los valores
    • Clase Mapeada: clase que va atender el autocomplete
    • Propiedad objeto: campo por el que se va hacer la busqueda
    • Método filtrado: este es opcional y es para el autocomplete
      • Si no se pone nada va hacer una findAll
      • Y si es un método se debe poner aquí
    • Título del LOV Bean: título que va a presentar en el LOV
    • LOV Bean: LOV que se va encargar del manejo del la búsqueda
    • Método filtrado LOV: este es opcional y es para el LOV, su funcionalidad es igual que el de autocomplete pero sus parametros son diferentes
      • Si no se pone nada va hacer una findAll
      • Y si es un método se debe poner aquí
  • Luego de esto guardamos
  • Y ahora debemos regresar
  • Y volver a ingresar a la edición del parametro
  • Y asegurarmos que en la sección de avanzado haya reconocido
    • Nombre bean
    • Servicio clase
    • Converter Bean
  • Y si no asignarlos
  • Guardamos
  • Regresamos
  • Guardamos los cambios
  • Y regresamos
  • Y guardamos
  • Ya podemos ir al reporte y consultar su funcionamiento
  • Ingresamos al reporte y le damos a editar el parametro
  • Aparece el autocomplete, probamos su funcionamiento
  • Y el LOV
  • Seleccionamos una opción y aceptamos su valor
  • Y lanzamos el reporte

  • Obtenemos el resultado
  • Y si no tiene datos

Notas: importentes prueba parametros en Jasper Studio

  • A continuación vamos a trabajar los parametros de tipoEtapa y periodoAnual
  • NOTA:
    • Pero como datos importantes
    • Los parametros de SIGESA tipo llave son de tipo
java.lang.Long
  • Quedando asi

EncargadoMonitoreo

tipoEtapa

periodoAnual es long

  • Y el select se encuentra de la siguiente forma
SELECT 

        T10.ANO AS PERIODO_ANUAL, 
        T11.NOMBRE AS TIPO_ETAPA,
        T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
        T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
        T8.NOMBRE AS ETAPA,
        TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,    
        T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
        LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
        LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
        
        
        FROM PPI.META_PMP T1
        INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)        
        INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA) 
        INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
        INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
        INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
        INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
        
        WHERE 
        
                -- PARAMETRO:ENCARGADO_MONITOREO       
                (T6.UNIDAD_EJECUTORA = :encargadoMonitoreo)
            AND 
                -- PARAMETRO: ETAPA_PLAN
                (T4.ETAPA_PLAN = 
                                (SELECT 
                                        T9.ID_ETAPA_PLAN 
                                FROM ETAPA_PLAN T9
                                WHERE 
                                        T9.PERIODO_ANUAL = :periodoAnual 
                                    AND T9.TIPO_ETAPA = : tipoEtapa 
                                    AND T9.TIPO_PLAN = (
                                                SELECT 
                                                    VALOR 
                                                FROM SAS.PARAMETRO
                                                WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
                )  
            AND 
                -- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
                (T6.ACTIVO = 1)  
            AND 
                -- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
                (T4.ACTIVO = 1)
        GROUP BY 
                T10.ANO,
                T11.NOMBRE,
                T7.CODIGO, 
                T7.NOMBRE, 
                T8.NOMBRE, 
                TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION), 
                T2.NOMBRE;
  • Como vemos tenemos los parametros con «:»
  • Entonces para poder utilizarlos en Jasper Studio
  • En la sección de parametros podemos tomar uno y arrastrarlo y remplazar
  • y remplazar
  • Hacemos lo mismo para los otros parametros
  • Quedando así:
SELECT 

        T10.ANO AS PERIODO_ANUAL, 
        T11.NOMBRE AS TIPO_ETAPA,
        T7.CODIGO AS ENCARGADO_NONITOREO_CODIGO,
        T7.NOMBRE AS ENCARGADO_NONITOREO_NOMBRE,
        T8.NOMBRE AS ETAPA,
        TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION) AS META_ESTRATEGICA,    
        T2.NOMBRE AS AMBITO_ACCION_UNIVERSITARIA,
        LISTAGG(T5.CODIGO ,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES_cod,
        LISTAGG( T5.NOMBRE,CHR(13))WITHIN GROUP(ORDER  BY T5.ID_UNIDAD_EJECUTORA) AS RESPONSABLES
        
        
        FROM PPI.META_PMP T1
        INNER JOIN PPI.AMBITO_ACCION_UNIVERSITARIA T2 ON (T2.ID_AMBITO_ACCION_UNIVERSITARIA = T1.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN PPI.ACCION_ESTRATEGICA T3 ON (T3.META_PMP = T1.ID_META_PMP)        
        INNER JOIN PPI.PLAN_ACCION_ESTRATEGICA T4 ON (T4.ID_PLAN_ACCION_ESTRATEGICA = T3.PLAN_ACCION_ESTRATEGICA) 
        INNER JOIN EPF.UNIDAD_EJECUTORA T5 ON (T5.ID_UNIDAD_EJECUTORA = T4.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ENCARGADO_MONITOREO T6 ON (T6.ID_ENCARGADO_MONITOREO = T1.ENCARGADO_MONITOREO)
        INNER JOIN EPF.UNIDAD_EJECUTORA T7 ON (T7.ID_UNIDAD_EJECUTORA = T6.UNIDAD_EJECUTORA)
        INNER JOIN PPI.ETAPA_PLAN T8 ON (T8.ID_ETAPA_PLAN = T4.ETAPA_PLAN)
        INNER JOIN EPF.PERIODO_ANUAL T10 ON (T10.ID_PERIODO_ANUAL = T8.PERIODO_ANUAL)
        INNER JOIN PPI.TIPO_ETAPA T11 ON (T11.ID_TIPO_ETAPA = T8.TIPO_ETAPA)
        
        WHERE 
        
                -- PARAMETRO:ENCARGADO_MONITOREO       
                (T6.UNIDAD_EJECUTORA =  $P{encargadoMonitoreo} )
            AND 
                -- PARAMETRO: ETAPA_PLAN
                (T4.ETAPA_PLAN = 
                                (SELECT 
                                        T9.ID_ETAPA_PLAN 
                                FROM ETAPA_PLAN T9
                                WHERE 
                                        T9.PERIODO_ANUAL =  $P{periodoAnual} 
                                    AND T9.TIPO_ETAPA = $P{tipoEtapa} 
                                    AND T9.TIPO_PLAN = (
                                                SELECT 
                                                    VALOR 
                                                FROM SAS.PARAMETRO
                                                WHERE LLAVE = 'param_ppi_ppe_tipoPlan_PXE'))
                )  
            AND 
                -- CONDICIÓN: PPI.ENCARGADO_MONITOREO.ACTIVO=1
                (T6.ACTIVO = 1)  
            AND 
                -- CONDICIÓN: PPI.PLAN_ACCION_ESTRATEGICA.ACTIVO=1
                (T4.ACTIVO = 1)
        GROUP BY 
                T10.ANO,
                T11.NOMBRE,
                T7.CODIGO, 
                T7.NOMBRE, 
                T8.NOMBRE, 
                TRIM(T1.CODIGO || '. ' || T1.DESCRIPCION), 
                T2.NOMBRE
  • Guardamos
  • Y si le damos en preview
  • nos solicitará los valores de los parametros

  • Y así podemos garantizar el uso de parametros en los reportes desde Jasper Studio}

Parámetro: tipoEtapa

  • Ahora vamos a crear lo necesario para obtener los tipos de Etapa que existan para un tipo de plan que es una parametro SIGESA, específicamente param_ppi_ppe_tipoPlan_PXE
  • Lo primero que vamos hacer es que dentro de TipoPLan exista un métod que devuelva un TipoPlan según el parametro param_ppi_ppe_tipoPlan_PXE

TipoPlanService.java

  • Agregamos
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un TipoPlan según parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
     *
     * @return:TipoPlan
     *
     * @author Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 10/11/2022
     * @fechaModificacion: 10/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    public TipoPlan obtenerTipoPlan_PXE();
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

TipoPlanServiceImpl.java

  • Agregamos la definición
  • Pero para esto vamos a utilizar una función existente dentro de tipoPlan que ubica un TipoPlan según parametro
@Override
    public TipoPlan findTipoPlanByParametro(String param) {
        try {
            return findOne(Long.valueOf(parametroService.findOneByLlave(param).getValor()));
        } catch (NumberFormatException ex) {
            return null;
        }
    }
  • Por lo tanto los que debemos agregar es:
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Método que devuelve un TipoPlan según parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
     * Ver {@link TipoPlanService#obtenerTipoPlan_PXE() }
     *
     * @return:TipoPlan
     *
     * @author Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 10/11/2022
     * @fechaModificacion: 10/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public TipoPlan obtenerTipoPlan_PXE(){
        return findTipoPlanByParametro("param_ppi_ppe_tipoPlan_PXE");
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

EtapaPlanRepository.java

  • Ahora dentro de EtapaPLan vamos a agregar un método que devuelva un tipoPlan según un tipoPlan pasado como parametro
public List<EtapaPlan> findAllByTipoPlan(TipoPlan tipoPlan);

EtapaPlanService.java

  • Agregamos la definicion retorne todas las EtapaPlan que que tengan el tipoPlan = 3 (param_ppi_ppe_tipoPlan_PXE)
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un List<EtapaPlan> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE
     *
     * @return:List<EtapaPlan>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 12/11/2022
     * @fechaModificacion: 12/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
     public List<EtapaPlan> obtenerEtapaPlanPorTipoPlan_PXE();

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

EtapaPlanServiceImpl.java

  • Agregamos el método
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Ver {@link EtapaPlanService#obtenerEtapaPlanPorTipoPlan_PXE() }
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 12/11/2022
     * @fechaModificacion: 12/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public List<EtapaPlan> obtenerEtapaPlanPorTipoPlan_PXE() {
        
        TipoPlan tipoPlan_PXE = tipoPlanService.obtenerTipoPlan_PXE();
        return repository.findAllByTipoPlan(tipoPlan_PXE);
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

TipoEtapaService.java

  • Agregamos la definición para el autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param query: consulta del usuario
     * @param acl: paramatero de ACL
     * @param pageable: paramatro para paginación
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 11/11/2022
     * @fechaModificacion: 11/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE(
                    ArrayList<FilterSpecification> filterSpecifications, 
                    String query, 
                    String acl, 
                    Pageable pageable
                    );
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
  • Y agregamos la definición para el LOV
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param pageable: paramatro para paginación
     * @param params: parametros
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 07/11/2022
     * @fechaModificacion: 08/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE_LOV(
                        ArrayList<FilterSpecification> filterSpecifications, 
                        Pageable pageable, 
                        Map<String, Object> params
                    );
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

TipoEtapaServiceImpl.java

  • Agregamos el método para autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Método que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param query: consulta del usuario
     * @param acl: paramatero de ACL
     * @param pageable: paramatro para paginación
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 11/11/2022
     * @fechaModificacion: 11/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE(
                    ArrayList<FilterSpecification> filterSpecifications, 
                    String query, 
                    String acl, 
                    Pageable pageable
                    ) {

        // Almacena la lista de tipoEtapa final
        List<TipoEtapa> listaTiposEtapas = new ArrayList<>();

        //Almacena la lista de tipoPlan por PXE
        List<TipoEtapa> listaEtapaPlanPorTipoPlan_PXE = new ArrayList<>();
    
        // Obtenermos todas la EtapaPlan por PXE
        for(EtapaPlan etapa : etapaPlanService.obtenerEtapaPlanPorTipoPlan_PXE()){
            // Y obtenemos su tipoEtapa
            listaEtapaPlanPorTipoPlan_PXE.add(etapa.getTipoEtapa());
        }
        
        // Obtenemos y recorremos todos los tipoEtapa y preguntamos si existe en EtapaPlan y si si agregamos a la lista
        for(TipoEtapa te : this.findAll()){
            if(listaEtapaPlanPorTipoPlan_PXE.contains(te)){
                listaTiposEtapas.add(te);            
            }
        }        
    
        // Retornamos la listaTipoEtapa
        return new PageImpl(listaTiposEtapas);
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
  • Y el método para el LOV
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<TipoEtapa> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param pageable: paramatro para paginación
     * @param params: parametros
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 11/11/2022
     * @fechaModificacion: 11/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
    @Override
    public Page<TipoEtapa> findAutoCompleteTipoEtapaInEtapaPlanAndTipoPlan_PXE_LOV(
                        ArrayList<FilterSpecification> filterSpecifications, 
                        Pageable pageable, 
                        Map<String, Object> params
                    ) {
        
        // Le pasamos los filterSpecifications
        this.setFilterSpecifications(filterSpecifications);

        // Almacena la lista de tipoEtapa final
        List<TipoEtapa> listaTiposEtapas = new ArrayList<>();

        //Almacena la lista de tipoPlan por PXE
        List<TipoEtapa> listaEtapaPlanPorTipoPlan_PXE = new ArrayList<>();
    
        // Obtenermos todas la EtapaPlan por PXE
        for(EtapaPlan etapa : etapaPlanService.obtenerEtapaPlanPorTipoPlan_PXE()){
            // Y obtenemos su tipoEtapa
            listaEtapaPlanPorTipoPlan_PXE.add(etapa.getTipoEtapa());
        }
        
        // Obtenemos y recorremos todos los tipoEtapa y preguntamos si existe en EtapaPlan y si si agregamos a la lista
        for(TipoEtapa te : this.findAll()){
            if(listaEtapaPlanPorTipoPlan_PXE.contains(te)){
                listaTiposEtapas.add(te);            
            }
        }        
    
        // Retornamos la listaTipoEtapa
        return new PageImpl(listaTiposEtapas);
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

TipoEtapaLOVBean.java

  • Además como el LOVBean para TipoEtapa No exista lo creamos
/*
 * Copyright (c) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 *
 */

/**********************************************************************/
/**********************************************************************/
/*********************       PACKAGE     ******************************/
/**********************************************************************/
/**********************************************************************/
package cr.ac.una.cgi.sigesa.ppi.ppo.view.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: PPI/PPO         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
import cr.ac.una.cgi.sigesa.ppi.ppo.domain.TipoEtapa;
import cr.ac.una.cgi.sigesa.ppi.ppo.service.TipoEtapaService;

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       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;




/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++      DOCUMENTACIÓN          ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/**
 * Spring LOVBean Session para la administración de la entidad {@link TipoEtapa}
 *
 * @author Gustavo Matamoros González
 * @fecha 13/11/2022
 */


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*+++++++++++++       CONFIGURACIÓN         ++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@Component
@Scope("session")

/**********************************************************************/
/**********************************************************************/
/****************    DEFINICIÓN DE CLASE  *****************************/
/**********************************************************************/
/**********************************************************************/
public class TipoEtapaLOVBean extends LOVImpl<TipoEtapa, TipoEtapaService> implements LOV, Serializable {

    /*************************************************************************************************/
    /*************************************************************************************************/
    /******************************      CONSTRUCTOR     *********************************************/
    /*************************************************************************************************/
    /*************************************************************************************************/
    public TipoEtapaLOVBean() {

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

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

        List<LOVColumn> columns = new ArrayList<>();

        // Creamos las relaciones y ordenes de las columnas para el listado
   
        LOVColumn column1 = new LOVColumn("nombre",             getI18n("tipoEtapa_nombre_label"),            true);


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


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

    }

}

Parametro: periodoAnual

  • Ahora el periodo anual pertenece a EPF
  • Por tanto debemos crear todos los metdos necesarios dentro de PPO y PPE para que PeriodoAnual solo tenga una pequeña función
  • Para esto en:

EtapaPlanService.java

  • Vamos a crear la definición de autocomplete y LOV que va se ejecutada por periodo anual
  • Autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<PeriodoAnual> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para autocomplete
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param query: consulta del usuario
     * @param acl: paramatero de ACL
     * @param pageable: paramatro para paginación
     * @return: Page<PeriodoAnual>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 11/11/2022
     * @fechaModificacion: 11/11/2022
     * @módulo: PPI-PPE
     * @issue: PPI-244
     */
     public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
                ArrayList<FilterSpecification> filterSpecifications, 
                String query, 
                String property, 
                Pageable pageable);
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
  • LOV
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Definición que devuelve un Page<PeriodoAnual> donde los ID's se encuentren en ETAPA_PLAN y por parametro SIGESA: param_ppi_ppe_tipoPlan_PXE para LOV
     *
     * @param filterSpecifications: filtro de especificaciones
     * @param pageable: paramatro para paginación
     * @param params: parametros
     * @return: Page<UnidadEjecutora>
     *
     * @author Gustavo Matamoros G.
     * @fechaCreacion: 11/11/2022
     * @fechaModificacion: 11/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
                        ArrayList<FilterSpecification> filterSpecifications, 
                        Pageable pageable, 
                        Map<String, Object> params
                    );
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

EtapaPlanServiceImpl.java

  • Autocomplete
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Ver {@link EtapaPlanService#periodosAnualesPorTipoPlan_PXE() }
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 12/11/2022
     * @fechaModificacion: 12/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
                ArrayList<FilterSpecification> filterSpecifications, 
                String query, 
                String property, 
                Pageable pageable){
        // Almacena la lista de periodos
        List<PeriodoAnual> listaPeridosAnuales = new ArrayList<>();
        List<PeriodoAnual> listaPeridosAnualesEnEtapas = new ArrayList<>();
    
        
        for(EtapaPlan plan : this.obtenerEtapaPlanPorTipoPlan_PXE()){
            listaPeridosAnualesEnEtapas.add(plan.getPeriodoAnual());
        }
        
        for(PeriodoAnual per : periodoAnualService.findAll()){
            if(listaPeridosAnualesEnEtapas.contains(per)){
                listaPeridosAnuales.add(per);            
            }
        }        
        return new PageImpl(ordenaPlanesAnuales(listaPeridosAnuales));
       
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
  • LOV
/******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Ver {@link EtapaPlanService#periodosAnualesPorTipoPlan_PXE_LOV() }
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 12/11/2022
     * @fechaModificacion: 12/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
                    ArrayList<FilterSpecification> filterSpecifications, 
                    Pageable pageable, 
                    Map<String, Object> params){
        // Almacena la lista de periodos
        List<PeriodoAnual> listaPeridosAnuales = new ArrayList<>();
        List<PeriodoAnual> listaPeridosAnualesEnEtapas = new ArrayList<>();
    
        
        for(EtapaPlan plan : this.obtenerEtapaPlanPorTipoPlan_PXE()){
            listaPeridosAnualesEnEtapas.add(plan.getPeriodoAnual());
        }
        
        for(PeriodoAnual per : periodoAnualService.findAll()){
            if(listaPeridosAnualesEnEtapas.contains(per)){
                listaPeridosAnuales.add(per);            
            }
        }        
        return new PageImpl(ordenaPlanesAnuales(listaPeridosAnuales));
       
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
  • Y además vamos a crear una función privada para ordenar lo periodos anuales
 /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /**
     * Funcion que ordena una lista de Periodos Anuales
     * @author: Gustavo Matamoros G.
     * @version: 1.0.0
     * @fechaCreacion: 12/11/2022
     * @fechaModificacion: 12/11/2022
     * @modulo: PPI-PPE
     * @issue: PPI-244
     */
    private List<PeriodoAnual> ordenaPlanesAnuales(List<PeriodoAnual> listaPeriodosAnuales) {
        Collections.sort(listaPeriodosAnuales, new Comparator<PeriodoAnual>() {

            @Override
            public int compare(PeriodoAnual pp1, PeriodoAnual pp2) {
                return pp1.getAno().compareTo(pp2.getAno());
            }
        });
        return listaPeriodosAnuales;
    }
    /******************************************************************************************************************/
    /******************************************************************************************************************/
    /******************************************************************************************************************/

PeridoAnualService.java

  • Como periodos ANuales pertenece a EPF
  • Vamos a crear las funciones de autocomplete que invoquen a las funciones anteriores
  • Agregamos autocomplete y LOV
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(ArrayList<FilterSpecification> filterSpecifications, String query, String property, Pageable pageable);
    
public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(ArrayList<FilterSpecification> filterSpecifications, Pageable pageable, Map<String, Object> params);

PeridoAnualServiceImpl.java

  • Agregamos
@Override
    public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE(
                ArrayList<FilterSpecification> filterSpecifications, 
                String query, 
                String property, 
                Pageable pageable){
        return etapaPlanService.periodosAnualesPorTipoPlan_PXE( filterSpecifications, query,  property,  pageable);
    }

    @Override
    public Page<PeriodoAnual> periodosAnualesPorTipoPlan_PXE_LOV(
                        ArrayList<FilterSpecification> filterSpecifications, 
                        Pageable pageable, 
                        Map<String, Object> params
        ){
        return etapaPlanService.periodosAnualesPorTipoPlan_PXE_LOV( filterSpecifications, pageable,params);
    }

ReportarParametros en SIGESA

  • Ingresamos al reporte
  • Ingresamos a los parametros y los configuramos
  • Tipo etapa configuración
  • Parametro periodo anual

Probar el reporte

Publicar el reporte en servidor desarrollo

  • Ingresamos al servidor remoto
ssh cgi@10.0.100.30
  • Nos ubicamos a la dirección del reporte
cd /reportes/
  • Lo identificamos
  • Lo enviamos al servidor
scp R-PPI-PPE-METPORENCMON.jasper tomcat8@10.0.2.231:/reportes
  • pass: user4tomcat
  • RESULTADO
The authenticity of host '10.0.2.231 (10.0.2.231)' can't be established.
ED25519 key fingerprint is SHA256:tf9W7YHb8qPy5qUn9+G8dVVCTWx4fAN+Y4N6sic3mjg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.2.231' (ED25519) to the list of known hosts.
tomcat8@10.0.2.231's password: 
R-PPI-PPE-METPORENCMON.jasper                 100%   36KB   1.1MB/s   00:00