adminFront/src/utils/calcCart/calcCart.ts

82 lines
2.9 KiB
TypeScript
Raw Normal View History

2023-08-18 10:46:26 +00:00
import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui";
2023-08-02 11:36:50 +00:00
export function calcCart(
tariffs: Tariff[],
discounts: Discount[],
purchasesAmount: number,
coupon?: string,
): CartData {
const cartData: CartData = {
services: [],
priceBeforeDiscounts: 0,
priceAfterDiscounts: 0,
itemCount: 0,
appliedCartPurchasesDiscount: null,
appliedLoyaltyDiscount: null,
allAppliedDiscounts: [],
};
2023-08-04 13:04:19 +00:00
const serviceTariffType: Record<string, number> = {};
2023-08-02 11:36:50 +00:00
tariffs.forEach(tariff => {
2023-08-18 10:46:26 +00:00
let serviceData = cartData.services.find(service => service.serviceKey === tariff.privilegies[0].serviceKey);
if (!serviceData) {
serviceData = {
serviceKey: tariff.privilegies[0].serviceKey,
tariffs: [],
price: 0,
appliedServiceDiscount: null,
};
cartData.services.push(serviceData);
}
const tariffCartData: TariffCartData = {
price: tariff.price ?? 0,
isCustom: tariff.isCustom,
privileges: [],
id: tariff._id,
name: tariff.name,
};
serviceData.tariffs.push(tariffCartData);
2023-08-02 11:36:50 +00:00
tariff.privilegies.forEach(privilege => {
2023-08-04 13:04:19 +00:00
serviceTariffType[privilege.serviceKey] ??= +tariff.isCustom;
2023-08-18 10:46:26 +00:00
const isIncompatibleTariffs = serviceTariffType[privilege.serviceKey] ^ +tariff.isCustom;
2023-08-04 13:04:19 +00:00
if (isIncompatibleTariffs) throw new Error("Если взят готовый тариф, то кастомный на этот сервис сделать уже нельзя");
2023-08-02 11:36:50 +00:00
const privilegePrice = privilege.amount * privilege.price;
2023-08-18 10:46:26 +00:00
if (!tariff.price) tariffCartData.price += privilegePrice;
2023-08-02 11:36:50 +00:00
2023-08-18 10:46:26 +00:00
const privilegeCartData: PrivilegeCartData = {
2023-08-02 11:36:50 +00:00
serviceKey: privilege.serviceKey,
privilegeId: privilege.privilegeId,
description: privilege.description,
price: privilegePrice,
appliedPrivilegeDiscount: null,
};
2023-08-18 10:46:26 +00:00
tariffCartData.privileges.push(privilegeCartData);
2023-08-02 11:36:50 +00:00
cartData.priceAfterDiscounts += privilegePrice;
cartData.itemCount++;
});
2023-08-18 10:46:26 +00:00
cartData.priceBeforeDiscounts += tariffCartData.price;
serviceData.price += tariffCartData.price;
2023-08-02 11:36:50 +00:00
});
applyPrivilegeDiscounts(cartData, discounts);
applyServiceDiscounts(cartData, discounts);
applyCartDiscount(cartData, discounts);
applyLoyaltyDiscount(cartData, discounts, purchasesAmount);
cartData.allAppliedDiscounts = Array.from(new Set(cartData.allAppliedDiscounts));
return cartData;
}
export function formatDiscountFactor(factor: number): string {
return `${((1 - factor) * 100).toFixed(1)}%`;
}