diff --git a/package.json b/package.json index 9baaad6..ade6abd 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "@date-io/dayjs": "^2.15.0", "@emotion/react": "^11.10.4", "@emotion/styled": "^11.10.4", - "@frontend/kitui": "^1.0.52", + "@frontend/kitui": "^1.0.54", "@material-ui/pickers": "^3.3.10", "@mui/icons-material": "^5.10.3", "@mui/material": "^5.10.5", diff --git a/src/api/tariffs.ts b/src/api/tariffs.ts index d8031fa..40369fd 100644 --- a/src/api/tariffs.ts +++ b/src/api/tariffs.ts @@ -35,8 +35,6 @@ export const createTariff = async ( } ); - debugger; - return [createdTariffResponse]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); diff --git a/src/pages/Setting/CardPrivilegie.tsx b/src/pages/Setting/CardPrivilegie.tsx index 4e72417..5cf5dd9 100644 --- a/src/pages/Setting/CardPrivilegie.tsx +++ b/src/pages/Setting/CardPrivilegie.tsx @@ -4,6 +4,9 @@ import { Box, IconButton, TextField, Tooltip, Typography } from "@mui/material"; import ModeEditOutlineOutlinedIcon from "@mui/icons-material/ModeEditOutlineOutlined"; import { PrivilegeWithAmount } from "@frontend/kitui"; import { putPrivilege } from "@root/api/privilegies"; +import SaveIcon from '@mui/icons-material/Save'; +import { currencyFormatter } from "@root/utils/currencyFormatter"; + interface CardPrivilege { privilege: PrivilegeWithAmount; @@ -40,6 +43,8 @@ export const СardPrivilege = ({ privilege }: CardPrivilege) => { return; } + enqueueSnackbar("Изменения сохранены"); + priceRef.current.innerText = "price: " + inputValue; setInputValue(""); setInputOpen(false); @@ -55,6 +60,13 @@ export const СardPrivilege = ({ privilege }: CardPrivilege) => { } }; + function handleSavePrice() { + setInputOpen(false); + if (!inputValue) return; + + putPrivileges(); +} + return ( { py: 0, }, }} + InputProps={{ + endAdornment: ( + + + + ) + }} /> ) : (
- price: {privilege.price / 100} + price: {currencyFormatter.format(privilege.price / 100)}
)} {translationType[privilege.type]} diff --git a/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx b/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx index 7bbfb17..2250207 100644 --- a/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx +++ b/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx @@ -20,6 +20,7 @@ import { findPrivilegeById, usePrivilegeStore, } from "@root/stores/privilegesStore"; +import { currencyFormatter } from "@root/utils/currencyFormatter"; export default function CreateTariff() { const theme = useTheme(); @@ -77,6 +78,8 @@ export default function CreateTariff() { return enqueueSnackbar(createdTariffError); } + enqueueSnackbar("Тариф создан"); + requestTariffs(); } }; @@ -177,7 +180,7 @@ export default function CreateTariff() { Единица: {privilege.type} - Стандартная цена за единицу: {privilege.price} + Стандартная цена за единицу: {currencyFormatter.format(privilege.price / 100)}
)} diff --git a/src/pages/dashboard/Content/Tariffs/EditModal.tsx b/src/pages/dashboard/Content/Tariffs/EditModal.tsx index c167f26..8efa614 100644 --- a/src/pages/dashboard/Content/Tariffs/EditModal.tsx +++ b/src/pages/dashboard/Content/Tariffs/EditModal.tsx @@ -9,6 +9,7 @@ import { devlog, getMessageFromFetchError } from "@frontend/kitui"; import { closeEditTariffDialog, useTariffStore } from "@root/stores/tariffs"; import { putTariff } from "@root/api/tariffs"; import { requestTariffs } from "@root/services/tariffs.service"; +import { currencyFormatter } from "@root/utils/currencyFormatter"; export default function EditModal() { const [nameField, setNameField] = useState(""); @@ -93,7 +94,7 @@ export default function EditModal() { sx={{ marginBottom: "10px" }} /> - Цена за единицу: {tariff.privileges[0].price} + Цена за единицу: {currencyFormatter.format(tariff.privileges[0].price / 100)} [] = [ @@ -31,9 +32,9 @@ const columns: GridColDef[] = [ { field: "serviceName", headerName: "Сервис", width: 150, valueGetter: ({ row }) => row.privileges[0].serviceKey }, { field: "privilegeName", headerName: "Привилегия", width: 150, valueGetter: ({ row }) => row.privileges[0].name }, { field: "type", headerName: "Единица", width: 100, valueGetter: ({ row }) => row.privileges[0].type }, - { field: "pricePerUnit", headerName: "Цена за ед.", width: 100, valueGetter: ({ row }) => row.privileges[0].price }, + { field: "pricePerUnit", headerName: "Цена за ед.", width: 100, valueGetter: ({ row }) => currencyFormatter.format(row.privileges[0].price / 100) }, { field: "isCustom", headerName: "Кастомная цена", width: 130, valueGetter: ({ row }) => row.isCustom ? "Да" : "Нет" }, - { field: "total", headerName: "Сумма", width: 60, valueGetter: ({ row }) => getTariffPrice(row) }, + { field: "total", headerName: "Сумма", width: 60, valueGetter: ({ row }) => currencyFormatter.format(getTariffPrice(row) / 100) }, { field: "delete", headerName: "Удаление", diff --git a/src/services/privilegies.service.ts b/src/services/privilegies.service.ts index 1d86a72..48d77e8 100644 --- a/src/services/privilegies.service.ts +++ b/src/services/privilegies.service.ts @@ -1,5 +1,4 @@ import { resetPrivilegeArray } from "@root/stores/privilegesStore"; -import { exampleCartValues } from "@stores/mocks/exampleCartValues"; import { requestServicePrivileges } from "@root/api/privilegies"; import type { PrivilegeWithAmount } from "@frontend/kitui"; @@ -11,18 +10,7 @@ const mutatePrivileges = (privileges: PrivilegeWithAmount[]) => { extracted = extracted.concat(privileges[serviceKey]); } - let readyArray = extracted.map((privilege) => ({ - serviceKey: privilege.serviceKey, - privilegeId: privilege.privilegeId, - name: privilege.name, - description: privilege.description, - type: privilege.type, - price: privilege.price, - value: privilege.value, - _id: privilege._id, - })); - - resetPrivilegeArray([...readyArray, ...exampleCartValues.privileges]); + resetPrivilegeArray(extracted); }; export const requestPrivileges = async () => { diff --git a/src/stores/mocks/exampleCartValues.ts b/src/stores/mocks/exampleCartValues.ts deleted file mode 100644 index 6aae34b..0000000 --- a/src/stores/mocks/exampleCartValues.ts +++ /dev/null @@ -1,1081 +0,0 @@ -// @ts-nocheck -import { User } from "../../model/user"; - - -/** @deprecated */ -export type TestCase = { - input: { - UserInformation: User; - Products: Array<{ - ID: string; - Amount: number; - Price?: number; - }>; - }; - expect: { - price: number; - envolvedDiscounts: string[]; - }; -}; - -/** @deprecated */ -type ExampleCartValues = { - privileges: Privilege[]; - discounts: AnyDiscount[]; - testCases: TestCase[]; -}; - -/** @deprecated */ -export const exampleCartValues: ExampleCartValues = { - privileges: [ - { - serviceKey: "templategen", - name: "unlim", - privilegeId: "p1", - description: "привилегия безлимитного доступа к шаблонизатору на время. в днях", - type: "day", - price: 0.5, - }, - { - serviceKey: "templategen", - name: "gencount", - privilegeId: "p2", - description: "привилегия на определённое количество генераций", - type: "count", - price: 0.1, - }, - { - serviceKey: "squiz", - name: "unlim", - privilegeId: "p3", - description: "привилегия безлимитного доступа к опроснику. в днях", - type: "day", - price: 3.0, - }, - { - serviceKey: "squiz", - name: "activequiz", - privilegeId: "p4", - description: "привилегия создания ограниченного количества опросов", - type: "count", - price: 1.0, - }, - { - serviceKey: "dwarfener", - name: "unlim", - privilegeId: "p5", - description: "привилегия безлимитного доступа к сокращателю на время. в днях", - type: "day", - price: 0.1, - }, - { - serviceKey: "dwarfener", - name: "abcount", - privilegeId: "p6", - description: "привилегия на количество активных ссылок в абтестах", - type: "count", - price: 0.7, - }, - { - serviceKey: "dwarfener", - name: "extended", - privilegeId: "p7", - description: "привилегия расширенной статистики, в днях", - type: "day", - price: 2, - }, - ], - discounts: [ - { - _id: "id1", - name: "Лояльность 1", - description: - "постоянная скидка для юзеров, внёсших на проект от 10 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", - conditionType: "purchasesAmount", - layer: 4, // "слой", т.е. этап применения скидки - condition: { - purchasesAmount: 10000, - }, - factor: 0.99, // множитель, применяемый к сумме - }, - { - _id: "id2", - name: "Лояльность 2", - description: - "постоянная скидка для юзеров, внёсших на проект от 25 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", - conditionType: "purchasesAmount", - layer: 4, - condition: { - purchasesAmount: 25000, - }, - factor: 0.98, - }, - { - _id: "id3", - name: "Лояльность 3", - description: - "постоянная скидка для юзеров, внёсших на проект от 50 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", - conditionType: "purchasesAmount", - layer: 4, - condition: { - purchasesAmount: 50000, - }, - factor: 0.975, - }, - { - _id: "id4", - name: "Корзина 1", - description: "Скидка на размер корзины от 5 000 р. Применяется на итоговую сумму, после суммирования корзины", - conditionType: "cartPurchasesAmount", - layer: 3, - condition: { - cartPurchasesAmount: 5000, - }, - factor: 0.985, - }, - { - _id: "id5", - name: "Корзина 2", - description: "Скидка на размер корзины от 50 000 р. Применяется на итоговую сумму, после суммирования корзины", - conditionType: "cartPurchasesAmount", - layer: 3, - condition: { - cartPurchasesAmount: 50000, - }, - factor: 0.965, - }, - { - _id: "id6", - name: "Анлим Шабло 1", - description: "Скидка на количество безлимитных дней работы от 30 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - // если в condition условие для поиска, то вот я добавил в него условие для поиска по привилегии - id: "p1", // айди привилегии - value: 30, // скидка работает, если значние больше либо равно этому значению - }, - }, - target: { - products: [ - { - privilegeId: "p1", // не знаю, стоит ли тут оставлять массив products, но на всякий случай оставлю. т.е. скидка, при срабатывании, применяется к этой привилегии в корзине, т.е. умножает её сумму на factor - factor: 0.975, - }, - ], - }, - }, - { - _id: "id7", - name: "Анлим Шабло 2", - description: "Скидка на количество безлимитных дней работы от 90 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p1", - value: 90, - }, - }, - target: { - products: [ - { - privilegeId: "p1", - factor: 0.975, - }, - ], - }, - }, - { - _id: "id8.rev", - name: "Анлим Шабло 3", - description: "Скидка на количество безлимитных дней работы от 180 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p1", - value: 180, - }, - }, - target: { - products: [ - { - privilegeId: "p1", - factor: 0.93, - }, - ], - }, - }, - { - _id: "id8", - name: "Генерации Шабло 1", - description: "Скидка на количество генераций от 100 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p2", - value: 100, - }, - }, - target: { - products: [ - { - privilegeId: "p2", - factor: 0.995, - }, - ], - }, - }, - { - _id: "id9", - name: "Генерации Шабло 2", - description: "Скидка на количество генераций от 350 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p2", - value: 350, - }, - }, - target: { - products: [ - { - privilegeId: "p2", - factor: 0.98, - }, - ], - }, - }, - { - _id: "id10", - name: "Генерации Шабло 3", - description: "Скидка на количество генераций от 500 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p2", - value: 500, - }, - }, - target: { - products: [ - { - privilegeId: "p2", - factor: 0.945, - }, - ], - }, - }, - { - _id: "id11", - name: "Анлим Квиз 1", - description: "Скидка на количество дней безлимитного использования опросника, от 30 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p3", - value: 30, - }, - }, - target: { - products: [ - { - privilegeId: "p3", - factor: 0.97, - }, - ], - }, - }, - { - _id: "id12", - name: "Анлим Квиз 2", - description: "Скидка на количество дней безлимитного использования опросника, от 90 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p3", - value: 90, - }, - }, - target: { - products: [ - { - privilegeId: "p3", - factor: 0.93, - }, - ], - }, - }, - { - _id: "id13", - name: "Анлим Квиз 3", - description: "Скидка на количество дней безлимитного использования опросника, от 180 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p3", - value: 180, - }, - }, - target: { - products: [ - { - privilegeId: "p3", - factor: 0.85, - }, - ], - }, - }, - { - _id: "id14", - name: "Актив квиз 1", - description: "Скидка на количество опросов от 100 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p4", - value: 100, - }, - }, - target: { - products: [ - { - privilegeId: "p4", - factor: 0.98, - }, - ], - }, - }, - { - _id: "id15", - name: "Актив квиз 2", - description: "Скидка на количество опросов от 200 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p4", - value: 200, - }, - }, - target: { - products: [ - { - privilegeId: "p4", - factor: 0.96, - }, - ], - }, - }, - { - _id: "id16", - name: "Актив квиз 3", - description: "Скидка на количество опросов от 350 шт", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p4", - value: 350, - }, - }, - target: { - products: [ - { - privilegeId: "p4", - factor: 0.9, - }, - ], - }, - }, - { - _id: "id17", - name: "Анлим Сокращатель 1", - description: "Скидка на безлимитное использование сокращателя от 30 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p5", - value: 30, - }, - }, - target: { - products: [ - { - privilegeId: "p5", - factor: 0.99, - }, - ], - }, - }, - { - _id: "id18", - name: "Анлим Сокращатель 2", - description: "Скидка на безлимитное использование сокращателя от 60 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p5", - value: 60, - }, - }, - target: { - products: [ - { - privilegeId: "p5", - factor: 0.98, - }, - ], - }, - }, - { - _id: "id19", - name: "Анлим Сокращатель 3", - description: "Скидка на безлимитное использование сокращателя от 90 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p5", - value: 90, - }, - }, - target: { - products: [ - { - privilegeId: "p5", - factor: 0.97, - }, - ], - }, - }, - { - _id: "id20", - name: "АБ Сокращатель 1", - description: "Скидка на количество АБ тестов, от 10 штук", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p6", - value: 10, - }, - }, - target: { - products: [ - { - privilegeId: "p6", - factor: 0.99, - }, - ], - }, - }, - { - _id: "id22", - name: "АБ Сокращатель 2", - description: "Скидка на количество АБ тестов, от 25 штук", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p6", - value: 25, - }, - }, - target: { - products: [ - { - privilegeId: "p6", - factor: 0.965, - }, - ], - }, - }, - { - _id: "id23", - name: "АБ Сокращатель 3", - description: "Скидка на количество АБ тестов, от 50 штук", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p6", - value: 50, - }, - }, - target: { - products: [ - { - privilegeId: "p6", - factor: 0.935, - }, - ], - }, - }, - { - _id: "id24.1", - name: "Стата Сокращатель 1", - description: "Скидка на дни сбора расширенной статистики от 30 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p7", - value: 30, - }, - }, - target: { - products: [ - { - privilegeId: "p7", - factor: 0.935, - }, - ], - }, - }, - { - _id: "id24.2", - name: "Стата Сокращатель 2", - description: "Скидка на дни сбора расширенной статистики от 90 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p7", - value: 90, - }, - }, - target: { - products: [ - { - privilegeId: "p7", - factor: 0.875, - }, - ], - }, - }, - { - _id: "id25", - name: "Стата Сокращатель 3", - description: "Скидка на дни сбора расширенной статистики от 180 дней", - conditionType: "privilege", - layer: 1, - condition: { - privilege: { - id: "p7", - value: 180, - }, - }, - target: { - products: [ - { - privilegeId: "p7", - factor: 0.83, - }, - ], - }, - }, - { - _id: "id26", - name: "Шаблонизатор 1", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису шаблонизации, от 1000 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "templategen", - value: 1000, - }, - }, - target: { - service: "templategen", - factor: 0.996, - }, - }, - { - _id: "id27", - name: "Шаблонизатор 2", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису шаблонизации, от 5000 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "templategen", - value: 5000, - }, - }, - target: { - service: "templategen", - factor: 0.983, - }, - }, - { - _id: "id28", - name: "Опросник 1", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису опросника, от 2000 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "squiz", - value: 2000, - }, - }, - target: { - service: "squiz", - factor: 0.983, - }, - }, - { - _id: "id29", - name: "Опросник 2", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису опросника, от 6000 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "squiz", - value: 6000, - }, - }, - target: { - service: "squiz", - factor: 0.969, - }, - }, - { - _id: "id30", - name: "Сокращатель 1", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису сокращателя, от 500 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "dwarfener", - value: 500, - }, - }, - target: { - service: "dwarfener", - factor: 0.99, - }, - }, - { - _id: "id31", - name: "Сокращатель 2", - description: "Скидка на сумму стоимостей товаров, принадлежащих сервису сокращателя, от 2500 р", - conditionType: "service", - layer: 2, - condition: { - service: { - id: "dwarfener", - value: 2500, - }, - }, - target: { - service: "dwarfener", - factor: 0.96, - }, - }, - { - _id: "id32", - name: "НКО", - description: - "Скидка всем подтвердившим статус НКО. Перекрывает ВСЕ остальные скидки. Если эта скидка срабатывает, остальные можно не вычислять. Т.е. если на уровне 0 находится какая-лидо скидка для выданных условий, просто суммируем корзину и применяем к сумме указанный множитель, после чего прекращаем процесс рассчёта", - conditionType: "userType", - layer: 0, - condition: { - userType: "nko", - }, - target: { - IsAllProducts: true, - factor: 0.2, - }, - overwhelm: true, - }, - { - _id: "id33", - name: "Промокод На АБ тесты", - description: "Скидка, полученная конкретным юзером, после введения промокода. Заменяет собой не промокодовую", - conditionType: "user", - layer: 1, - condition: { - coupon: "ABCD", // на мой вкус, стоит при активации промокода создавать скидку, привязанную к юзеру по айдишнику, и удалять после использования. т.е. кондишн не по coupon, а по - user: "buddy", - }, - target: { - products: [ - { - privilegeId: "p6", - factor: 0.5, - }, - ], - }, - overwhelm: true, - }, - ], - testCases: [ - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 0, - }, - Products: [ - { - ID: "p1", - Amount: 1, // нужно ввести количество, потому что у нас может смениться стоимость одной единицы привилегии, но при этом не поменяться логика скидки, потому что она привязана к количеству единиц привилегии. т.е. чтобы при изменении цены не появились скидки "от 27 дней безлимита" или "от 117 генераций" - Price: 1.0, // если указан прайс, то слои 1 и 2 не применяются, если они overwhelm == false. Т.е. промокоды и скидки на тип юзера всё ещё работают. необходимо для функционирования тарифов, созданных менеджером. для пущщей понятности, тариф создаётся в рамках одного сервиса и если взят готовый тариф, то кастомный на этот сервис сделать уже нельзя, следуя логике "если тебя не устраивает готовый тариф - делай кастомный, не нужно брать готовый и добирать туда недостающего в рамках одной оплаты". как вариант, можно всегда передавать прайс, просто добавить поле кастом. короче, предложенное решение может быть неоптимальным, приведено оно только для того, чтобы показать возможный сценарий. - }, - { - ID: "p2", - Amount: 1, - Price: 2.0, - }, - ], - }, - expect: { - price: 3.0, - envolvedDiscounts: [], - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 3.0, - }, - Products: [ - { - ID: "p1", - Amount: 40, - Price: 2000.0, - }, - { - ID: "p2", - Amount: 450, - Price: 3000.0, - }, - ], - }, - expect: { - price: 4925.0, - envolvedDiscounts: ["id4"], // сумма в корзине достигла 5к, поэтому применилась скидка - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 4928.0, - }, - Products: [ - { - ID: "p1", - Amount: 40, - Price: 2000.0, - }, - { - ID: "p2", - Amount: 450, - Price: 3000.0, - }, - { - ID: "p3", - Amount: 35, - }, - ], - }, - expect: { - price: 5025.32, - envolvedDiscounts: ["id4", "id11"], // добавил кастомный тариф такой, чтобы пофвилась скидка на продукт - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 9953.32, - }, - Products: [ - { - ID: "p1", - Amount: 40, - Price: 2000.0, - }, - { - ID: "p2", - Amount: 450, - Price: 3000.0, - }, - { - ID: "p3", - Amount: 35, - }, - { - ID: "p4", - Amount: 210, - }, - ], - }, - expect: { - price: 5223.9, - envolvedDiscounts: ["id4", "id11", "id15"], // т.е. применилась не id14, а id15, потому что применяется наибольшая подходящая. в то же время, на скидку за лояльность ещё не хватает - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 15177.22, // округляю до копеек - }, - Products: [ - { - ID: "p1", - Amount: 40, - Price: 2000.0, - }, - { - ID: "p2", - Amount: 450, - Price: 3000.0, - }, - { - ID: "p3", - Amount: 35, - }, - { - ID: "p4", - Amount: 210, - }, - ], - }, - expect: { - price: 5171.66, - envolvedDiscounts: ["id4", "id11", "id15", "id1"], - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 20348.88, - }, - Products: [ - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 200, - }, - ], - }, - expect: { - price: 422.28, - envolvedDiscounts: ["id19", "id23", "id25", "id1"], // история про то, как скидки за привилегии помешали получить скидку за сервис - }, - }, - { - input: { - UserInformation: { - ID: "dude", - Type: "", - PurchasesAmount: 0.0, - }, - Products: [ - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 200, - }, - ], - }, - expect: { - price: 426.55, - envolvedDiscounts: ["id19", "id23", "id25"], // то же что и выше, но без лояльности - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 20771.16, - }, - Products: [ - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 400, - }, - ], - }, - expect: { - price: 743.45, - envolvedDiscounts: ["id19", "id23", "id25", "id30", "id1"], // история про то, как получилось получить скидку за сервис - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 21522.12, - }, - Products: [ - { - ID: "p1", - Amount: 3000, - }, - { - ID: "p2", - Amount: 3000, - }, - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 400, - }, - ], - }, - expect: { - price: 2398.53, - envolvedDiscounts: ["id8.rev", "id10", "id19", "id23", "id25", "id26", "id30", "id1"], // две скидки за сервис - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 23920.65, - }, - Products: [ - { - ID: "p1", - Amount: 3000, - }, - { - ID: "p2", - Amount: 3000, - }, - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 400, - }, - ], - }, - expect: { - price: 2368.68, - envolvedDiscounts: ["id8.rev", "id10", "id19", "id33", "id25", "id26", "id30", "id1"], // юзер использовал промокод id33. он заменяет скидку на p6 собой. в один момент времени может быть активирован только 1 промокод, т.е. после активации следующего, предыдущий заменяется. но в промокоде может быть несколько скидок. промокоды имеют скидки только на привелеги - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "nko", - PurchasesAmount: 26289.33, - }, - Products: [ - { - ID: "p1", - Amount: 3000, - }, - { - ID: "p2", - Amount: 3000, - }, - { - ID: "p5", - Amount: 300, - }, - { - ID: "p6", - Amount: 100, - }, - { - ID: "p7", - Amount: 400, - }, - ], - }, - expect: { - price: 540, // сложил всю корзину и умножил на показатель скидки - envolvedDiscounts: ["id32"], // юзер подтвердил свой статус НКО, поэтому, не смотря на то что он достиг по лояльности уровня скидки id2, она не применилась, а применилась id32 - }, - }, - { - input: { - UserInformation: { - ID: "buddy", - Type: "", - PurchasesAmount: 0, - }, - Products: [ - { - ID: "p7", - Amount: 4000, - Price: 12000, - }, - ], - }, - expect: { - price: 12000 * 0.985 * 0.96, - envolvedDiscounts: ["id4", "id31"], - }, - }, - ], -}; diff --git a/yarn.lock b/yarn.lock index f51a4ab..fc9cd09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1433,10 +1433,10 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" -"@frontend/kitui@^1.0.52": - version "1.0.52" - resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.52.tgz#3b1c28f889da80ab325ab2b511108632fa925f1c" - integrity sha1-Oxwo+InagKsyWrK1ERCGMvqSXxw= +"@frontend/kitui@^1.0.54": + version "1.0.54" + resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.54.tgz#0235d5a8effb9b92351471c3c7775f28cb2839f6" + integrity sha1-AjXVqO/7m5I1FHHDx3dfKMsoOfY= dependencies: immer "^10.0.2" reconnecting-eventsource "^1.6.2"