Automatizando a Assinatura Digital de uma Planilha Excel
Em desenvolvimento de produtos precisamos ter de forma clara a dor a ser resolvida.
TLDR: too long; didn’t read
Fiz uma integração entre uma planilha no Google Spreadsheet com a plataforma de assinatura digital Autentique usando Api Graphql e AppScript.
Na minha igreja é preciso contar os dízimos e ofertas e três pessoas precisam assinar: 2 diâconos e o tesoureiro, para possíveis auditorias. O processo era feito da seguinte forma:
1 - Um diácono abria os envelopes e contava os valores
2 - Outro diácono colocar em uma planilha excel o valor e a classificação.
3 - A planilha era impressa e assinada pelos dois diâconos.
4 - O tesoureiro vinha e conferia o valor total e assinava.
Dores:
- O processo gerava problema na hora da impressão, impressora falhava;
- O arquivo ficava salvo offline no computador da igreja o que dificultava o acesso remoto durante a semana;
- Tinha que rasurar em caso de erros... E não era assinado novamente por falta de tempo;
Solução: A proposta foi a utilização de uma planilha online (Google Spreadsheet) integrada a uma plataforma de assinatura digital (Autentique).
Para isto foi preciso verificar se a Autentique tinha API para criação de documentos para assinatura:
mutation CreateDocumentMutation(
$document: DocumentInput!, # Definição das variáveis $document,
$signers: [SignerInput!]!, # $signers e $file, com seus respectivos
$file: Upload! # tipos. (Os "!" indicam que são
) { # parâmetros obrigatórios)
createDocument(
document: $document, # Passa para os parâmetros da mutation o
signers: $signers, # valor das variáveis.
file: $file #
) {
id
name
refusable
sortable
created_at
signatures {
public_id
name
email
created_at
action { name }
link { short_link }
user { id name email }
}
}
}
BINGO!
Agora o desafio era converter o spreadsheet para um documento PDF e enviar para a Autentique via esta API.
Convertendo um spreadsheet para PDF
O próprio google fornece uma api de exportação de spreadsheet parametrizada 🤩.
Confira o código: Embedded content: https://gist.github.com/kibolho/3be15d77d2a74bc3033743c36f6cb3c0?file=generatePDF.js
Upload do PDF para API Graphql
"O upload de arquivos no GraphQL não é tão comum. Talvez isso ocorra porque não há suporte oficial e a documentação do GraphQL é estranhamente silenciosa sobre uploads de arquivos." Fonte
Portanto, eu utilizei da engenharia reversa para encaixar o PDF no formato desejado pela API. E descobri que era empacotando a requisição em form-data com chaves:
map: 0: ["variables.file"].
------WebKitFormBoundary8vWNyCgaKSptloVN\r\nContent-Disposition: form-data; name="operations"\r\n\r\n{"query":"mutation CreateDocumentMutation(\n $document: DocumentInput\u0021,\n $signers: [SignerInput\u0021]\u0021,\n $file: Upload\u0021\n) {\n createDocument(\n \n document: $document,\n signers: $signers,\n file: $file\n ) {\n id\n name\n refusable\n sortable\n created_at\n signatures {\n public_id\n name\n email\n created_at\n action { name }\n link { short_link }\n user { id name email }\n }\n }\n}","variables":{"document":{"name":"Contrato de teste"},"signers":[{"email":"abilio_azevedo@hotmail.com","action":"SIGN"},{"email":"abilio10@gmail.com","action":"SIGN"}],"file":null},"operationName":null}\r\n
------WebKitFormBoundary8vWNyCgaKSptloVN\r\nContent-Disposition: form-data; name="map"\r\n\r\n{"0":["variables.file"]}\r\n
------WebKitFormBoundary8vWNyCgaKSptloVN\r\nContent-Disposition: form-data; name="0"; filename="boleto.pdf"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary8vWNyCgaKSptloVN--\r\n'
--compressed
Confira o código como ficou: Embedded content: https://gist.github.com/kibolho/3be15d77d2a74bc3033743c36f6cb3c0.js
Em seguida foi necessário criar um desenho e vincular com o script de enviar para assinatura.
Para finalizar, pegamos informações como nome e email das pessoas que assinam o documento por meio de seleção de células específicas.
Conclusão
Por meio de APIs pré existêntes é possível automatizar e entregar valor para um público que teria dificuldade de fazer o processo manualmente.