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
227 lines
6.8 KiB
Markdown
227 lines
6.8 KiB
Markdown
# 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
|