Auditoria
O que é o Audit Log?
O módulo de Auditoria registra de forma imutável todas as ações críticas realizadas no sistema. Cada entrada no audit log é um registro permanente que não pode ser editado ou excluído.
Ações Registradas
| Categoria | Ações auditadas |
|---|---|
| Autenticação | Login, logout, falha de login, reset de senha, revogação de token |
| Usuários | Criação, alteração de papel, inativação, convite enviado |
| Pacientes | Criação, edição de dados sensíveis, inativação, exportação LGPD |
| Agendamentos | Criação, cancelamento, mudança de status |
| Prontuário | Criação de registro, assinatura, acesso a prontuário |
| Financeiro | Criação de fatura, registro de pagamento, desconto aplicado |
| Configurações | Alteração de configurações da organização |
| Arquivos | Upload e download de documentos clínicos |
Estrutura de um Registro de Auditoria
Cada entry do audit log contém:
| Campo | Tipo | Descrição |
|---|---|---|
id | UUID | Identificador único do registro |
organization_id | UUID | Tenant ao qual pertence |
user_id | UUID | Usuário que realizou a ação |
action | String | Código da ação (ex: patient.created) |
entity_type | String | Tipo da entidade afetada (ex: Patient) |
entity_id | UUID | ID da entidade afetada |
old_values | JSON | Estado anterior dos dados (antes da mudança) |
new_values | JSON | Estado novo dos dados (após a mudança) |
ip_address | IP | Endereço IP do solicitante |
user_agent | String | Navegador/cliente utilizado |
created_at | Timestamp | Data e hora da ação |
Visualizar o Audit Log
Em Auditoria (/app/audit):
- Selecione o período de interesse
- Filtre por tipo de ação, entidade ou usuário
- Clique em um registro para ver os detalhes completos (old_values vs new_values)
Componente AuditTimeline
Para entidades específicas (paciente, agendamento, fatura), o histórico de auditoria é exibido como uma linha do tempo na própria página de detalhes, mostrando quem fez o quê e quando.
Retenção de Dados
- Registros de auditoria são retidos por 5 anos (mínimo regulatório para dados clínicos)
- Particionamento anual automático da tabela para manter performance em alto volume
- Nunca são excluídos ou sobrescritos
Implementação Técnica
O audit log é populado automaticamente pelo AuditLogInterceptor no EF Core, que intercepta SaveChangesAsync e registra mudanças nas entidades marcadas para auditoria.
csharp
// Entidades marcadas com [Auditable]
[Auditable]
public class Patient : BaseEntity { ... }
// O interceptor captura automaticamente old_values e new_values
public class AuditLogInterceptor : SaveChangesInterceptor
{
public override async Task<InterceptionResult<int>> SavingChangesAsync(...)
{
// Captura mudanças e persiste em audit_logs
}
}Permissões
| Ação | OWNER | ADMIN | RECEPTIONIST | PROFESSIONAL | VIEWER |
|---|---|---|---|---|---|
| Ver audit log | ✅ | ✅ | ❌ | ❌ | ❌ |
| Exportar audit log | ✅ | ✅ | ❌ | ❌ | ❌ |
Acesso
- URL:
/app/audit - Guard: Requer autenticação + papel Admin ou superior