*/ use HasFactory; protected $fillable = [ 'press_release_id', 'portal', 'type', 'status', 'requester_email', 'message', 'payload', 'requester_ip', 'resolved_by_user_id', 'admin_note', 'resolved_at', ]; protected function casts(): array { return [ 'type' => LegalRequestType::class, 'status' => LegalRequestStatus::class, 'payload' => 'array', 'resolved_at' => 'datetime', ]; } /** * Öffentliche Vorgangsnummer (T10) — analog zur Kündigung ("K-{id}"). * Wird in der Eingangsbestätigung genannt und bei Rückfragen referenziert. */ public function reference(): string { return 'M-'.$this->id; } /** * Name des Meldenden (Standalone-Formulare, DSA Art. 16) — strukturierte * Zusatzfelder liegen bewusst im payload (WS-3). */ public function requesterName(): ?string { return $this->payload['requester_name'] ?? null; } /** * Gemeldete URL, wie vom Meldenden angegeben (Standalone-Formulare). */ public function reportedUrl(): ?string { return $this->payload['reported_url'] ?? null; } public function pressRelease(): BelongsTo { return $this->belongsTo(PressRelease::class); } public function resolver(): BelongsTo { return $this->belongsTo(User::class, 'resolved_by_user_id'); } /** * @param Builder $query * @return Builder */ public function scopeOpen(Builder $query): Builder { return $query->whereIn('status', [ LegalRequestStatus::Open->value, LegalRequestStatus::InProgress->value, ]); } }