fix cart types and functions
This commit is contained in:
parent
0524a39318
commit
2018fa85dd
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user