A continuación vamos a ver ejemplos de implementación java de los casos de uso principales de la aplicación TTO. Para ubicarlos en el proceso general, vamos a mostrar de nuevo el esquema del inicio que muestra cómo integrarse con TTO.
TTO es una herramienta que necesita de la configuración de los procedimientos y formularios para poder mostrar a los ciudadanos la información y los campos necesarios para completar su trámite. De esta forma, TTO no tiene un desarrollo específico para cada formulario, si no que tiene una serie de campos, configuraciones, funcionalidades y validaciones que pueden usarse para definir cada formulario y procedimiento específico.
Tanto para mostrar la interfaz, como para almacenar la información de un trámite concreto, TTO necesita leer la configuración del procedimiento y un xml donde se encuentra definida la estructura del formulario de ese procedimiento. Igualmente, una aplicación integradora de TTO, necesita conocer esa misma estructura para poder recoger la información concreta de los trámites de los procedimientos que gestiona. La configuración del procedimiento (los plazos de presentación, su origen, los parámetros admitidos...) puede variar en el tiempo, sin ir vinculado a una versión del formulario, son independientes. La configuración va a definir el comportamiento, pero no la información mostrada ni almacenada.
Cuando se producen cambios en la definición de los formularios en el entorno de producción, se cambia la versión del formulario, por lo que este dato también es relevante para las integraciones, ya que no siempre los cambios realizados son compatibles con versiones anteriores. Esto no depende de TTO, puesto que no va vinculado a una evolución del desarrollo de la herramienta, si no de cómo se defina el formulario, según las necesidades de sus responsables.
El caso de subsanaciones y aportaciones no es una excepción a lo expuesto anteriormente. Para TTO son un trámite más, no existe un desarrollo que los trate de forma particular, si bien se han abordado desarrollos para que TTO permitiese nuevas funcionalidades y campos adaptados a sus necesidades. Es el diseño del formulario y la configuración de los procedimientos que los respalda, lo que los hace particulares.
No obstante, por su relevancia de cara a la integración, se ha incluido este apartado recopilando la información necesaria para facilitar esta labor.
Lo primero necesario para integrarse con Subsanaciones y/o Aportaciones, es ser conocedor de la estructura de cada formulario en ese momento. Para ello, se pueden solicitar por medio de soportesda@aragon.es los xml que los definen en su última versión.
La forma de integrarse, sería, como en el resto de casos, haciendo uso de los eventos SGA. Esta integración sería la descrita en el apartado 3.2-Cómo integrarse con TTO. El servicio list debería quedar reservado para consultas puntuales o de respaldo, pero no como la forma principal y única de integración con TTO. Cuando se registra un trámite en TTO, se emite a través de esta plataforma un evento con los datos básicos de dicho trámite. En el caso concreto de subsanaciones y aportaciones, las aplicaciones integradoras deben consumir el evento finishedProcedureWithOrigin, que es el que permite recibir eventos cuando entran trámites que no son solicitudes.
Los datos de este evento finishedProcedureWithOrigin son:
De esta forma, cuando una aplicación integradora recibe un evento de este tipo, puede discriminar con la signatura y el origen, si el trámite le resulta de interés o si necesita más información para saber si debe procesarlo. De ser así, debe llamar al siguiente servicio para recuperar los datos del trámite:
http://[entorno]/tto_core/rest/tramite/get?applicationId=APP&requestCode=XXXXXXXXX
O, si se desea una respuesta en XML:
http://[entorno]/tto_core/rest/tramite/getXml?applicationId=APP&requestCode=XXXXXXXXX
Entre los datos del trámite figuran los datos necesarios para poder decidir si la aplicación integradora debe procesar la solicitud: signatura de la solicitud sobre la que se realiza la subsanación o aportación (requestSignature), organismos de destino y registro, etc. Se detallan todos los datos de la respuesta en los apartados del servicio IRequestService (servicios get y getXml).
Para hacer uso del servicio rest list, para poder recuperar los trámites correspondientes a una subsanación o aportación mediante este servicio list, es necesario especificar el parámetro origin=SUBSANACION (APORTACION), o bien origin=TODOS, de la siguiente forma:
Dónde:
Con el servicio rest list y los servicios rest get/getXml se puede recuperar la misma información, no es necesario invocar a uno y luego al otro.
De cara a la integración, también es relevante la forma en la que se presentó la solicitud:
A continuación se incluyen ejemplos que pueden clarificar esta información.
Para poder recibir eventos de trámites se deberán realizar los pasos descritos en el apartado 2.- Permisos y consideraciones previas para integración con TTO y suscribirse al evento finishedProcedure de SGA-Eventos. |
El ciudadano habrá creado un trámite y TTO generará eventos para las aplicaciones integradoras. Para la recepción de los eventos a los que se haya suscrito la aplicación integradora, debe implementar un servicio rest, accesible por SGA, que implemente la interfaz NotificationManager
/** * Interfaz REST común para las aplicaciones que integren el sistema de eventos * */ public interface NotificationManager{ @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Map<Long, Boolean> processNotification(RestEvent eventData); } |
La aplicación obtendrá un objeto JSON como el siguiente:
{ number=10073; requestCode=100737Q9AYWCNQ9; signature=1774; requestSignature=1818; } |
Los datos que nos interesan son requestCode, signature y requestSignature. Con estos datos:
Comprobaremos si la signatura se corresponde con la de un trámite que sea de interés.
Una vez terminado todo el proceso, el servicio tiene que devolver a SGA un mapa donde la clave sea ese id único y el valor el resultado de procesar los datos asociados (true → procesado con éxito; false → se ha producido algún error).
Para más información acerca de los eventos, consulte la documentación de SGA. |
Para poder recibir eventos de trámites se deberán realizar los pasos descritos en el apartado 2.- Permisos y consideraciones previas para integración con TTO y suscribirse al evento finishedProcedureWithOrigin de SGA-Eventos. |
El ciudadano habrá realizado una subsanación o aportación y TTO generará eventos para las aplicaciones integradoras. Para la recepción de los eventos a los que se haya suscrito la aplicación integradora, debe implementar un servicio rest, accesible por SGA, que implemente la interfaz NotificationManager
/** * Interfaz REST común para las aplicaciones que integren el sistema de eventos * */ public interface NotificationManager{ @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Map<Long, Boolean> processNotification(RestEvent eventData); } |
La aplicación obtendrá un objeto JSON como el siguiente:
{ number=10073; requestCode=100737Q9AYWCNQ9; signature=1774; requestSignature=1818; origin="SUBSANACION"; // Puede tomar los valores APORTACION, RECURSO, SUBSANACION y TODOS } |
Los datos que nos interesan son requestCode, signature, requestSignature y origin. Con estos datos:
Comprobaremos si la signatura se corresponde con la de un trámite que sea de interés.
Una vez terminado todo el proceso, el servicio tiene que devolver a SGA un mapa donde la clave sea ese id único y el valor el resultado de procesar los datos asociados (true → procesado con éxito; false → se ha producido algún error).
Para más información acerca de los eventos, consulte la documentación de SGA. |
Para poder recibir eventos de trámites se deberán realizar los pasos descritos en el apartado 2.- Permisos y consideraciones previas para integración con TTO y suscribirse al evento registerProcedure de SGA-Eventos. |
El ciudadano habrá registrado un trámite y TTO generará eventos para las aplicaciones integradoras. Para la recepción de los eventos a los que se haya suscrito la aplicación integradora, debe implementar un servicio rest, accesible por SGA, que implemente la interfaz NotificationManager
/** * Interfaz REST común para las aplicaciones que integren el sistema de eventos * */ public interface NotificationManager{ @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Map<Long, Boolean> processNotification(RestEvent eventData); } |
La aplicación obtendrá un objeto JSON como el siguiente:
{ csvRegisterReceipt=CSVMD3O30L6DG1X00SRT; csvRequest=CSV5745Q0P5D01X01TTO; number=31904; registerId=RT_000009292/2022; requestCode=31904AXZS1MXKFF; requestSignature=1903; signature=1903 } |
Los datos que nos interesan son csvRegisterReceipt, csvRequest y signature. Con estos datos:
Una vez terminado todo el proceso, el servicio tiene que devolver a SGA un mapa donde la clave sea ese id único y el valor el resultado de procesar los datos asociados (true → procesado con éxito; false → se ha producido algún error).
Se recomienda el uso de este nuevo evento para obtener la información de los trámites registrados ya que es independiente del origen del trámite y se recibe más información que en finishedProcedure o finishedProcedureWithOrigin .
Para más información acerca de los eventos, consulte la documentación de SGA.
Para poder recibir eventos de trámites se deberán realizar los pasos descritos en el apartado 2.- Permisos y consideraciones previas para integración con TTO y suscribirse al evento addInfoProcedure de SGA-Eventos. |
El ciudadano habrá registrado un trámite y TTO generará eventos para las aplicaciones integradoras. Para la recepción de los eventos a los que se haya suscrito la aplicación integradora, debe implementar un servicio rest, accesible por SGA, que implemente la interfaz NotificationManager.
Este evento addInfoProcedure complementa al descrito en el punto anterior ya que envía toda la información de un trámite completo, es decir una vez se haya finalizado su registro y su envío a BENT. De esta manera nos informará de datos que no nos han llegado en el evento anterior registerProcedure .
/** * Interfaz REST común para las aplicaciones que integren el sistema de eventos * */ public interface NotificationManager{ @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Map<Long, Boolean> processNotification(RestEvent eventData); } |
La aplicación obtendrá un objeto JSON como el siguiente:
{ bentId=44640; csvRegisterReceipt=CSVYE7XAJO2CE1900SRT; csvRequest=CSV1C5BIDD4CK1X01TTO; number=31908; registerId=RT_000009293/2022; requestCode=31908HXDMDTK7H8; requestSignature=1903; signature=1903 } |
Los datos que nos interesan son bentId, csvRegisterReceipt, csvRequest y signature. Con estos datos:
Este evento addInfoProcedure se lanza siempre después del explicado en el punto anterior registerProcedure, ya que amplía los datos enviados por este primero. Podría darse la situación en el que ocurrieran errores en la aplicación SGA y estos eventos llegaran en una secuencia distitna.
Una vez terminado todo el proceso, el servicio tiene que devolver a SGA un mapa donde la clave sea ese id único y el valor el resultado de procesar los datos asociados (true → procesado con éxito; false → se ha producido algún error).
Se recomienda el uso de este nuevo evento para obtener la información completa de los trámites ya que es independiente del origen del trámite y se recibe más información que en finishedProcedure o finishedProcedureWithOrigin .
Para más información acerca de los eventos, consulte la documentación de SGA.
Cuando se necesite asociar solicitudes existentes con nuevos trámites de tipo subsanación o aportación se utilizará la siguiente URL:
Los parámetros para poder construir la URL correctamente son los siguientes:
1Los parámetros requestSignature y requestCode son excluyentes. Sólo se puede indicar uno de los dos parámetros. |
Tanto el número de expediente como otros parámetros adicionales se guardaran en el bloque queryParams:
queryParams {numExpediente: "555",miCosa: "otroIdentificador"} |
Ejemplos de invocación
Asociar una subsanación en el entorno de DES a la solicitud con signatura 1774 y número de expediente 5764 y un identificador personalizado "unIdentificador" 123456789:
Asociar una aportación en el entorno PRE a la solicitud con código 100737Q9AYWCNQ9 y número de expediente 5764 y un identificador personalizado "otroIdentificador" AAAAAAAA:
Asociar una aportación en el entorno PRO a la solicitud con número de expediente 5764 y un identificador personalizado "tercerIdentificador" BBBBBBB:
Una vez recibido un SGA-Evento de TTO, comprobaremos si el trámite es de interés para la aplicación. En el caso de que la solicitud sea de interés, realizar una invocación al servicio get/getXml de TTO utilizando como parámetro de entrada requestCode.
// PASO 1: Establecer los parámetros de búsqueda // Id de la aplicación que está accediendo a TTO String APPLICATION_ID = "XXX"; // identificador de la solicitud String requestCode = "100737Q9AYWCNQ9"; // PASO 2: Establecer la conexión URL url = new URL("https://aplicaciones.aragon.es/tto_core/rest/tramite/get?" + "applicationId=" + APPLICATION_ID + "&requestCode =" + requestCode); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json"); // Gestionar respuesta incorrecta if (connection.getResponseCode() != 202) { System.out.println("Respuesta incorrecta"); } // PASO 3: Convertir la respuesta del servicio en el objeto del trámite StringBuilder responseStrBuilder = new StringBuilder(); BufferedReader streamReader = new BufferedReader( new InputStreamReader(connection.getInputStream(), "UTF-8")); String inputStr; while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } // Configurar GSON para recuperar las fechas con tiempo UNIX GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong())); Gson gson = builder.create(); // Convertir la respuesta a ResultTramiteBean ResultTramiteBean tramite = gson.fromJson(responseStrBuilder.toString(), ResultTramiteBean.class); // PASO 4: Desconectar connection.disconnect(); |
// PASO 1: Establecer los parámetros de búsqueda // Id de la aplicación que está accediendo a TTO String APPLICATION_ID = "XXX"; // identificador de la solicitud String requestCode = "100737Q9AYWCNQ9"; // PASO 2: Establecer la conexión URL url = new URL("https://aplicaciones.aragon.es/tto_core/rest/tramite/get?" + "applicationId=" + APPLICATION_ID + "&requestCode =" + requestCode); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json"); // Gestionar respuesta incorrecta if (connection.getResponseCode() != 202) { System.out.println("Respuesta incorrecta"); } // PASO 3: Convertir la respuesta del servicio en el objeto del trámite TransformXMLToObject transformer = new TransformXMLToObject(); ResultTramiteBean tramite = transformer.parseTramiteBeanFromFile( connection.getInputStream()); // PASO 4: Desconectar connection.disconnect(); |
El servicio de consulta de un listado de solicitudes puede tener diversas aplicaciones puntuales.
El ejemplo de invocación que se muestra a continuación será de utilidad para consultar las solicitudes finalizadas en un día concreto. Así se podrá consultar si, por algún fallo técnico, la aplicación integradora no ha recibido alguna solicitud finalizada del trámite que nos interesa. Se va a tomar como ejemplo la signatura 1903 y el día 26/03/2020.
// PASO 1: Establecer los parámetros de búsqueda // Id de la aplicación que está accediendo a TTO String APPLICATION_ID = "XXX"; // Signaturas de los procedimientos a consultar int signature = 1903; // Se consultan las solicitudes registradas boolean isRegistered = true; // Se consultan únicamente la información básica de las solicitudes, no el formulario boolean isSummaryInfo = true; // Fecha inicio de registro de la solicitud String registerStartDate = "26/01/2021"; // Fecha fin de registro de la solicitud String registerEndDate = "26/01/2021"; // PASO 2: Preparar la conexión URL url = new URL("https://aplicaciones.aragon.es/tto_core/rest/tramite/list?" + "applicationId=" + APPLICATION_ID + "&signature=" + signature + "®istered=" + isRegistered + "&summaryInfo=" + isSummaryInfo + "®isterStartDate =" + registerStartDate + "®isterEndDate =" + registerEndDate ); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json"); if (connection.getResponseCode() != 202) { System.out.println("Respuesta incorrecta"); } // PASO 3. Recuperamos la respuesta del servicio en formato String StringBuilder responseStrBuilder = new StringBuilder(); BufferedReader streamReader = new BufferedReader( new InputStreamReader(connection.getInputStream(), "UTF-8")); String inputStr; while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } // PASO 4. Configurar GSON para recuperar las fechas desde formato UNIX GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong())); Gson gson = builder.create(); // PASO 5. Convertir la respuesta al objeto del trámite JsonArray json = gson.fromJson(responseStrBuilder.toString(), JsonArray.class); ResultTramiteBean tramite = gson.fromJson(responseStrBuilder.toString(), ResultTramiteBean.class); ResultTramiteBean tramiteList[] = gson.fromJson(json, ResultTramiteBean[].class); // PASO 6. Desconectar connection.disconnect(); |
El servicio de consulta de un listado de solicitudes puede tener diversas aplicaciones puntuales.
El ejemplo de invocación que se muestra a continuación será de utilidad para consultar las subsanaciones finalizadas en un día concreto. Así se podrá consultar si, por algún fallo técnico, la aplicación integradora no ha recibido alguna subsanación finalizada del trámite que nos interesa. Se va a tomar como ejemplo la signatura 1903 y el día 26/01/2021.
// PASO 1: Establecer los parámetros de búsqueda // Id de la aplicación que está accediendo a TTO String APPLICATION_ID = "XXX"; // Signatura del procedimiento de subsanaciones int signature = ...; // Signatura del procedimiento efectivo del tramite a efectos de metadatado y registro. (opcional) int requestSignature = 1903; // Se consultan las solicitudes registradas boolean isRegistered = true; // Se consultan únicamente la información básica de las solicitudes, no el formulario boolean isSummaryInfo = true; // Fecha inicio de registro de la solicitud String registerStartDate = "26/01/2021"; // Fecha fin de registro de la solicitud String registerEndDate = "26/01/2021"; // Se indica que sea una subsanacion String origin = "SUBSANACION"; // PASO 2: Preparar la conexión URL url = new URL("https://aplicaciones.aragon.es/tto_core/rest/tramite/list?" + "applicationId=" + APPLICATION_ID + "&signature=" + signature + "&requestSignature=" + requestSignature + "®istered=" + isRegistered + "&summaryInfo=" + isSummaryInfo + "®isterStartDate =" + registerStartDate + "®isterEndDate =" + registerEndDate "&origin=" + origin); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json"); if (connection.getResponseCode() != 202) { System.out.println("Respuesta incorrecta"); } // PASO 3. Recuperamos la respuesta del servicio en formato String StringBuilder responseStrBuilder = new StringBuilder(); BufferedReader streamReader = new BufferedReader( new InputStreamReader(connection.getInputStream(), "UTF-8")); String inputStr; while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } // PASO 4. Configurar GSON para recuperar las fechas desde formato UNIX GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong())); Gson gson = builder.create(); // PASO 5. Convertir la respuesta al objeto del trámite JsonArray json = gson.fromJson(responseStrBuilder.toString(), JsonArray.class); ResultTramiteBean tramite = gson.fromJson(responseStrBuilder.toString(), ResultTramiteBean.class); ResultTramiteBean tramiteList[] = gson.fromJson(json, ResultTramiteBean[].class); // PASO 6. Desconectar connection.disconnect(); |