# Padrão de Auditoria — Fábrica de Apps

> **planilhaprofissional.com** · Logs de auditoria obrigatórios em todos os apps

Cada app mantém auditoria **dentro do seu schema isolado** (ver [ARQUITETURA_FABRICA_APPS.md](ARQUITETURA_FABRICA_APPS.md) §8).

---

## 1. Tabela padrão: `audit_logs`

Criar em **cada schema de app** (ex.: `petcare.audit_logs`):

| Campo | Tipo | Obrigatório | Descrição |
|-------|------|:-----------:|-----------|
| `id` | `uuid` | ✅ | PK, default `gen_random_uuid()` |
| `company_id` | `uuid` | ✅ | Tenant (quando multi-tenant) |
| `user_id` | `uuid` | ✅ | Quem executou a ação |
| `action` | `text` | ✅ | Ex.: `LOGIN`, `CREATE`, `UPDATE`, `DELETE`, `EXPORT`, `PASSWORD_CHANGE` |
| `table_name` | `text` | ☐ | Tabela afetada |
| `record_id` | `uuid` | ☐ | ID do registro afetado |
| `old_data` | `jsonb` | ☐ | Estado anterior |
| `new_data` | `jsonb` | ☐ | Estado novo |
| `ip_address` | `text` | ☐ | IP do cliente |
| `user_agent` | `text` | ☐ | Navegador/dispositivo |
| `created_at` | `timestamptz` | ✅ | Default `now()` |

### RLS

- **INSERT:** apenas via trigger ou Edge Function (usuário autenticado não insere diretamente)
- **SELECT:** apenas perfil **Administrador** do mesmo `company_id`
- **UPDATE/DELETE:** proibido (logs são imutáveis)

---

## 2. Tabela: `password_change_log`

| Campo | Tipo | Descrição |
|-------|------|-----------|
| `id` | `uuid` | PK |
| `user_id` | `uuid` | Usuário que alterou |
| `changed_at` | `timestamptz` | Data/hora |
| `ip_address` | `text` | IP na alteração |
| `success` | `boolean` | Se a alteração foi concluída |

> Não armazenar senha antiga ou nova — apenas o evento.

---

## 3. Eventos obrigatórios a auditar

| Evento | `action` | Prioridade |
|--------|----------|:----------:|
| Login bem-sucedido | `LOGIN_SUCCESS` | Alta |
| Login falhou | `LOGIN_FAILED` | Alta |
| Logout | `LOGOUT` | Média |
| Criação de registro | `CREATE` | Alta |
| Alteração de registro | `UPDATE` | Alta |
| Exclusão de registro | `DELETE` | Alta |
| Alteração de senha | `PASSWORD_CHANGE` | Alta |
| Exportação de dados | `EXPORT` | Alta |
| Mudança de plano (webhook Hotmart) | `PLAN_CHANGE` | Alta |
| Acesso negado (RLS) | `ACCESS_DENIED` | Média |

---

## 4. Implementação recomendada (Supabase)

### Opção A — Trigger PostgreSQL (preferida para CRUD)

```sql
-- Exemplo conceitual — adaptar schema e tabela por app
CREATE OR REPLACE FUNCTION petcare.audit_trigger()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO petcare.audit_logs (
    company_id, user_id, action, table_name, record_id, old_data, new_data
  ) VALUES (
    COALESCE(NEW.company_id, OLD.company_id),
    auth.uid(),
    TG_OP,
    TG_TABLE_NAME,
    COALESCE(NEW.id, OLD.id),
    CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
    CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END
  );
  RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
```

### Opção B — Edge Function

Para eventos de login, exportação e webhook Hotmart que não passam por trigger de tabela.

---

## 5. Retenção e consulta

| Regra | Valor padrão |
|-------|--------------|
| Retenção mínima | 12 meses |
| Quem consulta | Administrador do tenant |
| Exportação de logs | Apenas Administrador, com registro em `audit_logs` |
| Backup | Incluído no backup Supabase do projeto |

---

## 6. Checklist de conformidade

- [ ] Tabela `audit_logs` criada no schema do app
- [ ] Tabela `password_change_log` criada
- [ ] Triggers ou Edge Functions para eventos CRUD
- [ ] Login/logout auditados
- [ ] Alteração de senha auditada
- [ ] RLS: logs imutáveis e leitura restrita a Admin
- [ ] Documentado no `DATABASE.md` do app

---

*Documento de referência fixa — planilhaprofissional.com*
