fix cart types and functions

This commit is contained in:
nflnkr 2023-08-12 19:17:29 +03:00
parent 0524a39318
commit 2018fa85dd
6 changed files with 63 additions and 58 deletions

@ -1,6 +1,6 @@
{ {
"name": "@frontend/kitui", "name": "@frontend/kitui",
"version": "1.0.20", "version": "1.0.21",
"description": "test", "description": "test",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",

@ -11,9 +11,16 @@ export type PrivilegeCartData = {
appliedPrivilegeDiscount: Discount | null; appliedPrivilegeDiscount: Discount | null;
}; };
export type TariffCartData = {
tariffId: string;
price: number;
isCustom: boolean;
privileges: PrivilegeCartData[];
};
export type ServiceCartData = { export type ServiceCartData = {
serviceKey: string; serviceKey: string;
privileges: PrivilegeCartData[]; tariffs: TariffCartData[];
price: number; price: number;
appliedServiceDiscount: Discount | null; appliedServiceDiscount: Discount | null;
}; };

@ -1,4 +1,5 @@
import { CartData, Discount } from "../../model"; import { CartData, Discount } from "../../model";
import { findDiscountFactor } from "./findDiscountFactor";
export function applyCartDiscount( export function applyCartDiscount(
@ -6,20 +7,17 @@ export function applyCartDiscount(
discounts: Discount[], discounts: Discount[],
) { ) {
const cartDiscount = findCartDiscount(cartData.priceAfterDiscounts, discounts); const cartDiscount = findCartDiscount(cartData.priceAfterDiscounts, discounts);
if (cartDiscount.discount) { if (!cartDiscount) return;
cartData.priceAfterDiscounts *= cartDiscount.factor;
cartData.allAppliedDiscounts.push(cartDiscount.discount); cartData.priceAfterDiscounts *= findDiscountFactor(cartDiscount);
cartData.appliedCartPurchasesDiscount = cartDiscount.discount; cartData.allAppliedDiscounts.push(cartDiscount);
} cartData.appliedCartPurchasesDiscount = cartDiscount;
} }
export function findCartDiscount( export function findCartDiscount(
cartPurchasesAmount: number, cartPurchasesAmount: number,
discounts: Discount[], discounts: Discount[],
): { ): Discount | null {
discount: Discount | null,
factor: number,
} {
const applicableDiscounts = discounts.filter(discount => { const applicableDiscounts = discounts.filter(discount => {
return ( return (
discount.Layer === 3 && discount.Layer === 3 &&
@ -27,11 +25,11 @@ export function findCartDiscount(
); );
}); });
if (!applicableDiscounts.length) return { discount: null, factor: 1 }; if (!applicableDiscounts.length) return null;
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { const maxValueDiscount = applicableDiscounts.reduce((prev, current) => {
return current.Condition.CartPurchasesAmount > prev.Condition.CartPurchasesAmount ? current : prev; return current.Condition.CartPurchasesAmount > prev.Condition.CartPurchasesAmount ? current : prev;
}); });
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; return maxValueDiscount;
} }

@ -1,4 +1,5 @@
import { CartData, Discount } from "../../model"; import { CartData, Discount } from "../../model";
import { findDiscountFactor } from "./findDiscountFactor";
export function applyLoyaltyDiscount( export function applyLoyaltyDiscount(
@ -7,20 +8,17 @@ export function applyLoyaltyDiscount(
purchasesAmount: number, purchasesAmount: number,
) { ) {
const loyalDiscount = findLoyaltyDiscount(purchasesAmount, discounts); const loyalDiscount = findLoyaltyDiscount(purchasesAmount, discounts);
if (loyalDiscount.discount) { if (!loyalDiscount) return;
cartData.priceAfterDiscounts *= loyalDiscount.factor;
cartData.allAppliedDiscounts.push(loyalDiscount.discount); cartData.priceAfterDiscounts *= findDiscountFactor(loyalDiscount);
cartData.appliedLoyaltyDiscount = loyalDiscount.discount; cartData.allAppliedDiscounts.push(loyalDiscount);
} cartData.appliedLoyaltyDiscount = loyalDiscount;
} }
export function findLoyaltyDiscount( export function findLoyaltyDiscount(
purchasesAmount: number, purchasesAmount: number,
discounts: Discount[], discounts: Discount[],
): { ): Discount | null {
discount: Discount | null,
factor: number,
} {
const applicableDiscounts = discounts.filter(discount => { const applicableDiscounts = discounts.filter(discount => {
return ( return (
discount.Layer === 4 && discount.Layer === 4 &&
@ -28,11 +26,11 @@ export function findLoyaltyDiscount(
); );
}); });
if (!applicableDiscounts.length) return { discount: null, factor: 1 }; if (!applicableDiscounts.length) return null;
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { const maxValueDiscount = applicableDiscounts.reduce((prev, current) => {
return current.Condition.PurchasesAmount > prev.Condition.PurchasesAmount ? current : prev; return current.Condition.PurchasesAmount > prev.Condition.PurchasesAmount ? current : prev;
}); });
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; return maxValueDiscount;
} }

@ -1,4 +1,5 @@
import { CartData, Discount } from "../../model"; import { CartData, Discount } from "../../model";
import { findDiscountFactor } from "./findDiscountFactor";
export function applyPrivilegeDiscounts( export function applyPrivilegeDiscounts(
@ -6,18 +7,21 @@ export function applyPrivilegeDiscounts(
discounts: Discount[], discounts: Discount[],
) { ) {
cartData.services.forEach(service => { cartData.services.forEach(service => {
service.privileges.forEach(privilege => { service.tariffs.forEach(tariff => {
const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price, discounts); tariff.privileges.forEach(privilege => {
if (privilegeDiscount.discount) { const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price, discounts);
privilege.price *= privilegeDiscount.factor; if (!privilegeDiscount) return;
cartData.allAppliedDiscounts.push(privilegeDiscount.discount);
privilege.appliedPrivilegeDiscount = privilegeDiscount.discount;
}
});
cartData.priceAfterDiscounts -= service.price; const discountAmount = privilege.price * (1 - findDiscountFactor(privilegeDiscount));
service.price = service.privileges.reduce((sum, privilege) => privilege.price + sum, 0); privilege.price -= discountAmount;
cartData.priceAfterDiscounts += service.price; cartData.allAppliedDiscounts.push(privilegeDiscount);
privilege.appliedPrivilegeDiscount = privilegeDiscount;
tariff.price -= discountAmount;
service.price -= discountAmount;
cartData.priceAfterDiscounts -= discountAmount;
});
});
}); });
} }
@ -25,10 +29,7 @@ export function findPrivilegeDiscount(
privilegeId: string, privilegeId: string,
privilegePrice: number, privilegePrice: number,
discounts: Discount[], discounts: Discount[],
): { ): Discount | null {
discount: Discount | null,
factor: number,
} {
const applicableDiscounts = discounts.filter(discount => { const applicableDiscounts = discounts.filter(discount => {
const conditionMinPrice = parseFloat(discount.Condition.Term); const conditionMinPrice = parseFloat(discount.Condition.Term);
if (!isFinite(conditionMinPrice)) throw new Error(`Couldn't parse Discount.Condition.Term: ${discount.Condition.Term}`); if (!isFinite(conditionMinPrice)) throw new Error(`Couldn't parse Discount.Condition.Term: ${discount.Condition.Term}`);
@ -40,11 +41,11 @@ export function findPrivilegeDiscount(
); );
}); });
if (!applicableDiscounts.length) return { discount: null, factor: 1 }; if (!applicableDiscounts.length) return null;
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => const maxValueDiscount = applicableDiscounts.reduce((prev, current) =>
parseFloat(current.Condition.Term) > parseFloat(prev.Condition.Term) ? current : prev parseFloat(current.Condition.Term) > parseFloat(prev.Condition.Term) ? current : prev
); );
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Products[0].Factor }; return maxValueDiscount;
} }

@ -1,4 +1,5 @@
import { CartData, Discount } from "../../model"; import { CartData, Discount } from "../../model";
import { findDiscountFactor } from "./findDiscountFactor";
export function applyServiceDiscounts( export function applyServiceDiscounts(
@ -6,18 +7,21 @@ export function applyServiceDiscounts(
discounts: Discount[], discounts: Discount[],
) { ) {
cartData.services.forEach(service => { cartData.services.forEach(service => {
service.privileges.forEach(privilege => { service.tariffs.map(tariff => {
const privilegeDiscount = findServiceDiscount(privilege.serviceKey, privilege.price, discounts); tariff.privileges.forEach(privilege => {
if (privilegeDiscount.discount) { const privilegeDiscount = findServiceDiscount(privilege.serviceKey, privilege.price, discounts);
privilege.price *= privilegeDiscount.factor; if (!privilegeDiscount) return;
cartData.allAppliedDiscounts.push(privilegeDiscount.discount);
service.appliedServiceDiscount = privilegeDiscount.discount;
}
});
cartData.priceAfterDiscounts -= service.price; const discountAmount = privilege.price * (1 - findDiscountFactor(privilegeDiscount));
service.price = service.privileges.reduce((sum, privilege) => privilege.price + sum, 0); privilege.price -= discountAmount;
cartData.priceAfterDiscounts += service.price; cartData.allAppliedDiscounts.push(privilegeDiscount);
service.appliedServiceDiscount = privilegeDiscount;
tariff.price -= discountAmount;
service.price -= discountAmount;
cartData.priceAfterDiscounts -= discountAmount;
});
});
}); });
} }
@ -25,10 +29,7 @@ export function findServiceDiscount(
serviceKey: string, serviceKey: string,
currentPrice: number, currentPrice: number,
discounts: Discount[], discounts: Discount[],
): { ): Discount | null {
discount: Discount | null,
factor: number,
} {
const applicableDiscounts = discounts.filter(discount => { const applicableDiscounts = discounts.filter(discount => {
return ( return (
discount.Layer === 2 && discount.Layer === 2 &&
@ -37,11 +38,11 @@ export function findServiceDiscount(
); );
}); });
if (!applicableDiscounts.length) return { discount: null, factor: 1 }; if (!applicableDiscounts.length) return null;
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => { const maxValueDiscount = applicableDiscounts.reduce((prev, current) => {
return current.Condition.PriceFrom > prev.Condition.PriceFrom ? current : prev; return current.Condition.PriceFrom > prev.Condition.PriceFrom ? current : prev;
}); });
return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; return maxValueDiscount;
} }