# REFINAMIENTO: Plan de Actualización Scripts BD **Fecha:** 2026-01-10 **Documentos de referencia:** - 08-PLAN-ACTUALIZACION-SCRIPTS-BD-2026-01-10.md - 09-VALIDACION-PLAN-SCRIPTS-BD-2026-01-10.md --- ## 1. HALLAZGOS DEL ANÁLISIS EXTENDIDO ### 1.1 Archivos con UUID `00000000-0000-0000-0000-000000000001` Se realizó búsqueda exhaustiva en todos los seeds: | Archivo | Líneas | Uso del UUID | Problema? | |---------|--------|--------------|-----------| | `05-user_stats.sql` | 48 | `v_tenant_id` | **SÍ - CRÍTICO** | | `04-user_roles.sql` | 37,66,94,122,153 | `tenant_id` | **SÍ - Potencial** | | `02-classrooms.sql` | 105 | `classroom ID` | NO (es ID de entidad) | | `04-moderation_rules.sql` | 12,33,etc | `user_id` (system user) | NO (es ID de usuario) | | `01-tenants.sql` | 17,98 | Comentario/histórico | NO (ya documentado) | | `CREAR-USUARIOS-TESTING.sql` | múltiples | `tenant_id` | **SÍ - Testing** | | `02-test-users.sql` | 108,188 | `tenant_id` | NO (_deprecated) | ### 1.2 Análisis de Contexto #### `02-classrooms.sql` - NO REQUIERE CAMBIOS ```sql -- Línea 105: UUID usado como ID del classroom (NO tenant_id) '00000000-0000-0000-0000-000000000001'::uuid, -- UUID predecible para default -- Línea 107: tenant_id se obtiene dinámicamente (CORRECTO) v_tenant_id, -- Variable obtenida de lookup ``` El tenant_id se obtiene correctamente mediante lookup dinámico: ```sql -- Líneas 37-45 SELECT id INTO v_tenant_id FROM auth_management.tenants WHERE name = 'GAMILIT Platform' LIMIT 1; ``` #### `04-moderation_rules.sql` - NO REQUIERE CAMBIOS ```sql -- Línea 12: UUID usado como user_id para usuario sistema '00000000-0000-0000-0000-000000000001', -- ID de usuario (system@gamilit.com) ``` Este es un user_id para un usuario sistema, no un tenant_id. #### `04-user_roles.sql` - REQUIERE REVISIÓN POSTERIOR Este archivo usa el UUID como tenant_id pero para usuarios demo que pueden no existir en la configuración actual (estudiante1@demo.glit.edu.mx, etc.). **Decisión:** Verificar después de la corrección principal si estos usuarios existen. Si no existen, los INSERTs fallarán silenciosamente por el subselect vacío. --- ## 2. CAMBIOS CONFIRMADOS ### 2.1 Archivo Principal: `05-user_stats.sql` **Ubicación:** `/home/isem/workspace-v1/projects/gamilit/apps/database/seeds/prod/gamification_system/05-user_stats.sql` #### 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 bloque que inicializa user_stats para TODOS los perfiles sin 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'; -- GAMILIT Platform 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 versión en encabezado (Líneas 2 y 9) **Antes:** ```sql -- Seed: gamification_system.user_stats (PROD) - v2.0 ... -- Version: 2.0 (Refactored - Trigger-based creation) ``` **Después:** ```sql -- Seed: gamification_system.user_stats (PROD) - v2.1 ... -- Version: 2.1 (Fixed tenant_id + Fallback initialization - 2026-01-10) ``` --- ## 3. ARCHIVOS SIN CAMBIOS (CONFIRMADO) | Archivo | Razón | |---------|-------| | `02-classrooms.sql` | UUID es para classroom ID, no tenant_id | | `04-moderation_rules.sql` | UUID es para user_id (system user) | | `01-tenants.sql` | Ya documenta el tenant removido | | `02-test-users.sql` | En carpeta _deprecated | --- ## 4. ARCHIVOS PENDIENTES DE REVISIÓN | Archivo | Prioridad | Acción | |---------|-----------|--------| | `04-user_roles.sql` | BAJA | Verificar si usuarios demo existen | | `CREAR-USUARIOS-TESTING.sql` | BAJA | En carpeta _testing, verificar uso | --- ## 5. PLAN DE EJECUCIÓN REFINADO ### Fase 6.1: Backup ```bash cp 05-user_stats.sql 05-user_stats.sql.backup.2026-01-10 ``` ### Fase 6.2: Aplicar Cambios 1. Cambio 1: Corregir línea 48 (tenant_id) 2. Cambio 2: Agregar bloque de inicialización global 3. Cambio 3: Actualizar versión en encabezado ### Fase 6.3: Verificación de Sintaxis ```bash # Revisar que el archivo SQL es válido psql -d gamilit_platform -f 05-user_stats.sql --echo-errors ``` ### Fase 7: Validación Completa ```bash ./drop-and-recreate-database.sh ``` ### Fase 7.1: Verificación de Datos ```sql SELECT (SELECT COUNT(*) FROM auth_management.profiles) 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) = (SELECT COUNT(*) FROM gamification_system.user_stats) THEN 'OK' ELSE 'ERROR: Discrepancia' END as status; ``` --- ## 6. CRITERIOS DE ÉXITO - [ ] `05-user_stats.sql` modificado con tenant_id correcto - [ ] Bloque de inicialización global agregado - [ ] Versión actualizada a 2.1 - [ ] `drop-and-recreate-database.sh` ejecuta sin errores - [ ] COUNT(user_stats) = COUNT(profiles) - [ ] COUNT(user_ranks) = COUNT(user_stats) - [ ] Sin errores FK violation --- **Refinado por:** Orquestador (Tech Lead) **Fecha:** 2026-01-10 **Estado:** APROBADO PARA EJECUCIÓN