15 KiB
Estado Actual de la Migración y Arquitectura Objetivo
Sistema Integral de Gestión de Aulas, Cursadas y Seguimiento Académico — UniCABA
Rol: Arquitecto de Software y Analista Funcional Senior
Institución: Universidad de la Ciudad de Buenos Aires (UniCABA)
Fecha de Actualización: 19 de Septiembre de 2026
Rama Activa: testing
1. De Dónde Venimos: La Versión Monolítica (legacy_admin-edu-space)
La versión original del sistema correspondía a un monolito clásico desarrollado en Python (Flask) con renderizado del lado del servidor mediante plantillas Jinja2 y ORM SQLAlchemy:
[Cliente Web / Navegador]
│
▼ (HTTP / HTML)
┌────────────────────────────────────────────────────────┐
│ Monolito Legacy (legacy_admin-edu-space) │
│ - Rutas Flask con render_template (Jinja2) │
│ - Sesión en Cookies de Flask (Flask-Login con estado) │
│ - Consultas directas SQLAlchemy acopladas a vistas │
│ - Base de Datos (SQLite / PostgreSQL) │
└────────────────────────────────────────────────────────┘
Fortalezas Heredadas del Monolito
- Modelado de Dominio Inicial: Entidades base para Sedes (
Building), Aulas (Classroom), Materias (Subject), Comisiones (Commission), Reservas (Reservation) y Usuarios (User). - Importador de Planillas Oficiales: Módulo de sincronización con Google Sheets para alimentar la cartelera con la oferta de comisiones y clases.
- Algoritmo Genético Experimental: Prototipo de optimización predictiva para asignación de aulas físicas según aforo y equipamiento.
Limitaciones Críticas que Forzaron la Migración
- Acoplamiento Servidor-Vista: Lógica de negocio mezclada dentro de controladores web y macros de plantillas Jinja2, impidiendo el consumo móvil (app institucional) o integraciones externas (SIU Guaraní, Moodle).
- Fallas Graves en Virtualidad: El importador de Google Sheets descartaba más del 75% de las clases virtuales por asumir que el aula
Campus Virtual · VIRTUALsufría colisiones físicas de horario ante comisiones simultáneas. - Falta de Perspectiva por Rol: El dashboard era único y uniforme; no distinguía entre el trabajo administrativo de Bedelía, la consulta rápida de cursada del Alumno, o la gestión evaluativa del Docente.
- Escalabilidad y Seguridad: Autenticación dependiente de la sesión en memoria del servidor web, sin soporte de tokens JWT sin estado ni separación de responsabilidades (BFF pattern).
2. Dónde Estamos Actualmente: Arquitectura Desacoplada Backend-BFF
La infraestructura ha sido transformada en un modelo desacoplado y de alta disponibilidad:
[ Navegador Web / Cliente ]
│
│ (HTTP / HTML + Cookies HttpOnly)
▼
┌──────────────────────────────────────────────┐
│ Frontend BFF (Node.js + Express) │
│ Puerto: 3000 │
│ - Renderizado Nunjucks con herencia limpia │
│ - Orquestación y agregación de UI │
│ - Gestión de Cookie JWT y Contexto de Rol │
│ - Cliente Axios con Interceptor Bearer │
└──────────────────────┬───────────────────────┘
│
│ (REST JSON / JWT Bearer)
▼
┌──────────────────────────────────────────────┐
│ Backend Core API (Python + Flask) │
│ Puerto: 5000 │
│ - Endpoints RESTful bajo /api/v1/ │
│ - Autenticación Stateless JWT (HS256) │
│ - Pipeline Enterprise SecurityFilterChain │
│ - Capa de Servicios y DTOs (Pydantic) │
│ - Persistencia SQLAlchemy (Transaccional) │
└──────────────────────┬───────────────────────┘
│
▼
[ Base de Datos SQLite / PG ]
Estado de Implementación al Día de la Fecha
| Componente / Módulo | Estado en Legacy | Estado Actual (Backend API + BFF) | Nivel de Paridad |
|---|---|---|---|
| Autenticación & Sesión | Flask-Login basado en sesión de servidor | Autenticación REST JWT con cookie HttpOnly segura y RBAC centralizado | 120% (Superado) |
| Dashboards por Rol | Dashboard monolítico único para todos | 4 Dashboards especializados (admin, bedelia, docente, alumno) con selector dinámico |
150% (Superado) |
| Campus Virtual & Enlaces | Colisión de clases virtuales; pérdida de enlaces Meet | Aulas virtuales concurrentes sin límite, auto-generación de enlaces Google Meet por comisión | 140% (Superado) |
| Importador Google Sheets | 363 reservas importadas (colisiones masivas) | 643 reservas totales (388 virtuales) sin colisión horaria entre comisiones | 100% (Paridad Total) |
Cartelera del Día (today_schedule) |
Vista Jinja con bloques rígidos | Timeline interactivo por horas (7 a 21 hs), filtros por piso/turno y switch hide_virtual |
110% (Superado) |
Ficha de Reserva (view_reservation) |
Vista monolítica rígida | Acoplada al BFF con relaciones anidadas completas, edición en cascada, confirmación y cancelación | 100% (Paridad Total) |
Gestión de Comisiones (commissions_list) |
Lista plana sin modal de creación en admin | Modal #modalAddCommission con vinculación obligatoria a Asignatura, docente, cupo, horarios y Meet |
125% (Superado) |
| Calendario FullCalendar | Feed JSON básico | Endpoint /api/v1/reservations con discriminación cromática (#6366F1 virtuales) |
100% (Paridad Total) |
3. A Dónde Queremos Ir: El Sistema Integral UniCABA
El objetivo institucional es consolidar la plataforma como el ERP Académico y Gestor de Espacios Oficial de UniCABA, dando soporte a las dinámicas pedagógicas físicas y digitales de la universidad.
A. Entorno Físico vs. Campus Virtual
- Edificio Físico (Central):
- Espacios con aforo estrictamente limitado, asignación por piso/ala y equipamiento técnico (proyectores, laboratorios informáticos, acústica).
- Validación matemática de no-solapamiento temporal para evitar doble asignación de aula física.
- Campus Virtual:
- Capacidad física infinita; asignación lógica de salas vinculadas a la plataforma oficial (Google Meet institucional, Zoom o Microsoft Teams).
- Control de concurrencia temporal de docentes y estudiantes (evitar que un docente o alumno deba estar en dos salas remotas al mismo tiempo).
4. Reglas de Negocio del Sistema Objetivo
1. Perfiles y Permisos (RBAC Avanzado)
- Administrador General (Superadmin):
- Gobernanza total del sistema, configuración de periodos y parametrización de reglas de conflicto.
- Modo Impersonación / Vista Previa: Visualización en tiempo real del sistema desde la perspectiva exacta de cualquier usuario (Bedelía, Docente, Alumno) para soporte y auditoría.
- Flexibilidad académica para autorizar excepciones de cursada simultánea y apertura de comisiones extraordinarias.
- Bedelía / Gestión Operativa:
- Administración integral del inventario físico (Sedes, Edificios, Pisos, Aulas) y virtual.
- Creación y parametrización de Ciclos Lectivos, Asignaturas y Comisiones.
- Asignación Docente Co-docente: Posibilidad de asignar más de un profesor a una misma comisión (equipo de cátedra: titulares, adjuntos, ayudantes).
- Gestión de cupos máximos, padrón de alumnos matriculados y resolución de conflictos de asignación.
- Supervisión de hitos evaluativos institucionales.
- Docente:
- Vista segmentada estrictamente a sus comisiones asignadas.
- Calendario de clases presenciales y accesos directos a sesiones de videoconferencia.
- Gestión del calendario de evaluación: carga de fechas de parciales, recuperatorios, entregas de trabajos prácticos y finales.
- Matriz ágil de carga y edición de calificaciones y estados de regularidad.
- Alumno:
- Acceso enfocado a sus materias cursadas en el periodo lectivo activo.
- Brújula de cursada diaria (¿Dónde curso hoy? con sede, piso y aula física o enlace virtual).
- Calendario unificado de entregas de TPs, parciales y finales con avisos preventivos.
- Consulta histórica de notas y retroalimentaciones pedagógicas.
2. Estructura Académica y Ciclo Lectivo
- Ciclo Lectivo Flexible: Estructurado por Año (ej.
2026) y Periodos estándar (1C,2C,Anual), permitiendo el alta de "Cursos Cortos Intensivos" o trayectos formativos extracurriculares con fechas especiales. - Restricción Diaria de Cursada del Estudiante:
- Regla por defecto: Un estudiante universitario no puede cursar dos asignaturas regulares el mismo día calendario.
- Excepción parametrizable: Se autoriza la coincidencia en el mismo día si una de las materias corresponde a un curso corto intensivo o mediante autorización explícita de Bedelía/Secretaría Académica.
3. Matriz de Conflictos y Validaciones de Solapamiento
flowchart TD
Req([Solicitud de Asignación / Reserva]) --> V1{¿Es Aula Física?}
V1 -- Sí --> C1{¿Aula ocupada en ese día y horario?}
C1 -- Sí --> Err1[BLOQUEO: Conflicto Físico Infranqueable]
C1 -- No --> C2{¿Aforo de alumnos <= Capacidad aula?}
C2 -- No --> Err2[BLOQUEO: Aforo Excedido]
C2 -- Sí --> V2
V1 -- No (Virtual) --> V2
V2{¿Docente en otra clase en el mismo horario?}
V2 -- Sí --> C3{¿Comisión cuenta con Co-Docencia?}
C3 -- No --> Err3[BLOQUEO: Conflicto Docente]
C3 -- Sí --> Warn1[ALERTA: Excepción Co-Docente Justificada]
C3 --> V3
V2 -- No --> V3
V3{¿Alumno cursa otra materia regular el mismo día?}
V3 -- Sí --> C4{¿Es Curso Corto o Autorizado?}
C4 -- No --> Err4[BLOQUEO: Regla Restricción Diaria]
C4 -- Sí --> Ok[ASIGNACIÓN EXITOSA]
V3 -- No --> Ok
5. Diseño Técnico: Base de Datos Relacional Normalizada
Para soportar las reglas de co-docencia, inscripciones, evaluaciones y restricciones de día, el esquema de datos evolucionará hacia la siguiente estructura:
Entidades Principales
academic_terms(Ciclos Lectivos):id,name,code(ej. '2026-1C'),year,term_type('1C', '2C', 'ANUAL', 'CORTO'),start_date,end_date,is_active.subjects(Materias / Asignaturas):id,code,name,career_id,is_short_course(boolean),credits,active.commissions(Comisiones de Cursada):id,subject_id,term_id,code,shift,schedule_display,max_students,virtual_link,active.commission_teachers(Co-docencia / Equipo Docente):id,commission_id,teacher_id,role('TITULAR', 'ADJUNTO', 'AYUDANTE'),can_grade(boolean).commission_schedules(Asignación Horaria y Espacial):id,commission_id,day_of_week(1=Lunes .. 7=Domingo),start_time,end_time,classroom_id(física o virtual),is_virtual.- Constraint de Integridad:
UNIQUE(classroom_id, day_of_week, start_time, end_time)para aulas no virtuales.
enrollments(Inscripciones de Alumnos):id,commission_id,student_id,status('REGULAR', 'CONDICIONAL', 'LIBRE', 'PROMOVIDO'),enrolled_at,allow_same_day_exception(boolean).evaluation_milestones(Hitos Evaluativos):id,commission_id,milestone_type_id,title,date,start_time,weight_percentage,is_mandatory.student_grades(Calificaciones y Actas):id,milestone_id,student_id,numeric_score,concept_score,feedback,graded_by_teacher_id,graded_at.
6. Diseño de Contratos de API RESTful (Backend Core)
A. Módulo de Comisiones y Co-docencia
GET /api/v1/commissions: Filtro por término académico, carrera, asignatura, turno y estado.POST /api/v1/commissions: Alta de comisión vinculada a una asignatura con generación automática de Meet.POST /api/v1/commissions/{id}/teachers: Asignación de docentes con rol en cátedra (co-docencia).DELETE /api/v1/commissions/{id}/teachers/{teacher_id}: Desvinculación de docente.
B. Módulo de Matriz de Conflictos y Validación
POST /api/v1/schedules/validate:- Payload:
{ commission_id, classroom_id, day_of_week, start_time, end_time, teacher_ids, student_ids } - Respuesta:
{ valid: boolean, conflicts: [ { type: 'PHYSICAL'|'TEACHER'|'STUDENT_DAILY', message, details } ] }
- Payload:
C. Módulo de Hitos Evaluativos y Libro de Calificaciones
GET /api/v1/commissions/{id}/milestones: Listado de exámenes, entregas y parciales.POST /api/v1/commissions/{id}/milestones: Creación de hito evaluativo.GET /api/v1/commissions/{id}/gradebook: Matriz completa de alumnos y notas de la comisión.PUT /api/v1/commissions/{id}/gradebook: Carga masiva o individual de calificaciones por docente.
D. Modo Impersonación de Superadmin
- Cabecera HTTP:
X-Impersonate-User: {user_id} - Procesamiento en
authMiddleware: Si el token emisor corresponde al rolSUPERADMIN, el contexto de ejecución adopta los permisos y vistas del usuario destino para auditoría, dejando registro enaudit_logs.
7. Directrices UI/UX para el Frontend BFF
- Panel de Bedelía:
- Grilla interactiva semanal (tipo TimeGrid) donde los bloques de comisiones se visualizan codificados por color según edificio, aula física o aula virtual.
- Detección inmediata de colisiones con carteles de advertencia flotantes antes de confirmar cambios.
- Matriz de Carga Rápida para Docentes:
- Tabla editable en línea (spreadsheet-like) para volcar notas de parciales y entregas sin recargar la página, con autoguardado asíncrono.
- Perspectiva del Alumno:
- Interfaz simplificada con diseño enfocado en dispositivos móviles, mostrando en la tarjeta de inicio la clase del momento con botón directo para ingresar a la videollamada o indicador de piso y aula física.
8. Conclusión del Diagnóstico
El sistema ha superado con éxito la fase de desacople inicial y estabilización de virtualidad:
- Se logró paridad total con
legacy_admin-edu-spaceen importación de cronograma y cartelera. - Se eliminaron las fallas de colisión virtual y se establecieron los 4 dashboards por rol.
- Se completó el acople de la ficha de reserva (
schedule.view_reservation) y la creación asistida de comisiones en el BFF.
Las siguientes etapas se concentrarán en la consolidación de las reglas académicas complejas (co-docencia, restricción diaria de cursada, matriz de conflictos y libro de calificaciones) detalladas en el ROADMAP_MVP.md.