docs: estado de migracion, arquitectura objetivo UniCABA, roadmap MVP y changelog oficial
This commit is contained in:
@@ -0,0 +1,76 @@
|
|||||||
|
# Changelog Oficial — Admin Edu-Space (UniCABA)
|
||||||
|
|
||||||
|
Todas las modificaciones notables a este proyecto serán documentadas en este archivo.
|
||||||
|
El formato está basado en [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y este proyecto se adhiere a [Semantic Versioning](https://semver.org/lang/es/).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
### Planificado (Fase 2 del Roadmap MVP)
|
||||||
|
- **Co-docencia en Cátedras:** Asignación de múltiples profesores (titular, adjunto, ayudante) a una misma comisión.
|
||||||
|
- **Matriz de Conflictos:** Detección de solapamiento físico, docente y control de aforo en tiempo real.
|
||||||
|
- **Regla de Restricción Diaria del Alumno:** Validación para impedir cursar dos materias regulares el mismo día, con motor de excepciones para cursos cortos o autorización de Bedelía.
|
||||||
|
- **Libro de Calificaciones (*Gradebook*):** Carga rápida de notas y seguimiento de regularidad.
|
||||||
|
- **Grilla Semanal Drag & Drop:** Asignación visual interactiva para la oficina de Bedelía.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.1.0] - 2026-09-19
|
||||||
|
### Añadido
|
||||||
|
- **Ficha Detallada de Reserva (`schedule.view_reservation`):**
|
||||||
|
- Implementación en BFF Node.js de la ruta `/schedule/view_reservation` (soportando parámetros `:id`, `?id=` o selección automática del primer registro).
|
||||||
|
- Vistas y controladores para modificar reservas con selectores en cascada (`/schedule/edit_reservation`).
|
||||||
|
- Endpoints de acción rápida en backend y BFF: `POST /schedule/confirm_reservation` y `POST /schedule/cancel_reservation`.
|
||||||
|
- Actualización de enlaces en `today.html`, `list.html`, `dashboard.html` y `view.html` para navegar directamente con el identificador de la reserva (`?id=...`).
|
||||||
|
- **Creación y Asociación de Comisiones a Asignaturas (`admin/commissions_list`):**
|
||||||
|
- Botón destacado `+ Nueva Comisión` en el encabezado y en el estado vacío de la tabla.
|
||||||
|
- Modal interactivo `#modalAddCommission` con selección obligatoria y clara de la **Asignatura / Materia Asociada** (`<select name="subject_id" required>`), mostrando código oficial, nombre y carrera.
|
||||||
|
- Campos completos de cursada: cuatrimestre (1C/2C/Anual), año lectivo, turno, docente a cargo, cupo máximo y días/horarios.
|
||||||
|
- Generación y configuración automática de enlace a Google Meet institucional cuando no se ingresa un enlace personalizado.
|
||||||
|
- Alerta de confirmación visual (`?created=1`) al registrar y vincular una comisión exitosamente.
|
||||||
|
- Tabla de comisiones actualizada con visualización explícita del código de materia, nombre y badge de carrera.
|
||||||
|
- **Enriquecimiento de la API REST:**
|
||||||
|
- Endpoint `GET /api/v1/reservations/<id>` ampliado con objetos relacionales anidados: `classroom` (código, edificio, piso, capacidad, descripción, virtualidad), `commission` (código, código compuesto, materia), `user` (docente, nombre, apellido, correo), duración en minutos y enlaces virtuales.
|
||||||
|
- Endpoint `POST /api/v1/admin/commissions` con validación estricta de existencia de asignatura y resolución inteligente de unicidad.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.0.0] - 2026-09-18
|
||||||
|
### Añadido
|
||||||
|
- **Reingeniería de Arquitectura Fullstack (Desacople Monolito -> Backend + BFF):**
|
||||||
|
- Desacople completo del backend Python/Flask como una **API REST pura** bajo `/api/v1/` retornando exclusivamente JSON.
|
||||||
|
- Implementación del **Frontend BFF** en Node.js + Express con renderizado de servidor mediante Nunjucks.
|
||||||
|
- Autenticación sin estado (*Stateless*) basada en tokens JWT firmados con algoritmo HS256.
|
||||||
|
- Almacenamiento seguro del token de acceso en cookies del navegador con directivas `HttpOnly`, `SameSite=Lax` y `Secure`.
|
||||||
|
- Inyección transparente del token `Bearer` en peticiones internas mediante cliente Axios centralizado.
|
||||||
|
- **Dashboards Personalizados por Rol Institucional:**
|
||||||
|
- **Dashboard de Bedelía (`/dashboard?role=bedelia`):** Métricas operativas de campus físico y virtual, cartelera del día y panel de aprobación de solicitudes pendientes.
|
||||||
|
- **Dashboard de Docente (`/dashboard?role=docente`):** Sesiones del día con botones directos para ingresar a reuniones virtuales (Meet/Teams/Zoom) y formulario de solicitud de aulas.
|
||||||
|
- **Dashboard de Alumno (`/dashboard?role=alumno`):** Brújula de cursada *"¿Dónde curso hoy?"* con ubicación por piso/aula o enlace virtual, junto al calendario de exámenes y entregas.
|
||||||
|
- **Dashboard de Administrador (`/dashboard?role=admin`):** Cockpit institucional de capacidad, usuarios, auditoría RBAC y distribución de comisiones.
|
||||||
|
- Selector dinámico de vista previa de roles en el banner superior para administradores.
|
||||||
|
- **Cartelera del Día Interactiva (`/schedule/today_schedule`):**
|
||||||
|
- Grilla estructurada en bloques horarios (07:00 a 21:00 hs) con métricas en tiempo real de ocupación y reservas confirmadas/pendientes.
|
||||||
|
- Filtro dinámico para ocultar clases virtuales (`hide_virtual=1`) y segmentación por pisos o turnos.
|
||||||
|
- **Seguridad Enterprise (SecurityFilterChain):**
|
||||||
|
- Pipeline centralizado de cabeceras de blindaje OWASP (`nosniff`, `SAMEORIGIN`, `X-XSS-Protection`, `Strict-Transport-Security`).
|
||||||
|
- Rate limiting dinámico contra ataques de fuerza bruta en endpoints de autenticación.
|
||||||
|
|
||||||
|
### Corregido
|
||||||
|
- **Resolución de Colisión de Horarios en Clases Virtuales (Importador de Google Sheets):**
|
||||||
|
- Corrección de la búsqueda de duplicados en `sheets_importer.py` que limitaba indebidamente la unicidad a `(classroom_id, start_time, end_time)`.
|
||||||
|
- Habilitación de concurrencia ilimitada para el aula virtual (`Campus Virtual · VIRTUAL`) mediante discriminación por `commission_id`.
|
||||||
|
- El total de reservas registradas aumentó de **363 a 643** (incorporando **280 clases virtuales** que eran descartadas por falso conflicto).
|
||||||
|
- Generación y guardado automático de enlaces institucionales de Google Meet (`https://meet.google.com/edu-{materia}-{comision}`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-09-04
|
||||||
|
### Añadido
|
||||||
|
- **Versión Monolítica Base (`legacy_admin-edu-space`):**
|
||||||
|
- Aplicación monolítica en Flask con plantillas Jinja2 y persistencia SQLAlchemy (SQLite / PostgreSQL).
|
||||||
|
- Modelado de datos inicial para sedes, aulas físicas, materias, comisiones, usuarios y reservas.
|
||||||
|
- Sistema de roles inicial (Admin, Bedelía, Docente, Alumno) basado en sesión tradicional de Flask-Login.
|
||||||
|
- Calendario de reservas mensual y semanal con FullCalendar.
|
||||||
|
- Prototipo experimental de algoritmo genético para optimización de ocupación áulica.
|
||||||
|
- Módulo de sincronización inicial con planillas de Google Sheets.
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
# 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
|
||||||
|
1. **Modelado de Dominio Inicial:** Entidades base para Sedes (`Building`), Aulas (`Classroom`), Materias (`Subject`), Comisiones (`Commission`), Reservas (`Reservation`) y Usuarios (`User`).
|
||||||
|
2. **Importador de Planillas Oficiales:** Módulo de sincronización con Google Sheets para alimentar la cartelera con la oferta de comisiones y clases.
|
||||||
|
3. **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 · VIRTUAL` sufrí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
|
||||||
|
1. **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.
|
||||||
|
2. **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
|
||||||
|
```mermaid
|
||||||
|
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
|
||||||
|
1. **`academic_terms` (Ciclos Lectivos):** `id`, `name`, `code` (ej. '2026-1C'), `year`, `term_type` ('1C', '2C', 'ANUAL', 'CORTO'), `start_date`, `end_date`, `is_active`.
|
||||||
|
2. **`subjects` (Materias / Asignaturas):** `id`, `code`, `name`, `career_id`, `is_short_course` (boolean), `credits`, `active`.
|
||||||
|
3. **`commissions` (Comisiones de Cursada):** `id`, `subject_id`, `term_id`, `code`, `shift`, `schedule_display`, `max_students`, `virtual_link`, `active`.
|
||||||
|
4. **`commission_teachers` (Co-docencia / Equipo Docente):** `id`, `commission_id`, `teacher_id`, `role` ('TITULAR', 'ADJUNTO', 'AYUDANTE'), `can_grade` (boolean).
|
||||||
|
5. **`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.
|
||||||
|
6. **`enrollments` (Inscripciones de Alumnos):** `id`, `commission_id`, `student_id`, `status` ('REGULAR', 'CONDICIONAL', 'LIBRE', 'PROMOVIDO'), `enrolled_at`, `allow_same_day_exception` (boolean).
|
||||||
|
7. **`evaluation_milestones` (Hitos Evaluativos):** `id`, `commission_id`, `milestone_type_id`, `title`, `date`, `start_time`, `weight_percentage`, `is_mandatory`.
|
||||||
|
8. **`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 } ] }`
|
||||||
|
|
||||||
|
### 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 rol `SUPERADMIN`, el contexto de ejecución adopta los permisos y vistas del usuario destino para auditoría, dejando registro en `audit_logs`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Directrices UI/UX para el Frontend BFF
|
||||||
|
|
||||||
|
1. **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.
|
||||||
|
2. **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.
|
||||||
|
3. **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-space` en 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`**.
|
||||||
@@ -108,6 +108,9 @@ node src/app.js
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 📚 Documentación Técnica & Changelogs
|
## 📚 Documentación Técnica & Changelogs
|
||||||
* [Changelog: Clases Virtuales, Importador y Dashboards](docs/CHANGELOG_VIRTUAL_CLASSES_AND_DASHBOARDS.md)
|
* [Estado de la Migración y Arquitectura Objetivo UniCABA](ESTADO_MIGRACION_Y_ARQUITECTURA_OBJETIVO.md)
|
||||||
|
* [Roadmap MVP: Fases y Estadios del Proyecto](ROADMAP_MVP.md)
|
||||||
|
* [Changelog Oficial del Proyecto](CHANGELOG.md)
|
||||||
|
* [Changelog Detallado: Clases Virtuales y Dashboards](docs/CHANGELOG_VIRTUAL_CLASSES_AND_DASHBOARDS.md)
|
||||||
* [Auditoría y Sesión de Reingeniería](docs/CHANGELOG_SESSION.md)
|
* [Auditoría y Sesión de Reingeniería](docs/CHANGELOG_SESSION.md)
|
||||||
* [Guía de Integración de Cronograma](docs/SCHEDULE_INTEGRATION_GUIDE.md)
|
* [Guía de Integración de Cronograma](docs/SCHEDULE_INTEGRATION_GUIDE.md)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
# ROADMAP MVP — Sistema Integral UniCABA
|
||||||
|
## Gestión de Espacios Áulicos, Actividad de Cursada y Seguimiento Académico
|
||||||
|
|
||||||
|
**Institución:** Universidad de la Ciudad de Buenos Aires (UniCABA)
|
||||||
|
**Versión:** 2.1.0
|
||||||
|
**Fecha de Actualización:** 19 de Septiembre de 2026
|
||||||
|
**Rama Base:** `testing`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🗺️ Visión del Proyecto
|
||||||
|
Construir y evolucionar la plataforma de gestión académica y espacial de **UniCABA** hacia un sistema integral de clase universitaria, desacoplado en una arquitectura **Backend RESTful (Python/Flask) + Frontend BFF (Node.js/Express/Nunjucks)**, capaz de gobernar tanto los espacios físicos de la sede central como la dinámica áulica del campus virtual, garantizando una experiencia fluida para **Administradores**, **Bedelía**, **Docentes** y **Estudiantes**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Estado Global de Progreso
|
||||||
|
|
||||||
|
```
|
||||||
|
Fase 0: Desacople y Arquitectura Base [████████████████████] 100% (Completado)
|
||||||
|
Fase 1: Paridad Legacy y Estabilización [████████████████████] 100% (Completado)
|
||||||
|
Fase 2: Co-docencia y Matriz Conflictos [░░░░░░░░░░░░░░░░░░░░] 0% (Próxima)
|
||||||
|
Fase 3: Hitos Evaluativos y Calificaciones[░░░░░░░░░░░░░░░░░░░░] 0% (Planificada)
|
||||||
|
Fase 4: UI/UX Drag & Drop e Impersonación[░░░░░░░░░░░░░░░░░░░░] 0% (Planificada)
|
||||||
|
Fase 5: Despliegue Producción e Integrac.[░░░░░░░░░░░░░░░░░░░░] 0% (Planificada)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Detalle de Fases y Estadios
|
||||||
|
|
||||||
|
### Fase 0: Desacople y Arquitectura Base ✅ *(Completada)*
|
||||||
|
* **Objetivo:** Separar el monolito Jinja2 legacy en dos servicios independientes de alto rendimiento.
|
||||||
|
* **Entregables:**
|
||||||
|
* [x] Creación del Backend Flask como API REST pura bajo `/api/v1/` retornando exclusivamente JSON.
|
||||||
|
* [x] Implementación del Frontend BFF en Node.js + Express con renderizado de plantillas mediante Nunjucks.
|
||||||
|
* [x] Autenticación desacoplada mediante JWT (`access_token`) transportado en Cookie `HttpOnly` segura.
|
||||||
|
* [x] Pipeline de seguridad `SecurityFilterChain` con cabeceras de blindaje OWASP y rate limiting dinámico.
|
||||||
|
* [x] Cliente HTTP Axios centralizado con inyección automática de Bearer token y manejo de sesiones.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Fase 1: Paridad Legacy, Estabilización de Virtualidad y BFF Core ✅ *(Completada)*
|
||||||
|
* **Objetivo:** Alcanzar paridad funcional total con la versión legacy, subsanando defectos críticos de virtualidad y dotando de interfaz específica a cada rol.
|
||||||
|
* **Entregables:**
|
||||||
|
* [x] **Importador de Google Sheets Corregido:**
|
||||||
|
* Eliminación de la colisión de horarios en el aula virtual única (`Campus Virtual · VIRTUAL`).
|
||||||
|
* Incremento de reservas registradas de 363 a 643 (incorporando 280 clases virtuales que se descartaban).
|
||||||
|
* Generación y persistencia automática de enlaces de Google Meet institucional por comisión y reserva.
|
||||||
|
* [x] **Dashboards Especializados por Rol:**
|
||||||
|
* Dashboard interactivo para **Bedelía** (aulas físicas, salas virtuales, aprobaciones pendientes).
|
||||||
|
* Dashboard interactivo para **Docente** (clases del día, comisiones, enlaces directos a Meet).
|
||||||
|
* Dashboard interactivo para **Alumno** (brújula de cursada *"¿Dónde curso hoy?"*, hitos y calendario).
|
||||||
|
* Cockpit institucional para **Admin** (métricas de capacidad, auditoría RBAC, demanda mensual).
|
||||||
|
* Selector dinámico de vista previa / roles en tiempo real (`?role=...`).
|
||||||
|
* [x] **Cartelera del Día (`today_schedule`):**
|
||||||
|
* Grilla temporal por bloques horarios (07:00 a 21:00 hs) con indicadores físicos y virtuales.
|
||||||
|
* Filtro dinámico para ocultar clases virtuales (`hide_virtual=1`) y segmentación por piso o turno.
|
||||||
|
* [x] **Acople de Ficha de Reserva (`schedule.view_reservation`):**
|
||||||
|
* Ruteo en BFF (`/schedule/view_reservation?id=...` y `/view/:id`).
|
||||||
|
* Endpoint REST `/api/v1/reservations/<id>` con enriquecimiento relacional (aula, comisión, docente).
|
||||||
|
* Soporte para modificar reserva (`edit_reservation`) con selectores en cascada, confirmación y cancelación.
|
||||||
|
* [x] **Gestión de Comisiones (`admin/commissions_list`):**
|
||||||
|
* Botón y modal interactivo `+ Nueva Comisión` (`#modalAddCommission`).
|
||||||
|
* Vinculación obligatoria y explícita a la **Asignatura / Materia**, indicando cuatrimestre, año lectivo, turno, docente a cargo, cupo y enlace virtual.
|
||||||
|
* Visualización en tabla de la materia vinculada con su código y carrera asociada.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Fase 2: Co-docencia, Matriz de Conflictos y Regla Diaria ⏳ *(En curso / Inmediata)*
|
||||||
|
* **Objetivo:** Implementar las reglas de negocio académicas complejas para asignación de cátedras y cursada de alumnos.
|
||||||
|
* **Estadios:**
|
||||||
|
1. **Estadio 2.1 — Modelo de Co-docencia:**
|
||||||
|
- [ ] Tabla relacional `commission_teachers` para soportar múltiples docentes por comisión (titulares, adjuntos, ayudantes).
|
||||||
|
- [ ] Endpoints `/api/v1/commissions/<id>/teachers` para asociar y desvincular docentes de cátedra.
|
||||||
|
- [ ] Adaptación de vistas de Bedelía y Comisiones para visualizar el equipo docente completo.
|
||||||
|
2. **Estadio 2.2 — Matriz de Conflictos y Validación:**
|
||||||
|
- [ ] Validación estricta de conflicto físico: bloqueo de doble asignación de aula en mismo día y horario.
|
||||||
|
- [ ] Validación de conflicto docente: detección de superposición horaria del profesor, con soporte de excepción justificada cuando la comisión cuenta con co-docencia.
|
||||||
|
- [ ] Validación de aforo: bloqueo cuando la cantidad de alumnos excede la capacidad del aula física.
|
||||||
|
3. **Estadio 2.3 — Regla de Restricción Diaria del Alumno:**
|
||||||
|
- [ ] Validación al matricular: un alumno no puede cursar dos asignaturas regulares en el mismo día calendario.
|
||||||
|
- [ ] Excepción parametrizable: autorización automática si al menos una de las materias es un "curso corto" o si existe autorización manual de Bedelía (`allow_same_day_exception`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Fase 3: Gestión de Hitos Evaluativos y Libro de Calificaciones 📅 *(Planificada)*
|
||||||
|
* **Objetivo:** Proveer al cuerpo docente y estudiantil el seguimiento completo de instancias evaluativas.
|
||||||
|
* **Estadios:**
|
||||||
|
1. **Estadio 3.1 — Calendario de Evaluación por Comisión:**
|
||||||
|
- [ ] Programación de parciales, recuperatorios, entregas de trabajos prácticos y exámenes finales.
|
||||||
|
- [ ] Notificaciones preventivas en el dashboard del alumno con cuenta regresiva para exámenes.
|
||||||
|
2. **Estadio 3.2 — Libro de Calificaciones (*Gradebook*):**
|
||||||
|
- [ ] Matriz de carga rápida de notas para docentes con autoguardado asíncrono.
|
||||||
|
- [ ] Consulta individualizada de calificaciones y retroalimentaciones pedagógicas para alumnos.
|
||||||
|
- [ ] Cierre de actas de regularidad y promoción para Bedelía.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Fase 4: UI/UX Avanzada para Bedelía & Modo Impersonación 🖥️ *(Planificada)*
|
||||||
|
* **Objetivo:** Dotar a la oficina de Bedelía y a la Administración de herramientas interactivas de última generación.
|
||||||
|
* **Estadios:**
|
||||||
|
1. **Estadio 4.1 — Grilla Semanal Interactiva (Drag-and-Drop):**
|
||||||
|
- [ ] Interfaz tipo TimeGrid interactiva con arrastre de comisiones para asignación rápida de aulas y turnos.
|
||||||
|
- [ ] Detección visual en tiempo real de aulas ocupadas o incompatibles.
|
||||||
|
2. **Estadio 4.2 — Modo Impersonación del Superadmin:**
|
||||||
|
- [ ] Funcionalidad de *login as* o vista previa con cabecera `X-Impersonate-User` para replicar exactamente lo que ve cualquier docente o alumno.
|
||||||
|
- [ ] Trazabilidad obligatoria de acciones bajo impersonación en el registro de auditoría (`audit_logs`).
|
||||||
|
3. **Estadio 4.3 — Integración del Optimizador Genético:**
|
||||||
|
- [ ] Acople del motor predictivo de algoritmos genéticos a la base de datos real para sugerir redistribución óptima de aulas según aforo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Fase 5: Producción Institucional, CI/CD e Integraciones 🏢 *(Planificada)*
|
||||||
|
* **Objetivo:** Puesta en marcha definitiva en la infraestructura de servidores de UniCABA.
|
||||||
|
* **Estadios:**
|
||||||
|
1. **Estadio 5.1 — Despliegue e Infraestructura:**
|
||||||
|
- [ ] `docker-compose.yml` productivo orquestando Flask (Gunicorn), Node.js BFF (PM2) y PostgreSQL 15.
|
||||||
|
- [ ] Proxy inverso Nginx con certificados SSL/TLS y compresión Brotli/Gzip.
|
||||||
|
2. **Estadio 5.2 — Integraciones Universitarias:**
|
||||||
|
- [ ] Módulo de exportación/importación compatible con SIU Guaraní 3.
|
||||||
|
- [ ] Sincronización automática de aulas virtuales con Moodle institucional.
|
||||||
|
3. **Estadio 5.3 — Pruebas de Carga y Hardening:**
|
||||||
|
- [ ] Pruebas de estrés de concurrencia en días pico de inicio de cuatrimestre (10.000 solicitudes simultáneas).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 Criterios de Aceptación del MVP
|
||||||
|
1. **Zero Colisiones Físicas:** Imposibilidad absoluta de asignar dos materias simultáneas a una misma aula física.
|
||||||
|
2. **Virtualidad Fluida:** Acceso con un clic a reuniones virtuales válidas para el 100% de las comisiones remotas.
|
||||||
|
3. **Roles Seguros:** Separación total de permisos donde ningún alumno o docente acceda a configuración global ni a datos privados de otras comisiones.
|
||||||
|
4. **Respuesta Sub-segundo:** Carga de carteleras y calendarios en menos de 300 ms en el BFF Node.js.
|
||||||
Reference in New Issue
Block a user