// Gutscheincodes — site-weit gültig, von VanVan im Adminbereich unter "🎟️ Gutscheincodes" // verwaltet. Werden im Warenkorb/Checkout eingelöst und auf den Gesamt-Warenwert angewendet. // @ts-ignore -- JSON-Import, zur Build-Zeit von Astro/Vite aufgelöst import gutscheineRaw from "../content/gutscheine.json"; export interface Gutschein { code: string; prozent?: number; betrag?: number; bis?: string; // ISO-Datum, optional /** true = der Code gilt pro Person (genauer: pro E-Mail-Adresse) nur einmal — wird beim * Abschicken der Bestellung serverseitig geprüft (siehe functions/api/orders.js, Spalte * "gutschein_code" in der orders-Tabelle), kann also NICHT durch Löschen von localStorage/ * einen anderen Browser umgangen werden. Ohne dieses Flag (Standard) bleibt ein Code * unbegrenzt mehrfach nutzbar, wie bisher. */ einmaligProPerson?: boolean; } const gutscheine = (gutscheineRaw as { codes: Gutschein[] }).codes ?? []; function istGueltig(bis?: string): boolean { if (!bis) return true; return new Date() <= new Date(`${bis}T23:59:59`); } /** Sucht einen Gutschein anhand des eingegebenen Codes (Groß-/Kleinschreibung egal). */ export function findeGutschein(code: string): Gutschein | undefined { const normalisiert = code.trim().toUpperCase(); return gutscheine.find((g) => g.code.toUpperCase() === normalisiert && istGueltig(g.bis)); } /** Berechnet den Rabatt-Betrag in Euro für einen gegebenen Warenwert. */ export function gutscheinRabatt(gutschein: Gutschein, warenwert: number): number { if (typeof gutschein.prozent === "number" && gutschein.prozent > 0) { return Math.min(warenwert, warenwert * (gutschein.prozent / 100)); } if (typeof gutschein.betrag === "number" && gutschein.betrag > 0) { return Math.min(warenwert, gutschein.betrag); } return 0; }