# Modelo de Dados

O banco nasce **completo**, contemplando todos os módulos futuros (regra #1). O MVP usa
parte das tabelas; as demais ficam prontas para os Módulos 1.5, 2, 3 e a integração ADMServ
entrarem como cadastro, sem refatoração.

Convenções: toda tabela tem `id`, `criado_em`, `atualizado_em`. Exclusão é lógica
(`ativo`/`excluido_em`) onde faz sentido — nada some de verdade, para rastreabilidade.

---

## 1. Hierarquia organizacional (coluna vertebral)

```
Empresa  ──<  Filial  ──<  CentroCusto
```

- **Empresa** — `razao_social`, `nome_fantasia`, `cnpj`, `ativo`.
- **Filial** — pertence a uma Empresa. `nome`, `cnpj`, `endereco`, `ativo`.
- **CentroCusto** — pertence a uma Filial. `codigo`, `nome`, `ativo`.
  (Ex.: Frota, Operação, Comercial, Administrativo, Licitações, TI, Oficina.)

Todo registro relevante (requisição, veículo, fornecedor, orçamento, estoque, locação,
permissão) referencia essa hierarquia. Adicionar empresa/filial/centro é **cadastro**.

---

## 2. Usuários e permissões (menor privilégio)

- **Usuario** — `nome`, `email`, `senha_hash`, `ativo`, `trocar_senha` (1º acesso),
  `acesso_remoto` (fura a trava de IP — Bruno/Nataly), campos de 2FA (`2fa_secret`,
  `2fa_ativo`), `ultimo_login`.
- **Perfil** — função padrão: Administrador, Gestão, Comprador, Pátio/Operação, Motorista,
  Supervisor. `is_sistema` (perfis base não apagáveis).
- **Permissao** — capacidade liberável (código único): `ver_preco`, `ver_relatorios`,
  `criar_requisicao`, `aprovar`, `estoque_2a`, `ativos_2b`, `locacao_m3`, `configurar`.
- **PerfilPermissao** — quais permissões cada perfil traz por padrão.
- **UsuarioPerfil** — perfis de cada usuário.
- **UsuarioPermissao** — **ajuste fino por pessoa** (concede/revoga sobre o padrão do perfil).
- **UsuarioAcessoHierarquia** — escopo de visão (empresa/filial/centro que o usuário enxerga).
- **IpPermitido** — lista de IPs/faixas liberados (por empresa/filial); campo configurável.

Princípio: o que o usuário não pode **não aparece na tela** (não é só bloqueio).

---

## 3. Alçada de aprovação (matriz configurável em tela)

- **AlcadaRegra** — faixa de valor: `valor_min`, `valor_max` (nulo = sem teto),
  `empresa_id` (nulo = global), `requer_dupla_aprovacao`, `ordem`.
- **AlcadaAprovador** — quem aprova a regra: por **perfil** ou por **usuário específico**,
  com `ordem` (suporta dupla aprovação).

Padrão inicial (editável sem reprogramar):

| Faixa | Aprovador |
|---|---|
| até R$ 500 | Supervisor |
| R$ 500 – R$ 2.000 | Cristiano |
| acima de R$ 2.000 | Bruno |
| acima de R$ 10.000 | Bruno + Nataly (dupla) |

---

## 4. Requisição de compra (Módulo 1)

- **Requisicao** — `numero` (sequencial), hierarquia (`empresa_id`, `filial_id`,
  `centro_custo_id`), `categoria_id`, `solicitante_id`, `comprador_id`, `veiculo_id`
  (obrigatório p/ Frota/Oficina), `fornecedor_id`, `descricao_peca`, `preco_solicitado`,
  `motivo`, `urgencia` (Normal/Urgente/Emergencial), `retirar_estoque`, `status`
  (Rascunho/Pendente/Aprovada/Recusada/Cancelada).
- **Categoria** — Peças, Pneus, Óleo, Ferramentas, Material de escritório, Uniformes, EPI,
  Serviços terceiros, Combustível, Outros.
- **RequisicaoAnexo** — `tipo` (foto, orçamento 1/2, nota técnica, garantia), `arquivo`.
- **RequisicaoAprovacao** — cada etapa: `aprovador_id`, `ordem`, `decisao`
  (Pendente/Aprovado/Recusado), `data`, `motivo_recusa`, `checklist` (JSON — preparado p/ M1.5).
- **MotivoRecusa** — catálogo: em estoque, valor acima do mercado, sem justificativa,
  compra duplicada, fora do orçamento, outro. Recusa volta ao solicitante; vira diagnóstico
  no dashboard.

---

## 5. Cadastros de apoio

- **Veiculo** — `placa`, `modelo`, `ano`, `km_atual`, `centro_custo_id`, `status`
  (Operacional/Oficina/Vendido/Inativo). Base p/ histórico por veículo e custo/km.
- **Fornecedor** — `razao_social`, `cnpj`, `telefone`, `contato`, `categoria_id`, `ativo`.
  Base p/ ranking de fornecedores.

---

## 6. Preparado para os próximos módulos (criado agora, ligado depois)

- **Orcamento** (M1.5) — `empresa_id`, `centro_custo_id`, `ano`, `mes`, `valor`, `tipo`
  (mensal/anual). Consumo medido na aprovação.
- **ItemEstoque / MovimentoEstoque** (M2A) — saldo por item; entrada soma, saída (baixa por
  QR) subtrai. Liga no "Retirar do estoque?" da requisição.
- **AtivoQr / Cabine / Componente / Composicao / ModeloReceita** (M2B) — banheiros químicos;
  modelo (Simples/Luxo/Super Luxo) **calculado** pelas peças bipadas, nunca digitado.
- **OrdemLocacao / Entrega** (M3) — entrega via celular; `foto`, `gps_lat`, `gps_lng`,
  vínculo cabine↔ordem por QR; status derivado de eventos.
- **IntegracaoOutbox** (ADMServ) — fila de espelhamento (payload JSON + status), para quando
  a API for fornecida.

---

## 7. Rastreabilidade (atravessa tudo — regras #5 e #6)

- **AuditLog** — `usuario_id`, `acao`, `entidade`, `entidade_id`, `dados_antes` (JSON),
  `dados_depois` (JSON), `ip`, `user_agent`, `criado_em`. Toda funcionalidade grava aqui.
- **StatusHistorico** — `entidade`, `entidade_id`, `status_anterior`, `status_novo`,
  `usuario_id`, `motivo`, `criado_em`. Toda mudança de status é rastreável.
