workspace-v1/orchestration/reportes/PLAN-EJECUCION-GAMILIT-2026-01-07.md
rckrdmrd e56e927a4d [MAINT-001] docs(orchestration): Actualizacion directivas SIMCO, perfiles y documentacion
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
2026-01-10 04:51:28 -06:00

802 lines
22 KiB
Markdown

# 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<UserProgression>,
@InjectRepository(ModuleProgress, 'progress')
private readonly moduleProgressRepo: Repository<ModuleProgress>,
) {}
// Metodo base para obtener progreso de usuario
async getUserProgress(userId: string): Promise<UserProgressDto> {
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<Map<string, UserProgressDto>> {
// Implementacion optimizada con batch queries
}
// Metodo para actualizar metricas de nivel
async updateLevelMetrics(userId: string, level: string, metrics: LevelMetrics): Promise<void> {
// Implementacion
}
// Metodo para promover usuario
async promoteUser(userId: string, newLevel: string, reason: string): Promise<void> {
// 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<AdminStudentProgressDto> {
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<StatsGridProps> = ({ 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