'decimal:2', 'max_photos' => 'integer', 'max_guests' => 'integer', 'gallery_days' => 'integer', 'max_tasks' => 'integer', 'max_events_per_year' => 'integer', 'expires_after' => 'datetime', 'watermark_allowed' => 'boolean', 'branding_allowed' => 'boolean', 'features' => 'array', 'name_translations' => 'array', 'description_translations' => 'array', 'description_table' => 'array', ]; protected function features(): Attribute { return Attribute::make( get: function ($value) { if (is_array($value)) { return $value; } if (is_string($value)) { $decoded = json_decode($value, true); if (is_string($decoded)) { $decoded = json_decode($decoded, true); } if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { return $decoded; } } return []; }, ); } public function eventPackages(): HasMany { return $this->hasMany(EventPackage::class); } public function tenantPackages(): HasMany { return $this->hasMany(TenantPackage::class); } public function packagePurchases(): HasMany { return $this->hasMany(PackagePurchase::class); } public function isEndcustomer(): bool { return $this->type === 'endcustomer'; } public function isReseller(): bool { return $this->type === 'reseller'; } public function getLimitsAttribute(): array { return [ 'max_photos' => $this->max_photos, 'max_guests' => $this->max_guests, 'gallery_days' => $this->gallery_days, 'max_tasks' => $this->max_tasks, 'max_events_per_year' => $this->max_events_per_year, ]; } }