
Descripción
Contexto general
Aplicación web server-rendered en PHP 8.2 nativo para gestionar el proceso de titulación de la carrera de Desarrollo de Software del ISTJBA. Maneja 4 roles (postulante, gestor, docente, administrador) con flujos diferenciados: inscripción y carga de documentos, postulación de temas, asignación de tutores y revisores, revisión de anteproyectos y tesis con observaciones, control de plagio, asignación de jurado y horario de sustentación, calificación con rúbrica y generación de actas en PDF (TCPDF) y Word (PHPWord). Base de datos MySQL 8 con 9 tablas, trigger automático para sincronización de usuarios, prepared statements en todas las consultas y recuperación de contraseña vía SMTP con PHPMailer.

Motivación
Por qué lo construí
Digitalizar y centralizar todo el proceso de titulación que antes se gestionaba con papel y hojas de cálculo.
Guiar al postulante paso a paso: inscripción → envío de tema → tesis → correcciones → sustentación, con visibilidad condicional de módulos según el estado del proceso.
Permitir al gestor asignar tutores, revisores y jurado, y generar actas oficiales en PDF y Word automáticamente.
Dar al docente herramientas para revisar anteproyectos, tesis y plagio con observaciones, rúbricas de calificación y certificados.
Características
Lo que destaca
4 roles con acceso basado en sesión: postulante, gestor, docente y administrador — cada página verifica $_SESSION['usuario_rol'] al inicio.
Flujo completo de titulación con 5 estados por tema (inscripción, tema, tesis, plagio, observaciones) y transiciones controladas entre roles.
Generación de actas de titulación, listados, notas y jurados en PDF con TCPDF y en Word (.docx) con PHPWord.
Sistema dual de layout: moderno (TailwindCSS v4 + Heroicons inline vía PHP) para postulante, legacy (BoxIcons + CSS) para gestor/docente/admin.
Capa de compatibilidad Bootstrap → TailwindCSS con 40+ clases mapeadas vía @layer components y bootstrap-shim.js en vanilla JS.
Seguridad: bcrypt para contraseñas, prepared statements con bind_param() en todas las consultas, recuperación de clave con token criptográfico (random_bytes) de 10 min de expiración vía SMTP Gmail.
Base de datos MySQL con 9 tablas (usuarios, registro, recuperación_clave, documentos_postulante, tutores, tema, periodo_academico, informes_tutores, informes_tesis) y trigger AFTER INSERT para auto-poblar registro.