$tasks * @property-read Collection $members * * @method Builder visibleByEmployee(User $user) * @method static ProjectFactory factory() */ class Project extends Model implements AuditableContract { use CustomAuditable; /** @use HasFactory */ use HasFactory; use HasUuids; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'name' => 'string', 'color' => 'string', 'archived_at' => 'datetime', ]; /** * Set default values for attributes. * * @var array */ protected $attributes = [ 'is_billable' => false, ]; /** * @return BelongsTo */ public function organization(): BelongsTo { return $this->belongsTo(Organization::class, 'organization_id'); } /** * @return BelongsTo */ public function client(): BelongsTo { return $this->belongsTo(Client::class, 'client_id'); } /** * @return HasMany */ public function members(): HasMany { return $this->hasMany(ProjectMember::class, 'project_id'); } /** * @return HasMany */ public function tasks(): HasMany { return $this->hasMany(Task::class); } /** * @return HasMany */ public function timeEntries(): HasMany { return $this->hasMany(TimeEntry::class, 'project_id'); } /** * @param Builder $builder */ public function scopeVisibleByEmployee(Builder $builder, User $user): void { $builder->where(function (Builder $builder) use ($user): Builder { return $builder->where('is_public', '=', true) ->orWhereHas('members', function (Builder $builder) use ($user): Builder { return $builder->whereBelongsTo($user, 'user'); }); }); } /** * @return Attribute */ protected function isArchived(): Attribute { return Attribute::make( get: fn (mixed $value, array $attributes) => isset($attributes['archived_at']), ); } }