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:
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class IssueChecklistTemplate extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $fillable = ['project_id', 'name', 'items'];
|
||||
|
||||
protected $casts = ['items' => 'array'];
|
||||
|
||||
public function project()
|
||||
{
|
||||
return $this->belongsTo(Project::class);
|
||||
}
|
||||
}
|
||||
@@ -11,16 +11,25 @@ class IssueTask extends Model
|
||||
|
||||
protected $fillable = [
|
||||
'issue_id', 'title', 'is_done', 'done_at', 'done_by',
|
||||
'assigned_to', 'due_date', 'order',
|
||||
'assigned_to', 'due_date', 'order', 'overdue_notified_at',
|
||||
'uuid', 'client_updated_at',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'is_done' => 'boolean',
|
||||
'done_at' => 'datetime',
|
||||
'due_date' => 'date',
|
||||
'is_done' => 'boolean',
|
||||
'done_at' => 'datetime',
|
||||
'due_date' => 'date',
|
||||
'overdue_notified_at' => 'datetime',
|
||||
];
|
||||
|
||||
/** Tasks that are past their due date and not yet completed. */
|
||||
public function scopeOverdue($q)
|
||||
{
|
||||
return $q->where('is_done', false)
|
||||
->whereNotNull('due_date')
|
||||
->whereDate('due_date', '<', now()->toDateString());
|
||||
}
|
||||
|
||||
public function issue() { return $this->belongsTo(Issue::class); }
|
||||
public function assignee() { return $this->belongsTo(User::class, 'assigned_to'); }
|
||||
public function completer() { return $this->belongsTo(User::class, 'done_by'); }
|
||||
|
||||
Reference in New Issue
Block a user