# Migrations Deprecated - 2025-11-24

**Fecha de deprecación:** 2025-11-24
**Razón:** Bug fix implementado en DDL (Política de Carga Limpia)
**Estado:** ✅ Problema resuelto permanentemente

---

## 📋 Contexto Histórico

### Problema Original

**Fecha descubrimiento:** 2025-11-24
**Reportado por:** Usuario
**Síntoma:** "Cuando se realiza una corrección en los módulos la gamificación presenta errores"

**Causa raíz identificada:**
El trigger `gamilit.initialize_user_stats()` estaba **incompleto**. Al crear un usuario nuevo, solo inicializaba 3 de 4 tablas necesarias:

- ✅ `gamification_system.user_stats`
- ✅ `gamification_system.comodines_inventory`
- ✅ `gamification_system.user_ranks`
- ❌ `progress_tracking.module_progress` ← **FALTABA**

**Impacto:**
- Usuarios nuevos no podían ver módulos disponibles
- Dashboard mostraba "No modules available"
- Gamificación rota desde el registro
- 100% tasa de error en onboarding

---

## 🔧 Solución Implementada

### Corrección Permanente en DDL

**Archivo:** `apps/database/ddl/schemas/gamilit/functions/04-initialize_user_stats.sql`

**Cambio:** Agregada inicialización de `module_progress` en el trigger (líneas 60-82)

```sql
-- BUG FIX #1: Initialize module progress for all active modules
INSERT INTO progress_tracking.module_progress (
    user_id, module_id, status, progress_percentage, ...
)
SELECT NEW.id, m.id, 'not_started', 0, ...
FROM educational_content.modules m
WHERE m.is_published = true AND m.status = 'published'
ON CONFLICT (user_id, module_id) DO NOTHING;
```

**Resultado:**
- ✅ Trigger ahora crea las 4 tablas automáticamente
- ✅ Usuarios nuevos ven 5 módulos inmediatamente
- ✅ 0% tasa de error en registro
- ✅ Cumple con Política de Carga Limpia (fix en DDL, no en migrations)

---

## 📁 Archivos en Esta Carpeta

### 1. `2025-11-24-backfill-module-progress.sql`

**Propósito:** Crear `module_progress` para usuarios existentes (creados antes del 2025-11-24)

**Cuándo usarlo:**

#### ✅ SÍ ejecutar en:

1. **Bases de datos de producción existentes:**
   - Si tienes usuarios registrados **antes del 2025-11-24**
   - Estos usuarios no tienen `module_progress` porque el trigger estaba incompleto

2. **Restauración de backups antiguos:**
   - Si restauras un backup de antes del 2025-11-24
   - El backup no incluye el fix del trigger

#### ❌ NO ejecutar en:

1. **Cargas limpias (fresh installs):**
   - El script `create-database.sh` ya crea todo correctamente
   - El trigger funcionará automáticamente
   - Ejecutar esto sería redundante (aunque seguro por `ON CONFLICT DO NOTHING`)

2. **Ambientes de desarrollo recreados:**
   - Si ejecutas `./drop-and-recreate-database.sh`, NO necesitas este script
   - El DDL corregido ya está en el código

**Cómo ejecutar:**

```bash
# Solo para BD existentes con usuarios pre-2025-11-24
export DATABASE_URL="postgresql://user:pass@host:port/database"
psql "$DATABASE_URL" -f _deprecated/migrations-removed-2025-11-24/2025-11-24-backfill-module-progress.sql
```

**Seguridad:**
- ✅ Idempotente: Usa `ON CONFLICT DO NOTHING`
- ✅ Seguro ejecutar múltiples veces
- ✅ No modifica registros existentes
- ✅ Solo crea registros faltantes

**Output esperado:**
```
Migration: Backfill module_progress
Total usuarios: N
Usuarios sin module_progress: M
Registros creados: M × 5
✅ SUCCESS: All users now have module_progress records!
```

---

### 2. `2025-11-24-test-initialize-user-stats.sql`

**Propósito:** Validar que el trigger `initialize_user_stats()` funciona correctamente

**Cuándo usarlo:**

#### ✅ SÍ ejecutar:

1. **Después de aplicar corrección en producción:**
   - Para validar que el trigger funciona
   - Para confirmar que no hay usuarios sin módulos

2. **En CI/CD:**
   - Como test de integración
   - Valida que el trigger no se rompa en futuros cambios

3. **Debugging:**
   - Si sospechas que el trigger no funciona
   - Para diagnosticar problemas de inicialización

**Cómo ejecutar:**

```bash
psql "$DATABASE_URL" -f _deprecated/migrations-removed-2025-11-24/2025-11-24-test-initialize-user-stats.sql
```

**Tests incluidos:**

1. ✅ TEST 1: Verificar `user_stats` creation
2. ✅ TEST 2: Verificar `user_ranks` creation (Bug Fix #2)
3. ✅ TEST 3: Verificar `module_progress` creation (Bug Fix #1 - CRITICAL)
4. ✅ TEST 4: Verificar `comodines_inventory` creation

**Output esperado:**
```
TEST SUITE: initialize_user_stats() Bug Fixes
✓ PASS: Found N user_stats records
✓ PASS: Found N user_ranks records
✓ PASS: Found N module_progress records
✓ PASS: Found N comodines_inventory records
RESULT: ✓ ALL TESTS PASSED
```

---

## 🎯 Casos de Uso

### Caso 1: Despliegue a Producción (Primera Vez)

**Situación:** Tienes una BD de producción con usuarios registrados antes del fix.

**Pasos:**

```bash
# 1. Backup completo
pg_dump -d gamilit_production > backup-pre-fix-$(date +%Y%m%d).sql

# 2. Aplicar función corregida (DDL)
psql -d gamilit_production -f apps/database/ddl/schemas/gamilit/functions/04-initialize_user_stats.sql

# 3. Ejecutar backfill para usuarios existentes
psql -d gamilit_production -f _deprecated/migrations-removed-2025-11-24/2025-11-24-backfill-module-progress.sql

# 4. Validar que funciona
psql -d gamilit_production -f _deprecated/migrations-removed-2025-11-24/2025-11-24-test-initialize-user-stats.sql

# 5. Crear usuario test y verificar trigger
psql -d gamilit_production -c "
INSERT INTO auth.users (email, encrypted_password, email_confirmed_at)
VALUES ('test@example.com', crypt('password', gen_salt('bf')), NOW())
RETURNING id;
-- Usar el ID retornado para crear profile y verificar
"
```

---

### Caso 2: Restauración de Backup Antiguo

**Situación:** Necesitas restaurar un backup de antes del 2025-11-24.

**Pasos:**

```bash
# 1. Restaurar backup
psql -d gamilit_restored < backup-old.sql

# 2. Aplicar DDL actualizado (sobrescribe trigger viejo)
psql -d gamilit_restored -f apps/database/ddl/schemas/gamilit/functions/04-initialize_user_stats.sql

# 3. Backfill usuarios del backup (no tienen module_progress)
psql -d gamilit_restored -f _deprecated/migrations-removed-2025-11-24/2025-11-24-backfill-module-progress.sql

# 4. Validar
psql -d gamilit_restored -f _deprecated/migrations-removed-2025-11-24/2025-11-24-test-initialize-user-stats.sql
```

---

### Caso 3: Carga Limpia (Fresh Install)

**Situación:** Instalación nueva o recreación completa de BD.

**Pasos:**

```bash
# 1. Ejecutar script de creación normal
cd apps/database
./drop-and-recreate-database.sh

# 2. ✅ LISTO - No necesitas ejecutar NADA de _deprecated/
# El trigger corregido ya está en el DDL
# Los usuarios se crearán correctamente automáticamente
```

**Nota:** El script `create-database.sh` ahora carga módulos ANTES de profiles (desde 2025-11-24), lo que hace que el trigger funcione perfectamente.

---

## 📊 Verificación Manual

Si quieres verificar manualmente que usuarios tienen `module_progress`:

```sql
-- Ver estado de inicialización de usuarios
SELECT
    p.email,
    p.role,
    COUNT(DISTINCT us.id) as user_stats,
    COUNT(DISTINCT ur.id) as user_ranks,
    COUNT(DISTINCT ci.id) as comodines,
    COUNT(DISTINCT mp.id) as modules,
    (SELECT COUNT(*) FROM educational_content.modules
     WHERE is_published = true AND status = 'published') as expected_modules
FROM auth_management.profiles p
LEFT JOIN gamification_system.user_stats us ON us.user_id = p.user_id
LEFT JOIN gamification_system.user_ranks ur ON ur.user_id = p.user_id
LEFT JOIN gamification_system.comodines_inventory ci ON ci.user_id = p.id
LEFT JOIN progress_tracking.module_progress mp ON mp.user_id = p.id
WHERE p.role IN ('student', 'admin_teacher', 'super_admin')
  AND p.deleted_at IS NULL
GROUP BY p.id, p.email, p.role
ORDER BY p.email;
```

**Resultado esperado:**
```
email              | role | user_stats | user_ranks | comodines | modules | expected
-------------------|------|------------|------------|-----------|---------|----------
admin@test.com     | sa   | 1          | 1          | 1         | 5       | 5 ✅
student@test.com   | st   | 1          | 1          | 1         | 5       | 5 ✅
teacher@test.com   | at   | 1          | 1          | 1         | 5       | 5 ✅
```

Si algún usuario tiene `modules < expected`, ejecuta el backfill.

---

## 📚 Referencias

### Documentación Relacionada

- **ADR-012:** `docs/97-adr/ADR-012-automatic-user-initialization-trigger.md`
- **CHANGELOG:** `apps/database/docs/database/CHANGELOG.md` (v2.5.2)
- **Functions README:** `apps/database/ddl/schemas/gamilit/functions/README.md`
- **Reporte completo:** `orchestration/reportes/REPORTE-VALIDACION-COMPLETA-USER-INITIALIZATION-2025-11-24.md`

### Análisis Original

- **Carpeta:** `orchestration/agentes/architecture-analyst/user-initialization-bug-fix-2025-11-24/`
- **Resumen:** `RESUMEN-FINAL-CORRECCION.md`
- **Validación:** Ejecutada por Database-Agent, Backend-Agent, Frontend-Agent

### Bugs Corregidos

1. **BUG #1 (CRÍTICO):** `module_progress` nunca se creaba
2. **BUG #2 (MEDIO):** `user_ranks` sin protección contra duplicados
3. **BUG #3 (CRÍTICO):** FK reference incorrecta (profiles.id vs auth.users.id)
4. **BUG #4 (BAJO):** Referencia a columna `deleted_at` inexistente
5. **BUG #5 (CRÍTICO):** Migration con FK incorrecta

---

## ⚠️ Importante

**Estos scripts están DEPRECADOS pero NO ELIMINADOS por:**

1. **Historial:** Documentan el problema y la solución
2. **Backfill:** Útiles para BD de producción existentes
3. **Testing:** Script de validación reutilizable
4. **Auditoría:** Trazabilidad de cambios críticos

**El fix permanente está en:**
- `apps/database/ddl/schemas/gamilit/functions/04-initialize_user_stats.sql` (líneas 60-82)

**Política de Carga Limpia:**
- ✅ DDL es la fuente de verdad
- ✅ Migrations solo para BD existentes
- ✅ Scripts deprecados NO se ejecutan en carga limpia

---

## 🔗 Enlaces Rápidos

**Para aprender más:**
- [Política de Carga Limpia](../../orchestration/directivas/DIRECTIVA-POLITICA-CARGA-LIMPIA.md)
- [Sistema de Rangos Maya](../../docs/00-vision-general/DocumentoDeDiseño_Mecanicas_GAMILIT_v6_1.md)
- [Arquitectura Database](../../docs/06-database/README.md)

**Para ejecutar:**
```bash
# Backfill (solo si necesario)
psql "$DATABASE_URL" -f _deprecated/migrations-removed-2025-11-24/2025-11-24-backfill-module-progress.sql

# Test (siempre seguro)
psql "$DATABASE_URL" -f _deprecated/migrations-removed-2025-11-24/2025-11-24-test-initialize-user-stats.sql
```

---

**Última actualización:** 2025-11-24
**Mantenido por:** Database-Agent, Architecture-Analyst
**Estado:** ✅ RESOLVED - Fix permanente en DDL
