From e057333c0d59462b879d36dd9dbe4cdeda8e4803 Mon Sep 17 00:00:00 2001 From: nflnkr Date: Mon, 6 Mar 2023 16:26:55 +0300 Subject: [PATCH] add tariffs page functionality --- .../Content/Tariffs/CreateTariff.tsx | 165 +++ src/pages/dashboard/Content/Tariffs/index.tsx | 998 +----------------- .../Content/Tariffs/privilegesDG.tsx | 34 +- .../dashboard/Content/Tariffs/tariffsDG.tsx | 57 +- 4 files changed, 237 insertions(+), 1017 deletions(-) create mode 100644 src/pages/dashboard/Content/Tariffs/CreateTariff.tsx diff --git a/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx b/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx new file mode 100644 index 0000000..6293f25 --- /dev/null +++ b/src/pages/dashboard/Content/Tariffs/CreateTariff.tsx @@ -0,0 +1,165 @@ +import { Typography, Container, Button, Select, MenuItem, FormControl, InputLabel, TextField, useTheme, Box } from "@mui/material"; +import { Tariff } from "@root/model/tariff"; +import { usePrivilegeStore } from "@root/stores/privileges"; +import { useTariffStore } from "@root/stores/tariffs"; +import { nanoid } from "nanoid"; +import { ChangeEvent, HTMLInputTypeAttribute, useState } from "react"; + + +export default function CreateTariff() { + const theme = useTheme(); + const privileges = usePrivilegeStore(store => store.privileges); + const addTariffs = useTariffStore(store => store.addTariffs); + const [nameField, setNameField] = useState(""); + const [amountField, setAmountField] = useState(""); + const [customPriceField, setCustomPriceField] = useState(""); + const [privilegeIdField, setPrivilegeIdField] = useState(""); + + const privilege = privileges.find(p => p.privilegeId === privilegeIdField); + + function handleCreateTariffClick() { + const amount = Number(amountField); + const customPricePerUnit = Number(customPriceField); + + if (isNaN(amount) || !privilege) return; + + const newTariff: Tariff = { + id: nanoid(5), + name: nameField, + amount, + privilege, + customPricePerUnit: customPricePerUnit ? customPricePerUnit : undefined, + }; + + addTariffs([newTariff]); + } + + return ( + + Создание кастомного тарифа + + Привелегия + + + {privilege && + + Имя: {privilege.name} + Сервис: {privilege.serviceKey} + Единица: {privilege.type} + Стандартная цена за единицу: {privilege.pricePerUnit} + + } + setNameField(e.target.value)} + /> + setAmountField(e.target.value)} + type="number" + /> + setCustomPriceField(e.target.value)} + type="number" + /> + + + ); +} + +function CustomTextField({ id, label, value, type, setValue }: { + id: string; + label: string; + value: number | string | null; + type?: HTMLInputTypeAttribute; + setValue: (e: ChangeEvent) => void; +}) { + const theme = useTheme(); + + return ( + + ); +} \ No newline at end of file diff --git a/src/pages/dashboard/Content/Tariffs/index.tsx b/src/pages/dashboard/Content/Tariffs/index.tsx index b855754..dd868db 100644 --- a/src/pages/dashboard/Content/Tariffs/index.tsx +++ b/src/pages/dashboard/Content/Tariffs/index.tsx @@ -1,13 +1,14 @@ -import * as React from "react"; -import theme from "@theme"; -import Basket from "@kitUI/basket/index" -import {Container} from "@mui/material"; +import Cart from "@root/kitUI/Cart/Cart"; +import { Container, Typography } from "@mui/material"; import PrivilegesDG from "./privilegesDG"; import TariffsDG from "./tariffsDG"; +import CreateTariff from "./CreateTariff"; +import { GridSelectionModel } from "@mui/x-data-grid"; +import { useState } from "react"; -export default () => { - const [openModal, setOpenModal] = React.useState(false);const handleOpenModal = () => {setOpenModal(true);};const handleCloseModal = () => {setOpenModal(false);}; +export default function Tariffs() { + const [selectedTariffs, setSelectedTariffs] = useState([]); return ( { display: "flex", flexDirection: "column", justifyContent: "center", - alignItems: "center" + alignItems: "center", }}> - - - + Список привелегий + + + Список тарифов + setSelectedTariffs(selectionModel)} /> + ); -} - -// { -// -// discounts: [ -// { -// "_id": "id1", -// "name":"Лояльность 1", -// "description": "постоянная скидка для юзеров, внёсших на проект от 10 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", -// "сonditionType": "purchasesAmount", -// "layer": 4,// "слой", т.е. этап применения скидки -// "condition": { -// "purchasesAmount": 10000 -// }, -// "factor": 0.99 // множитель, применяемый к сумме -// }, -// { -// "_id": "id2", -// "name":"Лояльность 2", -// "description": "постоянная скидка для юзеров, внёсших на проект от 25 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", -// "сonditionType": "purchasesAmount", -// "layer": 4, -// "condition": { -// "purchasesAmount": 25000 -// }, -// "factor": 0.98 -// }, -// { -// "_id": "id3", -// "name":"Лояльность 3", -// "description": "постоянная скидка для юзеров, внёсших на проект от 50 000 рублей. Применяется на итоговую сумму, после скидок за сумму в корзине", -// "сonditionType": "purchasesAmount", -// "layer": 4, -// "condition": { -// "purchasesAmount": 50000 -// }, -// "factor": 0.975 -// }, -// { -// "_id": "id4", -// "name":"Корзина 1", -// "description": "Скидка на размер корзины от 5 000 р. Применяется на итоговую сумму, после суммирования корзины", -// "сonditionType": "cartPurchasesAmount", -// "layer": 3, -// "condition": { -// "cartPurchasesAmount": 5000 -// }, -// "factor": 0.985 -// }, -// { -// "_id": "id5", -// "name":"Корзина 2", -// "description": "Скидка на размер корзины от 50 000 р. Применяется на итоговую сумму, после суммирования корзины", -// "сonditionType": "cartPurchasesAmount", -// "layer": 3, -// "condition": { -// "cartPurchasesAmount": 50000 -// }, -// "factor": 0.965 -// }, -// { -// "_id": "id6", -// "name":"Анлим Шабло 1", -// "description": "Скидка на количество безлимитных дней работы от 30 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { // если в condition условие для поиска, то вот я добавил в него условие для поиска по привилегии -// "id": "p1", // айди привилегии -// "value": 30 // скидка работает, если значние больше либо равно этому значению -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p1", // не знаю, стоит ли тут оставлять массив products, но на всякий случай оставлю. т.е. скидка, при срабатывании, применяется к этой привилегии в корзине, т.е. умножает её сумму на factor -// "factor": 0.975 -// } -// ] -// } -// }, -// { -// "_id": "id7", -// "name":"Анлим Шабло 2", -// "description": "Скидка на количество безлимитных дней работы от 90 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p1", -// "value":90 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p1", -// "factor": 0.975 -// } -// ] -// } -// }, -// { -// "_id": "id8.rev", -// "name":"Анлим Шабло 3", -// "description": "Скидка на количество безлимитных дней работы от 180 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p1", -// "value":180 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p1", -// "factor": 0.93 -// } -// ] -// } -// }, -// { -// "_id": "id8", -// "name":"Генерации Шабло 1", -// "description": "Скидка на количество генераций от 100 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p2", -// "value": 100 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p2", -// "factor": 0.995 -// } -// ] -// } -// }, -// { -// "_id": "id9", -// "name":"Генерации Шабло 2", -// "description": "Скидка на количество генераций от 350 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p2", -// "value": 350 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p2", -// "factor": 0.98 -// } -// ] -// } -// }, -// { -// "_id": "id10", -// "name":"Генерации Шабло 3", -// "description": "Скидка на количество генераций от 500 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p2", -// "value": 500 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p2", -// "factor": 0.945 -// } -// ] -// } -// }, -// { -// "_id": "id11", -// "name":"Анлим Квиз 1", -// "description": "Скидка на количество дней безлимитного использования опросника, от 30 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p3", -// "value": 30 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p3", -// "factor": 0.97 -// } -// ] -// } -// }, -// { -// "_id": "id12", -// "name":"Анлим Квиз 2", -// "description": "Скидка на количество дней безлимитного использования опросника, от 90 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p3", -// "value": 90 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p3", -// "factor": 0.93 -// } -// ] -// } -// }, -// { -// "_id": "id13", -// "name":"Анлим Квиз 3", -// "description": "Скидка на количество дней безлимитного использования опросника, от 180 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p3", -// "value": 180 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p3", -// "factor": 0.85 -// } -// ] -// } -// }, -// { -// "_id": "id14", -// "name":"Актив квиз 1", -// "description": "Скидка на количество опросов от 100 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p4", -// "value": 100 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p4", -// "factor": 0.98 -// } -// ] -// } -// }, -// { -// "_id": "id15", -// "name":"Актив квиз 2", -// "description": "Скидка на количество опросов от 200 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p4", -// "value": 200 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p4", -// "factor": 0.96 -// } -// ] -// } -// }, -// { -// "_id": "id16", -// "name":"Актив квиз 3", -// "description": "Скидка на количество опросов от 350 шт", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p4", -// "value": 350 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p4", -// "factor": 0.9 -// } -// ] -// } -// }, -// { -// "_id": "id17", -// "name":"Анлим Сокращатель 1", -// "description": "Скидка на безлимитное использование сокращателя от 30 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p5", -// "value": 30 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p5", -// "factor": 0.99 -// } -// ] -// } -// }, -// { -// "_id": "id18", -// "name":"Анлим Сокращатель 2", -// "description": "Скидка на безлимитное использование сокращателя от 60 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p5", -// "value": 60 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p5", -// "factor": 0.98 -// } -// ] -// } -// }, -// { -// "_id": "id19", -// "name":"Анлим Сокращатель 3", -// "description": "Скидка на безлимитное использование сокращателя от 90 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p5", -// "value": 90 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p5", -// "factor": 0.97 -// } -// ] -// } -// }, -// { -// "_id": "id20", -// "name":"АБ Сокращатель 1", -// "description": "Скидка на количество АБ тестов, от 10 штук", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p6", -// "value": 10 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p6", -// "factor": 0.99 -// } -// ] -// } -// }, -// { -// "_id": "id22", -// "name":"АБ Сокращатель 2", -// "description": "Скидка на количество АБ тестов, от 25 штук", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p6", -// "value": 25 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p6", -// "factor": 0.965 -// } -// ] -// } -// }, -// { -// "_id": "id23", -// "name":"АБ Сокращатель 3", -// "description": "Скидка на количество АБ тестов, от 50 штук", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p6", -// "value": 50 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p6", -// "factor": 0.935 -// } -// ] -// } -// }, -// { -// "_id": "id24", -// "name":"Стата Сокращатель 1", -// "description": "Скидка на дни сбора расширенной статистики от 30 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p7", -// "value": 30 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p7", -// "factor": 0.935 -// } -// ] -// } -// }, -// { -// "_id": "id24", -// "name":"Стата Сокращатель 2", -// "description": "Скидка на дни сбора расширенной статистики от 90 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p7", -// "value": 90 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p7", -// "factor": 0.875 -// } -// ] -// } -// }, -// { -// "_id": "id25", -// "name":"Стата Сокращатель 3", -// "description": "Скидка на дни сбора расширенной статистики от 180 дней", -// "сonditionType": "privilege", -// "layer": 1, -// "condition": { -// "privilege": { -// "id": "p7", -// "value": 180 -// } -// }, -// "target": { -// "products": [ -// { -// "productId": "p7", -// "factor": 0.83 -// } -// ] -// } -// }, -// { -// "_id": "id26", -// "name":"Шаблонизатор 1", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису шаблонизации, от 1000 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "templategen", -// "value": 1000 -// } -// }, -// "target": { -// "service":"templategen", -// "factor": 0.996 -// } -// }, -// { -// "_id": "id27", -// "name":"Шаблонизатор 2", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису шаблонизации, от 5000 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "templategen", -// "value": 5000 -// } -// }, -// "target": { -// "service":"templategen", -// "factor": 0.983 -// } -// }, -// { -// "_id": "id28", -// "name":"Опросник 1", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису опросника, от 2000 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "squiz", -// "value": 2000 -// } -// }, -// "target": { -// "service":"squiz", -// "factor": 0.983 -// } -// }, -// { -// "_id": "id29", -// "name":"Опросник 2", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису опросника, от 6000 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "squiz", -// "value": 6000 -// } -// }, -// "target": { -// "service":"squiz", -// "factor": 0.969 -// } -// }, -// { -// "_id": "id30", -// "name":"Сокращатель 1", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису сокращателя, от 500 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "dwarfener", -// "value": 500 -// } -// }, -// "target": { -// "service":"dwarfener", -// "factor": 0.99 -// } -// }, -// { -// "_id": "id31", -// "name":"Сокращатель 2", -// "description": "Скидка на сумму стоимостей товаров, принадлежащих сервису сокращателя, от 2500 р", -// "сonditionType": "service", -// "layer": 2, -// "condition": { -// "service": { -// "id": "dwarfener", -// "value": 2500 -// } -// }, -// "target": { -// "service":"dwarfener", -// "factor": 0.96 -// } -// }, -// { -// "_id": "id32", -// "name":"НКО", -// "description": "Скидка всем подтвердившим статус НКО. Перекрывает ВСЕ остальные скидки. Если эта скидка срабатывает, остальные можно не вычислять. Т.е. если на уровне 0 находится какая-лидо скидка для выданных условий, просто суммируем корзину и применяем к сумме указанный множитель, после чего прекращаем процесс рассчёта", -// "сonditionType": "userType", -// "layer": 0, -// "condition": { -// "userType": "nko" -// }, -// "target": { -// "IsAllProducts": true, -// "factor": 0.2 -// }, -// "overwhelm": true -// }, -// { -// "_id": "id33", -// "name":"Промокод На АБ тесты", -// "description": "Скидка, полученная конкретным юзером, после введения промокода. Заменяет собой не промокодовую", -// "сonditionType": "user", -// "layer": 1, -// "condition": { -// "coupon": "AB\CD" // на мой вкус, стоит при активации промокода создавать скидку, привязанную к юзеру по айдишнику, и удалять после использования. т.е. кондишн не по coupon, а по -// "user": "buddy" -// }, -// "target": { -// "products": [ -// { -// "productId": "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": 750.96, -// "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": ["id30"] // юзер подтвердил свой статус НКО, поэтому, не смотря на то что он достиг по лояльности уровня скидки id2, она не применилась, а применилась id32 -// } -// } -// ] -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/pages/dashboard/Content/Tariffs/privilegesDG.tsx b/src/pages/dashboard/Content/Tariffs/privilegesDG.tsx index 66065e3..fd8db7e 100644 --- a/src/pages/dashboard/Content/Tariffs/privilegesDG.tsx +++ b/src/pages/dashboard/Content/Tariffs/privilegesDG.tsx @@ -1,29 +1,33 @@ import * as React from "react"; import { GridColDef } from "@mui/x-data-grid"; import DataGrid from "@kitUI/datagrid"; -import privilegesStore from "@stores/privileges"; +import { usePrivilegeStore } from "@stores/privileges"; + const columns: GridColDef[] = [ + { field: 'id', headerName: 'id', width: 40 }, { field: 'name', headerName: 'Привелегия', width: 150 }, { field: 'description', headerName: 'Описание', width: 550 },//инфо из гитлаба. { field: 'type', headerName: 'Тип', width: 150 }, { field: 'price', headerName: 'Стоимость', width: 50 } -] -export default () => { - const {privileges} = privilegesStore() - let rows = [] - if (Object.keys(privileges).length !== 0) { - for (let [id, value] of Object.entries(privileges)) { - rows.push({id:id,name:value.name,description:value.description,type:value.type,price:value.price}) - } - } +]; +export default function PrivilegesDG() { + const privileges = usePrivilegeStore(state => state.privileges); - return ( + const privilegesGridData = privileges.map(privilege => ({ + id: privilege.privilegeId, + name: privilege.name, + description: privilege.description, + type: privilege.type, + price: privilege.pricePerUnit, + })); + + return ( - ); + ); } diff --git a/src/pages/dashboard/Content/Tariffs/tariffsDG.tsx b/src/pages/dashboard/Content/Tariffs/tariffsDG.tsx index 326bc95..d3ba3cd 100644 --- a/src/pages/dashboard/Content/Tariffs/tariffsDG.tsx +++ b/src/pages/dashboard/Content/Tariffs/tariffsDG.tsx @@ -1,27 +1,46 @@ import * as React from "react"; import { GridColDef, GridSelectionModel, GridToolbar } from "@mui/x-data-grid"; import DataGrid from "@kitUI/datagrid"; +import { useTariffStore } from "@root/stores/tariffs"; +import { SERVICE_LIST } from "@root/model/tariff"; const columns: GridColDef[] = [ - { field: 'id', headerName: 'ID', width: 150 }, - { field: 'id', headerName: 'Название тарифа', width: 150 }, - { field: 'id', headerName: 'Сервис', width: 150 },//инфо из гитлаба. - { field: 'id', headerName: 'Гигабайты', width: 150 }, - { field: 'id', headerName: 'Привелегия', width: 150 }, - { field: 'id', headerName: 'Количество привелегии', width: 150 }, - { field: 'id', headerName: 'Условия', width: 150 }, -] + { field: 'id', headerName: 'ID', width: 100 }, + { field: 'name', headerName: 'Название тарифа', width: 150 }, + { field: 'serviceName', headerName: 'Сервис', width: 150 },//инфо из гитлаба. + { field: 'privilege', headerName: 'Привелегия', width: 150 }, + { field: 'amount', headerName: 'Количество', width: 110 }, + { field: 'type', headerName: 'Единица', width: 100 }, + { field: 'pricePerUnit', headerName: 'Цена за ед.', width: 100 }, + { field: 'isCustomPrice', headerName: 'Кастомная цена', width: 130 }, +]; -export default () => { - - return ( - onRowsSelectionHandler( ids ) } - /> - ); +interface Props { + handleSelectionChange: (selectionModel: GridSelectionModel) => void; +} + +export default function TariffsDG({ handleSelectionChange }: Props) { + const tariffs = useTariffStore(state => state.tariffs); + + const gridData = tariffs.map(tariff => ({ + id: tariff.id, + name: tariff.name, + serviceName: SERVICE_LIST.find(service => service.serviceKey === tariff.privilege.serviceKey)?.displayName, + privilege: `(${tariff.privilege.privilegeId}) ${tariff.privilege.description}`, + amount: tariff.amount, + type: tariff.privilege.type === "count" ? "день" : "шт.", + pricePerUnit: tariff.customPricePerUnit ?? tariff.privilege.pricePerUnit, + isCustomPrice: tariff.customPricePerUnit === undefined ? "Нет" : "Да", + })); + + return ( + + ); }