*/ use HasFactory; protected $fillable = [ 'press_release_id', 'portal', 'type', 'status', 'requester_email', 'message', 'payload', 'requester_ip', 'verified_at', 'verification_method', 'single_purchase_id', 'resolved_by_user_id', 'admin_note', 'resolved_at', 'executed_at', ]; protected function casts(): array { return [ 'type' => LegalRequestType::class, 'status' => LegalRequestStatus::class, 'payload' => 'array', 'verified_at' => 'datetime', 'verification_method' => LegalRequestVerificationMethod::class, 'resolved_at' => 'datetime', 'executed_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; } /** * @return BelongsTo */ public function pressRelease(): BelongsTo { return $this->belongsTo(PressRelease::class); } /** * @return BelongsTo */ public function resolver(): BelongsTo { return $this->belongsTo(User::class, 'resolved_by_user_id'); } /** * Bezahlvorgang der kostenpflichtigen Spuren (Depublizierung/Änderung). * * @return BelongsTo */ public function singlePurchase(): BelongsTo { return $this->belongsTo(SinglePurchase::class); } /** * Verschlüsselte Vorher-Snapshots ausgeführter Mutationen (Korrektur/ * Anonymisierung) — Grundlage der Rückgängig-Option bis zur Löschfrist. * * @return HasMany */ public function redactionSnapshots(): HasMany { return $this->hasMany(PressReleaseRedactionSnapshot::class); } /** * @param Builder $query * @return Builder */ public function scopeOpen(Builder $query): Builder { return $query->whereIn('status', [ LegalRequestStatus::Open->value, LegalRequestStatus::InProgress->value, ]); } }