This commit is contained in:
nflnkr 2023-03-09 12:01:40 +03:00
parent 4a5f4f64ff
commit 378de99bff
4 changed files with 47 additions and 65 deletions

@ -6,7 +6,7 @@ import { useState } from "react";
import { GridSelectionModel } from "@mui/x-data-grid";
import { testUser } from "@root/stores/mocks/user";
import { useDiscountStore } from "@root/stores/discounts";
import { calcCartData, createCartItem, findDiscountById, findDiscountFactor, formatDiscountFactor } from "./calc";
import { calcCartData, createCartItem, findDiscountFactor, formatDiscountFactor } from "./calc";
import { useTariffStore } from "@root/stores/tariffs";
import { AnyDiscount, CartItemTotal } from "@root/model/cart";
@ -30,21 +30,17 @@ export default function Cart({ selectedTariffs }: Props) {
const envolvedDiscountsElement = (
<Box>
{cartItemTotal.envolvedDiscountIds.map((discountId, index, arr) => {
const discount = findDiscountById(discounts, discountId);
return (
<span key={discount._id}>
<DiscountTooltip
discount={discount}
cartItemTotal={cartItemTotal}
/>
{index < arr.length - (serviceDiscount ? 0 : 1) &&
<span>,&nbsp;</span>
}
</span>
);
})}
{cartItemTotal.envolvedDiscounts.map((discount, index, arr) => (
<span key={discount._id}>
<DiscountTooltip
discount={discount}
cartItemTotal={cartItemTotal}
/>
{index < arr.length - (serviceDiscount ? 0 : 1) &&
<span>,&nbsp;</span>
}
</span>
))}
{serviceDiscount &&
<span>
<DiscountTooltip
@ -67,7 +63,7 @@ export default function Cart({ selectedTariffs }: Props) {
};
});
const cartDiscounts = cartTotal?.envolvedCartDiscountIds.map(discountId => findDiscountById(discounts, discountId));
const cartDiscounts = cartTotal?.envolvedCartDiscounts
const cartDiscountsResultFactor = cartDiscounts && cartDiscounts.reduce((acc, discount) => acc * findDiscountFactor(discount), 1);
const envolvedCartDiscountsElement = cartDiscounts && (

@ -13,9 +13,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[0]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -37,9 +37,9 @@ describe("cart tests", () => {
});
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -61,9 +61,9 @@ describe("cart tests", () => {
});
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -85,9 +85,9 @@ describe("cart tests", () => {
});
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -109,9 +109,9 @@ describe("cart tests", () => {
});
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discountsWithoutTemplategen) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -125,9 +125,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[5]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -141,9 +141,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[6]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -157,9 +157,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[7]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -173,9 +173,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[8]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -189,9 +189,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[9]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts, "ABCD") as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -205,9 +205,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[10]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);
@ -221,9 +221,9 @@ describe("cart tests", () => {
const testCase = prepareTestCase(exampleCartValues.testCases[11]);
const cartTotal = calcCartData(testCase.user, testCase.cartItems, discounts) as CartTotal;
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscountIds];
const allEnvolvedDiscounts: string[] = [...cartTotal.envolvedCartDiscounts.map(discount => discount._id)];
cartTotal.items.forEach(cartItem => {
allEnvolvedDiscounts.push(...cartItem.envolvedDiscountIds);
allEnvolvedDiscounts.push(...cartItem.envolvedDiscounts.map(discount => discount._id));
});
SERVICE_LIST.map(service => service.serviceKey).forEach(service => {
if (cartTotal.discountsByService[service]) allEnvolvedDiscounts.push(cartTotal.discountsByService[service]!._id);

@ -43,7 +43,7 @@ export function calcCartData(
squiz: null,
dwarfener: null,
},
envolvedCartDiscountIds: [],
envolvedCartDiscounts: [],
};
// layer 0
@ -52,7 +52,7 @@ export function calcCartData(
cartItems.forEach(cartItem => {
cartTotal.items.push({
envolvedDiscountIds: [],
envolvedDiscounts: [],
tariff: cartItem.tariff,
totalPrice: cartItem.price,
});
@ -62,7 +62,7 @@ export function calcCartData(
});
cartTotal.totalPrice *= discount.target.factor;
cartTotal.envolvedCartDiscountIds.push(discount._id);
cartTotal.envolvedCartDiscounts.push(discount);
return cartTotal;
}
@ -73,7 +73,7 @@ export function calcCartData(
for (const cartItem of cartItems) {
const cartItemTotal: CartItemTotal = {
tariff: cartItem.tariff,
envolvedDiscountIds: [],
envolvedDiscounts: [],
totalPrice: cartItem.price,
};
@ -85,7 +85,7 @@ export function calcCartData(
if (tariff.customPricePerUnit !== undefined && !couponDiscount.overwhelm) return;
cartItemTotal.totalPrice *= product.factor;
cartItemTotal.envolvedDiscountIds.push(couponDiscount._id);
cartItemTotal.envolvedDiscounts.push(couponDiscount);
privilegesAffectedByCoupon.push(product.privilegeId);
});
@ -97,7 +97,7 @@ export function calcCartData(
if (privilegesAffectedByCoupon.includes(privilegeDiscount.condition.privilege.id)) return;
cartItemTotal.totalPrice *= product.factor;
cartItemTotal.envolvedDiscountIds.push(privilegeDiscount._id);
cartItemTotal.envolvedDiscounts.push(privilegeDiscount);
});
cartTotal.items.push(cartItemTotal);
@ -119,14 +119,14 @@ export function calcCartData(
const cartPurchasesAmountDiscount = findMaxCartPurchasesAmountDiscount(discounts, cartTotal);
if (cartPurchasesAmountDiscount) {
cartTotal.totalPrice *= cartPurchasesAmountDiscount.factor;
cartTotal.envolvedCartDiscountIds.push(cartPurchasesAmountDiscount._id);
cartTotal.envolvedCartDiscounts.push(cartPurchasesAmountDiscount);
}
// layer 4
const totalPurchasesAmountDiscount = findMaxTotalPurchasesAmountDiscount(discounts, user);
if (totalPurchasesAmountDiscount) {
cartTotal.totalPrice *= totalPurchasesAmountDiscount.factor;
cartTotal.envolvedCartDiscountIds.push(totalPurchasesAmountDiscount._id);
cartTotal.envolvedCartDiscounts.push(totalPurchasesAmountDiscount);
}
return cartTotal;
@ -219,13 +219,6 @@ export function createCartItem(tariff: Tariff): CartItem {
return { tariff, price, id: "someId" };
}
export function findDiscountById(discounts: AnyDiscount[], id: string) {
const discount = discounts.find(discount => discount._id === id);
if (!discount) throw new Error("Discount not found by id");
return discount;
}
export function findDiscountFactor(discount: AnyDiscount, privilegeId?: string) {
switch (discount.conditionType) {
case "cartPurchasesAmount":
@ -254,10 +247,3 @@ export function findDiscountFactor(discount: AnyDiscount, privilegeId?: string)
export function formatDiscountFactor(factor: number): string {
return `${((1 - factor) * 100).toFixed(1)}%`;
}
export const PositiveInput = (event: any) => {
const numberInput = parseInt(event.target.value);
if (isNaN(numberInput) || numberInput < 0) {
event.target.value = '0';
}
};

@ -119,7 +119,7 @@ export interface CartItem {
/** Пункт корзины с уже примененными скидками */
export interface CartItemTotal {
/** Массив с id примененных скидок */
envolvedDiscountIds: string[]; // TODO заменить на ссылки на скидки
envolvedDiscounts: (PrivilegeDiscount | UserDiscount)[];
totalPrice: number;
tariff: Tariff;
}
@ -139,5 +139,5 @@ export interface CartTotal {
/** Скидки по сервисам */
discountsByService: ServiceToDiscountMap;
/** Учтенные скидки типов userType, cartPurchasesAmount, totalPurchasesAmount */
envolvedCartDiscountIds: string[]; // TODO заменить на ссылки на скидки
envolvedCartDiscounts: (UserTypeDiscount | CartPurchasesAmountDiscount | PurchasesAmountDiscount)[];
}