2023-06-16 20:09:56 +00:00
|
|
|
import { Tariff } from "@root/model/tariff";
|
2023-07-11 01:33:36 +00:00
|
|
|
import { PrivilegeMap} from "@root/model/privilege";
|
2023-06-16 20:09:56 +00:00
|
|
|
import { PrivilegeWithAmount } from "@root/model/privilege";
|
2023-07-11 01:33:36 +00:00
|
|
|
import { AnyDiscount, PrivilegeDiscount, ServiceDiscount, CartPurchasesAmountDiscount, PurchasesAmountDiscount } from "../model/discount";
|
|
|
|
import { useCartStore } from "@root/stores/cart";
|
|
|
|
import { useUserStore } from "@root/stores/user";
|
2023-06-16 20:09:56 +00:00
|
|
|
|
2023-07-11 01:33:36 +00:00
|
|
|
export function calcTariffPrices(tariff: Tariff, discounts: AnyDiscount[], privilegies: PrivilegeMap): {
|
2023-06-16 20:09:56 +00:00
|
|
|
price: number | undefined;
|
|
|
|
priceWithDiscounts: number | undefined;
|
|
|
|
} {
|
2023-06-30 15:35:31 +00:00
|
|
|
let price = tariff.price || tariff.privilegies.reduce((sum, privilege) => sum + privilege.amount * privilege.price, 0);
|
2023-07-11 01:33:36 +00:00
|
|
|
|
|
|
|
console.log(useCartStore.getState().cart)
|
2023-06-16 20:09:56 +00:00
|
|
|
|
2023-07-11 01:33:36 +00:00
|
|
|
let priceWithDiscounts = tariff.privilegies.reduce((sum, privilege) => {
|
2023-06-20 10:11:55 +00:00
|
|
|
let privilegePrice = privilege.amount * privilege.price;
|
2023-07-11 01:33:36 +00:00
|
|
|
let realprivilegie = privilegies[privilege.serviceKey].find(e => e._id === privilege.privilegeId)
|
|
|
|
if (realprivilegie) privilege.privilegeId = realprivilegie.privilegeId
|
2023-06-30 15:35:31 +00:00
|
|
|
const privilegeDiscount = findPrivilegeDiscount(privilege, discounts);
|
2023-06-16 20:09:56 +00:00
|
|
|
if (privilegeDiscount) privilegePrice *= privilegeDiscount.target.products[0].factor;
|
2023-07-11 01:33:36 +00:00
|
|
|
const serviceCartData = useCartStore.getState().cart.services.find(e => e.serviceKey === privilege.serviceKey);
|
|
|
|
let serviceprice = 0;
|
|
|
|
if (serviceCartData) serviceprice = serviceCartData.price;
|
2023-06-16 20:09:56 +00:00
|
|
|
|
2023-07-11 01:33:36 +00:00
|
|
|
const serviceDiscount = findServiceDiscount(privilege.serviceKey, privilegePrice + serviceprice, discounts);
|
2023-06-16 20:09:56 +00:00
|
|
|
if (serviceDiscount) privilegePrice *= serviceDiscount.target.factor;
|
|
|
|
|
|
|
|
return sum + privilegePrice;
|
|
|
|
}, 0);
|
|
|
|
|
2023-07-11 01:33:36 +00:00
|
|
|
const cartDiscount = findCartDiscount(priceWithDiscounts + useCartStore.getState().cart.priceAfterDiscounts, discounts);
|
|
|
|
if (cartDiscount) priceWithDiscounts *= cartDiscount.factor;
|
|
|
|
|
|
|
|
const acc = useUserStore.getState();
|
2023-07-12 00:31:00 +00:00
|
|
|
const loyalDiscount = findLoyalDiscount(acc!.userAccount!.wallet.purchasesAmount, discounts);
|
2023-07-11 01:33:36 +00:00
|
|
|
if (loyalDiscount) priceWithDiscounts *= loyalDiscount.factor;
|
|
|
|
|
|
|
|
|
2023-06-16 20:09:56 +00:00
|
|
|
return {
|
|
|
|
price,
|
|
|
|
priceWithDiscounts,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2023-06-30 15:35:31 +00:00
|
|
|
export function findPrivilegeDiscount(privilege: PrivilegeWithAmount, discounts: AnyDiscount[]): PrivilegeDiscount | null {
|
|
|
|
const applicableDiscounts = discounts.filter((discount): discount is PrivilegeDiscount => {
|
2023-06-16 20:09:56 +00:00
|
|
|
return (
|
|
|
|
discount.conditionType === "privilege" &&
|
|
|
|
privilege.privilegeId === discount.condition.privilege.id &&
|
|
|
|
privilege.amount >= discount.condition.privilege.value
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!applicableDiscounts.length) return null;
|
|
|
|
|
|
|
|
const maxValueDiscount = applicableDiscounts.reduce((prev, current) =>
|
|
|
|
current.condition.privilege.value > prev.condition.privilege.value ? current : prev
|
|
|
|
);
|
|
|
|
|
|
|
|
return maxValueDiscount;
|
|
|
|
}
|
|
|
|
|
2023-06-30 15:35:31 +00:00
|
|
|
export function findServiceDiscount(
|
2023-06-16 20:09:56 +00:00
|
|
|
serviceKey: string,
|
|
|
|
currentPrice: number,
|
2023-06-30 15:35:31 +00:00
|
|
|
discounts: AnyDiscount[],
|
2023-06-16 20:09:56 +00:00
|
|
|
): ServiceDiscount | null {
|
2023-06-30 15:35:31 +00:00
|
|
|
const discountsForTariffService = discounts.filter((discount): discount is ServiceDiscount => {
|
2023-06-16 20:09:56 +00:00
|
|
|
return (
|
|
|
|
discount.conditionType === "service" &&
|
|
|
|
discount.condition.service.id === serviceKey &&
|
|
|
|
currentPrice >= discount.condition.service.value
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!discountsForTariffService.length) return null;
|
|
|
|
|
|
|
|
const maxValueDiscount = discountsForTariffService.reduce((prev, current) => {
|
|
|
|
return current.condition.service.value > prev.condition.service.value ? current : prev;
|
|
|
|
});
|
|
|
|
|
|
|
|
return maxValueDiscount;
|
|
|
|
}
|
2023-07-11 01:33:36 +00:00
|
|
|
|
|
|
|
export function findCartDiscount(
|
|
|
|
currentPrice: number,
|
|
|
|
discounts: AnyDiscount[],
|
|
|
|
): CartPurchasesAmountDiscount | null {
|
|
|
|
const discountsForCart = discounts.filter((discount) : discount is CartPurchasesAmountDiscount => {
|
|
|
|
return (
|
|
|
|
discount.conditionType === "cartPurchasesAmount" &&
|
|
|
|
currentPrice >= discount.condition.cartPurchasesAmount
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
if (!discountsForCart.length) return null;
|
|
|
|
|
|
|
|
const maxValueDiscount = discountsForCart.reduce((prev, current) => {
|
|
|
|
return current.condition.cartPurchasesAmount > prev.condition.cartPurchasesAmount ? current : prev;
|
|
|
|
})
|
|
|
|
|
|
|
|
return maxValueDiscount;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function findLoyalDiscount(
|
|
|
|
currentPrice: number,
|
|
|
|
discounts: AnyDiscount[],
|
|
|
|
): PurchasesAmountDiscount | null {
|
|
|
|
const discountsForCart = discounts.filter((discount) : discount is PurchasesAmountDiscount => {
|
|
|
|
return (
|
|
|
|
discount.conditionType === "purchasesAmount" &&
|
|
|
|
currentPrice >= discount.condition.purchasesAmount
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
if (!discountsForCart.length) return null;
|
|
|
|
|
|
|
|
const maxValueDiscount = discountsForCart.reduce((prev, current) => {
|
|
|
|
return current.condition.purchasesAmount > prev.condition.purchasesAmount ? current : prev;
|
|
|
|
})
|
|
|
|
|
|
|
|
return maxValueDiscount;
|
|
|
|
}
|