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

+7 -8
View File
@@ -1,5 +1,5 @@
import type { Prisma, ProductCategory } from "@/generated/prisma/client";
import { personalizationSchema } from "@/lib/certificate/schema";
import { personalizationSchema, startDateRange, toIsoDate } from "@/lib/certificate/schema";
import { checkCertificateFits } from "@/lib/certificate/layout";
import { CURRENT_TEMPLATE_VERSION } from "@/lib/certificate/templates";
import type { SponsorshipOfferView } from "@/lib/sponsorship/offers";
@@ -81,14 +81,13 @@ export interface ExpandInput {
now: Date;
}
/** Spaetester Patenschaftsbeginn: sechs Monate nach dem Bestelltag. */
const MAX_START_OFFSET_MONTHS = 6;
/**
* Erlaubtes Startdatum: frühestens der Bestelltag, spätestens sechs Monate
* danach — dieselbe Regel wie im Formular (startDateRange), damit Grenze und
* Klemmung auf das Monatsende (31.08. → 28./29.02.) ueberall gleich sind.
*/
export function startDateWindow(now: Date): { min: string; max: string } {
const min = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
const max = new Date(min);
max.setUTCMonth(max.getUTCMonth() + MAX_START_OFFSET_MONTHS);
return { min: min.toISOString().slice(0, 10), max: max.toISOString().slice(0, 10) };
return startDateRange(toIsoDate(now));
}
export function expandCheckoutItems(input: ExpandInput): ExpandResult {