DEV Community

Jorge
Jorge

Posted on • Originally published at jorge.aguilera.soy on

Probando a firmar documentos con Docuten

Recientemente, he empezado a colaborar con la plataforma de Firma y Factura electrónica de Docuten.

Básicamente, es un servicio SAAS para empresas y su función es gestionar todo lo relativo a la firma digital de documentos (contratos, recibos, etc.) así como la factura electrónica.

Una vez que te das de alta en la plataforma, puedes por ejemplo subir documentos para ser firmados por otra persona. Esta persona recibe un correo con un enlace al documento, puede abrirlo y si está de acuerdo puede aceptarlo introduciendo un código OTP que recibe en un segundo correo (existen más métodos de autentificación, pero este es muy simple)

Como todo buen SAAS, tiene un API bastante simple de usar y es el que voy a usar en este post para crear un caso de uso inventado.

WARNING

Actualmente, NO puedes crearte tus propios ApiToken, sino que tienes que pedírselo al admin para que te lo creen. En este post, parto de que ya tienes tu token (y no lo compartes con nadie que no sea de confianza)

Caso de Uso

Queremos crear un documento PDF "al vuelo" y enviárselo al email de alguien para que lo firme.

Queremos que el documento se guarde en la plataforma de Docuten y que podamos consultarlo una vez firmado

WARNING

Como viene siendo habitual en este blog, son solamente ideas para ver cómo integrar las piezas, pocas veces es un caso de uso real.

Para este caso de uso vamos a crear un simple script de Groovy desde el que crearemos y enviaremos el pdf a Docuten.

Parámetros de entrada

email = args[0]
accessToken = args[1]
label = args.length > 2 ? args[2] : "firmar asciidoctor"
url = args.length > 3 ? args[3] : 'https://sandbox.docuten.com'
Enter fullscreen mode Exit fullscreen mode

Vamos a hacer que el script pida para ejecutarse como parámetros:

  • el email de quien debe firmar

  • el token proporcionado por Docuten que nos identifica

  • una etiqueta para el documento

  • la url del entorno (puede ser sandbox para hacer pruebas por ejemplo)

Crear un pdf con Asciidoctor

Crear un pdf a partir de un texto es realmente sencillo con Groovy y las librerías Java de Asciidoctor

@GrabConfig(systemClassLoader = true)
@Grab('org.asciidoctor:asciidoctorj:2.5.7')
@Grab('org.asciidoctor:asciidoctorj-pdf:2.3.9')

import org.asciidoctor.Asciidoctor
import org.asciidoctor.Options
import org.asciidoctor.SafeMode

adoc = """= Titulo

Hola caracola

Hoy es ${new Date()} y `2*2` siguen siendo ${2*2}

"""

try (Asciidoctor asciidoctor = Asciidoctor.Factory.create()) {
    def file = Files.createTempFile("docuten", ".adoc")
    file.text = adoc.toString()

    def pdf = Files.createTempFile("docuten", ".pdf")

    asciidoctor.convertFile(file.toFile(), Options.builder()
            .safe(SafeMode.UNSAFE)
            .toFile(pdf)
            .backend("pdf")
            .build());

    // ...
}
Enter fullscreen mode Exit fullscreen mode

Como es un ejemplo simple, construimos un texto en Asciidoctor de forma dinámica y lo convertimos a PDF generándolo en un fichero temporal.

Enviar a Docuten

Para enviar a Docuten un fichero para firmar simplemente necesitas un Api-Token (que te proporcionan una vez te des de alta en la plataforma) y enviar un payload mediante POST

def payload = [
        "document": [
                "file_name" : pdf.name,
                "title" : label,
                "content" : pdf.bytes.encodeBase64().toString(),
                "description": "Toma toma toma",
                "language" : "ES",
        ],
        "signer" : [
                [
                        "email" : email,
                        "allow_historic" : "true",
                        "mobile" : "",
                        "language" : "ES",
                        "allow_reject" : "true",
                        "signature_type" : "OTP",
                        "allow_download" : "true",
                        "allow_delegate" : "false",
                        "allow_download_signed" : "true",
                        "allow_sign" : "true",
                        "name" : "jorge",
                        "allow_download_evidence": "true",
                        "redirect_url" : ""
                ]
        ],
        "metadata": [[:]],
]

def request = HttpRequest.newBuilder()
        .uri(URI.create("$url/api/v1/documents"))
        .POST(HttpRequest.BodyPublishers.ofString(JsonOutput.toJson(payload)))
        .header('Authorization', "Basic ${accessToken}")
        .header('Content-Type', "application/json")
        .build();

def response = HttpClient.newHttpClient()
        .send(request, HttpResponse.BodyHandlers.ofString())

def json = new JsonSlurper().parseText(response.body())
println json
Enter fullscreen mode Exit fullscreen mode

Como puedes ver, el payload a enviar permite enviar el documento a una lista de personas para que todas firmen el documento y además cada una puede usar un método diferente para firmar.

En este ejemplo solo vamos a enviárselo a un email, que pasaremos por argumento

Ejecución

Así es tan simple como ejecutar

groovy docuten.groovy mi_customer@email.com 12345678790abc

y tu cliente recibirá un pdf para ser firmado

Conclusión

En futuros post espero poder investigar un poco más el API para ver cómo completar la integración de sistemas con la plataforma.

Por ejemplo una clinica veterinaria podría enviar los resultados de un análisis al email de un cliente y una vez firmado por este proceder a la intervención.

O un taller mecánico podría enviar la propuesta de un arreglo, etc

Top comments (0)