# Entregas y cronómetros de tareas

## Fechas y avisos

- El vencimiento existente corresponde a la entrega ante el ente de control.
- Al crear o editar desde el formulario se indica también la entrega interna, entre el inicio y el vencimiento externo. Ambas fechas se validan como laborables según los festivos configurados.
- Cada fecha tiene su anticipación de aviso, entre 0 y 365 días calendario. Cero avisa el día de vencimiento. Las fechas vencidas siguen generando avisos diarios mientras la tarea esté abierta.
- Las tareas existentes conservan su vencimiento y los días de aviso de su empresa. Su fecha interna queda sin establecer hasta editarla; no se inventa una fecha histórica. Las plantillas existentes continúan funcionando y permiten completar esa fecha al editar la tarea generada.
- Los avisos usan el programador y la cola de correos ya configurados. Cada tipo de aviso se identifica por tarea, fecha objetivo y día para evitar duplicados al ejecutar varias veces el programador.
- Las recurrencias conservan las anticipaciones y trasladan la fecha interna manteniendo la separación respecto al vencimiento, ajustándola al intervalo y calendario laborable de la nueva tarea.

## Tiempo por persona

En el detalle se muestran Iniciar mi cronómetro y Detener mi cronómetro para cada asignado. No se puede operar el contador de otra persona. Se registran en el servidor las sesiones de inicio y detención con precisión de segundos y se suman por tarea y persona.

Cerrar el navegador o sesión no detiene el cronómetro. Debe detenerse al pausar o terminar el trabajo. Se detiene automáticamente al cerrar, cancelar, enviar a revisión o retirar a una persona de la asignación. Un doble clic no crea sesiones simultáneas duplicadas del mismo usuario en la misma tarea.

El detalle muestra primer inicio, última detención, tiempo cronometrado, tiempo registrado manualmente y total por persona, además de la diferencia y porcentaje frente al estimado total de la tarea. Conserva tiempos de personas retiradas y de reprocesos. Los registros manuales deben corresponder a trabajo que no haya sido cronometrado.

Los segundos completos se conservan en las sesiones; para el avance existente se acreditan minutos enteros acumulados, sin redondear cada sesión hacia arriba. Detener un contador registra tiempo, pero el cierre sigue usando Actualizar avance y sus validaciones de pasos y revisión. Las operaciones quedan en el historial y auditoría.

## Subir al hosting

1. Subir estos archivos conservando sus rutas:

```
database/migrations/2026_09_12_000006_add_task_delivery_dates_and_timers.php
app/Models/Work/WorkTask.php
app/Models/Work/TaskTimeSession.php
app/Services/Work/TaskTimerService.php
app/Services/Work/WorkTaskService.php
app/Services/Work/WorkTaskNotifier.php
app/Services/Work/WorkTaskMailDetails.php
app/Filament/Pages/UserTasks.php
resources/views/filament/pages/partials/user-task-detail.blade.php
resources/views/filament/pages/partials/task-labels.blade.php
resources/views/filament/pages/partials/task-timers.blade.php
```

2. Ejecutar desde la raíz del proyecto:

```bash
php artisan migrate --force
php artisan optimize:clear
php artisan queue:restart
```

Se requiere también la actualización anterior de reaperturas, documentada en reapertura-tareas.md. No se modifica ni se envía correo real durante las pruebas locales.
