# RF-ROLE-001: CRUD de Roles ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-ROLE-001 | | **Modulo** | MGN-003 Roles/RBAC | | **Prioridad** | P0 - Critica | | **Estado** | Ready | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe permitir a los administradores crear, listar, ver, actualizar y eliminar roles dentro de su tenant. Los roles son contenedores de permisos que se asignan a usuarios para controlar su acceso a funcionalidades del sistema. --- ## Actores | Actor | Descripcion | |-------|-------------| | Super Admin | Puede gestionar roles del sistema (built-in) | | Admin | Puede crear y gestionar roles personalizados del tenant | --- ## Precondiciones 1. Usuario autenticado con permiso `roles:create`, `roles:read`, `roles:update` o `roles:delete` 2. Tenant activo 3. Para modificar: rol existente en el tenant --- ## Flujo Principal ### Crear Rol ``` 1. Admin accede a Configuracion > Roles 2. Click en "Nuevo Rol" 3. Sistema muestra formulario: - Nombre del rol (unico en tenant) - Descripcion - Seleccion de permisos 4. Admin completa datos y selecciona permisos 5. Click en "Crear Rol" 6. Sistema valida unicidad del nombre 7. Sistema crea el rol con los permisos seleccionados 8. Sistema muestra mensaje de exito ``` ### Listar Roles ``` 1. Admin accede a Configuracion > Roles 2. Sistema muestra tabla con: - Nombre del rol - Descripcion - Numero de permisos - Numero de usuarios asignados - Es rol del sistema (built-in) - Fecha de creacion 3. Admin puede filtrar por: - Nombre - Tipo (sistema/personalizado) 4. Admin puede ordenar por cualquier columna ``` ### Ver Detalle de Rol ``` 1. Admin click en un rol de la lista 2. Sistema muestra: - Informacion basica del rol - Lista de permisos asignados (agrupados por modulo) - Lista de usuarios con este rol - Historial de cambios ``` ### Actualizar Rol ``` 1. Admin click en "Editar" de un rol 2. Sistema muestra formulario con datos actuales 3. Admin modifica campos permitidos 4. Click en "Guardar Cambios" 5. Sistema valida cambios 6. Sistema actualiza el rol 7. Sistema registra en auditoria ``` ### Eliminar Rol ``` 1. Admin click en "Eliminar" de un rol 2. Sistema verifica si hay usuarios asignados 3. Si hay usuarios: - Muestra advertencia con conteo - Opcion de reasignar a otro rol 4. Admin confirma eliminacion 5. Sistema aplica soft delete 6. Sistema desasigna usuarios (si se confirmo) ``` --- ## Flujos Alternativos ### FA1: Nombre duplicado ``` 1. En paso 6 del flujo crear 2. Sistema detecta nombre ya existe en tenant 3. Sistema muestra error "Ya existe un rol con este nombre" 4. Admin corrige el nombre 5. Continua desde paso 5 ``` ### FA2: Intentar eliminar rol del sistema ``` 1. Admin intenta eliminar rol built-in (admin, user, etc.) 2. Sistema muestra error "No se pueden eliminar roles del sistema" 3. Operacion cancelada ``` ### FA3: Intentar modificar rol del sistema ``` 1. Admin intenta modificar rol built-in 2. Sistema permite solo agregar permisos adicionales 3. No permite quitar permisos base ni cambiar nombre ``` --- ## Reglas de Negocio | ID | Regla | |----|-------| | RN-001 | Nombre de rol unico dentro del tenant | | RN-002 | Roles built-in no pueden eliminarse | | RN-003 | Roles built-in solo pueden extenderse (agregar permisos) | | RN-004 | Soft delete en lugar de hard delete | | RN-005 | Rol debe tener al menos un permiso | | RN-006 | Nombre del rol: 3-50 caracteres, alfanumerico con guiones | | RN-007 | Al eliminar rol, usuarios quedan sin ese rol | | RN-008 | Un tenant puede tener maximo 50 roles personalizados | --- ## Roles del Sistema (Built-in) | Codigo | Nombre | Descripcion | Permisos Base | |--------|--------|-------------|---------------| | super_admin | Super Administrador | Acceso total al sistema | Todos | | admin | Administrador | Gestion del tenant | Gestion usuarios, roles, config | | manager | Gerente | Supervision operativa | Lectura + reportes | | user | Usuario | Acceso basico | Solo lectura propia | | guest | Invitado | Acceso minimo | Solo dashboard | --- ## Criterios de Aceptacion ### Escenario 1: Crear rol exitosamente ```gherkin Given un admin autenticado con permiso "roles:create" When crea un rol con nombre "Vendedor" y 5 permisos Then el sistema crea el rol And el rol aparece en la lista And el rol tiene isBuiltIn = false And responde con status 201 ``` ### Escenario 2: Listar roles con paginacion ```gherkin Given 25 roles en el tenant (5 built-in + 20 custom) When el admin solicita GET /api/v1/roles?page=1&limit=10 Then el sistema retorna 10 roles And incluye meta con total=25, pages=3 And roles built-in aparecen primero ``` ### Escenario 3: No crear rol con nombre duplicado ```gherkin Given un rol existente con nombre "Vendedor" When el admin intenta crear otro rol "Vendedor" Then el sistema responde con status 409 And el mensaje es "Ya existe un rol con este nombre" ``` ### Escenario 4: No eliminar rol del sistema ```gherkin Given el rol built-in "admin" When el admin intenta eliminarlo Then el sistema responde con status 400 And el mensaje es "No se pueden eliminar roles del sistema" ``` ### Escenario 5: Soft delete de rol personalizado ```gherkin Given un rol personalizado "Vendedor" con 3 usuarios When el admin lo elimina con reasignacion a "user" Then el rol tiene deleted_at establecido And los 3 usuarios ahora tienen rol "user" And el rol no aparece en listados ``` --- ## Mockup / Wireframe ``` +------------------------------------------------------------------+ | [Logo] Roles [+ Nuevo Rol] | +------------------------------------------------------------------+ | Buscar: [___________________] [Tipo: Todos ▼] | +------------------------------------------------------------------+ | | Nombre | Descripcion | Permisos | Usuarios | ⚙ | |---|-----------------|--------------------|-----------|---------|----| | 🔒| Super Admin | Acceso total | 45 | 1 | 👁 | | 🔒| Admin | Gestion tenant | 32 | 3 | 👁 | | 🔒| Manager | Supervision | 18 | 5 | 👁 | | 🔒| User | Acceso basico | 8 | 42 | 👁 | | | Vendedor | Equipo de ventas | 12 | 8 | ✏🗑| | | Contador | Area contable | 15 | 2 | ✏🗑| | | Almacenista | Gestion inventario | 10 | 4 | ✏🗑| +------------------------------------------------------------------+ | Mostrando 1-7 de 7 [< Anterior] [Siguiente >]| +------------------------------------------------------------------+ 🔒 = Rol del sistema (built-in) Modal: Crear/Editar Rol ┌──────────────────────────────────────────────────────────────────┐ │ NUEVO ROL │ ├──────────────────────────────────────────────────────────────────┤ │ Nombre* [_______________________________] │ │ Descripcion [_______________________________] │ │ [_______________________________] │ │ │ │ PERMISOS [Seleccionar todos]│ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ ▼ Usuarios (4 permisos) │ │ │ │ ☑ users:read ☐ users:create │ │ │ │ ☐ users:update ☐ users:delete │ │ │ │ │ │ │ │ ▼ Roles (4 permisos) │ │ │ │ ☑ roles:read ☐ roles:create │ │ │ │ ☐ roles:update ☐ roles:delete │ │ │ │ │ │ │ │ ▼ Inventario (6 permisos) │ │ │ │ ☑ inventory:read ☑ inventory:create │ │ │ │ ☑ inventory:update ☐ inventory:delete │ │ │ │ ☑ inventory:export ☐ inventory:import │ │ │ └────────────────────────────────────────────────────────────┘ │ │ │ │ Permisos seleccionados: 7 │ │ │ │ [ Cancelar ] [ Crear Rol ] │ └──────────────────────────────────────────────────────────────────┘ ``` --- ## Notas Tecnicas ### API Endpoints ```typescript // Crear rol POST /api/v1/roles { "name": "Vendedor", "description": "Equipo de ventas", "permissionIds": ["perm-uuid-1", "perm-uuid-2"] } // Response 201 { "id": "role-uuid", "name": "Vendedor", "slug": "vendedor", "description": "Equipo de ventas", "isBuiltIn": false, "permissions": [...], "usersCount": 0, "createdAt": "2025-12-05T10:00:00Z" } // Listar roles GET /api/v1/roles?page=1&limit=10&search=vend&type=custom // Response 200 { "data": [...], "meta": { "total": 25, "page": 1, "limit": 10 } } // Ver detalle GET /api/v1/roles/:id // Actualizar rol PATCH /api/v1/roles/:id { "name": "Vendedor Senior", "permissionIds": ["perm-1", "perm-2", "perm-3"] } // Eliminar rol DELETE /api/v1/roles/:id?reassignTo=other-role-id ``` ### Validaciones | Campo | Validacion | |-------|------------| | name | Required, 3-50 chars, unique en tenant | | slug | Auto-generado desde name | | description | Optional, max 500 chars | | permissionIds | Array min 1 elemento | --- ## Dependencias | ID | Descripcion | |----|-------------| | RF-AUTH-001 | Login para autenticacion | | RF-ROLE-002 | Permisos para asignar a roles | | MGN-004 | Tenants para aislamiento | --- ## Estimacion | Tarea | Puntos | |-------|--------| | Backend: CRUD endpoints | 5 | | Backend: Validaciones y reglas | 3 | | Backend: Tests | 2 | | Frontend: RolesListPage | 3 | | Frontend: RoleForm modal | 3 | | Frontend: PermissionSelector | 2 | | Frontend: Tests | 2 | | **Total** | **20 SP** | --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | System | Creacion inicial |