Structure: - control-plane/: Registries, SIMCO directives, CI/CD templates - projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics - shared/: Libs catalog, knowledge-base Key features: - Centralized port, domain, database, and service registries - 23 SIMCO directives + 6 fundamental principles - NEXUS agent profiles with delegation rules - Validation scripts for workspace integrity - Dockerfiles for all services - Path aliases for quick reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
26 KiB
Historias de Usuario - Admin Portal Extendido
Sprints 1, 2 y 3 Implementados
Epic: EXT-002 - Portal de Administración Extendido Fecha: 2025-11-19 Estado: ✅ IMPLEMENTADO
Sprint 1 - P0 Critical Features
US-EXT-002-001: Visualizar Dashboard Administrativo
ID: US-EXT-002-001 Como: Administrador del sistema Quiero: Ver un dashboard centralizado con estadísticas y actividad del sistema Para: Monitorear la salud y uso de la plataforma en tiempo real
Criterios de Aceptación:
✅ Escenario 1: Visualizar estadísticas generales
DADO que soy un administrador autenticado
CUANDO accedo a GET /admin/dashboard
ENTONCES veo:
- Total de usuarios y usuarios activos
- Nuevos usuarios registrados hoy
- Total de organizaciones
- Total de módulos y ejercicios
- Ejercicios completados en últimas 24h
- Estado de salud del sistema (healthy/warning/critical)
- Tiempo promedio de respuesta del sistema
✅ Escenario 2: Visualizar actividad reciente
DADO que soy un administrador autenticado
CUANDO accedo a GET /admin/dashboard/recent-activity?limit=20
ENTONCES veo:
- Lista de las últimas 20 acciones de usuarios/admins
- Información de cada acción: email, nombre, tipo de acción, descripción
- Timestamp de cada acción
- Respuesta paginada con total de registros
✅ Escenario 3: Consultar solo estadísticas
DADO que necesito solo las métricas sin actividad
CUANDO accedo a GET /admin/dashboard/stats
ENTONCES recibo solo el objeto de estadísticas
Y la respuesta es más rápida que el dashboard completo
Endpoints:
GET /admin/dashboard- Dashboard completoGET /admin/dashboard/stats- Solo estadísticasGET /admin/dashboard/recent-activity- Solo actividad (paginada)
Valor de Negocio: Alto - Visibilidad completa del estado del sistema
US-EXT-002-002: Gestionar Roles y Permisos
ID: US-EXT-002-002 Como: Administrador con permiso de gestión de roles Quiero: Ver y modificar permisos de roles existentes Para: Controlar el acceso granular a funcionalidades del sistema
Criterios de Aceptación:
✅ Escenario 1: Listar roles disponibles
DADO que soy un administrador con permiso can_manage_roles
CUANDO accedo a GET /admin/roles
ENTONCES veo:
- Lista de todos los roles (student, admin_teacher, super_admin, etc.)
- Nombre de cada rol
- Permisos asignados a cada rol
- Conteo de usuarios con cada rol
✅ Escenario 2: Ver permisos disponibles
DADO que necesito conocer los permisos del sistema
CUANDO accedo a GET /admin/roles/permissions
ENTONCES veo:
- 16 permisos disponibles organizados por categoría
- Categorías: content, users, system, reports, gamification, analytics
- Cada permiso con nombre técnico y nombre descriptivo
✅ Escenario 3: Ver permisos de un rol específico
DADO que quiero revisar permisos del rol "admin_teacher"
CUANDO accedo a GET /admin/roles/{roleId}/permissions
ENTONCES veo:
- ID y nombre del rol
- Objeto con todos los permisos y su estado (true/false)
- Última actualización
✅ Escenario 4: Actualizar permisos de un rol
DADO que quiero dar permiso "can_approve_content" a "admin_teacher"
CUANDO envío PUT /admin/roles/{roleId}/permissions
Con body: { permissions: { can_approve_content: true } }
ENTONCES:
- El rol se actualiza correctamente
- Recibo confirmación con permisos actualizados
- Los usuarios con ese rol obtienen el nuevo permiso inmediatamente
Endpoints:
GET /admin/rolesGET /admin/roles/permissionsGET /admin/roles/:id/permissionsPUT /admin/roles/:id/permissions
Valor de Negocio: Crítico - Control de acceso granular y seguridad
US-EXT-002-003: Generar Reportes del Sistema
ID: US-EXT-002-003 Como: Administrador con permiso can_export_reports Quiero: Generar, listar y descargar reportes en diferentes formatos Para: Analizar datos del sistema y tomar decisiones informadas
Criterios de Aceptación:
✅ Escenario 1: Generar reporte de usuarios
DADO que necesito un reporte de usuarios activos
CUANDO envío POST /admin/reports/generate
Con body:
{
type: "users",
format: "csv",
filters: { status: "active" },
date_range: { start: "2025-11-01", end: "2025-11-19" }
}
ENTONCES:
- Se crea un reporte con estado "generating"
- Recibo ID del reporte
- El reporte se genera de forma asíncrona
- Después de 2 segundos el estado cambia a "completed"
✅ Escenario 2: Listar reportes generados
DADO que tengo reportes previos
CUANDO accedo a GET /admin/reports?type=users&page=1&limit=20
ENTONCES veo:
- Lista paginada de reportes
- Información de cada reporte: tipo, formato, estado, tamaño, fechas
- Total de reportes y páginas disponibles
✅ Escenario 3: Descargar reporte completado
DADO que tengo un reporte con status="completed"
CUANDO accedo a GET /admin/reports/{reportId}/download
ENTONCES:
- Recibo el reporte con metadata actualizada
- Campo download_url está disponible
- Puedo descargar el archivo en el formato solicitado
✅ Escenario 4: Eliminar reporte antiguo
DADO que tengo reportes de hace 6 meses
CUANDO envío DELETE /admin/reports/{reportId}
ENTONCES:
- El reporte se elimina
- Recibo confirmación 204 No Content
- El reporte ya no aparece en la lista
Tipos de reportes soportados:
users: Reporte de usuariosprogress: Reporte de progreso educativogamification: Reporte de gamificaciónsystem: Reporte del sistema
Formatos soportados:
csv: Valores separados por comasexcel: Archivo Excel (.xlsx)pdf: Documento PDF
Endpoints:
POST /admin/reports/generateGET /admin/reportsGET /admin/reports/:id/downloadDELETE /admin/reports/:id
Valor de Negocio: Alto - Análisis de datos y toma de decisiones
Nota: Implementación actual usa almacenamiento en memoria. Para producción se requiere persistencia en DB y sistema de archivos.
US-EXT-002-004: Configurar Sistema por Categorías
ID: US-EXT-002-004 Como: Super administrador Quiero: Ver y modificar configuraciones del sistema organizadas por categorías Para: Gestionar fácilmente diferentes aspectos de la configuración
Criterios de Aceptación:
✅ Escenario 1: Ver configuración completa
DADO que soy super admin
CUANDO accedo a GET /admin/system/config
ENTONCES veo:
- Modo mantenimiento y mensaje
- Configuraciones de registro (allow_registrations)
- Configuraciones de seguridad (max_login_attempts, lockout_duration)
- Configuraciones de sesión (session_timeout_minutes)
- Configuraciones personalizadas (custom_settings)
- Metadata: updated_at, updated_by
✅ Escenario 2: Actualizar configuración completa
DADO que quiero cambiar varias configuraciones
CUANDO envío POST /admin/system/config
Con body:
{
maintenance_mode: true,
maintenance_message: "Sistema en mantenimiento",
max_login_attempts: 3
}
ENTONCES:
- Todas las configuraciones se actualizan en DB
- Se registra quién hizo el cambio (audit trail)
- Recibo configuración actualizada como confirmación
✅ Escenario 3: Ver configuración por categoría
DADO que solo necesito ver configuraciones de "security"
CUANDO accedo a GET /admin/system/config/security
ENTONCES veo solo:
- max_login_attempts
- lockout_duration_minutes
- Y otras configuraciones de seguridad
✅ Escenario 4: Actualizar por categoría
DADO que quiero actualizar solo configuraciones de email
CUANDO envío PUT /admin/system/config/email
Con body: { smtp_host: "smtp.example.com", smtp_port: 587 }
ENTONCES:
- Solo las configuraciones de email se actualizan
- Otras categorías permanecen sin cambios
- Cambios persisten en base de datos
Categorías soportadas:
general- Configuraciones generalesemail- Configuraciones de emailnotifications- Configuraciones de notificacionessecurity- Configuraciones de seguridadmaintenance- Configuraciones de mantenimiento
Endpoints:
GET /admin/system/configPOST /admin/system/configGET /admin/system/config/:categoryPUT /admin/system/config/:category
Mejora realizada:
- ❌ Antes: Config en memoria (se perdía al reiniciar)
- ✅ Ahora: Config persiste en DB con tipos y audit trail
Valor de Negocio: Crítico - Configuración persistente y auditable del sistema
Sprint 2 - P1 High Priority Features
US-EXT-002-005: Realizar Operaciones Masivas sobre Usuarios
ID: US-EXT-002-005 Como: Administrador de usuarios Quiero: Suspender, eliminar o cambiar rol de múltiples usuarios a la vez Para: Realizar tareas administrativas de forma eficiente
Criterios de Aceptación:
✅ Escenario 1: Suspender usuarios en lote
DADO que tengo una lista de 50 usuarios infractores
CUANDO envío POST /admin/users/bulk/suspend
Con body:
{
user_ids: ["uuid1", "uuid2", ..., "uuid50"],
reason: "Violación de términos de servicio"
}
ENTONCES:
- Se crea operación asíncrona con estado "processing"
- Recibo ID de operación
- Los 50 usuarios se suspenden (deleted_at se establece)
- Estado final: "completed" con 50 procesados
✅ Escenario 2: Eliminar usuarios en lote
DADO que tengo usuarios inactivos hace 2 años
CUANDO envío POST /admin/users/bulk/delete
Con body:
{
user_ids: ["uuid1", "uuid2", ...],
confirm: true
}
ENTONCES:
- Se valida confirmación explícita
- Se crea operación asíncrona
- Los usuarios se eliminan físicamente
- Operación registrada en audit log
✅ Escenario 3: Actualizar rol masivamente
DADO que quiero promover 10 estudiantes a maestros
CUANDO envío POST /admin/users/bulk/update-role
Con body:
{
user_ids: ["uuid1", ..., "uuid10"],
new_role: "admin_teacher"
}
ENTONCES:
- Rol se actualiza para todos los usuarios
- Permisos se actualizan automáticamente
- Usuarios notificados de cambio de rol
Compatibilidad de rutas:
/admin/users/bulk/*- Rutas para frontend ✅/admin/bulk-operations/*- Rutas canónicas ✅
Endpoints:
POST /admin/users/bulk/suspendPOST /admin/users/bulk/deletePOST /admin/users/bulk/update-role
Valor de Negocio: Alto - Eficiencia administrativa
US-EXT-002-006: Forzar Reset de Contraseña
ID: US-EXT-002-006 Como: Administrador de seguridad Quiero: Forzar reset de contraseña de usuarios específicos Para: Mantener seguridad de cuentas comprometidas o por política
Criterios de Aceptación:
✅ Escenario 1: Forzar reset con email
DADO que un usuario reportó cuenta comprometida
CUANDO envío POST /admin/users/{userId}/reset-password
Con body:
{
sendEmail: true,
customMessage: "Su cuenta fue comprometida. Por favor cambie su contraseña."
}
ENTONCES:
- Usuario marcado con require_password_reset: true
- Se envía email con instrucciones
- Usuario debe cambiar contraseña en próximo login
- Acción registrada con admin ID en metadata
✅ Escenario 2: Forzar reset sin email
DADO que necesito que un usuario cambie contraseña sin notificarlo
CUANDO envío POST /admin/users/{userId}/reset-password
Con body: { sendEmail: false }
ENTONCES:
- Usuario marcado para reset
- NO se envía email
- Usuario ve prompt de cambio en próximo login
✅ Escenario 3: Verificar metadata de reset
DADO que forcé reset de contraseña
CUANDO consulto GET /admin/users/{userId}
ENTONCES veo en raw_user_meta_data:
- require_password_reset: true
- password_reset_requested_at: "2025-11-19T12:00:00Z"
- password_reset_requested_by: "admin"
Endpoint:
POST /admin/users/:id/reset-password
Valor de Negocio: Alto - Seguridad de cuentas de usuario
US-EXT-002-007: Gestionar Contenido con Rutas Específicas
ID: US-EXT-002-007 Como: Administrador de contenido Quiero: Gestionar ejercicios con rutas específicas además de rutas genéricas Para: Tener compatibilidad con el frontend existente
Criterios de Aceptación:
✅ Escenario 1: Listar ejercicios pendientes
DADO que quiero ver solo ejercicios para aprobar
CUANDO accedo a GET /admin/content/exercises/pending
ENTONCES veo:
- Solo ejercicios (automáticamente filtrado)
- Ejercicios con reviewed_by IS NULL
- Lista paginada de ejercicios pendientes
✅ Escenario 2: Aprobar ejercicio con ruta específica
DADO que un ejercicio está pendiente de aprobación
CUANDO envío POST /admin/content/exercises/{id}/approve
Con body: { approval_notes: "Contenido excelente", publish_immediately: true }
ENTONCES:
- Ejercicio se aprueba (is_active = true)
- Se registra en content_approvals
- Notas se guardan en metadata
✅ Escenario 3: Rechazar ejercicio con ruta específica
DADO que un ejercicio tiene errores
CUANDO envío POST /admin/content/exercises/{id}/reject
Con body: { rejection_reason: "Errores gramaticales en instrucciones" }
ENTONCES:
- Ejercicio se marca como rechazado (is_active = false)
- Se registra rechazo en content_approvals
- Razón se guarda para referencia del creador
Compatibilidad de rutas:
/admin/content/exercises/*- Rutas específicas ✅/admin/content/*- Rutas genéricas ✅
Endpoints alias:
GET /admin/content/exercises/pendingPOST /admin/content/exercises/:id/approvePOST /admin/content/exercises/:id/reject
Valor de Negocio: Medio - Compatibilidad con frontend legacy
US-EXT-002-008: Consultar Estadísticas Avanzadas del Sistema
ID: US-EXT-002-008 Como: Administrador analista Quiero: Acceder a estadísticas detalladas desde vistas de base de datos Para: Obtener insights profundos sobre usuarios, organizaciones, moderación y educación
Criterios de Aceptación:
✅ Escenario 1: Consultar estadísticas de usuarios
DADO que necesito análisis de usuarios
CUANDO accedo a GET /admin/dashboard/user-stats
ENTONCES veo:
- Total de usuarios, nuevos hoy, esta semana, este mes
- Usuarios activos hoy y esta semana
- Desglose por rol: students, teachers, admins
- Datos agregados desde vista user_stats_summary
✅ Escenario 2: Consultar estadísticas de organizaciones
DADO que administro múltiples organizaciones
CUANDO accedo a GET /admin/dashboard/organization-stats
ENTONCES veo:
- Total de organizaciones
- Organizaciones activas
- Nuevas organizaciones este mes
✅ Escenario 3: Ver cola de moderación de contenido
DADO que hay contenido flagged pendiente de revisión
CUANDO accedo a GET /admin/dashboard/moderation-queue
ENTONCES veo (primeros 50):
- Contenido reportado ordenado por prioridad (high → medium → low)
- Tipo de contenido, razón, reporter
- Status: pending
- Timestamps de reporte
✅ Escenario 4: Consultar overview de aulas
DADO que administro plataforma educativa
CUANDO accedo a GET /admin/dashboard/classroom-overview
ENTONCES veo (primeros 100):
- Información de cada aula: nombre, teacher, estudiantes
- Asignaciones totales, pendientes, próximas a vencer
- Progreso promedio de la clase
- Estado del aula (ACTIVE, INACTIVE, EMPTY)
✅ Escenario 5: Consultar estadísticas de asignaciones
DADO que quiero analizar desempeño en asignaciones
CUANDO accedo a GET /admin/dashboard/assignment-stats
ENTONCES veo (primeros 100):
- Título de asignación, aula, tipo, puntos máximos
- Submissions: total, completadas, en progreso, no iniciadas
- Tasa de submission (%)
- Scores: promedio, máximo, mínimo
- Fechas de entrega y overrides por aula
Vistas DB consumidas:
admin_dashboard.user_stats_summaryadmin_dashboard.organization_stats_summaryadmin_dashboard.moderation_queueadmin_dashboard.classroom_overviewadmin_dashboard.assignment_submission_stats
Endpoints:
GET /admin/dashboard/user-statsGET /admin/dashboard/organization-statsGET /admin/dashboard/moderation-queueGET /admin/dashboard/classroom-overviewGET /admin/dashboard/assignment-stats
Valor de Negocio: Alto - Insights profundos para decisiones estratégicas
Sprint 3 - P2 Medium Priority Features
US-EXT-002-009: Consultar Historial de Aprobaciones
ID: US-EXT-002-009 Como: Administrador de contenido o auditor Quiero: Ver historial completo de aprobaciones y rechazos de contenido Para: Auditar decisiones y analizar procesos de revisión
Criterios de Aceptación:
✅ Escenario 1: Listar historial completo
DADO que necesito revisar todas las aprobaciones
CUANDO accedo a GET /admin/content/approval-history?page=1&limit=20
ENTONCES veo:
- Lista paginada de aprobaciones/rechazos
- Información de cada registro:
* Tipo y título del contenido
* Quién submitió y quién revisó (con nombres)
* Estado: pending, approved, rejected, needs_revision
* Timestamps de submission y review
* Notas del reviewer y del submitter
✅ Escenario 2: Filtrar por tipo de contenido
DADO que solo me interesan ejercicios
CUANDO accedo a GET /admin/content/approval-history?content_type=exercise
ENTONCES veo:
- Solo registros de tipo exercise
- Filtrado desde base de datos
- Performance optimizada con índices
✅ Escenario 3: Ver historial de contenido específico
DADO que un ejercicio fue rechazado 2 veces antes de aprobarse
CUANDO accedo a GET /admin/content/approval-history?content_id={exerciseId}
ENTONCES veo:
- 3 registros del mismo ejercicio
- Registro 1: rejected con notas "Errores gramaticales"
- Registro 2: rejected con notas "Falta instrucciones"
- Registro 3: approved con notas "Excelente después de correcciones"
- Ordenados cronológicamente
✅ Escenario 4: Buscar en notas de revisión
DADO que quiero encontrar rechazos por "plagio"
CUANDO accedo a GET /admin/content/approval-history?search=plagio&status=rejected
ENTONCES veo:
- Solo contenido rechazado
- Donde reviewer_notes o revision_notes contienen "plagio"
- Búsqueda case-insensitive
✅ Escenario 5: Filtrar por revisor
DADO que quiero auditar aprobaciones de un admin específico
CUANDO accedo a GET /admin/content/approval-history?reviewed_by={adminId}
ENTONCES veo:
- Solo aprobaciones/rechazos de ese admin
- Estadísticas de su actividad de revisión
Filtros soportados:
content_type: module, exercise, assignment, resourcecontent_id: UUID específicostatus: pending, approved, rejected, needs_revisionsubmitted_by: UUID del submitterreviewed_by: UUID del reviewersearch: Búsqueda en notaspage,limit: Paginación
Endpoint:
GET /admin/content/approval-history
Integración:
- Registros creados automáticamente en
approveContent()yrejectContent() - Joins con User para nombres de submitter y reviewer
- Joins con Module/Exercise/Template para títulos
Valor de Negocio: Medio - Auditoría y mejora de procesos
US-EXT-002-010: Acceder a Logs con Ruta Simplificada
ID: US-EXT-002-010
Como: Administrador o desarrollador
Quiero: Acceder a audit logs con ruta corta /admin/logs
Para: Tener compatibilidad con frontend y facilidad de uso
Criterios de Aceptación:
✅ Escenario 1: Acceder con ruta corta
DADO que el frontend espera /admin/logs
CUANDO accedo a GET /admin/logs?page=1&limit=50
ENTONCES:
- Recibo logs de auth_attempts
- Respuesta idéntica a /admin/system/audit-log
- Paginación funciona correctamente
✅ Escenario 2: Filtrar logs con ruta corta
DADO que necesito logs de un usuario específico
CUANDO accedo a GET /admin/logs?email=user@example.com&success=false
ENTONCES veo:
- Intentos fallidos de login de ese usuario
- Con IP, user agent, failure reason
- Ordenados por fecha descendente
✅ Escenario 3: Verificar compatibilidad total
DADO que tengo ambas rutas disponibles
CUANDO comparo respuestas de:
- GET /admin/logs?page=1
- GET /admin/system/audit-log?page=1
ENTONCES:
- Ambas retornan datos idénticos
- Mismo formato de respuesta
- Mismos filtros soportados
Rutas soportadas:
/admin/logs- Ruta corta (frontend) ✅/admin/system/audit-log- Ruta canónica ✅
Endpoint:
GET /admin/logs
Valor de Negocio: Bajo - Compatibilidad y usabilidad
US-EXT-002-011: Ejecutar Operaciones de Mantenimiento
ID: US-EXT-002-011 Como: Administrador de sistemas Quiero: Ejecutar tareas de mantenimiento del sistema Para: Optimizar rendimiento y liberar espacio en disco
Criterios de Aceptación:
✅ Escenario 1: Limpiar logs antiguos del sistema
DADO que tengo logs de hace 120 días
CUANDO envío POST /admin/system/maintenance/cleanup-logs
Con body: { retention_days: 90 }
ENTONCES:
- Se eliminan logs mayores a 90 días
- Se ejecuta VACUUM ANALYZE en tabla
- Recibo:
* success: true
* message: "Successfully deleted X log entries older than 90 days"
* affected_records: número eliminado
* metadata.execution_time_ms: tiempo de ejecución
✅ Escenario 2: Limpiar actividad de usuarios antigua
DADO que tengo actividad de hace 200 días
CUANDO envío POST /admin/system/maintenance/cleanup-activity
Con body: { retention_days: 180 }
ENTONCES:
- Se eliminan registros mayores a 180 días
- Tabla optimizada automáticamente
- Espacio en disco liberado
✅ Escenario 3: Optimizar base de datos
DADO que la base de datos tiene fragmentación
CUANDO envío POST /admin/system/maintenance/optimize-database
ENTONCES:
- Se ejecuta VACUUM ANALYZE en 5 tablas críticas:
* auth.users
* audit_logging.activity_log
* audit_logging.system_logs
* educational_content.exercises
* educational_content.modules
- Recibo lista de tablas optimizadas
- Tiempo de ejecución reportado
✅ Escenario 4: Limpiar caché de aplicación
DADO que necesito refrescar caché
CUANDO envío POST /admin/system/maintenance/clear-cache
ENTONCES:
- Caché de aplicación se limpia (Redis/in-memory)
- Recibo confirmación de limpieza
- Número de entradas eliminadas
✅ Escenario 5: Limpiar sesiones expiradas
DADO que hay sesiones de hace 7 días
CUANDO envío POST /admin/system/maintenance/cleanup-sessions
ENTONCES:
- Sesiones expiradas se eliminan
- Basado en session_timeout_minutes de config
- Recibo conteo de sesiones terminadas
✅ Escenario 6: Manejar errores de mantenimiento
DADO que la función SQL falla por permisos
CUANDO ejecuto operación de mantenimiento
ENTONCES:
- No se lanza excepción no controlada
- Recibo:
* success: false
* message: descripción del error
* affected_records: 0
* metadata.error: detalle técnico
Endpoints de mantenimiento:
POST /admin/system/maintenance/cleanup-logsPOST /admin/system/maintenance/cleanup-activityPOST /admin/system/maintenance/optimize-databasePOST /admin/system/maintenance/clear-cachePOST /admin/system/maintenance/cleanup-sessions
Integración con DB:
- Función SQL:
audit_logging.cleanup_old_system_logs(p_retention_days) - Función SQL:
audit_logging.cleanup_old_user_activity(p_retention_days) - PostgreSQL VACUUM ANALYZE para optimización
Valor de Negocio: Medio - Salud y rendimiento del sistema a largo plazo
Resumen de Historias de Usuario
Por Sprint
Sprint 1:
- 4 historias de usuario
- Todas relacionadas con funcionalidad crítica (P0)
- 100% implementadas ✅
Sprint 2:
- 4 historias de usuario
- Funcionalidad de alta prioridad (P1)
- 100% implementadas ✅
Sprint 3:
- 3 historias de usuario
- Funcionalidad de prioridad media (P2)
- 100% implementadas ✅
Total: 11 historias de usuario implementadas
Por Persona
Administrador del sistema:
- US-EXT-002-001: Dashboard
- US-EXT-002-004: Configuración
- US-EXT-002-008: Estadísticas avanzadas
Administrador con can_manage_roles:
- US-EXT-002-002: Gestión de roles/permisos
Administrador con can_export_reports:
- US-EXT-002-003: Generación de reportes
Administrador de usuarios:
- US-EXT-002-005: Operaciones masivas
- US-EXT-002-006: Reset de contraseñas
Administrador de contenido:
- US-EXT-002-007: Gestión de contenido
- US-EXT-002-009: Historial de aprobaciones
Administrador analista:
- US-EXT-002-008: Estadísticas desde vistas DB
Administrador de sistemas:
- US-EXT-002-010: Acceso a logs
- US-EXT-002-011: Mantenimiento del sistema
Valor de Negocio Agregado
Valor Crítico:
- Dashboard centralizado
- Control de acceso granular (RBAC)
- Configuración persistente del sistema
Valor Alto:
- Generación de reportes
- Operaciones masivas eficientes
- Estadísticas avanzadas para decisiones
- Reset de contraseñas
Valor Medio:
- Compatibilidad con frontend
- Historial de aprobaciones (auditoría)
- Mantenimiento automatizado
Documento generado: 2025-11-19 Versión: 1.0 Estado: Todas las historias implementadas y validadas