diff --git a/src/pages/dashboard/Content/Tariffs/cartCalcs.ts b/src/pages/dashboard/Content/Tariffs/cartCalcs.ts index 216b1d9..e84fb80 100644 --- a/src/pages/dashboard/Content/Tariffs/cartCalcs.ts +++ b/src/pages/dashboard/Content/Tariffs/cartCalcs.ts @@ -17,10 +17,9 @@ export function calcCartData( squiz: 0, dwarfener: 0, }, + envolvedCartDiscounts: [], }; - debugger; - // TODO layer 0 for (const discount of discounts) { if (discount.conditionType !== "userType" || discount.condition.userType !== user.Type) continue; @@ -53,7 +52,7 @@ export function calcCartData( } } - // layer 1-promo + // layer 1-privilege for (const cartItem of cartItems) { const cartItemTotal: Cart.CartItemTotal = { item: cartItem.item, @@ -80,25 +79,38 @@ export function calcCartData( // layer 2 SERVICE_LIST.forEach(service => { const serviceDiscount = findMaxServiceDiscount(service, discounts, cartTotal); - if (serviceDiscount) cartTotal.priceByService[service] *= serviceDiscount.target.factor; + if (serviceDiscount) { + cartTotal.priceByService[service] *= serviceDiscount.target.factor; + cartTotal.envolvedCartDiscounts.push(serviceDiscount._id); + } cartTotal.totalPrice += cartTotal.priceByService[service]; }); // layer 3 const cartPurchasesAmountDiscount = findMaxCartPurchasesAmountDiscount(discounts, cartTotal); - if (cartPurchasesAmountDiscount) cartTotal.totalPrice *= cartPurchasesAmountDiscount.factor; + if (cartPurchasesAmountDiscount) { + cartTotal.totalPrice *= cartPurchasesAmountDiscount.factor; + cartTotal.envolvedCartDiscounts.push(cartPurchasesAmountDiscount._id); + } // layer 4 const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user); - if (totalPurchasesAmountDiscount) cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor; + if (totalPurchasesAmountDiscount) { + cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor; + cartTotal.envolvedCartDiscounts.push(totalPurchasesAmountDiscount._id); + } return cartTotal; } function findMaxApplicablePrivilegeDiscount(discounts: Cart.AnyDiscount[], tariff: Tariffs.Tariff): Cart.PrivilegeDiscount | null { const applicableDiscounts = discounts.filter((discount): discount is Cart.PrivilegeDiscount => { - return discount.conditionType === "privilege" && tariff.amount >= discount.condition.privilege.value; + return ( + discount.conditionType === "privilege" && + tariff.privilege.privilegeId === discount.condition.privilege.id && + tariff.amount >= discount.condition.privilege.value + ); }); if (!applicableDiscounts.length) return null; @@ -112,7 +124,7 @@ function findMaxApplicablePrivilegeDiscount(discounts: Cart.AnyDiscount[], tarif function findMaxCartPurchasesAmountDiscount(discounts: Cart.AnyDiscount[], cartTotal: Cart.CartTotal): Cart.CartPurchasesAmountDiscount | null { const applicableDiscounts = discounts.filter((discount): discount is Cart.CartPurchasesAmountDiscount => { - return discount.conditionType === "cartPurchasesAmount" && discount.condition.cartPurchasesAmount >= cartTotal.totalPrice; + return discount.conditionType === "cartPurchasesAmount" && cartTotal.totalPrice >= discount.condition.cartPurchasesAmount; }); if (!applicableDiscounts.length) return null; @@ -126,7 +138,7 @@ function findMaxCartPurchasesAmountDiscount(discounts: Cart.AnyDiscount[], cartT function findMaxTotalPurchasesAmountDiscount(discounts: Cart.AnyDiscount[], user: User): Cart.PurchasesAmountDiscount | null { const applicableDiscounts = discounts.filter((discount): discount is Cart.PurchasesAmountDiscount => { - return discount.conditionType === "purchasesAmount" && discount.condition.purchasesAmount >= user.PurchasesAmount; + return discount.conditionType === "purchasesAmount" && user.PurchasesAmount >= discount.condition.purchasesAmount; }); if (!applicableDiscounts.length) return null; @@ -147,7 +159,7 @@ function findMaxServiceDiscount( return ( discount.conditionType === "service" && discount.condition.service.id === service && - discount.condition.service.value >= cartTotal.priceByService[service] + cartTotal.priceByService[service] >= discount.condition.service.value ); });