@pisell/pisellos 3.0.71 → 3.0.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/Cart/utils/cartProduct.js +41 -26
- package/dist/modules/Discount/index.d.ts +2 -0
- package/dist/modules/Discount/index.js +69 -36
- package/dist/modules/Discount/types.d.ts +16 -0
- package/dist/modules/Order/index.js +4 -1
- package/dist/modules/Order/utils.d.ts +1 -0
- package/dist/modules/Order/utils.js +9 -0
- package/dist/modules/Rules/index.d.ts +8 -0
- package/dist/modules/Rules/index.js +1033 -183
- package/dist/modules/Rules/types.d.ts +4 -1
- package/dist/solution/BookingByStep/index.js +1 -0
- package/dist/solution/ShopDiscount/index.d.ts +2 -0
- package/dist/solution/ShopDiscount/index.js +82 -19
- package/dist/solution/ShopDiscount/types.d.ts +4 -0
- package/dist/solution/ShopDiscount/utils.d.ts +55 -0
- package/dist/solution/ShopDiscount/utils.js +432 -3
- package/lib/modules/Cart/utils/cartProduct.js +35 -22
- package/lib/modules/Discount/index.d.ts +2 -0
- package/lib/modules/Discount/index.js +19 -4
- package/lib/modules/Discount/types.d.ts +16 -0
- package/lib/modules/Order/index.js +2 -0
- package/lib/modules/Order/utils.d.ts +1 -0
- package/lib/modules/Order/utils.js +11 -0
- package/lib/modules/Rules/index.d.ts +8 -0
- package/lib/modules/Rules/index.js +813 -172
- package/lib/modules/Rules/types.d.ts +4 -1
- package/lib/solution/BookingByStep/index.js +4 -0
- package/lib/solution/ShopDiscount/index.d.ts +2 -0
- package/lib/solution/ShopDiscount/index.js +58 -10
- package/lib/solution/ShopDiscount/types.d.ts +4 -0
- package/lib/solution/ShopDiscount/utils.d.ts +55 -0
- package/lib/solution/ShopDiscount/utils.js +266 -3
- package/package.json +1 -1
|
@@ -39,6 +39,7 @@ type ProductDetail = {
|
|
|
39
39
|
original_price?: number | string;
|
|
40
40
|
num?: number;
|
|
41
41
|
quantity: number;
|
|
42
|
+
startDate?: any;
|
|
42
43
|
};
|
|
43
44
|
export interface RulesParamsHooks {
|
|
44
45
|
getProduct: (product: Record<string, any>) => ProductDetail;
|
|
@@ -49,8 +50,10 @@ export interface RulesParamsHooks {
|
|
|
49
50
|
origin_total?: number;
|
|
50
51
|
price?: string | number;
|
|
51
52
|
variant?: any[];
|
|
52
|
-
original_price?: number;
|
|
53
|
+
original_price?: number | string;
|
|
53
54
|
quantity?: number;
|
|
55
|
+
bundle?: any[];
|
|
56
|
+
main_product_selling_price?: string | number;
|
|
54
57
|
}) => Record<string, any>;
|
|
55
58
|
}
|
|
56
59
|
export {};
|
|
@@ -1607,6 +1607,10 @@ var BookingByStepImpl = class extends import_BaseModule.BaseModule {
|
|
|
1607
1607
|
}
|
|
1608
1608
|
});
|
|
1609
1609
|
});
|
|
1610
|
+
this.core.effects.emit(
|
|
1611
|
+
`${this.store.cart.name}:onUpdateBookingDate`,
|
|
1612
|
+
{}
|
|
1613
|
+
);
|
|
1610
1614
|
}
|
|
1611
1615
|
getScheduleDataByIds(scheduleIds) {
|
|
1612
1616
|
const targetSchedules = this.store.schedule.getScheduleListByIds(scheduleIds);
|
|
@@ -18,6 +18,8 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
|
|
|
18
18
|
private initializePlugins;
|
|
19
19
|
private registerDependentModules;
|
|
20
20
|
private registerEventListeners;
|
|
21
|
+
getCurrentBookingTime(): string | null;
|
|
22
|
+
private filterDiscountListByBookingTime;
|
|
21
23
|
setCustomer(customer: Customer): Promise<void>;
|
|
22
24
|
calcDiscount(productList: Record<string, any>[], options?: {
|
|
23
25
|
discountId: number;
|
|
@@ -37,6 +37,7 @@ var import_BaseModule = require("../../modules/BaseModule");
|
|
|
37
37
|
var import_types = require("./types");
|
|
38
38
|
var import_Discount = require("../../modules/Discount");
|
|
39
39
|
var import_Rules = require("../../modules/Rules");
|
|
40
|
+
var import_utils = require("./utils");
|
|
40
41
|
var import_decimal = __toESM(require("decimal.js"));
|
|
41
42
|
var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
42
43
|
constructor(name, version) {
|
|
@@ -49,7 +50,10 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
49
50
|
customer: null,
|
|
50
51
|
productList: [],
|
|
51
52
|
discount: null,
|
|
52
|
-
rules: null
|
|
53
|
+
rules: null,
|
|
54
|
+
originalDiscountList: [],
|
|
55
|
+
currentBookingTime: "",
|
|
56
|
+
filteredDiscountList: []
|
|
53
57
|
};
|
|
54
58
|
}
|
|
55
59
|
// =========== 生命周期方法 ===========
|
|
@@ -138,6 +142,44 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
138
142
|
);
|
|
139
143
|
}
|
|
140
144
|
// =========== 公共 API ===========
|
|
145
|
+
// 设置预约时间
|
|
146
|
+
// public async setBookingTime(bookingTime: string | null): Promise<void> {
|
|
147
|
+
// if (this.store.currentBookingTime !== bookingTime) {
|
|
148
|
+
// this.store.currentBookingTime = bookingTime;
|
|
149
|
+
//
|
|
150
|
+
// // 更新过滤后的优惠券列表
|
|
151
|
+
// await this.updateFilteredDiscountList();
|
|
152
|
+
// }
|
|
153
|
+
// }
|
|
154
|
+
// 获取当前预约时间
|
|
155
|
+
getCurrentBookingTime() {
|
|
156
|
+
return this.store.currentBookingTime;
|
|
157
|
+
}
|
|
158
|
+
// 根据预约时间过滤优惠券列表
|
|
159
|
+
filterDiscountListByBookingTime(discountList, bookingTime) {
|
|
160
|
+
if ((0, import_utils.isAllNormalProduct)(this.store.productList || [])) {
|
|
161
|
+
return discountList;
|
|
162
|
+
}
|
|
163
|
+
return (0, import_utils.filterDiscountListByBookingTime)(discountList, bookingTime);
|
|
164
|
+
}
|
|
165
|
+
// 更新过滤后的优惠券列表
|
|
166
|
+
// private async updateFilteredDiscountList(): Promise<void> {
|
|
167
|
+
// const originalList = this.store.originalDiscountList;
|
|
168
|
+
// const filteredList = this.filterDiscountListByBookingTime(originalList, this.store.currentBookingTime);
|
|
169
|
+
//
|
|
170
|
+
// this.store.filteredDiscountList = filteredList;
|
|
171
|
+
//
|
|
172
|
+
// // 更新 DiscountModule 中的优惠券列表
|
|
173
|
+
// this.setDiscountList(filteredList);
|
|
174
|
+
//
|
|
175
|
+
// if (this.store.productList?.length) {
|
|
176
|
+
// const result = this.calcDiscount(this.store.productList);
|
|
177
|
+
// await this.core.effects.emit(
|
|
178
|
+
// ShopDiscountHooks.onLoadPrepareCalcResult,
|
|
179
|
+
// result,
|
|
180
|
+
// );
|
|
181
|
+
// }
|
|
182
|
+
// }
|
|
141
183
|
// 设置客户
|
|
142
184
|
async setCustomer(customer) {
|
|
143
185
|
var _a;
|
|
@@ -315,7 +357,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
315
357
|
editModeDiscountList[index] = {
|
|
316
358
|
...editModeDiscountList[index],
|
|
317
359
|
amount: new import_decimal.default(discount.amount || 0).plus(new import_decimal.default(editModeDiscountList[index].amount || 0)).toNumber(),
|
|
318
|
-
savedAmount: new import_decimal.default(discount.amount || 0).times((product == null ? void 0 : product.num) || 1).plus(new import_decimal.default(editModeDiscountList[index].savedAmount || 0)).toNumber()
|
|
360
|
+
savedAmount: new import_decimal.default(discount.amount || 0).times((product == null ? void 0 : product.quantity) || (product == null ? void 0 : product.num) || 1).plus(new import_decimal.default(editModeDiscountList[index].savedAmount || 0)).toNumber()
|
|
319
361
|
};
|
|
320
362
|
} else {
|
|
321
363
|
if (discount.type && !discount.tag) {
|
|
@@ -325,7 +367,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
325
367
|
...discount,
|
|
326
368
|
isEditMode: true,
|
|
327
369
|
limited_relation_product_data: {},
|
|
328
|
-
savedAmount: discount.amount * ((product == null ? void 0 : product.num) || 1),
|
|
370
|
+
savedAmount: discount.amount * ((product == null ? void 0 : product.quantity) || (product == null ? void 0 : product.num) || 1),
|
|
329
371
|
isAvailable: true,
|
|
330
372
|
id: ((_a3 = discount.discount) == null ? void 0 : _a3.resource_id) || discount.id,
|
|
331
373
|
format_title: ((_b = discount.discount) == null ? void 0 : _b.title) || discount.format_title,
|
|
@@ -345,15 +387,17 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
345
387
|
const isProductFree = (id) => {
|
|
346
388
|
var _a2;
|
|
347
389
|
const targetProduct = productList.find((n) => n.id === id);
|
|
390
|
+
if (!targetProduct)
|
|
391
|
+
return false;
|
|
348
392
|
const product = (_a2 = this.hooks) == null ? void 0 : _a2.getProduct(targetProduct);
|
|
349
393
|
return Number(product == null ? void 0 : product.total) === 0 && (Number(product == null ? void 0 : product.origin_total) === 0 || !(product == null ? void 0 : product.origin_total));
|
|
350
394
|
};
|
|
351
|
-
const allUsedProductIds = newDiscountList.map((n) => {
|
|
395
|
+
const allUsedProductIds = newDiscountList.filter((item) => !(item == null ? void 0 : item.isEditMode)).map((n) => {
|
|
352
396
|
var _a2;
|
|
353
|
-
return n.isSelected ? (_a2 = n.appliedProductDetails) == null ? void 0 : _a2.map((n2) => {
|
|
397
|
+
return n.isSelected ? ((_a2 = n.appliedProductDetails) == null ? void 0 : _a2.map((n2) => {
|
|
354
398
|
var _a3;
|
|
355
399
|
return (_a3 = n2.discount) == null ? void 0 : _a3.product_id;
|
|
356
|
-
}) : [];
|
|
400
|
+
})) || n.product_id : [];
|
|
357
401
|
}).flat();
|
|
358
402
|
newDiscountList.forEach((item) => {
|
|
359
403
|
var _a2;
|
|
@@ -398,7 +442,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
398
442
|
}
|
|
399
443
|
// 加载准备配置
|
|
400
444
|
async loadPrepareConfig(params) {
|
|
401
|
-
var _a, _b, _c, _d;
|
|
445
|
+
var _a, _b, _c, _d, _e;
|
|
402
446
|
try {
|
|
403
447
|
const customerId = params.customerId || ((_a = this.getCustomer()) == null ? void 0 : _a.id);
|
|
404
448
|
const goodPassList = await ((_b = this.store.discount) == null ? void 0 : _b.loadPrepareConfig({
|
|
@@ -413,8 +457,12 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
413
457
|
const scanDiscountIds = scanDiscount.map((n) => n.id);
|
|
414
458
|
const newGoodPassList = goodPassList == null ? void 0 : goodPassList.filter((n) => !scanDiscountIds.includes(n.id));
|
|
415
459
|
const newDiscountList = [...scanDiscount, ...newGoodPassList || []];
|
|
416
|
-
this.
|
|
417
|
-
|
|
460
|
+
this.store.originalDiscountList = newDiscountList;
|
|
461
|
+
await ((_d = this.store.discount) == null ? void 0 : _d.setOriginalDiscountList(newDiscountList));
|
|
462
|
+
const filteredDiscountList = this.filterDiscountListByBookingTime(newDiscountList, this.store.currentBookingTime);
|
|
463
|
+
this.store.filteredDiscountList = filteredDiscountList;
|
|
464
|
+
this.setDiscountList(filteredDiscountList || []);
|
|
465
|
+
if ((_e = this.store.productList) == null ? void 0 : _e.length) {
|
|
418
466
|
const result = this.calcDiscount(this.store.productList);
|
|
419
467
|
await this.core.effects.emit(
|
|
420
468
|
import_types.ShopDiscountHooks.onLoadPrepareCalcResult,
|
|
@@ -423,7 +471,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
|
|
|
423
471
|
}
|
|
424
472
|
await this.core.effects.emit(
|
|
425
473
|
import_types.ShopDiscountHooks.onLoadDiscountList,
|
|
426
|
-
|
|
474
|
+
filteredDiscountList
|
|
427
475
|
);
|
|
428
476
|
} catch (error) {
|
|
429
477
|
console.error("[ShopDiscount] 加载准备配置出错:", error);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DiscountModule } from '../../modules/Discount';
|
|
2
2
|
import { RulesModule } from '../../modules/Rules';
|
|
3
|
+
import { Discount } from "../../modules/Discount/types";
|
|
3
4
|
export declare enum ShopDiscountHooks {
|
|
4
5
|
onInited = "shopDiscount:onInited",
|
|
5
6
|
onDestroy = "shopDiscount:onDestroy",
|
|
@@ -22,4 +23,7 @@ export interface ShopDiscountState {
|
|
|
22
23
|
discount: DiscountModule | null;
|
|
23
24
|
rules: RulesModule | null;
|
|
24
25
|
productList: Record<string, any>[];
|
|
26
|
+
originalDiscountList: Discount[];
|
|
27
|
+
currentBookingTime: string | null;
|
|
28
|
+
filteredDiscountList: Discount[];
|
|
25
29
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Discount } from "../../modules/Discount/types";
|
|
2
2
|
export declare const uniqueById: <T>(arr: T[], key?: string) => T[];
|
|
3
|
+
export declare const isNormalProductByDurationSchedule: (item: any) => boolean;
|
|
4
|
+
export declare const isAllNormalProduct: (items: any[]) => boolean;
|
|
3
5
|
/**
|
|
4
6
|
* 获取折扣金额 基于折扣卡类型计算
|
|
5
7
|
* 商品券:直接返回商品价格
|
|
@@ -10,3 +12,56 @@ export declare const uniqueById: <T>(arr: T[], key?: string) => T[];
|
|
|
10
12
|
* @returns
|
|
11
13
|
*/
|
|
12
14
|
export declare const getDiscountAmount: (discount: Discount, total: number, price: number) => number;
|
|
15
|
+
export declare const getDiscountListAmountTotal: (discount: Discount[]) => any;
|
|
16
|
+
/**
|
|
17
|
+
* 获取折扣金额 计算每个折扣的金额
|
|
18
|
+
* @param discount
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export declare const getDiscountListAmount: (discount: Discount[]) => any;
|
|
22
|
+
export interface ScheduleItem {
|
|
23
|
+
id: number;
|
|
24
|
+
name: string | {
|
|
25
|
+
[key: string]: string;
|
|
26
|
+
};
|
|
27
|
+
type: 'standard' | 'time-slots' | 'designation';
|
|
28
|
+
start_time: string | null;
|
|
29
|
+
end_time: string | null;
|
|
30
|
+
repeat_type: 'none' | 'daily' | 'weekly';
|
|
31
|
+
repeat_rule: {
|
|
32
|
+
end: {
|
|
33
|
+
type: 'never' | 'date' | 'occurrence';
|
|
34
|
+
end_date: string | null;
|
|
35
|
+
occurrence: number | null;
|
|
36
|
+
};
|
|
37
|
+
frequency: number;
|
|
38
|
+
excluded_date: Array<{
|
|
39
|
+
start: string;
|
|
40
|
+
end: string;
|
|
41
|
+
}>;
|
|
42
|
+
included_date: Array<{
|
|
43
|
+
start: string;
|
|
44
|
+
end: string;
|
|
45
|
+
}>;
|
|
46
|
+
frequency_date: number[];
|
|
47
|
+
} | null;
|
|
48
|
+
designation: Array<{
|
|
49
|
+
start_date: string;
|
|
50
|
+
start_time: string;
|
|
51
|
+
end_date: string;
|
|
52
|
+
end_time: string;
|
|
53
|
+
}> | null;
|
|
54
|
+
is_all: number;
|
|
55
|
+
time_slot: Array<{
|
|
56
|
+
start_time: string;
|
|
57
|
+
end_time: string;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
export declare const getDateIsInSchedule: (dateTime: string, scheduleList: ScheduleItem[]) => boolean;
|
|
61
|
+
/**
|
|
62
|
+
* 根据预约时间过滤优惠券列表
|
|
63
|
+
* @param discountList 优惠券列表
|
|
64
|
+
* @param bookingTime 预约时间 (格式: YYYY-MM-DD HH:mm:ss)
|
|
65
|
+
* @returns 过滤后的优惠券列表
|
|
66
|
+
*/
|
|
67
|
+
export declare const filterDiscountListByBookingTime: (discountList: Discount[], bookingTime: string | null) => Discount[];
|
|
@@ -29,28 +29,291 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
// src/solution/ShopDiscount/utils.ts
|
|
30
30
|
var utils_exports = {};
|
|
31
31
|
__export(utils_exports, {
|
|
32
|
+
filterDiscountListByBookingTime: () => filterDiscountListByBookingTime,
|
|
33
|
+
getDateIsInSchedule: () => getDateIsInSchedule,
|
|
32
34
|
getDiscountAmount: () => getDiscountAmount,
|
|
35
|
+
getDiscountListAmount: () => getDiscountListAmount,
|
|
36
|
+
getDiscountListAmountTotal: () => getDiscountListAmountTotal,
|
|
37
|
+
isAllNormalProduct: () => isAllNormalProduct,
|
|
38
|
+
isNormalProductByDurationSchedule: () => isNormalProductByDurationSchedule,
|
|
33
39
|
uniqueById: () => uniqueById
|
|
34
40
|
});
|
|
35
41
|
module.exports = __toCommonJS(utils_exports);
|
|
36
42
|
var import_decimal = __toESM(require("decimal.js"));
|
|
43
|
+
var import_dayjs = __toESM(require("dayjs"));
|
|
37
44
|
var uniqueById = (arr, key = "id") => {
|
|
38
45
|
const seen = /* @__PURE__ */ new Set();
|
|
39
46
|
return arr.filter((item) => !seen.has(item[key]) && seen.add(item[key]));
|
|
40
47
|
};
|
|
48
|
+
var isNormalProductByDurationSchedule = (item) => {
|
|
49
|
+
var _a, _b;
|
|
50
|
+
return !(item == null ? void 0 : item.duration) && !((_a = item == null ? void 0 : item.schedules) == null ? void 0 : _a.length) && !((_b = item == null ? void 0 : item["schedule.ids"]) == null ? void 0 : _b.length);
|
|
51
|
+
};
|
|
52
|
+
var isAllNormalProduct = (items) => {
|
|
53
|
+
return items.every((item) => isNormalProductByDurationSchedule(item));
|
|
54
|
+
};
|
|
41
55
|
var getDiscountAmount = (discount, total, price) => {
|
|
42
56
|
var _a;
|
|
43
57
|
if (discount.tag === "good_pass") {
|
|
44
|
-
return new import_decimal.default(
|
|
58
|
+
return new import_decimal.default(price).minus(new import_decimal.default(price || 0)).toNumber();
|
|
45
59
|
}
|
|
46
60
|
const isFixedAmount = ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.discount_card_type) === "fixed_amount";
|
|
47
61
|
if (isFixedAmount) {
|
|
48
|
-
return Math.max(new import_decimal.default(
|
|
62
|
+
return Math.max(new import_decimal.default(price).minus(new import_decimal.default(discount.par_value || 0)).toNumber(), 0);
|
|
63
|
+
}
|
|
64
|
+
return new import_decimal.default(100).minus(discount.par_value || 0).div(100).mul(new import_decimal.default(price)).toNumber();
|
|
65
|
+
};
|
|
66
|
+
var getDiscountListAmountTotal = (discount) => {
|
|
67
|
+
return discount.reduce((acc, cur) => {
|
|
68
|
+
return new import_decimal.default(acc).plus(new import_decimal.default(cur.num || 1).mul(new import_decimal.default(cur.amount || 0))).toNumber();
|
|
69
|
+
}, new import_decimal.default(0));
|
|
70
|
+
};
|
|
71
|
+
var getDiscountListAmount = (discount) => {
|
|
72
|
+
return discount.reduce((acc, cur) => {
|
|
73
|
+
return new import_decimal.default(acc).plus(new import_decimal.default(cur.amount || 0)).toNumber();
|
|
74
|
+
}, new import_decimal.default(0));
|
|
75
|
+
};
|
|
76
|
+
var getDateIsInSchedule = (dateTime, scheduleList) => {
|
|
77
|
+
if (!dateTime || !scheduleList || scheduleList.length === 0) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
const targetDate = (0, import_dayjs.default)(dateTime);
|
|
81
|
+
if (!targetDate.isValid()) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
for (const schedule of scheduleList) {
|
|
85
|
+
if (isTimeInScheduleItem(dateTime, schedule)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
var isTimeInScheduleItem = (dateTime, schedule) => {
|
|
92
|
+
const targetDate = (0, import_dayjs.default)(dateTime);
|
|
93
|
+
const targetDateString = dateTime.split(" ")[0];
|
|
94
|
+
const targetTimeString = dateTime.split(" ")[1] || "00:00:00";
|
|
95
|
+
switch (schedule.type) {
|
|
96
|
+
case "standard":
|
|
97
|
+
return isInStandardSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
98
|
+
case "time-slots":
|
|
99
|
+
return isInTimeSlotsSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
100
|
+
case "designation":
|
|
101
|
+
return isInDesignationSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
102
|
+
default:
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var isInStandardSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
107
|
+
if (!schedule.start_time || !schedule.end_time) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const startDate = (0, import_dayjs.default)(schedule.start_time);
|
|
111
|
+
const endDate = (0, import_dayjs.default)(schedule.end_time);
|
|
112
|
+
const isInBasicRange = targetDate.isSameOrAfter(startDate) && targetDate.isSameOrBefore(endDate);
|
|
113
|
+
if (schedule.repeat_type === "none") {
|
|
114
|
+
return isInBasicRange;
|
|
115
|
+
}
|
|
116
|
+
return isInRepeatingSchedule(targetDate, targetDateString, targetTimeString, schedule, startDate, endDate);
|
|
117
|
+
};
|
|
118
|
+
var isInTimeSlotsSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
119
|
+
if (!schedule.start_time) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (schedule.repeat_type === "none") {
|
|
123
|
+
const scheduleDate = schedule.start_time.split(" ")[0];
|
|
124
|
+
if (targetDateString !== scheduleDate) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return checkTimeSlotsForDate(targetDate, targetDateString, schedule.time_slot);
|
|
128
|
+
}
|
|
129
|
+
return isInTimeSlotsRepeatingSchedule(targetDate, targetDateString, targetTimeString, schedule);
|
|
130
|
+
};
|
|
131
|
+
var isInDesignationSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
132
|
+
if (!schedule.designation) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
for (const designation of schedule.designation) {
|
|
136
|
+
const startDateTime = `${designation.start_date} ${designation.start_time}:00`;
|
|
137
|
+
const endDateTime = `${designation.end_date} ${designation.end_time}:00`;
|
|
138
|
+
const startDate = (0, import_dayjs.default)(startDateTime);
|
|
139
|
+
const endDate = (0, import_dayjs.default)(endDateTime);
|
|
140
|
+
if (targetDate.isSameOrAfter(startDate) && targetDate.isSameOrBefore(endDate)) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
};
|
|
146
|
+
var isInRepeatingSchedule = (targetDate, targetDateString, targetTimeString, schedule, startDate, endDate) => {
|
|
147
|
+
if (!schedule.repeat_rule) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const { repeat_rule, repeat_type } = schedule;
|
|
151
|
+
const targetDateOnly = (0, import_dayjs.default)(targetDateString);
|
|
152
|
+
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
153
|
+
for (const includedDate of repeat_rule.included_date) {
|
|
154
|
+
const includeStartDate = (0, import_dayjs.default)(includedDate.start);
|
|
155
|
+
const includeEndDate = (0, import_dayjs.default)(includedDate.end);
|
|
156
|
+
if (targetDateOnly.isSameOrAfter(includeStartDate, "day") && targetDateOnly.isSameOrBefore(includeEndDate, "day")) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const excludedDate of repeat_rule.excluded_date) {
|
|
162
|
+
const excludeStartDate = (0, import_dayjs.default)(excludedDate.start);
|
|
163
|
+
const excludeEndDate = (0, import_dayjs.default)(excludedDate.end);
|
|
164
|
+
if (targetDateOnly.isSameOrAfter(excludeStartDate, "day") && targetDateOnly.isSameOrBefore(excludeEndDate, "day")) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (repeat_rule.end.type === "date" && repeat_rule.end.end_date) {
|
|
169
|
+
const ruleEndDate = (0, import_dayjs.default)(repeat_rule.end.end_date);
|
|
170
|
+
if (targetDate.isAfter(ruleEndDate)) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
switch (repeat_type) {
|
|
175
|
+
case "daily":
|
|
176
|
+
return isInDailyRepeat(targetDate, startDate, endDate, repeat_rule);
|
|
177
|
+
case "weekly":
|
|
178
|
+
return isInWeeklyRepeat(targetDate, startDate, endDate, repeat_rule);
|
|
179
|
+
default:
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var isInDailyRepeat = (targetDate, startDate, endDate, repeatRule) => {
|
|
184
|
+
const daysDiff = targetDate.diff(startDate, "day");
|
|
185
|
+
if (daysDiff < 0) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (daysDiff % repeatRule.frequency !== 0) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const targetTimeOfDay = targetDate.hour() * 3600 + targetDate.minute() * 60 + targetDate.second();
|
|
192
|
+
const startTimeOfDay = startDate.hour() * 3600 + startDate.minute() * 60 + startDate.second();
|
|
193
|
+
const endTimeOfDay = endDate.hour() * 3600 + endDate.minute() * 60 + endDate.second();
|
|
194
|
+
return targetTimeOfDay >= startTimeOfDay && targetTimeOfDay <= endTimeOfDay;
|
|
195
|
+
};
|
|
196
|
+
var isInWeeklyRepeat = (targetDate, startDate, endDate, repeatRule) => {
|
|
197
|
+
const targetDayOfWeek = targetDate.day();
|
|
198
|
+
if (!repeatRule.frequency_date.includes(targetDayOfWeek)) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const weeksDiff = targetDate.diff(startDate, "week");
|
|
202
|
+
if (weeksDiff < 0) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (weeksDiff % repeatRule.frequency !== 0) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
const targetTimeOfDay = targetDate.hour() * 3600 + targetDate.minute() * 60 + targetDate.second();
|
|
209
|
+
const startTimeOfDay = startDate.hour() * 3600 + startDate.minute() * 60 + startDate.second();
|
|
210
|
+
const endTimeOfDay = endDate.hour() * 3600 + endDate.minute() * 60 + endDate.second();
|
|
211
|
+
return targetTimeOfDay >= startTimeOfDay && targetTimeOfDay <= endTimeOfDay;
|
|
212
|
+
};
|
|
213
|
+
var isInTimeSlotsRepeatingSchedule = (targetDate, targetDateString, targetTimeString, schedule) => {
|
|
214
|
+
if (!schedule.repeat_rule || !schedule.start_time) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
const { repeat_rule, repeat_type } = schedule;
|
|
218
|
+
const startDate = (0, import_dayjs.default)(schedule.start_time);
|
|
219
|
+
const targetDateOnly = (0, import_dayjs.default)(targetDateString);
|
|
220
|
+
if (repeat_rule.included_date && repeat_rule.included_date.length > 0) {
|
|
221
|
+
for (const includedDate of repeat_rule.included_date) {
|
|
222
|
+
const includeStartDate = (0, import_dayjs.default)(includedDate.start);
|
|
223
|
+
const includeEndDate = (0, import_dayjs.default)(includedDate.end);
|
|
224
|
+
if (targetDateOnly.isSameOrAfter(includeStartDate, "day") && targetDateOnly.isSameOrBefore(includeEndDate, "day")) {
|
|
225
|
+
return checkTimeSlotsForDate(targetDate, targetDateString, schedule.time_slot);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
for (const excludedDate of repeat_rule.excluded_date) {
|
|
230
|
+
const excludeStartDate = (0, import_dayjs.default)(excludedDate.start);
|
|
231
|
+
const excludeEndDate = (0, import_dayjs.default)(excludedDate.end);
|
|
232
|
+
if (targetDateOnly.isSameOrAfter(excludeStartDate, "day") && targetDateOnly.isSameOrBefore(excludeEndDate, "day")) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (repeat_rule.end.type === "date" && repeat_rule.end.end_date) {
|
|
237
|
+
const ruleEndDate = (0, import_dayjs.default)(repeat_rule.end.end_date);
|
|
238
|
+
if (targetDateOnly.isAfter(ruleEndDate, "day")) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
let isDateValid = false;
|
|
243
|
+
switch (repeat_type) {
|
|
244
|
+
case "daily":
|
|
245
|
+
isDateValid = isInDailyRepeatForDate(targetDateOnly, startDate, repeat_rule);
|
|
246
|
+
break;
|
|
247
|
+
case "weekly":
|
|
248
|
+
isDateValid = isInWeeklyRepeatForDate(targetDateOnly, startDate, repeat_rule);
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (isDateValid) {
|
|
254
|
+
return checkTimeSlotsForDate(targetDate, targetDateString, schedule.time_slot);
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
};
|
|
258
|
+
var checkTimeSlotsForDate = (targetDate, targetDateString, timeSlots) => {
|
|
259
|
+
for (const timeSlot of timeSlots) {
|
|
260
|
+
const slotStart = `${targetDateString} ${timeSlot.start_time}:00`;
|
|
261
|
+
const slotEnd = `${targetDateString} ${timeSlot.end_time}:00`;
|
|
262
|
+
const slotStartDate = (0, import_dayjs.default)(slotStart);
|
|
263
|
+
const slotEndDate = (0, import_dayjs.default)(slotEnd);
|
|
264
|
+
if (targetDate.isSameOrAfter(slotStartDate) && targetDate.isSameOrBefore(slotEndDate)) {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return false;
|
|
269
|
+
};
|
|
270
|
+
var isInDailyRepeatForDate = (targetDate, startDate, repeatRule) => {
|
|
271
|
+
const daysDiff = targetDate.diff(startDate, "day");
|
|
272
|
+
if (daysDiff < 0) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
return daysDiff % repeatRule.frequency === 0;
|
|
276
|
+
};
|
|
277
|
+
var isInWeeklyRepeatForDate = (targetDate, startDate, repeatRule) => {
|
|
278
|
+
const targetDayOfWeek = targetDate.day();
|
|
279
|
+
if (!repeatRule.frequency_date.includes(targetDayOfWeek)) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const weeksDiff = targetDate.diff(startDate, "week");
|
|
283
|
+
if (weeksDiff < 0) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
return weeksDiff % repeatRule.frequency === 0;
|
|
287
|
+
};
|
|
288
|
+
var filterDiscountListByBookingTime = (discountList, bookingTime) => {
|
|
289
|
+
if (!bookingTime) {
|
|
290
|
+
return discountList;
|
|
49
291
|
}
|
|
50
|
-
return
|
|
292
|
+
return discountList.filter((discount) => {
|
|
293
|
+
var _a, _b;
|
|
294
|
+
if (((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.validity_type) === "custom_schedule_validity") {
|
|
295
|
+
return getDateIsInSchedule(bookingTime, ((_b = discount.custom_schedule_snapshot) == null ? void 0 : _b.data) || []);
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
const isHasStart = !!discount.start_date && !!discount.start_time;
|
|
299
|
+
const startDate = (0, import_dayjs.default)(`${discount.start_date} ${discount.start_time}`);
|
|
300
|
+
const bookingTimeDayjs = (0, import_dayjs.default)(bookingTime);
|
|
301
|
+
const isAfterStart = isHasStart ? bookingTimeDayjs.isSameOrAfter(startDate) : true;
|
|
302
|
+
const isBeforeExpire = discount.expire_time ? bookingTimeDayjs.isSameOrBefore((0, import_dayjs.default)(discount.expire_time)) : true;
|
|
303
|
+
return isAfterStart && isBeforeExpire;
|
|
304
|
+
} catch (error) {
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
51
308
|
};
|
|
52
309
|
// Annotate the CommonJS export names for ESM import in node:
|
|
53
310
|
0 && (module.exports = {
|
|
311
|
+
filterDiscountListByBookingTime,
|
|
312
|
+
getDateIsInSchedule,
|
|
54
313
|
getDiscountAmount,
|
|
314
|
+
getDiscountListAmount,
|
|
315
|
+
getDiscountListAmountTotal,
|
|
316
|
+
isAllNormalProduct,
|
|
317
|
+
isNormalProductByDurationSchedule,
|
|
55
318
|
uniqueById
|
|
56
319
|
});
|