Abo-System: VanVan kann jetzt wirklich alles im Admin einstellen

Bisher waren nur Preis, Rabatt-% und ein paar Verhaltensregeln im CMS
editierbar — Namen, Vorteilstexte und die Teddy-Vergabe-Intervalle steckten
fest im Code. Jetzt ist pro Abo-Stufe (Klein/Mittel/Groß) direkt im
Adminbereich einstellbar:

- Name & Vorteilstext der Stufe, in allen 4 Sprachen einzeln
- Ob die Stufe aktuell überhaupt neu buchbar ist (bestehende Abonnent:innen
  behalten ihre Vorteile trotzdem, im Kundenkonto wird die Stufe nur für neue
  Buchungen ausgegraut mit "Derzeit nicht buchbar")
- Nach wie vielen Monaten es den kleinen/großen Teddy gibt (ersetzt die vorher
  fest verankerten 6-/12-Monats-Abstände)
- Welches Produkt als "kleiner"/"großer" Teddy für die Prämien-Einlösung
  verwendet wird (Produktauswahl statt festem Slug im Code)

Alle Berechnungen (Meilensteine, Fortschrittsanzeige) laufen jetzt komplett
über diese Admin-Werte statt über Konstanten im Code. Konto-Plan-Karten in
allen 4 Sprachen zeigen die admin-gepflegten Texte live an.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 17:03:28 +02:00
co-authored by Claude Sonnet 5
parent 208d995941
commit a222d6c96e
10 changed files with 204 additions and 57 deletions
+38 -7
View File
@@ -367,21 +367,52 @@ collections:
- label: "Kleines Abo"
name: klein
widget: object
fields:
fields: &abo-stufe-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: "Aktuell neu buchbar?", name: aktiv, widget: boolean, default: true, hint: "Aus: Diese Stufe erscheint im Konto ausgegraut und kann nicht neu abgeschlossen werden. Bestehende Kund:innen dieser Stufe behalten trotzdem alle Vorteile." }
- { label: "Kleiner Teddy: alle wie viele Monate?", name: kleinIntervallMonate, widget: number, value_type: int, min: 0, required: false, hint: "0 oder leer lassen = diese Stufe vergibt gar keinen kleinen Teddy." }
- { label: "Großer Teddy: alle wie viele Monate?", name: grossIntervallMonate, widget: number, value_type: int, min: 0, required: false, hint: "0 oder leer lassen = diese Stufe vergibt gar keinen großen Teddy." }
- label: "Name der Stufe"
name: name
widget: object
fields:
- { label: Deutsch, name: de, widget: string }
- { label: Englisch, name: en, widget: string }
- { label: "Schweizerdeutsch", name: ch, widget: string }
- { label: Französisch, name: fr, widget: string }
- label: "Vorteilstext (erscheint auf der Plan-Karte im Kundenkonto)"
name: vorteil
widget: object
fields:
- { label: Deutsch, name: de, widget: text }
- { label: Englisch, name: en, widget: text }
- { label: "Schweizerdeutsch", name: ch, widget: text }
- { label: Französisch, name: fr, widget: text }
- 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 }
fields: *abo-stufe-fields
- 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 }
fields: *abo-stufe-fields
- label: "Welches Produkt ist der 'kleine Teddy'?"
name: kleinTeddySlug
widget: relation
collection: products
search_fields: ["name.de"]
value_field: "slug"
display_fields: ["name.de"]
hint: "Dieses Produkt wird kostenlos in den Warenkorb gelegt, sobald jemand eine 'kleiner Teddy'-Prämie einlöst."
- label: "Welches Produkt ist der 'große Teddy'?"
name: grossTeddySlug
widget: relation
collection: products
search_fields: ["name.de"]
value_field: "slug"
display_fields: ["name.de"]
hint: "Dieses Produkt wird kostenlos in den Warenkorb gelegt, sobald jemand eine 'großer Teddy'-Prämie einlöst."
- label: "Abo-Rabatt mit anderen Rabatten kombinierbar (Gutschein/Partnercode/Treuebonus)?"
name: kombinierbarMitAnderenRabatten
widget: boolean