Auditoria customizada via tabela Z (LGPD-ready)
Padrao completo de auditoria custom: criar tabela ZAUD, gravar log a partir de PEs, gerar relatorio. Compativel com requisitos LGPD.
EAT (Embedded Audit Trail) cobre auditoria padrao TOTVS. Mas em customizacoes e mudancas em tabelas Z, voce precisa de auditoria propria. Padrao: criar tabela ZAUD, gravar log via helper, gerar relatorio.
Estrutura ZAUD recomendada
| Campo | Tipo | Tam | Descricao |
|---|---|---|---|
| ZAU_FILIAL | C | 4 | Filial |
| ZAU_DATA | D | 8 | Data evento |
| ZAU_HORA | C | 8 | HH:MM:SS |
| ZAU_USER | C | 6 | Codigo usuario |
| ZAU_TABELA | C | 6 | Tabela afetada |
| ZAU_RECNO | N | 15 | RecNo do registro |
| ZAU_ACAO | C | 1 | I=Inclusao A=Alteracao E=Exclusao |
| ZAU_CAMPO | C | 10 | Campo (em alteracao) |
| ZAU_VANT | C | 250 | Valor anterior |
| ZAU_VNOV | C | 250 | Valor novo |
| ZAU_ORIGEM | C | 30 | Funcao que disparou (ProcName) |
| ZAU_IPMAQ | C | 20 | IP da maquina (LGPD) |
Helper de gravacao
User Function GravaAudit(cTab, cAcao, cCampo, xValAnt, xValNov)
Local nRecAnt := 0
// Posiciona ZAUD pra gravar
DbSelectArea("ZAUD")
RecLock("ZAUD", .T.)
ZAUD->ZAU_FILIAL := xFilial("ZAUD")
ZAUD->ZAU_DATA := dDataBase
ZAUD->ZAU_HORA := Time()
ZAUD->ZAU_USER := RetCodUsr()
ZAUD->ZAU_TABELA := cTab
ZAUD->ZAU_RECNO := (cTab)->(RecNo())
ZAUD->ZAU_ACAO := cAcao
ZAUD->ZAU_CAMPO := IIf(ValType(cCampo) == "C", cCampo, "")
ZAUD->ZAU_VANT := IIf(ValType(xValAnt) == "C", AllTrim(xValAnt), cValToChar(xValAnt))
ZAUD->ZAU_VNOV := IIf(ValType(xValNov) == "C", AllTrim(xValNov), cValToChar(xValNov))
ZAUD->ZAU_ORIGEM := ProcName(1)
ZAUD->ZAU_IPMAQ := GetClientIP()
ZAUD->(MsUnlock())
Return
Uso em Pontos de Entrada
Inclusao (PE M030INC)
User Function M030INC()
U_GravaAudit("SA1", "I", "", "", SA1->A1_COD + "/" + SA1->A1_LOJA)
Return
Alteracao (PE M030ALT — registrar TUDO que mudou)
User Function M030ALT()
// SA1 ja foi gravado com valores novos
// Pra capturar antes, salve em variavel antes do commit
// Tecnica: usar gatilho SX7 que dispara antes
// Ou: comparar campos antes vs depois via cache na PE de validacao
Return
Em alteracao, padrao mais robusto: usar PE de validacao (M030LOK) pra capturar valores antigos via SA1->A1_* e salvar em variavel Private. No M030ALT, comparar com novos e logar diferencas.
Indices recomendados (SIX)
1: ZAU_FILIAL + ZAU_DATA + ZAU_HORA (cronologico)
2: ZAU_FILIAL + ZAU_USER + ZAU_DATA (por usuario)
3: ZAU_FILIAL + ZAU_TABELA + ZAU_RECNO (por registro)
4: ZAU_FILIAL + ZAU_DATA + ZAU_USER (consulta diaria)
Relatorio de auditoria
Use TReport. Pergunte (SX1) deve ter: data inicio, data fim, usuario opcional, tabela opcional.
Requisitos LGPD a considerar
- Mascarar dados sensiveis: CPF, RG, dados bancarios — guardar hash, nao texto.
- Direito ao esquecimento: registros de auditoria podem ter retencao especifica (5-10 anos para fiscal).
- Acesso restrito: ZAUD deve ser tabela read-only no menu (criar via Configurador como "Visualizacao apenas").
- Log de quem leu o log (meta-auditoria) em base muito sensivel.
- Backup imutavel: copia regular do ZAUD em storage WORM (write-once).
Performance
- ZAUD cresce rapido — 10k inclusoes/dia em base media. Particionar por mes/ano.
- Limpar registros > 5 anos via JOB noturno (apos backup).
- Usar TCQuery em vez de DBSeek para relatorios — agregacao SQL mais rapida.