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
213 lines
5.9 KiB
Markdown
213 lines
5.9 KiB
Markdown
# 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:**
|
|
```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 un bloque que inicialice user_stats para TODOS los perfiles que no tengan 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';
|
|
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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```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:
|
|
|
|
```bash
|
|
cp 05-user_stats.sql.backup 05-user_stats.sql
|
|
```
|
|
|
|
---
|
|
|
|
**Plan creado por:** Orquestador (Tech Lead)
|
|
**Fecha:** 2026-01-10
|
|
**Estado:** PENDIENTE VALIDACIÓN
|
|
|