LGPD em customizacoes Protheus
Como adequar codigo Protheus a LGPD: mascaramento, retencao, direito ao esquecimento, log de acesso, anonimizacao em ambientes de homolog.
LGPD (Lei Geral de Protecao de Dados) entrou em vigor em 2020 com forca. Customizacoes Protheus que tratam dados pessoais (CPF, email, telefone, dados sensiveis) precisam adequacao. Esse e o guia operacional.
Dados pessoais em base Protheus tipica
| Tabela | Campos sensiveis |
|---|---|
| SA1 (Clientes PF) | A1_NOME, A1_CGC (CPF), A1_END, A1_EMAIL, A1_TEL, A1_DTNASC |
| SA2 (Fornecedor PF) | A2_NOME, A2_CGC, A2_EMAIL |
| SRA (Funcionarios) | RA_NOME, RA_CIC (CPF), RA_RG, RA_NASC, RA_EMAIL — todos! |
| BA1 (Beneficiario PLS) | BA1_NOME, BA1_CPF, BA1_DTNASC, dados saude |
Os 6 pilares LGPD
- Finalidade: dados coletados pra fim especifico
- Necessidade: so o estritamente necessario
- Transparencia: titular sabe o que coleta
- Direito do titular: acesso, correcao, exclusao, portabilidade
- Seguranca: tecnica + organizacional
- Prestacao de contas: registro de tratamento
Implementacoes praticas
1. Mascaramento de CPF/CNPJ em tela
Static Function MascaraCPF(cCpf)
// Mostra "123.***.***-01" em vez de "123.456.789-01"
cCpf := AllTrim(cCpf)
If Len(cCpf) >= 11
Return Left(cCpf, 3) + ".***.***-" + Right(cCpf, 2)
EndIf
Return cCpf
// Uso em browse:
oReport:Section(1):Cell("A1_CGC"):SetBlock({|| MascaraCPF(SA1->A1_CGC)})
2. Log de acesso a dado sensivel
// PE M030LOK — registrar quem leu o cadastro
User Function M030LOK()
U_LogAcessoLGPD("SA1", SA1->A1_COD, "LEITURA")
Return .T.
Static Function LogAcessoLGPD(cTabela, cChave, cAcao)
RecLock("ZLGPD", .T.)
ZLGPD->ZLG_DATA := dDataBase
ZLGPD->ZLG_HORA := Time()
ZLGPD->ZLG_USER := RetCodUsr()
ZLGPD->ZLG_TABELA := cTabela
ZLGPD->ZLG_CHAVE := cChave
ZLGPD->ZLG_ACAO := cAcao
ZLGPD->ZLG_IP := GetClientIP()
ZLGPD->(MsUnlock())
Return
3. Direito ao esquecimento (anonimizacao)
// Usuario ativa exclusao apos verificar inexistencia de obrigacao fiscal
User Function AnonimizaCli(cCod, cLoja)
Local cMotivo := ""
// 1. Validar se ha pendencias fiscais (5 anos da ultima NF)
SE1->(DBSetOrder(2))
SE1->(DBSeek(xFilial("SE1") + cCod + cLoja))
If !SE1->(Eof())
Return "Cliente tem titulos vigentes - aguardar retencao fiscal"
EndIf
// 2. Anonimizar campos
SA1->(DBSetOrder(1))
If SA1->(DBSeek(xFilial("SA1") + cCod + cLoja))
RecLock("SA1", .F.)
SA1->A1_NOME := "ANONIMIZADO " + cCod
SA1->A1_NREDUZ := "ANON"
SA1->A1_CGC := Replicate("0", 14)
SA1->A1_END := ""
SA1->A1_EMAIL := ""
SA1->A1_TEL := ""
SA1->A1_DTNASC := CtoD("")
SA1->A1_LGPD := "S" // flag anonimizado
SA1->(MsUnlock())
U_LogAcessoLGPD("SA1", cCod + cLoja, "ANONIMIZADO")
Return "OK"
EndIf
Return "Cliente nao encontrado"
4. Sanitizar dados em homolog
-- Apos copiar producao pra homolog
UPDATE sa1010 SET
a1_nome = 'CLIENTE ' || a1_cod,
a1_cgc = '00000000000000',
a1_email = 'sem-email@homolog.local',
a1_tel = '0000000000',
a1_dtnasc = '19700101';
UPDATE sra010 SET
ra_nome = 'FUNCIONARIO ' || ra_mat,
ra_cic = '00000000000',
ra_rg = '0000000',
ra_email = 'rh@homolog.local';
Politica de retencao
| Tipo de dado | Retencao minima | Lei aplicavel |
|---|---|---|
| Fiscal (NF, titulos) | 5 anos apos baixa | Codigo Tributario |
| Trabalhista | 30 anos apos saida | CLT |
| Cadastro cliente PF | Ate fim da relacao + obrigacoes legais | LGPD |
| Log de acesso LGPD | 5 anos | LGPD |
| Marketing/CRM | Ate revogar consentimento | LGPD Art. 8 |
Checklist de conformidade
- ✅ Inventario de dados pessoais nas tabelas
- ✅ DPO designado e ciente
- ✅ Politica de privacidade publicada
- ✅ Termo de consentimento (clientes/funcionarios)
- ✅ Procedimento de direito do titular documentado
- ✅ Log de acesso a dados sensiveis
- ✅ Backup encrypted
- ✅ Homologacao com dados anonimizados
- ✅ Treinamento de equipe
- ✅ Auditoria anual
Pegadinhas
- Soft delete nao apaga: D_E_L_E_T_ = '*' so marca. Dado continua na base. Pra LGPD, anonimizar.
- Backups antigos: contem dados pre-anonimizacao. Politica de retencao deve cobrir.
- Logs de auditoria: tambem tem dados pessoais. Aplicar mascaramento ali tambem.
- Dados sensiveis (saude, origem racial, opcao sexual) tem regra mais restrita — anonimizar mais cedo.