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