Rechnungsseite: neue STR/MAN-Rechnungen gelistet, STR bei Stripe verlinkt

Die Kundenseite /admin/me/invoices zeigte bisher nur das Legacy-Archiv.
Neue Sektion "Aktuelle Rechnungen" mit Netto/USt/Gesamt und Status;
STR-Rechnungen oeffnen die gehostete Stripe-Rechnungsansicht ueber
einen Redirect-Endpunkt (URL wird je Aufruf frisch geholt, Zugriff nur
fuer den Eigentuemer). KPIs zaehlen neu + Archiv zusammen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-07 12:01:12 +00:00
parent 4cda4d3bda
commit 7e571eed94
4 changed files with 226 additions and 25 deletions

View file

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers;
use App\Models\Invoice;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Laravel\Cashier\Cashier;
/**
* Öffnet die bei Stripe gehostete Rechnungsansicht (inkl. PDF-Download) zu
* einer gespiegelten STR-Rechnung. Die URL wird bei jedem Aufruf frisch von
* Stripe geholt statt gespeichert — gehostete Links können sich ändern.
*/
class StripeInvoiceRedirectController extends Controller
{
public function __invoke(Request $request, Invoice $invoice): RedirectResponse
{
abort_unless($invoice->user_id === $request->user()->id, 404);
abort_unless(filled($invoice->stripe_invoice_id), 404);
try {
$stripeInvoice = Cashier::stripe()->invoices->retrieve($invoice->stripe_invoice_id);
$hostedUrl = $stripeInvoice->hosted_invoice_url;
} catch (\Throwable $exception) {
Log::warning('Stripe-Rechnungsansicht nicht erreichbar.', [
'invoice_id' => $invoice->id,
'stripe_invoice_id' => $invoice->stripe_invoice_id,
'error' => $exception->getMessage(),
]);
$hostedUrl = null;
}
if (! $hostedUrl) {
return redirect()
->route('me.invoices.index')
->with('invoice-error', __('Die Stripe-Rechnungsansicht ist gerade nicht erreichbar. Bitte versuchen Sie es später erneut.'));
}
return redirect()->away($hostedUrl);
}
}