workspace-v1/orchestration/analisis/08-PLAN-ACTUALIZACION-SCRIPTS-BD-2026-01-10.md
rckrdmrd e56e927a4d [MAINT-001] docs(orchestration): Actualizacion directivas SIMCO, perfiles y documentacion
Cambios incluidos:
- INDICE-DIRECTIVAS-WORKSPACE.yml actualizado
- Perfiles de agentes: PERFIL-ML.md, PERFIL-SECURITY.md
- Directivas SIMCO actualizadas:
  - SIMCO-ASIGNACION-PERFILES.md
  - SIMCO-CCA-SUBAGENTE.md
  - SIMCO-CONTEXT-ENGINEERING.md
  - SIMCO-CONTEXT-RESOLUTION.md
  - SIMCO-DELEGACION-PARALELA.md
- Inventarios actualizados: DEVENV-MASTER, DEVENV-PORTS
- Documentos de analisis agregados:
  - Analisis y planes de fix student portal
  - Analisis scripts BD
  - Analisis achievements, duplicados, gamification
  - Auditoria documentacion gamilit
  - Backlog discrepancias NEXUS
  - Planes maestros de resolucion
- Reportes de ejecucion agregados
- Knowledge base gamilit README actualizado
- Referencia submodulo gamilit actualizada (commit beb94f7)

Validaciones:
- Plan validado contra directivas SIMCO-GIT
- Dependencias verificadas
- Build gamilit: EXITOSO
2026-01-10 04:51:28 -06:00

5.9 KiB

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:

DO $$
DECLARE
    v_tenant_id uuid := '00000000-0000-0000-0000-000000000001';

Después:

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:

-- =====================================================
-- 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

-- 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

-- 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:

cp 05-user_stats.sql.backup 05-user_stats.sql

Plan creado por: Orquestador (Tech Lead) Fecha: 2026-01-10 Estado: PENDIENTE VALIDACIÓN