SourceStatus::class, ]; public function sourceType(): BelongsTo { return $this->belongsTo(SourceType::class); } public function depot(): BelongsTo { return $this->belongsTo(Depot::class); } public function section(): BelongsTo { return $this->belongsTo(Section::class); } public function lieu(): BelongsTo { return $this->belongsTo(Lieu::class); } public function membres(): BelongsToMany { return $this->belongsToMany(User::class, 'source_user'); } public function releves(): HasMany { return $this->hasMany(Releve::class); } public function isVisibleBy(User $user): bool { if ($user->isAdmin() || $user->isSectionManager()) { return true; } if ($this->status === SourceStatus::Termine) { return true; } return $this->membres()->where('user_id', $user->id)->exists(); } public function canTransitionTo(SourceStatus $new, User $user): bool { if (! in_array($new, $this->status->transitions())) { return false; } return match ($new) { SourceStatus::AValider => $user->isAdmin() || $user->isSectionManager() || $this->membres()->where('user_id', $user->id)->exists(), SourceStatus::Termine, SourceStatus::EnCours => $user->isAdmin() || $user->isSectionManager(), default => false, }; } }