'boolean', 'outbound_enabled' => 'boolean', 'is_paid' => 'boolean', 'paid_at' => 'datetime', 'monthly_price' => 'decimal:2', 'subscription_started_at' => 'datetime', 'subscription_expires_at' => 'datetime', 'smtp_password' => 'encrypted', 'quota_mb' => 'integer', 'disk_used_bytes' => 'integer', 'last_usage_sync_at' => 'datetime', 'credentials_issued_at' => 'datetime', 'metadata' => 'array', ]; protected $hidden = [ 'password_hash', 'webmail_secret', 'incoming_token', ]; public function user(): BelongsTo { return $this->belongsTo(User::class); } public function website(): BelongsTo { return $this->belongsTo(Website::class); } public function domain(): BelongsTo { return $this->belongsTo(Domain::class); } public function hostingAccount(): BelongsTo { return $this->belongsTo(HostingAccount::class); } public function emailDomain(): BelongsTo { return $this->belongsTo(EmailDomain::class); } public function threads(): HasMany { return $this->hasMany(MailThread::class); } public function messages(): HasMany { return $this->hasMany(MailMessage::class); } public function isStandalone(): bool { return $this->website_id === null && $this->email_domain_id !== null; } public function isWebsiteLinked(): bool { return $this->website_id !== null; } public function getDomainHostAttribute(): ?string { if ($this->emailDomain) { return $this->emailDomain->domain; } if ($this->domain) { return $this->domain->host; } $parts = explode('@', $this->address ?? '', 2); return $parts[1] ?? null; } public function getOwnerIdAttribute(): ?int { if ($this->user_id) { return $this->user_id; } if ($this->website) { return $this->website->owner_user_id; } return null; } }