PORTAFIRMAS-CARM
Versión | Fecha | Autor |
---|---|---|
Portafirmas CARM | 01/10/2016 | Jose Luis Martínez del Amor |
Introducción
El envío de operaciones al Portafirmas de la CARM (https://portafirmas-pru.carm.es) se realiza en 2 fases:
- Fase de preparación de datos: Se preparan los datos necesarios para el envío en nuestras tablas.
- Fase de envío: Se recopilan los datos de la solicitud y se envían al portafirmas. Una vez realizado el envío ya no se podrá modificar la operación, sólo se podrá consultar el estado de la solicitud, descargar documentos firmados y realizar la anulación de una operación firmada.
Tanto las tablas como los paquetes están en el esquema CATALOGO.
Preparación de datos
Modelo de datos
El modelo de datos para la firma es el siguiente:
Operación de firma
Contiene los datos esenciales de la operación de firma:
CATALOGO.FIRMA_PORTAFIRMASCARM | ||
Campo | Tipo | Descripción |
ID | Numérico | ID de la operación |
IDPORTAFIRMA | Numérico | ID de operación en portafirmas CARM |
IP | Cadena (40) | IP origen de la solicitud. |
SOLICITANTE | Cadena (40) | Solicitante autorizado por portafirmas CARM |
APLICACION | Cadena (50) | Aplicación para la que se expide la firma |
EXPEDIENTE | Cadena (50) | Identificador interno de la aplicación solicitante |
ASUNTO | Cadena (200) | Asunto |
ESTADO | Cadena (1) | Estado de la solicitud de firma: 0=Preparando, 1=Enviando, I=Iniciado, P=Pendiente, F=Firmada, R=Rechada, E=Eliminada, D=Desconocido, A=Anulada |
MOTIVOESTADO | Cadena (50) | Motivo del estado de la solicitud |
ORDENADO | Cadena (1) | Flujo de firmas Ordenado: S=Si, N=No |
Paso de la firma
Contiene los datos de un paso en el flujo de firmas de la operación:
CATALOGO.FIRMA_PORTAFIRMASCARM_PASO | ||
Campo | Tipo | Descripción |
IDFIRMA | Numérico | ID de la operación de firma |
IDPASO | Numérico | ID del paso en la operación de firma, es el orden que se aplicará en caso de indica ORDENADO = ‘S’ en la operación de firma. |
DESCRIPCION | Cadena (60) | Descripción del paso de firma. |
Firmante
Contiene los datos de un firmante de la operación:
CATALOGO.FIRMA_PORTAFIRMASCARM_FIRM | ||
Campo | Tipo | Descripción |
IDFIRMA | Numérico | ID de la operación de firma |
IDPASO | Numérico | ID del paso en la operación de firma, es el orden que se aplicará en caso de indica ORDENADO = ‘S’ en la operación de firma. |
IDENTIFICADOR | Cadena (1000) | Identificador CARM del firmante. |
Documento
Contiene los datos de un firmante de la operación:
CATALOGO.FIRMA_PORTAFIRMASCARM_DOC | ||
Campo | Tipo | Descripción |
IDFIRMA | Numérico | ID de la operación de firma |
IDDOC | Numérico | ID del documento dentro de la operación de firma. |
CONTENIDO | CLOB | Contenido del documento original en Base 64. El contenido del documento se conserva hasta que es enviado al portafirmas, entonces tendrá valor NULL. |
DESCRIPCION | Cadena (60) | Descripción del documento. |
VALIDACIONID | Cadena (20) | Código asignado al documento por el Portafirmas de la CARM.
|
Operaciones de preparación de los datos
Todas las operaciones de preparación de datos están en el paquete CATALOGO.PFIRMA_PORTAFIRMASCARM.
Iniciar Operación de Firma
Para iniciar una operación de firma se debe invocar a la siguiente función:
/* Iniciar el montaje de una operación de firma. */
FUNCTION iniciarOperacionFirma(
pvIp FIRMA_PORTAFIRMASCARM.IP%TYPE,
pvSolicitante FIRMA_PORTAFIRMASCARM.SOLICITANTE%TYPE,
pvAplicacion FIRMA_PORTAFIRMASCARM.APLICACION%TYPE,
pvExpediente FIRMA_PORTAFIRMASCARM.EXPEDIENTE%TYPE,
pvAsunto FIRMA_PORTAFIRMASCARM.ASUNTO%TYPE,
pvOrdenado FIRMA_PORTAFIRMASCARM.ORDENADO%TYPE
) RETURN NUMBER;
Parámetros:
Campo | Tipo | Descripción |
pvIp | Cadena (40) | IP origen de la solicitud. |
pvSolicitante | Cadena (40) | Solicitante autorizado por portafirmas CARM |
pvAplicacion | Cadena (50) | Aplicación para la que se expide la firma |
pvExpediente | Cadena (50) | Identificador interno de la aplicación solicitante |
pvAsunto | Cadena (200) | Asunto |
pvOrdenado | Cadena (1) | Flujo de firmas Ordenado: S=Si, N=No |
Como resultado devuelve el identificador de la operación de firma que será necesario para el resto del proceso.
Ejemplo de invocación:
-- 1. Iniciar el montaje de una operación de firma
SET serveroutput on; DECLARE PVIP VARCHAR2(40); PVSOLICITANTE VARCHAR2(40); PVAPLICACION VARCHAR2(50); PVEXPEDIENTE VARCHAR2(50); PVASUNTO VARCHAR2(200); PVORDENADO VARCHAR2(1); v_Return NUMBER; BEGIN SYS.dbms_output.enable; PVIP := '1'; PVSOLICITANTE := 'AP_EDU_P21-SIE'; PVAPLICACION := 'APP_PRUEBA'; PVEXPEDIENTE := 'EXP_PRUEBA.4'; PVASUNTO := 'Operación de firma de prueba 6'; PVORDENADO := 'N'; v_Return := PFIRMA_PORTAFIRMASCARM.INICIAROPERACIONFIRMA( PVIP => PVIP, PVSOLICITANTE => PVSOLICITANTE, PVAPLICACION => PVAPLICACION, PVEXPEDIENTE => PVEXPEDIENTE, PVASUNTO => PVASUNTO, PVORDENADO => PVORDENADO ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Crear Paso de Firma
La función para crear un paso de firma es la siguiente:
/* Crear paso en el flujo de la operación de firma */
FUNCTION crearPasoFirma(
pvIdFirma FIRMA_PORTAFIRMASCARM_PASO.IDFIRMA%TYPE,
pvDescripcion FIRMA_PORTAFIRMASCARM_PASO.DESCRIPCION%TYPE
) RETURN NUMBER;
Parámetros:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvDescripcion | Cadena (60) | Descripción del paso. |
Como resultado devuelve el identificador del nuevo paso creado que será necesario para añadir firmantes al paso.
Ejemplo:
-- 2.a.1 Crear un paso de la firma
SET serveroutput on; DECLARE PVIDFIRMA NUMBER; PVDESCRIPCION VARCHAR2(60); v_Return NUMBER; BEGIN PVIDFIRMA := 5; PVDESCRIPCION := 'Paso 1'; v_Return := PFIRMA_PORTAFIRMASCARM.CREARPASOFIRMA( PVIDFIRMA => PVIDFIRMA, PVDESCRIPCION => PVDESCRIPCION ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Añadir firmante al Paso de Firma
Para añadir un firmante a un paso de la operación se deberá invocar a la función:
/* Añade un firmante al paso indicado */
PROCEDURE anadirFirmantePaso(
pvIdFirma FIRMA_PORTAFIRMASCARM_FIRM.IDFIRMA%TYPE,
pvIdPaso FIRMA_PORTAFIRMASCARM_FIRM.IDPASO%TYPE,
pvIdentificador FIRMA_PORTAFIRMASCARM_FIRM.IDENTIFICADOR%TYPE
);
Parámetros:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvIdPaso | Numérico | Identificador de paso. |
pvIdentificador | Cadena (1000) | Identificador del firmante. |
Ejemplo:
-- 2.a.2 añade un firmante a un paso de la firma
SET serveroutput on; DECLARE PVIDFIRMA NUMBER; PVIDPASO NUMBER; PVIDENTIFICADOR VARCHAR2(1000); BEGIN PVIDFIRMA := 5; PVIDPASO := 1; PVIDENTIFICADOR := 'juanf.almagro'; PFIRMA_PORTAFIRMASCARM.ANADIRFIRMANTEPASO( PVIDFIRMA => PVIDFIRMA, PVIDPASO => PVIDPASO, PVIDENTIFICADOR => PVIDENTIFICADOR ); END;
Añadir firmante único
Si la operación requiere un sólo firmante y no va a tener un flujo de firmas definido, se ha añadido un procedimiento para añadir un único paso con un único firmante, el procedimiento es el siguiente:
/* Crea un paso y añade un único firmante a la operación */
PROCEDURE anadirFirmanteUnico(
pvIdFirma FIRMA_PORTAFIRMASCARM_FIRM.IDFIRMA%TYPE,
pvIdentificador FIRMA_PORTAFIRMASCARM_FIRM.IDENTIFICADOR%TYPE
);
Parámetros:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvIdentificador | Cadena (1000) | Identificador del firmante. |
Ejemplo:
-- 2.b Añadir un firmante único: crea un paso y le añade un único firmante
SET serveroutput on; DECLARE PVIDFIRMA NUMBER; PVIDENTIFICADOR VARCHAR2(1000); BEGIN PVIDFIRMA := 7; PVIDENTIFICADOR := 'juanf.almagro'; PFIRMA_PORTAFIRMASCARM.ANADIRFIRMANTEUNICO( PVIDFIRMA => PVIDFIRMA, PVIDENTIFICADOR => PVIDENTIFICADOR ); END;
Añadir documento
Se pueden añadir documentos tanto directamente utilizando el BLOB como con la URL de descarga, teniendo en cuenta que la URL debe ser accesible para el servidor de base de datos (hablar con sistemas).
Para añadir un documento desde un BLOB se utiliza la función:
/* Añade un Documento a firmar a partir de un BLOB */
FUNCTION anadirDocumento(
pvIdFirma FIRMA_PORTAFIRMASCARM_DOC.IDFIRMA%TYPE,
pvBlobFichero BLOB,
pvDescripcion FIRMA_PORTAFIRMASCARM_DOC.DESCRIPCION%TYPE
) RETURN NUMBER;
Con los parámetros:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvBlobFichero | BLOB | Contenido del fichero. |
pvDescripcion | Cadena (60) | Descripción del documento. |
Para añadir un documento desde una URL se utiliza la función:
/* Añade un Documento a firmar a partir de una URL */
FUNCTION anadirDocumento(
pvIdFirma FIRMA_PORTAFIRMASCARM_DOC.IDFIRMA%TYPE,
pvUrlFichero VARCHAR2,
pvDescripcion FIRMA_PORTAFIRMASCARM_DOC.DESCRIPCION%TYPE
) RETURN NUMBER;
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvUrlFichero | Cadena | URL de descarga del fichero. |
pvDescripcion | Cadena (60) | Descripción del documento. |
En ambas funciones el resultado es el identificador que se le ha dado al documento dentro de la firma.
Ejemplo:
-- 3 Añade un documento a la operación de firma
SET serveroutput on; DECLARE PVIDFIRMA NUMBER; PVURLFICHERO VARCHAR2(200); PVDESCRIPCION VARCHAR2(60); v_Return NUMBER; pvBlobFichero BLOB; BEGIN
SELECT INFORME INTO pvBlobFichero FROM SIGEINFO.CACHE_INFORMES WHERE TOKEN_PETICION = '20161019120818/2989356228163401399627331';
PVIDFIRMA := 7;
PVDESCRIPCION := 'Documento de prueba para la firma 7'; v_Return := PFIRMA_PORTAFIRMASCARM.ANADIRDOCUMENTO( PVIDFIRMA => PVIDFIRMA, pvBlobFichero => pvBlobFichero, PVDESCRIPCION => PVDESCRIPCION ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Envío al Portafirmas de la CARM
Una vez preparados todos los datos de la operación esta se lanzará contra el Portafirmas de la CARM y ya no será modificable. Después de ser lanzar la operación contra el portafirmas sólo se puede comprobar el estado de la operación y hasta cuando esté firmada cuando además se puede descargar los documentos resultantes o anular la firma.
Lanzar Operación
El envío al Portafirmas se realiza mediante la función:
/* Lanzar operación de firma */
FUNCTION lanzarOperacionFirma(
pvIdFirma FIRMA_PORTAFIRMASCARM.ID%TYPE
) RETURN NUMBER;
Los parámetros son:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
La función devuelve el código que el Portafirmas de la CARM asigna a la solicitud.
Ejemplo de llamada:
-- 4 Enviar la operación de firma al portafirmas de la CARM
SET serveroutput on;
DECLARE
PVIDFIRMA NUMBER; v_Return NUMBER; BEGIN PVIDFIRMA := 7; v_Return := PFIRMA_PORTAFIRMASCARM.LANZAROPERACIONFIRMA( PVIDFIRMA => PVIDFIRMA ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Consulta de estado
La consulta de estados de una solicitud se puede hacer desde cualquier punto de su ciclo de vida, desde la preparación a después del envío al portafirmas. Los estados que puede tener una operación son:
Código | Descripción |
0 | La operación está en preparación y todavía no ha sido enviada al portafirmas. |
1 | La operación está en proceso de ser enviada al portafirmas. |
I | La operación está en el portafirmas de la CARM con estado Iniciada. |
P | La operación está en el portafirmas de la CARM con estado Pendiente. |
F | La operación está en el portafirmas de la CARM con estado Firmada. |
R | La operación está en el portafirmas de la CARM con estado Rechazada. |
E | La operación está en el portafirmas de la CARM con estado Eliminada. |
A | La operación está en el portafirmas de la CARM con estado Anulada. |
D | La operación está en estado desconocido. |
La consulta del estado se realiza mediante la función:
/* Obtener el estado de la operación de firma */
FUNCTION obtenerEstado(
pvIdFirma FIRMA_PORTAFIRMASCARM.ID%TYPE
) RETURN VARCHAR2;
Los parámetros son:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
Como resultado la operación devuelve un código de estado de entre los que hay en la tabla del principio del punto.
Ejemplo:
-- Consultar estado de una operación de firma
SET serveroutput on;
DECLARE PVIDFIRMA NUMBER; v_Return VARCHAR2(200); BEGIN PVIDFIRMA := 1; v_Return := PFIRMA_PORTAFIRMASCARM.OBTENERESTADO( PVIDFIRMA => PVIDFIRMA ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Obtención de documentos resultantes
Una vez que la operación ha sido firmada se pueden consultar los documentos resultantes que son la versión del original con las marcas de la firma. La función para obtener un documento resultante es:
/* Obtener el contenido del documento firmado */
FUNCTION obtenerDocumentoFirmado(
pvIdFirma FIRMA_PORTAFIRMASCARM_DOC.IDFIRMA%TYPE,
pvIdDoc FIRMA_PORTAFIRMASCARM_DOC.IDDOC%TYPE
) RETURN BLOB;
Los parámetros son:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvIdDoc | Numérico | Identificador del documento en la firma obtenido en el momento que se añadió. |
Como resultado se obtiene un BLOB con el contenido del documento firmado.
Ejemplo de ejecución:
-- Obtener el documento firmando
SET serveroutput on; DECLARE PVIDFIRMA NUMBER; PVIDDOC NUMBER; v_Return BLOB; BEGIN PVIDFIRMA := 1; PVIDDOC := 1; v_Return := PFIRMA_PORTAFIRMASCARM.OBTENERDOCUMENTOFIRMADO( PVIDFIRMA => PVIDFIRMA, PVIDDOC => PVIDDOC ); DBMS_OUTPUT.PUT_LINE(dbms_lob.getlength(v_Return)); END;
También se puede recuperar todos los documentos de una operación de firma con la función:
/* Obtener los documentos de la firma */
FUNCTION obtenerDocumentosFirma(
pvIdFirma FIRMA_PORTAFIRMASCARM.ID%TYPE
) RETURN refCur;
Los parámetros son:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
La respuesta es un cursor con las columnas:
Campo | Tipo | Descripción |
IdDoc | Numérico | Identificador del documento dentro de la operación de firma. |
Descripción | Cadena | Descripción del documento. |
Documento | BLOB | Binario del documento firmado. |
Operaciones rápidas
Se han añadido dos funciones para crear operaciones de firma y enviar en una única llamada. Para enviar toda la operación de firma en una sola operación se debe permitir enviar varios pasos y varios firmantes para lo que se utiliza un sistema de cadenas con separadores. Para distinguir los distintos pasos de firma se listan en orden separados por el carácter “|” y el separador de firmantes dentro del paso es la coma “,”, por ejemplo, la cadena “Paso 1|Paso 2” define dos pasos Paso 1 y Paso 2, y la cadena “Firmante 1|Firmante 2,Firmante 3” define 3 firmantes repartidos como Firmante 1 en el Paso 1 y Firmantes 2 y 3 en el Paso 2.
El resultado de la operación será el identificador de la firma generada.
La función para enviar un sólo fichero espera un BLOB y una descripción de documento:
/*
* Generar y enviar operación de firma en una sola llamada con un sólo fichero.
*/
FUNCTION generarOperacionFirma(
pvIp FIRMA_PORTAFIRMASCARM.IP%TYPE,
pvSolicitante FIRMA_PORTAFIRMASCARM.SOLICITANTE%TYPE,
pvAplicacion FIRMA_PORTAFIRMASCARM.APLICACION%TYPE,
pvExpediente FIRMA_PORTAFIRMASCARM.EXPEDIENTE%TYPE,
pvAsunto FIRMA_PORTAFIRMASCARM.ASUNTO%TYPE,
pvOrdenado FIRMA_PORTAFIRMASCARM.ORDENADO%TYPE,
pvPasos VARCHAR2,
pvFirmantes VARCHAR2,
pvBlobFichero BLOB,
pvDescripcionDoc FIRMA_PORTAFIRMASCARM_DOC.DESCRIPCION%TYPE
) RETURN NUMBER;
El significado de los parámetros es:
Campo | Tipo | Descripción |
pvIp | Cadena (40) | IP origen de la solicitud. |
pvSolicitante | Cadena (40) | Solicitante autorizado por portafirmas CARM. |
pvAplicacion | Cadena (50) | Aplicación para la que se expide la firma. |
pvExpediente | Cadena (50) | Identificador interno de la aplicación solicitante. |
pvAsunto | Cadena (200) | Asunto. |
pvOrdenado | Cadena (1) | Flujo de firmas Ordenado: S=Si, N=No. |
pvPasos | Cadena | Lista de pasos de la firma ordenados separador por “|” . |
pvFirmantes | Cadena | Lista de firmantes ordenadas según el paso en el que debe firmar y separados por “|”, dentro de cada paso los firmantes irán separados por “,”. |
pvBlobFichero | BLOB | Binario del fichero que se va a enviar a firmar. |
pvDescripcionDoc | Cadena | Descripción del documento que se va a enviar a firmar. |
Ejemplo de ejecución:
SET serveroutput on; DECLARE PVIP VARCHAR2(40); PVSOLICITANTE VARCHAR2(40); PVAPLICACION VARCHAR2(50); PVEXPEDIENTE VARCHAR2(50); PVASUNTO VARCHAR2(200); PVORDENADO VARCHAR2(1); PVPASOS VARCHAR2(200); PVFIRMANTES VARCHAR2(200); PVBLOBFICHERO BLOB; PVDESCRIPCIONDOC VARCHAR2(60); v_Return NUMBER; BEGIN SYS.dbms_output.enable; PVIP := SYS_CONTEXT('USERENV','IP_ADDRESS'); PVSOLICITANTE := 'AP_EDU_P21-SIE'; PVAPLICACION := 'APP_PRUEBA'; PVEXPEDIENTE := 'EXP_PRUEBA.4'; PVASUNTO := 'Operación de firma de prueba 9'; PVORDENADO := 'N'; PVPASOS := 'Paso prueba 1|Paso pruba 2'; PVFIRMANTES := 'juanf.almagro|josel.sanchez2'; SELECT FICHERO INTO PVBLOBFICHERO FROM REDSARA.TEST WHERE PETICION = 1; PVDESCRIPCIONDOC := 'Documento de prueba'; v_Return := PFIRMA_PORTAFIRMASCARM.GENERAROPERACIONFIRMA( PVIP => PVIP, PVSOLICITANTE => PVSOLICITANTE, PVAPLICACION => PVAPLICACION, PVEXPEDIENTE => PVEXPEDIENTE, PVASUNTO => PVASUNTO, PVORDENADO => PVORDENADO, PVPASOS => PVPASOS, PVFIRMANTES => PVFIRMANTES, PVBLOBFICHERO => PVBLOBFICHERO, PVDESCRIPCIONDOC => PVDESCRIPCIONDOC ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Para enviar un conjunto de ficheros se debe enviar una lista de URLs separadas por “|”, las descripciones serán enviadas utilizando el mismo mecanismo:
/*
* Generar y enviar operación de firma en una sola llamada con varios ficheros.
*/
FUNCTION generarOperacionFirma(
pvIp FIRMA_PORTAFIRMASCARM.IP%TYPE,
pvSolicitante FIRMA_PORTAFIRMASCARM.SOLICITANTE%TYPE,
pvAplicacion FIRMA_PORTAFIRMASCARM.APLICACION%TYPE,
pvExpediente FIRMA_PORTAFIRMASCARM.EXPEDIENTE%TYPE,
pvAsunto FIRMA_PORTAFIRMASCARM.ASUNTO%TYPE,
pvOrdenado FIRMA_PORTAFIRMASCARM.ORDENADO%TYPE,
pvPasos VARCHAR2,
pvFirmantes VARCHAR2,
pvUrlsFichero VARCHAR2,
pvDescripcionDoc VARCHAR2
) RETURN NUMBER;
Los parámetros son:
Campo | Tipo | Descripción |
pvIp | Cadena (40) | IP origen de la solicitud. |
pvSolicitante | Cadena (40) | Solicitante autorizado por portafirmas CARM. |
pvAplicacion | Cadena (50) | Aplicación para la que se expide la firma. |
pvExpediente | Cadena (50) | Identificador interno de la aplicación solicitante. |
pvAsunto | Cadena (200) | Asunto. |
pvOrdenado | Cadena (1) | Flujo de firmas Ordenado: S=Si, N=No. |
pvPasos | Cadena | Lista de pasos de la firma ordenados separador por “|” . |
pvFirmantes | Cadena | Lista de firmantes ordenadas según el paso en el que debe firmar y separados por “|”, dentro de cada paso los firmantes irán separados por “,”. |
pvUrlsFichero | Cadena | Lista de URLs de documentos que se van a enviar a firmar separados por “|”. |
pvDescripcionDoc | Cadena | Lista de descripciones de documentos que se van a enviar a firmar separados por “|”. |
Un ejemplo de ejecución es:
SET serveroutput on; DECLARE PVIP VARCHAR2(40); PVSOLICITANTE VARCHAR2(40); PVAPLICACION VARCHAR2(50); PVEXPEDIENTE VARCHAR2(50); PVASUNTO VARCHAR2(200); PVORDENADO VARCHAR2(1); PVPASOS VARCHAR2(200); PVFIRMANTES VARCHAR2(200); PVURLSFICHERO VARCHAR2(10000); PVDESCRIPCIONDOC VARCHAR2(200); v_Return NUMBER; BEGIN SYS.dbms_output.enable; PVIP := SYS_CONTEXT('USERENV','IP_ADDRESS'); PVSOLICITANTE := 'AP_EDU_P21-SIE'; PVAPLICACION := 'APP_PRUEBA'; PVEXPEDIENTE := 'EXP_PRUEBA.4'; PVASUNTO := 'Operación de firma de prueba 3'; PVORDENADO := 'N'; PVPASOS := 'Paso 1|Paso 2'; PVFIRMANTES := 'juanf.almagro|josel.sanchez2,andres.garcia2'; PVURLSFICHERO := 'http://201503.murciaeduca.es/sigeinfo/SigeinfoServlet?token=20161103094133/3137769194057436399894610%7Chttp://201503.murciaeduca.es/sigeinfo/SigeinfoServlet?token=20161103094133 /3137769194057436399894610'; PVDESCRIPCIONDOC := 'Documento de ejemplo 1|Documento de ejemplo 2'; v_Return := PFIRMA_PORTAFIRMASCARM.GENERAROPERACIONFIRMA( PVIP => PVIP, PVSOLICITANTE => PVSOLICITANTE, PVAPLICACION => PVAPLICACION, PVEXPEDIENTE => PVEXPEDIENTE, PVASUNTO => PVASUNTO, PVORDENADO => PVORDENADO, PVPASOS => PVPASOS, PVFIRMANTES => PVFIRMANTES, PVURLSFICHERO => PVURLSFICHERO, PVDESCRIPCIONDOC => PVDESCRIPCIONDOC ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return); END;
Anular una operación firmada
Una vez que una operación ha sido firmada se puede solicitar al portafirmas su anulación, para hacer esto se ha implementado esta función:
/* Anula una operación de firma */
FUNCTION anularOperacionFirma(
pvIdFirma FIRMA_PORTAFIRMASCARM.ID%TYPE,
pvMotivo FIRMA_PORTAFIRMASCARM.MOTIVOESTADO%TYPE
) RETURN NUMBER;
Con los parámetros:
Campo | Tipo | Descripción |
pvIdFirma | Numérico | Identificador de la operación de firma. |
pvMotivo | Cadena(50) | Motivo de la anulación que se enviará al portafirmas. |
Ejemplo de ejecución:
-- Anular una operación de firma
SET serveroutput on;
DECLARE
PVIDFIRMA NUMBER; PVMOTIVO VARCHAR2(50); v_Return NUMBER;
BEGIN
PVIDFIRMA := 1; PVMOTIVO := 'Prueba de anulación de operación'; v_Return := PFIRMA_PORTAFIRMASCARM.ANULAROPERACIONFIRMA( PVIDFIRMA => PVIDFIRMA, PVMOTIVO => PVMOTIVO ); DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;
Proceso automático de comprobación de portafirmas
Se ha generado un Job en la base de datos que comprueba el estado de las firmas enviadas a firmar periódicamente. El procedimiento que ejecuta el JOB es este:
/* Comprobación masiva de operaciones */
PROCEDURE SPComprobarOperaciones(
pvStatus OUT NUMBER
);
En un principio se configura para que se lance en el minuto 0 de cada hora. Si hay algún error en la ejecución del proceso se genera un error en la tabla FIRMA_PORTAFIRMASCAM_LOG.
El código que programa el JOB es:
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'DECLARE pvStatus NUMBER; BEGIN CATALOGO.PFIRMA_PORTAFIRMASCARM.SPCOMPROBAROPERACIONES(pvStatus); END;' ,next_date => to_date('07/11/2016 10:00:00','dd/mm/yyyy hh24:mi:ss') ,interval => 'TRUNC(SYSDATE) + 1/24' ,no_parse => TRUE ); SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END; /
commit;
Errores
Estos son los códigos de error que puede devolver la interfaz:
Código | Significado |
-20001 | La solicitud al portafirmas no está en un estado válido para realizar la operación solicitada. |
-20002 | Error al lanzar la operación de “iniciar solicitud” contra el portafirmas de la CARM. |
-20003 | Error al lanzar la operación de “guardar documento” contra el portafirmas de la CARM. |
-20004 | Error al lanzar la operación de “finalizar solicitud de firma” contra el portafirmas de la CARM. |
-20005 | Error añadir firmante único, ya hay pasos definidos en la operación de firma. |
-20006 | Error al lanzar la operación de “consulta de estado” contra el portafirmas de la CARM. |
-20007 | Error al lanzar la operación de “anular” contra el portafirmas de la CARM. |
Si el portafirmas de la CARM devuelve un mensaje de error, este acompañará al código de error en la excepción de Oracle.