Files
Wabenhain/src/lib/bulk-discount-calc.ts
T
Nick Szaunig c7927f2883 feat: Wabenhain Honig-Shop Anwendung
Vollstaendige Next.js/Prisma-E-Commerce-Anwendung fuer eine Imkerei:
Shop, Warenkorb, Stripe-Checkout, Kundenkonto mit 2FA, Admin-Bereich
(Produkte, Ernten, Chargen, Bestellungen, Gutscheine, admin-editierbare
Website-Inhalte), i18n (DE/EN), Rate-Limiting/CSP/Audit-Log-Haertung,
PostgreSQL- und MySQL-Unterstuetzung ueber austauschbare Prisma-
Treiber-Adapter, Unit-/Komponenten-/E2E-Tests.
2026-08-17 14:30:28 +02:00

34 lines
1.1 KiB
TypeScript

export interface BulkDiscountTierLike {
code: string;
minQuantity: number;
percent: number;
}
/**
* Reine Zuordnungsfunktionen ohne Datenbankzugriff — analog zu
* shipping-calc.ts. Mengenrabatte sind normale DiscountCode-Zeilen mit
* gesetztem minQuantity (im Admin-Bereich unter Gutscheine editierbar), diese
* Funktionen waehlen daraus die passende(n) Stufe fuer Anzeige/Anwendung.
*/
export function resolveBulkDiscount(
tiers: BulkDiscountTierLike[],
totalQuantity: number
): BulkDiscountTierLike | null {
const sorted = [...tiers].sort((a, b) => a.minQuantity - b.minQuantity);
let best: BulkDiscountTierLike | null = null;
for (const tier of sorted) {
if (totalQuantity >= tier.minQuantity) best = tier;
}
return best;
}
export function getNextBulkDiscountTier(
tiers: BulkDiscountTierLike[],
totalQuantity: number
): { unitsUntilNext: number; percent: number } | null {
const sorted = [...tiers].sort((a, b) => a.minQuantity - b.minQuantity);
const next = sorted.find((tier) => tier.minQuantity > totalQuantity);
if (!next) return null;
return { unitsUntilNext: next.minQuantity - totalQuantity, percent: next.percent };
}