resetPage(); } public function updatedTypeFilter(): void { $this->resetPage(); } public function updatedWithdrawalStatusFilter(): void { $this->resetPage('withdrawals'); } public function updatedTerminationStatusFilter(): void { $this->resetPage('terminations'); } /** * Widerruf als erledigt markieren (Rückabwicklung angestoßen/abgeschlossen). */ public function resolveWithdrawal(int $id): void { WithdrawalRequest::query()->findOrFail($id)->update([ 'status' => 'resolved', 'resolved_at' => now(), ]); } public function reopenWithdrawal(int $id): void { WithdrawalRequest::query()->findOrFail($id)->update([ 'status' => 'open', 'resolved_at' => null, ]); } /** * Kündigung (§ 312k) als erledigt markieren (Vertrag beendet, Kunde hat * die Bestätigung des Beendigungszeitpunkts erhalten). */ public function resolveTermination(int $id): void { TerminationRequest::query()->findOrFail($id)->update([ 'status' => 'resolved', 'resolved_at' => now(), ]); } public function reopenTermination(int $id): void { TerminationRequest::query()->findOrFail($id)->update([ 'status' => 'open', 'resolved_at' => null, ]); } public function with(): array { $requests = LegalRequest::query() ->with('pressRelease:id,title,slug') ->when($this->statusFilter === 'open', fn ($query) => $query->open()) ->when(! in_array($this->statusFilter, ['open', 'all'], true), fn ($query) => $query->where('status', $this->statusFilter)) ->when($this->typeFilter !== 'all', fn ($query) => $query->where('type', $this->typeFilter)) ->latest() ->paginate(50); $withdrawals = WithdrawalRequest::query() ->when($this->withdrawalStatusFilter === 'open', fn ($query) => $query->open()) ->when($this->withdrawalStatusFilter === 'resolved', fn ($query) => $query->where('status', 'resolved')) ->latest() ->paginate(25, pageName: 'withdrawals'); $terminations = TerminationRequest::query() ->when($this->terminationStatusFilter === 'open', fn ($query) => $query->open()) ->when($this->terminationStatusFilter === 'resolved', fn ($query) => $query->where('status', 'resolved')) ->latest() ->paginate(25, pageName: 'terminations'); return [ 'requests' => $requests, 'typeOptions' => LegalRequestType::cases(), 'openCount' => LegalRequest::query()->open()->count(), 'totalCount' => LegalRequest::query()->count(), 'withdrawals' => $withdrawals, 'openWithdrawalCount' => WithdrawalRequest::query()->open()->count(), 'terminations' => $terminations, 'openTerminationCount' => TerminationRequest::query()->open()->count(), ]; } public function statusBadgeClass(LegalRequestStatus $status): string { return match ($status) { LegalRequestStatus::Open => 'warn', LegalRequestStatus::InProgress => 'hub', LegalRequestStatus::Resolved => 'ok', LegalRequestStatus::Rejected => 'err', }; } }; ?>
{{-- ============== PAGE HEADER ============== --}} {{-- ============== KPI-Reihe ============== --}}
{{ __('zu bearbeiten') }} {{ __('offen + in Bearbeitung') }} {{ __('alle Anfragen') }} {{ __('inkl. erledigt') }} {{ __('Online-Widerruf') }} {{ __('gesetzliche Frist beachten') }} {{ __('Kündigungsbutton § 312k') }} {{ __('Beendigungszeitpunkt bestätigen') }}
{{-- ============== FILTER ============== --}}
{{ __('Filter') }}
@foreach ($typeOptions as $typeOption) @endforeach
{{-- ============== TABELLE ============== --}}
{{ __('Anfragen') }} {{ __(':count Einträge', ['count' => $requests->total()]) }}
{{ __('Typ') }} {{ __('Status') }} {{ __('Pressemitteilung') }} {{ __('Absender') }} {{ __('Eingegangen') }} {{ __('Aktion') }} @forelse ($requests as $request) {{ $request->type->label() }} {{ $request->reference() }} {{ $request->status->label() }} {{ \Illuminate\Support\Str::limit($request->pressRelease?->title ?? $request->reportedUrl() ?? __('PM gelöscht'), 60) }} {{ $request->requester_email ?: __('anonym') }} {{ $request->created_at?->format('d.m.Y H:i') ?? '-' }} {{ __('Öffnen') }} @empty
{{ __('Keine Anfragen in dieser Ansicht') }}
@endforelse
{{-- ============== WIDERRUFE (Online-Widerruf, gesetzlicher Widerrufsbutton) ============== --}}
{{ __('Widerrufe') }}
{{ __(':count Einträge', ['count' => $withdrawals->total()]) }}
{{ __('Vorgang') }} {{ __('Name') }} {{ __('E-Mail') }} {{ __('Bestell-/Rechnungsnr.') }} {{ __('Eingegangen') }} {{ __('Status') }} {{ __('Aktion') }} @forelse ($withdrawals as $withdrawal) W-{{ $withdrawal->id }} {{ $withdrawal->name }} {{ $withdrawal->email }} {{ $withdrawal->order_reference ?: '—' }} {{ $withdrawal->created_at?->format('d.m.Y H:i') ?? '-' }} @if ($withdrawal->status === 'open') {{ __('Offen') }} @else {{ __('Erledigt') }} @endif @if ($withdrawal->status === 'open') {{ __('Erledigt') }} @else {{ __('Wieder öffnen') }} @endif @empty
{{ __('Keine Widerrufe in dieser Ansicht') }}

{{ __('Online-Widerrufe über den „Vertrag widerrufen"-Button laufen hier auf. Die Eingangsbestätigung an den Verbraucher wird automatisch versendet.') }}

@endforelse
{{-- ============== KÜNDIGUNGEN (Kündigungsbutton § 312k BGB) ============== --}}
{{ __('Kündigungen') }}
{{ __(':count Einträge', ['count' => $terminations->total()]) }}
{{ __('Vorgang') }} {{ __('Art') }} {{ __('Name') }} {{ __('E-Mail') }} {{ __('Beendigung') }} {{ __('Eingegangen') }} {{ __('Status') }} {{ __('Aktion') }} @forelse ($terminations as $termination) K-{{ $termination->id }} {{ $termination->isExtraordinary() ? __('Außerordentlich') : __('Ordentlich') }} @if ($termination->isExtraordinary() && $termination->reason)

{{ \Illuminate\Support\Str::limit($termination->reason, 90) }}

@endif
{{ $termination->name }} @if ($termination->contract_reference)

{{ __('Vertrag/Rechnung:') }} {{ $termination->contract_reference }}

@endif
{{ $termination->email }} {{ $termination->terminate_at?->format('d.m.Y') ?? __('nächstmöglich') }} {{ $termination->created_at?->format('d.m.Y H:i') ?? '-' }} @if ($termination->status === 'open') {{ __('Offen') }} @else {{ __('Erledigt') }} @endif @if ($termination->status === 'open') {{ __('Erledigt') }} @else {{ __('Wieder öffnen') }} @endif
@empty
{{ __('Keine Kündigungen in dieser Ansicht') }}

{{ __('Online-Kündigungen über den Kündigungsbutton (§ 312k BGB) laufen hier auf. Die Zugangsbestätigung an den Verbraucher wird automatisch versendet – der Beendigungszeitpunkt muss manuell bestätigt werden.') }}

@endforelse