# PLAN DE IMPLEMENTACIONES - PORTAL TEACHER GAMILIT
**Fecha**: 23 Diciembre 2025
**Version**: 1.0
**FASE**: 3 - Planificacion de Implementaciones
**Rol**: Requirements-Analyst
---
## RESUMEN DE TAREAS
| Prioridad | Total Tareas | Impacto |
|-----------|--------------|---------|
| **P0 - Critico** | 4 tareas | Bloquean produccion |
| **P1 - Alta** | 6 tareas | Afectan funcionalidad core |
| **P2 - Media** | 5 tareas | Mejoras importantes |
---
## P0 - TAREAS CRITICAS (Bloquean produccion)
### TAREA P0-01: Registrar TeacherMessagesService en Module
**Gap**: G01 - Servicio NO registrado en providers
**Severidad**: CRITICA - Inyeccion fallara
**Archivo a modificar**:
- `/home/isem/workspace/projects/gamilit/apps/backend/src/modules/teacher/teacher.module.ts`
**Cambio requerido**:
Agregar `TeacherMessagesService` al array de providers en la linea 182.
```typescript
providers: [
// ... otros providers
TeacherMessagesService, // AGREGAR ESTA LINEA
],
```
**Validacion**:
- Verificar que el servicio se inyecte correctamente
- Verificar que los endpoints de /teacher/messages funcionen
**Dependencias**: Ninguna
**Esfuerzo**: 5 minutos
**Subagente**: Backend-Developer
---
### TAREA P0-02: Agregar Indicador de Mock Data en TeacherReportsPage
**Gap**: G02 - Mock data fallback sin indicador visual
**Severidad**: CRITICA - Usuarios ven datos ficticios sin saberlo
**Archivo a modificar**:
- `/home/isem/workspace/projects/gamilit/apps/frontend/src/apps/teacher/pages/TeacherReportsPage.tsx`
**Cambios requeridos**:
1. Agregar estado para tracking de mock data:
```typescript
const [isUsingMockData, setIsUsingMockData] = useState(false);
```
2. En cada catch block de fallback, setear flag:
```typescript
// En loadStudents (linea ~178)
catch {
setIsUsingMockData(true);
setStudents([...mockStudents]);
}
// En loadRecentReports (linea ~199)
catch {
setIsUsingMockData(true);
setRecentReports([...mockReports]);
}
// En loadReportStats (linea ~243)
catch {
setIsUsingMockData(true);
setReportStats({...mockStats});
}
```
3. Agregar banner visible cuando isUsingMockData es true:
```typescript
{isUsingMockData && (
Datos de Demostracion
No se pudo conectar al servidor. Mostrando datos de ejemplo.
)}
```
**Validacion**:
- Desconectar API y verificar banner aparece
- Conectar API y verificar banner NO aparece
**Dependencias**: Ninguna
**Esfuerzo**: 30 minutos
**Subagente**: Frontend-Developer
---
### TAREA P0-03: Agregar Filtrado por Teacher en DashboardService
**Gap**: G03 - Dashboard muestra datos de TODOS los estudiantes
**Severidad**: CRITICA - Problema de seguridad/privacidad
**Archivo a modificar**:
- `/home/isem/workspace/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-dashboard.service.ts`
**Cambio requerido** (linea ~77):
Cambiar la query para filtrar por classrooms del teacher:
```typescript
// ANTES (problematico)
const students = await this.profileRepository.find({
where: { role: 'student' }
});
// DESPUES (correcto)
const teacherClassrooms = await this.classroomRepository.find({
where: { teacher_id: teacherId }
});
const classroomIds = teacherClassrooms.map(c => c.id);
const students = await this.classroomMemberRepository
.createQueryBuilder('cm')
.innerJoinAndSelect('cm.student', 'student')
.where('cm.classroom_id IN (:...classroomIds)', { classroomIds })
.getMany();
```
**Validacion**:
- Crear teacher con 2 aulas
- Verificar que solo ve estudiantes de SUS aulas
- Verificar que NO ve estudiantes de otras aulas
**Dependencias**: Ninguna
**Esfuerzo**: 1 hora
**Subagente**: Backend-Developer
---
### TAREA P0-04: Implementar Generacion PDF con Puppeteer
**Gap**: G04 - ReportsService sin generacion real de PDF
**Severidad**: CRITICA - Reportes PDF vacios
**Archivos a modificar**:
- `/home/isem/workspace/projects/gamilit/apps/backend/src/modules/teacher/services/reports.service.ts`
- `package.json` (agregar dependencia puppeteer)
**Cambios requeridos**:
1. Instalar puppeteer:
```bash
cd apps/backend && npm install puppeteer
```
2. Implementar generatePDFReport():
```typescript
import puppeteer from 'puppeteer';
async generatePDFReport(config: ReportConfig): Promise {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
const html = this.generateReportHTML(config);
await page.setContent(html);
const pdfBuffer = await page.pdf({
format: 'A4',
printBackground: true,
});
await browser.close();
return Buffer.from(pdfBuffer);
}
```
**Alternativa**: Si Puppeteer es muy pesado, usar `pdfkit` o `jsPDF` como alternativa ligera.
**Validacion**:
- Generar reporte PDF
- Verificar que descarga archivo valido
- Abrir PDF y verificar contenido
**Dependencias**: Ninguna
**Esfuerzo**: 2-3 horas
**Subagente**: Backend-Developer
---
## P1 - TAREAS DE ALTA PRIORIDAD
### TAREA P1-01: Unificar organizationName Dinamico
**Gap**: G05 - organizationName hardcodeado en 6 paginas
**Archivos a modificar**:
- TeacherClassesPage.tsx
- TeacherMonitoringPage.tsx
- TeacherAssignmentsPage.tsx (wrapper)
- TeacherExerciseResponsesPage.tsx
- TeacherAlertsPage.tsx
- TeacherReportsPage.tsx
**Cambio requerido** en cada archivo:
```typescript
// ANTES
organizationName="GLIT Platform"
// DESPUES
organizationName={user?.organization?.name || 'Mi Institucion'}
```
**Dependencias**: Ninguna
**Esfuerzo**: 30 minutos (6 archivos * 5 min)
**Subagente**: Frontend-Developer
---
### TAREA P1-02: Mejorar Fallback Gamification
**Gap**: G06 - Fallback con datos dummy sin indicador
**Archivos a modificar**: 10 paginas del teacher portal
**Opcion A - Indicador visual**:
```typescript
{gamificationError && (
(datos no disponibles)
)}
```
**Opcion B - Reintentar automatico**:
```typescript
const { retry } = useUserGamification(userId, { retryCount: 3 });
```
**Dependencias**: Ninguna
**Esfuerzo**: 1 hora
**Subagente**: Frontend-Developer
---
### TAREA P1-03: Crear Endpoint economyConfig
**Gap**: G08 - economyConfig hardcodeado en TeacherGamification
**Archivos a crear/modificar**:
- Crear: `/apps/backend/src/modules/teacher/controllers/economy-config.controller.ts`
- Crear: `/apps/backend/src/modules/teacher/services/economy-config.service.ts`
- Modificar: `teacher.module.ts`
- Modificar: `TeacherGamification.tsx`
**Endpoint**: `GET /teacher/analytics/economy-config`
**Response**:
```json
{
"earning_rates": {
"exercise_completion": 50,
"daily_login": 10,
"streak_bonus": 20,
"achievement": 100,
"perfect_score": 150
},
"spending_costs": {
"hint": 20,
"skip_exercise": 50,
"powerup_vision": 30,
"powerup_time": 40,
"cosmetic_item": 100
}
}
```
**Dependencias**: Tabla de configuracion en DB (opcional, puede ser config file)
**Esfuerzo**: 2 horas
**Subagente**: Backend-Developer
---
### TAREA P1-04: Estandarizar Cliente HTTP (apiClient)
**Gap**: G09 - Inconsistencia apiClient vs axiosInstance
**Archivos a modificar** (7 servicios):
- teacherApi.ts
- classroomsApi.ts
- assignmentsApi.ts
- gradingApi.ts
- analyticsApi.ts
- studentProgressApi.ts
- bonusCoinsApi.ts
**Cambio requerido** en cada archivo:
```typescript
// ANTES
import { axiosInstance } from '@/services/api/axiosInstance';
// ... uso de axiosInstance.get()
// DESPUES
import { apiClient } from '@/shared/api';
// ... uso de apiClient.get()
```
**Dependencias**: Verificar que apiClient tenga mismos interceptors
**Esfuerzo**: 1-2 horas
**Subagente**: Frontend-Developer
---
### TAREA P1-05: Centralizar Rutas en API_ENDPOINTS
**Gap**: G10 - 6 servicios no usan API_ENDPOINTS
**Archivo a modificar**:
- `/home/isem/workspace/projects/gamilit/apps/frontend/src/config/api.config.ts`
**Agregar a API_ENDPOINTS.teacher**:
```typescript
teacher: {
// ... existentes ...
// AGREGAR:
submissions: '/teacher/submissions',
submissionById: (id: string) => `/teacher/submissions/${id}`,
bulkGrade: '/teacher/submissions/bulk-grade',
studentProgress: (id: string) => `/teacher/students/${id}/progress`,
studentOverview: (id: string) => `/teacher/students/${id}/overview`,
studentStats: (id: string) => `/teacher/students/${id}/stats`,
studentNotes: (id: string) => `/teacher/students/${id}/notes`,
addStudentNote: (id: string) => `/teacher/students/${id}/note`,
attempts: '/teacher/attempts',
attemptById: (id: string) => `/teacher/attempts/${id}`,
attemptsByStudent: (id: string) => `/teacher/attempts/student/${id}`,
exerciseResponses: (id: string) => `/teacher/exercises/${id}/responses`,
}
```
**Dependencias**: Ninguna
**Esfuerzo**: 30 minutos
**Subagente**: Frontend-Developer
---
### TAREA P1-06: Reemplazar alert() con Toast
**Gap**: Varias paginas usan alert() en lugar de Toast
**Archivos a modificar**:
- TeacherAssignments.tsx
- TeacherClasses.tsx
**Cambio requerido**:
```typescript
// ANTES
alert('Error al crear aula');
// DESPUES
import { useToast } from '@/shared/hooks/useToast';
const { showError } = useToast();
showError('Error al crear aula');
```
**Dependencias**: Hook useToast disponible
**Esfuerzo**: 30 minutos
**Subagente**: Frontend-Developer
---
## P2 - TAREAS DE MEDIA PRIORIDAD
### TAREA P2-01: Dinamizar Ejercicios en ReviewPanelPage
**Gap**: G11 - Ejercicios hardcodeados en dropdown
**Archivo a modificar**: ReviewPanelPage.tsx
**Cambio**: Obtener ejercicios desde API o config
**Esfuerzo**: 1 hora
---
### TAREA P2-02: Centralizar Tipos de Alertas
**Gap**: G12 - Tipos hardcodeados en TeacherAlertsPage
**Cambio**: Mover a shared/constants o obtener de API
**Esfuerzo**: 30 minutos
---
### TAREA P2-03: Calcular Stats en Servidor (Respuestas)
**Gap**: G13 - Stats calculados en cliente
**Cambio**: Agregar endpoint /teacher/attempts/stats
**Esfuerzo**: 1 hora
---
### TAREA P2-04: Enriquecer Nombres en TeacherMessages
**Gap**: G14 - Nombres truncados (User_abc12345)
**Cambio**: Implementar join manual con auth.profiles
**Esfuerzo**: 2 horas
---
### TAREA P2-05: Implementar ML Real en Predictor
**Gap**: G07 - Solo heuristicas, no ML real
**Cambio**: Integrar TensorFlow.js o microservicio Python
**Esfuerzo**: Sprint completo (fuera de scope inmediato)
---
## GRAFO DE DEPENDENCIAS
```
P0-01 (MessagesService) ────────────────────→ Independiente
P0-02 (Mock Data Banner) ───────────────────→ Independiente
P0-03 (Filtrado Teacher) ───────────────────→ Independiente
P0-04 (Puppeteer PDF) ──────────────────────→ Independiente
P1-01 (organizationName) ───────────────────→ Independiente
P1-02 (Fallback Gamification) ──────────────→ Independiente
P1-03 (economyConfig) ─────────────→ P1-04 (Estandarizar apiClient)
P1-04 (apiClient) ─────────────────→ P1-05 (API_ENDPOINTS)
P1-05 (API_ENDPOINTS) ──────────────────────→ Independiente
P1-06 (Toast) ──────────────────────────────→ Independiente
```
---
## ORDEN DE EJECUCION RECOMENDADO
### Sprint Inmediato (Esta semana)
1. **P0-01**: Registrar TeacherMessagesService (5 min)
2. **P0-02**: Banner mock data en Reportes (30 min)
3. **P0-03**: Filtrado por teacher en Dashboard (1 hora)
4. **P1-01**: Unificar organizationName (30 min)
5. **P1-06**: Reemplazar alert() con Toast (30 min)
### Sprint Siguiente
6. **P0-04**: Implementar Puppeteer PDF (2-3 horas)
7. **P1-03**: Endpoint economyConfig (2 horas)
8. **P1-04**: Estandarizar apiClient (1-2 horas)
9. **P1-05**: Centralizar API_ENDPOINTS (30 min)
10. **P1-02**: Mejorar fallback gamification (1 hora)
### Backlog
11. P2-01 a P2-05 (segun prioridad del equipo)
---
## ARCHIVOS IMPACTADOS (RESUMEN)
### Backend (4 archivos)
- teacher.module.ts
- teacher-dashboard.service.ts
- reports.service.ts
- (nuevo) economy-config.service.ts
### Frontend Pages (10 archivos)
- TeacherReportsPage.tsx
- TeacherClassesPage.tsx
- TeacherMonitoringPage.tsx
- TeacherAssignmentsPage.tsx
- TeacherExerciseResponsesPage.tsx
- TeacherAlertsPage.tsx
- TeacherGamification.tsx
- TeacherClasses.tsx
- TeacherAssignments.tsx
- ReviewPanelPage.tsx
### Frontend APIs (7 archivos)
- teacherApi.ts
- classroomsApi.ts
- assignmentsApi.ts
- gradingApi.ts
- analyticsApi.ts
- studentProgressApi.ts
- bonusCoinsApi.ts
### Config (1 archivo)
- api.config.ts
---
## SIGUIENTE PASO
**FASE 4**: Validar este plan verificando:
- Todas las dependencias estan cubiertas
- No faltan objetos que deban impactarse
- Archivos mencionados existen
- Orden de ejecucion es correcto
---
*Plan creado: 2025-12-23*
*Proyecto: GAMILIT - Portal Teacher*