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

CampoTipoTamDescricao
ZAU_FILIALC4Filial
ZAU_DATAD8Data evento
ZAU_HORAC8HH:MM:SS
ZAU_USERC6Codigo usuario
ZAU_TABELAC6Tabela afetada
ZAU_RECNON15RecNo do registro
ZAU_ACAOC1I=Inclusao A=Alteracao E=Exclusao
ZAU_CAMPOC10Campo (em alteracao)
ZAU_VANTC250Valor anterior
ZAU_VNOVC250Valor novo
ZAU_ORIGEMC30Funcao que disparou (ProcName)
ZAU_IPMAQC20IP 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

Performance

Veja também