# ANÁLISIS: Cambios Manuales vs Scripts BD **Agente:** Orquestador (Tech Lead) **Tipo de tarea:** Corrección | Sincronización Scripts **Prioridad:** P1 **Fecha análisis:** 2026-01-10 **Referencia:** 05-EJECUCION-FIX-STUDENT-PORTAL-2026-01-10.md --- ## 1. CONTEXTO Durante la ejecución del plan FIX-STUDENT-PORTAL-001, se identificaron y aplicaron correcciones manuales a la base de datos que **NO están reflejadas** en los scripts de seed. Esto significa que si alguien ejecuta `drop-and-recreate-database.sh`, encontrará los mismos problemas. ### 1.1 Problema Identificado Después de ejecutar `drop-and-recreate-database.sh`: - `user_stats`: 0 registros (esperado: 48) - `user_ranks`: 0 registros (esperado: 48) ### 1.2 Causa Raíz El seed `05-user_stats.sql` tiene dos problemas: 1. **Tenant ID incorrecto**: Usa `'00000000-0000-0000-0000-000000000001'` pero el tenant correcto es `'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'` 2. **Trigger no ejecuta**: El trigger `initialize_user_stats` (AFTER INSERT en profiles) debería crear automáticamente los registros, pero no está funcionando correctamente durante el proceso de seed. --- ## 2. CAMBIOS MANUALES APLICADOS ### 2.1 Cambio 1: Inicialización de user_stats **Descripción:** Inicializar user_stats para los 48 perfiles existentes **SQL ejecutado manualmente:** ```sql DO $$ DECLARE v_profile RECORD; v_count INTEGER := 0; v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; -- Tenant correcto BEGIN FOR v_profile IN SELECT p.user_id, p.display_name FROM auth_management.profiles p LEFT JOIN gamification_system.user_stats us ON us.user_id = p.user_id WHERE us.user_id IS NULL LOOP INSERT INTO gamification_system.user_stats (user_id, tenant_id, ml_coins, ml_coins_earned_total) VALUES (v_profile.user_id, v_tenant_id, 100, 100) ON CONFLICT (user_id) DO NOTHING; INSERT INTO gamification_system.user_ranks (user_id, tenant_id, current_rank, is_current, achieved_at) VALUES (v_profile.user_id, v_tenant_id, 'Ajaw'::gamification_system.maya_rank, true, NOW()) ON CONFLICT DO NOTHING; INSERT INTO gamification_system.comodines_inventory (user_id) VALUES (v_profile.user_id) ON CONFLICT (user_id) DO NOTHING; v_count := v_count + 1; END LOOP; RAISE NOTICE 'Initialized user_stats for % profiles', v_count; END $$; ``` **Resultado:** 48 registros creados en user_stats, user_ranks y comodines_inventory ### 2.2 Cambio 2: XP variado para demo **Descripción:** Actualizar 10 usuarios aleatorios con XP variado para leaderboard realista **SQL ejecutado manualmente:** ```sql DO $$ DECLARE v_users uuid[]; v_xp_values int[] := ARRAY[5000, 3500, 2800, 2100, 1500, 1200, 950, 750, 500, 300]; v_level_values int[] := ARRAY[5, 4, 3, 3, 2, 2, 1, 1, 1, 1]; i int; BEGIN SELECT ARRAY( SELECT user_id FROM gamification_system.user_stats WHERE user_id NOT IN ( 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'::uuid, 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'::uuid, 'cccccccc-cccc-cccc-cccc-cccccccccccc'::uuid ) ORDER BY random() LIMIT 10 ) INTO v_users; FOR i IN 1..array_length(v_users, 1) LOOP UPDATE gamification_system.user_stats SET total_xp = v_xp_values[i], level = v_level_values[i], exercises_completed = v_xp_values[i] / 50, ml_coins = 100 + (v_xp_values[i] / 10), current_rank = CASE WHEN v_level_values[i] >= 5 THEN 'Ah K''in'::gamification_system.maya_rank WHEN v_level_values[i] >= 3 THEN 'Nacom'::gamification_system.maya_rank ELSE 'Ajaw'::gamification_system.maya_rank END WHERE user_id = v_users[i]; END LOOP; END $$; ``` **Resultado:** 10 usuarios con XP variado, triggers de promoción ejecutados --- ## 3. ARCHIVOS QUE REQUIEREN ACTUALIZACIÓN ### 3.1 Archivo Principal | Archivo | Ubicación | Cambio Requerido | |---------|-----------|------------------| | 05-user_stats.sql | seeds/prod/gamification_system/ | Corregir tenant_id y agregar inicialización robusta | ### 3.2 Archivos Dependientes a Verificar | Archivo | Dependencia | Verificación | |---------|-------------|--------------| | 01-demo-users.sql | Crea usuarios → debe activar trigger | Verificar orden de ejecución | | 02-profiles.sql | Crea perfiles → trigger initialize_user_stats | Verificar que trigger existe | | 06-user_ranks.sql | Depende de user_stats | Puede ser redundante | | create-database.sh | Orden de ejecución de seeds | Verificar orden correcto | ### 3.3 Trigger a Verificar | Trigger | Tabla | Función | Estado | |---------|-------|---------|--------| | trg_initialize_user_stats | auth_management.profiles | gamilit.initialize_user_stats() | Verificar funcionamiento | --- ## 4. ANÁLISIS DE IMPACTO ### 4.1 Objetos Afectados Directamente ``` gamification_system.user_stats (TABLA) ├── Depende de: auth_management.profiles (FK user_id) ├── Depende de: auth_management.tenants (FK tenant_id) ├── Afecta a: Trigger promoción de rangos └── Afecta a: Leaderboard global gamification_system.user_ranks (TABLA) ├── Depende de: auth_management.profiles (FK user_id) ├── Depende de: auth_management.tenants (FK tenant_id) └── Afecta a: Sistema de rangos Maya gamification_system.comodines_inventory (TABLA) ├── Depende de: auth_management.profiles (FK user_id) └── Afecta a: Sistema de comodines ``` ### 4.2 Objetos Afectados Indirectamente ``` Frontend: ├── LeaderboardPage → Consulta user_stats ├── GamificationPage → Consulta achievements + user_stats └── UserProfile → Muestra nivel y XP Backend: ├── LeaderboardService → Query user_stats ├── UserStatsService → CRUD user_stats └── RanksService → Query user_ranks ``` --- ## 5. OPCIONES DE SOLUCIÓN ### Opción A: Corregir Seed user_stats.sql **Descripción:** Modificar el seed para usar el tenant_id correcto y asegurar inicialización **Pros:** - Solución definitiva - Reproducible - Sigue patrón existente **Contras:** - Modifica archivo existente - Requiere verificar que no rompa otros casos ### Opción B: Crear nuevo seed de inicialización **Descripción:** Crear un seed separado que garantice la inicialización **Pros:** - No modifica archivos existentes - Más seguro **Contras:** - Duplicación de lógica - Un archivo más que mantener ### Opción C: Corregir función del trigger **Descripción:** Verificar y corregir la función initialize_user_stats() **Pros:** - Solución en el origen - Automático para nuevos usuarios **Contras:** - Más complejo - Puede afectar producción --- ## 6. RECOMENDACIÓN **Opción seleccionada: A (Corregir Seed)** Razones: 1. El seed ya existe y es el lugar correcto para esta lógica 2. Solo requiere corregir el tenant_id 3. Debe incluir fallback para usuarios sin user_stats --- ## 7. PRÓXIMO PASO Proceder a **FASE 2: Análisis detallado** para: 1. Revisar contenido actual del seed 05-user_stats.sql 2. Identificar el tenant_id correcto 3. Verificar el trigger initialize_user_stats 4. Crear plan de modificación --- **Analizado por:** Orquestador (Tech Lead) **Fecha:** 2026-01-10 **Estado:** FASE 1 COMPLETADA