FASE 4: Validación del Plan de Implementación
Fecha: 2025-12-18
Proyecto: Gamilit
Estado: VALIDACIÓN COMPLETA
1. RESUMEN DE VALIDACIÓN
| Componente |
Estado |
Observaciones |
| Orden de tablas |
⚠️ CORREGIDO |
modules antes de module_progress |
| ENUMs |
✅ OK |
Todos definidos en DDL |
| Funciones |
✅ OK |
12/12 implementadas |
| Triggers |
✅ OK |
12/12 implementados |
| Dependencias FK |
✅ OK |
Todas a auth_management |
2. CORRECCIÓN DE ORDEN DE EJECUCIÓN
2.1 Orden INCORRECTO (Plan Original)
1. user_stats
2. maya_ranks
3. user_ranks
4. notifications
5. mission_templates
6. missions
7. module_progress ❌ ERROR: Depende de modules
8. modules
2.2 Orden CORREGIDO
FASE 0 - PRE-REQUISITOS:
0.1 Schema gamilit (functions base)
0.2 ENUMs (00-prerequisites.sql + schema/enums/)
FASE 1 - TABLAS SIN DEPENDENCIAS INTERNAS:
1. user_stats
2. maya_ranks
3. notifications
4. mission_templates
5. modules ← MOVIDO ARRIBA
FASE 2 - TABLAS CON DEPENDENCIAS:
6. user_ranks (depende de: user_stats conceptualmente)
7. missions (depende de: mission_templates)
8. module_progress ← MOVIDO ABAJO (depende de: modules)
3. MATRIZ DE DEPENDENCIAS VALIDADA
3.1 Dependencias de FK
| Tabla |
FK a auth_management |
FK a gamification_system |
FK a educational_content |
| user_stats |
profiles, tenants |
- |
- |
| maya_ranks |
- |
- |
- |
| user_ranks |
profiles, tenants |
- |
- |
| notifications |
profiles |
- |
- |
| mission_templates |
profiles |
- |
- |
| missions |
profiles |
- |
- |
| modules |
profiles, tenants |
- |
- |
| module_progress |
profiles |
- |
modules |
3.2 Dependencias de ENUM
| Tabla |
ENUMs Requeridos |
| user_stats |
gamification_system.maya_rank |
| maya_ranks |
gamification_system.maya_rank |
| user_ranks |
gamification_system.maya_rank |
| notifications |
notification_type, notification_priority |
| mission_templates |
- (usa CHECK constraints) |
| missions |
- (usa CHECK constraints) |
| modules |
maya_rank, difficulty_level, module_status |
| module_progress |
progress_tracking.progress_status |
4. VALIDACIÓN DE ENUMs
4.1 ENUMs Existentes - TODOS OK
| ENUM |
Archivo |
Valores |
Estado |
maya_rank |
00-prerequisites.sql |
Ajaw, Nacom, Ah K'in, Halach Uinic, K'uk'ulkan |
✅ |
notification_type |
gamification_system/enums/ |
11 tipos |
✅ |
notification_priority |
gamification_system/enums/ |
low, medium, high, critical |
✅ |
transaction_type |
gamification_system/enums/ |
14 tipos |
✅ |
difficulty_level |
educational_content/enums/ |
beginner, intermediate, advanced |
✅ |
module_status |
educational_content/enums/ |
draft, published, archived |
✅ |
progress_status |
progress_tracking/types/ |
not_started, in_progress, completed, reviewed, mastered |
✅ |
4.2 Tipos sin ENUM (usan CHECK)
| Campo |
Tabla |
Valores |
Recomendación |
mission_type |
missions, mission_templates |
daily, weekly, special, classroom |
Considerar crear ENUM |
mission_status |
missions |
active, in_progress, completed, claimed, expired |
Considerar crear ENUM |
5. VALIDACIÓN DE FUNCIONES
5.1 Funciones Críticas - TODAS OK
| Función |
Schema |
Estado |
Usado Por |
now_mexico() |
gamilit |
✅ |
Todas las tablas con timestamps |
update_updated_at_column() |
gamilit |
✅ |
Triggers de updated_at |
calculate_level_from_xp() |
gamification_system |
✅ |
recalculate_level_on_xp_change |
recalculate_level_on_xp_change() |
gamification_system |
✅ |
Trigger user_stats |
check_rank_promotion() |
gamification_system |
✅ |
Trigger xp_gain |
promote_to_next_rank() |
gamification_system |
✅ |
check_rank_promotion |
initialize_user_stats() |
gamilit |
✅ |
Trigger en profiles |
update_missions_on_earn_xp() |
gamilit |
✅ |
Trigger user_stats |
update_missions_on_use_comodines() |
gamilit |
✅ |
Trigger comodin_usage_log |
update_missions_on_daily_streak() |
gamilit |
✅ |
Trigger user_stats |
5.2 Funciones Deprecated (mantener por compatibilidad)
| Función |
Schema |
Notas |
update_notifications_updated_at() |
gamification_system |
Usar update_updated_at_column |
update_missions_updated_at() |
gamification_system |
Usar update_updated_at_column |
6. VALIDACIÓN DE TRIGGERS
6.1 Triggers Críticos - TODOS OK
| Trigger |
Tabla |
Evento |
Función |
trg_initialize_user_stats |
auth_management.profiles |
AFTER INSERT |
gamilit.initialize_user_stats() |
trg_user_stats_updated_at |
user_stats |
BEFORE UPDATE |
gamilit.update_updated_at_column() |
trg_user_ranks_updated_at |
user_ranks |
BEFORE UPDATE |
gamilit.update_updated_at_column() |
trg_recalculate_level_on_xp_change |
user_stats |
BEFORE UPDATE OF total_xp |
recalculate_level_on_xp_change() |
trg_check_rank_promotion_on_xp_gain |
user_stats |
AFTER UPDATE OF total_xp |
check_rank_promotion() |
trg_update_missions_on_earn_xp |
user_stats |
AFTER UPDATE |
update_missions_on_earn_xp() |
trg_update_missions_on_daily_streak |
user_stats |
AFTER UPDATE |
update_missions_on_daily_streak() |
trg_achievement_unlocked |
user_achievements |
AFTER INSERT/UPDATE |
fn_on_achievement_unlocked() |
notifications_updated_at |
notifications |
BEFORE UPDATE |
update_notifications_updated_at() |
missions_updated_at |
missions |
BEFORE UPDATE |
update_missions_updated_at() |
7. ORDEN DE EJECUCIÓN FINAL VALIDADO
Script Consolidado Corregido
#!/bin/bash
# migrate-production-validated.sh
# Orden de ejecución VALIDADO para producción
set -e
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_NAME="${DB_NAME:-gamilit_platform}"
DB_USER="${DB_USER:-gamilit_user}"
PSQL="psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME"
BASE="apps/database/ddl"
echo "=== MIGRACIÓN VALIDADA PRODUCCIÓN ==="
echo ""
# FASE 0: PRE-REQUISITOS
echo "FASE 0: Pre-requisitos..."
$PSQL -f "$BASE/00-prerequisites.sql" 2>/dev/null || echo " Prerequisites ya existen"
# FASE 0.1: Funciones gamilit
echo "FASE 0.1: Funciones base gamilit..."
$PSQL -f "$BASE/schemas/gamilit/functions/08-now_mexico.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamilit/functions/15-update_updated_at_column.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamilit/functions/04-initialize_user_stats.sql" 2>/dev/null || true
# FASE 0.2: ENUMs gamification_system
echo "FASE 0.2: ENUMs gamification_system..."
$PSQL -f "$BASE/schemas/gamification_system/enums/notification_type.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/enums/notification_priority.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/enums/transaction_type.sql" 2>/dev/null || true
# FASE 0.3: ENUMs progress_tracking
echo "FASE 0.3: ENUMs progress_tracking..."
$PSQL -f "$BASE/schemas/progress_tracking/types/progress_status.sql" 2>/dev/null || true
# FASE 1: TABLAS SIN DEPENDENCIAS INTERNAS
echo ""
echo "FASE 1: Tablas base..."
$PSQL -f "$BASE/schemas/gamification_system/tables/01-user_stats.sql"
$PSQL -f "$BASE/schemas/gamification_system/tables/13-maya_ranks.sql"
$PSQL -f "$BASE/schemas/gamification_system/tables/08-notifications.sql"
$PSQL -f "$BASE/schemas/gamification_system/tables/20-mission_templates.sql"
$PSQL -f "$BASE/schemas/educational_content/tables/01-modules.sql"
# FASE 2: TABLAS CON DEPENDENCIAS
echo ""
echo "FASE 2: Tablas dependientes..."
$PSQL -f "$BASE/schemas/gamification_system/tables/02-user_ranks.sql"
$PSQL -f "$BASE/schemas/gamification_system/tables/06-missions.sql"
$PSQL -f "$BASE/schemas/progress_tracking/tables/01-module_progress.sql"
# FASE 3: FUNCIONES ADICIONALES
echo ""
echo "FASE 3: Funciones gamification..."
$PSQL -f "$BASE/schemas/gamification_system/functions/calculate_level_from_xp.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/functions/08-recalculate_level_on_xp_change.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/functions/check_rank_promotion.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/functions/promote_to_next_rank.sql" 2>/dev/null || true
# FASE 3.1: Funciones de missions
echo "FASE 3.1: Funciones missions..."
$PSQL -f "$BASE/schemas/gamilit/functions/22-update_missions_on_earn_xp.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamilit/functions/21-update_missions_on_use_comodines.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamilit/functions/23-update_missions_on_daily_streak.sql" 2>/dev/null || true
# FASE 4: TRIGGERS
echo ""
echo "FASE 4: Triggers..."
$PSQL -f "$BASE/schemas/auth_management/triggers/04-trg_initialize_user_stats.sql"
$PSQL -f "$BASE/schemas/gamification_system/triggers/20-trg_user_stats_updated_at.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/triggers/19-trg_user_ranks_updated_at.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/triggers/21-trg_recalculate_level_on_xp_change.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/triggers/trg_check_rank_promotion_on_xp_gain.sql" 2>/dev/null || true
$PSQL -f "$BASE/schemas/gamification_system/triggers/27-trg_update_missions_on_earn_xp.sql" 2>/dev/null || true
# FASE 5: SEEDS CRÍTICOS
echo ""
echo "FASE 5: Seeds..."
$PSQL -f "apps/database/seeds/prod/gamification_system/03-maya_ranks.sql"
$PSQL -f "apps/database/seeds/prod/gamification_system/10-mission_templates.sql"
$PSQL -f "apps/database/seeds/prod/educational_content/01-modules.sql"
# FASE 6: INICIALIZAR USUARIOS EXISTENTES
echo ""
echo "FASE 6: Inicializando usuarios existentes..."
$PSQL << 'EOF'
-- Crear user_stats para usuarios sin stats
INSERT INTO gamification_system.user_stats (user_id, tenant_id, ml_coins, ml_coins_earned_total)
SELECT p.user_id, p.tenant_id, 100, 100
FROM auth_management.profiles p
WHERE p.role IN ('student', 'admin_teacher', 'super_admin')
AND NOT EXISTS (SELECT 1 FROM gamification_system.user_stats us WHERE us.user_id = p.user_id)
ON CONFLICT (user_id) DO NOTHING;
-- Crear user_ranks para usuarios sin ranks
INSERT INTO gamification_system.user_ranks (user_id, tenant_id, current_rank, is_current)
SELECT p.user_id, p.tenant_id, 'Ajaw'::gamification_system.maya_rank, true
FROM auth_management.profiles p
WHERE p.role IN ('student', 'admin_teacher', 'super_admin')
AND NOT EXISTS (SELECT 1 FROM gamification_system.user_ranks ur WHERE ur.user_id = p.user_id)
ON CONFLICT (user_id) DO NOTHING;
SELECT 'Usuarios inicializados: ' || COUNT(*) FROM gamification_system.user_stats;
EOF
echo ""
echo "=== MIGRACIÓN COMPLETADA ==="
8. CHECKLIST DE VALIDACIÓN
Pre-implementación
Durante implementación
Post-implementación
9. QUERIES DE VERIFICACIÓN POST-IMPLEMENTACIÓN
-- 1. Verificar tablas críticas
SELECT
table_schema,
table_name,
'EXISTE' as estado
FROM information_schema.tables
WHERE (table_schema = 'gamification_system' AND table_name IN ('user_stats', 'user_ranks', 'notifications', 'mission_templates', 'missions', 'maya_ranks'))
OR (table_schema = 'progress_tracking' AND table_name = 'module_progress')
OR (table_schema = 'educational_content' AND table_name = 'modules')
ORDER BY table_schema, table_name;
-- 2. Verificar ENUMs
SELECT
n.nspname as schema,
t.typname as enum_name,
string_agg(e.enumlabel, ', ' ORDER BY e.enumsortorder) as values
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_namespace n ON t.typnamespace = n.oid
WHERE n.nspname IN ('gamification_system', 'progress_tracking', 'educational_content')
GROUP BY n.nspname, t.typname;
-- 3. Verificar trigger de inicialización
SELECT
tgname as trigger_name,
tgenabled as enabled,
CASE tgenabled
WHEN 'O' THEN 'ACTIVO'
WHEN 'D' THEN 'DESHABILITADO'
ELSE 'OTRO'
END as estado
FROM pg_trigger
WHERE tgname = 'trg_initialize_user_stats';
-- 4. Verificar seeds
SELECT 'mission_templates' as tabla, COUNT(*) as registros FROM gamification_system.mission_templates
UNION ALL
SELECT 'maya_ranks', COUNT(*) FROM gamification_system.maya_ranks
UNION ALL
SELECT 'modules', COUNT(*) FROM educational_content.modules;
-- 5. Verificar usuarios inicializados
SELECT
(SELECT COUNT(*) FROM auth_management.profiles WHERE role IN ('student', 'admin_teacher', 'super_admin')) as total_profiles,
(SELECT COUNT(*) FROM gamification_system.user_stats) as con_stats,
(SELECT COUNT(*) FROM gamification_system.user_ranks) as con_ranks;
10. CONCLUSIÓN
El plan de implementación ha sido VALIDADO y CORREGIDO.
Cambios realizados:
- ✅ Corregido orden:
modules ahora va ANTES de module_progress
- ✅ Agregados pasos para ENUMs faltantes
- ✅ Agregados pasos para funciones requeridas
- ✅ Agregados pasos para triggers requeridos
- ✅ Script consolidado actualizado con orden correcto
Siguiente paso: Fase 5 - Ejecución de implementaciones
Documento de Validación - Fase 4 completada