'array', 'expires_at' => 'datetime', 'used_at' => 'datetime', ]; public function broker(): BelongsTo { return $this->belongsTo(Partner::class, 'broker_partner_id'); } public function partner(): BelongsTo { return $this->belongsTo(Partner::class); } public function usedBy(): BelongsTo { return $this->belongsTo(User::class, 'used_by_user_id'); } public function assignedToCode(): BelongsTo { return $this->belongsTo(RegistrationCode::class, 'assigned_to_code_id'); } public function scopeAvailable($query) { return $query->where('status', self::STATUS_AVAILABLE); } public function isAvailable(): bool { if ($this->status !== self::STATUS_AVAILABLE) { return false; } if ($this->expires_at && now()->greaterThan($this->expires_at)) { return false; } return true; } public function markUsed(?User $user = null): void { $this->status = self::STATUS_USED; $this->used_at = now(); if ($user) { $this->used_by_user_id = $user->id; if ($user->partner_id && !$this->partner_id) { $this->partner_id = $user->partner_id; } } $this->save(); } }