80 خطوط
2.1 KiB
PHP
80 خطوط
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Enums\TaskPriority;
|
|
use App\Enums\TaskStatus;
|
|
use App\Enums\TaskVisibility;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
|
|
class Task extends Model
|
|
{
|
|
use SoftDeletes;
|
|
|
|
protected $fillable = [
|
|
'subject', 'description', 'taskable_type', 'taskable_id', 'assigned_to', 'assigned_by',
|
|
'created_by', 'priority', 'status', 'due_at', 'started_at', 'completed_at', 'reminder_at',
|
|
'parent_task_id', 'estimated_minutes', 'visibility', 'version',
|
|
];
|
|
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'priority' => 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;
|
|
}
|
|
}
|