/ app / Models / Task.php
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  }