# PLAN DE EJECUCION - CONSOLIDACION GAMILIT ## Base de Datos, Documentacion e Integracion **Fecha:** 2026-01-07 **Version:** 1.0.0 **Estado:** PENDIENTE VALIDACION **Basado en:** ANALISIS-INTEGRAL-GAMILIT-2026-01-07.md --- ## RESUMEN DEL PLAN | Fase | Descripcion | Prioridad | Duracion | Estado | |------|-------------|-----------|----------|--------| | A | Correcciones Criticas | P0 | 1 dia | PENDIENTE | | B | Consolidacion de Duplicados | P1 | 2 semanas | PENDIENTE | | C | Documentacion | P1-P2 | 1 semana | PENDIENTE | | D | Testing y Validacion | P2 | 4-6 semanas | PENDIENTE | --- ## FASE A: CORRECCIONES CRITICAS (P0) **Duracion estimada:** 4.5 horas **Prioridad:** INMEDIATA **Dependencias:** Ninguna ### A1: Seeds Faltantes en create-database.sh **Archivo:** `/home/isem/workspace-v1/projects/gamilit/apps/database/create-database.sh` **Cambios requeridos:** ```bash # Agregar despues de FASE 16.5.1 (Schools default) # FASE 16.5.2: Social Features (escuelas, aulas) - AGREGAR execute_sql "$SEEDS_DIR/social_features/01-schools.sql" execute_sql "$SEEDS_DIR/social_features/02-classrooms.sql" execute_sql "$SEEDS_DIR/social_features/03-classroom-members.sql" # FASE 16.5.3: Progress Tracking initial - AGREGAR execute_sql "$SEEDS_DIR/progress_tracking/01-module_progress.sql" ``` **Validacion:** - [ ] Verificar que archivos seeds existen - [ ] Ejecutar create-database.sh en entorno de test - [ ] Validar que no hay errores de FK **Esfuerzo:** 15 minutos --- ### A2: Corregir NOW() a gamilit.now_mexico() **Archivos afectados (11):** | Archivo | Linea Aproximada | Cambio | |---------|------------------|--------| | `ddl/schemas/auth_management/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/educational_content/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/gamification_system/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/progress_tracking/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/social_features/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/content_management/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/audit_logging/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/notifications/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/communication/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/system_configuration/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | | `ddl/schemas/admin_dashboard/triggers/01-update-timestamps.sql` | 5 | NOW() -> gamilit.now_mexico() | **Comando de busqueda:** ```bash grep -rn "NOW()" projects/gamilit/apps/database/ddl/schemas/*/triggers/ ``` **Validacion:** - [ ] Verificar que gamilit.now_mexico() existe - [ ] Ejecutar DDL y verificar sin errores **Esfuerzo:** 20 minutos --- ### A3: Documentar Auth en API-SOCIAL-MODULE.md **Archivo:** `/home/isem/workspace-v1/projects/gamilit/docs/90-transversal/api/API-SOCIAL-MODULE.md` **Secciones a agregar:** ```markdown ## Autenticacion y Autorizacion ### Headers Requeridos | Header | Valor | Descripcion | |--------|-------|-------------| | Authorization | Bearer {token} | JWT token de sesion | | X-Tenant-ID | {tenant_uuid} | Identificador del tenant (multi-tenant) | | Content-Type | application/json | Tipo de contenido | ### Roles y Permisos | Endpoint | Roles Permitidos | |----------|------------------| | GET /social/schools | admin, teacher | | POST /social/schools | admin | | GET /social/classrooms | admin, teacher, student | | POST /social/classrooms | admin, teacher | | PUT /social/classrooms/:id | admin, teacher (owner) | | DELETE /social/classrooms/:id | admin | ### Ejemplos de Request/Response #### GET /social/schools **Request:** ```json { "headers": { "Authorization": "Bearer eyJhbGciOiJIUzI1NiIs...", "X-Tenant-ID": "550e8400-e29b-41d4-a716-446655440000" } } ``` **Response (200 OK):** ```json { "data": [ { "id": "school-uuid", "name": "Escuela Primaria Benito Juarez", "code": "EPBJ001", "tenantId": "tenant-uuid", "address": "Calle Principal 123", "createdAt": "2026-01-07T10:00:00Z" } ], "meta": { "total": 1, "page": 1, "limit": 20 } } ``` ``` **Esfuerzo:** 2 horas --- ### A4: Remover Funciones Fantasma de SCHEMA-COMMUNICATION.md **Archivo:** `/home/isem/workspace-v1/projects/gamilit/docs/90-transversal/inventarios-database/SCHEMA-COMMUNICATION.md` **Funciones a remover:** - `get_unread_count()` - NO implementada en BD - `mark_conversation_read()` - NO implementada en BD **Accion:** Eliminar secciones que documenten estas funciones o marcarlas como "PENDIENTE IMPLEMENTACION" **Esfuerzo:** 30 minutos --- ### A5: Corregir Permisos de Archivos **Archivos afectados:** ```bash chmod 644 projects/gamilit/docs/90-transversal/inventarios-database/SCHEMA-COMMUNICATION.md chmod 644 projects/gamilit/docs/90-transversal/inventarios-database/TABLAS-NUEVAS-2025-12.md chmod 644 projects/gamilit/docs/90-transversal/inventarios-database/TRIGGERS-INVENTORY.md chmod 644 projects/gamilit/docs/90-transversal/inventarios-database/VIEWS-INVENTARIO.md ``` **Esfuerzo:** 5 minutos --- ### A6: Corregir BACKEND_INVENTORY.yml **Archivo:** `/home/isem/workspace-v1/projects/gamilit/orchestration/inventarios/BACKEND_INVENTORY.yml` **Inconsistencias a corregir:** | Campo | Valor Metadata | Valor Real | Correccion | |-------|---------------|------------|------------| | dtos | 327 | 274 | Actualizar a valor real o reconciliar | | services | 103 | 55 | Actualizar a valor real o reconciliar | | controllers | 76 | 41 | Actualizar a valor real o reconciliar | | entities | 93 | 69 | Actualizar a valor real o reconciliar | **Accion:** Ejecutar conteo real y actualizar metadata **Esfuerzo:** 1 hora --- ## FASE B: CONSOLIDACION DE DUPLICADOS (P1) **Duracion estimada:** 2 semanas **Prioridad:** ALTA **Dependencias:** Fase A completada ### B1: Consolidar Tablas de Auditoria (Base de Datos) **Duracion:** 2 dias #### B1.1: Crear tabla unificada **Nuevo archivo:** `ddl/schemas/audit_logging/tables/00-unified_audit_log.sql` ```sql -- ============================================ -- TABLA: unified_audit_log -- Descripcion: Tabla unificada de auditoria -- Creado: 2026-01-07 -- ============================================ CREATE TABLE IF NOT EXISTS audit_logging.unified_audit_log ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), tenant_id UUID REFERENCES auth_management.tenants(id), -- Tipo de log log_type VARCHAR(20) NOT NULL CHECK (log_type IN ('action', 'system', 'activity', 'admin')), log_level VARCHAR(20) DEFAULT 'INFO' CHECK (log_level IN ('TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL')), -- Actor actor_id UUID REFERENCES auth_management.profiles(id), actor_ip INET, user_agent TEXT, -- Evento event_type TEXT NOT NULL, action VARCHAR(100), resource_type VARCHAR(100), resource_id UUID, -- Datos description TEXT, old_values JSONB, new_values JSONB, metadata JSONB, -- Contexto (para system_logs) logger_name VARCHAR(255), exception_type VARCHAR(255), stack_trace TEXT, -- Contexto (para user_activity_logs) page_url TEXT, session_id UUID, device_type VARCHAR(50), load_time_ms INTEGER, -- Timestamps created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(), -- Indices CONSTRAINT valid_log_type CHECK (log_type IS NOT NULL) ); -- Indices CREATE INDEX idx_unified_audit_tenant ON audit_logging.unified_audit_log(tenant_id); CREATE INDEX idx_unified_audit_actor ON audit_logging.unified_audit_log(actor_id); CREATE INDEX idx_unified_audit_type ON audit_logging.unified_audit_log(log_type); CREATE INDEX idx_unified_audit_created ON audit_logging.unified_audit_log(created_at); CREATE INDEX idx_unified_audit_resource ON audit_logging.unified_audit_log(resource_type, resource_id); -- RLS ALTER TABLE audit_logging.unified_audit_log ENABLE ROW LEVEL SECURITY; CREATE POLICY unified_audit_tenant_isolation ON audit_logging.unified_audit_log FOR ALL USING (tenant_id = current_setting('app.tenant_id')::UUID); ``` #### B1.2: Crear vistas de compatibilidad **Nuevo archivo:** `ddl/schemas/audit_logging/views/compatibility-views.sql` ```sql -- Vista: audit_logs (compatibilidad) CREATE OR REPLACE VIEW audit_logging.audit_logs AS SELECT id, tenant_id, actor_id, event_type, action, resource_type, resource_id, old_values, new_values, description, actor_ip, user_agent, created_at FROM audit_logging.unified_audit_log WHERE log_type = 'action'; -- Vista: system_logs (compatibilidad) CREATE OR REPLACE VIEW audit_logging.system_logs AS SELECT id, tenant_id, log_level, logger_name, description AS message, exception_type, stack_trace, metadata AS context, created_at FROM audit_logging.unified_audit_log WHERE log_type = 'system'; -- Vista: user_activity_logs (compatibilidad) CREATE OR REPLACE VIEW audit_logging.user_activity_logs AS SELECT id, tenant_id, actor_id AS user_id, event_type AS activity_type, page_url, session_id, device_type, load_time_ms, metadata AS properties, created_at FROM audit_logging.unified_audit_log WHERE log_type = 'activity'; -- Vista: activity_log (compatibilidad admin) CREATE OR REPLACE VIEW audit_logging.activity_log AS SELECT id, tenant_id, actor_id, action AS action_type, resource_type AS entity_type, resource_id AS entity_id, description, created_at FROM audit_logging.unified_audit_log WHERE log_type = 'admin'; ``` #### B1.3: Actualizar create-database.sh Agregar nuevo archivo ANTES de los archivos antiguos (que seran marcados como deprecados) #### B1.4: Migrar datos existentes (si hay) Script de migracion one-time --- ### B2: Consolidar Tablas de Progreso (Base de Datos) **Duracion:** 3 dias #### B2.1: Crear tabla user_progression **Nuevo archivo:** `ddl/schemas/progress_tracking/tables/20-user_progression.sql` ```sql -- ============================================ -- TABLA: user_progression -- Descripcion: Consolidacion de user_difficulty_progress y user_current_level -- ============================================ CREATE TABLE IF NOT EXISTS progress_tracking.user_progression ( user_id UUID PRIMARY KEY REFERENCES auth_management.profiles(id) ON DELETE CASCADE, -- Nivel actual current_level educational_content.difficulty_level NOT NULL DEFAULT 'A1', previous_level educational_content.difficulty_level, max_allowed_level educational_content.difficulty_level NOT NULL DEFAULT 'A1', current_level_changed_at TIMESTAMPTZ, -- Test de ubicacion placement_test_completed BOOLEAN DEFAULT false, placement_test_score NUMERIC(5,2), placement_test_date TIMESTAMPTZ, -- Metricas por nivel (JSONB para flexibilidad) level_metrics JSONB DEFAULT '{}'::JSONB, -- Formato: {"A1": {"exercises_attempted": 10, "exercises_completed": 8, "success_rate": 80.0, "time_spent_seconds": 3600}, ...} -- Flags de promocion is_eligible_for_promotion BOOLEAN DEFAULT false, promotion_criteria_met_at TIMESTAMPTZ, -- Timestamps created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico(), updated_at TIMESTAMPTZ DEFAULT gamilit.now_mexico() ); -- Trigger para actualizar updated_at CREATE TRIGGER update_user_progression_timestamp BEFORE UPDATE ON progress_tracking.user_progression FOR EACH ROW EXECUTE FUNCTION gamilit.update_timestamp(); -- Indices CREATE INDEX idx_user_progression_level ON progress_tracking.user_progression(current_level); CREATE INDEX idx_user_progression_eligible ON progress_tracking.user_progression(is_eligible_for_promotion) WHERE is_eligible_for_promotion = true; -- RLS ALTER TABLE progress_tracking.user_progression ENABLE ROW LEVEL SECURITY; CREATE POLICY user_progression_own_data ON progress_tracking.user_progression FOR ALL USING (user_id = auth.uid()); CREATE POLICY user_progression_teacher_view ON progress_tracking.user_progression FOR SELECT USING ( EXISTS ( SELECT 1 FROM social_features.classroom_members cm JOIN social_features.classrooms c ON cm.classroom_id = c.id WHERE cm.user_id = progress_tracking.user_progression.user_id AND c.teacher_id = auth.uid() ) ); ``` #### B2.2: Crear tabla user_level_history **Nuevo archivo:** `ddl/schemas/progress_tracking/tables/21-user_level_history.sql` ```sql CREATE TABLE IF NOT EXISTS progress_tracking.user_level_history ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES auth_management.profiles(id) ON DELETE CASCADE, from_level educational_content.difficulty_level, to_level educational_content.difficulty_level NOT NULL, reason VARCHAR(50) NOT NULL CHECK (reason IN ('promotion', 'demotion', 'placement_test', 'manual_override')), -- Criterios que se cumplieron criteria_met JSONB, -- Formato: {"exercises_completed": 10, "success_rate": 85, "time_in_level_days": 30} notes TEXT, changed_by UUID REFERENCES auth_management.profiles(id), -- NULL si automatico created_at TIMESTAMPTZ DEFAULT gamilit.now_mexico() ); CREATE INDEX idx_level_history_user ON progress_tracking.user_level_history(user_id); CREATE INDEX idx_level_history_date ON progress_tracking.user_level_history(created_at); ``` --- ### B3: Consolidar Servicios de Progreso (Backend) **Duracion:** 2 dias #### B3.1: Crear ProgressService compartido **Nuevo archivo:** `apps/backend/src/modules/shared/services/progress.service.ts` ```typescript import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { UserProgression } from '../entities/user-progression.entity'; import { ModuleProgress } from '../../progress/entities/module-progress.entity'; @Injectable() export class ProgressService { constructor( @InjectRepository(UserProgression, 'progress') private readonly progressionRepo: Repository, @InjectRepository(ModuleProgress, 'progress') private readonly moduleProgressRepo: Repository, ) {} // Metodo base para obtener progreso de usuario async getUserProgress(userId: string): Promise { const [progression, moduleProgress] = await Promise.all([ this.progressionRepo.findOne({ where: { userId } }), this.moduleProgressRepo.find({ where: { userId } }), ]); return { userId, currentLevel: progression?.currentLevel || 'A1', previousLevel: progression?.previousLevel, levelMetrics: progression?.levelMetrics || {}, moduleProgress: moduleProgress.map(mp => ({ moduleId: mp.moduleId, completionPercentage: mp.completionPercentage, exercisesCompleted: mp.exercisesCompleted, lastActivityAt: mp.lastActivityAt, })), isEligibleForPromotion: progression?.isEligibleForPromotion || false, }; } // Metodo para obtener progreso de multiples usuarios (admin/teacher) async getBulkProgress(userIds: string[]): Promise> { // Implementacion optimizada con batch queries } // Metodo para actualizar metricas de nivel async updateLevelMetrics(userId: string, level: string, metrics: LevelMetrics): Promise { // Implementacion } // Metodo para promover usuario async promoteUser(userId: string, newLevel: string, reason: string): Promise { // Implementacion con registro en history } } ``` #### B3.2: Refactorizar AdminProgressService **Archivo:** `apps/backend/src/modules/admin/services/admin-progress.service.ts` **Cambio:** Inyectar y usar ProgressService compartido ```typescript @Injectable() export class AdminProgressService { constructor( private readonly progressService: ProgressService, // Nuevo ) {} async getStudentProgress(studentId: string): Promise { const baseProgress = await this.progressService.getUserProgress(studentId); // Agregar datos admin-specific return { ...baseProgress, // Campos adicionales de admin }; } } ``` #### B3.3: Refactorizar StudentProgressService (Teacher) Similar a B3.2 --- ### B4: Consolidar Componentes Frontend **Duracion:** 2 dias #### B4.1: Unificar StatsGrid **Archivo a modificar:** `apps/frontend/src/apps/student/components/dashboard/StatsGrid.tsx` **Archivo a eliminar:** `apps/frontend/src/apps/student/components/dashboard/EnhancedStatsGrid.tsx` **Nuevo componente unificado:** ```typescript interface StatsGridProps { stats: { // Campos comunes totalTime: number; currentStreak: number; // Campos opcionales completedModules?: number; totalModules?: number; averageScore?: number; casesResolved?: number; totalXP?: number; rankPosition?: number; }; variant?: 'basic' | 'enhanced'; // Para mantener compatibilidad visual } export const StatsGrid: React.FC = ({ stats, variant = 'basic' }) => { // Implementacion unificada }; ``` #### B4.2: Crear useProgressData base **Nuevo archivo:** `apps/frontend/src/shared/hooks/useProgressData.ts` ```typescript import { useQuery } from '@tanstack/react-query'; import { progressAPI } from '@services/progress'; interface UseProgressDataOptions { userId: string; scope: 'student' | 'teacher' | 'admin'; } export function useProgressData({ userId, scope }: UseProgressDataOptions) { const queryKey = ['progress', userId, scope]; const query = useQuery({ queryKey, queryFn: () => { switch (scope) { case 'admin': return progressAPI.getAdminProgress(userId); case 'teacher': return progressAPI.getTeacherProgress(userId); default: return progressAPI.getStudentProgress(userId); } }, }); return { progress: query.data, isLoading: query.isLoading, error: query.error, refetch: query.refetch, }; } ``` --- ## FASE C: DOCUMENTACION (P1-P2) **Duracion estimada:** 1 semana **Prioridad:** ALTA **Dependencias:** Fase A completada, parcialmente Fase B ### C1: Crear FUNCTIONS-INVENTORY.md **Archivo nuevo:** `docs/90-transversal/inventarios-database/FUNCTIONS-INVENTORY.md` **Contenido:** Documentar las 118 funciones faltantes con: - Nombre - Schema - Parametros - Retorno - Descripcion - Ejemplo de uso **Esfuerzo:** 4 horas --- ### C2: Crear README.md para 14 modulos backend **Archivos nuevos:** - `apps/backend/src/modules/admin/README.md` - `apps/backend/src/modules/assignments/README.md` - `apps/backend/src/modules/audit/README.md` - `apps/backend/src/modules/auth/README.md` - `apps/backend/src/modules/content/README.md` - `apps/backend/src/modules/educational/README.md` - `apps/backend/src/modules/gamification/README.md` - `apps/backend/src/modules/notifications/README.md` - `apps/backend/src/modules/profile/README.md` - `apps/backend/src/modules/progress/README.md` - `apps/backend/src/modules/social/README.md` - `apps/backend/src/modules/tasks/README.md` - `apps/backend/src/modules/websocket/README.md` **Template:** ```markdown # Modulo: {nombre} ## Descripcion {descripcion del modulo} ## Responsabilidades - {responsabilidad 1} - {responsabilidad 2} ## Dependencias - {modulo 1} - {modulo 2} ## Entidades | Entidad | Tabla | Descripcion | |---------|-------|-------------| ## Servicios | Servicio | Metodos Principales | |----------|---------------------| ## Endpoints | Metodo | Ruta | Descripcion | |--------|------|-------------| ## DTOs | DTO | Uso | |-----|-----| ``` **Esfuerzo:** 8 horas (30 min/modulo) --- ### C3: Agregar ejemplos JSON a APIs **Archivos a modificar:** - `docs/90-transversal/api/API-ADMIN-MODULE.md` (+30 ejemplos) - `docs/90-transversal/api/API-TEACHER-MODULE.md` (+20 ejemplos) **Esfuerzo:** 4 horas --- ### C4: Actualizar TRIGGERS-INVENTORY.md **Archivo:** `docs/90-transversal/inventarios-database/TRIGGERS-INVENTORY.md` **Accion:** Reconciliar conteo (111 documentados vs 50 archivos) **Esfuerzo:** 2 horas --- ### C5: Crear QUICK-START.md **Archivo nuevo:** `docs/95-guias-desarrollo/QUICK-START.md` **Contenido:** - Prerequisitos - Instalacion en 5 minutos - Comandos principales - Troubleshooting comun **Esfuerzo:** 2 horas --- ### C6: Crear ARQUITECTURA-ALTO-NIVEL.md **Archivo nuevo:** `docs/95-guias-desarrollo/ARQUITECTURA-ALTO-NIVEL.md` **Contenido:** - Diagrama de arquitectura - Flujo de datos - Componentes principales - Decisiones arquitectonicas **Esfuerzo:** 4 horas --- ## FASE D: TESTING Y VALIDACION (P2) **Duracion estimada:** 4-6 semanas **Prioridad:** MEDIA **Dependencias:** Fase B completada ### D1: Tests Frontend (13% -> 40%) **Componentes prioritarios:** 1. Mecanicas de ejercicios (30 tipos) 2. Hooks de progreso 3. Stores de gamificacion ### D2: Tests Backend (20% -> 40%) **Servicios prioritarios:** 1. ProgressService (nuevo compartido) 2. AuthService 3. GamificationService ### D3: Tests E2E (0 -> 20+) **Flujos criticos:** 1. Login -> Dashboard -> Ejercicio -> Submit -> Resultado 2. Teacher: Login -> Clases -> Estudiantes -> Progreso 3. Admin: Login -> Usuarios -> CRUD ### D4: Tests de Integracion **Integraciones:** 1. DB -> Backend (entidades) 2. Backend -> Frontend (DTOs) 3. Seeds -> Triggers -> Funciones --- ## VALIDACION DEL PLAN ### Checklist Pre-Ejecucion - [ ] Analisis integral completado y revisado - [ ] Dependencias entre fases identificadas - [ ] Archivos a modificar listados - [ ] Esfuerzos estimados validados - [ ] Rollback plan definido ### Criterios de Aceptacion por Fase #### Fase A - [ ] 100% seeds cargados sin error - [ ] 0 funciones con NOW() incorrecto - [ ] API-SOCIAL-MODULE.md con auth documentada - [ ] Permisos de archivos corregidos #### Fase B - [ ] Tablas consolidadas funcionando - [ ] Vistas de compatibilidad creadas - [ ] Backend compilando sin errores - [ ] Frontend sin errores de TypeScript #### Fase C - [ ] Score documentacion: 78 -> 95 - [ ] 100% modulos con README - [ ] 80% endpoints con ejemplos JSON #### Fase D - [ ] Coverage frontend: 13% -> 40% - [ ] Coverage backend: 20% -> 40% - [ ] 20+ tests E2E pasando --- ## SIGUIENTE PASO **Accion requerida:** Validacion del plan por el usuario Una vez validado, se procedera con: 1. Fase A: Correcciones criticas (4.5 horas) 2. Fase B1: Consolidacion de tablas de auditoria (2 dias) --- **Plan creado:** 2026-01-07 **Pendiente:** Aprobacion **Responsable:** Arquitecto de Datos y Orquestador