workspace/projects/gamilit/docs/90-transversal/migraciones/MIGRACION-MAYA-RANKS-v2.1.md
rckrdmrd 289c5a4ee5
Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Gamilit: Backend fixes, frontend API updates, deployment guides and validations
Backend:
- Fix email verification and password recovery services
- Fix exercise submission and student progress services

Frontend:
- Update missions, password, and profile API services
- Fix ExerciseContentRenderer component

Docs & Scripts:
- Add SSL/Certbot deployment guide
- Add quick deployment guide
- Database scripts for testing and validations
- Migration and homologation reports
- Functions inventory documentation

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 23:42:48 -06:00

364 lines
10 KiB
Markdown

# Migracion: Sistema de Rangos Maya v2.0 a v2.1
**Version:** 2.1.0
**Fecha:** 2025-12-18
**Autor:** Requirements-Analyst (SIMCO)
**Tipo:** Migracion de Datos y Logica
---
## RESUMEN EJECUTIVO
Migracion de umbrales de XP para hacer **todos los 5 rangos Maya alcanzables** con el contenido educativo actual (1,950 XP disponibles en Modulos 1-3).
### Problema Resuelto
Los umbrales v2.0 (hasta 10,000 XP para K'uk'ulkan) eran **inalcanzables** con el contenido educativo disponible, causando frustracion en estudiantes y falta de motivacion.
### Solucion Implementada
Reduccion de umbrales para que la progresion sea:
- **Justa:** Todos los rangos alcanzables completando M1-M3 con excelencia
- **Motivante:** Progresion visible y constante
- **Pedagogica:** Recompensas alineadas con esfuerzo real
---
## CAMBIOS TECNICOS
### Tabla Comparativa de Umbrales
| Rango | v2.0 XP | v2.1 XP | Reduccion |
|-------|---------|---------|-----------|
| Ajaw | 0-999 | 0-499 | -500 XP |
| Nacom | 1,000-2,999 | 500-999 | Reorganizado |
| Ah K'in | 3,000-5,999 | 1,000-1,499 | -1,500 XP |
| Halach Uinic | 6,000-9,999 | 1,500-1,899 | -3,100 XP |
| K'uk'ulkan | 10,000+ | 1,900+ | **-8,100 XP** |
### XP Disponible por Modulo
| Modulo | XP Aproximado | Rango Alcanzable |
|--------|---------------|------------------|
| M1 | 0-500 | Ajaw -> Nacom |
| M2 | 500-1,000 | Nacom -> Ah K'in |
| M3 | 1,000-1,950 | Ah K'in -> K'uk'ulkan |
**Total disponible M1-M3:** 1,950 XP
---
## FUNCIONES MODIFICADAS
### 1. calculate_maya_rank_helpers.sql
**Ubicacion:** `apps/database/ddl/schemas/gamification_system/functions/calculate_maya_rank_helpers.sql`
#### Funcion: `calculate_maya_rank_from_xp(xp INTEGER)`
```sql
-- v2.0 (ANTES)
IF xp < 1000 THEN RETURN 'Ajaw';
ELSIF xp < 3000 THEN RETURN 'Nacom';
ELSIF xp < 6000 THEN RETURN 'Ah K''in';
ELSIF xp < 10000 THEN RETURN 'Halach Uinic';
ELSE RETURN 'K''uk''ulkan';
-- v2.1 (DESPUES)
IF xp < 500 THEN RETURN 'Ajaw';
ELSIF xp < 1000 THEN RETURN 'Nacom';
ELSIF xp < 1500 THEN RETURN 'Ah K''in';
ELSIF xp < 1900 THEN RETURN 'Halach Uinic';
ELSE RETURN 'K''uk''ulkan';
```
#### Funcion: `calculate_rank_progress_percentage(xp INTEGER)`
```sql
-- v2.0 (ANTES)
WHEN 'Ajaw' THEN xp_in_rank := xp; rank_size := 1000;
WHEN 'Nacom' THEN xp_in_rank := xp - 1000; rank_size := 2000;
WHEN 'Ah K''in' THEN xp_in_rank := xp - 3000; rank_size := 3000;
WHEN 'Halach Uinic' THEN xp_in_rank := xp - 6000; rank_size := 4000;
-- v2.1 (DESPUES)
WHEN 'Ajaw' THEN xp_in_rank := xp; rank_size := 500;
WHEN 'Nacom' THEN xp_in_rank := xp - 500; rank_size := 500;
WHEN 'Ah K''in' THEN xp_in_rank := xp - 1000; rank_size := 500;
WHEN 'Halach Uinic' THEN xp_in_rank := xp - 1500; rank_size := 400;
```
### 2. calculate_user_rank.sql
**Ubicacion:** `apps/database/ddl/schemas/gamification_system/functions/calculate_user_rank.sql`
**Correccion aplicada (CORR-P0-001):**
```sql
-- ANTES (ERROR - columna no existe)
SELECT us.total_xp, us.missions_completed INTO v_total_xp, v_missions_completed
-- DESPUES (CORRECTO)
SELECT us.total_xp, us.modules_completed INTO v_total_xp, v_modules_completed
```
### 3. update_leaderboard_streaks.sql
**Ubicacion:** `apps/database/ddl/schemas/gamification_system/functions/update_leaderboard_streaks.sql`
**Correcciones aplicadas (CORR-001):**
```sql
-- ANTES (ERROR)
last_activity_date -> last_activity_at::DATE
longest_streak -> max_streak
-- DESPUES (CORRECTO - alineado con user_stats)
v_last_activity, v_current_streak, v_longest_streak
FROM gamification_system.user_stats us
WHERE us.user_id = p_user_id;
```
### 4. update_leaderboard_global.sql
**Ubicacion:** `apps/database/ddl/schemas/gamification_system/functions/update_leaderboard_global.sql`
**Correccion aplicada (CORR-P0-001):**
- Cambio de `missions_completed` a `modules_completed`
- Alineacion con columnas reales de `user_stats`
---
## SEEDS ACTUALIZADOS
### 03-maya_ranks.sql
**Ubicacion:** `apps/database/seeds/dev/gamification_system/03-maya_ranks.sql`
```sql
INSERT INTO gamification_system.maya_ranks (
rank_name, min_xp_required, max_xp_threshold,
ml_coins_bonus, xp_multiplier, perks
) VALUES
('Ajaw', 0, 499, 0, 1.00,
'["basic_access", "forum_access"]'),
('Nacom', 500, 999, 100, 1.10,
'["xp_boost_10", "daily_bonus", "avatar_customization"]'),
('Ah K''in', 1000, 1499, 250, 1.15,
'["xp_boost_15", "coin_bonus", "exclusive_content"]'),
('Halach Uinic', 1500, 1899, 500, 1.20,
'["xp_boost_20", "priority_support", "mentor_badge"]'),
('K''uk''ulkan', 1900, NULL, 1000, 1.25,
'["xp_boost_25", "all_perks", "hall_of_fame", "certificate"]')
ON CONFLICT (rank_name) DO UPDATE SET
min_xp_required = EXCLUDED.min_xp_required,
max_xp_threshold = EXCLUDED.max_xp_threshold,
ml_coins_bonus = EXCLUDED.ml_coins_bonus,
xp_multiplier = EXCLUDED.xp_multiplier,
perks = EXCLUDED.perks;
```
---
## IMPACTO EN EL SISTEMA
### Funciones Dependientes
| Funcion | Status | Notas |
|---------|--------|-------|
| `calculate_user_rank()` | ✅ Actualizada | Usa v2.1 thresholds |
| `get_user_rank_progress()` | ✅ Actualizada | Calculo de porcentaje correcto |
| `update_leaderboard_global()` | ✅ Corregida | Alineacion con user_stats |
| `update_leaderboard_streaks()` | ✅ Corregida | Columnas correctas |
### Tablas Afectadas
| Tabla | Cambio |
|-------|--------|
| `gamification_system.maya_ranks` | Datos actualizados via seed |
| `gamification_system.user_stats` | Sin cambios de schema |
| `gamification_system.user_ranks` | Sin cambios de schema |
### Frontend
| Componente | Impacto |
|------------|---------|
| RankProgressBar | Muestra porcentaje correcto |
| Leaderboard | Posiciones calculadas con v2.1 |
| UserProfile | Rango mostrado correctamente |
---
## CALCULO DE PROGRESION
### Distribucion por Modulo
```
Modulo 1: 0-500 XP
├── Ejercicios basicos: ~300 XP
├── Bonuses: ~100 XP
└── Completitud: ~100 XP
→ Rango: Ajaw → Nacom
Modulo 2: 500-1,000 XP
├── Ejercicios intermedios: ~350 XP
├── Bonuses: ~100 XP
└── Completitud: ~100 XP
→ Rango: Nacom → Ah K'in
Modulo 3: 1,000-1,950 XP
├── Ejercicios avanzados: ~600 XP
├── Bonuses: ~200 XP
└── Completitud: ~150 XP
→ Rango: Ah K'in → K'uk'ulkan
```
### XP Multipliers por Rango
| Rango | Multiplicador | Efecto |
|-------|---------------|--------|
| Ajaw | 1.00x | Base |
| Nacom | 1.10x | +10% XP |
| Ah K'in | 1.15x | +15% XP |
| Halach Uinic | 1.20x | +20% XP |
| K'uk'ulkan | 1.25x | +25% XP |
### ML Coins Bonus por Rango
| Rango | Bonus | Acumulado |
|-------|-------|-----------|
| Ajaw | 0 | 0 |
| Nacom | 100 | 100 |
| Ah K'in | 250 | 350 |
| Halach Uinic | 500 | 850 |
| K'uk'ulkan | 1,000 | 1,850 |
---
## PERKS DESBLOQUEABLES
### Por Rango
| Rango | Perks |
|-------|-------|
| **Ajaw** | Acceso basico, Foro |
| **Nacom** | +10% XP, Bonus diario, Avatar custom |
| **Ah K'in** | +15% XP, Bonus coins, Contenido exclusivo |
| **Halach Uinic** | +20% XP, Soporte prioritario, Badge mentor |
| **K'uk'ulkan** | +25% XP, Todos los perks, Hall of Fame, Certificado |
---
## MIGRACION DE DATOS
### Para Nuevas Instalaciones
Los seeds ya incluyen los valores v2.1. No se requiere accion adicional.
### Para Instalaciones Existentes
```sql
-- Ejecutar seed actualizado
\i apps/database/seeds/dev/gamification_system/03-maya_ranks.sql
-- O manualmente:
UPDATE gamification_system.maya_ranks SET
min_xp_required = 0, max_xp_threshold = 499
WHERE rank_name = 'Ajaw';
UPDATE gamification_system.maya_ranks SET
min_xp_required = 500, max_xp_threshold = 999
WHERE rank_name = 'Nacom';
UPDATE gamification_system.maya_ranks SET
min_xp_required = 1000, max_xp_threshold = 1499
WHERE rank_name = 'Ah K''in';
UPDATE gamification_system.maya_ranks SET
min_xp_required = 1500, max_xp_threshold = 1899
WHERE rank_name = 'Halach Uinic';
UPDATE gamification_system.maya_ranks SET
min_xp_required = 1900, max_xp_threshold = NULL
WHERE rank_name = 'K''uk''ulkan';
```
### Recalculo de Rangos de Usuarios
```sql
-- Recalcular rango de todos los usuarios
SELECT gamification_system.calculate_user_rank(user_id)
FROM gamification_system.user_stats;
-- Actualizar leaderboards
SELECT gamification_system.update_leaderboard_global();
```
---
## VERIFICACION
### Queries de Validacion
```sql
-- Verificar umbrales
SELECT rank_name, min_xp_required, max_xp_threshold, xp_multiplier
FROM gamification_system.maya_ranks
ORDER BY min_xp_required;
-- Verificar distribucion de usuarios por rango
SELECT
mr.rank_name,
COUNT(us.user_id) as usuarios
FROM gamification_system.maya_ranks mr
LEFT JOIN gamification_system.user_stats us
ON us.current_rank = mr.rank_name
GROUP BY mr.rank_name
ORDER BY mr.min_xp_required;
-- Verificar funcion de calculo
SELECT gamification_system.calculate_maya_rank_from_xp(0); -- Ajaw
SELECT gamification_system.calculate_maya_rank_from_xp(500); -- Nacom
SELECT gamification_system.calculate_maya_rank_from_xp(1000); -- Ah K'in
SELECT gamification_system.calculate_maya_rank_from_xp(1500); -- Halach Uinic
SELECT gamification_system.calculate_maya_rank_from_xp(1900); -- K'uk'ulkan
```
---
## REFERENCIAS
### Documentacion Relacionada
- `ET-GAM-003-rangos-maya.md` - Especificacion tecnica de rangos
- `ET-GAM-005-hook-user-gamification.md` - Hook de gamificacion
- `DocumentoDiseño_Mecanicas_GAMILIT_v6.2.md` - Diseño de mecanicas
### Archivos Modificados
```
apps/database/ddl/schemas/gamification_system/functions/
├── calculate_maya_rank_helpers.sql (v2.1 thresholds)
├── calculate_user_rank.sql (CORR-P0-001)
├── update_leaderboard_streaks.sql (CORR-001)
├── update_leaderboard_global.sql (CORR-P0-001)
└── get_user_rank_progress.sql (actualizado)
apps/database/seeds/dev/gamification_system/
└── 03-maya_ranks.sql (v2.1 data)
```
---
## HISTORIAL DE CAMBIOS
| Fecha | Version | Cambio |
|-------|---------|--------|
| 2025-11-24 | v2.0 | Implementacion inicial |
| 2025-12-14 | v2.1 | Reduccion de umbrales |
| 2025-12-15 | v2.1.1 | Correcciones CORR-P0-001, CORR-001 |
| 2025-12-18 | v2.1.2 | Homologacion DEV → PROD |
---
**Status:** IMPLEMENTADO
**Ultima actualizacion:** 2025-12-18