## Sprint 1 (P0-P1) - P0-02: Submit en Emparejamiento y DragDrop - P0-03: Visualización mecánicas manuales (10 tipos) - P0-04: NotificationService en alertas - P1-01: RLS en teacher_notes - P1-02: Índices críticos para queries - P1-04: Habilitar páginas Communication y Content ## Sprint 2 (P1) - P1-03: Vista classroom_progress_overview - P1-05: Resolver TODOs StudentProgressService - P1-06: Hook useMissionStats - P1-07: Hook useMasteryTracking - P1-08: Cache invalidation en AnalyticsService ## Sprint 3 (P2) - P2-01: WebSocket para monitoreo real-time - P2-02: RubricEvaluator componente - P2-03: Reproductor multimedia (video/audio/image) - P2-04: Tabla teacher_interventions - P2-05: Vista teacher_pending_reviews Total: 17 tareas, 28 archivos 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
15 KiB
PLAN DE IMPLEMENTACIONES - PORTAL TEACHER GAMILIT
Fecha: 18 Diciembre 2025 Versión: 1.0 FASE: 3 - Planificación de Implementaciones Rol: Requirements-Analyst
ÍNDICE DE IMPLEMENTACIONES
| Prioridad | Total Tareas | Estimación |
|---|---|---|
| P0 - Crítico | 4 tareas | Sprint actual |
| P1 - Alta | 8 tareas | 1-2 sprints |
| P2 - Media | 7 tareas | 3-4 sprints |
P0 - TAREAS CRÍTICAS
TAREA P0-01: Reemplazar Mock Data en TeacherGamification ❌ ELIMINADA
Estado: YA IMPLEMENTADO - No requiere acción
Validación FASE 4: TeacherGamification.tsx ya usa hooks reales:
useEconomyAnalytics→ API realuseStudentsEconomy→ API realuseAchievementsStats→ API real
Búsqueda de "mock" en archivo: No matches found
TAREA P0-02: Corregir Submit en Mecánica Emparejamiento
Gap: G02 - Progreso de Emparejamiento no se persiste en backend Área: Student Portal (Mecánicas) Archivos a modificar:
/apps/frontend/src/features/exercises/mechanics/Emparejamiento.tsx
Cambios requeridos:
- Localizar función de completado del ejercicio
- Asegurar llamada a
submitExercise()osubmitAnswer()del hook useExercise - Validar que el score se calcule correctamente antes del submit
Dependencias:
- Hook useExercise debe estar disponible
- Endpoint POST /exercises/{id}/submit debe estar funcional
Subagente: Mechanics-Developer Prompt para subagente:
Corregir persistencia en Emparejamiento.tsx:
1. Leer componente Emparejamiento.tsx
2. Identificar lógica de completado (onComplete, handleFinish, etc.)
3. Verificar si llama a submitExercise del hook useExercise
4. Si no existe, agregarlo con el score calculado
5. Probar que el progreso se persista en exercise_submissions
TAREA P0-03: Visualización de Mecánicas Manuales en Teacher Portal
Gap: G03 - Teacher no puede ver/evaluar respuestas de mecánicas manuales Área: Frontend Teacher + Backend Archivos a modificar:
/apps/frontend/src/features/teacher/components/responses/ResponseDetailModal.tsx/apps/backend/src/modules/teacher/services/exercise-responses.service.ts
Cambios requeridos:
- En ResponseDetailModal.tsx:
- Detectar tipo de mecánica (manual: prediccion_narrativa, tribunal, podcast, video, comic)
- Renderizar respuesta de texto largo con formato
- Agregar controles de evaluación manual (score, feedback)
- En exercise-responses.service.ts:
- Asegurar que las respuestas de texto abierto se retornen completas
Mecánicas manuales afectadas (10):
- Predicción Narrativa
- Tribunal de Opiniones
- Podcast Argumentativo
- Debate Digital
- Cómic Digital
- Video Carta
- Diario Multimedia
- Collage Prensa
- Call to Action
- Texto en Movimiento
Dependencias:
- ManualReviewService ya existe
Subagente: FullStack-Developer Prompt para subagente:
Implementar visualización de mecánicas manuales:
1. Leer ResponseDetailModal.tsx actual
2. Identificar tipos de mecánica manual vs automática
3. Para manuales: renderizar respuesta completa de texto
4. Agregar sección de calificación manual con:
- Score numérico (0-100)
- Textarea para feedback
- Botón de guardar usando ManualReviewService
5. Verificar que backend retorna respuesta completa
TAREA P0-04: Integrar NotificationService en Alertas
Gap: G04 - Alertas se generan pero no notifican Área: Backend Archivos a modificar:
/apps/backend/src/modules/teacher/services/student-risk-alert.service.ts/apps/backend/src/modules/notifications/notifications.service.ts(verificar existencia)
Cambios requeridos:
- Verificar que NotificationsModule existe
- En StudentRiskAlertService:
- Inyectar NotificationsService
- En método de creación de alerta, llamar a notificación
- Tipos de notificación: in-app, email (opcional)
Dependencias:
- NotificationsModule debe existir (verificar)
Subagente: Backend-Developer Prompt para subagente:
Integrar NotificationService en alertas:
1. Verificar si existe NotificationsModule en /apps/backend/src/modules/
2. Si no existe, crear estructura básica
3. En StudentRiskAlertService:
- Importar e inyectar NotificationsService
- En createAlert(), llamar a sendNotification()
- Payload: teacher_id, alert_type, student_name, message
4. Resolver los 3 TODOs relacionados con notificaciones
P1 - TAREAS DE ALTA PRIORIDAD
TAREA P1-01: Habilitar RLS en teacher_notes
Gap: G09 - Tabla sin Row Level Security Área: Database Archivos a crear/modificar:
/apps/database/migrations/YYYYMMDD_add_rls_teacher_notes.sql
SQL a ejecutar:
ALTER TABLE progress_tracking.teacher_notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY teacher_notes_select_own
ON progress_tracking.teacher_notes
FOR SELECT
USING (teacher_id = gamilit.get_current_user_id());
CREATE POLICY teacher_notes_insert_own
ON progress_tracking.teacher_notes
FOR INSERT
WITH CHECK (teacher_id = gamilit.get_current_user_id());
CREATE POLICY teacher_notes_update_own
ON progress_tracking.teacher_notes
FOR UPDATE
USING (teacher_id = gamilit.get_current_user_id());
CREATE POLICY teacher_notes_delete_own
ON progress_tracking.teacher_notes
FOR DELETE
USING (teacher_id = gamilit.get_current_user_id());
Dependencias: Ninguna
Subagente: Database-Developer
TAREA P1-02: Crear Índices Críticos
Gap: G10 - Queries lentas por índices faltantes Área: Database Archivos a crear:
/apps/database/migrations/YYYYMMDD_add_teacher_indexes.sql
SQL a ejecutar:
-- Índice para consultas de estudiantes activos por aula
CREATE INDEX IF NOT EXISTS idx_classroom_members_classroom_active
ON social_features.classroom_members(classroom_id, status)
WHERE status = 'active';
-- Índice para progreso por aula
CREATE INDEX IF NOT EXISTS idx_module_progress_classroom_status
ON progress_tracking.module_progress(classroom_id, status);
-- Índice para alertas por teacher
CREATE INDEX IF NOT EXISTS idx_intervention_alerts_teacher_status
ON progress_tracking.student_intervention_alerts(teacher_id, status)
WHERE status IN ('pending', 'acknowledged');
-- Índice para submissions por estudiante y fecha
CREATE INDEX IF NOT EXISTS idx_exercise_submissions_student_date
ON progress_tracking.exercise_submissions(student_id, submitted_at DESC);
Dependencias: Ninguna
Subagente: Database-Developer
TAREA P1-03: Crear Vista classroom_progress_overview
Gap: G11 - Sin vistas agregadas para progreso de aula Área: Database Archivos a crear:
/apps/database/migrations/YYYYMMDD_create_classroom_progress_view.sql
SQL a ejecutar:
CREATE OR REPLACE VIEW social_features.classroom_progress_overview AS
SELECT
c.id AS classroom_id,
c.name AS classroom_name,
c.teacher_id,
COUNT(DISTINCT cm.student_id) AS total_students,
COUNT(DISTINCT CASE WHEN mp.status = 'completed' THEN mp.student_id END) AS students_completed,
ROUND(AVG(mp.progress_percentage), 2) AS avg_progress,
COUNT(DISTINCT sia.id) FILTER (WHERE sia.status = 'pending') AS pending_alerts,
COUNT(DISTINCT es.id) FILTER (WHERE es.needs_review = true) AS pending_reviews
FROM social_features.classrooms c
LEFT JOIN social_features.classroom_members cm ON c.id = cm.classroom_id AND cm.status = 'active'
LEFT JOIN progress_tracking.module_progress mp ON cm.student_id = mp.student_id
LEFT JOIN progress_tracking.student_intervention_alerts sia ON cm.student_id = sia.student_id
LEFT JOIN progress_tracking.exercise_submissions es ON cm.student_id = es.student_id
GROUP BY c.id, c.name, c.teacher_id;
-- Grant para teacher role
GRANT SELECT ON social_features.classroom_progress_overview TO authenticated;
Dependencias: Tablas referenciadas deben existir
Subagente: Database-Developer
TAREA P1-04: Habilitar Páginas de Comunicación y Contenido
Gap: G06 - 3 páginas con placeholder (SHOW_UNDER_CONSTRUCTION = true) Área: Frontend Archivos a modificar:
/apps/frontend/src/features/teacher/pages/TeacherCommunicationPage.tsx/apps/frontend/src/features/teacher/pages/TeacherContentPage.tsx
Cambios requeridos:
- En TeacherCommunicationPage.tsx:
- Cambiar
const SHOW_UNDER_CONSTRUCTION = trueafalse
- Cambiar
- En TeacherContentPage.tsx:
- Cambiar
const SHOW_UNDER_CONSTRUCTION = trueafalse
- Cambiar
- Verificar que los componentes internos funcionan correctamente
Dependencias:
- Hooks useTeacherMessages y useTeacherContent deben estar funcionales
Subagente: Frontend-Developer
TAREA P1-05: Resolver TODOs en StudentProgressService
Gap: G07 - Datos sin enriquecer (nombres de módulos/ejercicios) Área: Backend Archivos a modificar:
/apps/backend/src/modules/teacher/services/student-progress.service.ts
TODOs a resolver (4):
- Join con tablas de módulos para nombres reales
- Join con tablas de ejercicios para metadata
- Cálculo de promedio de clase real
- Enriquecimiento de datos de submissions
Dependencias:
- Entidades Module y Exercise disponibles
Subagente: Backend-Developer Prompt para subagente:
Resolver TODOs en StudentProgressService:
1. Leer student-progress.service.ts
2. Localizar los 4 TODOs
3. Para cada TODO:
- Implementar join con tabla correspondiente
- Agregar campos de nombre, descripción al response
4. Calcular promedio de clase usando query agregada
5. Mantener compatibilidad con DTOs existentes
TAREA P1-06: Implementar Hook useMissionStats
Gap: G12 - Hooks faltantes para misiones Área: Frontend Archivos a crear:
/apps/frontend/src/features/teacher/hooks/useMissionStats.ts
Endpoints a consumir:
GET /teacher/missions/classroom/{id}/statsGET /teacher/missions/activeGET /teacher/missions/history
Estructura del hook:
interface MissionStats {
activeMissions: Mission[];
completionRate: number;
participationRate: number;
topParticipants: Student[];
}
export function useMissionStats(classroomId: string) {
// Implementar similar a useAnalytics
}
Dependencias:
- Endpoints de misiones deben existir (verificar)
Subagente: Frontend-Developer
TAREA P1-07: Implementar Hook useMasteryTracking
Gap: G12 - Hook para seguimiento de dominio de habilidades Área: Frontend Archivos a crear:
/apps/frontend/src/features/teacher/hooks/useMasteryTracking.ts
Endpoints a consumir:
GET /teacher/students/{id}/masteryGET /teacher/classrooms/{id}/mastery-overview
Dependencias:
- Verificar si endpoints existen, si no, crear en backend
Subagente: Frontend-Developer
TAREA P1-08: Cache Invalidation en AnalyticsService
Gap: G08 - Performance subóptimo por falta de cache Área: Backend Archivos a modificar:
/apps/backend/src/modules/teacher/services/analytics.service.ts
Cambios requeridos:
- Implementar pattern de cache con TTL
- Invalidar cache en:
- Nueva submission
- Cambio de score
- Nuevo miembro en aula
- Usar Redis o cache in-memory según disponibilidad
Dependencias:
- CacheModule de NestJS
Subagente: Backend-Developer
P2 - TAREAS DE MEDIA PRIORIDAD
TAREA P2-01: Implementar WebSocket para Monitoreo Real-Time
Gap: Frontend usa polling cada 30s Área: Frontend + Backend Archivos a crear/modificar:
/apps/backend/src/modules/teacher/gateways/monitoring.gateway.ts/apps/frontend/src/features/teacher/hooks/useRealtimeMonitoring.ts
Dependencias: P0 y P1 completados
TAREA P2-02: Crear RubricEvaluator Estándar
Gap: G16 - Calificación manual sin estructura Área: Frontend Archivos a crear:
/apps/frontend/src/features/teacher/components/grading/RubricEvaluator.tsx
TAREA P2-03: Reproductor Multimedia en ResponseDetailModal
Gap: G17 - Videos y audios no reproducibles Área: Frontend Archivos a modificar:
/apps/frontend/src/features/teacher/components/responses/ResponseDetailModal.tsx
TAREA P2-04: Crear Tabla teacher_interventions
Gap: G18 - Sin registro de acciones post-alerta Área: Database
TAREA P2-05: Crear Vista teacher_pending_reviews
Gap: G19 - Sin dashboard de pendientes Área: Database
TAREA P2-06: Tests Automáticos para Hooks
Gap: G13 - Sin tests unitarios Área: Frontend
TAREA P2-07: Optimización N+1 Queries
Gap: G15 - Queries ineficientes Área: Backend
GRAFO DE DEPENDENCIAS
P0-01 (Mock Data) ─────────────────────────────────────→ P1-06 (useMissionStats)
│
└──→ P2-02 (RubricEvaluator)
P0-02 (Emparejamiento) ──────────────────────────────→ Independiente
P0-03 (Visualización Manual) ────→ P2-02 (RubricEvaluator) ──→ P2-03 (Multimedia)
P0-04 (NotificationService) ─────────────────────────→ P2-01 (WebSocket)
P1-01 (RLS) ─────────────────────────────────────────→ Independiente
P1-02 (Índices) ─────────────────────────────────────→ P1-03 (Vista)
P1-03 (Vista) ──────────────────────────────────────→ P2-05 (Pending Reviews)
P1-04 (Habilitar páginas) ───────────────────────────→ Independiente
P1-05 (StudentProgress TODOs) ──→ P1-08 (Cache) ────→ P2-07 (N+1)
P1-06 (useMissionStats) ────────────────────────────→ P2-01 (WebSocket)
P1-07 (useMasteryTracking) ─────────────────────────→ P2-01 (WebSocket)
ORDEN DE EJECUCIÓN RECOMENDADO
Sprint 1 (Actual)
- P0-01: Mock Data
- P0-02: Emparejamiento
- P0-03: Visualización Manual
- P0-04: NotificationService
- P1-01: RLS teacher_notes
- P1-02: Índices
Sprint 2
- P1-03: Vista classroom_progress
- P1-04: Habilitar páginas
- P1-05: StudentProgress TODOs
- P1-06: useMissionStats
- P1-07: useMasteryTracking
- P1-08: Cache invalidation
Sprint 3-4
- P2-01 a P2-07 (según prioridad del equipo)
SINCRONIZACIÓN CON PRODUCCIÓN
Después de cada implementación:
- Commit en workspace desarrollo (
/home/isem/workspace/projects/gamilit) - Sincronizar a producción (
/home/isem/workspace-old/.../gamilit) - Validar que no haya conflictos
- Ejecutar migraciones de DB si aplica
SIGUIENTE PASO
FASE 4: Validar este plan contra los análisis para asegurar:
- Todas las dependencias están cubiertas
- No faltan objetos que impacten los cambios
- Orden de ejecución es correcto
- Archivos mencionados existen
Plan creado: 2025-12-18 Proyecto: GAMILIT - Portal Teacher