adminFront/src/stores/mocks/exampleCartValues.ts
2023-03-08 13:45:26 +03:00

1125 lines
39 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { AnyDiscount } from "@root/model/cart";
import { Privilege } from "@root/model/tariff";
import { User } from "../../model/user";
export type TestCase = {
input: {
UserInformation: User;
Products: Array<{
ID: string;
Amount: number;
Price?: number;
}>;
};
expect: {
price: number;
envolvedDiscounts: string[];
};
};
type ExampleCartValues = {
privileges: Privilege[];
discounts: AnyDiscount[];
testCases: TestCase[];
};
export const exampleCartValues: ExampleCartValues = {
"privileges": [
{
"serviceKey": "templategen",
"name": "unlim",
"privilegeId": "p1",
"description": "привилегия безлимитного доступа к шаблонизатору на время. в днях",
"type": "day",
"pricePerUnit": 0.5
},
{
"serviceKey": "templategen",
"name": "gencount",
"privilegeId": "p2",
"description": "привилегия на определённое количество генераций",
"type": "count",
"pricePerUnit": 0.1
},
{
"serviceKey": "squiz",
"name": "unlim",
"privilegeId": "p3",
"description": "привилегия безлимитного доступа к опроснику. в днях",
"type": "day",
"pricePerUnit": 3.0
},
{
"serviceKey": "squiz",
"name": "activequiz",
"privilegeId": "p4",
"description": "привилегия создания ограниченного количества опросов",
"type": "count",
"pricePerUnit": 1.0
},
{
"serviceKey": "dwarfener",
"name": "unlim",
"privilegeId": "p5",
"description": "привилегия безлимитного доступа к сокращателю на время. в днях",
"type": "day",
"pricePerUnit": 0.1
},
{
"serviceKey": "dwarfener",
"name": "abcount",
"privilegeId": "p6",
"description": "привилегия на количество активных ссылок в абтестах",
"type": "count",
"pricePerUnit": 0.7
},
{
"serviceKey": "dwarfener",
"name": "extended",
"privilegeId": "p7",
"description": "привилегия расширенной статистики, в днях",
"type": "day",
"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": [
{
"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"
]
}
},
]
};