fix: Befunde aus Sicherheits- und Korrektheitsreview der Bienenpatenschaft
Docker Image bauen und veroeffentlichen / typecheck (push) Successful in 2m57s
Docker Image bauen und veroeffentlichen / lint (push) Successful in 3m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Canceled after 0s
Docker Image bauen und veroeffentlichen / test (push) Canceled after 1m22s

- Oeffentliche Kuendigung: exakte Identifikation, Limits je Vertrag und
  Adresse, Bestaetigung nur an die Kontoadresse mit Ruecknahme-Link (HMAC)
- Vorschau: Body-Grenze beim Lesen, Parallelitaets- und Minutenlimit, Cache
- Rabatte gelten nicht fuer Patenschaftspositionen
- Abo aktiv erst nach bestaetigter Zahlung, offene Abschluesse zaehlen
  zum Kontingent und werden nach 24 h aufgeraeumt, Sitzung 58 Minuten
- Konto-Loeschung nur ohne laufendes Abo, Urkunden-Dateien werden entfernt
- Abo-Lieferungen mit Zahlungszeile (DHL-Marke moeglich)
- Shop zeigt freien Bestand nach Abo-Reservierung
- Storno/volle Erstattung widerruft die Patenschaft (Status WIDERRUFEN)
- Umsatzsteuer der Patenschaft per VAT_RATE_PERCENT_PATENSCHAFT (19 %)
- Digitale Bestellungen archivieren sich, Kalendertage in Europe/Berlin,
  Monatsenden begrenzt, Datenauskunft um Patenschaften ergaenzt

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-16 15:09:32 +02:00
1 parent f227aeb8f9
commit 515fca1c16
97 files changed
+2979 -254

No files matched your search

+48 -8
View File
@@ -92,12 +92,26 @@ export interface AboStrings {
submitting: string;
successHeading: string;
receivedAtLabel: string;
successMailSent: string;
successMailFailed: string;
/** Fuer passende und unpassende Angaben gleich (kein Hinweis, ob eine Mail rausging). */
successMailNote: string;
errorMessage: string;
rateLimited: string;
invalid: string;
};
undoPage: {
metaTitle: string;
title: string;
intro: (end: string) => string;
button: string;
successTitle: string;
successText: string;
invalidTitle: string;
invalidText: string;
notCancelledText: string;
expiredText: string;
errorText: string;
toAccount: string;
};
}
const de: AboStrings = {
@@ -193,13 +207,26 @@ const de: AboStrings = {
submitting: "Wird gesendet …",
successHeading: "Deine Kündigung ist eingegangen",
receivedAtLabel: "Eingegangen am",
successMailSent: "Wir haben dir eine Eingangsbestätigung per Mail geschickt.",
successMailFailed:
"Die Bestätigungsmail konnte gerade nicht versendet werden. Deine Kündigung ist trotzdem eingegangen; bitte bewahre diese Seite als Nachweis auf.",
successMailNote:
"Die Eingangsbestätigung schicken wir an die E-Mail-Adresse deines Kundenkontos. Bitte bewahre diese Seite als Nachweis auf (Ausdruck oder Bildschirmfoto).",
errorMessage: "Deine Kündigung konnte nicht gesendet werden. Bitte versuche es erneut oder schreib uns eine Mail.",
rateLimited: "Zu viele Anfragen. Bitte versuche es später erneut oder schreib uns eine Mail.",
invalid: "Bitte überprüfe deine Angaben.",
},
undoPage: {
metaTitle: "Kündigung zurücknehmen",
title: "Kündigung zurücknehmen",
intro: (end) => `Dein Abo ist zum ${end} gekündigt. Wenn du die Kündigung zurücknimmst, läuft es einfach weiter wie bisher.`,
button: "Kündigung zurücknehmen",
successTitle: "Dein Abo läuft weiter",
successText: "Die Kündigung ist zurückgenommen. Es ändert sich nichts an deinem Abo.",
invalidTitle: "Dieser Link gilt nicht (mehr)",
invalidText: "Der Link ist abgelaufen, unvollständig oder die Kündigung wurde schon zurückgenommen. Im Kundenkonto siehst du den aktuellen Stand.",
notCancelledText: "Für dieses Abo ist keine Kündigung (mehr) vorgemerkt.",
expiredText: "Der Kündigungstermin ist schon erreicht; zurücknehmen lässt sich die Kündigung nicht mehr.",
errorText: "Das hat gerade nicht geklappt. Bitte versuche es gleich noch einmal oder schreib uns eine Mail.",
toAccount: "Zum Kundenkonto",
},
};
const en: AboStrings = {
@@ -293,13 +320,26 @@ const en: AboStrings = {
submitting: "Sending …",
successHeading: "We have received your cancellation",
receivedAtLabel: "Received on",
successMailSent: "We have sent you a confirmation of receipt by email.",
successMailFailed:
"The confirmation email could not be sent right now. Your cancellation has still been received; please keep this page as proof.",
successMailNote:
"We send the confirmation of receipt to the email address of your customer account. Please keep this page as proof (print or screenshot).",
errorMessage: "Your cancellation could not be sent. Please try again or email us.",
rateLimited: "Too many requests. Please try again later or email us.",
invalid: "Please check your details.",
},
undoPage: {
metaTitle: "Withdraw cancellation",
title: "Withdraw cancellation",
intro: (end) => `Your subscription is cancelled as of ${end}. If you withdraw the cancellation, it simply continues as before.`,
button: "Withdraw cancellation",
successTitle: "Your subscription continues",
successText: "The cancellation has been withdrawn. Nothing changes about your subscription.",
invalidTitle: "This link is not (or no longer) valid",
invalidText: "The link has expired, is incomplete or the cancellation has already been withdrawn. Your customer account shows the current status.",
notCancelledText: "No cancellation is (any longer) scheduled for this subscription.",
expiredText: "The cancellation date has already been reached; the cancellation can no longer be withdrawn.",
errorText: "That did not work just now. Please try again shortly or email us.",
toAccount: "To your account",
},
};
export function getAboStrings(locale: Locale): AboStrings {