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
229 lines
7.3 KiB
Markdown
229 lines
7.3 KiB
Markdown
# EJECUCIÓN: Actualización Scripts BD - FIX-USER-STATS-TENANT
|
|
|
|
**Agente:** Orquestador (Tech Lead)
|
|
**Fecha ejecución:** 2026-01-10
|
|
**Versión Plan:** Refinado (10-REFINAMIENTO-PLAN-SCRIPTS-BD-2026-01-10.md)
|
|
**Referencia:** 08-PLAN-ACTUALIZACION-SCRIPTS-BD-2026-01-10.md
|
|
|
|
---
|
|
|
|
## 1. RESUMEN EJECUTIVO
|
|
|
|
### 1.1 Objetivo
|
|
Actualizar el script `05-user_stats.sql` para corregir el tenant_id incorrecto y garantizar que todos los perfiles tengan registros de gamificación después de ejecutar `drop-and-recreate-database.sh`.
|
|
|
|
### 1.2 Resultado Final
|
|
**✅ EJECUCIÓN EXITOSA**
|
|
|
|
| Criterio | Esperado | Actual | Estado |
|
|
|----------|----------|--------|--------|
|
|
| user_stats para todos los perfiles | 48 | 48 | ✅ OK |
|
|
| user_ranks para todos los perfiles | 48 | 48 | ✅ OK |
|
|
| comodines_inventory | 48 | 48 | ✅ OK |
|
|
| Tenant_id correcto | GAMILIT Platform | GAMILIT Platform | ✅ OK |
|
|
| Sin errores FK violation | 0 | 0 | ✅ OK |
|
|
|
|
---
|
|
|
|
## 2. CAMBIOS APLICADOS
|
|
|
|
### 2.1 Archivo Modificado
|
|
|
|
**Archivo:** `/home/isem/workspace-v1/projects/gamilit/apps/database/seeds/prod/gamification_system/05-user_stats.sql`
|
|
|
|
**Versión anterior:** 2.0
|
|
**Versión nueva:** 2.1
|
|
|
|
### 2.2 Cambios Específicos
|
|
|
|
#### Cambio 1: Versión en encabezado (Líneas 2 y 9)
|
|
```diff
|
|
- -- Seed: gamification_system.user_stats (PROD) - v2.0
|
|
+ -- Seed: gamification_system.user_stats (PROD) - v2.1
|
|
|
|
- -- Version: 2.0 (Refactored - Trigger-based creation)
|
|
+ -- Version: 2.1 (Fixed tenant_id + Fallback initialization - 2026-01-10)
|
|
```
|
|
|
|
#### Cambio 2: Corrección tenant_id (Línea 48)
|
|
```diff
|
|
DO $$
|
|
DECLARE
|
|
- v_tenant_id uuid := '00000000-0000-0000-0000-000000000001';
|
|
+ v_tenant_id uuid := 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'; -- GAMILIT Platform (tenant principal)
|
|
BEGIN
|
|
```
|
|
|
|
#### Cambio 3: Bloque de inicialización global (Líneas 92-134, nueva sección)
|
|
```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 $$;
|
|
```
|
|
|
|
---
|
|
|
|
## 3. VALIDACIÓN
|
|
|
|
### 3.1 Ejecución drop-and-recreate-database.sh
|
|
|
|
```bash
|
|
./drop-and-recreate-database.sh "postgresql://gamilit_user:***@localhost:5432/gamilit_platform"
|
|
```
|
|
|
|
**Resultado:**
|
|
- Exit code: 0
|
|
- Schemas creados: 16
|
|
- Tablas creadas: 142
|
|
- ENUMs creados: 39
|
|
- Funciones creadas: 227
|
|
- Triggers creados: 103
|
|
- Seeds ejecutados: Todos sin errores
|
|
|
|
### 3.2 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,
|
|
(SELECT COUNT(*) FROM gamification_system.comodines_inventory) as comodines_count,
|
|
CASE
|
|
WHEN (SELECT COUNT(*) FROM auth_management.profiles) =
|
|
(SELECT COUNT(*) FROM gamification_system.user_stats)
|
|
THEN 'OK'
|
|
ELSE 'ERROR: Discrepancia'
|
|
END as status;
|
|
```
|
|
|
|
**Resultado:**
|
|
| profiles_count | user_stats_count | user_ranks_count | comodines_count | status |
|
|
|----------------|------------------|------------------|-----------------|--------|
|
|
| 48 | 48 | 48 | 48 | OK |
|
|
|
|
### 3.3 Verificación de Tenant ID
|
|
|
|
```sql
|
|
SELECT
|
|
us.tenant_id,
|
|
t.name as tenant_name,
|
|
COUNT(*) as count
|
|
FROM gamification_system.user_stats us
|
|
JOIN auth_management.tenants t ON t.id = us.tenant_id
|
|
GROUP BY us.tenant_id, t.name;
|
|
```
|
|
|
|
**Resultado:**
|
|
| tenant_id | tenant_name | count |
|
|
|-----------|-------------|-------|
|
|
| a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 | GAMILIT Platform | 48 |
|
|
|
|
✅ **Todos los registros usan el tenant_id correcto**
|
|
|
|
### 3.4 Verificación user_ranks
|
|
|
|
```sql
|
|
SELECT
|
|
ur.tenant_id,
|
|
t.name as tenant_name,
|
|
COUNT(*) as count
|
|
FROM gamification_system.user_ranks ur
|
|
JOIN auth_management.tenants t ON t.id = ur.tenant_id
|
|
GROUP BY ur.tenant_id, t.name;
|
|
```
|
|
|
|
**Resultado:**
|
|
| tenant_id | tenant_name | count |
|
|
|-----------|-------------|-------|
|
|
| a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 | GAMILIT Platform | 48 |
|
|
|
|
✅ **Todos los registros usan el tenant_id correcto**
|
|
|
|
---
|
|
|
|
## 4. ARCHIVOS NO MODIFICADOS (CONFIRMADO)
|
|
|
|
| Archivo | Razón de no modificación |
|
|
|---------|--------------------------|
|
|
| `02-classrooms.sql` | UUID `00000000-...` es para classroom ID, no tenant_id |
|
|
| `04-moderation_rules.sql` | UUID es para user_id de usuario sistema |
|
|
| `01-tenants.sql` | Ya documenta el tenant removido (no requiere cambios) |
|
|
| `04-user_roles.sql` | Baja prioridad, usuarios demo no existen |
|
|
|
|
---
|
|
|
|
## 5. RESUMEN DE DOCUMENTOS
|
|
|
|
| Documento | Descripción | Estado |
|
|
|-----------|-------------|--------|
|
|
| 07-ANALISIS-CAMBIOS-SCRIPTS-BD | Análisis inicial del problema | ✅ Completado |
|
|
| 08-PLAN-ACTUALIZACION-SCRIPTS-BD | Plan de actualización | ✅ Completado |
|
|
| 09-VALIDACION-PLAN-SCRIPTS-BD | Validación del plan | ✅ Completado |
|
|
| 10-REFINAMIENTO-PLAN-SCRIPTS-BD | Refinamiento con búsqueda exhaustiva | ✅ Completado |
|
|
| 11-EJECUCION-ACTUALIZACION-SCRIPTS-BD | Este documento | ✅ Completado |
|
|
|
|
---
|
|
|
|
## 6. CONCLUSIÓN
|
|
|
|
### 6.1 Problema Resuelto
|
|
El seed `05-user_stats.sql` ahora:
|
|
1. ✅ Usa el tenant_id correcto (`a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11`)
|
|
2. ✅ Incluye fallback para inicializar TODOS los perfiles
|
|
3. ✅ Genera registros consistentes en user_stats, user_ranks y comodines_inventory
|
|
|
|
### 6.2 Reproducibilidad Garantizada
|
|
Ejecutar `drop-and-recreate-database.sh` ahora produce una base de datos con:
|
|
- 48 perfiles con registros de gamificación
|
|
- Todos usando el tenant correcto
|
|
- Sin errores FK violation
|
|
|
|
### 6.3 Nota sobre XP Inicial
|
|
Los usuarios inician con valores base (XP=0, level=1, ml_coins=100) como está diseñado. El XP variado para demos puede agregarse manualmente o a través de un seed separado si se requiere.
|
|
|
|
---
|
|
|
|
**Ejecutado por:** Orquestador (Tech Lead)
|
|
**Fecha:** 2026-01-10
|
|
**Estado:** ✅ COMPLETADO
|