{{ __(':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, ',', '.')]) }}
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'); } }; ?>
{{ __('Legacy-Rechnungsarchiv mit read-only Übersicht, Filtern und PDF-Download. Der neue Stripe-Rechnungslauf folgt separat in Phase 8.') }}
{{ __(':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, ',', '.')]) }}