# US-MGN003-003: Asignacion de Roles a Usuarios

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | US-MGN003-003 |
| **Modulo** | MGN-003 Roles/RBAC |
| **Sprint** | Sprint 2 |
| **Prioridad** | P0 - Critica |
| **Story Points** | 8 |
| **Estado** | Ready |
| **Autor** | System |
| **Fecha** | 2025-12-05 |

---

## Historia de Usuario

**Como** administrador del sistema
**Quiero** poder asignar y quitar roles a los usuarios
**Para** controlar que acciones puede realizar cada usuario en el sistema

---

## Criterios de Aceptacion

### Escenario 1: Asignar rol a usuario

```gherkin
Given un usuario "juan@empresa.com" con rol "user"
  And un rol "vendedor" disponible
When el admin asigna rol "vendedor" al usuario
Then el usuario tiene roles ["user", "vendedor"]
  And el usuario tiene permisos de ambos roles combinados
  And se registra en auditoria quien hizo la asignacion
```

### Escenario 2: Quitar rol de usuario

```gherkin
Given un usuario con roles ["admin", "manager"]
When el admin quita el rol "manager"
Then el usuario solo tiene rol ["admin"]
  And pierde los permisos exclusivos de "manager"
  And los cambios son inmediatos
```

### Escenario 3: Asignacion masiva

```gherkin
Given 10 usuarios seleccionados
  And rol "vendedor" disponible
When el admin asigna "vendedor" a todos
Then los 10 usuarios tienen rol "vendedor" agregado
  And responde con resumen: { success: 10, failed: 0 }
```

### Escenario 4: Proteccion de super_admin

```gherkin
Given un admin autenticado (no super_admin)
When intenta asignar rol "super_admin" a un usuario
Then el sistema responde con status 403
  And el mensaje es "Solo Super Admin puede asignar este rol"
```

### Escenario 5: No quitar ultimo super_admin

```gherkin
Given solo 1 usuario con rol "super_admin"
When se intenta quitar el rol
Then el sistema responde con status 400
  And el mensaje es "Debe existir al menos un Super Admin"
```

### Escenario 6: Ver permisos efectivos

```gherkin
Given usuario con roles ["admin", "vendedor"]
When consulta GET /api/v1/users/:id/permissions
Then retorna union de permisos de ambos roles
  And indica cuales son directos y cuales heredados
```

---

## Mockup / Wireframe

```
Modal: Gestionar Roles de Usuario
┌──────────────────────────────────────────────────────────────────┐
│  ROLES DE: Juan Perez (juan@empresa.com)                         │
├──────────────────────────────────────────────────────────────────┤
│                                                                   │
│  Selecciona los roles para este usuario:                         │
│                                                                   │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │ 🔒 Super Admin   Acceso total al sistema           [ ]      │ │
│  │ 🔒 Admin         Gestion completa del tenant       [✓]      │ │
│  │ 🔒 Manager       Supervision operativa             [ ]      │ │
│  │ 🔒 User          Acceso basico                     [✓]      │ │
│  │    Vendedor      Equipo de ventas                  [✓]      │ │
│  │    Contador      Area contable                     [ ]      │ │
│  │    Almacenista   Gestion de inventario             [ ]      │ │
│  └────────────────────────────────────────────────────────────┘ │
│                                                                   │
│  Roles seleccionados: 3 (Admin, User, Vendedor)                  │
│  Permisos efectivos: 45 permisos                                 │
│                                                                   │
│  [Ver detalle de permisos]                                       │
│                                                                   │
│  [  Cancelar  ]                        [ Guardar Cambios ]       │
└──────────────────────────────────────────────────────────────────┘

Vista: Usuarios de un Rol (desde detalle de rol)
┌──────────────────────────────────────────────────────────────────┐
│  Rol: Vendedor                                 [+ Agregar Usuarios]│
├──────────────────────────────────────────────────────────────────┤
│  Usuarios con este rol (8):                                      │
│                                                                   │
│  | Avatar | Nombre         | Email              | Desde      | ⚙ |
│  |--------|----------------|--------------------|-----------|----|
│  | 👤     | Carlos Lopez   | carlos@empresa.com | 01/12/2025 | 🗑|
│  | 👤     | Maria Garcia   | maria@empresa.com  | 15/11/2025 | 🗑|
│  | 👤     | Pedro Martinez | pedro@empresa.com  | 10/11/2025 | 🗑|
│                                                                   │
└──────────────────────────────────────────────────────────────────┘
```

---

## Notas Tecnicas

### API Endpoints

```typescript
// Desde usuario - asignar roles
PUT /api/v1/users/:userId/roles
{ "roleIds": ["role-1", "role-2"] }

// Desde rol - asignar usuarios
POST /api/v1/roles/:roleId/users
{ "userIds": ["user-1", "user-2"] }

// Ver usuarios de un rol
GET /api/v1/roles/:roleId/users

// Ver permisos efectivos
GET /api/v1/users/:userId/permissions
```

### Respuestas

```typescript
// Asignacion exitosa
{
  "userId": "user-uuid",
  "roles": ["admin", "vendedor"],
  "effectivePermissions": ["users:*", "sales:*", ...]
}

// Asignacion masiva
{
  "results": {
    "success": ["user-1", "user-2"],
    "failed": [
      { "userId": "user-3", "reason": "Usuario no encontrado" }
    ]
  }
}
```

---

## Definicion de Done

- [ ] Endpoint PUT /api/v1/users/:id/roles
- [ ] Endpoint POST /api/v1/roles/:id/users
- [ ] Endpoint GET /api/v1/roles/:id/users
- [ ] Endpoint GET /api/v1/users/:id/permissions
- [ ] Proteccion de rol super_admin
- [ ] Validacion de ultimo super_admin
- [ ] Calculo de permisos efectivos
- [ ] Frontend: RoleAssignmentModal
- [ ] Frontend: UsersOfRole view
- [ ] Tests unitarios
- [ ] Code review aprobado

---

## Estimacion

| Tarea | Horas |
|-------|-------|
| Backend: Endpoints | 4h |
| Backend: Validaciones | 2h |
| Backend: Permisos efectivos | 2h |
| Backend: Tests | 2h |
| Frontend: RoleAssignmentModal | 4h |
| Frontend: BulkAssignment | 2h |
| Frontend: Tests | 2h |
| **Total** | **18h** |

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial |
