---
# System prepended metadata

title: Guía de Desarrollo del ReportServer

---

---
title: 'Guía de Desarrollo del ReportServer'
---

## Contenido

[TOC]

## Introducción
---
En esta guía se describen las Apis necesarias para la disponibilización de un reporte utilizando la estructura propuesta que tiene como base le motor de reportes JasperReports.

Para el caso práctico de la presente guía se utilizará el utilizado en el caso de uso de *SOLICITUD DE CUENTA BANCARIA*.

## Objetivo
---
* Guiar al desarrollador en la creación de reportes con el motor JasperReports para el SIARE en sus direntes implentaciones.

## Prerrequisito
---
:::warning
En esta guía se asume que el entorno de desarrollo se ha configurado.
- Backend en el Spring Tool Suite para EclipseIDE 
- Java OpenJDK 17
- TIBCO Jaspersoft Studio 6.19 con plugins adicionales
:::

## Estructura
---
En el backend el proyecto se estructura de la siguiente manera:
![](https://i.imgur.com/qolDhxK.png)

El proyecto está diseñado para que el desarrollador sólo se enfoque en el diseño del reporte con la herramienta TIBO Jasper Studio y cree un controller del Spring que contedrá los endpoints de la API de reportería. Dicho controlador extenderá de una de las 3 clases bases predefinidas y que encapsulan el comportamiento de cada tipo de reporte.

El paquete   `py.gov.siare.reportserver.controller.base` contiene los 3 tipos de clases abstractas que definen 3 implementaciones  en la forma de llamar a los reportes, siendo uno se ellos **asincrónico**.
> Con el correr del tiempo pueden se ir definiendo más tipos de implementación en la llamada a los reportes.

Las clases abstractas predefinidas son :

* BaseReportserver**OnLine**Controller: sirve para reportes interactivos que son generados dinámicamente para algún front-end. Son los reportes más estándares en los que el usuario va cambiando algún parámetro del reporte para generar un nuevo conjunto de datos.

* BaseReportserve**InFile**Controller: sirve para generar reportes en un archivo que se guardará en un sistema de archivos. Se identifica con un nombre o etiqueta con el cual será conocido y deberá proporcionarse para buscar en el sistema de archivos y recuperar el reporte. Permite la sobreescritura de archivos mediante una llamada `post`

* BaseReportserve**Async**Controller: sirve para generar reportes de manera asincrónica en un archivo que se guardará en un sistema de archivos. También se lo identifica con un nombre o etiqueta con el cual será conocido y deberá proporcionarse para buscar en el sistema de archivos y recuperar el reporte. Utiliza una cola Kafka y una instancia Redis.

> Para la utilización de reportes asincrónicos se debe indicar la configuración de los servidores de Redis y Kafka.

Cada una de esas clases tienen métodos que deberán implementar el controlador que extiende la clase base, algunos son iguales y otros únicos a cada tipo de implementación del reporte.

## Ejemplo de llamadas al API del report-server
![](https://i.imgur.com/vQRPshV.png)
Los parámetros `keyParams`, `valueParams` y `typeParams` pueden recibir múltiples valores separados por coma. Ej.
> keyParams=P_1,P_2,P_3&valueParams=1,10,hola&TypeParams=Integer,Long,String.

Los tipos permitidos son los de Java: Integer, Long, Double y String.
## Ticket de validez única por llamada

Todas las llamadas cualquier API del **report-server** exigen un ticket o token que es un código Hash asignado al usuario que realiza la petición, para evitar  llamadas `get` indeseadas y/o duplicadas.

Ejemplo de llamada:
```javascript=
report-server/cuenta-bancaria-solicitud/obtener-ticket
```
Este ticket de uso único es por usuario y URL, por lo que su vigencia es temporal.

## Ubicación y versionado de fuentes Jasper

Como puede observarse en la imagen más arriba, todos los reportes se guardan en `src/main/resources/[modulo]` de tal forma a mantener el versionado en Git de los fuentes .jrml de JasperReport. También se guarda el compilado .jasper para mejorar el rendimiento en las llamadas a los reportes.

## Esquema para reportes asincrónicos

![](https://i.imgur.com/vrjwM22.png)

### Habilitación de Kafta y Redis localmente
En el proyecto Git `Spring Config Repo/report-server` debe estar configuardo en el archivo correspondiente al desarrollador `report-server-[usuario_desarrolador].properties`:
```javascript=
siare.kafka.enabled=true
kafka.brokers=192.168.169.104:9092
kafka.groupid=siare-notificacion
kafka.consumer.concurrency=1
kafka.user=
kafka.password=
kafka.topics=
kafka.usesecretsmanager=false
kafka.siare.consumer.max-poll-records:500
kafka.siare.consumer.fetch-max-wait-ms:500
kafka.siare.consumer.heartbeat-interval-ms:3000
kafka.siare.consumer.max-poll-interval-ms:300000
kafka.siare.consumer.session-timeout-ms:10000
spring.kafka.listener.ack-mode=manual

siare.redis.enabled=true
siare.redis.url= redis://redis01.siare.gov.py:6379
siare.redis.timeout = 60
```

### POM del proyecto Maven report-server
Fijarse cuáles son las librerías necesarias para JasperReport, Kafka y Redis. están comentadas las líneas en el archivo XML. Esto no se toca ya que está en el repositorio configurado.

