front-hub/src/utils/calcTariffPrices.ts
nflnkr a6ac175f22 fix cart & custom tariff calculations
use discount type from kitui package
use functions for finding discounts from kitui package
remove old discount types
2023-07-13 21:59:38 +03:00

44 lines
2.0 KiB
TypeScript

import { Tariff } from "@root/model/tariff";
import { ServiceKeyToPrivilegesMap } from "@root/model/privilege";
import { useCartStore } from "@root/stores/cart";
import { useUserStore } from "@root/stores/user";
import { Discount, findCartDiscount, findLoyaltyDiscount, findPrivilegeDiscount, findServiceDiscount } from "@frontend/kitui";
export function calcIndividualTariffPrices(tariff: Tariff, discounts: Discount[], privilegies: ServiceKeyToPrivilegesMap): {
price: number | undefined;
priceWithDiscounts: number | undefined;
} {
let price = tariff.price || tariff.privilegies.reduce((sum, privilege) => sum + privilege.amount * privilege.price, 0);
let priceWithDiscounts = tariff.privilegies.reduce((sum, privilege) => {
let privilegePrice = privilege.amount * privilege.price;
let realprivilegie = privilegies[privilege.serviceKey].find(e => e._id === privilege.privilegeId);
if (realprivilegie) privilege.privilegeId = realprivilegie.privilegeId;
const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price * privilege.amount, discounts);
privilegePrice *= privilegeDiscount.factor;
const serviceCartData = useCartStore.getState().cart.services.find(e => e.serviceKey === privilege.serviceKey);
let serviceprice = 0;
if (serviceCartData) serviceprice = serviceCartData.price;
const serviceDiscount = findServiceDiscount(privilege.serviceKey, privilegePrice + serviceprice, discounts);
if (serviceDiscount) privilegePrice *= serviceDiscount.factor;
return sum + privilegePrice;
}, 0);
const cartDiscount = findCartDiscount(priceWithDiscounts + useCartStore.getState().cart.priceAfterDiscounts, discounts);
priceWithDiscounts *= cartDiscount.factor;
const acc = useUserStore.getState();
const loyalDiscount = findLoyaltyDiscount(acc!.userAccount!.wallet.purchasesAmount, discounts);
priceWithDiscounts *= loyalDiscount.factor;
return {
price,
priceWithDiscounts,
};
}