belongsTo(Company::class); } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function invitedBy(): BelongsTo { return $this->belongsTo(User::class, 'invited_by'); } public function role(): BelongsTo { return $this->belongsTo(Role::class); } public function isExpired(): bool { return Carbon::now()->greaterThan($this->expires_at); } public function isPending(): bool { return $this->status === self::STATUS_PENDING && ! $this->isExpired(); } /** * Scope to pending, non-expired invitations. */ public function scopePending(Builder $query): void { $query->where('status', self::STATUS_PENDING) ->where('expires_at', '>', Carbon::now()); } /** * Scope to invitations for a specific user (by user_id or email). */ public function scopeForUser(Builder $query, User $user): void { $query->where(function (Builder $q) use ($user) { $q->where('user_id', $user->id) ->orWhere('email', $user->email); }); } }