Abosystem mit dauerhaften Rabatten und Teddy-Prämien

Drei Mitgliedschaftsstufen (Klein 4,99€/5%, Mittel 9,99€/10%, Groß 19,99€/20%)
mit automatischem Bestellrabatt und Teddy-Prämien nach Meilensteinen (12-Monats-
Rhythmus bzw. 6+12 bei Groß). Preise/Rabatte und alle Admin-Regeln (Kombinier-
barkeit mit anderen Rabatten, Fortsetzung bei Wiederanmeldung, Monate über
Stufen zusammenzählen, kostenloser Versand bei Prämie) sind über Decap CMS
einstellbar (src/content/abo-einstellungen.json).

Neuer "Mein Abo"-Bereich im Kundenkonto (6. Nav-Kachel) mit Plan-Vergleich,
Live-Status (Laufzeit, nächste Zahlung, Rabatt, Fortschritt bis zur nächsten
Prämie), Einlösen-Buttons für freigeschaltete Teddys, Kündigen/Wechseln sowie
einer übersetzten Benachrichtigungsliste. Dazu ein extra hervorgehobener
"Mein Abo verwalten"-Button neben Abmelden in der Kopfkarte.

Warenkorb/Checkout rechnen den Abo-Rabatt korrekt in die Summe ein und stellen
eingelöste Teddys als 0€-Gratisposition dar. Alles in 4 Sprachen (DE/EN/CH/FR).

Unterwegs zwei echte Bugs gefunden und behoben: addMonateISO() vermischte
lokale Zeit mit toISOString() (UTC) und verlor dadurch bei jeder Monats-
verlängerung reproduzierbar einen Tag; die Checkout-Positionsliste zeigte für
Gratis-Prämien fälschlich den vollen Preis statt 0€.

Wie beim Treuebonus gilt: Speicherung aktuell im localStorage des Geräts
(Phase 1) statt einer echten geräteübergreifenden Datenbank — folgt mit der
Zahlungsanbindung in Phase 2.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 16:54:25 +02:00
co-authored by Claude Sonnet 5
parent 0cb7d3ca65
commit 208d995941
21 changed files with 1902 additions and 91 deletions
+54
View File
@@ -348,3 +348,57 @@ collections:
- { label: IBAN, name: iban, widget: string, required: false, hint: "z.B. DE12 3456 7890 1234 5678 90" }
- { label: BIC, name: bic, widget: string, required: false }
- { label: Bank (Name), name: bank, widget: string, required: false }
- name: abo-einstellungen
label: "🎁 Abo-System"
icon: card_membership
files:
- name: einstellungen
label: "Abo-Stufen, Rabatte & Regeln"
file: src/content/abo-einstellungen.json
description: >
Preise, Rabatthöhen und Verhaltensregeln für das monatliche Abo-System (siehe
scripts/account.ts + data/abo.ts). Änderungen gelten ab dem nächsten Deploy für alle
Kund:innen. Die eigentlichen Kundendaten (wer welches Abo hat, Zahlungsstand,
freigeschaltete Prämien) liegen NICHT hier, sondern pro Kundenkonto (Phase 1: im
Browser der jeweiligen Person, Phase 2: in einer echten Datenbank) — hier werden nur
die grundsätzlichen Konditionen festgelegt, zu denen JEDES Abo läuft.
fields:
- label: "Kleines Abo"
name: klein
widget: object
fields:
- { label: "Preis pro Monat (€)", name: preis, widget: number, value_type: float, step: 0.01 }
- { label: "Rabatt auf jede Bestellung (%)", name: rabattProzent, widget: number, value_type: int, min: 0, max: 100 }
- label: "Mittleres Abo"
name: mittel
widget: object
fields:
- { label: "Preis pro Monat (€)", name: preis, widget: number, value_type: float, step: 0.01 }
- { label: "Rabatt auf jede Bestellung (%)", name: rabattProzent, widget: number, value_type: int, min: 0, max: 100 }
- label: "Großes Abo"
name: gross
widget: object
fields:
- { label: "Preis pro Monat (€)", name: preis, widget: number, value_type: float, step: 0.01 }
- { label: "Rabatt auf jede Bestellung (%)", name: rabattProzent, widget: number, value_type: int, min: 0, max: 100 }
- label: "Abo-Rabatt mit anderen Rabatten kombinierbar (Gutschein/Partnercode/Treuebonus)?"
name: kombinierbarMitAnderenRabatten
widget: boolean
default: false
hint: "Aus: Bei aktivem Abo gilt NUR der Abo-Rabatt, andere Rabatte werden für diese Bestellung ignoriert. An: alle Rabatte werden zusammengezählt."
- label: "Versand bei Teddy-Prämie ebenfalls kostenlos?"
name: versandKostenlosBeiPraemie
widget: boolean
default: false
hint: "Aus: Für den kostenlosen Teddy gelten die normalen Versandregeln des Shops."
- label: "Bei Wiederanmeldung nach vollständigem Auslaufen: bisherige Laufzeit fortsetzen?"
name: fortsetzungBeiWiederanmeldung
widget: boolean
default: false
hint: "Aus: Der Monatszähler für die nächste Prämie beginnt bei einer Wiederanmeldung wieder bei 0. An: er läuft dort weiter, wo er beim Auslaufen stand. Bereits eingelöste/freigeschaltete Teddys gehen NIE verloren, unabhängig von dieser Einstellung."
- label: "Monate aus verschiedenen Abo-Stufen beim Wechsel zusammenzählen?"
name: monateUeberStufenZusammenzaehlen
widget: boolean
default: false
hint: "Aus (empfohlen): Beim Wechsel in eine andere Stufe beginnt der Monatszähler für die nächste Prämie bei 0. An: die bisher gesammelten Monate werden in die neue Stufe übernommen."