'array', 'start_date' => 'date', 'due_date' => 'date', 'estimated_time' => 'decimal:2', 'actual_time' => 'decimal:2', ]; public function scopeBlocked(Builder $query): Builder { return $query->where(function (Builder $blocked) { $blocked->whereNotNull('blocker_type') ->orWhereNotNull('blocker_note'); }); } public function getIsBlockedAttribute(): bool { return filled($this->blocker_type) || filled($this->blocker_note); } public function project(): BelongsTo { return $this->belongsTo(Project::class); } public function assignee(): BelongsTo { return $this->belongsTo(User::class, 'assignee_id'); } public function reporter(): BelongsTo { return $this->belongsTo(User::class, 'reporter_id'); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function checklists(): HasMany { return $this->hasMany(Checklist::class); } public function subtasks(): HasMany { return $this->hasMany(Subtask::class); } public function comments(): MorphMany { return $this->morphMany(Comment::class, 'commentable'); } public function files(): MorphMany { return $this->morphMany(File::class, 'fileable'); } public function sprints() { return $this->belongsToMany(Sprint::class, 'sprint_task')->withTimestamps(); } }