O registo de auditoria do returnEasier é um registo append-only de tudo o que acontece com os seus pedidos: cada vez que se cria um, se aprova, se marca como recebido ou se reembolsa, acrescenta-se uma linha nova, e a aplicação não oferece nenhuma forma de a editar nem apagar. Cada evento é selado com um hash SHA-256 encadeado com o anterior, que pode comparar com os das suas exportações anteriores; o PDF do comprovativo leva ainda o hash do respetivo pedido. Quando precisa de entregar provas —a um auditor, à administração ou ao seu consultor— vai a Conformidade → Exportar auditoria e descarrega um ZIP com todo o histórico e um ficheiro de integridade para o verificar.
Porque é que o registo é append-only?
A tabela de eventos é append-only: só se acrescentam linhas. Pela via normal da aplicação, um trigger de PostgreSQL rejeita os UPDATE e DELETE sobre ela, e a aplicação não oferece nenhuma forma de editar nem apagar um evento.
Sobre essa base constrói-se a cadeia de hashes:
- O conteúdo de cada evento (
payload) converte-se num JSON canónico (chaves ordenadas, sem ambiguidade) e calcula-se-lhe um SHA-256. - Esse hash calcula-se incluindo o hash do evento anterior (
hash_anterior). O primeiro evento de cada cadeia é o «génesis». - Se alguém mudasse um único dado do conteúdo (
payload) de um evento passado, o seu hash mudaria e deixaria de bater certo com ohash_anteriordo evento seguinte: uma modificação isolada do conteúdo quebra a cadeia. A data de cada evento é guardada à parte e não faz parte do hash. Para contrastar o histórico perante uma reescrita completa, guarde as suas exportações anteriores.
Os pedidos (return_requests) levam também o seu próprio hash e hash anterior, que se incluem na exportação para que se possam verificar fora da aplicação.
Como exporto o meu histórico auditável?
A exportação vive em Conformidade → Exportar auditoria (rota /app/settings/compliance/export) dentro da aplicação, no Shopify Admin.
- Abra Conformidade no menu lateral; a exportação é o bloco Exportar auditoria.
- Indique um intervalo de datas: «de» e «até» (formato data). Pode deixar ambos vazios para exportar todo o seu histórico. As datas interpretam-se no fuso horário da sua loja (por predefinição Europe/Madrid).
- Clique em Gerar exportação. Consoante o número de pedidos do intervalo, o returnEasier faz uma de duas coisas (ver mais abaixo).
Descarga imediata ou por email, consoante o volume
O returnEasier gera o ZIP nos dois casos; o que muda com o volume é se também lho envia por email:
| Pedidos no intervalo | O que acontece |
|---|---|
| 1 – 100 | Gera-se e tem a ligação de descarga no ecrã. |
| 101 – 1200 | Gera-se igualmente: tem a ligação de descarga no ecrã e, além disso, enviamos-lha por email (se a sua loja não tiver email na Shopify, só no ecrã). |
| Mais de 1200 | A exportação é rejeitada: restrinja o intervalo de datas. |
Nos dois casos, a ligação expira ao fim de 7 dias. Se não houver nenhum pedido no intervalo, a aplicação avisa-o e não gera nada.
O limite rígido é de 1200 pedidos por exportação. Se o seu histórico for maior, divida-o em vários intervalos de datas (por exemplo, trimestre a trimestre) e exporte cada um.
No fim, o ecrã mostra-lhe a contagem de pedidos, eventos e PDF, se a cadeia de eventos está «Verificada» e quantos PDF não estavam disponíveis. Na mesma página pode gerar o DPA.
O que há dentro do ZIP?
O ficheiro chama-se returneasier-auditoria-<a-sua-loja>-<data>.zip e contém:
LEEME.txt— guia em linguagem clara: o que é cada ficheiro e como verificar a integridade.solicitudes.csv— uma linha por pedido, com colunas comopublic_id,tipo,estado,creada_en_utc,resuelta_en_utc,pedido,cliente_email,cliente_nombre,importe,moneda,motivo,resolucion_preferida,notas_cliente,hash,hash_anteriorerefund_id.eventos.csv— o registo append-only completo:public_id,return_request_id,evento,actor,actor_id,fecha_utc,hash,hash_anteriorepayload_json.pdfs/— os PDF de comprovativo de cada resolução do contrato, um por pedido.INTEGRITY.json— o ficheiro de integridade: algoritmo (SHA-256), contagens, o hash de cada ficheiro do ZIP e a verificação de cada cadeia de eventos.
Como verifico a integridade da exportação?
O INTEGRITY.json é a peça-chave para verificar que os ficheiros do ZIP não mudaram desde que a exportação foi gerada —desde que o compare com uma cópia do manifesto guardada à parte, porque viaja sem assinatura dentro do mesmo ZIP—, e traz o resultado de recalcular a cadeia de eventos de cada pedido:
- Traz o hash SHA-256 de cada ficheiro do ZIP. Recalcule o hash de, por exemplo,
eventos.csvcom qualquer ferramenta padrão e compare-o com o que aí figura. - Inclui a verificação de cada cadeia de eventos: por cada pedido indica se a sua cadeia está
okoubroken(no ecrã da aplicação: «Verificada» ou «N cadeia(s) com problemas») e, se for o caso, o motivo (cadeia bifurcada, ciclo, hash que não recompõe…). - Se algum PDF não pôde ser recuperado (por exemplo, porque foi apagado por um pedido RGPD, ou porque o comprovativo de uma resolução do contrato nunca chegou a ser gerado), fica anotado na lista de PDF não disponíveis com o seu motivo, em vez de fazer falhar a exportação inteira.
O próprio INTEGRITY.json não pode conter o seu próprio hash, por isso é o único ficheiro que não se autoverifica; todo o resto sim.
Relação com outras funções
O registo de auditoria é a base dos modelos legais e do PDF de comprovativo (ver «O PDF de comprovativo da resolução do contrato»): cada confirmação de resolução do contrato que se envia ao cliente fica ancorada à cadeia de hashes. Para entender que emails geram esses eventos, veja «Os emails que o returnEasier envia». E antes de desinstalar ou cancelar, convém exportar o histórico: explica-o «Desinstalar ou cancelar o returnEasier».