From 2018fa85dd0b773f96ba1d9d85c647029aa3dda3 Mon Sep 17 00:00:00 2001 From: nflnkr <105123049+nflnkr@users.noreply.github.com> Date: Sat, 12 Aug 2023 19:17:29 +0300 Subject: [PATCH] fix cart types and functions --- package.json | 2 +- src/model/cart.ts | 9 +++++++- src/utils/cart/cartDiscount.ts | 20 ++++++++--------- src/utils/cart/loyaltyDiscount.ts | 20 ++++++++--------- src/utils/cart/privilegeDiscount.ts | 35 +++++++++++++++-------------- src/utils/cart/serviceDiscount.ts | 35 +++++++++++++++-------------- 6 files changed, 63 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 5dad53d..df3a366 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@frontend/kitui", - "version": "1.0.20", + "version": "1.0.21", "description": "test", "main": "index.js", "types": "index.d.ts", diff --git a/src/model/cart.ts b/src/model/cart.ts index 7dfac85..ed3c964 100644 --- a/src/model/cart.ts +++ b/src/model/cart.ts @@ -11,9 +11,16 @@ export type PrivilegeCartData = { appliedPrivilegeDiscount: Discount | null; }; +export type TariffCartData = { + tariffId: string; + price: number; + isCustom: boolean; + privileges: PrivilegeCartData[]; +}; + export type ServiceCartData = { serviceKey: string; - privileges: PrivilegeCartData[]; + tariffs: TariffCartData[]; price: number; appliedServiceDiscount: Discount | null; }; diff --git a/src/utils/cart/cartDiscount.ts b/src/utils/cart/cartDiscount.ts index 00479ca..4450c85 100644 --- a/src/utils/cart/cartDiscount.ts +++ b/src/utils/cart/cartDiscount.ts @@ -1,4 +1,5 @@ import { CartData, Discount } from "../../model"; +import { findDiscountFactor } from "./findDiscountFactor"; export function applyCartDiscount( @@ -6,20 +7,17 @@ export function applyCartDiscount( discounts: Discount[], ) { const cartDiscount = findCartDiscount(cartData.priceAfterDiscounts, discounts); - if (cartDiscount.discount) { - cartData.priceAfterDiscounts *= cartDiscount.factor; - cartData.allAppliedDiscounts.push(cartDiscount.discount); - cartData.appliedCartPurchasesDiscount = cartDiscount.discount; - } + if (!cartDiscount) return; + + cartData.priceAfterDiscounts *= findDiscountFactor(cartDiscount); + cartData.allAppliedDiscounts.push(cartDiscount); + cartData.appliedCartPurchasesDiscount = cartDiscount; } export function findCartDiscount( cartPurchasesAmount: number, discounts: Discount[], -): { - discount: Discount | null, - factor: number, -} { +): Discount | null { const applicableDiscounts = discounts.filter(discount => { return ( 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) => { return current.Condition.CartPurchasesAmount > prev.Condition.CartPurchasesAmount ? current : prev; }); - return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; + return maxValueDiscount; } diff --git a/src/utils/cart/loyaltyDiscount.ts b/src/utils/cart/loyaltyDiscount.ts index bb5d99a..51346a2 100644 --- a/src/utils/cart/loyaltyDiscount.ts +++ b/src/utils/cart/loyaltyDiscount.ts @@ -1,4 +1,5 @@ import { CartData, Discount } from "../../model"; +import { findDiscountFactor } from "./findDiscountFactor"; export function applyLoyaltyDiscount( @@ -7,20 +8,17 @@ export function applyLoyaltyDiscount( purchasesAmount: number, ) { const loyalDiscount = findLoyaltyDiscount(purchasesAmount, discounts); - if (loyalDiscount.discount) { - cartData.priceAfterDiscounts *= loyalDiscount.factor; - cartData.allAppliedDiscounts.push(loyalDiscount.discount); - cartData.appliedLoyaltyDiscount = loyalDiscount.discount; - } + if (!loyalDiscount) return; + + cartData.priceAfterDiscounts *= findDiscountFactor(loyalDiscount); + cartData.allAppliedDiscounts.push(loyalDiscount); + cartData.appliedLoyaltyDiscount = loyalDiscount; } export function findLoyaltyDiscount( purchasesAmount: number, discounts: Discount[], -): { - discount: Discount | null, - factor: number, -} { +): Discount | null { const applicableDiscounts = discounts.filter(discount => { return ( 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) => { return current.Condition.PurchasesAmount > prev.Condition.PurchasesAmount ? current : prev; }); - return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; + return maxValueDiscount; } diff --git a/src/utils/cart/privilegeDiscount.ts b/src/utils/cart/privilegeDiscount.ts index 34d3ff7..8db36ab 100644 --- a/src/utils/cart/privilegeDiscount.ts +++ b/src/utils/cart/privilegeDiscount.ts @@ -1,4 +1,5 @@ import { CartData, Discount } from "../../model"; +import { findDiscountFactor } from "./findDiscountFactor"; export function applyPrivilegeDiscounts( @@ -6,18 +7,21 @@ export function applyPrivilegeDiscounts( discounts: Discount[], ) { cartData.services.forEach(service => { - service.privileges.forEach(privilege => { - const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price, discounts); - if (privilegeDiscount.discount) { - privilege.price *= privilegeDiscount.factor; - cartData.allAppliedDiscounts.push(privilegeDiscount.discount); - privilege.appliedPrivilegeDiscount = privilegeDiscount.discount; - } - }); + service.tariffs.forEach(tariff => { + tariff.privileges.forEach(privilege => { + const privilegeDiscount = findPrivilegeDiscount(privilege.privilegeId, privilege.price, discounts); + if (!privilegeDiscount) return; - cartData.priceAfterDiscounts -= service.price; - service.price = service.privileges.reduce((sum, privilege) => privilege.price + sum, 0); - cartData.priceAfterDiscounts += service.price; + const discountAmount = privilege.price * (1 - findDiscountFactor(privilegeDiscount)); + privilege.price -= discountAmount; + 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, privilegePrice: number, discounts: Discount[], -): { - discount: Discount | null, - factor: number, -} { +): Discount | null { const applicableDiscounts = discounts.filter(discount => { const conditionMinPrice = parseFloat(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) => parseFloat(current.Condition.Term) > parseFloat(prev.Condition.Term) ? current : prev ); - return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Products[0].Factor }; + return maxValueDiscount; } diff --git a/src/utils/cart/serviceDiscount.ts b/src/utils/cart/serviceDiscount.ts index 7d3e29d..4d15800 100644 --- a/src/utils/cart/serviceDiscount.ts +++ b/src/utils/cart/serviceDiscount.ts @@ -1,4 +1,5 @@ import { CartData, Discount } from "../../model"; +import { findDiscountFactor } from "./findDiscountFactor"; export function applyServiceDiscounts( @@ -6,18 +7,21 @@ export function applyServiceDiscounts( discounts: Discount[], ) { cartData.services.forEach(service => { - service.privileges.forEach(privilege => { - const privilegeDiscount = findServiceDiscount(privilege.serviceKey, privilege.price, discounts); - if (privilegeDiscount.discount) { - privilege.price *= privilegeDiscount.factor; - cartData.allAppliedDiscounts.push(privilegeDiscount.discount); - service.appliedServiceDiscount = privilegeDiscount.discount; - } - }); + service.tariffs.map(tariff => { + tariff.privileges.forEach(privilege => { + const privilegeDiscount = findServiceDiscount(privilege.serviceKey, privilege.price, discounts); + if (!privilegeDiscount) return; - cartData.priceAfterDiscounts -= service.price; - service.price = service.privileges.reduce((sum, privilege) => privilege.price + sum, 0); - cartData.priceAfterDiscounts += service.price; + const discountAmount = privilege.price * (1 - findDiscountFactor(privilegeDiscount)); + privilege.price -= discountAmount; + 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, currentPrice: number, discounts: Discount[], -): { - discount: Discount | null, - factor: number, -} { +): Discount | null { const applicableDiscounts = discounts.filter(discount => { return ( 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) => { return current.Condition.PriceFrom > prev.Condition.PriceFrom ? current : prev; }); - return { discount: maxValueDiscount, factor: maxValueDiscount.Target.Factor }; + return maxValueDiscount; }