feat(issues): notificaciones, plantillas de checklist, alertas de vencimiento y reporte desde el mapa
- Notificaciones (DB): asignación de incidencia (IssueAssigned), asignación de tarea (IssueTaskAssigned), comentario (IssueCommented) y cambio de estado (IssueStatusChanged) a reporter+asignado excluyendo al actor. - Plantillas de checklist: tabla issue_checklist_templates + modelo, gestor CRUD (IssueChecklistManager, ruta projects.issues.checklists) y "Aplicar plantilla" en el detalle (alta masiva de tareas). - Alertas de vencimiento: columna overdue_notified_at + scope overdue, comando issues:notify-overdue (programado a diario) que avisa al asignado una sola vez; badge "vencidas" en la tabla y resaltado por tarea en el detalle. - Reporte desde el mapa: botón "Incidencia" en el panel del feature seleccionado → formulario con feature pre-vinculado (IssueForm lee ?feature=). Tests: IssuesEnhancementsTest (7). Suite 57 passing (solo 2 pre-existentes sqlite). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,9 @@ class IssueTable extends DataTableComponent
|
||||
'media',
|
||||
'tasks',
|
||||
'tasks as tasks_done_count' => fn (Builder $q) => $q->where('is_done', true),
|
||||
'tasks as overdue_tasks_count' => fn (Builder $q) => $q->where('is_done', false)
|
||||
->whereNotNull('due_date')
|
||||
->whereDate('due_date', '<', now()->toDateString()),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -81,6 +84,9 @@ class IssueTable extends DataTableComponent
|
||||
<span class="text-xs text-base-content/50">'.$row->tasks_done_count.'/'.$row->tasks_count.' tareas</span>
|
||||
</div>';
|
||||
}
|
||||
if ($row->overdue_tasks_count) {
|
||||
$html .= '<div class="mt-1"><span class="badge badge-error badge-sm gap-1">⏰ '.$row->overdue_tasks_count.' vencida'.($row->overdue_tasks_count > 1 ? 's' : '').'</span></div>';
|
||||
}
|
||||
return $html;
|
||||
})
|
||||
->html(),
|
||||
|
||||
Reference in New Issue
Block a user