# 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)

---
- Regresar al [[index|Inicio]]
