Diferencia entre revisiones de «PORTAFIRMAS-CARM»

De EduWiki
Saltar a: navegación, buscar
(Crear Paso de Firma)
(Añadir firmante al Paso de Firma)
Línea 397: Línea 397:
  
 
-- 2.a.2 añade un firmante a un paso de la firma
 
-- 2.a.2 añade un firmante a un paso de la firma
SET serveroutput on;
+
  SET serveroutput on;
DECLARE
+
  DECLARE
  PVIDFIRMA NUMBER;
+
    PVIDFIRMA NUMBER;
  PVIDPASO NUMBER;
+
    PVIDPASO NUMBER;
  PVIDENTIFICADOR VARCHAR2(1000);
+
    PVIDENTIFICADOR VARCHAR2(1000);
BEGIN
+
  BEGIN
  PVIDFIRMA := 5;
+
    PVIDFIRMA := 5;
  PVIDPASO := 1;
+
    PVIDPASO := 1;
  PVIDENTIFICADOR := 'juanf.almagro';
+
    PVIDENTIFICADOR := 'juanf.almagro';
  PFIRMA_PORTAFIRMASCARM.ANADIRFIRMANTEPASO(
+
    PFIRMA_PORTAFIRMASCARM.ANADIRFIRMANTEPASO(
    PVIDFIRMA => PVIDFIRMA,
+
      PVIDFIRMA => PVIDFIRMA,
    PVIDPASO => PVIDPASO,
+
      PVIDPASO => PVIDPASO,
    PVIDENTIFICADOR => PVIDENTIFICADOR
+
      PVIDENTIFICADOR => PVIDENTIFICADOR );
  );
+
  END;
END;
+
  
 
=== Añadir firmante único ===
 
=== Añadir firmante único ===

Revisión de 09:56 9 feb 2017

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:


  1. Fase de preparación de datos: Se preparan los datos necesarios para el envío en nuestras tablas.
  2. 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:

D1.png

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.

D2.png


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.


D3.png


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.