Tema
Retenção e Exclusão de Dados
Define por quanto tempo cada dado é mantido e como é excluído quando solicitado ou quando o prazo expira.
Prazos de retenção
| Dado | Local | Prazo | Justificativa |
|---|---|---|---|
| Dados de clientes (nome, email, telefone) | PostgreSQL Customer | Enquanto ativo no ERP | Contrato com organização |
| CPF hash | PostgreSQL Customer.cpfHash | Mesmo que cliente | Deduplicação necessária |
| CPF criptografado | PostgreSQL Customer.cpfEncrypted | Mesmo que cliente | Uso interno |
| Histórico de compras | PostgreSQL Transaction | 5 anos | Obrigação fiscal (CTN art. 174) |
| Conversas WhatsApp | Chatwoot | Configurável no Chatwoot | Sem expiração automática no CRM |
Mensagens WhatsApp (WhatsappMessage) | PostgreSQL | Sem expiração definida | Reconciliação e auditoria |
Logs de auditoria (AccessLog) | PostgreSQL | Sem expiração automática | Segurança — recomendado 1 ano |
| Tokens de redirect | PostgreSQL CampaignRedirectToken | 30 dias (campo expiresAt) | Expiram automaticamente |
| Pesquisas de satisfação | PostgreSQL SurveyResponse | Sem expiração definida | Histórico de qualidade |
| Histórico RFM | PostgreSQL RfmHistory | Sem expiração definida | Análise de tendência |
Log de jobs (JobRun) | PostgreSQL | Sem expiração definida | Debug e auditoria |
Exclusão de dados
Como solicitar exclusão (direito ao esquecimento — art. 18, VI)
- Titular entra em contato com
daniel.galdencio2560@gmail.com - DPO verifica se há obrigação legal que impeça a exclusão (ex: histórico fiscal de 5 anos)
- Se não houver impedimento, acionar o processo abaixo
Processo técnico de exclusão de cliente
bash
# 1. Marcar como opt-out imediatamente (parar comunicações)
PATCH /customers/:id { "whatsappOptOut": true, "emailOptOut": true }
# 2. Verificar transações (podem ser necessárias por 5 anos)
GET /customers/:id/transactions
# 3. Anonimizar dados pessoais (se não puder excluir completamente)
# Campos a nullificar: name, email, phone, cpfHash, cpfEncrypted, cpfMasked,
# birthDate, zipCode, city, state, address, neighborhood
# Manter: id, storeId, organizationId, totalSpent, orderCount, lastOrder (anonimizados)
# 4. Excluir conversas no Chatwoot via API Chatwoot
DELETE {chatwoot_url}/api/v1/accounts/{account_id}/conversations/{id}
# 5. Revogar tokens de redirect ativos
# Deletar CampaignRedirectToken onde customerId = :id e expiresAt > now()Nota: Não existe endpoint de exclusão automática de cliente na versão atual. A exclusão é manual via banco ou endpoint de update para anonimizar campos.
Anonimização vs. exclusão
Quando há transações fiscais vinculadas ao cliente, a exclusão completa pode ser inviável. Nesse caso, anonimiza-se (nullifica campos pessoais, mantém totais financeiros). O sistema continuará funcionando pois customerId nas transações é opcional.
Retenção de logs de auditoria
Os AccessLog não têm TTL automático. Recomenda-se:
sql
-- Purgar logs com mais de 1 ano (executar via psql direto)
DELETE FROM "AccessLog"
WHERE "createdAt" < NOW() - INTERVAL '1 year';Tokens expirados
CampaignRedirectToken com expiresAt < now() não são deletados automaticamente. Para limpar:
sql
DELETE FROM "CampaignRedirectToken"
WHERE "expiresAt" < NOW();Portabilidade de dados (art. 18, V)
Para exportar todos os dados de um cliente:
http
GET /customers/:id
GET /customers/:id/transactions
GET /customers/:id/eventsCombinar as respostas e entregar em formato JSON ou CSV ao titular.