Files
vans-diy-bastelbedarf/public/admin/config.yml
T
qcigano 3c574ed0c4 Zahlungsarten: echte PayPal-Verbindung, Kreditkarte hinzugefügt, echte Bankverbindung für Vorkasse
Standard-Set für deutsche Online-Shops recherchiert und umgesetzt: PayPal,
Klarna, Kreditkarte (Visa & Mastercard, neu) und Banküberweisung (Vorkasse).

- PayPal: echte PayPal Smart Buttons über das offizielle JS-SDK (Sandbox-
  Client-ID, kostenlos & ohne Konto testbar). Klick öffnet den echten
  PayPal-Login-Popup und schließt eine (Test-)Zahlung wirklich ab. Für den
  Live-Betrieb genügt später der Tausch gegen VanVans echte (kostenlose)
  PayPal-Business-Client-ID.
- Banküberweisung (Vorkasse): braucht gar keine externe Anbindung — zeigt
  jetzt VanVans echte Kontodaten an, die sie im neuen Adminbereich-Feld
  "🏦 Bankverbindung" selbst einträgt. Damit ist diese Zahlungsart schon
  zu 100% fertig, ganz ohne Drittanbieter.
- Klarna & Kreditkarte: echte Live-Anbindung braucht ein Händlerkonto bzw.
  einen Zahlungsdienstleister (Phase 2, Cloudflare Worker). Bis dahin ein
  sauber gestalteter, funktionierender Verbindungs-/Eingabe-Ablauf, der
  1:1 austauschbar ist, sobald die echten Zugänge da sind.
- Auswahl einer Zahlungsart klappt jetzt direkt das passende Panel auf
  statt nur eine Radiobox zu markieren.

Verifiziert per Puppeteer-Funktionstest gegen den echten Build: PayPal-
SDK lädt und rendert einen echten Button (iframe), Kreditkartenfelder,
Klarna-Demo-Verbindung und echte Bankdaten-Anzeige funktionieren
fehlerfrei, Adminbereich lädt weiterhin ohne Konfigurationsfehler.
2026-08-02 19:26:12 +02:00

274 lines
12 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
backend:
name: github
repo: vans-diy-bastelbedarf/website
branch: main
base_url: https://vans-diy-bastelbedarf-cms-auth.dogfather1608.workers.dev
logo:
src: /logo.png
app_title: "Van's Shop Adminbereich"
# Bilder, die VanVan hier hochlädt, landen automatisch hier im Projekt und sind danach
# unter /img/products/<dateiname> auf der Website erreichbar.
media_folder: "public/img/products"
public_folder: "/img/products"
collections:
- name: products
label: Produkte
label_singular: Produkt
icon: shopping_bag
folder: src/content/products
create: true
delete: true
slug: "{{fields.slug}}"
identifier_field: slug
extension: json
format: json
summary: "{{name.de}} — {{preis}} €"
fields:
- label: "📷 Fotos"
name: bilder
widget: list
required: false
hint: "Hier Fotos hochladen oder per Drag & Drop reinziehen. Das erste Foto ist das Hauptbild, das überall zuerst angezeigt wird."
field: { label: Foto, name: bild, widget: image }
- label: Name
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: Beschreibung
name: beschreibung
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: "Preis (€)"
name: preis
widget: number
value_type: float
step: 0.01
hint: "Der ganz normale Verkaufspreis, z.B. 19.99"
- label: "Reduzierter Preis? (nur ausfüllen, wenn im Sale)"
name: preisAlt
widget: number
value_type: float
step: 0.01
required: false
hint: "Hier den ALTEN, höheren Preis eintragen — er wird dann durchgestrichen neben dem neuen Preis angezeigt. Leer lassen, wenn kein Sale."
- label: "🏷️ Rabatte (optional — alles leer lassen, wenn kein automatischer Rabatt gelten soll)"
name: rabatt
widget: object
required: false
hint: "Zusätzlich zum 'Reduzierten Preis' oben kannst du hier einen automatischen Rabatt einrichten, der von selbst wieder abläuft, sowie einen Mengenrabatt (z.B. ab 3 Stück günstiger)."
fields:
- { label: "Rabatt in Prozent (z.B. 20 für 20%)", name: prozent, widget: number, value_type: int, required: false, hint: "Nur ausfüllen ODER den Betrag unten — nicht beides." }
- { label: "ODER: Rabatt als fester Betrag (€)", name: betrag, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Rabatt gültig bis (leer = läuft nicht automatisch ab)", name: bis, widget: datetime, format: "YYYY-MM-DD", date_format: "YYYY-MM-DD", time_format: false, required: false, hint: "Nach diesem Datum verschwindet der Rabatt automatisch — ohne dass du etwas tun musst." }
- label: "Mengenrabatt-Staffel (z.B. ab 3 Stück 10% Rabatt)"
name: mengenrabatt
widget: list
required: false
summary: "ab {{fields.abMenge}} Stück → -{{fields.prozent}}%"
hint: "Gilt automatisch im Warenkorb, wenn jemand mehrere Stück dieses Produkts kauft."
fields:
- { label: "Ab wie vielen Stück", name: abMenge, widget: number, value_type: int }
- { label: "Rabatt in Prozent", name: prozent, widget: number, value_type: int }
- label: "Auf Lager"
name: bestand
widget: number
value_type: int
hint: "Wie viele Stück hast du vorrätig? 0 = ausverkauft (Artikel bleibt trotzdem sichtbar)."
- label: Kategorie
name: kategorie
widget: relation
collection: categories
search_fields: ["name.de"]
value_field: "slug"
display_fields: ["name.de"]
- label: "Unterkategorie (optional)"
name: unterkategorie
widget: string
required: false
hint: "Interner Code der Unterkategorie eintragen, z.B. kuh-frieda (siehe Bereich Kategorien)"
- label: Auszeichnungen
name: badges
widget: select
multiple: true
required: false
hint: "Erscheinen als kleine Sticker auf dem Produktbild"
options:
- { label: "✨ Neu", value: neu }
- { label: "🔥 Bestseller", value: bestseller }
- { label: "🏷️ Im Sale", value: sale }
- { label: "🧶 Handgemacht", value: handgemacht }
- { label: Artikelnummer, name: artikelnummer, widget: string, required: false }
- { label: Material, name: material, widget: string, required: false }
- { label: "Größe / Maße", name: groesse, widget: string, required: false }
- label: Farben
name: farben
widget: list
required: false
hint: "Eine Farbe pro Zeile, z.B. Lavendel"
- { label: Lieferumfang, name: lieferumfang, widget: string, required: false }
- { label: Pflegehinweise, name: pflegehinweise, widget: string, required: false }
- { label: Lieferzeit, name: lieferzeit, widget: string, required: false }
- label: "🚚 Eigene Versandkosten (nur für Einzelkauf dieses Produkts)"
name: versand
widget: object
required: false
hint: "Gilt NUR, wenn jemand genau 1 Stück von genau diesem Produkt kauft. Bei mehreren Produkten/Stück im Warenkorb gilt automatisch die allgemeine Versandkosten-Staffel (siehe Bereich 'Versandkosten-Staffel'). Leer lassen = Staffel gilt auch beim Einzelkauf."
fields:
- { label: "Deutschland (€)", name: de, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Österreich (€)", name: at, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Schweiz (€)", name: ch, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Luxemburg (€)", name: lu, widget: number, value_type: float, step: 0.01, required: false }
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
name: slug
widget: string
hint: "Nur Kleinbuchstaben, Zahlen und Bindestriche, z.B. wolke-plushie-lavendel"
- name: categories
label: Kategorien
label_singular: Kategorie
icon: category
folder: src/content/categories
create: true
delete: false
slug: "{{fields.slug}}"
identifier_field: slug
extension: json
format: json
summary: "{{name.de}}"
fields:
- label: "Icon (Emoji)"
name: icon
widget: string
hint: "z.B. 🧸"
- label: Name
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: Beschreibung
name: description
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: Unterkategorien
name: subcategories
widget: list
required: false
summary: "{{fields.name.de}}"
fields:
- { label: "Interner Code (URL)", name: slug, widget: string }
- label: Name
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: "Reihenfolge (0 = zuerst)"
name: order
widget: number
value_type: int
- label: "Interner Code (URL) — nach Veröffentlichung nicht mehr ändern!"
name: slug
widget: string
- name: versandkosten
label: "🚚 Versandkosten-Staffel"
icon: local_shipping
files:
- name: staffel
label: "Versandkosten-Staffel nach Warenwert"
file: src/content/versandstaffel.json
description: >
Gilt automatisch im Warenkorb/an der Kasse, sobald jemand mehrere Produkte oder
mehrere Stück kauft (bei genau 1 Stück von 1 Produkt gilt stattdessen der eigene
Versandpreis am Produkt, falls dort einer eingetragen ist). Ab 75 € Warenwert ist der
Versand immer kostenlos, unabhängig von dieser Tabelle.
fields:
- label: Deutschland
name: de
widget: list
summary: "ab {{fields.abWarenwert}} € → {{fields.kosten}} €"
fields:
- { label: "Ab Warenwert (€)", name: abWarenwert, widget: number, value_type: float, step: 0.01 }
- { label: "Versandkosten (€)", name: kosten, widget: number, value_type: float, step: 0.01 }
- label: Österreich
name: at
widget: list
summary: "ab {{fields.abWarenwert}} € → {{fields.kosten}} €"
fields:
- { label: "Ab Warenwert (€)", name: abWarenwert, widget: number, value_type: float, step: 0.01 }
- { label: "Versandkosten (€)", name: kosten, widget: number, value_type: float, step: 0.01 }
- label: Schweiz
name: ch
widget: list
summary: "ab {{fields.abWarenwert}} € → {{fields.kosten}} €"
fields:
- { label: "Ab Warenwert (€)", name: abWarenwert, widget: number, value_type: float, step: 0.01 }
- { label: "Versandkosten (€)", name: kosten, widget: number, value_type: float, step: 0.01 }
- label: Luxemburg
name: lu
widget: list
summary: "ab {{fields.abWarenwert}} € → {{fields.kosten}} €"
fields:
- { label: "Ab Warenwert (€)", name: abWarenwert, widget: number, value_type: float, step: 0.01 }
- { label: "Versandkosten (€)", name: kosten, widget: number, value_type: float, step: 0.01 }
- name: gutscheine
label: "🎟️ Gutscheincodes"
icon: local_offer
files:
- name: codes
label: "Gutscheincodes"
file: src/content/gutscheine.json
description: >
Codes, die Kund:innen im Warenkorb/an der Kasse eingeben können, um Rabatt auf den
gesamten Warenwert zu bekommen (z.B. für Aktionen, Newsletter, Stammkund:innen).
fields:
- label: Gutscheincodes
name: codes
widget: list
summary: "{{fields.code}}"
fields:
- { label: "Code (z.B. WILLKOMMEN10)", name: code, widget: string, hint: "Groß-/Kleinschreibung ist egal — wird automatisch angepasst." }
- { label: "Rabatt in Prozent (z.B. 10 für 10%)", name: prozent, widget: number, value_type: int, required: false }
- { label: "ODER: Rabatt als fester Betrag (€)", name: betrag, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Gültig bis (leer = unbegrenzt)", name: bis, widget: datetime, format: "YYYY-MM-DD", date_format: "YYYY-MM-DD", time_format: false, required: false }
- name: bankverbindung
label: "🏦 Bankverbindung"
icon: account_balance
files:
- name: konto
label: "Bankverbindung für Vorkasse"
file: src/content/bankverbindung.json
description: >
Wird Kund:innen direkt im Checkout angezeigt, sobald sie "Banküberweisung (Vorkasse)"
als Zahlungsart wählen — sie überweisen dann selbst auf dieses Konto. Bitte einmal mit
deinen echten Kontodaten ausfüllen, sonst bekommen Kund:innen nur einen Platzhalter
angezeigt.
fields:
- { label: Kontoinhaber:in, name: kontoinhaber, widget: string, required: false }
- { 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 }