Abo-Recovery: fehlgeschlagene Folgezahlung im Checkout nachholen

- Pay-now-Flow: bei fehlgeschlagenem Abo (Status 3) begleicht der Inhaber die
  offene Rechnung im Standard-Checkout mit frei waehlbarer, abo-faehiger Zahlart
  (nur eigenes Abo: Berater me-View + Kundenportal), payNow-Controller + Routen
- AboRecoveryCheckoutService baut die ShoppingInstance aus den Abo-Artikeln;
  neue Spalte shopping_orders.recovery_user_abo_id verknuepft Bestellung<->Abo
- Bei Erfolg: AboHelper::advanceAboAfterRecoveryPayment schreibt das Abo fort
  (Status->2, next_date) und uebernimmt die gewaehlte Zahlart als neues Token
  fuer kuenftige Abbuchungen
- Neue Pay-now-Fehlermail (AboPaymentFailedMail) ersetzt die generische
  Fehlermail im Abo-Cron; Link fuehrt auf die Abo-Detailseite (CRM bzw. Portal)
- Retry-/"extern erledigt"-Buttons nur noch fuer Admins; tote user/portal-
  Retry-Routen entfernt
- Checkout: Recovery-Hinweis statt "Abschluss des Abonnements", Lieferadresse
  vorbelegt, korrekter Zurueck-Link (Abo statt Shop)
- UserAbo::selfServiceDetailUrl zentralisiert die Abo-URL (Mail, Back-Links)
- Test-Command abo:test-recovery; Tests fuer payNow, Advance-Logik, Fehlermail

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-07-02 10:38:05 +00:00
parent 78db952130
commit 0660f4e0a0
28 changed files with 1535 additions and 181 deletions

View file

@ -15,6 +15,7 @@ return [
'abo_order_info_check' => 'Mit Abschluss des Abonnements wird eine regelmäßige Lieferung eingerichtet. Diese wird automatisch am gewählten Liefertag versendet und abgerechnet.',
'abo_order_info_check_2' => 'Die erste Lieferung und Abrechnung erfolgt am Tag der Abo-Einrichtung. Danach erfolgt der Versand automatisch am gewählten Liefertag des Folgemonats.',
'abo_order_info_check_3' => 'Als Zahlungsmethoden stehen PayPal und Kreditkarte zur Verfügung. <strong>Das Abo hat eine Mindestlaufzeit von :abo-min-duration Monaten.</strong> Danach kann es jederzeit pausiert, geändert oder gekündigt werden.',
'abo_recovery_info_check' => 'Du begleichst hier die offene Rechnung deines bestehenden Abos. <strong>Die dabei gewählte Zahlart wird zusätzlich für alle zukünftigen Abbuchungen deines Abos gespeichert.</strong> Nach erfolgreicher Zahlung wird dein Abo wieder aktiviert und regelmäßig am gewählten Liefertag ausgeführt.',
'abo_order_info_checkbox' => 'Ja, ich habe die Abo-Bedingungen verstanden!',
'abo_order_info_checkbox_required' => 'Bitte bestätige die Abo-Bedingungen, um fortzufahren.',
'abo_infos' => 'Abo Infos',
@ -172,6 +173,16 @@ return [
'retry_payment_confirm_copy' => 'Der Zahlungsversuch wird sofort gestartet und kann eine PayPal- oder Kreditkartenbuchung auslösen. Bitte nur ausführen, wenn die Ursache geprüft wurde.',
'retry_payment_confirm_button' => 'Zahlung jetzt erneut versuchen',
'retry_only_hold' => 'Der erneute Zahlungsversuch ist nur für angehaltene Abos möglich.',
'pay_now_title' => 'Zahlung fehlgeschlagen – jetzt bezahlen',
'pay_now_copy' => 'Die letzte Abbuchung für dein Abo ist fehlgeschlagen (z. B. Karte oder PayPal nicht mehr gültig). Im Checkout begleichst du jetzt die offene Rechnung mit einer Zahlart deiner Wahl – diese wird zusätzlich für alle zukünftigen Abbuchungen deines Abos gespeichert.',
'pay_now_button' => 'Jetzt bezahlen',
'pay_now_not_allowed' => 'Eine nachträgliche Zahlung ist für dieses Abo aktuell nicht möglich.',
'pay_now_failed' => 'Der Checkout konnte nicht gestartet werden. Bitte versuche es später erneut.',
'back_to_abo' => 'Zurück zu meinem Abo',
'payment_failed_mail_subject' => 'Zahlung für dein Abo fehlgeschlagen',
'payment_failed_mail_intro' => 'die letzte Abbuchung für dein Abo ist leider fehlgeschlagen (z. B. weil deine Kreditkarte oder dein PayPal-Konto nicht mehr gültig ist). Über den folgenden Link kannst du den offenen Betrag jetzt sicher bezahlen. Die dabei gewählte Zahlart wird auch für deine künftigen Abbuchungen gespeichert.',
'payment_failed_mail_button' => 'Jetzt bezahlen',
'payment_failed_mail_hint' => 'Falls der Button nicht funktioniert, kopiere diesen Link in deinen Browser:',
'retry_only_active' => 'Der erneute Zahlungsversuch ist nur für aktive Abos möglich.',
'retry_already_paid_today' => 'Für dieses Abo wurde heute bereits eine erfolgreiche Zahlung gespeichert.',
'retry_error_shopping_user' => 'Der Shopping-User konnte für den erneuten Zahlungsversuch nicht erstellt werden.',
@ -189,6 +200,11 @@ return [
'extern_done_already_paid' => 'Diese Bestellung ist bereits bezahlt und kann nicht extern erledigt werden.',
'extern_done_success' => 'Die Bestellung wurde als extern erledigt markiert. Punkte gutgeschrieben, Blockade aufgehoben.',
'extern_done_error' => 'Die Bestellung konnte nicht als erledigt markiert werden: :error',
'admin_delete' => 'Abo löschen',
'admin_delete_confirm_title' => 'Abo löschen',
'admin_delete_confirm_copy' => 'Das Abo wird gelöscht (deleted_at) und ist anschließend nicht mehr in der Übersicht sichtbar. Bitte nur ausführen, wenn dies wirklich gewünscht ist.',
'admin_delete_confirm_button' => 'Abo jetzt löschen',
'admin_delete_success' => 'Das Abo wurde gelöscht.',
'team_subscriptions' => 'Team Abos',
'team_customer_abos' => 'Team Kunden-Abos',
'team_total' => 'Gesamt',
@ -231,4 +247,35 @@ return [
'customer_privacy_info' => 'Aus Datenschutzgründen werden keine persönlichen Kundendaten angezeigt.',
'every_month_on' => 'monatlich am :day.',
'back' => 'zurück',
// Kreditkarte aktualisieren
'payment_method' => 'Zahlungsmethode',
'update_payment_method' => 'Zahlungsmethode aktualisieren',
'update_card_title' => 'Kreditkarte aktualisieren',
'current_card' => 'Aktuelle Karte',
'card_update_intro' => 'Hinterlegen Sie eine neue Kreditkarte für dieses Abo. Zur Verifizierung kann eine Autorisierung von 0,01 EUR erfolgen, die nicht belastet wird. Die nächste Abbuchung erfolgt über die neue Karte.',
'card_security_notice' => 'Ihre Kreditkartendaten werden hier nicht gespeichert. Sie werden ausschließlich SSL-verschlüsselt direkt an unseren Zahlungsdienstleister PAYONE zur Verifizierung übermittelt.',
'card_change_history' => 'Änderungsverlauf',
'card_update_link_button' => 'Update-Link an Kunden senden',
'card_update_link_sent' => 'Der Update-Link wurde an den Kunden gesendet.',
'card_update_link_not_allowed' => 'Für dieses Abo kann kein Update-Link gesendet werden.',
'card_update_link_invalid' => 'Dieser Link ist ungültig oder abgelaufen.',
'card_update_link_mail_subject' => 'Kreditkarte für Ihr Abo aktualisieren',
'card_update_link_mail_intro' => 'Bitte aktualisieren Sie die Kreditkarte für Ihr Abo über den folgenden sicheren Link. Ihre Kartendaten werden ausschließlich SSL-verschlüsselt an unseren Zahlungsdienstleister PAYONE übermittelt.',
'card_update_link_mail_button' => 'Kreditkarte aktualisieren',
'card_update_link_mail_hint' => 'Falls der Button nicht funktioniert, kopieren Sie diesen Link in Ihren Browser:',
'card_update_done_success_title' => 'Kreditkarte aktualisiert',
'card_update_done_success_copy' => 'Vielen Dank. Die nächste Abbuchung erfolgt über Ihre neue Karte.',
'card_update_done_failed_title' => 'Aktualisierung fehlgeschlagen',
'card_update_done_failed_copy' => 'Die Kreditkarte konnte nicht aktualisiert werden. Bitte fordern Sie bei Bedarf einen neuen Link an.',
'card_update_portal_hint' => 'Dieses Abo finden Sie auch in Ihrem Kundenportal. Dort können Sie sich anmelden und Ihre Zahlungsmethode sowie Ihr Abo jederzeit selbst verwalten.',
'card_update_to_portal' => 'Zum Kundenportal',
'card_update_success' => 'Ihre Kreditkarte wurde aktualisiert. Die nächste Abbuchung erfolgt über die neue Karte.',
'card_update_not_allowed' => 'Für dieses Abo kann die Kreditkarte nicht aktualisiert werden.',
'card_update_failed' => 'Die Kreditkarte konnte nicht aktualisiert werden. Bitte versuchen Sie es erneut.',
'card_holder_required' => 'Bitte geben Sie den Namen des Karteninhabers an.',
'card_number_invalid' => 'Bitte geben Sie eine gültige Kreditkartennummer ein.',
'card_expiry_invalid' => 'Bitte geben Sie ein gültiges Ablaufdatum an.',
'card_type_invalid' => 'Bitte wählen Sie einen gültigen Kartentyp (Visa oder Mastercard).',
'card_cvc_invalid' => 'Bitte geben Sie eine gültige Prüfziffer (CVC) ein.',
];