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.
34 lines
1.1 KiB
TypeScript
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 };
|
|
}
|