workspace-v1/projects/gamilit/docs/90-transversal/archivos-historicos/2025-11/INTEGRACION-STUDENT-TEACHER-PORTAL-2025-11-24.md
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
Structure:
- control-plane/: Registries, SIMCO directives, CI/CD templates
- projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics
- shared/: Libs catalog, knowledge-base

Key features:
- Centralized port, domain, database, and service registries
- 23 SIMCO directives + 6 fundamental principles
- NEXUS agent profiles with delegation rules
- Validation scripts for workspace integrity
- Dockerfiles for all services
- Path aliases for quick reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:35:19 -06:00

7.0 KiB

Integración Student-Teacher Portal

Fecha: 2025-11-24 Tarea: ARCH-INT-003 Analista: Architecture-Analyst Agent


Resumen Ejecutivo

Se implementaron correcciones críticas para la integración entre el Portal de Estudiantes y el Portal de Maestros, resolviendo 5 GAPs identificados que afectaban la visualización de datos de estudiantes en el Teacher Portal.

Impacto

Métrica Antes Después
Queries con errores 2 0
Campos faltantes en StudentInClassroomDto 8 0
Endpoint economy analytics No existía Implementado
Mock data en TeacherGamification 100% 25% (solo students/achievements)

GAPs Resueltos

GAP-ST-001: Query usando campo inexistente score_percentage

Severidad: BLOCKER Estado: RESUELTO

Problema:

// teacher-classrooms-crud.service.ts:855, 883
.addSelect('AVG(mp.score_percentage)', 'avg_score')  // ❌ Campo no existe

Solución:

.addSelect('AVG(mp.average_score)', 'avg_score')  // ✅ Corregido

Archivos modificados:

  • apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts:855
  • apps/backend/src/modules/teacher/services/teacher-classrooms-crud.service.ts:883

GAP-ST-002, GAP-ST-003, GAP-ST-004: Campos faltantes en StudentInClassroomDto

Severidad: DEGRADED Estado: RESUELTO

Problema: El DTO StudentInClassroomDto no incluía campos necesarios para mostrar información completa del estudiante en el Teacher Portal.

Solución: Se agregaron 8 campos nuevos:

Campo Tipo Descripción
current_module string | null Módulo actual del estudiante
current_exercise string | null Ejercicio actual
time_spent_minutes number Tiempo total dedicado
exercises_completed number Ejercicios completados
exercises_total number Total de ejercicios
total_ml_coins number Balance de ML Coins
current_rank string | null Rango Maya actual
achievements_count number Logros desbloqueados

Archivos modificados:

  • apps/backend/src/modules/teacher/dto/classroom-response.dto.ts:265-316

GAP-ST-005: Endpoint /teacher/analytics/economy no existía

Severidad: BLOCKER Estado: RESUELTO

Problema: TeacherGamification.tsx usaba datos mock porque no existía endpoint para obtener analytics de economía ML Coins.

Solución: Implementación completa del endpoint:

Backend

1. DTOs creados (analytics.dto.ts):

export class EconomyDistributionDto {
  range!: string;
  count!: number;
  percentage!: number;
}

export class TopEarnerDto {
  student_id!: string;
  student_name!: string;
  earned_this_week!: number;
}

export class EconomyTrendDto {
  date!: string;
  total_earned!: number;
  total_spent!: number;
}

export class EconomyAnalyticsDto {
  total_circulation!: number;
  average_balance!: number;
  total_earned_today!: number;
  total_spent_today!: number;
  distribution!: EconomyDistributionDto[];
  top_earners!: TopEarnerDto[];
  trends!: EconomyTrendDto[];
  wealth_distribution!: { top_10_percent: number; bottom_50_percent: number };
}

2. Método de servicio (analytics.service.ts):

async getEconomyAnalytics(teacherId: string, classroomId?: string): Promise<EconomyAnalyticsDto>

3. Endpoint controller (teacher.controller.ts):

@Get('analytics/economy')
async getEconomyAnalytics(@Request() req, @Query('classroom_id') classroomId?: string)

4. Ruta registrada (routes.constants.ts):

ANALYTICS_ECONOMY: '/teacher/analytics/economy', // GAP-ST-005

Frontend

1. API endpoint (api.config.ts):

economyAnalytics: '/teacher/analytics/economy', // GAP-ST-005

2. Tipos e interfaz (analyticsApi.ts):

export interface EconomyAnalytics { ... }
export interface EconomyDistribution { ... }
export interface TopEarner { ... }
export interface EconomyTrend { ... }

3. Método API (analyticsApi.ts):

async getEconomyAnalytics(query?: GetEconomyAnalyticsDto): Promise<EconomyAnalytics>

4. Hook React (useEconomyAnalytics.ts):

export function useEconomyAnalytics(classroomId?: string): UseEconomyAnalyticsReturn

5. Componente actualizado (TeacherGamification.tsx):

  • Importa useEconomyAnalytics
  • Reemplaza mock data de classStats con datos del API
  • Agrega indicadores de loading y error
  • Botón de refresh para recargar datos

Archivos Modificados

Backend (6 archivos)

Archivo Cambio
teacher-classrooms-crud.service.ts Fix query score_percentageaverage_score (2 líneas)
classroom-response.dto.ts Agregar 8 campos a StudentInClassroomDto
analytics.dto.ts Agregar EconomyAnalyticsDto y DTOs relacionados
analytics.service.ts Agregar método getEconomyAnalytics() + helpers
teacher.controller.ts Agregar endpoint GET /analytics/economy
routes.constants.ts Registrar ruta ANALYTICS_ECONOMY

Frontend (5 archivos)

Archivo Cambio
api.config.ts Agregar economyAnalytics endpoint
analyticsApi.ts Agregar tipos y método getEconomyAnalytics()
useEconomyAnalytics.ts Nuevo hook React
hooks/index.ts Exportar useEconomyAnalytics
TeacherGamification.tsx Integrar hook y reemplazar mock data

Validación

Build Backend

npx tsc --noEmit
Exit code: 0  # ✅ Sin errores

Build Frontend

npm run type-check
# Errores pre-existentes no relacionados con cambios
# Archivos modificados: Sin errores nuevos

Datos Mock Restantes

Los siguientes datos aún usan mock y requieren endpoints adicionales en futuros ciclos:

Variable Ubicación Endpoint Requerido
students TeacherGamification.tsx:100-126 GET /teacher/classrooms/:id/students/economy
achievements TeacherGamification.tsx:128-157 GET /gamification/achievements/classroom-stats
economyConfig TeacherGamification.tsx:159-174 GET /admin/gamification/config (read-only)

Trazabilidad

GAP ID Historia Archivo Principal Estado
GAP-ST-001 - teacher-classrooms-crud.service.ts RESUELTO
GAP-ST-002 - classroom-response.dto.ts RESUELTO
GAP-ST-003 - classroom-response.dto.ts RESUELTO
GAP-ST-004 - classroom-response.dto.ts RESUELTO
GAP-ST-005 - analytics.service.ts + TeacherGamification.tsx RESUELTO

Próximos Pasos Recomendados

  1. Implementar endpoint de estudiantes con economía (students mock data)
  2. Implementar stats de achievements por classroom (achievements mock data)
  3. Exponer config de gamificación en read-only para teachers
  4. Agregar historical trends con tracking real de transacciones diarias

Documentado por: Claude Code (Architecture-Analyst) Validado: 2025-11-24