# Sistema de Hierarquia de Usuários - Guia de Configuração ## Visão Geral O sistema implementa dois tipos de usuários para agências: 1. **Dono da Agência (owner)** - Acesso total - Pode convidar colaboradores - Pode remover colaboradores - Tem acesso completo ao CRM 2. **Colaborador (collaborator)** - Acesso Restrito - Pode VER leads e clientes - **NÃO pode** editar ou remover dados - Acesso somente leitura (read-only) ## Configuração Inicial ### Passo 1: Configurar o primeiro usuário como "owner" Após criar a primeira agência e seu usuário admin, execute o script SQL: ```bash docker exec aggios-postgres psql -U postgres -d aggios < /docker-entrypoint-initdb.d/../setup_owner_role.sql ``` Ou manualmente: ```sql UPDATE users SET agency_role = 'owner' WHERE email = 'seu-email@exemplo.com' AND role = 'ADMIN_AGENCIA'; ``` ### Passo 2: Login e acessar o gerenciamento de colaboradores 1. Faça login com o usuário owner 2. Vá em **Configurações > Equipe** 3. Clique em "Convidar Colaborador" ### Passo 3: Convidar um colaborador - Preencha Nome e Email - Clique em "Convidar" - Copie a senha temporária (16 caracteres) - Compartilhe com o colaborador ## Fluxo de Funcionamento ### Quando um Colaborador é Convidado 1. Novo usuário é criado com `agency_role = 'collaborator'` 2. Recebe uma **senha temporária aleatória** 3. Email é adicionado à agência do owner ### Quando um Colaborador Faz Login 1. JWT contém `"agency_role": "collaborator"` 2. Frontend detecta a restrição - Botões de editar/deletar desabilitados - Mensagens de acesso restrito 3. Backend bloqueia POST/PUT/DELETE em `/api/crm/*` - Retorna 403 Forbidden se tentar ### Dados no JWT ```json { "user_id": "uuid", "user_type": "agency_user", "agency_role": "owner", // ou "collaborator" "email": "usuario@exemplo.com", "role": "ADMIN_AGENCIA", "tenant_id": "uuid", "exp": 1234567890 } ``` ## Banco de Dados ### Novos Campos na Tabela `users` ```sql - agency_role VARCHAR(50) -- 'owner' ou 'collaborator' - created_by UUID REFERENCES users -- Quem criou este colaborador - collaborator_created_at TIMESTAMP -- Quando foi adicionado ``` ## Endpoints da API ### Listar Colaboradores ``` GET /api/agency/collaborators Headers: Authorization: Bearer Resposta: Array de Collaborators Restrição: Apenas owner pode usar ``` ### Convidar Colaborador ``` POST /api/agency/collaborators/invite Body: { "email": "...", "name": "..." } Resposta: { "temporary_password": "..." } Restrição: Apenas owner pode usar ``` ### Remover Colaborador ``` DELETE /api/agency/collaborators/{id} Restrição: Apenas owner pode usar ``` ## Página de Interface **Localização:** `/configuracoes` → Aba "Equipe" ### Funcionalidades - ✅ Ver lista de colaboradores (dono apenas) - ✅ Convidar novo colaborador - ✅ Copiar senha temporária - ✅ Remover colaborador (com confirmação) - ✅ Ver data de adição de cada colaborador - ✅ Indicador visual (badge) do tipo de usuário ## Troubleshooting ### "Apenas o dono da agência pode gerenciar colaboradores" **Causa:** O usuário não tem `agency_role = 'owner'` **Solução:** ```sql UPDATE users SET agency_role = 'owner' WHERE id = 'seu-user-id'; ``` ### Colaborador consegue editar dados (bug) **Causa:** A middleware de read-only não está ativa **Status:** Implementada em `backend/internal/api/middleware/collaborator_readonly.go` **Para ativar:** Descomente a linha em `main.go` que aplica `CheckCollaboratorReadOnly` ### Senha temporária não aparece **Verificar:** 1. API `/api/agency/collaborators/invite` retorna 200? 2. Response JSON tem o campo `temporary_password`? 3. Verificar logs do backend para erros ## Próximas Melhorias - [ ] Permitir editar nome/email do colaborador - [ ] Definir permissões granulares por colaborador - [ ] Histórico de ações feitas por cada colaborador - [ ] 2FA para owners - [ ] Auditoria de quem removeu quem