adminFront/src/stores/mocks/exampleCartValues.ts

1125 lines
39 KiB
TypeScript
Raw Normal View History

2023-03-06 13:21:48 +00:00
import { AnyDiscount } from "@root/model/cart";
import { Privilege } from "@root/model/tariff";
2023-02-25 13:53:03 +00:00
import { User } from "../../model/user";
2023-02-27 13:32:36 +00:00
export type TestCase = {
2023-02-25 13:53:03 +00:00
input: {
UserInformation: User;
Products: Array<{
ID: string;
Amount: number;
Price?: number;
}>;
};
expect: {
price: number;
envolvedDiscounts: string[];
};
};
type ExampleCartValues = {
2023-03-06 13:21:48 +00:00
privileges: Privilege[];
discounts: AnyDiscount[];
2023-02-25 13:53:03 +00:00
testCases: TestCase[];
};
export const exampleCartValues: ExampleCartValues = {
"privileges": [
{
"serviceKey": "templategen",
"name": "unlim",
"privilegeId": "p1",
"description": "привилегия безлимитного доступа к шаблонизатору на время. в днях",
"type": "day",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 0.5
},
{
"serviceKey": "templategen",
"name": "gencount",
"privilegeId": "p2",
"description": "привилегия на определённое количество генераций",
"type": "count",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 0.1
},
{
"serviceKey": "squiz",
"name": "unlim",
"privilegeId": "p3",
"description": "привилегия безлимитного доступа к опроснику. в днях",
"type": "day",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 3.0
},
{
"serviceKey": "squiz",
"name": "activequiz",
"privilegeId": "p4",
"description": "привилегия создания ограниченного количества опросов",
"type": "count",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 1.0
},
{
"serviceKey": "dwarfener",
"name": "unlim",
"privilegeId": "p5",
"description": "привилегия безлимитного доступа к сокращателю на время. в днях",
"type": "day",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 0.1
},
{
"serviceKey": "dwarfener",
"name": "abcount",
"privilegeId": "p6",
"description": "привилегия на количество активных ссылок в абтестах",
"type": "count",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 0.7
},
{
"serviceKey": "dwarfener",
"name": "extended",
"privilegeId": "p7",
"description": "привилегия расширенной статистики, в днях",
"type": "day",
2023-02-27 13:32:36 +00:00
"pricePerUnit": 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": [
{
2023-02-28 13:13:55 +00:00
"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": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p1",
"factor": 0.975
}
]
}
},
{
"_id": "id8.rev",
"name": "Анлим Шабло 3",
"description": "Скидка на количество безлимитных дней работы от 180 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p1",
"value": 180
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p1",
"factor": 0.93
}
]
}
},
{
"_id": "id8",
"name": "Генерации Шабло 1",
"description": "Скидка на количество генераций от 100 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p2",
"value": 100
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p2",
"factor": 0.995
}
]
}
},
{
"_id": "id9",
"name": "Генерации Шабло 2",
"description": "Скидка на количество генераций от 350 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p2",
"value": 350
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p2",
"factor": 0.98
}
]
}
},
{
"_id": "id10",
"name": "Генерации Шабло 3",
"description": "Скидка на количество генераций от 500 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p2",
"value": 500
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p2",
"factor": 0.945
}
]
}
},
{
"_id": "id11",
"name": "Анлим Квиз 1",
"description": "Скидка на количество дней безлимитного использования опросника, от 30 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p3",
"value": 30
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p3",
"factor": 0.97
}
]
}
},
{
"_id": "id12",
"name": "Анлим Квиз 2",
"description": "Скидка на количество дней безлимитного использования опросника, от 90 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p3",
"value": 90
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p3",
"factor": 0.93
}
]
}
},
{
"_id": "id13",
"name": "Анлим Квиз 3",
"description": "Скидка на количество дней безлимитного использования опросника, от 180 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p3",
"value": 180
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p3",
"factor": 0.85
}
]
}
},
{
"_id": "id14",
"name": "Актив квиз 1",
"description": "Скидка на количество опросов от 100 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p4",
"value": 100
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p4",
"factor": 0.98
}
]
}
},
{
"_id": "id15",
"name": "Актив квиз 2",
"description": "Скидка на количество опросов от 200 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p4",
"value": 200
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p4",
"factor": 0.96
}
]
}
},
{
"_id": "id16",
"name": "Актив квиз 3",
"description": "Скидка на количество опросов от 350 шт",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p4",
"value": 350
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p4",
"factor": 0.9
}
]
}
},
{
"_id": "id17",
"name": "Анлим Сокращатель 1",
"description": "Скидка на безлимитное использование сокращателя от 30 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p5",
"value": 30
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p5",
"factor": 0.99
}
]
}
},
{
"_id": "id18",
"name": "Анлим Сокращатель 2",
"description": "Скидка на безлимитное использование сокращателя от 60 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p5",
"value": 60
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p5",
"factor": 0.98
}
]
}
},
{
"_id": "id19",
"name": "Анлим Сокращатель 3",
"description": "Скидка на безлимитное использование сокращателя от 90 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p5",
"value": 90
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p5",
"factor": 0.97
}
]
}
},
{
"_id": "id20",
"name": "АБ Сокращатель 1",
"description": "Скидка на количество АБ тестов, от 10 штук",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p6",
"value": 10
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p6",
"factor": 0.99
}
]
}
},
{
"_id": "id22",
"name": "АБ Сокращатель 2",
"description": "Скидка на количество АБ тестов, от 25 штук",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p6",
"value": 25
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p6",
"factor": 0.965
}
]
}
},
{
"_id": "id23",
"name": "АБ Сокращатель 3",
"description": "Скидка на количество АБ тестов, от 50 штук",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p6",
"value": 50
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p6",
"factor": 0.935
}
]
}
},
{
2023-03-06 13:21:48 +00:00
"_id": "id24.1",
"name": "Стата Сокращатель 1",
"description": "Скидка на дни сбора расширенной статистики от 30 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p7",
"value": 30
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p7",
"factor": 0.935
}
]
}
},
{
2023-03-06 13:21:48 +00:00
"_id": "id24.2",
"name": "Стата Сокращатель 2",
"description": "Скидка на дни сбора расширенной статистики от 90 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p7",
"value": 90
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"privilegeId": "p7",
"factor": 0.875
}
]
}
},
{
"_id": "id25",
"name": "Стата Сокращатель 3",
"description": "Скидка на дни сбора расширенной статистики от 180 дней",
"conditionType": "privilege",
"layer": 1,
"condition": {
"privilege": {
"id": "p7",
"value": 180
}
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"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": {
2023-03-06 13:21:48 +00:00
"coupon": "ABCD", // на мой вкус, стоит при активации промокода создавать скидку, привязанную к юзеру по айдишнику, и удалять после использования. т.е. кондишн не по coupon, а по
"user": "buddy"
},
"target": {
"products": [
{
2023-02-28 13:13:55 +00:00
"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
},
]
},
2023-03-01 14:46:02 +00:00
"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,
}
]
},
2023-03-01 14:46:02 +00:00
"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,
}
]
},
2023-03-01 14:46:02 +00:00
"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,
}
]
},
2023-03-01 14:46:02 +00:00
"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": {
2023-03-01 14:46:02 +00:00
"price": 743.45,
"envolvedDiscounts": [
2023-03-01 14:46:02 +00:00
"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": [
2023-02-28 13:13:55 +00:00
"id32"
] // юзер подтвердил свой статус НКО, поэтому, не смотря на то что он достиг по лояльности уровня скидки id2, она не применилась, а применилась id32
}
2023-03-06 13:21:48 +00:00
},
{
"input": {
"UserInformation": {
"ID": "buddy",
"Type": "",
"PurchasesAmount": 0
},
"Products": [
{
"ID": "p7",
"Amount": 4000,
"Price": 12000
},
]
},
"expect": {
2023-03-08 10:45:26 +00:00
"price": 12000 * 0.985 * 0.96,
2023-03-06 13:21:48 +00:00
"envolvedDiscounts": [
2023-03-08 10:45:26 +00:00
"id4",
"id31"
2023-03-06 13:21:48 +00:00
]
}
},
]
};