# US-ADM-003: Gestionar Permisos Personalizados **ID:** US-ADM-003 **MΓ³dulo:** MAI-013 **Relacionado con:** RF-ADM-002, ET-ADM-001 **Prioridad:** Media **Story Points:** 5 --- ## πŸ“– Historia de Usuario **Como** Director General **Quiero** asignar permisos personalizados a usuarios especΓ­ficos que excedan o limiten su rol base **Para** adaptar el acceso segΓΊn necesidades especiales sin crear nuevos roles --- ## βœ… Criterios de AceptaciΓ³n ### 1. Ver Permisos de Usuario ```gherkin Given que soy Director General When accedo a "Usuarios" y selecciono un usuario And hago clic en "Permisos" Then debo ver dos secciones: - "Permisos Base del Rol" (no editables, solo lectura) - "Permisos Personalizados" (editables) And cada permiso debe mostrar: - MΓ³dulo - Acciones permitidas (Create, Read, Update, Delete, Approve) - Origen (Rol / Personalizado) ``` ### 2. Agregar Permiso Personalizado ```gherkin Given que estoy viendo permisos de un usuario con rol "engineer" And su rol NO incluye permiso "approve" en mΓ³dulo "budgets" When hago clic en "+ Agregar Permiso Personalizado" And selecciono: - MΓ³dulo: "Presupuestos" - AcciΓ³n: "Aprobar" - CondiciΓ³n: "Montos < $50,000 MXN" (opcional) And hago clic en "Guardar" Then el sistema debe: - Agregar el permiso a la secciΓ³n "Personalizados" - Marcar visualmente que es un permiso adicional (badge "Extra") - Registrar en audit log: "custom_permission_granted" - Notificar al usuario por email ``` ### 3. Revocar Permiso Base ```gherkin Given que un usuario con rol "resident" tiene permiso "update" en "purchases" When quiero restringir este permiso especΓ­ficamente And hago clic en "Revocar" junto al permiso And confirmo la acciΓ³n Then el sistema debe: - Crear una excepciΓ³n negativa en permisos personalizados - Marcar el permiso con badge "Revocado" - El usuario pierde acceso a esa acciΓ³n - Registrar en audit log: "permission_revoked" ``` ### 4. Permisos Temporales ```gherkin Given que quiero dar acceso temporal a un usuario When agrego un permiso personalizado And marco la opciΓ³n "Temporal" And selecciono fecha de expiraciΓ³n: "2025-12-31" Then el sistema debe: - Guardar el permiso con fecha de expiraciΓ³n - Mostrar countdown: "Expira en 45 dΓ­as" - Revocar automΓ‘ticamente el permiso al llegar la fecha - Enviar notificaciΓ³n 3 dΓ­as antes de expirar ``` ### 5. Permisos Condicionales ```gherkin Given que agrego un permiso personalizado When selecciono "Con Condiciones" And configuro reglas: - Campo: "monto" - Operador: "<=" - Valor: "50000" Then el sistema debe: - Guardar la condiciΓ³n en JSON - Validar en backend si se cumple la condiciΓ³n - Mostrar en UI: "Aprobar presupuestos ≀ $50,000" ``` ### 6. PrevisualizaciΓ³n de Acceso ```gherkin Given que estoy editando permisos de un usuario When hago clic en "Previsualizar Acceso" Then debo ver una matriz completa con: - Filas: Todos los mΓ³dulos - Columnas: CREATE, READ, UPDATE, DELETE, APPROVE - Celdas con color: - Verde: Permitido por rol - Azul: Permitido por permiso personalizado - Rojo: Denegado por excepciΓ³n - Gris: No permitido ``` --- ## 🎨 Mockup / Wireframe ### Panel de Permisos de Usuario ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ← Usuarios / Juan PΓ©rez β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ [Info] [Permisos] [Actividad] [Sesiones] β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ πŸ“‹ Permisos Base del Rol: Ingeniero [πŸ‘οΈ Preview]β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ MΓ³dulo CREATE READ UPDATE DELETE APPROVE β”‚ β”‚ β”‚ β”‚ ────────────────────────────────────────────────────────── β”‚ β”‚ β”‚ β”‚ Proyectos βœ“ βœ“ βœ“ βœ— βœ— [ROL] β”‚ β”‚ β”‚ β”‚ Presupuestos βœ“ βœ“ βœ“ βœ— βœ— [ROL] β”‚ β”‚ β”‚ β”‚ Obra βœ“ βœ“ βœ“ βœ— βœ— [ROL] β”‚ β”‚ β”‚ β”‚ Compras βœ— βœ“ βœ— βœ— βœ— [ROL] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ 🎯 Permisos Personalizados [+ Agregar Permiso] β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ ✨ Presupuestos > Aprobar [Extra] β”‚ β”‚ β”‚ β”‚ CondiciΓ³n: Monto ≀ $50,000 MXN β”‚ β”‚ β”‚ β”‚ Expira: 31 Dic 2025 (45 dΓ­as restantes) β”‚ β”‚ β”‚ β”‚ Otorgado por: MarΓ­a LΓ³pez el 15 Nov 2025 β”‚ β”‚ β”‚ β”‚ [Editar] [Revocar] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 🚫 Compras > Eliminar [Revocado]β”‚ β”‚ β”‚ RazΓ³n: PrevenciΓ³n de errores crΓ­ticos β”‚ β”‚ β”‚ β”‚ Revocado por: MarΓ­a LΓ³pez el 18 Nov 2025 β”‚ β”‚ β”‚ β”‚ [Restaurar] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Modal Agregar Permiso Personalizado ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Agregar Permiso Personalizado [X]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Tipo * β”‚ β”‚ β—‰ Otorgar permiso adicional β”‚ β”‚ β—‹ Revocar permiso del rol β”‚ β”‚ β”‚ β”‚ MΓ³dulo * β”‚ β”‚ [v] Presupuestos β”‚ β”‚ β”‚ β”‚ AcciΓ³n * β”‚ β”‚ [v] Aprobar β”‚ β”‚ β”‚ β”‚ β˜‘οΈ Aplicar Condiciones β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Campo Operador Valor β”‚ β”‚ β”‚ β”‚ [monto] [<=] [50000] [+ And]β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β˜‘οΈ Permiso Temporal β”‚ β”‚ Expira el: [31/12/2025] πŸ“… β”‚ β”‚ β”‚ β”‚ RazΓ³n * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Necesita aprobar presupuestos pequeΓ±os β”‚ β”‚ β”‚ β”‚ durante ausencia del director β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β˜‘οΈ Notificar al usuario β”‚ β”‚ β”‚ β”‚ [Cancelar] [Agregar Permiso] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### PrevisualizaciΓ³n de Matriz de Permisos ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PrevisualizaciΓ³n de Acceso: Juan PΓ©rez (Ingeniero) [X]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ MΓ³dulo CREATE READ UPDATE DELETE APPROVE β”‚ β”‚ ────────────────────────────────────────────────────────────── β”‚ β”‚ Proyectos 🟒 🟒 🟒 ⚫ ⚫ β”‚ β”‚ Presupuestos 🟒 🟒 🟒 ⚫ πŸ”΅<$50K β”‚ β”‚ Obra 🟒 🟒 🟒 ⚫ ⚫ β”‚ β”‚ Compras ⚫ 🟒 ⚫ πŸ”΄ ⚫ β”‚ β”‚ Contratos ⚫ 🟒 ⚫ ⚫ ⚫ β”‚ β”‚ RH ⚫ ⚫ ⚫ ⚫ ⚫ β”‚ β”‚ β”‚ β”‚ Leyenda: β”‚ β”‚ 🟒 Permitido por rol πŸ”΅ Permiso personalizado β”‚ β”‚ πŸ”΄ Revocado ⚫ No permitido β”‚ β”‚ β”‚ β”‚ [Cerrar] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ§ͺ Casos de Prueba ### CP-001: Agregar Permiso Adicional **Precondiciones:** - Usuario "Juan" con rol "engineer" - Director autenticado **Pasos:** 1. Ir a perfil de Juan > Permisos 2. Clic en "+ Agregar Permiso Personalizado" 3. Seleccionar: Presupuestos > Aprobar 4. Agregar condiciΓ³n: monto <= 50000 5. Guardar **Resultado Esperado:** - βœ… Permiso aparece en "Permisos Personalizados" - βœ… Badge "Extra" visible - βœ… Juan puede aprobar presupuestos ≀$50K - βœ… Juan NO puede aprobar presupuestos >$50K - βœ… Email enviado a Juan notificando cambio ### CP-002: Revocar Permiso Base **Precondiciones:** - Usuario "Ana" con rol "resident" - Rol incluye UPDATE en "purchases" **Pasos:** 1. Ir a perfil de Ana > Permisos 2. En "Permisos Base", clic en "Revocar" junto a Compras > Update 3. Confirmar revocaciΓ³n **Resultado Esperado:** - βœ… Permiso marcado como "Revocado" con badge rojo - βœ… Ana pierde acceso a editar compras - βœ… GET /api/users/me/permissions excluye ese permiso - βœ… Audit log registra revocaciΓ³n ### CP-003: Permiso Temporal Expira **Precondiciones:** - Usuario tiene permiso temporal que expira hoy a las 23:59 **Pasos:** 1. Esperar a que llegue la fecha de expiraciΓ³n 2. Verificar permisos del usuario **Resultado Esperado:** - βœ… Cron job revoca el permiso automΓ‘ticamente - βœ… Permiso removido de lista de personalizados - βœ… Usuario recibe email: "Tu permiso temporal ha expirado" - βœ… Audit log: "temporary_permission_expired" ### CP-004: ValidaciΓ³n de CondiciΓ³n **Precondiciones:** - Juan tiene permiso "approve budgets" con condiciΓ³n "monto <= 50000" **Pasos:** 1. Juan intenta aprobar presupuesto de $30,000 2. Juan intenta aprobar presupuesto de $80,000 **Resultado Esperado:** - βœ… Presupuesto $30K: AprobaciΓ³n exitosa - βœ… Presupuesto $80K: Error 403 "No tienes permiso para aprobar montos superiores a $50,000" ### CP-005: PrevisualizaciΓ³n Correcta **Precondiciones:** - Usuario con permisos base + 2 personalizados + 1 revocado **Pasos:** 1. Abrir "Previsualizar Acceso" **Resultado Esperado:** - βœ… Matriz muestra todos los mΓ³dulos y acciones - βœ… Colores correctos segΓΊn origen del permiso - βœ… Tooltips explican condiciones --- ## πŸ”— Dependencias **Requisitos Previos:** - ET-ADM-001: Tabla `custom_permissions` implementada - ET-ADM-002: Sistema RBAC base funcional - Backend: Guard que evalΓΊa permisos personalizados **APIs Necesarias:** - `GET /api/users/:id/permissions` - Permisos completos del usuario - `POST /api/users/:id/permissions/custom` - Agregar permiso personalizado - `DELETE /api/users/:id/permissions/custom/:permissionId` - Revocar - `PUT /api/users/:id/permissions/custom/:permissionId` - Editar - `POST /api/users/:id/permissions/preview` - Previsualizar matriz --- ## πŸ“Š MΓ©tricas de Γ‰xito - **Permisos personalizados activos:** <10% del total de usuarios - **Tiempo de configuraciΓ³n:** <2 minutos por permiso - **PrecisiΓ³n de condiciones:** 100% (0 falsos positivos/negativos) - **Revocaciones automΓ‘ticas:** 100% al expirar --- **Generado:** 2025-11-20 **Estado:** βœ… Listo para desarrollo