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
802 lines
22 KiB
Markdown
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
|