adminFront/src/utils/calcCart/calcCart.ts
skeris 4c3d063528 fix: tariff editing is now working
feat: add taariff description support
feat: add tariff ordering support
2023-12-16 00:21:41 +03:00

83 lines
2.9 KiB
TypeScript

import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui";
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: [],
};
const serviceTariffType: Record<string, number> = {};
tariffs.forEach(tariff => {
let serviceData = cartData.services.find(service => service.serviceKey === tariff.privileges[0].serviceKey);
if (!serviceData) {
serviceData = {
serviceKey: tariff.privileges[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);
tariff.privileges.forEach(privilege => {
serviceTariffType[privilege.serviceKey] ??= +tariff.isCustom;
const isIncompatibleTariffs = serviceTariffType[privilege.serviceKey] ^ +tariff.isCustom;
if (isIncompatibleTariffs) throw new Error("Если взят готовый тариф, то кастомный на этот сервис сделать уже нельзя");
const privilegePrice = privilege.amount * privilege.price;
if (!tariff.price) tariffCartData.price += privilegePrice;
const privilegeCartData: PrivilegeCartData = {
serviceKey: privilege.serviceKey,
amount: privilege.amount,
privilegeId: privilege.privilegeId,
description: privilege.description,
price: privilegePrice,
appliedPrivilegeDiscount: null,
};
tariffCartData.privileges.push(privilegeCartData);
cartData.priceAfterDiscounts += privilegePrice;
cartData.itemCount++;
});
cartData.priceBeforeDiscounts += tariffCartData.price;
serviceData.price += tariffCartData.price;
});
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)}%`;
}