TaskPriority::class, 'status' => TaskStatus::class, 'visibility' => TaskVisibility::class, 'due_at' => 'datetime', 'started_at' => 'datetime', 'completed_at' => 'datetime', 'reminder_at' => 'datetime', 'version' => 'integer', 'estimated_minutes' => 'integer', ]; } public function taskable(): MorphTo { return $this->morphTo(); } public function assignee(): BelongsTo { return $this->belongsTo(User::class, 'assigned_to'); } public function assigner(): BelongsTo { return $this->belongsTo(User::class, 'assigned_by'); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function parent(): BelongsTo { return $this->belongsTo(self::class, 'parent_task_id'); } public function subtasks(): HasMany { return $this->hasMany(self::class, 'parent_task_id'); } public function scopeActive(Builder $query): Builder { return $query->whereIn('status', [TaskStatus::Open->value, TaskStatus::InProgress->value]); } public function getIsOverdueAttribute(): bool { return $this->status->isActive() && $this->due_at?->isPast() === true; } }