# PLAN: Actualización Scripts BD - FIX-USER-STATS-TENANT **Agente:** Orquestador (Tech Lead) **Tipo de tarea:** Corrección | Scripts BD **Prioridad:** P1 **Fecha:** 2026-01-10 **Referencia:** 07-ANALISIS-CAMBIOS-SCRIPTS-BD-2026-01-10.md --- ## 1. OBJETIVO Corregir el seed `05-user_stats.sql` para que use el tenant_id correcto y garantizar que todos los perfiles tengan registros de gamificación después de ejecutar `drop-and-recreate-database.sh`. --- ## 2. PROBLEMA IDENTIFICADO ### 2.1 Causa Raíz El seed `05-user_stats.sql` usa un tenant_id que ya no existe: | Archivo | Línea | Valor Actual | Valor Correcto | |---------|-------|--------------|----------------| | 05-user_stats.sql | 48 | `'00000000-0000-0000-0000-000000000001'` | `'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'` | ### 2.2 Historial - **v2.0 del tenant seed** (2026-01-08): Eliminó el tenant `00000000-...` - **05-user_stats.sql** nunca fue actualizado para reflejar este cambio --- ## 3. CAMBIOS REQUERIDOS ### 3.1 Archivo a Modificar **Archivo:** `/home/isem/workspace-v1/projects/gamilit/apps/database/seeds/prod/gamification_system/05-user_stats.sql` ### 3.2 Cambios Específicos #### Cambio 1: Corregir tenant_id (Línea 48) **Antes:** ```sql DO $$ DECLARE v_tenant_id uuid := '00000000-0000-0000-0000-000000000001'; ``` **Después:** ```sql DO $$ DECLARE v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; -- GAMILIT Platform (tenant principal) ``` #### Cambio 2: Agregar inicialización global (después de línea 90) Agregar un bloque que inicialice user_stats para TODOS los perfiles que no tengan registro: ```sql -- ===================================================== -- FASE 0.1: Inicializar user_stats para TODOS los perfiles -- ===================================================== -- CORRECCION 2026-01-10: El trigger initialize_user_stats no siempre ejecuta -- durante el seed. Esta seccion garantiza que todos los perfiles tengan -- registros de gamificacion. DO $$ DECLARE v_profile RECORD; v_count INTEGER := 0; v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; BEGIN FOR v_profile IN SELECT p.id as profile_id, p.user_id, p.display_name FROM auth_management.profiles p LEFT JOIN gamification_system.user_stats us ON us.user_id = p.id WHERE us.user_id IS NULL LOOP -- Insert user_stats INSERT INTO gamification_system.user_stats (user_id, tenant_id, ml_coins, ml_coins_earned_total) VALUES (v_profile.profile_id, v_tenant_id, 100, 100) ON CONFLICT (user_id) DO NOTHING; -- Insert user_ranks INSERT INTO gamification_system.user_ranks (user_id, tenant_id, current_rank, is_current, achieved_at) VALUES (v_profile.profile_id, v_tenant_id, 'Ajaw'::gamification_system.maya_rank, true, NOW()) ON CONFLICT DO NOTHING; -- Insert comodines_inventory INSERT INTO gamification_system.comodines_inventory (user_id) VALUES (v_profile.profile_id) ON CONFLICT (user_id) DO NOTHING; v_count := v_count + 1; END LOOP; IF v_count > 0 THEN RAISE NOTICE '✓ Inicializados % perfiles sin user_stats (fallback)', v_count; ELSE RAISE NOTICE '✓ Todos los perfiles ya tienen user_stats (trigger funcionó correctamente)'; END IF; END $$; ``` #### Cambio 3: Actualizar encabezado del archivo ```sql -- Version: 2.1 (Fixed tenant_id - 2026-01-10) ``` --- ## 4. ARCHIVOS DEPENDIENTES ### 4.1 No Requieren Cambios | Archivo | Razón | |---------|-------| | create-database.sh | Orden de ejecución correcto | | 01-tenants.sql | Ya usa tenant correcto | | 03-profiles.sql | Ya usa tenant correcto | ### 4.2 Verificación Post-Cambio | Archivo | Verificación | |---------|--------------| | 06-user_ranks.sql | Verificar que no cause conflictos | | 07-comodines_inventory.sql | Verificar que no cause conflictos | --- ## 5. CRITERIOS DE ACEPTACIÓN ### 5.1 Después de Ejecutar drop-and-recreate-database.sh - [ ] user_stats tiene registros para TODOS los perfiles - [ ] user_ranks tiene registros para TODOS los perfiles - [ ] comodines_inventory tiene registros para usuarios con rol gamificado - [ ] COUNT(user_stats) = COUNT(profiles con rol gamificado) - [ ] Sin errores FK violation ### 5.2 Verificación SQL ```sql -- Verificar que todos los perfiles tienen user_stats SELECT (SELECT COUNT(*) FROM auth_management.profiles WHERE role IN ('student', 'admin_teacher', 'super_admin')) as profiles_count, (SELECT COUNT(*) FROM gamification_system.user_stats) as user_stats_count, (SELECT COUNT(*) FROM gamification_system.user_ranks) as user_ranks_count, CASE WHEN (SELECT COUNT(*) FROM auth_management.profiles WHERE role IN ('student', 'admin_teacher', 'super_admin')) = (SELECT COUNT(*) FROM gamification_system.user_stats) THEN 'OK' ELSE 'ERROR: Discrepancia' END as status; ``` --- ## 6. PLAN DE EJECUCIÓN ### Ciclo 1: Backup y Preparación 1. Crear backup del archivo original 2. Verificar sintaxis SQL ### Ciclo 2: Aplicar Cambios 1. Modificar tenant_id en línea 48 2. Agregar bloque de inicialización global 3. Actualizar versión en encabezado ### Ciclo 3: Validación 1. Ejecutar `drop-and-recreate-database.sh` 2. Verificar conteos de tablas 3. Verificar integridad de datos ### Ciclo 4: Documentación 1. Actualizar documento de ejecución 2. Crear reporte de validación --- ## 7. RIESGOS | Riesgo | Probabilidad | Impacto | Mitigación | |--------|-------------|---------|------------| | Error de sintaxis SQL | Baja | Alto | Revisar antes de ejecutar | | Conflicto con otros seeds | Baja | Medio | ON CONFLICT DO NOTHING | | Datos duplicados | Baja | Bajo | ON CONFLICT DO NOTHING | --- ## 8. ROLLBACK Si hay problemas, restaurar el archivo original desde backup: ```bash cp 05-user_stats.sql.backup 05-user_stats.sql ``` --- **Plan creado por:** Orquestador (Tech Lead) **Fecha:** 2026-01-10 **Estado:** PENDIENTE VALIDACIÓN