FailedCheckout-ID => Begründung */ public array $note = []; public function mount(): void { abort_unless(Gate::allows('billing.manage'), 403); } /** * Einen geplatzten Kauf als erledigt abhaken. * * Mit Begründung, nicht nur mit einem Haken: „erledigt" allein ist beim * nächsten Nachfragen wertlos — überwiesen? neu bestellt? nicht erreichbar? * Wer es war, steht mit dabei. */ public function resolve(int $id): void { $this->authorize('billing.manage'); $problem = FailedCheckout::query()->findOr($id, fn () => abort(404)); $begruendung = trim($this->note[$id] ?? ''); $wer = Auth::guard('operator')->user()?->email ?? 'console'; $problem->update([ 'resolved_at' => Carbon::now(), 'note' => $begruendung !== '' ? $begruendung.' — '.$wer : $wer, ]); unset($this->note[$id]); $this->dispatch('notify', message: __('payment_problems.resolved')); } public function render() { return view('livewire.admin.payment-problems', [ 'cases' => DunningCase::query() ->whereNull('settled_at') ->with('subscription.customer') ->orderBy('next_step_at') ->get(), 'failed' => FailedCheckout::query() ->whereNull('resolved_at') ->orderByDesc('failed_at') ->get(), ]); } }