Files
admin-edu-space/README.md
T

27 KiB

Panel de Administración Edu-Space (UniCABA)

Plataforma integral de gestión áulica, asignación de espacios, control de horarios y reservas académicas para la Universidad de la Ciudad de Buenos Aires (UniCABA), desarrollada con Python / Flask, SQLAlchemy, PostgreSQL y Bootstrap 5.


🏛️ Sede Institucional y Ubicaciones

  • Sede Central UniCABA: Tte. Gral. Juan Domingo Perón 802, Ciudad Autónoma de Buenos Aires (CABA) — Aulas de grado, auditorio principal y laboratorios distribuidos desde Planta Baja (Piso 0) hasta el 4.° Piso.
  • Campus Virtual: Espacio áulico digital integrado (Microsoft Teams / Moodle) configurado con capacidad ilimitada (\infty).

✨ Características Principales

🛡️ 1. Control de Accesos RBAC Granular (Matriz estilo FortiGate)

  • Gestión por Módulos: Permisos independientes por cada área del sistema:
    1. Aulas y Espacios: Creación, edición, capacidad y estado de aulas físicas y virtuales.
    2. Edificios y Sedes: Administración de sedes, pisos y arquitectura edilicia.
    3. Reservas de Aulas: Solicitud, aprobación, confirmación y cancelación.
    4. Cartelera y Cronograma: Calendario interactivo, visualización diaria y comisiones.
    5. Gestión Académica: Carreras, asignaturas, códigos y comisiones.
    6. Sincronización Sheets: Importador y sincronizador de Google Sheets.
    7. Optimizador IA: Algoritmo genético de distribución y resolución de conflictos.
    8. Usuarios y Accesos RBAC: Cuentas, roles y matriz de permisos.
  • Niveles de Permiso Granulares: Ninguno, Solo Lectura o Lectura y Escritura.
  • Controles Rápidos: Botón "Establecer Todos" para configuración masiva inmediata.
  • Roles Predefinidos: Admin (control total), Docente, Operador y Consulta.

📊 2. Sincronización e Importación desde Google Sheets

  • Integración directa con la cartelera académica de UniCABA en Google Sheets.
  • Extracción e importación normalizada de los 5 campos clave:
    • Código Académico: Códigos reales de asignatura (ej. INGA0003, ASIG00165).
    • Asignatura: Nombre oficial de la materia.
    • Aula: Mapeo a aulas físicas (PB a 4.° piso) o aula VIRTUAL (\infty).
    • Carrera: Normalización y vinculación relacional con entidades de carrera.
    • Horarios y Turnos: Detección automática de franjas horarias y delimitadores de bloque (Turno Mañana y Turno Tarde / Vespertino).

📅 3. Calendario Interactivo de Reservas (FullCalendar)

  • Visualización Semanal, Mensual y Diaria: Grilla ágil de alta legibilidad con jerarquía visual:
    • Asignatura destacada en tipografía grande y negrita.
    • Badges con código de materia, aula asignada, turno y franja horaria.
  • Filtros Dinámicos Combinables:
    • Filtrar por Aula.
    • Filtrar por Materia / Asignatura.
    • Filtrar por Carrera.
    • Filtrar por Turno (Turno Mañana / Turno Tarde).
    • Filtrar por Piso / Planta (Planta Baja, Piso 1, Piso 2, Piso 3, Piso 4).
    • Switch "Ocultar Aulas Virtuales": Aísla la ocupación física real en el edificio central excluyendo los eventos virtuales de capacidad infinita.
  • Ficha Modal Instantánea: Vista previa detallada al hacer clic en cualquier evento.

📋 4. Cartelera del Día y Listado de Reservas

  • Cartelera del Día (/schedule/today):
    • Vista Cronológica (Timeline): Bloques horarios de 07:00 a 22:00 hs con indicador de ocupación.
    • Vista en Tabla: Lista ordenada con acciones rápidas y detalles de comisión.
    • Filtros directos por piso, turno y switch para ocultar virtuales.
  • Listado Paginado de Reservas (/schedule/list):
    • Paginación de 20 registros por página preservando filtros aplicados.
    • Búsqueda por texto, estado (Confirmada, Pendiente, Cancelada), rango de fechas y piso.

🏫 5. Gestión de Aulas con Capacidad Infinita (\infty)

  • Soporte nativo para el símbolo ∞ o 0 para designar aulas virtuales o espacios sin aforo restringido.
  • Botón de un solo clic Ilimitada (∞) en formularios de alta y edición con leyendas explicativas.
  • Badges distintivos ∞ Ilimitada en listados, tarjetas y fichas técnicas.

🤖 6. Optimizador Inteligente de Aulas (Algoritmo Genético)

  • Motor de optimización heurística para asignación automática de aulas a comisiones.
  • Pondera capacidad requerida vs. capacidad de aula, equipamiento tecnológico y minimización de desplazamientos entre pisos.

🎨 7. Experiencia de Usuario, Temas y Localización

  • Tema Oscuro / Claro: Alternador con botón flotante y persistencia en localStorage y perfil de usuario.
  • Soporte Multilingüe: Internacionalización integral (Español e Inglés) compilada con GNU gettext (pybabel).
  • Tarjetas Estadísticas Interactivas: Accesos directos rápidos desde el panel general hacia las distintas secciones operativas.

🏛️ 8. Sistema Integral de Gestión Institucional (8 Módulos)

El menú desplegable Gestión en la barra de navegación organiza las áreas operativas de la universidad:

  • Espacios e Infraestructura:
    • Edificios y Sedes (/buildings/list): Administración de edificios físicos, arquitectura y estado edilicio.
    • Aulas Presenciales (/classrooms/list?view_mode=physical): Catálogo de aulas físicas por piso, capacidades y zócalos compactos con métricas de ocupación en tiempo real (día, semana, mes).
    • Aulas Virtuales con Reunión (/classrooms/list?view_mode=virtual): Campus Virtual con salas a demanda agrupadas por comisión, capacidad ilimitada (\infty) y enlaces directos de acceso a videollamadas (Zoom, Google Meet, Microsoft Teams).
    • Gestión de Ocupación y Métricas (/admin/occupancy-metrics): Dashboard analítico de tasas de ocupación horaria (día, semana, mes), horas pico, distribución por turno y comparativa física vs. virtual.
  • Gestión Académica:
    • Carreras (/admin/careers): ABM de carreras universitarias y planes de estudio con contador de asignaturas y comisiones activas.
    • Asignaturas (/admin/subjects): Catálogo institucional de materias con créditos, departamentos y filtros por carrera y estado.
    • Comisiones y Cursadas (/schedule/commissions): Gestión de cursadas, turnos, docentes, enlaces virtuales e hitos de evaluación.
    • Ciclo Lectivo (/admin/academic-terms): Modelo y panel de administración de períodos académicos, cuatrimestres y activación del ciclo lectivo en curso.
  • Administración & Seguridad:
    • Usuarios y Roles RBAC: Cuentas, asignación de permisos matriciales y auditoría.
    • Tipificaciones de Hitos: Catálogo de tipos de hitos de evaluación académica.
    • Sincronización Sheets: Integración con Google Sheets para actualización en lote.

🛠️ Stack Tecnológico

Componente Tecnología
Backend Python 3.12+ / Flask
Base de Datos PostgreSQL 16+ / SQLAlchemy ORM
Seguridad & Sesiones Flask-Login / Werkzeug / CSRF Protect
Formularios Flask-WTF / WTForms
Internacionalización Flask-Babel / GNU gettext
Frontend Bootstrap 5.3, Bootstrap Icons, Vanilla JS, CSS Variables
Calendario FullCalendar 5.11

🚀 Despliegue en Proxmox VE (LXC) con Entorno Virtual venv

El sistema está especialmente optimizado para ejecutarse en contenedores LXC (Debian 12 Bookworm o Ubuntu 22.04/24.04 LTS) dentro de Proxmox VE, utilizando un entorno virtual nativo de Python (venv), el motor PostgreSQL instalado en el propio contenedor y el servidor WSGI Gunicorn gestionado como servicio por systemd.


📋 Paso 1: Creación del Contenedor LXC en Proxmox VE

Podés crear el contenedor desde la interfaz Web de Proxmox (Create CT) o por terminal Proxmox con pct create:

  • Plantilla (Template): debian-12-standard (Recomendado) o ubuntu-22.04-standard / ubuntu-24.04-standard.
  • CPU: 1 a 2 vCPU.
  • Memoria RAM: 1024 MB a 2048 MB (Swap: 512 MB).
  • Disco: 8 GB a 15 GB (almacenamiento local-lvm o zfs).
  • Red (Network): Modo Bridge vmbr0 con IP estática en tu red local o DHCP (ej: 192.168.1.150/24, Gateway: 192.168.1.1).
  • Opciones del Contenedor:
    • Unprivileged container: Sí (marcado por defecto, compatible).
    • Features (Características): Habilitar Nesting (nesting=1) en CT > Opciones > Características (requerido para systemd).

⚡ Paso 2: Instalación Automatizada con install.sh

  1. Ingresar a la consola del contenedor LXC: Desde la Web UI de Proxmox (consola noVNC) o desde el shell de tu nodo Proxmox:

    pct enter <ID_DEL_CONTENEDOR>
    
  2. Clonar el repositorio y lanzar el instalador:

    apt update && apt install -y git
    git clone https://gitea.oemspot.com.ar/carlostellocba/admin-edu-space.git
    cd admin-edu-space
    bash install.sh
    
  3. Flujo de Ejecución Automatizado en el LXC:

    • Migración segura fuera de /root: Si el repositorio se clonó en /root, el instalador lo traslada automáticamente a /opt/admin-edu-space para garantizar que el usuario del servicio (eduspace) tenga acceso de lectura y ejecución.
    • Locales UTF-8: Configura en_US.UTF-8 y es_AR.UTF-8 para asegurar la internacionalización con Flask-Babel y prevenir errores de encoding.
    • Motor PostgreSQL: Instala el motor PostgreSQL, inicia el servicio y verifica conectividad activa con bucle de espera.
    • Restauración del Snapshot Oficial (classrooms_db.sql):
      • Detecta el volcado completo de datos.
      • Crea la base de datos classrooms_db y el usuario eduspace_user.
      • Restaura 25 aulas (físicas y Campus Virtual \infty), 206 comisiones, 206 materias, 412 reservas históricas, 24 carreras, matrices RBAC y cuentas de acceso.
      • Otorga privilegios totales (GRANT ALL) en el esquema public, todas las tablas y todas las secuencias al usuario eduspace_user.
      • Ejecuta init_db.py de forma idempotente para validar roles y coherencia.
    • Entorno Virtual Python (venv): Crea el entorno aislado en /opt/admin-edu-space/venv e instala todas las dependencias oficiales (Flask, SQLAlchemy, Gunicorn, etc.).
    • Servicio Systemd de Producción: Configura el servicio admin-edu-space.service gestionado por Gunicorn (3 workers, puerto 5000), con reinicio automático ante fallos y habilitado al inicio del contenedor.

🌐 Paso 3: Acceso Inmediato a la Aplicación

Al finalizar la instalación, el script mostrará la dirección IP del contenedor:

  • URL: http://<IP-DEL-LXC>:5000 (ejemplo: http://192.168.1.150:5000)
  • Email Administrador: admin@edu-space.com
  • Contraseña Administrador: admin123

🛠️ Comandos de Gestión del Servicio en el LXC

# Consultar estado en tiempo real
systemctl status admin-edu-space

# Seguir logs de la aplicación
journalctl -u admin-edu-space -f

# Reiniciar la aplicación
systemctl restart admin-edu-space

# Detener el servicio
systemctl stop admin-edu-space

💾 Generación de Backups y Migración a Otros Contenedores LXC

Para respaldar la base de datos en ejecución o clonarla a otro contenedor LXC:

# Dentro del contenedor LXC:
cd /opt/admin-edu-space
bash backup_db.sh
  • El script genera un archivo fechado en backups/classrooms_db_YYYYMMDD_HHMMSS.sql.
  • Actualiza automáticamente el archivo principal classrooms_db.sql.
  • Para migrar a otro contenedor: Podés transferir classrooms_db.sql mediante SCP o Git y ejecutar bash install.sh en el nuevo LXC.

💻 Instalación Manual para Desarrollo Local (con venv)

Si deseás correr el proyecto en una máquina de desarrollo (Windows / Linux / macOS) sin usar el instalador de Proxmox:

  1. Crear y activar el entorno virtual:

    • En Windows (PowerShell):
      python -m venv venv
      .\venv\Scripts\Activate.ps1
      
    • En Linux / macOS:
      python3 -m venv venv
      source venv/bin/activate
      
  2. Instalar dependencias:

    pip install -r requirements.txt
    
  3. Configurar base de datos local y restaurar snapshot:

    cp .env.example .env
    
    # Crear base de datos en PostgreSQL local y cargar datos
    sudo -u postgres psql -c "CREATE DATABASE classrooms_db;"
    sudo -u postgres psql -d classrooms_db < classrooms_db.sql
    
  4. Compilar catálogos de traducción:

    pybabel compile -d translations
    
  5. Iniciar el servidor:

    python wsgi.py
    

    Disponible en: http://localhost:5000


🔑 Credenciales Predeterminadas

Usuario Correo Electrónico Contraseña Rol
Administrador del Sistema admin@edu-space.com admin123 Admin (Acceso Total)

⚠️ Seguridad: Cambiá la contraseña del administrador desde la interfaz web inmediatamente después del primer inicio de sesión.


📁 Estructura del Proyecto

admin-edu-space/
├── app/
│   ├── __init__.py                  # Factoría de la aplicación Flask y extensiones
│   ├── forms/                       # Formularios Flask-WTF con validación CSRF
│   │   ├── auth.py                  # Login, perfil y cambio de clave
│   │   ├── building.py              # Sedes y edificios
│   │   ├── classroom.py             # Aulas y capacidades (con soporte ∞)
│   │   └── reservation.py           # Reservas de aulas y horarios
│   ├── models/                      # Modelos relacionales SQLAlchemy
│   │   ├── academic_term.py         # Ciclos lectivos y períodos académicos (activo/histórico)
│   │   ├── audit_log.py             # Bitácora inmutable de auditoría de eventos
│   │   ├── building.py              # Sedes y edificios institucionales
│   │   ├── career.py                # Carreras y titulaciones universitarias
│   │   ├── classroom.py             # Aulas físicas y virtuales con capacidades
│   │   ├── genetic_algorithm.py     # Estructuras de optimización heurística
│   │   ├── milestone.py             # Tipificaciones de hitos académicos y exámenes
│   │   ├── reservation.py           # Reservas horarias, estados y turnos
│   │   ├── role.py                  # Roles y matriz de permisos granulares RBAC
│   │   ├── subject.py               # Asignaturas, materias y comisiones de cursada
│   │   └── user.py                  # Usuarios, credenciales y asignación de roles
│   ├── repositories/                # Capa de persistencia desacoplada (Patrón Repository)
│   │   ├── base_repository.py       # CRUD genérico tipado BaseRepository[T]
│   │   ├── classroom_repository.py  # Filtrado de aulas físicas y virtuales
│   │   ├── reservation_repository.py# Detección de solapamiento y consultas temporales
│   │   └── user_repository.py       # Consultas seguras de usuarios y roles
│   ├── schemas/                     # Contratos DTOs con validación Pydantic v2
│   │   ├── auth_dto.py              # Esquemas de login y refresh tokens
│   │   ├── classroom_dto.py         # Contratos de creación y edición de aulas
│   │   └── reservation_dto.py       # Validación de franjas horarias y aforo
│   ├── security/                    # Pipeline de seguridad inspirado en Spring Security
│   │   ├── filter_chain.py          # SecurityFilterChain (OWASP Headers & Rate Limiting)
│   │   └── decorators.py            # @require_permission declarativo a nivel método
│   ├── services/                    # Capa de servicios y lógica de negocio
│   │   ├── audit_service.py         # Registro y consulta de auditoría inmutable
│   │   ├── classroom_service.py     # Lógica de asignación, aforo y validación áulica
│   │   ├── jwt_service.py           # Emisión de tokens (Dual Token) y lista negra
│   │   ├── reservation_service.py   # Motor de resolución de conflictos de cronograma
│   │   ├── sheets_importer.py       # Parser y sincronizador de Google Sheets
│   │   └── user_service.py          # Autenticación y perfil con matriz RBAC
│   ├── routes/                      # Controladores y rutas modulares (Blueprints)
│   │   ├── api/                     # Endpoints RESTful (v1) con Stateless JWT
│   │   │   ├── auth.py              # /api/v1/auth (login, refresh, logout, me)
│   │   │   ├── classrooms.py        # /api/v1/classrooms (CRUD REST tipado)
│   │   │   └── reservations.py      # /api/v1/reservations (Gestión y disponibilidad)
│   │   ├── admin.py                 # Carreras, Asignaturas, Tipificaciones, Métricas, Usuarios
│   │   ├── auth.py                  # Autenticación web tradicional Jinja2
│   │   ├── buildings.py             # Gestión de sedes y edificios
│   │   ├── classrooms.py            # Aulas presenciales vs. Virtuales (controlador delgado)
│   │   ├── genetic_algorithm.py     # Optimizador heurístico de asignación
│   │   ├── main.py                  # Dashboard principal y métricas rápidas
│   │   └── schedule.py              # Calendario interactivo, cartelera del día y reservas
│   ├── utils/                       # Utilidades transversales
│   │   └── jwt_decorators.py        # @jwt_required y @jwt_role_required
│   ├── static/                      # Recursos estáticos web (CSS, JS, imágenes institucionales)
│   └── templates/                   # Vistas Jinja2 renderizadas con Bootstrap 5
├── config/                          # Configuraciones de entorno (desarrollo, testing, prod)
├── translations/                    # Catálogos GNU gettext compilados (es / en)
├── classrooms_db.sql                # Snapshot completo de base de datos (PostgreSQL 14+)
├── install.sh                       # Instalador automatizado para Proxmox VE LXC (venv + PostgreSQL)
├── backup_db.sh                     # Script para generar nuevos backups y actualizar snapshot
├── init_db.py                       # Inicializador DDL y sincronizador de esquema/roles
├── CHANGELOG_SESSION.md             # Historial técnico cronológico
├── requirements.txt                 # Dependencias Python (incluye Gunicorn)
├── .env.example                     # Plantilla de variables de entorno
└── wsgi.py                          # Punto de entrada de la aplicación Flask

🚀 Roadmap Académico & Propuesta de Evolución Tecnológica

En respuesta a los requerimientos y sugerencias docentes, se formaliza el plan de evolución arquitectónica, estándares de seguridad y entrega de valor institucional para la plataforma Admin Edu-Space (UniCABA).

💡 1. Propuesta de Mejora Integral

A. Arquitectura MVC Rigurosa & Clean Architecture

  • Desacoplamiento de Capas:
    • Model (Dominio): Entidades relacionales puras y reglas de integridad del negocio desacopladas del framework web (app/models/).
    • View (Presentación): Vistas web en Jinja2 con Bootstrap 5 y respuestas JSON estructuradas para clientes API/móviles.
    • Controller (Controladores/Blueprints): Controladores delgados en app/routes/ enfocados exclusivamente en la orquestación HTTP y redirección.
    • Service Layer & Repositories (app/services/ & app/repositories/): Aislamiento de la lógica de negocio (detección de colisiones, algoritmo genético de asignación, ETL de Google Sheets) y operaciones de persistencia encapsuladas.
  • DTOs y Validación de Entrada: Incorporación de esquemas tipados (Pydantic / Marshmallow) para filtrar y sanitizar datos de entrada antes de interactuar con el ORM, eliminando validaciones ad-hoc en los controladores.

B. Autenticación & Autorización Stateless con JWT (JSON Web Tokens)

  • Arquitectura API-First Híbrida:
    • Coexistencia armónica de sesiones web seguras (para el panel administrativo en navegadores) y tokens JWT (para microservicios, clientes móviles y aplicaciones externas).
    • Esquema Dual de Tokens (Dual Token Pattern):
      • Access Token (firmado con RS256/HS256, expiración corta de 15 minutos) con claims contextuales (sub, roles, permissions, exp).
      • Refresh Token (almacenado en cookie segura HttpOnly, Secure, SameSite=Strict, expiración de 7 días) para renovación silenciosa sin reingreso de credenciales.
    • Mecanismo de Revocación Inmediata (Token Blacklist): Almacenamiento en caché distribuida (Redis) para invalidación instantánea ante cierres de sesión forzados o rotación de contraseñas.

C. Seguridad Empresarial y Paradigma "Sprint / Spring Security"

  • Cadena de Filtros de Interceptación (SecurityFilterChain): Pipeline centralizado inspirado en los estándares de Spring Security:
    • Authentication Filter: Intercepta cabeceras Authorization: Bearer <token> y valida firmas criptográficas.
    • Security Headers Filter: Inyección obligatoria de cabeceras de blindaje HTTP (HSTS, CSP, X-Frame-Options: DENY, X-Content-Type-Options: nosniff).
    • Rate Limiting Filter: Prevención de ataques de fuerza bruta y DDoS en endpoints sensibles mediante límites dinámicos (Flask-Limiter / Redis).
  • Seguridad Declarativa a Nivel Método (@PreAuthorize / @require_permission):
    • Decoradores reutilizables que evalúan la matriz RBAC antes de ejecutar cualquier método de servicio:
      @require_permission('classrooms', min_level='read_write')
      def update_classroom_capacity(classroom_id, new_capacity): ...
      
  • Bitácora Inmutable de Auditoría (Audit Trail): Registro trazable de eventos críticos (creación/modificación de reservas, cambios de roles y accesos fallidos) con IP de origen, usuario actuante, timestamp y delta de cambios.

📅 2. Planificación de Sprints (Roadmap)

Sprint / Fase Objetivo Principal Entregables Clave Estado Hito de Evaluación
Sprint 1 Refactorización MVC & Capa de Servicios • Extracción de lógica a app/services/
• Patrón Repository para aulas y reservas (app/repositories/)
• DTOs tipados de validación con esquemas Pydantic v2
✔ Completado Controladores delgados (< 60 líneas), desacoplamiento Clean Architecture y persistencia aislada.
Sprint 2 Autenticación Stateless JWT & API Gateway • Endpoints /api/v1/auth/login, /refresh, /logout, /me
• Endpoints RESTful de aulas y reservas
• Decoradores @jwt_required y middleware Bearer Token
✔ Completado Consumo seguro desde Swagger/Postman y clientes externos con Dual Token Pattern (15 min + 7 días).
Sprint 3 Sprint Security & Gobernanza RBAC • Pipeline centralizado SecurityFilterChain
• Rate Limiting dinámico (fuerza bruta / DoS)
• Decorador @require_permission a nivel método
• Bitácora inmutable de auditoría (AuditLog)
✔ Completado Inyección de cabeceras OWASP Secure Headers y trazabilidad completa de eventos críticos con IP/usuario.
Sprint 4 Optimizador Heurístico & Alta Concurrencia • Paralelización del algoritmo genético con multiprocessing/workers
• Colas asíncronas para optimizaciones pesadas
• Integración con microservicio Spring Boot vía REST/JWT
⏳ En Curso Optimización de 200+ comisiones en menos de 5 segundos con 0 colisiones horarias.

💎 3. Valor Agregado & Retorno Institucional

  1. Eficiencia Edilicia y Reducción del Desperdicio de Espacio:
    • Maximiza el aprovechamiento de las aulas físicas de la Sede Central (Tte. Gral. Juan Domingo Perón 802), pasando de una asignación manual y empírica a un modelo algorítmico basado en capacidad real, accesibilidad de pisos y equipamiento.
  2. Ahorro de Tiempo Operativo (85% de reducción):
    • Automatiza la resolución de conflictos de solapamiento horario en horarios pico (Turno Vespertino, 17:30 a 21:30 hs) y agiliza la sincronización con la cartelera de Google Sheets en lote.
  3. Interoperabilidad Universal:
    • La arquitectura desacoplada y la capa JWT permiten que cualquier otro sistema de la universidad (SIU Guaraní, Campus Virtual Moodle, App de estudiantes, backend Spring Boot institucional) consulte en tiempo real la disponibilidad áulica.
  4. Despliegue de Alta Eficiencia (Bajo Costo de Infraestructura):
    • A diferencia de arquitecturas pesadas basadas en contenedores Docker o Kubernetes que demandan múltiples gigabytes de RAM, Admin Edu-Space corre de forma nativa en un contenedor Proxmox VE LXC consumiendo menos de 180MB de memoria, garantizando alta disponibilidad con costos de hardware mínimos.

🧩 4. Desafíos Técnicos (Challenges)

  • Challenge 1: Resolución Heurística de Horarios Áulicos (NP-Hard Problem):
    • La asignación de 206 asignaturas, 400+ reservas y 25 aulas considerando restricciones duras (no colisión horaria, capacidad no superada) y blandas (mismo docente en pisos cercanos, turnos consolidados) representa un problema de complejidad NP-Hard resuelto mediante un Algoritmo Genético con operadores de cruce y mutación adaptativa.
  • Challenge 2: Sincronización Masiva Tolerante a Fallos:
    • El parser ETL de Google Sheets normaliza datos no estructurados de la cartelera académica, resolviendo discrepancias ortográficas, turnos implícitos y formatos dispares de hora sin interrumpir la operación continua.
  • Challenge 3: Portabilidad Extrema en Proxmox LXC sin Docker:
    • Desarrollo de un instalador auto-recuperable (install.sh) capaz de levantar PostgreSQL nativo en Debian 12 y 13 dentro de tmpfs, gestionar clusters con pg_createcluster, operar de forma autónoma con o sin sudo, y garantizar persistencia íntegra de base de datos entre dispositivos.

📄 Licencia

Este proyecto forma parte del sistema de gestión institucional y educativa de UniCABA. Todos los derechos reservados.