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.

Subsanaciones y Aportaciones


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 TTOEl 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:

https://[entorno]/tto_core/rest/tramite/list?applicationId=XXX&signature=000&creationStartDate=dd/mm/yyyy&summaryInfo=false&origin=SUBSANACION&requestSignature=XYZ

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:

        
http://[entorno]/tramitar/[alias-tramite]/requestSignature?numExpediente=XXXXXX - Dó
nde "alias-tramite" será el correspondiente a subsanaciones o aportaciones. En los servicios digitales de la SEDE electrónica, podrán consultarse los alias actualizados para subsanaciones y aportaciones.

A continuación se incluyen ejemplos que pueden clarificar esta información.

Ejemplo 1: recibir evento de un trámite TTO por medio 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 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 requestCodesignature y requestSignature. 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).

Para más información acerca de los eventos, consulte la documentación de SGA.

Ejemplo 2: recibir evento de una subsanación o aportación de TTO por medio 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 origin. 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).

Para más información acerca de los eventos, consulte la documentación de SGA.

Ejemplo 3: recibir evento de registro de un trámite de TTO por medio 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.

Ejemplo 4: recibir evento de recibo de información adicional de un trámite de TTO por medio 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:

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.

Ejemplo 5: construcción de la URL para subsanar con parámetros adicionales


Cuando se necesite asociar solicitudes existentes con nuevos trámites de tipo subsanación o aportación se utilizará la siguiente URL:

http://[entorno]/tramitar/[alias-tramite]/[requestSignature|requestCode]?numExpediente=XXXXXX&otroIdentificador=123456789

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:

http://desaplicaciones.aragon.es/tramitar/subsanaciones/1774?numExpediente=5764&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:

http://preaplicaciones.aragon.es/tramitar/aportaciones/100737Q9AYWCNQ9?numExpediente=5764&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:

http://aplicaciones.aragon.es/tramitar/aportaciones?numExpediente=5764&tercerIdentificador=BBBBBBB


Ejemplo 6: consultar una solicitud, subsanación o aportación finalizada


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();


Ejemplo 7: obtener la información de un listado de solicitudes de un día concreto


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 +
        "&registered=" + isRegistered +
        "&summaryInfo=" + isSummaryInfo +
        "&registerStartDate =" + registerStartDate +
        "&registerEndDate =" + 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();


Ejemplo 8: obtener la información de un listado de subsanaciones de un día concreto


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 +
        "&registered=" + isRegistered +
        "&summaryInfo=" + isSummaryInfo +
        "&registerStartDate =" + registerStartDate +
        "&registerEndDate =" + 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();