# US-ANA-001: Dashboard de Clase Básico **Épica:** EAI-004 (Analytics Básico) **Sprint:** Mes 1, Semana 3 **Story Points:** 8 SP **Presupuesto:** $4,000 MXN **Prioridad:** Alta (Alcance Inicial) **Estado:** ✅ Completada (Mes 1) --- ## Descripción Como profesor, quiero visualizar un dashboard básico de mi clase para obtener un resumen rápido del estado general de mis estudiantes sin tener que revisar cada uno individualmente. **Contexto del Alcance Inicial:** Este dashboard proporciona las métricas fundamentales que un profesor necesita en su día a día: número de estudiantes, progreso promedio de la clase, y las últimas actividades registradas. Se enfoca en visualizaciones simples y directas, sin análisis avanzados, predicciones ML, o configurabilidad de métricas (eso va a EXT-005 Reportes Avanzados). --- ## Criterios de Aceptación ### CA-01: Métricas Generales de la Clase - [ ] El dashboard muestra el número total de estudiantes en la clase - [ ] Muestra el porcentaje de completitud promedio de la clase - [ ] Muestra el nivel promedio de los estudiantes - [ ] Muestra el XP total acumulado de la clase ### CA-02: Visualizaciones Básicas - [ ] Gráfica de barras: distribución de estudiantes por nivel - [ ] Gráfica de pie chart: porcentaje de módulos completados vs pendientes - [ ] Gráfica de barras: progreso por módulo educativo - [ ] Todas las gráficas se renderizan correctamente en desktop y mobile ### CA-03: Actividades Recientes - [ ] Muestra las últimas 10 actividades de la clase - [ ] Cada actividad muestra: estudiante, módulo, actividad, fecha/hora - [ ] Las actividades están ordenadas de más reciente a más antigua - [ ] Se actualiza automáticamente cada 5 minutos ### CA-04: Navegación Rápida - [ ] Botón "Ver Todos los Estudiantes" que lleva a US-ANA-002 - [ ] Botón "Ver Reportes" que lleva a US-ANA-004 - [ ] Selector de clase (si el profesor tiene múltiples clases) ### CA-05: Performance y UX - [ ] El dashboard carga en menos de 2 segundos - [ ] Muestra skeleton loaders mientras carga los datos - [ ] Maneja correctamente el caso de clase sin estudiantes - [ ] Muestra mensajes amigables si no hay datos --- ## Especificaciones Técnicas ### Backend **Endpoint Principal:** ``` GET /api/teacher/classroom/{classroomId}/dashboard ``` **Response:** ```json { "classroomId": "uuid", "classroomName": "Matemáticas 6A", "metrics": { "totalStudents": 25, "averageProgress": 65.5, "averageLevel": 3, "totalXP": 12500 }, "levelDistribution": [ {"level": 1, "count": 5}, {"level": 2, "count": 8}, {"level": 3, "count": 10}, {"level": 4, "count": 2} ], "moduleCompletion": { "completed": 60, "inProgress": 30, "notStarted": 10 }, "moduleProgress": [ {"moduleName": "Fracciones", "averageProgress": 75}, {"moduleName": "Geometría", "averageProgress": 55}, {"moduleName": "Álgebra", "averageProgress": 45} ], "recentActivities": [ { "studentName": "Juan Pérez", "moduleName": "Fracciones", "activityName": "Suma de fracciones", "timestamp": "2025-11-02T10:30:00Z", "type": "completed" } ] } ``` **Controller:** ```typescript // TeacherAnalyticsController.ts @Get('classroom/:classroomId/dashboard') async getClassroomDashboard( @Param('classroomId') classroomId: string, @CurrentUser() teacher: User ) { return this.analyticsService.getClassroomDashboard(classroomId, teacher.id); } ``` **Service:** ```typescript // TeacherAnalyticsService.ts async getClassroomDashboard(classroomId: string, teacherId: string) { // Validar que el profesor tiene acceso a la clase await this.validateTeacherAccess(classroomId, teacherId); // Obtener métricas generales const metrics = await this.calculateClassMetrics(classroomId); // Obtener distribución por nivel const levelDistribution = await this.getLevelDistribution(classroomId); // Obtener completitud de módulos const moduleCompletion = await this.getModuleCompletion(classroomId); // Obtener progreso por módulo const moduleProgress = await this.getModuleProgress(classroomId); // Obtener actividades recientes (últimas 10) const recentActivities = await this.getRecentActivities(classroomId, 10); return { classroomId, metrics, levelDistribution, moduleCompletion, moduleProgress, recentActivities }; } ``` ### Frontend **Ruta:** ``` /teacher/classroom/:classroomId/dashboard ``` **Componente Principal:** ```typescript // ClassroomDashboard.tsx export const ClassroomDashboard = () => { const { classroomId } = useParams(); const { dashboardData, isLoading } = useClassroomDashboard(classroomId); if (isLoading) return ; return (
); }; ``` **Estado (Zustand):** ```typescript // teacherAnalyticsStore.ts interface TeacherAnalyticsStore { dashboardData: DashboardData | null; isLoading: boolean; error: string | null; fetchDashboard: (classroomId: string) => Promise; refreshDashboard: () => void; } ``` **Librería de Gráficas:** - **Recharts** para visualizaciones básicas (barras, pie chart) - Colores consistentes con el tema de gamificación --- ## Diseño UI/UX ### Layout Desktop ``` +-----------------------------------------------------------+ | Matemáticas 6A [Cambiar Clase ▼] | +-----------------------------------------------------------+ | [Card] [Card] [Card] [Card] | | 25 Estudiantes | 65% Progreso | Nivel 3 Prom | 12,500 XP| +-----------------------------------------------------------+ | [Gráfica Barras] | [Pie Chart] | | Distribución por Nivel | Módulos Completados | +----------------------------+------------------------------+ | [Gráfica Barras Horizontal] | | Progreso por Módulo | +-----------------------------------------------------------+ | Actividad Reciente [Ver Todas →] | | • Juan Pérez completó "Suma de fracciones" hace 5 min | | • María López inició "Geometría básica" hace 10 min | | ... | +-----------------------------------------------------------+ | [Ver Todos los Estudiantes] [Ver Reportes Completos] | +-----------------------------------------------------------+ ``` ### Consideraciones Mobile - Cards de métricas en grid 2x2 - Gráficas apiladas verticalmente - Actividades recientes colapsables --- ## Alcance Básico vs Extensiones ### EAI-004 (Este alcance - Analytics Básico): - ✅ Métricas básicas hardcodeadas (# estudiantes, progreso %, nivel, XP) - ✅ Gráficas simples estáticas (barras, pie chart) - ✅ Últimas 10 actividades (lista simple) - ✅ Vista única, sin personalización - ✅ Actualización automática cada 5 minutos ### EXT-005 (Extensión futura - Reportes Avanzados): - ⏳ Dashboard configurable (elegir métricas a mostrar) - ⏳ Gráficas interactivas con drill-down - ⏳ Filtros avanzados (rango de fechas, comparativas) - ⏳ Métricas de engagement (tiempo promedio, tasa de retención) - ⏳ Exportación de dashboard a PDF/imagen - ⏳ Comparativa entre clases - ⏳ Tendencias y análisis predictivo con ML - ⏳ Alertas configurables - ⏳ Actualización en tiempo real (WebSockets) --- ## Dependencias ### Dependencias Técnicas: - **Backend:** Sistema de autenticación de profesores (EAI-005) - **Backend:** Modelo de datos de Classroom, Student, Module - **Backend:** Sistema de tracking de actividades (EAI-002) - **Backend:** Sistema de gamificación para XP y niveles (EAI-003) - **Frontend:** Librería Recharts - **Frontend:** teacherStore con autenticación ### Dependencias de User Stories: - Ninguna crítica (puede desarrollarse en paralelo con otras US de analytics) --- ## Pruebas ### Pruebas Unitarias: - [ ] `calculateClassMetrics` retorna métricas correctas - [ ] `getLevelDistribution` agrupa estudiantes correctamente - [ ] `getModuleCompletion` calcula porcentajes correctos - [ ] `getRecentActivities` retorna solo las últimas 10 actividades ### Pruebas de Integración: - [ ] Endpoint retorna 200 para profesor con acceso - [ ] Endpoint retorna 403 para profesor sin acceso - [ ] Endpoint retorna 404 para clase inexistente - [ ] Dashboard se actualiza al cambiar de clase ### Pruebas E2E: - [ ] Profesor ve dashboard con datos correctos - [ ] Gráficas se renderizan correctamente - [ ] Navegación a otras vistas funciona - [ ] Selector de clase cambia el dashboard --- ## Notas de Implementación 1. **Performance:** - Cachear métricas por 5 minutos (Redis) - Query optimizado con joins limitados - Paginación en actividades recientes 2. **Escalabilidad:** - Cálculo de métricas puede moverse a background job si la clase es muy grande (>100 estudiantes) - Considerar pre-cálculo nocturno para clases grandes 3. **UX:** - Skeleton loaders para mejor percepción de velocidad - Error boundaries para manejar fallos de gráficas - Mensajes amigables para clases sin datos 4. **Accesibilidad:** - Gráficas con texto alternativo - Tablas de datos alternativas para lectores de pantalla - Contraste adecuado en colores de gráficas --- ## Estimación de Esfuerzo **Backend:** 3 SP - Endpoints y lógica de cálculo de métricas - Queries optimizados **Frontend:** 4 SP - Componentes de dashboard - Integración de Recharts - Layout responsive **Testing:** 1 SP - Pruebas unitarias, integración, E2E **Total:** 8 SP = $4,000 MXN --- ## Tareas de Implementación ### Backend (14.4h - 45%) #### 1. Configuración de Módulo y Endpoints Base (2h) - [ ] Crear módulo `TeacherAnalyticsModule` en NestJS - [ ] Configurar guard `TeacherGuard` para validación de rol profesor - [ ] Definir estructura de DTOs base para analytics - [ ] Configurar importaciones de dependencias (TypeORM, JWT) #### 2. Modelo de Datos y Repositorios (3h) - [ ] Validar entidad `Classroom` con relaciones (students, modules) - [ ] Validar entidad `Student` con campos de gamificación (level, xp) - [ ] Validar entidad `Activity` y `Module` para tracking - [ ] Crear repositorio custom si es necesario para agregaciones - [ ] Configurar índices en base de datos para queries frecuentes #### 3. Service de Cálculo de Métricas (4.5h) - [ ] Implementar `calculateClassMetrics()`: totalStudents, averageProgress, averageLevel, totalXP - [ ] Implementar `getLevelDistribution()`: contar estudiantes por nivel - [ ] Implementar `getModuleCompletion()`: % de módulos completados/en progreso/no iniciados - [ ] Implementar `getModuleProgress()`: progreso promedio por módulo - [ ] Implementar `getRecentActivities()`: últimas 10 actividades ordenadas - [ ] Optimizar queries con joins y agregaciones SQL #### 4. Controller y Endpoint Principal (2.4h) - [ ] Implementar `GET /api/teacher/classroom/{classroomId}/dashboard` - [ ] Implementar validación de parámetros (classroomId UUID) - [ ] Implementar `validateTeacherAccess()`: verificar que profesor tiene acceso al aula - [ ] Manejar errores 403 (sin acceso), 404 (aula no existe) - [ ] Documentar endpoint con Swagger/OpenAPI #### 5. Caché y Optimización (1.6h) - [ ] Implementar caché Redis con TTL de 5 minutos para métricas - [ ] Configurar invalidación de caché al actualizar datos - [ ] Implementar query pagination para actividades recientes - [ ] Optimizar consultas con `select` específicos (evitar over-fetching) #### 6. Testing Backend (0.9h) - [ ] Unit tests para `calculateClassMetrics()` - [ ] Unit tests para `getLevelDistribution()` - [ ] Integration tests para endpoint 200, 403, 404 - [ ] Test de performance para clases con >50 estudiantes ### Frontend (11.2h - 35%) #### 1. Setup de Estado y API Client (2h) - [ ] Crear `teacherAnalyticsStore` con Zustand (dashboardData, isLoading, error) - [ ] Implementar `teacherAnalyticsApi.getDashboard()` con axios - [ ] Configurar interceptores para autenticación (Bearer token) - [ ] Implementar manejo de errores global #### 2. Componente Principal Dashboard (2.5h) - [ ] Crear componente `ClassroomDashboard.tsx` - [ ] Implementar hook `useClassroomDashboard()` con auto-fetch - [ ] Implementar skeleton loader `DashboardSkeleton` - [ ] Configurar layout responsive (desktop/mobile) - [ ] Implementar breadcrumb y navegación #### 3. Componentes de Métricas (2h) - [ ] Crear componente `MetricsCards` con 4 cards (estudiantes, progreso, nivel, XP) - [ ] Implementar `StatCard` reutilizable con icono y valor - [ ] Aplicar estilos Tailwind para grid responsive - [ ] Implementar iconos (UsersIcon, ProgressIcon, LevelIcon, XPIcon) #### 4. Componentes de Gráficas (3h) - [ ] Instalar y configurar librería Recharts - [ ] Crear `LevelDistributionChart` (BarChart) con datos de niveles - [ ] Crear `ModuleCompletionPieChart` con 3 segmentos (completado/progreso/no iniciado) - [ ] Crear `ModuleProgressBarChart` (BarChart horizontal) con progreso por módulo - [ ] Aplicar tema de colores consistente (verde/amarillo/rojo) - [ ] Hacer gráficas responsive (ajuste de tamaño) #### 5. Componente de Actividades Recientes (1h) - [ ] Crear `RecentActivitiesList` con scroll vertical - [ ] Implementar `ActivityItem` con avatar, nombre, módulo, timestamp - [ ] Formatear timestamp a relativo ("hace 5 min") - [ ] Implementar empty state si no hay actividades #### 6. Auto-refresh y UX (0.7h) - [ ] Implementar auto-refresh cada 5 minutos con `setInterval` - [ ] Agregar indicador de última actualización - [ ] Implementar botón manual de refresh - [ ] Agregar transiciones suaves con Tailwind ### Testing (4.8h - 15%) #### 1. Testing Unitario (2h) - [ ] Tests de componentes aislados con React Testing Library - [ ] Tests de custom hooks (useClassroomDashboard) - [ ] Tests de formateo de datos (formatRelativeTime, etc.) - [ ] Tests de edge cases (clase sin estudiantes, sin datos) #### 2. Testing de Integración (1.5h) - [ ] Test E2E: Profesor ve dashboard con datos correctos - [ ] Test E2E: Gráficas se renderizan correctamente - [ ] Test E2E: Navegación a otras vistas funciona - [ ] Test E2E: Auto-refresh actualiza datos #### 3. Testing de Performance (0.8h) - [ ] Test de carga de dashboard <2s - [ ] Test de renderizado de gráficas con datasets grandes - [ ] Test de memory leaks en auto-refresh #### 4. Testing de Accesibilidad (0.5h) - [ ] Tests de contraste de colores - [ ] Tests de navegación por teclado - [ ] Tests de screen reader (aria-labels) ### Deployment (1.6h - 5%) #### 1. Preparación de Build (0.8h) - [ ] Configurar variables de entorno (API_URL, CACHE_TTL) - [ ] Build de producción (npm run build) - [ ] Verificar bundle size (<500KB para dashboard) - [ ] Configurar lazy loading de Recharts #### 2. Deploy y Smoke Tests (0.8h) - [ ] Deploy a ambiente de staging - [ ] Smoke test: dashboard carga correctamente - [ ] Smoke test: métricas son correctas - [ ] Verificar logs y errores - [ ] Tag de versión en Git --- **Total Horas:** 32h **Distribución Real:** Backend 45% | Frontend 35% | Testing 15% | Deploy 5%