trading-platform/docs/02-definicion-modulos/OQI-002-education/requerimientos/RF-EDU-006-gamificacion.md
rckrdmrd a7cca885f0 feat: Major platform documentation and architecture updates
Changes include:
- Updated architecture documentation
- Enhanced module definitions (OQI-001 to OQI-008)
- ML integration documentation updates
- Trading strategies documentation
- Orchestration and inventory updates
- Docker configuration updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:33:35 -06:00

445 lines
13 KiB
Markdown

---
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 OrbiQuant (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 OrbiQuant" (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