@pisell/pisellos 2.2.11 → 2.2.12

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.
Files changed (37) hide show
  1. package/dist/modules/Cart/utils/cartProduct.js +41 -26
  2. package/dist/modules/Discount/index.d.ts +2 -0
  3. package/dist/modules/Discount/index.js +69 -36
  4. package/dist/modules/Discount/types.d.ts +16 -0
  5. package/dist/modules/Order/index.js +4 -1
  6. package/dist/modules/Order/utils.d.ts +1 -0
  7. package/dist/modules/Order/utils.js +9 -0
  8. package/dist/modules/Rules/index.d.ts +7 -0
  9. package/dist/modules/Rules/index.js +1032 -195
  10. package/dist/modules/Rules/types.d.ts +4 -1
  11. package/dist/solution/BookingByStep/index.d.ts +1 -1
  12. package/dist/solution/BookingByStep/index.js +1 -0
  13. package/dist/solution/BookingTicket/index.d.ts +1 -1
  14. package/dist/solution/ShopDiscount/index.d.ts +2 -0
  15. package/dist/solution/ShopDiscount/index.js +80 -19
  16. package/dist/solution/ShopDiscount/types.d.ts +4 -1
  17. package/dist/solution/ShopDiscount/utils.d.ts +55 -0
  18. package/dist/solution/ShopDiscount/utils.js +432 -3
  19. package/lib/modules/Cart/utils/cartProduct.js +35 -22
  20. package/lib/modules/Discount/index.d.ts +2 -0
  21. package/lib/modules/Discount/index.js +19 -4
  22. package/lib/modules/Discount/types.d.ts +16 -0
  23. package/lib/modules/Order/index.js +2 -0
  24. package/lib/modules/Order/utils.d.ts +1 -0
  25. package/lib/modules/Order/utils.js +11 -0
  26. package/lib/modules/Rules/index.d.ts +7 -0
  27. package/lib/modules/Rules/index.js +809 -177
  28. package/lib/modules/Rules/types.d.ts +4 -1
  29. package/lib/solution/BookingByStep/index.d.ts +1 -1
  30. package/lib/solution/BookingByStep/index.js +4 -0
  31. package/lib/solution/BookingTicket/index.d.ts +1 -1
  32. package/lib/solution/ShopDiscount/index.d.ts +2 -0
  33. package/lib/solution/ShopDiscount/index.js +55 -9
  34. package/lib/solution/ShopDiscount/types.d.ts +4 -1
  35. package/lib/solution/ShopDiscount/utils.d.ts +55 -0
  36. package/lib/solution/ShopDiscount/utils.js +266 -3
  37. package/package.json +1 -1
@@ -44,6 +44,7 @@ type ProductDetail = {
44
44
  quantity: number;
45
45
  vouchersApplicable?: boolean;
46
46
  holder_id?: number;
47
+ startDate?: any;
47
48
  };
48
49
  export interface RulesParamsHooks {
49
50
  getProduct: (product: Record<string, any>) => ProductDetail;
@@ -54,8 +55,10 @@ export interface RulesParamsHooks {
54
55
  origin_total?: number;
55
56
  price?: string | number;
56
57
  variant?: any[];
57
- original_price?: number;
58
+ original_price?: number | string;
58
59
  quantity?: number;
60
+ bundle?: any[];
61
+ main_product_selling_price?: string | number;
59
62
  }) => Record<string, any>;
60
63
  }
61
64
  export {};
@@ -342,7 +342,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
342
342
  };
343
343
  setOtherData(key: string, value: any): void;
344
344
  getOtherData(key: string): any;
345
- getProductTypeById(id: number): Promise<"duration" | "session" | "normal">;
345
+ getProductTypeById(id: number): Promise<"normal" | "duration" | "session">;
346
346
  /**
347
347
  * 提供给 UI 的方法,减轻 UI 层的计算压力,UI 层只需要传递 cartItemId 和 resourceCode 即返回对应的 renderList
348
348
  *
@@ -1606,6 +1606,10 @@ var BookingByStepImpl = class extends import_BaseModule.BaseModule {
1606
1606
  }
1607
1607
  });
1608
1608
  });
1609
+ this.core.effects.emit(
1610
+ `${this.store.cart.name}:onUpdateBookingDate`,
1611
+ {}
1612
+ );
1609
1613
  }
1610
1614
  getScheduleDataByIds(scheduleIds) {
1611
1615
  const targetSchedules = this.store.schedule.getScheduleListByIds(scheduleIds);
@@ -123,7 +123,7 @@ export declare class BookingTicketImpl extends BaseModule implements Module {
123
123
  * 获取当前的客户搜索条件
124
124
  * @returns 当前搜索条件
125
125
  */
126
- getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "num" | "skip">;
126
+ getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "skip" | "num">;
127
127
  /**
128
128
  * 获取客户列表状态(包含滚动加载相关状态)
129
129
  * @returns 客户状态
@@ -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
  setHolders(holders: {
23
25
  form_record_id: number;
@@ -36,6 +36,7 @@ module.exports = __toCommonJS(ShopDiscount_exports);
36
36
  var import_BaseModule = require("../../modules/BaseModule");
37
37
  var import_Discount = require("../../modules/Discount");
38
38
  var import_Rules = require("../../modules/Rules");
39
+ var import_utils = require("./utils");
39
40
  var import_decimal = __toESM(require("decimal.js"));
40
41
  var import_lodash_es = require("lodash-es");
41
42
  var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
@@ -51,6 +52,8 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
51
52
  discount: null,
52
53
  rules: null,
53
54
  originalDiscountList: [],
55
+ currentBookingTime: "",
56
+ filteredDiscountList: [],
54
57
  holders: []
55
58
  };
56
59
  }
@@ -140,6 +143,44 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
140
143
  );
141
144
  }
142
145
  // =========== 公共 API ===========
146
+ // 设置预约时间
147
+ // public async setBookingTime(bookingTime: string | null): Promise<void> {
148
+ // if (this.store.currentBookingTime !== bookingTime) {
149
+ // this.store.currentBookingTime = bookingTime;
150
+ //
151
+ // // 更新过滤后的优惠券列表
152
+ // await this.updateFilteredDiscountList();
153
+ // }
154
+ // }
155
+ // 获取当前预约时间
156
+ getCurrentBookingTime() {
157
+ return this.store.currentBookingTime;
158
+ }
159
+ // 根据预约时间过滤优惠券列表
160
+ filterDiscountListByBookingTime(discountList, bookingTime) {
161
+ if ((0, import_utils.isAllNormalProduct)(this.store.productList || [])) {
162
+ return discountList;
163
+ }
164
+ return (0, import_utils.filterDiscountListByBookingTime)(discountList, bookingTime);
165
+ }
166
+ // 更新过滤后的优惠券列表
167
+ // private async updateFilteredDiscountList(): Promise<void> {
168
+ // const originalList = this.store.originalDiscountList;
169
+ // const filteredList = this.filterDiscountListByBookingTime(originalList, this.store.currentBookingTime);
170
+ //
171
+ // this.store.filteredDiscountList = filteredList;
172
+ //
173
+ // // 更新 DiscountModule 中的优惠券列表
174
+ // this.setDiscountList(filteredList);
175
+ //
176
+ // if (this.store.productList?.length) {
177
+ // const result = this.calcDiscount(this.store.productList);
178
+ // await this.core.effects.emit(
179
+ // ShopDiscountHooks.onLoadPrepareCalcResult,
180
+ // result,
181
+ // );
182
+ // }
183
+ // }
143
184
  // 设置客户
144
185
  async setCustomer(customer) {
145
186
  var _a;
@@ -331,7 +372,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
331
372
  editModeDiscountList[index] = {
332
373
  ...editModeDiscountList[index],
333
374
  amount: new import_decimal.default(discount.amount || 0).plus(new import_decimal.default(editModeDiscountList[index].amount || 0)).toNumber(),
334
- 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()
375
+ 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()
335
376
  };
336
377
  } else {
337
378
  if (discount.type && !discount.tag) {
@@ -342,7 +383,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
342
383
  name: discount.name || discount.discount.title.auto,
343
384
  isEditMode: true,
344
385
  limited_relation_product_data: {},
345
- savedAmount: discount.amount * ((product == null ? void 0 : product.num) || 1),
386
+ savedAmount: discount.amount * ((product == null ? void 0 : product.quantity) || (product == null ? void 0 : product.num) || 1),
346
387
  isAvailable: true,
347
388
  id: ((_a3 = discount.discount) == null ? void 0 : _a3.resource_id) || discount.id,
348
389
  format_title: ((_b = discount.discount) == null ? void 0 : _b.title) || discount.format_title,
@@ -362,15 +403,17 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
362
403
  const isProductFree = (id) => {
363
404
  var _a2;
364
405
  const targetProduct = productList.find((n) => n.id === id);
406
+ if (!targetProduct)
407
+ return false;
365
408
  const product = (_a2 = this.hooks) == null ? void 0 : _a2.getProduct(targetProduct);
366
409
  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)) || (0, import_lodash_es.isBoolean)(product == null ? void 0 : product.vouchersApplicable) && !(product == null ? void 0 : product.vouchersApplicable);
367
410
  };
368
- const allUsedProductIds = newDiscountList.map((n) => {
411
+ const allUsedProductIds = newDiscountList.filter((item) => !(item == null ? void 0 : item.isEditMode)).map((n) => {
369
412
  var _a2;
370
- return n.isSelected ? (_a2 = n.appliedProductDetails) == null ? void 0 : _a2.map((n2) => {
413
+ return n.isSelected ? ((_a2 = n.appliedProductDetails) == null ? void 0 : _a2.map((n2) => {
371
414
  var _a3;
372
415
  return (_a3 = n2.discount) == null ? void 0 : _a3.product_id;
373
- }) : [];
416
+ })) || n.product_id : [];
374
417
  }).flat();
375
418
  newDiscountList.forEach((item) => {
376
419
  var _a2;
@@ -432,7 +475,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
432
475
  }
433
476
  // 加载准备配置
434
477
  async loadPrepareConfig(params) {
435
- var _a, _b, _c, _d;
478
+ var _a, _b, _c, _d, _e;
436
479
  try {
437
480
  const customerId = params.customerId || ((_a = this.getCustomer()) == null ? void 0 : _a.id);
438
481
  const goodPassList = await ((_b = this.store.discount) == null ? void 0 : _b.loadPrepareConfig({
@@ -449,8 +492,11 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
449
492
  const newGoodPassList = goodPassList == null ? void 0 : goodPassList.filter((n) => !scanDiscountIds.includes(n.id));
450
493
  const newDiscountList = [...scanDiscount, ...newGoodPassList || []];
451
494
  this.store.originalDiscountList = newDiscountList;
452
- this.setDiscountList(newDiscountList || []);
453
- if ((_d = this.store.productList) == null ? void 0 : _d.length) {
495
+ await ((_d = this.store.discount) == null ? void 0 : _d.setOriginalDiscountList(newDiscountList));
496
+ const filteredDiscountList = this.filterDiscountListByBookingTime(newDiscountList, this.store.currentBookingTime);
497
+ this.store.filteredDiscountList = filteredDiscountList;
498
+ this.setDiscountList(filteredDiscountList || []);
499
+ if ((_e = this.store.productList) == null ? void 0 : _e.length) {
454
500
  const result = this.calcDiscount(this.store.productList);
455
501
  await this.core.effects.emit(
456
502
  `${this.name}:onLoadPrepareCalcResult`,
@@ -459,7 +505,7 @@ var ShopDiscountImpl = class extends import_BaseModule.BaseModule {
459
505
  }
460
506
  await this.core.effects.emit(
461
507
  `${this.name}:onLoadDiscountList`,
462
- newDiscountList
508
+ filteredDiscountList
463
509
  );
464
510
  } catch (error) {
465
511
  console.error("[ShopDiscount] 加载准备配置出错:", error);
@@ -1,5 +1,6 @@
1
- import { DiscountModule, Discount } from '../../modules/Discount';
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",
@@ -28,6 +29,8 @@ export interface ShopDiscountState {
28
29
  form_id?: number;
29
30
  main_field?: string;
30
31
  }[];
32
+ currentBookingTime: string | null;
33
+ filteredDiscountList: Discount[];
31
34
  }
32
35
  export interface SetDiscountSelectedParams {
33
36
  discountId: number;
@@ -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(total).minus(new import_decimal.default(price || 0)).toNumber();
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(total).minus(new import_decimal.default(discount.par_value || 0)).toNumber(), 0);
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 new import_decimal.default(100).minus(discount.par_value || 0).div(100).mul(new import_decimal.default(total)).toNumber();
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
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "2.2.11",
4
+ "version": "2.2.12",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",