# Sprint 2: Operacion Transaccional

## 1. Objetivo del Sprint
Habilitar las funcionalidades core para el personal docente, centradas en el registro de sesiones y cumplimiento de reglas de negocio temporales.

## 2. Planificacion de Historias de Usuario
| Codigo   | Descripcion Tecnica                                                                                                        | Puntos  | Tiempo (Dias) |
| :------- | :------------------------------------------------------------------------------------------------------------------------- | :-----: | :-----------: |
| **HU06** | Implementacion de autenticacion segura para Docentes (login con DNI/email + contrasena, bloqueo por intentos, recuperacion). |    2    |      1.0      |
| **HU07** | Interfaz de consulta de clases programadas para la fecha actual con indicadores de estado.                                 |    3    |      2.0      |
| **HU08** | Visualizacion de la matriz de horario semanal del usuario autenticado.                                                     |    3    |      2.0      |
| **HU09** | Formulario transaccional de registro de actividad pedagogica con validacion de contenido.                                  |    5    |      3.0      |
| **HU10** | Logica de servidor para restriccion de registros anticipados (`Hora_Actual >= Hora_Fin_Clase`).                            |    2    |      1.0      |
| **HU11** | Algoritmo de clasificacion automatica segun tiempo de entrega (en tiempo / fuera de plazo).                                |    2    |      1.0      |
| **Total**|                                                                                                                            |**17 SP**|   **10 Dias** |

## 3. Criterios de Exito
- Registro de sesion bloqueado si `Hora_Actual < Hora_Fin_Clase`.
- Etiquetas de estado ("A tiempo" / "Fuera de plazo") asignadas correctamente por el sistema.
- Disponibilidad del horario semanal para el docente autenticado.

## 4. Estado de Implementacion

| HU | Estado | Detalle |
| :--- | :---: | :--- |
| **HU06** | Completo | Login con DNI + contrasena via `Docente\LoginController`. Recuperacion de contrasena y bloqueo por intentos manejados por Shield. |
| **HU07** | Completo | `Docente\ClasesController` con endpoint `clasesHoy()` que devuelve JSON con las clases del dia y estado de registro. Vista con tabla cargada via AJAX/HTMX. |
| **HU08** | Completo | `Docente\HorarioController` con tabla semanal que muestra horarios agrupados por dia con datos del curso. |
| **HU09** | Completo | `Docente\RegistroController` con formulario de registro, validacion de contenido, y store() con transaccion. |
| **HU10** | Completo | Validacion en `store()` que compara `hora_actual >= hora_fin_clase` antes de permitir el registro. Endpoint `verificar()` para check en tiempo real. |
| **HU11** | Completo | Clasificacion automatica: `estado_registro = 'en_tiempo'` si se registra el mismo dia, `'fuera_de_plazo'` si es posterior. |

## 5. Notas Tecnicas
- El login con DNI (`Docente\LoginController`) busca el DNI en la tabla `personal`, obtiene el `user_id`, y autentica con Shield via email + contrasena.
- `ClasesController::clasesHoy()` devuelve JSON con las clases del dia. La vista lo consume via HTMX y renderiza dinamicamente.
- `HorarioController` organiza los horarios del docente en una matriz semanal (lunes a domingo), resaltando el dia actual.
- `RegistroController::store()` implementa ambas reglas de negocio:
  - **HU10**: Verifica que `hora_actual >= hora_fin` del horario seleccionado.
  - **HU11**: Asigna `estado_registro = 'en_tiempo'` si `hora_actual <= hora_fin + tolerancia` o `'fuera_de_plazo'` en caso contrario. La tolerancia se obtiene de `config_sistema` (clave `tolerancia_minutos`).
- El frontend usa HTMX para carga asincrona y SweetAlert2 para alertas interactivas (incluido via CDN en el layout).
- Menu lateral del docente agregado en `layouts/dashboard.php` con enlaces a Clases, Horario, Registrar, Historial y Perfil.
- Codigo comentado en minusculas para facilitar el mantenimiento.

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