fix logic

This commit is contained in:
nflnkr 2023-02-27 16:33:15 +03:00
parent 8ccb95d45f
commit 93370f4173

@ -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
);
});