diff --git a/src/model/cart.ts b/src/model/cart.ts index 2c39740..204dcb8 100644 --- a/src/model/cart.ts +++ b/src/model/cart.ts @@ -1,177 +1,139 @@ -import { ServiceType, Tariffs } from "./tariff"; +import { ServiceType, Privilege, Tariff } from "./tariff"; -/** @deprecated */ -export interface CartSummary { - mbs: number; - points: number; - days: number; -} - -/** @deprecated */ -export interface Promocode { - id: number; +interface DiscountBase { + _id: string; name: string; - endless: boolean; - from: string; - dueTo: string; - privileges: Array; + description: string; + /** Этап применения скидки */ + layer: number; } -/** @deprecated */ -export interface Privileges { - good: ServiceType, - discount: number; -} - -/** @deprecated */ -export interface Discount { - id: number; - name: string; - endless: boolean; - from: string; - dueTo: string; - privileges: Array; - active: boolean; - basketMore: number; - incomeMore: number; - toTime: number; - toCapacity: number; -} - - -export namespace Cart { - interface DiscountBase { - _id: string; - name: string; - description: string; - /** Этап применения скидки */ - layer: number; - } - - export interface PurchasesAmountDiscount extends DiscountBase { - conditionType: "purchasesAmount"; - condition: { - purchasesAmount: number; - }; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - } - - export interface CartPurchasesAmountDiscount extends DiscountBase { - conditionType: "cartPurchasesAmount"; - condition: { - cartPurchasesAmount: number; - }; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - } - - export interface PrivilegeDiscount extends DiscountBase { - conditionType: "privilege"; - condition: { - privilege: { - id: string; - /** Скидка применяется, если значение больше или равно этому значению */ - value: number; - }; - }; - target: { - products: Array<{ - privilegeId: string; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - }>; - }; - } - - export interface ServiceDiscount extends DiscountBase { - conditionType: "service"; - condition: { - service: { - id: Tariffs.ServiceType; - /** Скидка применяется, если значение больше или равно этому значению */ - value: number; - }; - }; - target: { - service: Tariffs.ServiceType; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - }; - } - - export interface UserTypeDiscount extends DiscountBase { - conditionType: "userType"; - condition: { - userType: string; - }; - target: { - IsAllProducts: boolean; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - }; - overwhelm: boolean; - } - - export interface UserDiscount extends DiscountBase { - conditionType: "user"; - condition: { - coupon: string; - user: string; - }; - target: { - products: Array<{ - privilegeId: string; - /** Множитель, на который умножается сумма при применении скидки */ - factor: number; - }>; - }; - overwhelm: boolean; - } - - export type AnyDiscount = - | PurchasesAmountDiscount - | CartPurchasesAmountDiscount - | PrivilegeDiscount - | ServiceDiscount - | UserTypeDiscount - | UserDiscount; - - export interface Promocode { - id: number; - name: string; - endless: boolean; - from: string; - dueTo: string; - privileges: Tariffs.Privilege[]; - } - - export interface CartItem { - tariff: Tariffs.Tariff; - /** Посчитанная цена пункта корзины */ - price: number; - } - - /** Пункт корзины с уже примененными скидками */ - export interface CartItemTotal { - /** Массив с id примененных скидок */ - envolvedDiscounts: string[]; - totalPrice: number; - tariff: Tariffs.Tariff; - } - - export type ServiceToPriceMap = { - [Key in Tariffs.ServiceType]: { - customTariffs: number; - defaultTariffs: number; - } +export interface PurchasesAmountDiscount extends DiscountBase { + conditionType: "purchasesAmount"; + condition: { + purchasesAmount: number; }; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; +} - export interface CartTotal { - items: CartItemTotal[]; - totalPrice: number; - priceByService: ServiceToPriceMap; - envolvedCartDiscounts: string[]; +export interface CartPurchasesAmountDiscount extends DiscountBase { + conditionType: "cartPurchasesAmount"; + condition: { + cartPurchasesAmount: number; + }; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; +} + +export interface PrivilegeDiscount extends DiscountBase { + conditionType: "privilege"; + condition: { + privilege: { + id: string; + /** Скидка применяется, если значение больше или равно этому значению */ + value: number; + }; + }; + target: { + products: Array<{ + privilegeId: string; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; + }>; + }; +} + +export interface ServiceDiscount extends DiscountBase { + conditionType: "service"; + condition: { + service: { + id: ServiceType; + /** Скидка применяется, если значение больше или равно этому значению */ + value: number; + }; + }; + target: { + service: ServiceType; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; + }; +} + +export interface UserTypeDiscount extends DiscountBase { + conditionType: "userType"; + condition: { + userType: string; + }; + target: { + IsAllProducts: boolean; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; + }; + overwhelm: boolean; +} + +export interface UserDiscount extends DiscountBase { + conditionType: "user"; + condition: { + coupon: string; + user: string; + }; + target: { + products: Array<{ + privilegeId: string; + /** Множитель, на который умножается сумма при применении скидки */ + factor: number; + }>; + }; + overwhelm: boolean; +} + +export type AnyDiscount = + | PurchasesAmountDiscount + | CartPurchasesAmountDiscount + | PrivilegeDiscount + | ServiceDiscount + | UserTypeDiscount + | UserDiscount; + +export type DiscountConditionType = AnyDiscount["conditionType"]; + +export interface Promocode { + id: string; + name: string; + endless: boolean; + from: string; + dueTo: string; + privileges: Privilege[]; +} + +export interface CartItem { + id: string; + tariff: Tariff; + /** Посчитанная цена пункта корзины */ + price: number; +} + +/** Пункт корзины с уже примененными скидками */ +export interface CartItemTotal { + /** Массив с id примененных скидок */ + envolvedDiscounts: string[]; + totalPrice: number; + tariff: Tariff; +} + +export type ServiceToPriceMap = { + [Key in ServiceType]: { + customTariffs: number; + defaultTariffs: number; } +}; + +export interface CartTotal { + items: CartItemTotal[]; + totalPrice: number; + priceByService: ServiceToPriceMap; + envolvedCartDiscounts: string[]; } \ No newline at end of file diff --git a/src/model/tariff.ts b/src/model/tariff.ts index dfbc3dd..ecb9c12 100644 --- a/src/model/tariff.ts +++ b/src/model/tariff.ts @@ -1,64 +1,46 @@ -/** @deprecated */ -export type ServiceType = - | "Шаблонизатор документов" - | "Опросник" - | "Сокращатель ссылок" - | "АБ тесты"; -/** @deprecated */ + +export const SERVICE_LIST = [ + { + serviceKey: "templategen", + displayName: "Шаблонизатор документов" + }, + { + serviceKey: "squiz", + displayName: "Опросник" + }, + { + serviceKey: "dwarfener", + displayName: "Сокращатель ссылок" + } +] as const; + +export type ServiceType = typeof SERVICE_LIST[number]["serviceKey"]; + +export type PrivilegeType = + | "unlim" + | "gencount" + | "activequiz" + | "abcount" + | "extended"; + +export interface Privilege { + serviceKey: ServiceType; + name: PrivilegeType; + privilegeId: string; + description: string; + /** Единица измерения привелегии: время в днях/кол-во */ + type: "day" | "count"; + /** Стоимость одной единицы привелегии */ + pricePerUnit: number; +} + export interface Tariff { - id: number; + id: string; name: string; - type: string; - service: ServiceType | ""; - disk: number; - time: number; - points: number; - price: number; -} - -/** @deprecated */ -export interface ArrayProps { - id: number; - name: string; - type: "package" | "tariff"; - service: ServiceType | ""; - disk: number; - time: number; - points: number; - price: number; - tariffs?: Array; -} - - -export const SERVICE_LIST = ["templategen", "squiz", "dwarfener"] as const; - -export namespace Tariffs { - export type ServiceType = typeof SERVICE_LIST[number]; - - export type PrivilegeType = - | "unlim" - | "gencount" - | "activequiz" - | "abcount" - | "extended"; - - export interface Privilege { - serviceKey: ServiceType; - name: PrivilegeType; - privilegeId: string; - description: string; - /** Единица измерения привелегии: время в днях/кол-во */ - type: "day" | "count"; - /** Стоимость одной единицы привелегии */ - pricePerUnit: number; - } - - export interface Tariff { - privilege: Privilege; - /** Количество единиц привелегии */ - amount: number; - /** Кастомная цена, если есть, то используется вместо privilege.price */ - customPricePerUnit?: number; - } + privilege: Privilege; + /** Количество единиц привелегии */ + amount: number; + /** Кастомная цена, если есть, то используется вместо privilege.price */ + customPricePerUnit?: number; } \ No newline at end of file