--- id: "RF-EDU-006" title: "Sistema de Gamificacion" type: "Requirement" status: "Done" priority: "Media" module: "education" epic: "OQI-002" version: "1.0" created_date: "2025-12-05" updated_date: "2026-01-04" --- # RF-EDU-006: Sistema de Gamificación **Versión:** 1.0.0 **Fecha:** 2025-12-05 **Épica:** OQI-002 - Módulo Educativo **Prioridad:** P2 **Story Points:** 8 --- ## Descripción El sistema debe implementar mecánicas de gamificación que aumenten el engagement y motivación de los usuarios mediante puntos de experiencia (XP), niveles, badges, logros, leaderboards y recompensas, creando una experiencia de aprendizaje más inmersiva y competitiva. --- ## Requisitos Funcionales ### RF-EDU-006.1: Sistema de XP (Puntos de Experiencia) El sistema debe otorgar XP por las siguientes acciones: | Acción | XP | Frecuencia | |--------|----|-----------| | Completar lección de video | 10 | Por lección | | Completar lección de artículo | 15 | Por lección | | Completar módulo | 50 | Por módulo | | Completar curso | 200 | Por curso | | Aprobar quiz (primera vez) | 30 | Por quiz | | Aprobar quiz con 100% | 50 | Por quiz | | Racha de 7 días consecutivos | 100 | Por milestone | | Racha de 30 días consecutivos | 500 | Por milestone | | Tomar notas en lección | 5 | Máx 1 por lección | | Descargar recursos | 2 | Máx 1 por lección | | Compartir certificado | 25 | Por certificado | | Referir a un amigo que se registre | 100 | Por referido | | Completar perfil 100% | 50 | Una vez | | Primera lección del día | 5 | Diario (bonus) | **Bonificaciones:** - **Fin de semana:** +50% XP sábados y domingos - **Perfectionist:** +20% XP si completa curso con todos los quizzes al 100% - **Speed learner:** +30% XP si completa curso en <50% del tiempo estimado ### RF-EDU-006.2: Sistema de Niveles Niveles del 1 al 100 con títulos temáticos: | Nivel | XP Acumulado | Título | Descripción | |-------|--------------|--------|-------------| | 1-10 | 0 - 5,500 | Novice Trader | Iniciando el viaje | | 11-20 | 5,500 - 23,100 | Apprentice Analyst | Aprendiendo fundamentos | | 21-30 | 23,100 - 50,700 | Skilled Trader | Dominando estrategias | | 31-40 | 50,700 - 88,300 | Expert Strategist | Conocimiento avanzado | | 41-50 | 88,300 - 136,500 | Master Investor | Elite del trading | | 51-60 | 136,500 - 196,100 | Quant Analyst | Análisis cuantitativo | | 61-70 | 196,100 - 267,700 | Portfolio Manager | Gestión profesional | | 71-80 | 267,700 - 351,300 | Market Wizard | Dominio del mercado | | 81-90 | 351,300 - 447,900 | Trading Legend | Leyenda del trading | | 91-100 | 447,900 - 556,500 | Quant Master | Maestría absoluta | Recompensas por nivel: - **Nivel 5:** Desbloquea tema oscuro premium - **Nivel 10:** Badge especial + Avatar frame - **Nivel 15:** Acceso a cursos exclusivos - **Nivel 20:** Descuento 10% en suscripción - **Nivel 25:** Prioridad en soporte - **Nivel 30:** Acceso a comunidad premium - **Nivel 50:** Certificado de "Elite Trader" - **Nivel 75:** Reunión 1-on-1 con instructor - **Nivel 100:** Trofeo físico + Lifetime discount 20% ### RF-EDU-006.3: Sistema de Badges (Insignias) Categorías de badges: **Logros de Curso:** - First Steps (completar primer curso) - Knowledge Seeker (completar 5 cursos) - Learning Machine (completar 10 cursos) - Master Scholar (completar 25 cursos) - Completionist (completar todos los cursos de una categoría) **Logros de Velocidad:** - Fast Learner (completar curso en 1 día) - Speed Demon (completar 3 cursos en 1 semana) - Marathon Runner (completar curso de >10h) **Logros de Calidad:** - Perfectionist (aprobar todos los quizzes al 100%) - Overachiever (superar 95% en todos los quizzes de un curso) - Note Taker (tomar notas en 50 lecciones) **Logros de Racha:** - Week Warrior (racha de 7 días) - Month Master (racha de 30 días) - Unstoppable (racha de 100 días) - Year Legend (racha de 365 días) **Logros Sociales:** - Influencer (compartir 5 certificados) - Recruiter (referir 10 usuarios) - Helper (responder 25 preguntas en foro) **Logros Especiales:** - Early Bird (completar lección antes de las 6am) - Night Owl (completar lección después de las 11pm) - Weekend Warrior (completar 5 lecciones en fin de semana) - Category Master (completar todos los cursos de una categoría) Cada badge tiene: - Nombre - Descripción - Icono (SVG/PNG) - Rareza: Común, Raro, Épico, Legendario - Fecha de obtención - Progreso hacia obtenerlo (si aplica) ### RF-EDU-006.4: Leaderboard (Tabla de Clasificación) El sistema debe proveer leaderboards: **Global:** - Top 100 usuarios por XP total - Actualización: Tiempo real **Por Período:** - Esta semana (lunes a domingo) - Este mes - Este año - Histórico **Por Categoría:** - Leaderboard por cada categoría de curso - Top learners de Análisis Técnico, etc. **Por Métrica:** - Más cursos completados - Más racha consecutiva - Más badges obtenidos - Más rápido en completar curso X Información mostrada: - Posición (#1, #2, ...) - Avatar del usuario - Nombre/username - XP total o métrica relevante - Badge de top 3 (oro, plata, bronce) - Indicador de subida/bajada de posición Privacidad: - Usuario puede optar por salir del leaderboard - Por default, solo muestra username, no nombre completo - Top 10 siempre visible, resto opcional ### RF-EDU-006.5: Sistema de Logros (Achievements) Logros son metas específicas que otorgan recompensas: ```typescript interface Achievement { id: string; name: string; description: string; icon: string; category: 'course' | 'speed' | 'quality' | 'streak' | 'social'; rarity: 'common' | 'rare' | 'epic' | 'legendary'; xpReward: number; badgeReward?: string; // ID del badge que se otorga requirements: { type: 'courses_completed' | 'quiz_score' | 'streak_days' | 'custom'; target: number; metadata?: any; }; progress?: { current: number; target: number; percentage: number; }; } ``` Ejemplos: - **"Trading Fundamentals Master":** Completar todos los cursos de categoría Fundamentos (200 XP + badge) - **"Quiz Perfectionist":** Obtener 100% en 20 quizzes (150 XP + badge épico) - **"Dedicated Learner":** Mantener racha de 30 días (500 XP + badge raro) ### RF-EDU-006.6: Recompensas y Premios El sistema debe permitir canjear XP o logros por: - Descuentos en suscripción premium (1000 XP = 5% descuento) - Acceso early a nuevos cursos (500 XP) - Merch de Trading Platform (camisetas, stickers) (5000 XP) - Consulta 1-on-1 con instructor (10,000 XP) - Features premium temporales (2,000 XP = 1 mes) Tienda de recompensas: - Catálogo de items canjeables - Historial de canjes - Balance de XP disponible ### RF-EDU-006.7: Notificaciones y Celebraciones El sistema debe mostrar animaciones/notificaciones para: - Subir de nivel (modal con confeti) - Obtener nuevo badge (toast notification) - Completar logro (modal con progreso) - Entrar al top 100 del leaderboard (email) - Alcanzar milestone de racha (confeti) - Obtener XP ("+10 XP" flotante en pantalla) ### RF-EDU-006.8: Perfil Gamificado Página de perfil del usuario debe mostrar: - Avatar con marco según nivel - Nivel actual y barra de progreso - XP actual / XP para próximo nivel - Total de badges obtenidos - Galería de badges (destacar raros/épicos) - Logros recientes - Estadísticas: cursos, lecciones, quizzes, racha - Posición en leaderboard global - Gráfico de XP ganado por mes --- ## Datos de Salida ```typescript interface UserGamification { userId: string; totalXP: number; currentLevel: number; levelTitle: string; xpForCurrentLevel: number; xpForNextLevel: number; progressToNextLevel: number; // 0-100 badges: { id: string; name: string; description: string; icon: string; rarity: string; earnedAt: string; }[]; achievements: Achievement[]; leaderboard: { globalRank: number; weeklyRank: number; categoryRanks: { category: string; rank: number; }[]; }; stats: { coursesCompleted: number; quizzesPassed: number; currentStreak: number; longestStreak: number; totalBadges: number; rareBadges: number; epicBadges: number; legendaryBadges: number; }; } interface LeaderboardEntry { rank: number; userId: string; username: string; avatar: string; totalXP: number; level: number; badge?: string; // Badge de top 3 rankChange: number; // +5, -2, 0 } ``` --- ## Reglas de Negocio 1. **XP no se puede perder:** Una vez ganado, permanece 2. **Nivel no puede bajar:** Solo sube 3. **Badges permanentes:** No se pueden perder 4. **Leaderboard semanal:** Reset cada lunes 00:00 UTC 5. **Anti-cheat:** Validar todas las acciones en backend 6. **Rate limiting:** Máximo 1000 XP por hora para prevenir exploits 7. **Recompensas únicas:** Algunos logros se pueden ganar solo una vez 8. **Canje de recompensas:** Consume XP del balance, pero no baja nivel 9. **Privacidad:** Usuario puede ocultar su perfil gamificado --- ## Criterios de Aceptación ```gherkin Escenario: Usuario gana XP al completar lección DADO que el usuario completa una lección de video CUANDO se marca como completada ENTONCES se otorgan 10 XP Y se muestra animación "+10 XP" Y se actualiza barra de progreso de nivel Y se guarda en historial de XP Escenario: Usuario sube de nivel DADO que el usuario tiene 990 XP (nivel 9) Y necesita 1000 XP para nivel 10 CUANDO completa un curso y gana 200 XP ENTONCES sube a nivel 10 Y se muestra modal "¡Subiste de nivel!" Y se desbloquea badge de nivel 10 Y se envía notificación por email Escenario: Usuario obtiene badge DADO que el usuario completó 4 cursos CUANDO completa el 5to curso ENTONCES se otorga badge "Knowledge Seeker" Y se muestra toast notification Y el badge aparece en galería de perfil Y se suman 50 XP adicionales Escenario: Usuario ve leaderboard DADO que el usuario está en posición #42 CUANDO accede a /education/leaderboard ENTONCES se muestra tabla con top 100 Y su posición está destacada Y se muestra su XP y nivel Y puede filtrar por: Semanal, Mensual, Histórico Escenario: Usuario canjea recompensa DADO que el usuario tiene 5000 XP disponibles CUANDO canjea "Merch Trading Platform" (5000 XP) ENTONCES se deduce 5000 XP de balance Y se registra el canje Y se envía email de confirmación Y nivel NO baja (XP acumulado permanece) Escenario: Progreso hacia logro DADO que el usuario completó 7 de 10 cursos para logro CUANDO ve página de logros ENTONCES se muestra "7/10 cursos" Y barra de progreso al 70% Y descripción de lo que falta ``` --- ## Dependencias - PostgreSQL para gamification data - Redis para caché de leaderboards - Event system para otorgar XP en tiempo real - Notification service para celebraciones - Analytics para tracking de engagement --- ## Notas Técnicas - Calcular leaderboard en background job cada 5 minutos - Usar Redis Sorted Sets para leaderboards rápidos - Implementar event handlers para cada acción que otorga XP - Crear índices en tablas de XP y badges para queries rápidas - Considerar rate limiting para prevenir farming de XP - Implementar audit log de XP ganado/gastado - Usar WebSockets para notificaciones en tiempo real --- ## Referencias - Schema: `/backend/src/database/schemas/gamification.sql` - API: `/backend/src/modules/gamification/` - Frontend: `/frontend/src/pages/Leaderboard.tsx` --- ## Tareas Técnicas **Database:** - [ ] Tabla gamification.user_xp: user_id, total_xp, level - [ ] Tabla gamification.badges: definición de badges - [ ] Tabla gamification.user_badges: user_id, badge_id, earned_at - [ ] Tabla gamification.achievements: definición de logros - [ ] Tabla gamification.user_achievements: progreso de usuario - [ ] Tabla gamification.xp_transactions: log de XP ganado/gastado - [ ] Tabla gamification.leaderboard: caché de rankings - [ ] Índices para queries de leaderboard **Backend:** - [ ] Endpoint GET /gamification/profile (stats del usuario) - [ ] Endpoint GET /gamification/leaderboard - [ ] Endpoint GET /gamification/badges - [ ] Endpoint GET /gamification/achievements - [ ] Endpoint POST /gamification/rewards/redeem - [ ] Implementar GamificationService.awardXP() - [ ] Implementar GamificationService.checkLevelUp() - [ ] Implementar GamificationService.checkAchievements() - [ ] Event handlers para todas las acciones que otorgan XP - [ ] Cron job para calcular leaderboards **Frontend:** - [ ] Crear LeaderboardPage.tsx - [ ] Crear BadgesGalleryPage.tsx - [ ] Crear AchievementsPage.tsx - [ ] Crear RewardsStorePage.tsx - [ ] Crear componente XPAnimation.tsx - [ ] Crear componente LevelUpModal.tsx - [ ] Crear componente BadgeToast.tsx - [ ] Crear componente ProgressBar.tsx para nivel - [ ] Integrar gamificación en perfil de usuario - [ ] Implementar gamificationStore **Tests:** - [ ] Test cálculo de nivel según XP - [ ] Test otorgamiento de badges automático - [ ] Test ranking en leaderboard - [ ] Test canje de recompensas --- **Creado por:** Requirements-Analyst **Fecha:** 2025-12-05 **Última actualización:** 2025-12-05