Stripe-Integration (S7.4): Payment-Dashboard für Stripe

- Provider-Status/Uptime: Stripe-Kachel aktiviert; payment:check-uptime prüft
  zusätzlich api.stripe.com/v1/ (401 ohne Key = erreichbar) inkl. Auto-Incident
- Zahlungen: Anbieter-Filter, Provider-Badges, Umsatz je Provider,
  Stripe-Dashboard-Deep-Links (ShoppingPayment/PaymentTransaction::
  stripeDashboardUrl, pi_-Guard, testmodus-bewusst)
- Rohe Transaktionen: Anbieter-Filter/-Spalte, Erfolgsraten je Anbieter;
  Bugfix: Stringable-Vergleich ließ den txaction-Filter immer mit leerem Wert
  greifen — Liste war dauerhaft leer
- Neue Kachel „Abos je Anbieter" (Index + GF-Ansicht) mit Fehlerzählern und
  Stripe-Anteil-Fortschrittsbalken (Auslaufmodell PAYONE → Stripe ablesbar)
- Incident-Kachel weist Stripe/PAYONE getrennt aus; Log-Viewer mit
  Kanal-Umschalter stripe/payone
- Plan-Doku: S7.4-Umsetzungsstatus, Abo-Go-Live 2026-07-10 vermerkt

Tests: PaymentDashboardProviderTest (9 neu), Dashboard-Suite 49 grün.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-07-10 16:57:50 +00:00
parent dd1c8f9a1e
commit ad19112750
13 changed files with 600 additions and 45 deletions

View file

@ -77,6 +77,21 @@ class PaymentTransaction extends Model
return $this->belongsTo('App\Models\ShoppingPayment', 'shopping_payment_id');
}
/**
* Deep-Link ins Stripe-Dashboard für Stripe-Transaktionen
* (txid trägt dort die PaymentIntent-ID, siehe StripeTransactionRecorder).
*/
public function stripeDashboardUrl(): ?string
{
if ($this->provider !== 'stripe' || ! str_starts_with((string) $this->txid, 'pi_')) {
return null;
}
$base = $this->mode === 'test' ? 'https://dashboard.stripe.com/test' : 'https://dashboard.stripe.com';
return $base.'/payments/'.$this->txid;
}
/**
* Returns a human-readable description for known PAYONE error codes.
*