Task.php
1 <?php 2 3 namespace App\Models; 4 5 use Carbon\Carbon; 6 use Illuminate\Database\Eloquent\Factories\HasFactory; 7 use Illuminate\Database\Eloquent\Model; 8 use Illuminate\Database\Eloquent\Relations\BelongsTo; 9 use Illuminate\Database\Eloquent\Relations\HasMany; 10 use Illuminate\Database\Eloquent\Relations\HasOne; 11 use Illuminate\Database\Eloquent\SoftDeletes; 12 use Spatie\Activitylog\LogOptions; 13 use Spatie\Activitylog\Traits\LogsActivity; 14 15 class Task extends Model 16 { 17 use HasFactory, LogsActivity, SoftDeletes; 18 19 protected $guarded = []; 20 21 protected $dates = ['start_date', 'end_date', 'expiration_date', 'milestone_end_date']; 22 23 protected static function boot() 24 { 25 parent::boot(); 26 27 static::creating(function ($task) { 28 if (auth()->check()) { 29 $task->author_id = auth()->id(); 30 } 31 }); 32 } 33 34 public function user(): BelongsTo 35 { 36 return $this->belongsTo(User::class); 37 } 38 39 public function author(): BelongsTo 40 { 41 return $this->belongsTo(User::class, 'author_id'); 42 } 43 44 public function role(): BelongsTo 45 { 46 return $this->belongsTo(Role::class); 47 } 48 49 public function stage(): BelongsTo 50 { 51 return $this->belongsTo(Stage::class); 52 } 53 54 public function revision(): BelongsTo 55 { 56 return $this->belongsTo(Revision::class); 57 } 58 59 public function comments(): HasMany 60 { 61 return $this->hasMany(TaskComment::class); 62 } 63 64 public function task_status(): BelongsTo 65 { 66 return $this->belongsTo(TaskStatus::class); 67 } 68 69 public function milestoneValidation() 70 { 71 return $this->belongsTo(Validation::class, 'milestone_validation_id'); 72 } 73 74 public function milestoneRelatedTask() 75 { 76 return $this->belongsTo(Task::class, 'milestone_related_task_id'); 77 } 78 79 public function dossier(): Dossier|null 80 { 81 return $this->stage->dossier ?? null; 82 } 83 84 public function document() 85 { 86 return $this->revision ? $this->revision->document : null; 87 } 88 89 public function outPut(): HasOne 90 { 91 return $this->hasOne(OutPut::class); 92 } 93 94 public function scopeDeadlineClose($query) 95 { 96 return $query->where('expiration_date', '<=', Carbon::now()->addDays(config('app.notify_task_days'))->toDateString()); 97 } 98 99 public function scopeNotFinished($query) 100 { 101 return $query->where('task_status_id', '<>', TaskStatus::where('name', 'Finished')->first()->id); 102 } 103 104 public function scopeSearch($query, string $searchString) 105 { 106 return $query->where(function ($q) use ($searchString) { 107 $q->where('tasks.title', 'like', '%' . $searchString . '%') 108 ->orWhere('tasks.description', 'like', '%' . $searchString . '%'); 109 }); 110 } 111 112 public function scopeOrderByRole($query, string $direction) 113 { 114 return $query->leftJoin('roles', 'tasks.role_id', '=', 'roles.id') 115 ->select('tasks.*') 116 ->orderBy('roles.name', $direction); 117 } 118 119 public function scopeOrderByDossier($query, string $direction) 120 { 121 return $query->leftJoin('stages', 'tasks.stage_id', '=', 'stages.id') 122 ->leftJoin('dossiers', 'stages.dossier_id', '=', 'dossiers.id') 123 ->select('tasks.*') 124 ->orderBy('dossiers.code_year', $direction) 125 ->orderBy('dossiers.code_seq', $direction); 126 } 127 128 public function scopeOrderByStatus($query, string $direction) 129 { 130 return $query->leftJoin('task_statuses', 'tasks.task_status_id', '=', 'task_statuses.id') 131 ->select('tasks.*') 132 ->orderBy('task_statuses.name', $direction); 133 } 134 135 public function getActivitylogOptions(): LogOptions 136 { 137 return LogOptions::defaults() 138 ->logOnly([ 139 'title', 140 'description', 141 'user_id', 142 'user.username', 143 'stage_id', 144 'stage.name', 145 'task_status_id', 146 'task_status.name', 147 'revision_id', 148 'revision.name', 149 ])->logOnlyDirty() 150 ->dontSubmitEmptyLogs(); 151 } 152 }