workspace-v1/orchestration/analisis/07-ANALISIS-CAMBIOS-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

245 lines
7.3 KiB
Markdown

# 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