LGPD na prática
Finalidade, necessidade, consentimento, retenção e os direitos do titular — como operações sobre dado, com Arcane.Privacidade.
A LGPD fala em princípios — finalidade, adequação, necessidade, transparência, segurança (art. 6º). No código eles viram perguntas concretas: para que este dado é usado, quais campos a finalidade precisa, até quando ele pode ficar, e onde ele mora quando o titular pede para ver ou apagar. Arcane.Privacidade torna cada resposta registrável.
Consentimento por finalidade#
dataforge
adopt Arcane.Privacidade as P
c := P.consentimentos()
c.conceder("ana", "nota-fiscal", "1", 100)
c.conceder("ana", "marketing", "1", 100)
c.revogar("ana", "marketing", 500)
// Uma finalidade nao autoriza outra.
assert c.pode("ana", "nota-fiscal", "", 600)
assert not c.pode("ana", "pesquisa", "", 600)
// A revogacao vale dali em diante — e o passado continua respondivel.
assert c.pode("ana", "marketing", "", 300)
assert not c.pode("ana", "marketing", "", 600)
assert len(c.historico("ana")) is 3
out c.finalidades("ana")Necessidade e retenção#
dataforge
adopt Arcane.Privacidade as P
clientes := [
{"id": 1, "nome": "Ana", "cpf": "529.982.247-25", "cidade": "Recife", "criado": "2019-01-10"},
{"id": 2, "nome": "Bia", "cpf": "111.444.777-35", "cidade": "Natal", "criado": "2026-08-01"}
]
// O relatorio de vendas por cidade nao precisa de nome nem de CPF.
relatorio := P.minimizar(clientes, ["id", "cidade"])
assert "cpf" not in relatorio[0]
// Cinco anos de retencao: o que passou do prazo, e o que nao diz quando nasceu.
agora := 1790000000
vencidos := P.vencidos(clientes, "criado", 5 * 365, agora)
assert len(vencidos) is 1 and vencidos[0]["id"] is 1
out $"{len(vencidos)} registro(s) a eliminar"Acesso e eliminação — em todo lugar#
dataforge
adopt Arcane.Privacidade as P
banco := {"ana": {"email": "ana@exemplo.com"}}
newsletter := ["ana@exemplo.com"]
t := P.titulares()
t.registrar("banco", lambda tit: banco[tit] ?? void, lambda tit: pop(banco, tit))
t.registrar("newsletter",
lambda tit: [e cycle e in newsletter given e.startswith(tit)],
lambda tit: newsletter.remove("ana@exemplo.com"))
copia := t.exportar("ana")
assert copia["completo"] and copia["dados"]["banco"]["email"] is "ana@exemplo.com"
r := t.esquecer("ana")
assert r["completo"] and r["apagados"] is ["banco", "newsletter"]
assert "ana" not in banco and len(newsletter) is 0
out "acesso e eliminacao em todo lugar registrado"| Decisão | Sem ela |
|---|---|
| consentimento por finalidade, com versão do termo | o aceite da nota fiscal vira autorização de marketing |
| a revogação acrescenta, não apaga | não se prova que havia consentimento no dia do envio |
| minimizar por lista de permitidos | o campo novo (o CPF de ontem) sai no relatório sem ninguém decidir |
| o registro sem data é vencido | o que não diz quando nasceu fica para sempre |
| o pedido do titular relata falhas | o dado apagado em nove de onze lugares, e a resposta “feito” |
Continue em Anonimização e Arcane.Privacidade.