CRM/backend/app/Models/Task.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;
}
}