*/ use HasFactory, HasUniqueSlug, SoftDeletes; /** * @return list */ protected function slugScopeAttributes(): array { return ['portal', 'language']; } protected function slugFallback(): string { return 'pressemitteilung'; } protected static function booted(): void { static::addGlobalScope(new PortalScope); } protected $fillable = [ 'uuid', 'portal', 'user_id', 'company_id', 'category_id', 'language', 'title', 'subtitle', 'slug', 'text', 'boilerplate_override', 'backlink_url', 'keywords', 'status', 'hits', 'teaser_begin', 'teaser_end', 'no_export', 'published_at', 'scheduled_at', 'embargo_at', 'legacy_portal', 'legacy_id', ]; protected function casts(): array { return [ 'portal' => Portal::class, 'status' => PressReleaseStatus::class, 'hits' => 'integer', 'teaser_begin' => 'integer', 'teaser_end' => 'integer', 'no_export' => 'boolean', 'published_at' => 'datetime', 'scheduled_at' => 'datetime', 'embargo_at' => 'datetime', 'deleted_at' => 'datetime', ]; } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function company(): BelongsTo { return $this->belongsTo(Company::class); } public function category(): BelongsTo { return $this->belongsTo(Category::class); } public function images(): HasMany { return $this->hasMany(PressReleaseImage::class); } public function attachments(): HasMany { return $this->hasMany(PressReleaseAttachment::class); } public function contacts(): BelongsToMany { return $this->belongsToMany(Contact::class, 'press_release_contact'); } public function statusLogs(): HasMany { return $this->hasMany(PressReleaseStatusLog::class)->orderByDesc('created_at'); } /** * Display-ready text. Returns sanitized HTML for Phase-7+ PMs and *

/
-wrapped legacy plain text for older imports. */ public function renderedText(): HtmlString { return app(PressReleaseHtmlSanitizer::class)->render($this->text); } public function plainTextLength(): int { return app(PressReleaseHtmlSanitizer::class)->plainTextLength($this->text); } }