Sprint 5: Refactorización y Calidad de Código
1. Objetivo del Sprint
Mejorar la calidad del código existente: eliminar duplicación, corregir bugs de UI, reemplazar datos hardcodeados por datos reales del sistema, y estandarizar componentes visuales.
2. Planificación de Historias de Usuario
| Código |
Descripción Técnica |
Puntos |
Tiempo (Días) |
| HU21 |
Dashboard raíz con datos reales: reescribir Dashboard.php con endpoints JSON (estadisticasJson, proximasClases) y vista dashboard.php con fetch() + skeleton loaders por rol. |
5 |
2.5 |
| HU22 |
Modelos con validaciones: agregar $validationRules y $validationMessages a los 16 modelos del sistema para integridad de datos. |
3 |
1.5 |
| HU23 |
Refactorización código duplicado: crear trait DiaHelper, centralizar getProgramaId() en BaseController, eliminar métodos duplicados en 13 controladores. |
3 |
2.0 |
| HU24 |
Bug HTML usuarios.php: corregir nesting incorrecto de modal y <script> fuera del loop foreach y estructura de tabla. |
2 |
0.5 |
| HU25 |
Login unification Tailwind: reescribir docente/login.php y auth/login.php con clases Tailwind (antes CSS inline). |
2 |
1.0 |
| Total |
|
15 SP |
7.5 Días |
3. Criterios de Éxito
- Dashboard carga datos reales del sistema (no más valores hardcodeados).
- Todos los modelos validan datos antes de persistir.
- No hay código duplicado para
diaEspanol() ni getProgramaId().
usuarios.php renderiza correctamente con modal y script fuera del loop.
- Login usa Tailwind (sin CSS inline) en ambas rutas.
4. Estado de Implementación
| HU |
Estado |
Detalle |
| HU21 |
Completado |
Dashboard.php reescrito con estadisticasJson() y proximasClases() (endpoints JSON). Vista dashboard.php usa fetch() con skeleton loaders por rol (admin/coordinador/docente). Rutas: /dashboard/estadisticas, /dashboard/proximas-clases. |
| HU22 |
Completado |
Los 16 modelos (DocenteModel, CursoModel, PeriodoAcademicoModel, HorarioModel, AsignacionModel, RegistroSesionModel, FeriadoModel, FranjaAcademicaModel, HorarioAcademicoModel, DisponibilidadModel, ConfigSistemaModel, AuditoriaModel, NotificacionModel, ProgramaModel, SolicitudPasswordModel, AuthModel) ahora incluyen $validationRules y $validationMessages declarativos. ConfigSistemaModel además tiene método valor(). |
| HU23 |
Completado |
Trait App\Traits\DiaHelper creado con diaEspanol() y diaEspanolCapitalizado(). getProgramaId() movido a BaseController.php (ahora es use \App\Traits\DiaHelper). Eliminado getProgramaId() de 9 controladores Coordinador. Eliminado diaEspanol() de 4 controladores. |
| HU24 |
Completado |
En admin/usuarios.php, el modal de edición y el <script> de eventos se movieron fuera del foreach y de la tabla, corrigiendo el HTML nesting que causaba bugs de renderizado y modales duplicados. |
| HU25 |
Completado |
docente/login.php reescrito de CSS inline a Tailwind. auth/login.php reescrito de CSS inline a Tailwind. Ambos login ahora usan las mismas clases del design system. |
5. Notas Técnicas
5.1 Dashboard con Datos Reales
- Controlador:
app/Controllers/Dashboard.php — reescrito completamente
- Vista:
app/Views/dashboard.php — reescrita con fetch()
- Rutas:
dashboard/estadisticas, dashboard/proximas-clases (sin autenticación, acceden por sesión)
- Sistema de skeleton loaders: Cada tarjeta del dashboard tiene un skeleton que se reemplaza al recibir datos
- 3 roles diferentes: admin ve métricas globales, coordinador ve métricas por programa, docente ve métricas personales
5.2 Trait DiaHelper
- Ubicación:
app/Traits/DiaHelper.php
- Reemplaza:
diaEspanol() que estaba duplicado en Dashboard, DashboardController, ClasesController, RegistroController
- Uso: Se agrega
use \App\Traits\DiaHelper; en el trait (disponible vía BaseController)
5.3 Refactorización de BaseController
app/Controllers/BaseController.php ahora tiene getProgramaId() como método público
- Los 9 controladores de Coordinador ya no definen su propio
getProgramaId() — lo heredan de BaseController
- BaseController también hace
use \App\Traits\DiaHelper
5.4 Bug Fix: usuarios.php
- Problema: El modal de edición y el
<script> de eventos HTMX/SweetAlert estaban dentro del foreach de usuarios, lo que generaba HTML duplicado y bugs de renderizado
- Solución: Modal y script movidos fuera del loop, referenciando el último registro vía variables globales HTMX
- Archivo:
app/Views/admin/usuarios.php
5.5 Login Unification
app/Views/docente/login.php — de CSS inline (~200 líneas) a clases Tailwind
app/Views/auth/login.php — de CSS inline a clases Tailwind
- Ambos login ahora son visualmente consistentes con el resto del sistema
6. Archivos Modificados
| Archivo |
Cambio |
app/Controllers/Dashboard.php |
Reescrito: estadisticasJson(), proximasClases(), métodos privados de stats por rol |
app/Controllers/BaseController.php |
Nuevo getProgramaId(), use \App\Traits\DiaHelper |
app/Traits/DiaHelper.php |
Nuevo archivo — diaEspanol(), diaEspanolCapitalizado() |
app/Views/dashboard.php |
Reescrita: fetch() dinámico, skeleton loaders por rol |
app/Config/Routes.php |
+2 rutas: dashboard/estadisticas, dashboard/proximas-clases |
app/Models/*.php (16 archivos) |
+$validationRules y $validationMessages en todos |
app/Views/admin/usuarios.php |
Fix HTML nesting (modal + script fuera de foreach) |
app/Views/docente/login.php |
Reescrito de CSS inline a Tailwind |
app/Views/auth/login.php |
Reescrito de CSS inline a Tailwind |
app/Controllers/Coordinador/*.php (9 archivos) |
Eliminado getProgramaId() duplicado |
app/Controllers/Docente/RegistroController.php |
Eliminado diaEspanol() duplicado |
app/Controllers/Docente/ClasesController.php |
Eliminado diaEspanol() duplicado |
app/Controllers/Admin/DashboardController.php |
Eliminado diaEspanol() duplicado |
app/Controllers/Coordinador/DashboardController.php |
Eliminado diaEspanol() duplicado, estadisticasJson()/docentesPendientes() eliminados (migrados a Dashboard.php) |
7. Impacto
- Líneas eliminadas: ~350 (código duplicado, CSS inline)
- Archivos nuevos: 1 (
DiaHelper.php)
- Modelos mejorados: 16 (todos con validaciones declarativas)
- Controladores refactorizados: 14 (eliminación de duplicación)
- Bugfixes críticos: 2 (HTML usuarios.php, dashboard hardcodeado)