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.
This commit is contained in:
1 parent
5c76fcc266
commit
c7927f2883
240 files changed
+26096
-137
No files matched your search
@@ -0,0 +1,33 @@
|
||||
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 };
|
||||
}
|
||||
Reference in new issue
Block a user