*/ use HasFactory; protected $fillable = [ 'subject', 'body', 'filters', 'status', 'created_by_user_id', 'recipients_total', 'sent_count', 'failed_count', 'skipped_count', 'sent_at', ]; protected function casts(): array { return [ 'filters' => 'array', 'status' => NewsletterCampaignStatus::class, 'sent_at' => 'datetime', ]; } /** * @return BelongsTo */ public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } /** * @return HasMany */ public function recipients(): HasMany { return $this->hasMany(NewsletterCampaignRecipient::class); } public function isDraft(): bool { return $this->status === NewsletterCampaignStatus::Draft; } /** * Versandfertiger, gesäuberter Inhalt: nur leichtes HTML laut * Purifier-Profil `newsletter` (fett/kursiv, Listen, Links). */ public function sanitizedBody(): HtmlString { return new HtmlString((string) Purifier::clean($this->body ?? '', 'newsletter')); } }