'datetime', 'expires_at' => 'datetime', ]; public function plan(): BelongsTo { return $this->belongsTo(MembershipPlan::class, 'plan_id'); } public function usedBy(): BelongsTo { return $this->belongsTo(User::class, 'used_by'); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function isUsed(): bool { return ! is_null($this->used_at); } public function isExpired(): bool { return $this->expires_at && $this->expires_at->isPast(); } public function isValid(): bool { return ! $this->isUsed() && ! $this->isExpired(); } public static function generateCode(): string { do { $hex = strtoupper(bin2hex(random_bytes(6))); $code = implode('-', str_split($hex, 4)); } while (self::where('code', $code)->exists()); return $code; } }