Staff
Status: 🟡 Em fluxo (CRUD básico, sem sync com Identity) Code: backend/app/modules/staff UI: frontend/src/app/(admin)/[slug]/admin/staff Última revisão deste doc: 2026-05-13 por Felipe + Claude
1. Identidade
O que faz (uma frase)
CRUD de operadores internos do tenant (owner, admin, facilitator, sales_rep, support, content_manager, marketing) com bio + photo + soft-delete.
Por que existe
CRM tem contatos (clientes/leads). Staff tem quem opera o sistema (admins, facilitadores). Separação importante porque:
- Staff pode ser assinante de aula sem ser cliente.
- Roles determinam permissões (futuro).
- Bio/photo aparecem em chat humano + assignment de deals.
Status atual
CRUD básico em prod. Sem sync com Identity Service ainda — staff_member é registro local.
2. Cases de uso reais
Case 1: Felipe adiciona Vivian como facilitator
UI /admin/staff → "+Novo" → form (name, email, role=facilitator, bio, photo) → POST → row em staff_member.
Case 2: Atribuir deal a staff
UI /admin/crm/deals/{id} → assign dropdown → seleciona staff → crm_deal.assigned_to=<staff_id>.
3. Arquitetura interna
4. Tabelas (1)
staff_member
| Coluna | Notas |
|---|---|
tenant_id | idx |
name / email (não unique entre tenants) | |
role | enum string: owner / admin / facilitator / sales_rep / support / content_manager / marketing |
bio / photo_url | |
is_active | Soft-delete |
5. API / Endpoints (5)
Prefixo /api/staff.
| Método | Rota | O que faz |
|---|---|---|
| GET | /staff | Lista (filtros: role, include_inactive) |
| POST | /staff | Criar |
| GET | /staff/{id} | Detalhe |
| PATCH | /staff/{id} | Update partial |
| DELETE | /staff/{id} | Soft-delete |
6. Limitações e débitos técnicos
| # | Item |
|---|---|
| 1 | Sem sync com Identity Service — staff é registro local |
| 2 | Email não unique entre tenants |
| 3 | Roles são strings livres — sem constraint DB |
7. Histórico
Em prod desde Suite v2. Roadmap: integração com Identity (invite + role-based permissions).