From 3ea1b834555c734d74d5beb11aa5c4ff5af7e2b8 Mon Sep 17 00:00:00 2001 From: nflnkr <105123049+nflnkr@users.noreply.github.com> Date: Wed, 22 Feb 2023 18:08:22 +0300 Subject: [PATCH] add typed example cart values from snippet --- src/stores/mocks/exampleCartValues.ts | 1086 +++++++++++++++++++++++++ 1 file changed, 1086 insertions(+) create mode 100644 src/stores/mocks/exampleCartValues.ts diff --git a/src/stores/mocks/exampleCartValues.ts b/src/stores/mocks/exampleCartValues.ts new file mode 100644 index 0000000..c0c1e86 --- /dev/null +++ b/src/stores/mocks/exampleCartValues.ts @@ -0,0 +1,1086 @@ +import { Cart } from "../../model/cart"; + + +type ExampleCartValues = { + privileges: Cart.Privilege[]; + discounts: Cart.Discount[]; + testCases: any; +}; + +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": [ + { + "productId": "p1", // не знаю, стоит ли тут оставлять массив products, но на всякий случай оставлю. т.е. скидка, при срабатывании, применяется к этой привилегии в корзине, т.е. умножает её сумму на factor + "factor": 0.975 + } + ] + } + }, + { + "_id": "id7", + "name": "Анлим Шабло 2", + "description": "Скидка на количество безлимитных дней работы от 90 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p1", + "value": 90 + } + }, + "target": { + "products": [ + { + "productId": "p1", + "factor": 0.975 + } + ] + } + }, + { + "_id": "id8.rev", + "name": "Анлим Шабло 3", + "description": "Скидка на количество безлимитных дней работы от 180 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p1", + "value": 180 + } + }, + "target": { + "products": [ + { + "productId": "p1", + "factor": 0.93 + } + ] + } + }, + { + "_id": "id8", + "name": "Генерации Шабло 1", + "description": "Скидка на количество генераций от 100 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p2", + "value": 100 + } + }, + "target": { + "products": [ + { + "productId": "p2", + "factor": 0.995 + } + ] + } + }, + { + "_id": "id9", + "name": "Генерации Шабло 2", + "description": "Скидка на количество генераций от 350 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p2", + "value": 350 + } + }, + "target": { + "products": [ + { + "productId": "p2", + "factor": 0.98 + } + ] + } + }, + { + "_id": "id10", + "name": "Генерации Шабло 3", + "description": "Скидка на количество генераций от 500 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p2", + "value": 500 + } + }, + "target": { + "products": [ + { + "productId": "p2", + "factor": 0.945 + } + ] + } + }, + { + "_id": "id11", + "name": "Анлим Квиз 1", + "description": "Скидка на количество дней безлимитного использования опросника, от 30 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p3", + "value": 30 + } + }, + "target": { + "products": [ + { + "productId": "p3", + "factor": 0.97 + } + ] + } + }, + { + "_id": "id12", + "name": "Анлим Квиз 2", + "description": "Скидка на количество дней безлимитного использования опросника, от 90 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p3", + "value": 90 + } + }, + "target": { + "products": [ + { + "productId": "p3", + "factor": 0.93 + } + ] + } + }, + { + "_id": "id13", + "name": "Анлим Квиз 3", + "description": "Скидка на количество дней безлимитного использования опросника, от 180 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p3", + "value": 180 + } + }, + "target": { + "products": [ + { + "productId": "p3", + "factor": 0.85 + } + ] + } + }, + { + "_id": "id14", + "name": "Актив квиз 1", + "description": "Скидка на количество опросов от 100 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p4", + "value": 100 + } + }, + "target": { + "products": [ + { + "productId": "p4", + "factor": 0.98 + } + ] + } + }, + { + "_id": "id15", + "name": "Актив квиз 2", + "description": "Скидка на количество опросов от 200 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p4", + "value": 200 + } + }, + "target": { + "products": [ + { + "productId": "p4", + "factor": 0.96 + } + ] + } + }, + { + "_id": "id16", + "name": "Актив квиз 3", + "description": "Скидка на количество опросов от 350 шт", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p4", + "value": 350 + } + }, + "target": { + "products": [ + { + "productId": "p4", + "factor": 0.9 + } + ] + } + }, + { + "_id": "id17", + "name": "Анлим Сокращатель 1", + "description": "Скидка на безлимитное использование сокращателя от 30 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p5", + "value": 30 + } + }, + "target": { + "products": [ + { + "productId": "p5", + "factor": 0.99 + } + ] + } + }, + { + "_id": "id18", + "name": "Анлим Сокращатель 2", + "description": "Скидка на безлимитное использование сокращателя от 60 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p5", + "value": 60 + } + }, + "target": { + "products": [ + { + "productId": "p5", + "factor": 0.98 + } + ] + } + }, + { + "_id": "id19", + "name": "Анлим Сокращатель 3", + "description": "Скидка на безлимитное использование сокращателя от 90 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p5", + "value": 90 + } + }, + "target": { + "products": [ + { + "productId": "p5", + "factor": 0.97 + } + ] + } + }, + { + "_id": "id20", + "name": "АБ Сокращатель 1", + "description": "Скидка на количество АБ тестов, от 10 штук", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p6", + "value": 10 + } + }, + "target": { + "products": [ + { + "productId": "p6", + "factor": 0.99 + } + ] + } + }, + { + "_id": "id22", + "name": "АБ Сокращатель 2", + "description": "Скидка на количество АБ тестов, от 25 штук", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p6", + "value": 25 + } + }, + "target": { + "products": [ + { + "productId": "p6", + "factor": 0.965 + } + ] + } + }, + { + "_id": "id23", + "name": "АБ Сокращатель 3", + "description": "Скидка на количество АБ тестов, от 50 штук", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p6", + "value": 50 + } + }, + "target": { + "products": [ + { + "productId": "p6", + "factor": 0.935 + } + ] + } + }, + { + "_id": "id24", + "name": "Стата Сокращатель 1", + "description": "Скидка на дни сбора расширенной статистики от 30 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p7", + "value": 30 + } + }, + "target": { + "products": [ + { + "productId": "p7", + "factor": 0.935 + } + ] + } + }, + { + "_id": "id24", + "name": "Стата Сокращатель 2", + "description": "Скидка на дни сбора расширенной статистики от 90 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p7", + "value": 90 + } + }, + "target": { + "products": [ + { + "productId": "p7", + "factor": 0.875 + } + ] + } + }, + { + "_id": "id25", + "name": "Стата Сокращатель 3", + "description": "Скидка на дни сбора расширенной статистики от 180 дней", + "conditionType": "privilege", + "layer": 1, + "condition": { + "privilege": { + "id": "p7", + "value": 180 + } + }, + "target": { + "products": [ + { + "productId": "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": "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