5.8 KiB
5.8 KiB
Changelog: Corrección del Importador de Google Sheets, Clases Virtuales y Dashboards por Rol
Fecha: 18 de Septiembre de 2026
Rama: testing
Autor: Antigravity AI Assistant
1. Resumen Ejecutivo
Se investigó y resolvió la causa por la cual el importador de horarios desde Google Sheets no traía la totalidad de las clases virtuales ni se mostraban correctamente en las vistas del sistema (Cartelera de Hoy, Catálogo de Aulas Virtuales, Cronograma y Dashboards), tal como ocurría en la versión legacy.
Causas Raíz Identificadas:
- Colisión de Horarios en Aulas Virtuales durante el Sync (
sheets_importer.py):- En la versión original, al buscar una reserva preexistente (
Reservation.query.filter_by(classroom_id=classroom.id, start_time=dt_start, end_time=dt_end).first()), todas las clases virtuales apuntaban al mismo espacio (Campus Virtual · VIRTUAL). - Cuando múltiples comisiones de diferentes asignaturas cursaban de manera virtual en la misma franja horaria (por ejemplo, jueves de 17:30 a 21:30 hs donde hay 13 comisiones simultáneas), el importador encontraba la primera reserva creada y descartaba las restantes 12 clases simultáneas actualizando únicamente notas/turno. Esto descartaba más del 75% de las clases virtuales de la planilla.
- En la versión original, al buscar una reserva preexistente (
- Ausencia de Enlace Virtual Automático:
- Las reservas virtuales se generaban sin enlace de videollamada (
virtual_link = None), impidiendo que los botones de acceso directo ("Unirse a Videollamada / Zoom / Meet") se renderizaran en las vistas.
- Las reservas virtuales se generaban sin enlace de videollamada (
- Serialización Incompleta en la API Backend (
api/v1/reservations):- El endpoint
/api/v1/reservationsretornaba diccionarios planos sin el objeto anidadoclassroom, omitiendo propiedades críticas comois_virtual,effective_virtual_link,subject_name,subject_codeylocation_display.
- El endpoint
- Falta de Agregación de Salas Virtuales en el BFF Node.js (
classrooms.js):- En el catálogo de aulas (
/classrooms/list_classrooms?view_mode=virtual), la plantilla esperaba un arreglovirtual_roomsagrupado por comisión con métricas de demanda (today_count,week_count,month_count) yglobal_virtual_metrics. El controlador Node no las generaba, dejando la vista vacía.
- En el catálogo de aulas (
- Rutas y Vista de Cartelera del Día (
schedule.jsyapp.js):/schedule/today_scheduleno estaba mapeado directamente en el enrutador de Express y su redirección descartaba parámetros de búsqueda (hide_virtual,shift,floor).- El controlador no calculaba
time_blocks(horas 7 a 21), provocando queschedule/today.htmlcayera en la condición vacía ("No hay reservas programadas para hoy").
2. Soluciones Implementadas
A. Backend Python (backend/app/services/sheets_importer.py)
- Se diferenció la comprobación de unicidad para aulas virtuales: al tratarse de espacios con concurrencia ilimitada, la consulta de reserva existente incluye
commission_id=commission.id. - Se implementó la generación automática de enlaces de reunión seguros (
https://meet.google.com/edu-{subject_code}-{commission_code}) para todas las clases y comisiones en modalidad virtual. - Resultado del re-sync: Se procesaron 239 filas de las 6 hojas semanales, añadiendo 280 reservas que antes colisionaban, alcanzando 388 reservas virtuales activas en la base de datos con sus respectivos enlaces de videollamada.
B. Endpoint de Reservas (backend/app/routes/api/reservations.py)
- Se enriqueció la serialización de reservas incorporando:
- Objeto anidado
classroomconcode,floor,floor_display,is_virtualylocation_display. - Objeto
commissionconcodeyvirtual_link. - Propiedades computadas
subject_name,subject_code,effective_virtual_linkeis_virtual.
- Objeto anidado
- Se añadieron filtros por query params:
hide_virtual,floor,shiftysearch.
C. Catálogo de Aulas Virtuales (frontend/src/routes/classrooms.js)
- Para
view_mode === 'virtual', se implementó la agregación de reservas por comisión, calculando:virtual_rooms: Listado con código de comisión, asignatura, enlace de videollamada, cupo, turno y conteos de sesiones (Hoy, Semana, Mes).global_virtual_metrics: Contadores globales de clases remotas de hoy, semana, mes y comisiones con entorno virtual activo.- Asignación de
virtual_classroom_idpara enlaces de gestión.
D. Cartelera del Día (frontend/src/routes/schedule.js y frontend/src/app.js)
- Se unificaron las rutas
/todayy/today_schedule. - Se implementó el generador de
time_blockspara las franjas horarias de 7:00 a 22:00 hs. - Se implementó soporte completo para el switch "Ocultar Aulas Virtuales" (
hide_virtual=1), filtros por piso y por turno. - Se preservan los query params en todas las redirecciones de Express.
E. Dashboards Personalizados por Rol (frontend/views/dashboard.html y dashboard.js)
- Habilitación de paneles operativos específicos para Bedelía, Docente / Profesor, Alumno / Estudiante y Administrador, con selector dinámico en el banner superior.
3. Pruebas y Verificación
Se ejecutó la suite de verificación automatizada:
- Catálogo de Aulas Virtuales (
/classrooms/list_classrooms?view_mode=virtual):- Status:
200 OK. - Renderiza tarjetas
virtual-room-cardcon enlaces a Google Meet y badges "Remoto ∞".
- Status:
- Cartelera del Día (
/schedule/today_schedule):- Status:
200 OK. - Muestra timeline cronológico por horas con clases presenciales y virtuales.
- Botón
hide_virtual=1filtra instantáneamente las aulas virtuales.
- Status:
- Calendario General (
/schedule/calendar_data):- 643 eventos en calendario (388 virtuales identificados con
#6366F1y enlaces activos).
- 643 eventos en calendario (388 virtuales identificados con
- Vistas Principales:
- 11/11 rutas pasaron con código 200 sin errores de plantilla ni excepciones de servidor.