11 KiB
11 KiB
CHANGELOG MVP — Admin Edu-Space (UniCABA)
Nota de Unificación: Este archivo documenta la progresión de los hitos y entregables de las Fases del ROADMAP_MVP.md. Para el historial técnico exhaustivo conforme a Keep a Changelog y Semantic Versioning, consultar el archivo oficial unificado: CHANGELOG.md.
[Fase 4: UI/UX Avanzada para Bedelía & Modo Impersonación] — v2.8.0 (2026-09-23)
Estado: ✅ 100% Completada
Estadio 4.1 — Grilla Semanal Interactiva (Drag-and-Drop) con Detección de Colisiones
- FullCalendar Interactivo: Habilitación de
editable: trueydroppable: trueen el calendario general de Bedelía (/schedule/calendar). - Sidebar de Comisiones Pendientes: Panel lateral dinámico con catálogo de comisiones que aún no tienen aula asignada (
unassigned_commissions), permitiendo arrastrarlas directamente hacia los bloques horarios del calendario. - Validación de Choques en Tiempo Real: Integración con
POST /api/v1/reservations/drag-update. Al mover o soltar una clase, el backend somete la nueva posición a la matriz integral de conflictos (ReservationService.check_full_conflicts_matrix):- Conflicto físico de aula (doble asignación simultánea).
- Conflicto docente (profesor ocupado en otra aula).
- Conflicto de aforo (capacidad de aula insuficiente).
- Manejo de Respuestas: Si hay colisión, devuelve HTTP 409 (
status: conflict), FullCalendar revierte automáticamente el movimiento (info.revert()) y se dispara un Toast de alerta detallando el motivo del bloqueo. Si está libre, persiste la reserva y confirma con Toast de éxito.
Estadio 4.2 — Modo Impersonación del Superadmin con Trazabilidad
- Cabecera
X-Impersonate-User: Inyección y soporte enbackend/app/utils/jwt_decorators.pydentro dejwt_requiredpara usuarios administradores. Asignag.jwt_useral usuario objetivo preservandog.real_admin_usery marcandog.is_impersonating = True. - Endpoints de Control:
POST /api/v1/admin/impersonateyPOST /api/v1/admin/stop-impersonatingen Backend Flask con auditoría inmutable enAuditLog(IMPERSONATE_STARTeIMPERSONATE_END). - Integración en BFF Node.js: Middleware
authMiddleware.jsy proxy/apienapp.jsconfigurados para propagar cookies segurasimpersonate_user_ide inyectarX-Impersonate-Useren todas las peticiones a la API Flask. - Banner Visual Institucional: Banner de advertencia permanente en
base.htmlcon fondo de alerta ámbar, spinner de estado, identificación del usuario y rol adoptado, y botón de salida inmediata. - Acceso de un Clic: Botón directo de impersonación (
bi-incognito) en cada fila de usuario activo en/admin/users_list.
Estadio 4.3 — Acople del Optimizador Genético a Datos y Turnos Reales
- Turnos Académicos Reales:
ReservationOptimizer._calculate_preferred_timesincronizado con las franjas horarias de UniCABA (Mañana: 08:00 a 12:00,Tarde: 14:00 a 18:00,Vespertino/Noche: 18:30 a 22:30). - Persistencia Segura: Endpoint
POST /api/genetic/apply-optimizationadaptado con parseo riguroso de strings ISO y prevención de colisiones físicas en guardado masivo.
Cobertura de Pruebas
- Suite completa en
backend/tests/test_phase4_interactive_impersonation.pyvalidando los 6 criterios de aceptación (impersonación de docente, impersonación de alumno, trazabilidad en auditoría, rechazo a no-admins, bloqueo 409 por colisión en drag-drop y actualización exitosa 200). 18/18 tests aprobados en suite global de Fases 2, 3 y 4.
[Fase 3: Gestión de Hitos Evaluativos y Libro de Calificaciones] — v2.7.0 (2026-09-23)
Estado: ✅ 100% Completada
Estadio 3.1 — Calendario de Evaluación por Comisión y Notificaciones Preventivas
- Modelo
MilestoneGrade: Tabla relacionalmilestone_gradespara registrar calificaciones por estudiante y reserva evaluativa, con validación de unicidad (student_id,reservation_id), notas en escala 1.0 a 10.0, estado de inasistencia (is_absent) y devoluciones pedagógicas (feedback). - Consulta de Hitos del Alumno: Endpoint
GET /api/v1/students/my-upcoming-milestonesque detecta dinámicamente exámenes parciales, recuperatorios y entregas de TP de las comisiones del estudiante con cálculo automático de días restantes (days_remaining). - Dashboard del Alumno: Widget interactivo de próximos exámenes en
/dashboard?role=alumnocon badges visuales de urgencia (¡Hoy!, ¡Mañana!, Faltan X días) y acceso directo desde el Launchpad a "Mis Calificaciones".
Estadio 3.2 — Libro de Calificaciones (Gradebook) y Cierre Formal de Actas
- Extensiones en
Commission: Incorporación de columnasgrades_closed(boolean),grades_closed_at(datetime),grades_closed_by(foreign key) yacta_number(identificador oficial generado). - Servicio
GradebookService: Motor centralizado para matriz de notas por comisión, guardado asíncrono individual y por lote (bulk_save_grades), cálculo dinámico de promedios ponderados y condiciones académicas en tiempo real (Promocionado ≥ 7, Regular ≥ 4, Libre < 4). - Cierre Formal de Actas: Sellado institucional con código único (
ACTA-YYYY-Sem-ID), auditoría inmutable enaudit_logscon acciónCLOSE_ACTAy bloqueo total contra modificaciones posteriores. - Reapertura Excepcional: Endpoint para Bedelía/Administración (
POST /api/v1/commissions/<id>/gradebook/reopen) con justificación administrativa obligatoria asentada en auditoría. - Interfaz Docente & Bedelía (
/schedule/gradebook/:id): Matriz interactiva de carga rápida con autoguardado asíncrono debounced (500ms), indicador visual flotante de sincronización, recálculo instantáneo de promedios en el cliente y modales de sellado y reapertura de actas. - Portal del Alumno (
/schedule/my_grades//mis-materias/mis-notas): Vista consolidada de todas las materias del estudiante, notas de parciales, condición final y número de acta emitida, con soporte de impresión de certificado de regularidad. - Acceso Directo en Comisión: Botón destacado "Libro de Calificaciones (Actas)" y badge de acta sellada incorporados en
/admin/commission_detail.
Cobertura de Pruebas
- Suite completa en
backend/tests/test_phase3_gradebook.pyvalidando los 6 criterios de aceptación: estructura de matriz bidimensional, persistencia y autoguardado de notas, validación estricta de notas inválidas (fuera del rango 1-10), cierre formal de acta e inmutabilidad estricta ante intentos de edición, consulta integral del alumno y cuenta regresiva de próximos hitos. 6/6 tests aprobados (12/12 en conjunto con Fase 2).
[Fase 2: Co-docencia, Matriz de Conflictos y Regla Diaria] — v2.6.0 (2026-09-19)
Estado: ✅ 100% Completada
Estadio 2.1 — Modelo y Gestión Integral de Co-docencia
- Modelo
CommissionTeacher: Soporte para múltiples docentes por comisión en base de datos (commission_teachers), admitiendo roles académicos diferenciados (Titular,Adjunto,JTP,Ayudante) y flagis_primary. - API REST de Cátedras: Endpoints
POST /api/v1/commissions/<id>/teachersyDELETE /api/v1/commissions/<id>/teachers/<user_id>con serialización completa de cátedra en comisiones. - Interfaz de Gestión: Tarjeta interactiva "Equipo Docente / Cátedra" en
/admin/commission_detailpara incorporar y desvincular profesores con rol dinámico, y visualización de badges en/admin/commissions_list.
Estadio 2.2 — Matriz de Conflictos y Validación Integral
- Conflicto Físico: Bloqueo estricto e infranqueable de superposiciones de reservas en la misma aula física (
ReservationRepository.find_overlapping). - Conflicto Docente: Detección de doble asignación simultánea para un mismo docente en diferentes aulas o formatos.
- Excepción Justificada por Co-docencia: Si un docente asignado presenta solapamiento pero la comisión cuenta con co-docentes registrados en
CommissionTeacher, la matriz de validación autoriza la reserva validando la cobertura del equipo de cátedra. - Conflicto de Aforo: Bloqueo estricto cuando
expected_attendees > classroom.capacityen espacios físicos. - Endpoint de Pre-validación:
POST /api/v1/reservations/check-conflictspara validación asíncrona de conflictos físicos, docentes y de aforo antes del commit.
Estadio 2.3 — Regla de Restricción Diaria del Alumno y Motor de Excepciones
- Servicio
EnrollmentService: Lógica de matriculación académica con análisis de días de cursada por comisión y verificación de cupos. - Regla Restrictiva: Un alumno no puede cursar dos asignaturas regulares el mismo día de la semana.
- Excepción Automática por Curso Corto: Atributo
is_short_courseen modeloSubject; si una de las materias es un taller o curso corto, el sistema autoriza la cursada simultánea en el mismo día. - Excepción Expresa de Bedelía: Campos
allow_same_day_exceptionyexception_reasonenStudentEnrollment. La oficina de Bedelía puede autorizar la matriculación simultánea mediante switch justificado en la interfaz. - Endpoints de Matrícula:
GET/POST /api/v1/commissions/<id>/enrollments,DELETE/PUT /api/v1/commissions/<id>/enrollments/<student_id>. - UI en Detalle de Comisión: Formulario de matriculación con toggle de autorización de Bedelía, motivo de excepción y tabla de inscriptos con badges de estado.
Cobertura de Pruebas
- Suite completa en
backend/tests/test_phase2_rules.pyvalidando los 6 criterios de aceptación (conflicto físico, aforo, co-docencia, restricción diaria, bypass de curso corto y bypass de Bedelía). 6/6 tests aprobados con 100% de éxito.
Complementos y Seguridad Transversal
- Dashboard de Bedelía: Integración de paneles en tiempo real para análisis de Comisiones Sin Reserva y grilla de Aulas Disponibles (Filtros Semana/Mes) conectando frontend UI con el servicio analítico backend.
- Auditoría Automatizada (Fase 1): Implantación de un pipeline de seguridad local/Gitea que aísla dependencias de desarrollo (
requirements-dev.txt) y ejecuta controles SAST, DAST y SCA (Bandit, pip-audit, njsscan y Schemathesis) sin vulnerabilidades detectadas. - Optimizador Genético de Reservas: Reparación de enrutamiento 404, migración a JWT (
@jwt_required), corrección de UI de métricas dinámicas de algoritmo, y refactorización de layout para superposición de herramientas. - UI/UX General: Ajustes de CSS en modo claro (soporte dinámico de contraste de isologotipo blanco a rosa institucional mediante filtros) y traducciones de menús de usuario en
base.html.
[Fase 1: Paridad Legacy y Estabilización] — v2.5.0 / v2.4.0 (2026-09-19)
Estado: ✅ 100% Completada
- Seguridad automatizada SAST/DAST/SCA (Bandit, pip-audit, schemathesis, njsscan, npm audit).
- Tipificaciones de documentos argentinos y extranjeros, perfiles extendidos de usuarios con email personal e institucional.
- Gestión completa de aulas físicas vs virtuales con percentiles de asignación y métricas de ocupación real.
- Reingeniería del modal de edición y eliminación segura de asignaturas.
[Fase 0: Desacople y Arquitectura Base] — v2.0.0 (2026-09-18)
Estado: ✅ 100% Completada
- Desacople arquitectónico completo: Backend Flask RESTful (
/api/v1/) + Frontend BFF Node.js/Express con Nunjucks. - Autenticación basada en tokens JWT con sincronización de estado de sesión.