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
245 lines
7.3 KiB
Markdown
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
|
|
|