resetPage(); } public function updatedPortalFilter(): void { $this->resetPage(); } public function updatedStatusFilter(): void { $this->resetPage(); } public function updatedMappingFilter(): void { $this->resetPage(); } public function updatedPdfFilter(): void { $this->resetPage(); } public function resetFilters(): void { $this->reset(['search', 'portalFilter', 'statusFilter', 'mappingFilter', 'pdfFilter']); $this->resetPage(); } public function with(): array { $baseQuery = LegacyInvoice::query(); $filteredQuery = $this->filteredQuery(); $supportsPdfGeneratedAt = $this->supportsPdfGeneratedAt(); return [ 'invoices' => $filteredQuery ->with('user:id,name,email') ->latest('invoice_date') ->latest('id') ->paginate(50), 'statusOptions' => (clone $baseQuery) ->whereNotNull('status') ->distinct() ->orderBy('status') ->pluck('status') ->filter() ->values(), 'portalOptions' => collect([Portal::Presseecho, Portal::Businessportal24]), 'stats' => [ 'count' => (clone $baseQuery)->count(), 'total_cents' => (int) (clone $baseQuery)->sum('total_cents'), 'paid_count' => (clone $baseQuery)->whereNotNull('paid_at')->count(), 'unmapped_count' => (clone $baseQuery)->whereNull('user_id')->count(), 'generated_pdf_count' => $supportsPdfGeneratedAt ? (clone $baseQuery)->whereNotNull('pdf_generated_at')->count() : 0, 'filtered_count' => (clone $filteredQuery)->count(), ], 'supportsPdfGeneratedAt' => $supportsPdfGeneratedAt, ]; } private function filteredQuery(): Builder { return LegacyInvoice::query() ->when(filled($this->search), function (Builder $query): void { $search = trim($this->search); $query->where(function (Builder $query) use ($search): void { $query ->where('number', 'like', '%'.$search.'%') ->orWhere('legacy_id', $search) ->orWhere('legacy_user_id', $search) ->orWhereHas('user', function (Builder $query) use ($search): void { $query ->where('name', 'like', '%'.$search.'%') ->orWhere('email', 'like', '%'.$search.'%'); }); }); }) ->when($this->portalFilter !== 'all', fn (Builder $query) => $query->where('legacy_portal', $this->portalFilter)) ->when($this->statusFilter !== 'all', fn (Builder $query) => $query->where('status', $this->statusFilter)) ->when($this->mappingFilter === 'mapped', fn (Builder $query) => $query->whereNotNull('user_id')) ->when($this->mappingFilter === 'unmapped', fn (Builder $query) => $query->whereNull('user_id')) ->when($this->supportsPdfGeneratedAt() && $this->pdfFilter === 'generated', fn (Builder $query) => $query->whereNotNull('pdf_generated_at')) ->when($this->supportsPdfGeneratedAt() && $this->pdfFilter === 'pending', fn (Builder $query) => $query->whereNull('pdf_generated_at')); } private function supportsPdfGeneratedAt(): bool { return Schema::hasColumn('legacy_invoices', 'pdf_generated_at'); } }; ?>
{{-- ============== PAGE HEADER ============== --}} @if ($stats['unmapped_count'] > 0)
{{ __(':count Legacy-Rechnungen konnten keinem neuen User zugeordnet werden. Sie bleiben im Archiv sichtbar und sollten im Rehearsal-Report fachlich geprüft werden.', ['count' => number_format($stats['unmapped_count'], 0, ',', '.')]) }}
@endif {{-- ============== KPI-Reihe ============== --}}
{{ __('Archivdatensätze') }} {{ __('historisch') }} {{ __('mit Zahldatum') }} {{ __('zu mappen') }} @if ($supportsPdfGeneratedAt) {{ __('aus Archiv') }} @else {{ __('Schema-Update fehlt') }} @endif
{{-- ============== FILTER-PANEL ============== --}}
{{ __('Filter & Suche') }} {{ __('Filter zurücksetzen') }}
@foreach ($portalOptions as $portal) @endforeach @foreach ($statusOptions as $status) @endforeach @if ($supportsPdfGeneratedAt) @endif

{{ __(':count Treffer für die aktuelle Filterung. PDF-Dateien werden bei Bedarf aus den archivierten Legacy-Daten erzeugt.', ['count' => number_format($stats['filtered_count'], 0, ',', '.')]) }}

{{-- ============== TABELLE ============== --}}
{{ __('Legacy-Rechnungen') }} {{ __(':count Treffer', ['count' => number_format($stats['filtered_count'], 0, ',', '.')]) }}
{{ __('Rechnungsnr.') }} {{ __('Portal') }} {{ __('User') }} {{ __('Betrag') }} {{ __('Status') }} {{ __('Rechnungsdatum') }} {{ __('PDF') }} @forelse ($invoices as $invoice)
{{ $invoice->number ?? ('#'.$invoice->legacy_id) }}
Legacy-ID: {{ $invoice->legacy_id }}
{{ $invoice->legacy_portal?->label() }} @if ($invoice->user)
{{ $invoice->user->name }}
{{ $invoice->user->email }}
@else
{{ __('Ohne Zuordnung') }}
Legacy-User: {{ $invoice->legacy_user_id ?? 'n/a' }}
@endif
{{ number_format($invoice->total_cents / 100, 2, ',', '.') }} € @if ($invoice->paid_at) {{ $invoice->status ?? __('Bezahlt') }} @else {{ $invoice->status ?? __('Offen') }} @endif
{{ $invoice->invoice_date?->format('d.m.Y') ?? '–' }}
@if ($invoice->paid_at)
{{ __('bezahlt: :date', ['date' => $invoice->paid_at->format('d.m.Y')]) }}
@endif
{{ __('Öffnen') }} @if ($supportsPdfGeneratedAt && $invoice->pdf_generated_at) {{ __('erzeugt') }} @endif
@empty
{{ __('Keine Legacy-Rechnungen für diese Filter gefunden.') }}
@endforelse
{{ $invoices->links('components.portal.pagination') }}