# 04 — Usuários, perfis e permissões

## Tipos de usuário (CONFIRMADO)

| Camada | Mecanismo | Evidência |
|--------|-----------|-----------|
| Conta | `users` + Spatie `HasRoles` | `app/Models/User.php` |
| Tenant | `users.idtenant` → `tenant` | Model User / Tenant |
| Sessão única | `users.idsession` | Middleware `SingleSession` |
| Status | `ATIVO` (scopes) | `User::scopeActive` |

## Roles no banco (CONFIRMADO em 2026-09-29)

| Role | Usuários atribuídos | Uso em código |
|------|---------------------|---------------|
| **ADMIN** | 17 | `middleware('role:ADMIN')` em tenants e algumas buscas; criação de user com api_token |
| **RH** | 0 | Existe na tabela `roles`; **sem** middleware/rota específica encontrada |

Seeder `DatabaseSeeder` **não** cria roles — apenas user factory `admin@material.com` (**CONFIRMADO**). Roles de produção/dev dependem de dados no banco.

## Permissões Spatie cadastradas (13)

`categories`, `config`, `create`, `dashboard`, `edit`, `permissions`, `products`, `profile`, `profiles`, `remove`, `userManagement`, `users`, `view`

**Enforcement nas rotas do simulador:** **NÃO CONFIRMADO** — não há `middleware('permission:...')` nem `@can` evidenciados no fluxo do simulador. A UI de permissions permite montar perfis, mas o acesso ao núcleo é essencialmente **autenticado + tenant + single.session**.

## Matriz funcional comprovada

| Funcionalidade | Guest | Autenticado (qualquer role) | Role ADMIN | Tenant admin (`is_admin_tenant`) |
|----------------|-------|-----------------------------|------------|-----------------------------------|
| Login / reset senha | Sim | — | — | — |
| Dashboard `/dashboard` | Não | Sim | Sim | Sim |
| `/admin/simulacoes` e fluxo completo | Não | **Sim** | Sim | Sim |
| Clientes / Pendências / Auditoria / Feedback / Users | Não | **Sim** | Sim | Sim |
| Busca avançada clientes/users (rotas `procurar`) | Não | Não* | **Sim** (`role:ADMIN`) | — |
| CRUD Tenants | Não | Não | Sim + | **Obrigatório** `admin.tenant` |
| APIs `/api/brasil/*`, `/api/gov/*` | **Sim (públicas)** | Sim | Sim | Sim |

\*Exceto se o usuário tiver role ADMIN.

## Middleware relevantes

| Alias | Classe | Efeito |
|-------|--------|--------|
| `auth` | Authenticate | Exige login |
| `guest` | RedirectIfAuthenticated | Só visitantes |
| `single.session` | SingleSession | Uma sessão por usuário |
| `admin.tenant` | AdminTenantMiddleware | Só tenant administrador de plataforma |
| `role:ADMIN` | Spatie | Role ADMIN |

## Escopo de dados

Usuários veem apenas dados do próprio `idtenant` via `TenantScope` + filtros nos controllers (**CONFIRMADO**). Não há evidência de ACL por cliente individual além do filtro operacional nas telas.
