/
DATKAI
/
ITCUP
Обзор
Документация
Войти
/
DATKAI
/
ITCUP
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
app/Models/Task.php
119 строк
3 KB
ITCUP Admin
Initial commit: ITCUP — базовая структура, инвентарь, задачник, пользователи
17 апр 2026, 09:29
17 апр 2026, 09:29
a2ae386
Код
Авторство
О чём код?
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; class Task extends Model { protected $fillable = [ 'title', 'description', 'status', 'priority', 'assigned_to', 'created_by', 'asset_id', 'location_id', 'due_date', 'completed_at', ]; protected $casts = [ 'due_date' => 'datetime', 'completed_at' => 'datetime', ]; public const STATUSES = [ 'new' => 'Новая', 'in_progress' => 'В работе', 'done' => 'Выполнена', 'postponed' => 'Отложена', 'cancelled' => 'Отменена', ]; public const STATUS_COLORS = [ 'new' => 'gray', 'in_progress' => 'info', 'done' => 'success', 'postponed' => 'warning', 'cancelled' => 'danger', ]; public const PRIORITIES = [ 'low' => 'Низкий', 'medium' => 'Средний', 'high' => 'Высокий', 'urgent' => 'Срочный', ]; public const PRIORITY_COLORS = [ 'low' => 'gray', 'medium' => 'info', 'high' => 'warning', 'urgent' => 'danger', ]; public const PRIORITY_ICONS = [ 'low' => 'heroicon-o-chevron-down', 'medium' => 'heroicon-o-minus', 'high' => 'heroicon-o-chevron-up', 'urgent' => 'heroicon-o-fire', ]; protected static function booted(): void { static::saving(function (Task $task) { // Автоматически ставим completed_at при переходе в "выполнена" if ($task->isDirty('status')) { if ($task->status === 'done' && !$task->completed_at) { $task->completed_at = now(); } elseif ($task->getOriginal('status') === 'done' && $task->status !== 'done') { $task->completed_at = null; } } }); } public function assignedUser(): BelongsTo { return $this->belongsTo(User::class, 'assigned_to'); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function asset(): BelongsTo { return $this->belongsTo(Asset::class); } public function location(): BelongsTo { return $this->belongsTo(Location::class); } public function comments(): HasMany { return $this->hasMany(TaskComment::class)->latest(); } public function isOverdue(): bool { return $this->due_date && $this->due_date->isPast() && !in_array($this->status, ['done', 'cancelled']); } public function isDueSoon(int $hours = 24): bool { return $this->due_date && !$this->due_date->isPast() && $this->due_date->diffInHours(now()) <= $hours && !in_array($this->status, ['done', 'cancelled']); } }