'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', ]; protected function features(): Attribute { return Attribute::make( get: fn (mixed $value) => $value ? json_decode($value, true) : [], set: fn (array $value) => json_encode($value), ); } 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, ]; } }