'integer', 'cpu' => 'integer', 'ram' => 'integer', 'disk' => 'integer', 'behind_traefik' => 'boolean', 'proxmox_uptime' => 'integer', 'proxmox_status_at' => 'datetime', ]; } public function owner(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } public function ipPool(): BelongsTo { return $this->belongsTo(IpPool::class, 'ip_pool_id'); } public function plan(): BelongsTo { return $this->belongsTo(HostingPlan::class, 'hosting_plan_id'); } public function whmcsService(): BelongsTo { return $this->belongsTo(WhmcsService::class, 'whmcs_service_id'); } public function vmidReservation(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(VmidReservation::class); } public function devices(): HasMany { return $this->hasMany(VmDevice::class)->orderBy('sort_order'); } public function snapshots(): HasMany { return $this->hasMany(VmSnapshot::class); } public function backups(): HasMany { return $this->hasMany(VmBackup::class); } public function firewallRules(): HasMany { return $this->hasMany(VmFirewallRule::class)->orderBy('sort_order'); } public function metrics(): HasMany { return $this->hasMany(VmMetric::class)->orderByDesc('recorded_at'); } public function activityLogs(): HasMany { return $this->hasMany(VmActivityLog::class)->latest(); } public function isRunning(): bool { return $this->proxmox_status === 'running'; } public function scopeForUser(Builder $query, User $user): Builder { if ($user->isAdmin()) { return $query; } return $query->where('user_id', $user->id); } public function isProvisionable(): bool { return in_array($this->status, ['pending', 'failed'], true); } public function displayName(): string { return $this->name.($this->vmid ? " (#{$this->vmid})" : ''); } }