Stage.php
1 <?php 2 3 namespace App\Models; 4 5 use App\Enums\StatusEnum; 6 use Carbon\Carbon; 7 use Illuminate\Database\Eloquent\Factories\HasFactory; 8 use Illuminate\Database\Eloquent\Model; 9 use Illuminate\Database\Eloquent\Relations\HasMany; 10 use Spatie\Activitylog\LogOptions; 11 use Illuminate\Database\Eloquent\SoftDeletes; 12 use Spatie\Activitylog\Traits\LogsActivity; 13 14 class Stage extends Model 15 { 16 use HasFactory, LogsActivity, SoftDeletes; 17 18 protected $fillable = ['dossier_id', 'name', 'order', 'stage_status_id']; 19 20 public static function byName(string $name, Dossier $dossier) 21 { 22 foreach ($dossier->stages as $stage) { 23 if ($stage->name === $name) { 24 return $stage; 25 } else { 26 return false; 27 } 28 } 29 } 30 31 public function pendingTasks() 32 { 33 return $this->tasks()->whereNot('task_status_id', StatusEnum::finished()->value); 34 } 35 36 public function tasks(): HasMany 37 { 38 return $this->hasMany(Task::class)->where('is_milestone', false); 39 } 40 41 public function milestones(): HasMany 42 { 43 return $this->hasMany(Task::class)->where('is_milestone', true); 44 } 45 46 public function discardNonFinishedMilestones() 47 { 48 $this->milestones() 49 ->whereNot('task_status_id', StatusEnum::finished()->value)->get() 50 ->each(function ($milestone) { 51 $milestone->update([ 52 'task_status_id' => StatusEnum::finished()->value, 53 'end_date' => Carbon::now(), 54 'milestone_end_date' => null, 55 ]); 56 }); 57 } 58 59 public function dossier() 60 { 61 return $this->belongsTo(Dossier::class); 62 } 63 64 public function documents() 65 { 66 return $this->hasMany(Document::class); 67 } 68 69 public function stage_status() 70 { 71 return $this->belongsTo(StageStatus::class); 72 } 73 74 public function checkStatus() 75 { 76 77 $tasksStatuses = $this->tasks->pluck('task_status_id'); 78 79 80 $status = match (true) { 81 $tasksStatuses->every(function (int $id, $key) { 82 return $id === StatusEnum::finished()->value; 83 }) => StatusEnum::finished(), 84 $tasksStatuses->every(function (int $id) { 85 return $id === StatusEnum::pending()->value; 86 }) => StatusEnum::pending(), 87 default => StatusEnum::inProcess(), 88 }; 89 90 $this->update(['stage_status_id' => $status->value]); 91 return $status; 92 93 // $tasks = $this->tasks; 94 // if (count($tasks) > 0) { 95 // if ( 96 // !in_array(StatusEnum::pending()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::inProcess()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::waiting()->value, array_column($tasks->toArray(), 'task_status_id')) 97 // ) { 98 // if ($this->stage_status_id !== StatusEnum::finished()->value) { 99 100 // $this->update(['stage_status_id' => StatusEnum::finished()->value]); 101 102 // // si termina una stage pasa a la siguiente por order 103 104 // // $newStage = Stage::where([ 105 // // ['dossier_id', $this->dossier_id], 106 // // ['stage_status_id', StatusEnum::pending()->value], 107 // // ])->first(); 108 109 // // las tareas de esa stage deberÃan de pasar a estar en proceso, ser asignadas y notificadas 110 111 // // if ($newStage) { 112 // // AutoTaskService::assignTasks($newStage); 113 // // } 114 // } 115 // } elseif (!in_array(StatusEnum::finished()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::inProcess()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::waiting()->value, array_column($tasks->toArray(), 'task_status_id'))) { 116 // if ($this->stage_status_id !== StatusEnum::pending()->value) { 117 // $this->update(['stage_status_id' => StatusEnum::pending()->value]); 118 // } 119 // } elseif (!in_array(StatusEnum::finished()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::finished()->value, array_column($tasks->toArray(), 'task_status_id')) && !in_array(StatusEnum::waiting()->value, array_column($tasks->toArray(), 'task_status_id'))) { 120 // if ($this->stage_status_id !== StatusEnum::inProcess()->value) { 121 // $this->update(['stage_status_id' => StatusEnum::inProcess()->value]); 122 // } 123 // } else { 124 // if ($this->stage_status_id !== StatusEnum::waiting()->value) { 125 // $this->update(['stage_status_id' => StatusEnum::inProcess()->value]); 126 // } 127 // } 128 // } 129 } 130 131 public function getNumber(): int 132 { 133 $matches = []; 134 $pattern = '/\d+/'; 135 preg_match($pattern, $this->name, $matches); 136 137 if (isset($matches[0])) { 138 return max(0, min(12, (int)$matches[0])); 139 } else { 140 return -1; 141 } 142 } 143 144 public function getActivitylogOptions(): LogOptions 145 { 146 return LogOptions::defaults() 147 ->logOnly(['dossier_id', 'name', 'stage_status_id', 'stage_status.name']) 148 ->logOnlyDirty() 149 ->dontSubmitEmptyLogs(); 150 } 151 }