@pisell/pisellos 2.1.172 → 2.1.173

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 (202) hide show
  1. package/dist/apis/picoding.d.ts +0 -0
  2. package/dist/apis/picoding.js +1 -0
  3. package/dist/index.d.ts +0 -1
  4. package/dist/index.js +0 -1
  5. package/dist/model/strategy/adapter/promotion/evaluator.js +26 -99
  6. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +0 -2
  7. package/dist/model/strategy/adapter/walletPass/evaluator.js +8 -61
  8. package/dist/model/strategy/adapter/walletPass/locales.js +3 -12
  9. package/dist/model/strategy/engine.d.ts +5 -18
  10. package/dist/model/strategy/engine.js +45 -145
  11. package/dist/model/strategy/type.d.ts +0 -17
  12. package/dist/model/strategy/type.js +0 -4
  13. package/dist/modules/Cart/types.d.ts +0 -2
  14. package/dist/modules/Cart/utils/cartProduct.js +25 -56
  15. package/dist/modules/Cart/utils/changePrice.js +16 -9
  16. package/dist/modules/Discount/index.d.ts +9 -3
  17. package/dist/modules/Discount/index.js +103 -11
  18. package/dist/modules/Discount/types.d.ts +9 -18
  19. package/dist/modules/OpenData/index.d.ts +24 -0
  20. package/dist/modules/OpenData/index.js +173 -0
  21. package/dist/modules/OpenData/types.d.ts +73 -0
  22. package/dist/modules/OpenData/types.js +1 -0
  23. package/dist/modules/OpenData/utils.d.ts +2 -0
  24. package/dist/modules/OpenData/utils.js +75 -0
  25. package/dist/modules/Order/index.d.ts +66 -1
  26. package/dist/modules/Order/index.js +906 -30
  27. package/dist/modules/Order/types.d.ts +174 -12
  28. package/dist/modules/Order/types.js +2 -0
  29. package/dist/modules/Order/utils.d.ts +118 -0
  30. package/dist/modules/Order/utils.js +586 -2
  31. package/dist/modules/Payment/index.d.ts +1 -2
  32. package/dist/modules/Payment/index.js +7 -10
  33. package/dist/modules/Payment/utils.js +0 -3
  34. package/dist/modules/Payment/walletpass.d.ts +0 -23
  35. package/dist/modules/Payment/walletpass.js +95 -191
  36. package/dist/modules/Product/utils.js +2 -2
  37. package/dist/modules/ProductList/index.d.ts +1 -1
  38. package/dist/modules/ProductList/index.js +4 -3
  39. package/dist/modules/Quotation/index.d.ts +48 -0
  40. package/dist/modules/Quotation/index.js +248 -0
  41. package/dist/modules/Quotation/types.d.ts +42 -0
  42. package/dist/modules/Quotation/types.js +1 -0
  43. package/dist/modules/Rules/index.d.ts +5 -9
  44. package/dist/modules/Rules/index.js +173 -669
  45. package/dist/modules/Rules/types.d.ts +0 -2
  46. package/dist/modules/SalesSummary/index.d.ts +63 -0
  47. package/dist/modules/SalesSummary/index.js +174 -0
  48. package/dist/modules/SalesSummary/types.d.ts +60 -0
  49. package/dist/modules/SalesSummary/types.js +1 -0
  50. package/dist/modules/SalesSummary/utils.d.ts +30 -0
  51. package/dist/modules/SalesSummary/utils.js +480 -0
  52. package/dist/modules/ScanOrderLogger/index.d.ts +23 -0
  53. package/dist/modules/ScanOrderLogger/index.js +174 -0
  54. package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  55. package/dist/modules/ScanOrderLogger/providers/feishu.js +221 -0
  56. package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  57. package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
  58. package/dist/modules/ScanOrderLogger/types.d.ts +53 -0
  59. package/dist/modules/ScanOrderLogger/types.js +1 -0
  60. package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
  61. package/dist/modules/Schedule/utils.d.ts +1 -1
  62. package/dist/modules/Summary/types.d.ts +0 -2
  63. package/dist/modules/Summary/utils.d.ts +3 -9
  64. package/dist/modules/Summary/utils.js +67 -57
  65. package/dist/modules/index.d.ts +4 -0
  66. package/dist/modules/index.js +5 -1
  67. package/dist/plugins/window.d.ts +0 -2
  68. package/dist/solution/BookingByStep/index.d.ts +3 -4
  69. package/dist/solution/BookingByStep/index.js +46 -43
  70. package/dist/solution/BookingByStep/types.d.ts +3 -1
  71. package/dist/solution/BookingByStep/types.js +5 -1
  72. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  73. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  74. package/dist/solution/Checkout/index.js +0 -2
  75. package/dist/solution/ScanOrder/index.d.ts +158 -0
  76. package/dist/solution/ScanOrder/index.js +3474 -0
  77. package/dist/solution/ScanOrder/types.d.ts +306 -0
  78. package/dist/solution/ScanOrder/types.js +35 -0
  79. package/dist/solution/ScanOrder/utils.d.ts +172 -0
  80. package/dist/solution/ScanOrder/utils.js +796 -0
  81. package/dist/solution/ShopDiscount/index.d.ts +3 -2
  82. package/dist/solution/ShopDiscount/index.js +60 -59
  83. package/dist/solution/ShopDiscount/types.d.ts +1 -1
  84. package/dist/solution/ShopDiscount/types.js +1 -2
  85. package/dist/solution/ShopDiscount/utils.js +12 -26
  86. package/dist/solution/VenueBooking/index.d.ts +206 -0
  87. package/dist/solution/VenueBooking/index.js +3519 -0
  88. package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  89. package/dist/solution/VenueBooking/types.d.ts +154 -0
  90. package/dist/solution/VenueBooking/types.js +21 -0
  91. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +11 -0
  92. package/dist/solution/VenueBooking/utils/dateSummary.js +104 -0
  93. package/dist/solution/VenueBooking/utils/resource.d.ts +14 -0
  94. package/dist/solution/VenueBooking/utils/resource.js +131 -0
  95. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +38 -0
  96. package/dist/solution/VenueBooking/utils/slotMerge.js +239 -0
  97. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  98. package/dist/solution/VenueBooking/utils/timeSlot.js +453 -0
  99. package/dist/solution/VenueBooking/utils.d.ts +1 -0
  100. package/dist/solution/VenueBooking/utils.js +1 -0
  101. package/dist/solution/index.d.ts +2 -0
  102. package/dist/solution/index.js +3 -1
  103. package/lib/apis/picoding.d.ts +0 -0
  104. package/lib/apis/picoding.js +0 -0
  105. package/lib/index.d.ts +0 -1
  106. package/lib/index.js +1 -3
  107. package/lib/model/strategy/adapter/promotion/evaluator.js +8 -57
  108. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +0 -2
  109. package/lib/model/strategy/adapter/walletPass/evaluator.js +3 -34
  110. package/lib/model/strategy/adapter/walletPass/locales.js +3 -12
  111. package/lib/model/strategy/engine.d.ts +5 -18
  112. package/lib/model/strategy/engine.js +21 -85
  113. package/lib/model/strategy/type.d.ts +0 -17
  114. package/lib/modules/Cart/types.d.ts +0 -2
  115. package/lib/modules/Cart/utils/cartProduct.js +12 -39
  116. package/lib/modules/Cart/utils/changePrice.js +13 -9
  117. package/lib/modules/Discount/index.d.ts +9 -3
  118. package/lib/modules/Discount/index.js +65 -4
  119. package/lib/modules/Discount/types.d.ts +9 -18
  120. package/lib/modules/OpenData/index.d.ts +24 -0
  121. package/lib/modules/OpenData/index.js +119 -0
  122. package/lib/modules/OpenData/types.d.ts +73 -0
  123. package/lib/modules/OpenData/types.js +17 -0
  124. package/lib/modules/OpenData/utils.d.ts +2 -0
  125. package/lib/modules/OpenData/utils.js +111 -0
  126. package/lib/modules/Order/index.d.ts +66 -1
  127. package/lib/modules/Order/index.js +515 -1
  128. package/lib/modules/Order/types.d.ts +174 -12
  129. package/lib/modules/Order/utils.d.ts +118 -0
  130. package/lib/modules/Order/utils.js +483 -2
  131. package/lib/modules/Payment/index.d.ts +1 -2
  132. package/lib/modules/Payment/index.js +0 -1
  133. package/lib/modules/Payment/utils.js +0 -3
  134. package/lib/modules/Payment/walletpass.d.ts +0 -23
  135. package/lib/modules/Payment/walletpass.js +17 -94
  136. package/lib/modules/Product/utils.js +2 -2
  137. package/lib/modules/ProductList/index.d.ts +1 -1
  138. package/lib/modules/ProductList/index.js +5 -4
  139. package/lib/modules/Quotation/index.d.ts +48 -0
  140. package/lib/modules/Quotation/index.js +152 -0
  141. package/lib/modules/Quotation/types.d.ts +42 -0
  142. package/lib/modules/Quotation/types.js +17 -0
  143. package/lib/modules/Rules/index.d.ts +5 -9
  144. package/lib/modules/Rules/index.js +292 -776
  145. package/lib/modules/Rules/types.d.ts +0 -2
  146. package/lib/modules/SalesSummary/index.d.ts +63 -0
  147. package/lib/modules/SalesSummary/index.js +105 -0
  148. package/lib/modules/SalesSummary/types.d.ts +60 -0
  149. package/lib/modules/SalesSummary/types.js +17 -0
  150. package/lib/modules/SalesSummary/utils.d.ts +30 -0
  151. package/lib/modules/SalesSummary/utils.js +420 -0
  152. package/lib/modules/ScanOrderLogger/index.d.ts +23 -0
  153. package/lib/modules/ScanOrderLogger/index.js +147 -0
  154. package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  155. package/lib/modules/ScanOrderLogger/providers/feishu.js +157 -0
  156. package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  157. package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
  158. package/lib/modules/ScanOrderLogger/types.d.ts +53 -0
  159. package/lib/modules/ScanOrderLogger/types.js +17 -0
  160. package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
  161. package/lib/modules/Schedule/utils.d.ts +1 -1
  162. package/lib/modules/Summary/types.d.ts +0 -2
  163. package/lib/modules/Summary/utils.d.ts +3 -9
  164. package/lib/modules/Summary/utils.js +45 -34
  165. package/lib/modules/index.d.ts +4 -0
  166. package/lib/modules/index.js +9 -1
  167. package/lib/plugins/window.d.ts +0 -2
  168. package/lib/solution/BookingByStep/index.d.ts +3 -4
  169. package/lib/solution/BookingByStep/index.js +6 -4
  170. package/lib/solution/BookingByStep/types.d.ts +3 -1
  171. package/lib/solution/BookingByStep/types.js +10 -0
  172. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  173. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  174. package/lib/solution/Checkout/index.js +0 -2
  175. package/lib/solution/ScanOrder/index.d.ts +158 -0
  176. package/lib/solution/ScanOrder/index.js +2135 -0
  177. package/lib/solution/ScanOrder/types.d.ts +306 -0
  178. package/lib/solution/ScanOrder/types.js +36 -0
  179. package/lib/solution/ScanOrder/utils.d.ts +172 -0
  180. package/lib/solution/ScanOrder/utils.js +658 -0
  181. package/lib/solution/ShopDiscount/index.d.ts +3 -2
  182. package/lib/solution/ShopDiscount/index.js +19 -25
  183. package/lib/solution/ShopDiscount/types.d.ts +1 -1
  184. package/lib/solution/ShopDiscount/utils.js +6 -10
  185. package/lib/solution/VenueBooking/index.d.ts +206 -0
  186. package/lib/solution/VenueBooking/index.js +1955 -0
  187. package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  188. package/lib/solution/VenueBooking/types.d.ts +154 -0
  189. package/lib/solution/VenueBooking/types.js +44 -0
  190. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +11 -0
  191. package/lib/solution/VenueBooking/utils/dateSummary.js +110 -0
  192. package/lib/solution/VenueBooking/utils/resource.d.ts +14 -0
  193. package/lib/solution/VenueBooking/utils/resource.js +92 -0
  194. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +38 -0
  195. package/lib/solution/VenueBooking/utils/slotMerge.js +237 -0
  196. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  197. package/lib/solution/VenueBooking/utils/timeSlot.js +339 -0
  198. package/lib/solution/VenueBooking/utils.d.ts +1 -0
  199. package/lib/solution/VenueBooking/utils.js +69 -0
  200. package/lib/solution/index.d.ts +2 -0
  201. package/lib/solution/index.js +5 -1
  202. package/package.json +1 -1
@@ -50,7 +50,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
50
50
  this.core = core;
51
51
  this.hooks = options == null ? void 0 : options.hooks;
52
52
  this.store = options == null ? void 0 : options.store;
53
- this.window = core.getPlugin("window");
54
53
  }
55
54
  async setRulesList(rulesList) {
56
55
  this.store.rulesList = rulesList;
@@ -72,16 +71,11 @@ var RulesModule = class extends import_BaseModule.BaseModule {
72
71
  return false;
73
72
  return (productHolderId || orderHolderId) === discount.holder.holder_id;
74
73
  }
75
- getWalletPassEvaluator() {
76
- var _a, _b;
77
- return (_b = (_a = this.window).getWalletPassEvaluator) == null ? void 0 : _b.call(_a);
78
- }
79
74
  // 判断discountList 是否可以对当前productList生效
80
75
  isDiscountListAvailable({
81
76
  oldDiscountList,
82
77
  newDiscountList,
83
78
  productList,
84
- orderTotalAmount,
85
79
  holders,
86
80
  isFormSubject
87
81
  }) {
@@ -114,7 +108,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
114
108
  const result = this.calcDiscount({
115
109
  discountList: mergedDiscountList,
116
110
  productList: [...productList],
117
- orderTotalAmount,
118
111
  holders,
119
112
  isFormSubject
120
113
  }, {
@@ -190,8 +183,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
190
183
  discountList,
191
184
  productList,
192
185
  holders,
193
- isFormSubject,
194
- orderTotalAmount
186
+ isFormSubject
195
187
  }, options) {
196
188
  const editModeDiscount = [];
197
189
  const addModeDiscount = [];
@@ -370,63 +362,12 @@ var RulesModule = class extends import_BaseModule.BaseModule {
370
362
  }
371
363
  return priceB.minus(priceA).toNumber();
372
364
  });
373
- const evaluator = this.getWalletPassEvaluator();
374
- if (evaluator) {
375
- addModeDiscount.forEach((discount) => {
376
- var _a, _b;
377
- const discountType = discount.tag || discount.type;
378
- if (["good_pass", "discount_card", "product_discount_card"].includes(
379
- discountType
380
- )) {
381
- const voucher = {
382
- id: discount.id,
383
- amount: Number(discount.par_value || 0),
384
- balance: Number(discount.balance || 0),
385
- type: discountType,
386
- product_id: discount.product_id,
387
- unified_available_status: 1,
388
- available_product_type: (_a = discount.limited_relation_product_data) == null ? void 0 : _a.type,
389
- available_product_ids: (_b = discount.limited_relation_product_data) == null ? void 0 : _b.product_ids
390
- };
391
- const productsForEvaluate = sortedFlattenedList.map((item) => {
392
- var _a2;
393
- return {
394
- product_id: item.id,
395
- price: item.price || 0,
396
- quantity: item.quantity || item.num || 1,
397
- selling_price: item.price || 0,
398
- product_options: item.type === "main" ? (_a2 = item.product) == null ? void 0 : _a2.options : void 0
399
- };
400
- });
401
- const result = evaluator.checkVoucherAvailability({
402
- orderTotalAmount,
403
- products: productsForEvaluate,
404
- vouchers: [voucher]
405
- });
406
- if (result.isAvailable) {
407
- discount.config = {
408
- ...result.config,
409
- isAvailable: true
410
- };
411
- } else {
412
- discount.config = {
413
- isAvailable: false
414
- };
415
- }
416
- }
417
- });
418
- }
365
+ const isProductIncludedByLimitedData = (limitedData, productId) => {
366
+ const excludedIds = (limitedData == null ? void 0 : limitedData.exclude_product_ids) || [];
367
+ const isExcluded = (limitedData == null ? void 0 : limitedData.filter) === 1 && excludedIds.some((id) => String(id) === String(productId));
368
+ return !isExcluded;
369
+ };
419
370
  const usedDiscounts = /* @__PURE__ */ new Map();
420
- const usedProductIdCounts = /* @__PURE__ */ new Map();
421
- const usedDiscountCardLimitCounts = /* @__PURE__ */ new Map();
422
- editModeDiscount.forEach((discount) => {
423
- var _a;
424
- const discountType = discount.tag || discount.type;
425
- if (["discount_card", "product_discount_card"].includes(discountType)) {
426
- const currentCount = usedDiscountCardLimitCounts.get(discount.id) || 0;
427
- usedDiscountCardLimitCounts.set(discount.id, currentCount + (((_a = discount.metadata) == null ? void 0 : _a.num) || 1));
428
- }
429
- });
430
371
  const discountApplicability = /* @__PURE__ */ new Map();
431
372
  const discountApplicableProducts = /* @__PURE__ */ new Map();
432
373
  addModeDiscount.forEach((discount) => {
@@ -566,7 +507,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
566
507
  originProduct = flatItem.originProduct;
567
508
  } else {
568
509
  product = {
569
- startDate: (_a = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _a.startDate,
570
510
  _id: flatItem._id,
571
511
  id: flatItem.id,
572
512
  price: flatItem.price,
@@ -575,12 +515,13 @@ var RulesModule = class extends import_BaseModule.BaseModule {
575
515
  total: flatItem.total,
576
516
  origin_total: flatItem.origin_total,
577
517
  booking_id: flatItem.booking_id,
578
- discount_list: flatItem.discount_list || []
518
+ discount_list: flatItem.discount_list || [],
519
+ startDate: (_a = flatItem.parentProduct) == null ? void 0 : _a.startDate
579
520
  };
580
521
  originProduct = flatItem.originProduct;
581
522
  }
582
523
  addModeDiscount.forEach((discount) => {
583
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j;
524
+ var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
584
525
  const limitedData = discount == null ? void 0 : discount.limited_relation_product_data;
585
526
  const _tempVar = (flatItem == null ? void 0 : flatItem.type) === "bundle" ? flatItem == null ? void 0 : flatItem.parentProduct : flatItem == null ? void 0 : flatItem.product;
586
527
  const isHolderMatch = this.checkHolderMatch(
@@ -593,7 +534,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
593
534
  );
594
535
  let timeLimit = true;
595
536
  timeLimit = !!(0, import_utils.filterDiscountListByBookingTime)([discount], ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format("YYYY-MM-DD HH:mm:ss")).length;
596
- const isLimitedProduct = (limitedData.type === "product_all" && limitedData.filter !== 1 || limitedData.type === "product_all" && limitedData.filter === 1 && !limitedData.exclude_product_ids.includes(product.id) || limitedData.product_ids && limitedData.product_ids.includes(product.id)) && isHolderMatch;
537
+ const isLimitedProduct = (limitedData.type === "product_all" || limitedData.product_ids && limitedData.product_ids.includes(product.id)) && isHolderMatch;
597
538
  const isAvailableProduct = flatItem.type === "main" ? !((product == null ? void 0 : product.booking_id) && ((_a2 = product == null ? void 0 : product.discount_list) == null ? void 0 : _a2.length) && ((_b = product == null ? void 0 : product.discount_list) == null ? void 0 : _b.every(
598
539
  (discount2) => discount2.id && [
599
540
  "good_pass",
@@ -602,8 +543,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
602
543
  ].includes(discount2.tag || discount2.type)
603
544
  ))) : !((flatItem == null ? void 0 : flatItem.booking_id) && !!((_d = (_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.discount_list) == null ? void 0 : _d.length) && ((_f = (_e = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _e.discount_list) == null ? void 0 : _f.every((discount2) => discount2.id)));
604
545
  const isBundleAvailable = this.checkPackageSubItemUsageRules(discount, flatItem);
605
- if (isAvailableProduct && isLimitedProduct && timeLimit && isBundleAvailable && ((_g = discount.config) == null ? void 0 : _g.isAvailable)) {
606
- (_h = discountApplicability.get(discount.id)) == null ? void 0 : _h.push(product.id);
546
+ if (isAvailableProduct && isLimitedProduct && timeLimit && isBundleAvailable) {
547
+ (_g = discountApplicability.get(discount.id)) == null ? void 0 : _g.push(product.id);
607
548
  const applicableProducts = discountApplicableProducts.get(discount.id) || [];
608
549
  const discountType = discount.tag || discount.type;
609
550
  const isGoodPass = discountType === "good_pass";
@@ -613,15 +554,14 @@ var RulesModule = class extends import_BaseModule.BaseModule {
613
554
  type: discountType,
614
555
  tag: discountType,
615
556
  discount: {
616
- discount_card_type: (_i = discount == null ? void 0 : discount.metadata) == null ? void 0 : _i.discount_card_type,
557
+ discount_card_type: (_h = discount == null ? void 0 : discount.metadata) == null ? void 0 : _h.discount_card_type,
617
558
  fixed_amount: product.price,
618
- discount_calculation_mode: (_j = discount == null ? void 0 : discount.metadata) == null ? void 0 : _j.discount_calculation_mode,
559
+ discount_calculation_mode: (_i = discount == null ? void 0 : discount.metadata) == null ? void 0 : _i.discount_calculation_mode,
619
560
  resource_id: discount.id,
620
561
  title: discount.format_title,
621
562
  original_amount: product.price || product.origin_total,
622
563
  pre_value: discount.par_value,
623
- product_id: originProduct.id,
624
- discount_product_id: discount.product_id
564
+ product_id: originProduct.id
625
565
  },
626
566
  metadata: {
627
567
  num,
@@ -634,102 +574,44 @@ var RulesModule = class extends import_BaseModule.BaseModule {
634
574
  });
635
575
  });
636
576
  const processedFlatItemsMap = /* @__PURE__ */ new Map();
637
- const applyDiscountToOptions = (options2, discount) => {
638
- if (!(options2 == null ? void 0 : options2.length))
639
- return { discountedOptions: options2, optionDiscountAmount: 0 };
640
- let optionDiscountAmount = 0;
641
- const discountedOptions = options2.map((option) => {
642
- const rawUnit = option._original_price ?? option._original_add_price ?? option.price ?? option.add_price;
643
- const baseUnitNum = Number(rawUnit ?? 0);
644
- if (baseUnitNum <= 0)
645
- return option;
646
- const discountedPrice = (0, import_utils.getDiscountAmount)(discount, baseUnitNum, baseUnitNum);
647
- const optQty = Number(option.num ?? option.quantity ?? 1);
648
- optionDiscountAmount = new import_decimal.default(optionDiscountAmount).plus(new import_decimal.default(baseUnitNum).minus(discountedPrice).mul(optQty)).toNumber();
649
- const { _original_add_price, ...rest } = option;
650
- const tmpl = rest.price ?? rest.add_price;
651
- const nextPrice = typeof tmpl === "string" ? String(discountedPrice) : discountedPrice;
652
- return {
653
- ...rest,
654
- _original_price: option._original_price ?? (_original_add_price !== void 0 ? _original_add_price : rawUnit),
655
- price: nextPrice
656
- };
657
- });
658
- return { discountedOptions, optionDiscountAmount };
659
- };
660
- const restoreOptionPrices = (options2) => {
661
- if (!(options2 == null ? void 0 : options2.length))
662
- return options2;
663
- return options2.map((option) => {
664
- const orig = option._original_price !== void 0 ? option._original_price : option._original_add_price;
665
- if (orig !== void 0) {
666
- const { _original_price, _original_add_price, ...rest } = option;
667
- return { ...rest, price: orig };
668
- }
669
- return option;
670
- });
671
- };
672
- const getOptionTotal = (options2) => {
673
- if (!(options2 == null ? void 0 : options2.length))
674
- return 0;
675
- return options2.reduce((sum, opt) => {
676
- const unit = Number(opt.price ?? opt.add_price ?? 0);
677
- const n = Number(opt.num ?? opt.quantity ?? 1);
678
- return new import_decimal.default(sum).plus(new import_decimal.default(unit).mul(n)).toNumber();
679
- }, 0);
680
- };
681
577
  sortedFlattenedList.forEach((flatItem, index) => {
682
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M;
578
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C;
683
579
  let product, originProduct;
684
580
  if (flatItem.type === "main") {
685
581
  product = flatItem.product;
686
582
  originProduct = flatItem.originProduct;
687
583
  } else {
688
584
  product = {
689
- startDate: (_a = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _a.startDate,
690
585
  _id: flatItem._id,
691
586
  id: flatItem.id,
692
587
  price: flatItem.price,
693
588
  quantity: flatItem.quantity,
694
589
  num: flatItem.num,
695
590
  total: flatItem.total,
696
- original_price: (_b = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _b.original_price,
697
- origin_total: (_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.original_price,
591
+ original_price: (_a = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _a.original_price,
592
+ origin_total: (_b = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _b.original_price,
698
593
  booking_id: flatItem.booking_id,
699
- discount_list: ((_d = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _d.discount_list) || []
594
+ discount_list: ((_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.discount_list) || [],
595
+ startDate: (_d = flatItem.parentProduct) == null ? void 0 : _d.startDate
700
596
  };
701
597
  originProduct = flatItem.originProduct;
702
598
  }
703
- if ((product == null ? void 0 : product.booking_id) && ((_e = product.discount_list) == null ? void 0 : _e.length) && ((_f = product == null ? void 0 : product.discount_list) == null ? void 0 : _f.every(
704
- (discount) => discount.id && ["good_pass", "discount_card", "product_discount_card"].includes(
705
- discount.tag || discount.type
706
- )
707
- ))) {
599
+ if ((product == null ? void 0 : product.booking_id) && ((_e = product.discount_list) == null ? void 0 : _e.length) && ((_f = product == null ? void 0 : product.discount_list) == null ? void 0 : _f.every((discount) => discount.id && ["good_pass", "discount_card", "product_discount_card"].includes(discount.tag || discount.type)))) {
708
600
  if (flatItem.type === "main") {
709
601
  processedProductsMap.set(product._id, [originProduct]);
710
602
  } else {
711
- processedFlatItemsMap.set(flatItem._id, [
712
- {
713
- ...flatItem,
714
- processed: true
715
- }
716
- ]);
603
+ processedFlatItemsMap.set(flatItem._id, [{
604
+ ...flatItem,
605
+ processed: true
606
+ }]);
717
607
  }
718
608
  return;
719
609
  }
720
610
  const applicableDiscounts = sortedDiscountList.filter((discount) => {
721
- var _a2, _b2, _c2, _d2, _e2;
722
- const discountType2 = discount.tag || discount.type;
723
- if (["good_pass", "discount_card", "product_discount_card"].includes(
724
- discountType2
725
- )) {
726
- if (discount.config === void 0 || !((_a2 = discount == null ? void 0 : discount.config) == null ? void 0 : _a2.isAvailable)) {
727
- return false;
728
- }
729
- }
730
- if ((Number(product.price) <= 0 || !product.price) && !((_b2 = product.discount_list) == null ? void 0 : _b2.length) && (discount.tag || discount.type) === "good_pass")
611
+ var _a2, _b2;
612
+ if ((Number(product.price) <= 0 || !product.price) && !((_a2 = product.discount_list) == null ? void 0 : _a2.length) && (discount.tag || discount.type) === "good_pass")
731
613
  return false;
732
- if ((Number(product.total) <= 0 || !product.total) && !((_c2 = product.discount_list) == null ? void 0 : _c2.find((n) => {
614
+ if ((Number(product.price) <= 0 || !product.price) && !((_b2 = product.discount_list) == null ? void 0 : _b2.find((n) => {
733
615
  var _a3;
734
616
  return ((_a3 = n.discount) == null ? void 0 : _a3.resource_id) === discount.id;
735
617
  })) && (discount.tag || discount.type) !== "good_pass")
@@ -737,25 +619,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
737
619
  const targetUsedDiscounts = usedDiscounts.get(discount.id);
738
620
  if (targetUsedDiscounts && (discount.tag || discount.type) === "good_pass")
739
621
  return false;
740
- if ((discount.tag || discount.type) === "good_pass") {
741
- const maxUsagePerOrder = (_d2 = discount.config) == null ? void 0 : _d2.maxUsagePerOrder;
742
- if (maxUsagePerOrder && maxUsagePerOrder > 0) {
743
- const currentUsedCount = usedProductIdCounts.get(discount.product_id) || 0;
744
- if (currentUsedCount >= maxUsagePerOrder) {
745
- return false;
746
- }
747
- }
748
- }
749
- const discountTypeForLimit = discount.tag || discount.type;
750
- if (["discount_card", "product_discount_card"].includes(discountTypeForLimit)) {
751
- const applicableProductLimitConfig = ((_e2 = discount.config) == null ? void 0 : _e2.applicableProductLimit) || 0;
752
- if (applicableProductLimitConfig > 0) {
753
- const currentUsedLimitCount = usedDiscountCardLimitCounts.get(discount.id) || 0;
754
- if (currentUsedLimitCount >= applicableProductLimitConfig) {
755
- return false;
756
- }
757
- }
758
- }
759
622
  const limitedData = discount.limited_relation_product_data;
760
623
  const _tempVar = (flatItem == null ? void 0 : flatItem.type) === "bundle" ? flatItem == null ? void 0 : flatItem.parentProduct : flatItem == null ? void 0 : flatItem.product;
761
624
  const isHolderMatch = this.checkHolderMatch(
@@ -774,7 +637,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
774
637
  return false;
775
638
  }
776
639
  if (limitedData.type === "product_all") {
777
- if (limitedData.filter === 1 && limitedData.exclude_product_ids.includes(product.id)) {
640
+ if (!isProductIncludedByLimitedData(limitedData, product.id)) {
778
641
  return false;
779
642
  }
780
643
  if (!this.checkPackageSubItemUsageRules(discount, flatItem)) {
@@ -789,36 +652,21 @@ var RulesModule = class extends import_BaseModule.BaseModule {
789
652
  }
790
653
  return false;
791
654
  });
792
- const selectedDiscountCard = applicableDiscounts.find(
793
- (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
794
- );
655
+ const selectedDiscountCard = applicableDiscounts.find((n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass");
795
656
  const selectedDiscount = selectedDiscountCard || applicableDiscounts[0];
796
657
  let isManualDiscount = false;
797
658
  if (flatItem.type === "main") {
798
- isManualDiscount = typeof product.isManualDiscount === "boolean" ? product.isManualDiscount : product.total != product.origin_total && (product.bundle || []).every(
799
- (item) => {
800
- var _a2;
801
- return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
802
- }
803
- ) && (!((_g = product.discount_list) == null ? void 0 : _g.length) || ((_i = (_h = product == null ? void 0 : product.discount_list) == null ? void 0 : _h.every) == null ? void 0 : _i.call(
804
- _h,
805
- (item) => item.type === "product"
806
- )));
807
- if (product.inPromotion) {
808
- isManualDiscount = false;
809
- }
659
+ isManualDiscount = typeof product.isManualDiscount === "boolean" ? product.isManualDiscount : product.total != product.origin_total && (product.bundle || []).every((item) => {
660
+ var _a2;
661
+ return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
662
+ }) && (!((_g = product.discount_list) == null ? void 0 : _g.length) || ((_i = (_h = product == null ? void 0 : product.discount_list) == null ? void 0 : _h.every) == null ? void 0 : _i.call(_h, (item) => item.type === "product")));
810
663
  } else {
811
664
  const parentProduct = flatItem.parentProduct;
812
665
  if (parentProduct) {
813
- isManualDiscount = typeof parentProduct.isManualDiscount === "boolean" ? parentProduct.isManualDiscount : parentProduct.total != parentProduct.origin_total && (parentProduct.bundle || []).every(
814
- (item) => {
815
- var _a2;
816
- return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
817
- }
818
- ) && (!((_j = parentProduct.discount_list) == null ? void 0 : _j.length) || ((_l = (_k = parentProduct == null ? void 0 : parentProduct.discount_list) == null ? void 0 : _k.every) == null ? void 0 : _l.call(
819
- _k,
820
- (item) => item.type === "product"
821
- )));
666
+ isManualDiscount = typeof parentProduct.isManualDiscount === "boolean" ? parentProduct.isManualDiscount : parentProduct.total != parentProduct.origin_total && (parentProduct.bundle || []).every((item) => {
667
+ var _a2;
668
+ return !((_a2 = item.discount_list || []) == null ? void 0 : _a2.length);
669
+ }) && (!((_j = parentProduct.discount_list) == null ? void 0 : _j.length) || ((_l = (_k = parentProduct == null ? void 0 : parentProduct.discount_list) == null ? void 0 : _k.every) == null ? void 0 : _l.call(_k, (item) => item.type === "product")));
822
670
  }
823
671
  }
824
672
  if (options == null ? void 0 : options.discountId) {
@@ -870,17 +718,17 @@ var RulesModule = class extends import_BaseModule.BaseModule {
870
718
  }
871
719
  if (applicableDiscounts.length === 0 || isManualDiscount || (0, import_lodash_es.isBoolean)(product.vouchersApplicable) && !product.vouchersApplicable) {
872
720
  if (flatItem.type === "main") {
873
- const restoredOptions = restoreOptionPrices(product.options);
874
721
  if (product.isClient) {
875
- processedProductsMap.set(product._id, [
876
- this.hooks.setProduct(originProduct, {
722
+ processedProductsMap.set(
723
+ product._id,
724
+ [this.hooks.setProduct(originProduct, {
877
725
  ...isManualDiscount ? {} : {
878
726
  origin_total: (0, import_utils2.getProductOriginTotalPrice)({
879
727
  product: {
880
728
  original_price: product.original_price
881
729
  },
882
730
  bundle: product.bundle,
883
- options: restoredOptions
731
+ options: product.options
884
732
  }),
885
733
  variant: originProduct._productInit.variant,
886
734
  original_price: originProduct._productInit.original_price,
@@ -889,14 +737,14 @@ var RulesModule = class extends import_BaseModule.BaseModule {
889
737
  price: product.price
890
738
  },
891
739
  bundle: product.bundle,
892
- options: restoredOptions
740
+ options: product.options
893
741
  }),
894
742
  price: product.price,
895
- options: restoredOptions
743
+ options: product.options
896
744
  },
897
745
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
898
- })
899
- ]);
746
+ })]
747
+ );
900
748
  } else {
901
749
  let total = product.inPromotion ? ((_u = product == null ? void 0 : product._promotion) == null ? void 0 : _u.finalPrice) ?? product.origin_total ?? product.total : product.origin_total ?? product.total;
902
750
  let main_product_selling_price = product.price ?? product.main_product_selling_price;
@@ -906,20 +754,19 @@ var RulesModule = class extends import_BaseModule.BaseModule {
906
754
  }
907
755
  processedProductsMap.set(
908
756
  product._id,
909
- [
910
- this.hooks.setProduct(originProduct, {
911
- ...isManualDiscount ? {
912
- price: product.price
913
- } : {
914
- _id: product._id.split("___")[0] + "___" + index,
915
- total,
916
- price: product.price,
917
- main_product_selling_price,
918
- options: restoredOptions
919
- },
920
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
921
- })
922
- ]
757
+ [this.hooks.setProduct(originProduct, {
758
+ ...isManualDiscount ? {
759
+ price: product.price
760
+ } : {
761
+ _id: product._id.split("___")[0] + "___" + index,
762
+ origin_total: product.origin_total,
763
+ total,
764
+ original_price: product.original_price,
765
+ price: product.price,
766
+ main_product_selling_price
767
+ },
768
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion")
769
+ })]
923
770
  );
924
771
  }
925
772
  } else {
@@ -935,166 +782,104 @@ var RulesModule = class extends import_BaseModule.BaseModule {
935
782
  if (applicableDiscounts.length && product.booking_id && typeof selectedDiscount.isManualSelect === "undefined" && !(options == null ? void 0 : options.scan) && !isEditModeAddNewProduct) {
936
783
  return;
937
784
  }
938
- const discountType = selectedDiscount.tag || selectedDiscount.type;
939
- const isGoodPass = discountType === "good_pass";
940
- const isDiscountCard = ["discount_card", "product_discount_card"].includes(discountType);
941
- const applicableProductLimit = ((_w = selectedDiscount.config) == null ? void 0 : _w.applicableProductLimit) || 0;
942
- const isNeedSplit = isGoodPass || isDiscountCard && applicableProductLimit > 0;
785
+ const isNeedSplit = (selectedDiscount.tag || selectedDiscount.type) === "good_pass";
943
786
  const totalQuantity = product.quantity || product.num || 1;
944
- const availableGoodPassCount = applicableDiscounts.filter(
945
- (item) => (item.tag || item.type) === "good_pass"
946
- ).length;
947
- let maxUsageLimit;
948
- if (isGoodPass) {
949
- maxUsageLimit = availableGoodPassCount;
950
- if (selectedDiscount.config && selectedDiscount.config.maxUsagePerOrder) {
951
- maxUsageLimit = Math.min(
952
- availableGoodPassCount,
953
- selectedDiscount.config.maxUsagePerOrder
954
- );
955
- }
956
- } else if (isDiscountCard && applicableProductLimit > 0) {
957
- const usedLimitCount = usedDiscountCardLimitCounts.get(selectedDiscount.id) || 0;
958
- maxUsageLimit = Math.max(0, applicableProductLimit - usedLimitCount);
959
- } else {
960
- maxUsageLimit = 1;
961
- }
962
- const splitCount = isNeedSplit ? Math.min(product.quantity || product.num || 1, maxUsageLimit) : 1;
787
+ const availableGoodPassCount = applicableDiscounts.filter((item) => (item.tag || item.type) === "good_pass").length;
788
+ const splitCount = isNeedSplit ? Math.min(totalQuantity, availableGoodPassCount) : 1;
963
789
  const arr = [];
964
790
  if (flatItem.type === "main") {
965
791
  if (splitCount < totalQuantity && isNeedSplit) {
966
- let total = product.origin_total ?? product.total;
967
- if ((product.discount_list || []).some((item) => item.type === "promotion")) {
968
- total = product.total ?? product.origin_total;
969
- }
970
- arr.push(
971
- this.hooks.setProduct(originProduct, {
972
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
973
- quantity: totalQuantity - splitCount,
974
- _id: product._id.split("___")[0],
975
- total
976
- })
977
- );
792
+ arr.push(this.hooks.setProduct(originProduct, {
793
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
794
+ quantity: totalQuantity - splitCount,
795
+ _id: product._id.split("___")[0]
796
+ }));
978
797
  }
979
798
  for (let i = 0; i < splitCount; i++) {
980
- const currentSelectedDiscount = isGoodPass ? selectedDiscountCard || applicableDiscounts[i] : selectedDiscountCard || applicableDiscounts[0];
981
- usedDiscounts.set(currentSelectedDiscount.id, true);
982
- if ((currentSelectedDiscount.tag || currentSelectedDiscount.type) === "good_pass") {
983
- const currentCount = usedProductIdCounts.get(currentSelectedDiscount.product_id) || 0;
984
- usedProductIdCounts.set(currentSelectedDiscount.product_id, currentCount + 1);
985
- }
986
- const currentDiscountTypeForCount = currentSelectedDiscount.tag || currentSelectedDiscount.type;
987
- if (["discount_card", "product_discount_card"].includes(currentDiscountTypeForCount)) {
988
- const currentLimitCount = usedDiscountCardLimitCounts.get(currentSelectedDiscount.id) || 0;
989
- usedDiscountCardLimitCounts.set(currentSelectedDiscount.id, currentLimitCount + 1);
990
- }
991
- const appliedProducts = appliedDiscountProducts.get(currentSelectedDiscount.id) || [];
799
+ const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[i];
800
+ usedDiscounts.set(selectedDiscount2.id, true);
801
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
992
802
  let productOriginTotal = product.origin_total || product.total || 0;
993
803
  if (this.filterDiscountListByType(product.discount_list, "promotion").length && product.origin_total) {
994
804
  productOriginTotal = product.origin_total;
995
805
  }
996
- if (Number(((_x = originProduct == null ? void 0 : originProduct._productInit) == null ? void 0 : _x.original_price) || 0) > 0 && product.origin_total && product.total && product.origin_total !== product.total) {
806
+ if (Number(((_w = originProduct == null ? void 0 : originProduct._productInit) == null ? void 0 : _w.original_price) || 0) > 0 && product.origin_total && product.total && product.origin_total !== product.total) {
997
807
  productOriginTotal = product.total;
998
808
  }
999
- const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount);
1000
- const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount.id) : null;
809
+ const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount2);
810
+ const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount2.id) : null;
1001
811
  const productAllocation = orderLevelAllocation == null ? void 0 : orderLevelAllocation.get(flatItem._id);
1002
- const isDeductOptionPrice = !!((_y = selectedDiscount.config) == null ? void 0 : _y.deductOptionPrice);
1003
- let mainProductSellingPrice;
812
+ let targetProductTotal;
1004
813
  let amount;
1005
814
  let productDiscountDifference;
1006
- let discountedOptions = product.options;
1007
- let optionDiscountAmount = 0;
1008
815
  if (isOrderLevel && productAllocation) {
1009
816
  amount = productAllocation.discountAmount;
1010
817
  productDiscountDifference = productAllocation.difference;
1011
- mainProductSellingPrice = Math.max(new import_decimal.default(product.price).minus(amount).toNumber(), 0);
818
+ targetProductTotal = Math.max(new import_decimal.default(product.price).minus(amount).toNumber(), 0);
1012
819
  } else {
1013
- mainProductSellingPrice = (0, import_utils.getDiscountAmount)(
1014
- currentSelectedDiscount,
1015
- product.price,
1016
- product.price
1017
- );
1018
- amount = new import_decimal.default(product.price).minus(new import_decimal.default(mainProductSellingPrice)).toNumber();
1019
- }
1020
- if (isDeductOptionPrice && ((_z = product.options) == null ? void 0 : _z.length)) {
1021
- const optionResult = applyDiscountToOptions(
1022
- product.options,
1023
- currentSelectedDiscount
1024
- );
1025
- discountedOptions = optionResult.discountedOptions;
1026
- optionDiscountAmount = optionResult.optionDiscountAmount;
820
+ targetProductTotal = (0, import_utils.getDiscountAmount)(selectedDiscount2, product.price, product.price);
821
+ amount = new import_decimal.default(product.price).minus(new import_decimal.default(targetProductTotal)).toNumber();
1027
822
  }
1028
- const optionsForLineTotal = isDeductOptionPrice && ((_A = product.options) == null ? void 0 : _A.length) ? discountedOptions : product.options;
1029
- const optionsLineTotal = getOptionTotal(optionsForLineTotal || []);
1030
- const total = new import_decimal.default(mainProductSellingPrice).plus(optionsLineTotal).toNumber();
1031
- const mainProductDiscountAmount = amount;
1032
- const lineDiscountAmount = new import_decimal.default(mainProductDiscountAmount).plus(optionDiscountAmount).toNumber();
1033
- const currentDiscountType = currentSelectedDiscount.tag === "product_discount_card" ? "discount_card" : currentSelectedDiscount.tag;
1034
- const discountType2 = selectedDiscount.tag || selectedDiscount.type;
1035
- const currentIsGoodPass = currentDiscountType === "good_pass";
823
+ const discountType = selectedDiscount2.tag || selectedDiscount2.type;
824
+ const isGoodPass = discountType === "good_pass";
1036
825
  const discountDetail = {
1037
- amount: lineDiscountAmount,
1038
- type: selectedDiscount.tag === "product_discount_card" ? "discount_card" : discountType2,
826
+ amount,
827
+ type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : discountType,
1039
828
  discount: {
1040
- discount_card_type: (_B = selectedDiscount == null ? void 0 : selectedDiscount.metadata) == null ? void 0 : _B.discount_card_type,
1041
- fixed_amount: lineDiscountAmount,
1042
- discount_calculation_mode: (_C = selectedDiscount == null ? void 0 : selectedDiscount.metadata) == null ? void 0 : _C.discount_calculation_mode,
1043
- resource_id: selectedDiscount.id,
1044
- title: selectedDiscount.format_title,
829
+ discount_card_type: (_x = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _x.discount_card_type,
830
+ fixed_amount: amount,
831
+ discount_calculation_mode: (_y = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _y.discount_calculation_mode,
832
+ resource_id: selectedDiscount2.id,
833
+ title: selectedDiscount2.format_title,
1045
834
  original_amount: product.price,
1046
835
  product_id: originProduct.id,
1047
- percent: currentSelectedDiscount.par_value,
1048
- discount_product_id: currentSelectedDiscount.product_id
836
+ percent: selectedDiscount2.par_value
1049
837
  },
1050
- // 前端使用的num数量,为了计算优惠金额(拆分时为1)
1051
- _num: isNeedSplit ? 1 : product.num,
1052
- config: currentSelectedDiscount == null ? void 0 : currentSelectedDiscount.config,
838
+ // 前端使用的num数量,为了计算优惠金额
839
+ _num: isGoodPass ? 1 : product.num,
1053
840
  metadata: {
1054
841
  num: 1,
1055
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
842
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1056
843
  // 🔥 order_level 分摊差值
1057
- ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference },
1058
- /** 仅主商品上的优惠金额(不含 option) */
1059
- mainProductDiscountAmount,
1060
- optionDiscountAmount
844
+ ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
1061
845
  }
1062
846
  };
1063
847
  appliedProducts.push(discountDetail);
1064
- appliedDiscountProducts.set(currentSelectedDiscount.id, appliedProducts);
848
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
849
+ let total = targetProductTotal;
850
+ if (product.options) {
851
+ total = product.options.reduce((accumulator, currentValue) => {
852
+ const currentPrice = new import_decimal.default(currentValue.price || 0);
853
+ const currentNum = new import_decimal.default(currentValue.num || 0);
854
+ return accumulator.add(currentPrice.mul(currentNum));
855
+ }, new import_decimal.default(total)).toNumber();
856
+ }
1065
857
  if (product.isClient) {
1066
- arr.push(
1067
- this.hooks.setProduct(originProduct, {
1068
- discount_list: [discountDetail],
1069
- // good_pass:主商品价以折后价为准;勿用 product.price - amount(amount 含 option 优惠时会算错)
1070
- price: currentIsGoodPass ? mainProductSellingPrice : product.price,
1071
- quantity: isNeedSplit ? 1 : product.quantity,
1072
- origin_total: (0, import_utils2.getProductOriginTotalPrice)({
1073
- product: {
1074
- original_price: product.original_price
1075
- },
1076
- bundle: product.bundle,
1077
- options: restoreOptionPrices(product.options)
1078
- }),
1079
- variant: originProduct._productInit.variant,
1080
- original_price: new import_decimal.default(product.price || 0).toNumber(),
1081
- total,
1082
- options: discountedOptions
1083
- })
1084
- );
858
+ arr.push(this.hooks.setProduct(originProduct, {
859
+ discount_list: [discountDetail],
860
+ price: selectedDiscount2.tag === "good_pass" ? 0 : product.price,
861
+ quantity: isNeedSplit ? 1 : product.quantity,
862
+ origin_total: (0, import_utils2.getProductOriginTotalPrice)({
863
+ product: {
864
+ original_price: product.original_price
865
+ },
866
+ bundle: product.bundle,
867
+ options: product.options
868
+ }),
869
+ variant: originProduct._productInit.variant,
870
+ original_price: new import_decimal.default(product.price || 0).toNumber(),
871
+ total
872
+ }));
1085
873
  } else {
1086
- arr.push(
1087
- this.hooks.setProduct(originProduct, {
1088
- discount_list: this.filterDiscountListByType(product.discount_list, "promotion").concat([discountDetail]),
1089
- _id: product._id.split("___")[0] + "___" + currentSelectedDiscount.id + "_" + i + "_" + index,
1090
- price: currentIsGoodPass ? 0 : product.price,
1091
- quantity: isNeedSplit ? 1 : product.quantity,
1092
- total,
1093
- origin_total: productOriginTotal,
1094
- main_product_selling_price: mainProductSellingPrice,
1095
- options: discountedOptions
1096
- })
1097
- );
874
+ arr.push(this.hooks.setProduct(originProduct, {
875
+ discount_list: this.filterDiscountListByType(product.discount_list, "promotion").concat([discountDetail]),
876
+ _id: product._id.split("___")[0] + "___" + selectedDiscount2.id + index,
877
+ price: selectedDiscount2.tag === "good_pass" ? 0 : product.price,
878
+ quantity: isNeedSplit ? 1 : product.quantity,
879
+ total,
880
+ origin_total: productOriginTotal,
881
+ main_product_selling_price: targetProductTotal
882
+ }));
1098
883
  }
1099
884
  }
1100
885
  processedProductsMap.set(product._id, arr);
@@ -1104,298 +889,62 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1104
889
  const discountNum = splitCount;
1105
890
  const normalNum = totalQuantity - discountNum;
1106
891
  for (let i = 0; i < discountNum; i++) {
1107
- const currentBundleDiscount = isGoodPass ? selectedDiscountCard || applicableDiscounts[i] : selectedDiscountCard || applicableDiscounts[0];
1108
- usedDiscounts.set(currentBundleDiscount.id, true);
1109
- if ((currentBundleDiscount.tag || currentBundleDiscount.type) === "good_pass") {
1110
- const currentCount = usedProductIdCounts.get(currentBundleDiscount.product_id) || 0;
1111
- usedProductIdCounts.set(currentBundleDiscount.product_id, currentCount + 1);
1112
- }
1113
- const bundleDiscountTypeForCount = currentBundleDiscount.tag || currentBundleDiscount.type;
1114
- if (["discount_card", "product_discount_card"].includes(bundleDiscountTypeForCount)) {
1115
- const currentBundleLimitCount = usedDiscountCardLimitCounts.get(currentBundleDiscount.id) || 0;
1116
- usedDiscountCardLimitCounts.set(currentBundleDiscount.id, currentBundleLimitCount + 1);
1117
- }
892
+ const selectedDiscount2 = applicableDiscounts[i];
893
+ usedDiscounts.set(selectedDiscount2.id, true);
1118
894
  const uniqueId = `${flatItem._id}_split_${i}`;
1119
- const discountedPrice = (0, import_utils.getDiscountAmount)(
1120
- currentBundleDiscount,
1121
- product.origin_total,
1122
- product.origin_total
1123
- );
1124
- const bundleDiscountAmount = new import_decimal.default(product.origin_total || 0).minus(discountedPrice).toNumber();
1125
- const bundleDiscountType = currentBundleDiscount.tag === "product_discount_card" ? "discount_card" : currentBundleDiscount.tag;
1126
895
  const discountDetail = {
1127
- amount: bundleDiscountAmount,
1128
- type: bundleDiscountType,
896
+ amount: product.origin_total,
897
+ type: "good_pass",
1129
898
  discount: {
1130
- discount_card_type: (_D = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _D.discount_card_type,
1131
- discount_calculation_mode: (_E = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _E.discount_calculation_mode,
1132
- fixed_amount: bundleDiscountAmount,
1133
- resource_id: currentBundleDiscount.id,
1134
- title: currentBundleDiscount.format_title,
899
+ fixed_amount: product.origin_total,
900
+ discount_calculation_mode: (_z = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _z.discount_calculation_mode,
901
+ resource_id: selectedDiscount2.id,
902
+ title: selectedDiscount2.format_title,
1135
903
  original_amount: product.origin_total,
1136
- product_id: product.id,
1137
- percent: currentBundleDiscount.par_value,
1138
- discount_product_id: currentBundleDiscount.product_id
904
+ product_id: product.id
1139
905
  },
1140
906
  metadata: {
1141
907
  // 🔥 使用拆分后的唯一 _id
1142
908
  custom_product_bundle_map_id: uniqueId,
1143
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
909
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1144
910
  num: 1
1145
911
  },
1146
- _num: 1,
1147
- config: currentBundleDiscount == null ? void 0 : currentBundleDiscount.config
912
+ _num: 1
1148
913
  };
1149
- const appliedProducts = appliedDiscountProducts.get(currentBundleDiscount.id) || [];
914
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
1150
915
  appliedProducts.push(discountDetail);
1151
- appliedDiscountProducts.set(currentBundleDiscount.id, appliedProducts);
916
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
1152
917
  processedItems.push({
1153
918
  ...flatItem,
1154
919
  // 🔥 使用唯一的 _id
1155
920
  _id: uniqueId,
1156
921
  num: 1,
1157
922
  quantity: 1,
1158
- price: discountedPrice,
1159
- // 折扣后的价格
1160
- total: discountedPrice,
923
+ price: 0,
924
+ // 商品券价格为0
925
+ total: 0,
1161
926
  discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion").concat([discountDetail]),
1162
927
  processed: true,
1163
- _discountId: currentBundleDiscount.id
928
+ _discountId: selectedDiscount2.id
1164
929
  });
1165
930
  }
1166
- let remainingNum = normalNum;
1167
- let continueSplitIndex = discountNum;
1168
- while (remainingNum > 0) {
1169
- const nextApplicableDiscounts = sortedDiscountList.filter((nextDiscount) => {
1170
- var _a2, _b2, _c2, _d2;
1171
- const nextDiscountType = nextDiscount.tag || nextDiscount.type;
1172
- if (["good_pass", "discount_card", "product_discount_card"].includes(nextDiscountType)) {
1173
- if (nextDiscount.config === void 0 || !((_a2 = nextDiscount == null ? void 0 : nextDiscount.config) == null ? void 0 : _a2.isAvailable)) {
1174
- return false;
1175
- }
1176
- }
1177
- if ((Number(product.total) <= 0 || !product.total) && !((_b2 = product.discount_list) == null ? void 0 : _b2.find(
1178
- (n) => {
1179
- var _a3;
1180
- return ((_a3 = n.discount) == null ? void 0 : _a3.resource_id) === nextDiscount.id;
1181
- }
1182
- )) && nextDiscountType !== "good_pass")
1183
- return false;
1184
- if (usedDiscounts.get(nextDiscount.id) && nextDiscountType === "good_pass")
1185
- return false;
1186
- if (nextDiscountType === "good_pass") {
1187
- const maxUsagePerOrder = (_c2 = nextDiscount.config) == null ? void 0 : _c2.maxUsagePerOrder;
1188
- if (maxUsagePerOrder && maxUsagePerOrder > 0) {
1189
- const currentUsedCount = usedProductIdCounts.get(nextDiscount.product_id) || 0;
1190
- if (currentUsedCount >= maxUsagePerOrder) {
1191
- return false;
1192
- }
1193
- }
1194
- }
1195
- if (["discount_card", "product_discount_card"].includes(nextDiscountType)) {
1196
- const limitConfig = ((_d2 = nextDiscount.config) == null ? void 0 : _d2.applicableProductLimit) || 0;
1197
- if (limitConfig > 0) {
1198
- const currentUsedLimitCount = usedDiscountCardLimitCounts.get(nextDiscount.id) || 0;
1199
- if (currentUsedLimitCount >= limitConfig) {
1200
- return false;
1201
- }
1202
- }
1203
- }
1204
- const limitedData = nextDiscount.limited_relation_product_data;
1205
- if (limitedData.type === "product_all") {
1206
- if (limitedData.filter === 1 && limitedData.exclude_product_ids.includes(product.id)) {
1207
- return false;
1208
- }
1209
- if (!this.checkPackageSubItemUsageRules(nextDiscount, flatItem)) {
1210
- return false;
1211
- }
1212
- return true;
1213
- } else if (limitedData.product_ids && limitedData.product_ids.includes(product.id)) {
1214
- if (!this.checkPackageSubItemUsageRules(nextDiscount, flatItem)) {
1215
- return false;
1216
- }
1217
- return true;
1218
- }
1219
- return false;
931
+ if (normalNum > 0) {
932
+ processedItems.push({
933
+ ...flatItem,
934
+ // 🔥 为剩余商品生成唯一的 _id
935
+ _id: `${flatItem._id}_split_rest`,
936
+ num: normalNum,
937
+ quantity: normalNum,
938
+ discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
939
+ processed: true
1220
940
  });
1221
- if (nextApplicableDiscounts.length === 0) {
1222
- processedItems.push({
1223
- ...flatItem,
1224
- _id: `${flatItem._id}_split_rest`,
1225
- num: remainingNum,
1226
- quantity: remainingNum,
1227
- discount_list: [],
1228
- processed: true
1229
- });
1230
- break;
1231
- }
1232
- const nextSelectedDiscountCard = nextApplicableDiscounts.find(
1233
- (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
1234
- );
1235
- const nextSelectedDiscount = nextSelectedDiscountCard || nextApplicableDiscounts[0];
1236
- const nextDiscType = nextSelectedDiscount.tag || nextSelectedDiscount.type;
1237
- const nextIsGoodPass = nextDiscType === "good_pass";
1238
- const nextIsDiscountCard = ["discount_card", "product_discount_card"].includes(nextDiscType);
1239
- const nextApplicableProductLimit = ((_F = nextSelectedDiscount.config) == null ? void 0 : _F.applicableProductLimit) || 0;
1240
- const nextIsNeedSplit = nextIsGoodPass || nextIsDiscountCard && nextApplicableProductLimit > 0;
1241
- if (!nextIsNeedSplit) {
1242
- const nextBundleDiscount = nextSelectedDiscountCard || nextApplicableDiscounts[0];
1243
- usedDiscounts.set(nextBundleDiscount.id, true);
1244
- if ((nextBundleDiscount.tag || nextBundleDiscount.type) === "good_pass") {
1245
- const curCount = usedProductIdCounts.get(nextBundleDiscount.product_id) || 0;
1246
- usedProductIdCounts.set(nextBundleDiscount.product_id, curCount + 1);
1247
- }
1248
- const nextNoSplitType = nextBundleDiscount.tag || nextBundleDiscount.type;
1249
- if (["discount_card", "product_discount_card"].includes(nextNoSplitType)) {
1250
- const curCount = usedDiscountCardLimitCounts.get(nextBundleDiscount.id) || 0;
1251
- usedDiscountCardLimitCounts.set(nextBundleDiscount.id, curCount + remainingNum);
1252
- }
1253
- const nextOriginTotal = product.original_price || product.price || 0;
1254
- const nextTargetTotal = (0, import_utils.getDiscountAmount)(nextBundleDiscount, nextOriginTotal, nextOriginTotal);
1255
- const nextDiscountAmount = new import_decimal.default(nextOriginTotal).minus(nextTargetTotal).toNumber();
1256
- const nextUniqueId = `${flatItem._id}_split_${continueSplitIndex}`;
1257
- const nextBundleDiscType = nextBundleDiscount.tag === "product_discount_card" ? "discount_card" : nextBundleDiscount.tag;
1258
- const nextDiscountDetail = {
1259
- amount: nextDiscountAmount * remainingNum,
1260
- type: nextBundleDiscType,
1261
- discount: {
1262
- discount_card_type: (_G = nextBundleDiscount == null ? void 0 : nextBundleDiscount.metadata) == null ? void 0 : _G.discount_card_type,
1263
- fixed_amount: nextDiscountAmount,
1264
- resource_id: nextBundleDiscount.id,
1265
- title: nextBundleDiscount.format_title,
1266
- original_amount: product.original_price,
1267
- product_id: product.id,
1268
- percent: nextBundleDiscount.par_value,
1269
- discount_product_id: nextBundleDiscount.product_id
1270
- },
1271
- metadata: {
1272
- custom_product_bundle_map_id: nextUniqueId,
1273
- num: remainingNum
1274
- },
1275
- config: nextBundleDiscount == null ? void 0 : nextBundleDiscount.config,
1276
- _num: remainingNum * (((_H = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _H.num) || 1)
1277
- };
1278
- const nextAppliedProducts = appliedDiscountProducts.get(nextBundleDiscount.id) || [];
1279
- nextAppliedProducts.push(nextDiscountDetail);
1280
- appliedDiscountProducts.set(nextBundleDiscount.id, nextAppliedProducts);
1281
- processedItems.push({
1282
- ...flatItem,
1283
- _id: nextUniqueId,
1284
- num: remainingNum,
1285
- quantity: remainingNum,
1286
- total: nextTargetTotal,
1287
- price: new import_decimal.default(nextOriginTotal || 0).minus(nextDiscountDetail.discount.fixed_amount).toNumber(),
1288
- discount_list: [nextDiscountDetail],
1289
- processed: true
1290
- });
1291
- remainingNum = 0;
1292
- break;
1293
- }
1294
- let nextMaxUsageLimit;
1295
- if (nextIsGoodPass) {
1296
- const nextGoodPassCount = nextApplicableDiscounts.filter(
1297
- (item) => (item.tag || item.type) === "good_pass"
1298
- ).length;
1299
- nextMaxUsageLimit = nextGoodPassCount;
1300
- if ((_I = nextSelectedDiscount.config) == null ? void 0 : _I.maxUsagePerOrder) {
1301
- const usedCount = usedProductIdCounts.get(nextSelectedDiscount.product_id) || 0;
1302
- nextMaxUsageLimit = Math.min(
1303
- nextGoodPassCount,
1304
- Math.max(0, nextSelectedDiscount.config.maxUsagePerOrder - usedCount)
1305
- );
1306
- }
1307
- } else if (nextIsDiscountCard && nextApplicableProductLimit > 0) {
1308
- const usedLimitCount = usedDiscountCardLimitCounts.get(nextSelectedDiscount.id) || 0;
1309
- nextMaxUsageLimit = Math.max(0, nextApplicableProductLimit - usedLimitCount);
1310
- } else {
1311
- nextMaxUsageLimit = 1;
1312
- }
1313
- const nextSplitCount = Math.min(remainingNum, nextMaxUsageLimit);
1314
- if (nextSplitCount === 0) {
1315
- processedItems.push({
1316
- ...flatItem,
1317
- _id: `${flatItem._id}_split_rest`,
1318
- num: remainingNum,
1319
- quantity: remainingNum,
1320
- discount_list: this.filterDiscountListByType(flatItem.discount_list, "promotion"),
1321
- processed: true
1322
- });
1323
- break;
1324
- }
1325
- for (let j = 0; j < nextSplitCount; j++) {
1326
- const nextBundleDiscount = nextIsGoodPass ? nextSelectedDiscountCard || nextApplicableDiscounts[j] : nextSelectedDiscountCard || nextApplicableDiscounts[0];
1327
- usedDiscounts.set(nextBundleDiscount.id, true);
1328
- if ((nextBundleDiscount.tag || nextBundleDiscount.type) === "good_pass") {
1329
- const curCount = usedProductIdCounts.get(nextBundleDiscount.product_id) || 0;
1330
- usedProductIdCounts.set(nextBundleDiscount.product_id, curCount + 1);
1331
- }
1332
- const nextBundleDiscTypeForCount = nextBundleDiscount.tag || nextBundleDiscount.type;
1333
- if (["discount_card", "product_discount_card"].includes(nextBundleDiscTypeForCount)) {
1334
- const curLimitCount = usedDiscountCardLimitCounts.get(nextBundleDiscount.id) || 0;
1335
- usedDiscountCardLimitCounts.set(nextBundleDiscount.id, curLimitCount + 1);
1336
- }
1337
- const nextUniqueId = `${flatItem._id}_split_${continueSplitIndex}`;
1338
- const nextDiscountedPrice = (0, import_utils.getDiscountAmount)(
1339
- nextBundleDiscount,
1340
- product.origin_total,
1341
- product.origin_total
1342
- );
1343
- const nextBundleDiscAmount = new import_decimal.default(product.origin_total || 0).minus(nextDiscountedPrice).toNumber();
1344
- const nextBundleDiscTypeStr = nextBundleDiscount.tag === "product_discount_card" ? "discount_card" : nextBundleDiscount.tag;
1345
- const nextDiscountDetail = {
1346
- amount: nextBundleDiscAmount,
1347
- type: nextBundleDiscTypeStr,
1348
- discount: {
1349
- discount_card_type: (_J = nextBundleDiscount == null ? void 0 : nextBundleDiscount.metadata) == null ? void 0 : _J.discount_card_type,
1350
- fixed_amount: nextBundleDiscAmount,
1351
- resource_id: nextBundleDiscount.id,
1352
- title: nextBundleDiscount.format_title,
1353
- original_amount: product.origin_total,
1354
- product_id: product.id,
1355
- percent: nextBundleDiscount.par_value,
1356
- discount_product_id: nextBundleDiscount.product_id
1357
- },
1358
- metadata: {
1359
- custom_product_bundle_map_id: nextUniqueId,
1360
- num: 1
1361
- },
1362
- _num: 1,
1363
- config: nextBundleDiscount == null ? void 0 : nextBundleDiscount.config
1364
- };
1365
- const nextAppliedProducts = appliedDiscountProducts.get(nextBundleDiscount.id) || [];
1366
- nextAppliedProducts.push(nextDiscountDetail);
1367
- appliedDiscountProducts.set(nextBundleDiscount.id, nextAppliedProducts);
1368
- processedItems.push({
1369
- ...flatItem,
1370
- _id: nextUniqueId,
1371
- num: 1,
1372
- quantity: 1,
1373
- price: nextDiscountedPrice,
1374
- total: nextDiscountedPrice,
1375
- discount_list: [nextDiscountDetail],
1376
- processed: true,
1377
- _discountId: nextBundleDiscount.id
1378
- });
1379
- continueSplitIndex++;
1380
- }
1381
- remainingNum -= nextSplitCount;
1382
941
  }
1383
942
  } else {
1384
- const currentBundleDiscount = selectedDiscountCard || applicableDiscounts[0];
1385
- usedDiscounts.set(currentBundleDiscount.id, true);
1386
- if ((currentBundleDiscount.tag || currentBundleDiscount.type) === "good_pass") {
1387
- const currentCount = usedProductIdCounts.get(currentBundleDiscount.product_id) || 0;
1388
- usedProductIdCounts.set(currentBundleDiscount.product_id, currentCount + 1);
1389
- }
1390
- const noSplitDiscountType = currentBundleDiscount.tag || currentBundleDiscount.type;
1391
- if (["discount_card", "product_discount_card"].includes(noSplitDiscountType)) {
1392
- const bundleQuantity = product.num || 1;
1393
- const currentNoSplitCount = usedDiscountCardLimitCounts.get(currentBundleDiscount.id) || 0;
1394
- usedDiscountCardLimitCounts.set(currentBundleDiscount.id, currentNoSplitCount + bundleQuantity);
1395
- }
943
+ const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[0];
944
+ usedDiscounts.set(selectedDiscount2.id, true);
1396
945
  const productOriginTotal = product.original_price || product.price || 0;
1397
- const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount);
1398
- const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount.id) : null;
946
+ const isOrderLevel = (0, import_utils.isOrderLevelFixedAmountDiscount)(selectedDiscount2);
947
+ const orderLevelAllocation = isOrderLevel ? orderLevelDiscountAllocations.get(selectedDiscount2.id) : null;
1399
948
  const productAllocation = orderLevelAllocation == null ? void 0 : orderLevelAllocation.get(flatItem._id);
1400
949
  let targetProductTotal;
1401
950
  let fixedAmountPerItem;
@@ -1406,42 +955,39 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1406
955
  targetProductTotal = Math.max(new import_decimal.default(productOriginTotal).minus(fixedAmountPerItem).toNumber(), 0);
1407
956
  } else {
1408
957
  targetProductTotal = (0, import_utils.getDiscountAmount)(
1409
- currentBundleDiscount,
958
+ selectedDiscount2,
1410
959
  productOriginTotal,
1411
960
  productOriginTotal
1412
961
  );
1413
962
  fixedAmountPerItem = new import_decimal.default(productOriginTotal).minus(targetProductTotal).toNumber();
1414
963
  }
1415
- const bundleActualDiscountAmount = new import_decimal.default(productOriginTotal).minus(targetProductTotal).toNumber();
1416
964
  const uniqueId = flatItem._id;
1417
965
  const discountDetail = {
1418
- amount: bundleActualDiscountAmount * (product.num || 1),
1419
- type: currentBundleDiscount.tag === "product_discount_card" ? "discount_card" : currentBundleDiscount.tag,
966
+ amount: fixedAmountPerItem * (product.num || 1),
967
+ type: selectedDiscount2.tag === "product_discount_card" ? "discount_card" : selectedDiscount2.tag,
1420
968
  discount: {
1421
- discount_card_type: (_K = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _K.discount_card_type,
1422
- fixed_amount: bundleActualDiscountAmount,
1423
- discount_calculation_mode: (_L = currentBundleDiscount == null ? void 0 : currentBundleDiscount.metadata) == null ? void 0 : _L.discount_calculation_mode,
1424
- resource_id: currentBundleDiscount.id,
1425
- title: currentBundleDiscount.format_title,
969
+ discount_card_type: (_A = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _A.discount_card_type,
970
+ fixed_amount: fixedAmountPerItem,
971
+ discount_calculation_mode: (_B = selectedDiscount2 == null ? void 0 : selectedDiscount2.metadata) == null ? void 0 : _B.discount_calculation_mode,
972
+ resource_id: selectedDiscount2.id,
973
+ title: selectedDiscount2.format_title,
1426
974
  original_amount: product.original_price,
1427
975
  product_id: product.id,
1428
- percent: currentBundleDiscount.par_value,
1429
- discount_product_id: currentBundleDiscount.product_id
976
+ percent: selectedDiscount2.par_value
1430
977
  },
1431
978
  metadata: {
1432
979
  // 🔥 使用唯一的 _id
1433
980
  custom_product_bundle_map_id: uniqueId,
1434
- discount_rule_uncheck_flag: selectedDiscount == null ? void 0 : selectedDiscount.discount_rule_uncheck_flag,
981
+ discount_rule_uncheck_flag: selectedDiscount2 == null ? void 0 : selectedDiscount2.discount_rule_uncheck_flag,
1435
982
  num: product.num || 1,
1436
983
  // 🔥 order_level 分摊差值
1437
984
  ...productDiscountDifference !== void 0 && { product_discount_difference: productDiscountDifference }
1438
985
  },
1439
- config: currentBundleDiscount == null ? void 0 : currentBundleDiscount.config,
1440
- _num: (product.num || 1) * (((_M = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _M.num) || 1)
986
+ _num: (product.num || 1) * (((_C = flatItem == null ? void 0 : flatItem.parentProduct) == null ? void 0 : _C.num) || 1)
1441
987
  };
1442
- const appliedProducts = appliedDiscountProducts.get(currentBundleDiscount.id) || [];
988
+ const appliedProducts = appliedDiscountProducts.get(selectedDiscount2.id) || [];
1443
989
  appliedProducts.push(discountDetail);
1444
- appliedDiscountProducts.set(currentBundleDiscount.id, appliedProducts);
990
+ appliedDiscountProducts.set(selectedDiscount2.id, appliedProducts);
1445
991
  processedItems.push({
1446
992
  ...flatItem,
1447
993
  total: targetProductTotal,
@@ -1460,7 +1006,6 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1460
1006
  const mainProductArr = processedProductsMap2.get(product._id);
1461
1007
  if (!mainProductArr || mainProductArr.length === 0) {
1462
1008
  const getDefaultProduct = () => {
1463
- const restoredOptions = restoreOptionPrices(product.options);
1464
1009
  if (product.isClient) {
1465
1010
  return this.hooks.setProduct(originProduct, {
1466
1011
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
@@ -1470,7 +1015,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1470
1015
  original_price: product.original_price
1471
1016
  },
1472
1017
  bundle: product.bundle,
1473
- options: restoredOptions
1018
+ options: product.options
1474
1019
  }),
1475
1020
  variant: originProduct._productInit.variant,
1476
1021
  original_price: originProduct._productInit.original_price,
@@ -1479,17 +1024,15 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1479
1024
  price: product.price
1480
1025
  },
1481
1026
  bundle: product.bundle,
1482
- options: restoredOptions
1483
- }),
1484
- options: restoredOptions
1027
+ options: product.options
1028
+ })
1485
1029
  });
1486
1030
  } else {
1487
1031
  return this.hooks.setProduct(originProduct, {
1488
1032
  discount_list: this.filterDiscountListByType(product.discount_list, "promotion"),
1489
1033
  total: product.total,
1490
1034
  origin_total: product.origin_total,
1491
- price: product.price,
1492
- options: restoreOptionPrices(product.options)
1035
+ price: product.price
1493
1036
  });
1494
1037
  }
1495
1038
  };
@@ -1529,92 +1072,80 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1529
1072
  const mainProduct = mainProductArr[0];
1530
1073
  const mainProductData = this.hooks.getProduct(mainProduct);
1531
1074
  const newBundleWithDiscount = [];
1532
- (product.bundle || []).forEach(
1533
- (bundleItem, bundleIndex) => {
1534
- const processedItems = bundleProcessingInfo.get(
1535
- bundleIndex
1536
- ) || [bundleItem];
1537
- if (processedItems.length > 1) {
1538
- processedItems.forEach((item) => {
1539
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1540
- var _a;
1541
- return {
1542
- ...discount,
1543
- metadata: {
1544
- ...discount.metadata,
1545
- num: item.num,
1546
- custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1547
- }
1548
- // num: item.num, // 使用拆分后的 num
1549
- };
1550
- });
1551
- newBundleWithDiscount.push({
1552
- ...bundleItem,
1553
- _id: item._id,
1554
- product_id: bundleItem.product_id,
1555
- price: item.price,
1556
- num: item.num,
1557
- quantity: item.num,
1558
- discount_list: updatedDiscountList2
1559
- });
1075
+ (product.bundle || []).forEach((bundleItem, bundleIndex) => {
1076
+ const processedItems = bundleProcessingInfo.get(bundleIndex) || [bundleItem];
1077
+ if (processedItems.length > 1) {
1078
+ processedItems.forEach((item) => {
1079
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1080
+ var _a;
1081
+ return {
1082
+ ...discount,
1083
+ metadata: {
1084
+ ...discount.metadata,
1085
+ num: item.num,
1086
+ custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1087
+ }
1088
+ // num: item.num, // 使用拆分后的 num
1089
+ };
1090
+ });
1091
+ newBundleWithDiscount.push({
1092
+ ...bundleItem,
1093
+ _id: item._id,
1094
+ product_id: bundleItem.product_id,
1095
+ price: item.price,
1096
+ num: item.num,
1097
+ discount_list: updatedDiscountList2
1098
+ });
1099
+ });
1100
+ } else {
1101
+ const item = processedItems[0];
1102
+ if (item.processed) {
1103
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1104
+ var _a;
1105
+ return {
1106
+ ...discount,
1107
+ metadata: {
1108
+ ...discount.metadata,
1109
+ num: item.num,
1110
+ custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1111
+ }
1112
+ // num: item.num, // 使用当前的 num
1113
+ };
1114
+ });
1115
+ newBundleWithDiscount.push({
1116
+ ...bundleItem,
1117
+ _id: item._id,
1118
+ product_id: bundleItem.product_id,
1119
+ price: item.price,
1120
+ num: item.num,
1121
+ discount_list: updatedDiscountList2
1560
1122
  });
1561
1123
  } else {
1562
- const item = processedItems[0];
1563
- if (item.processed) {
1564
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1565
- var _a;
1566
- return {
1567
- ...discount,
1568
- metadata: {
1569
- ...discount.metadata,
1570
- num: item.num,
1571
- custom_product_bundle_map_id: (_a = item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id
1572
- }
1573
- // num: item.num, // 使用当前的 num
1574
- };
1575
- });
1576
- newBundleWithDiscount.push({
1577
- ...bundleItem,
1578
- _id: item._id,
1579
- product_id: bundleItem.product_id,
1580
- price: item.price,
1581
- num: item.num,
1582
- quantity: item.num,
1583
- discount_list: updatedDiscountList2
1584
- });
1585
- } else {
1586
- newBundleWithDiscount.push(item);
1587
- }
1124
+ newBundleWithDiscount.push(item);
1588
1125
  }
1589
1126
  }
1590
- );
1127
+ });
1591
1128
  let newTotalWithDiscount = Number(mainProductData.price || 0);
1592
- let newOriginTotalWithDiscount = Number(
1593
- mainProductData.original_price || mainProductData.price || 0
1594
- );
1595
- const updatedMainDiscountList = mainProductData.discount_list.map(
1596
- (discount) => {
1597
- var _a, _b;
1598
- if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
1599
- return discount;
1600
- }
1601
- return {
1602
- ...discount,
1603
- // num: 1,
1604
- metadata: {
1605
- ...discount.metadata,
1606
- custom_product_bundle_map_id: (_b = discount == null ? void 0 : discount.metadata) == null ? void 0 : _b.custom_product_bundle_map_id,
1607
- num: 1
1608
- }
1609
- };
1129
+ let newOriginTotalWithDiscount = Number(mainProductData.original_price || mainProductData.price || 0);
1130
+ const updatedMainDiscountList = mainProductData.discount_list.map((discount) => {
1131
+ var _a, _b;
1132
+ if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
1133
+ return discount;
1610
1134
  }
1611
- );
1612
- const mainDiscountList = updatedMainDiscountList.filter(
1613
- (item) => {
1614
- var _a;
1615
- return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1616
- }
1617
- );
1135
+ return {
1136
+ ...discount,
1137
+ // num: 1,
1138
+ metadata: {
1139
+ ...discount.metadata,
1140
+ custom_product_bundle_map_id: (_b = discount == null ? void 0 : discount.metadata) == null ? void 0 : _b.custom_product_bundle_map_id,
1141
+ num: 1
1142
+ }
1143
+ };
1144
+ });
1145
+ const mainDiscountList = updatedMainDiscountList.filter((item) => {
1146
+ var _a;
1147
+ return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1148
+ });
1618
1149
  if (mainDiscountList && mainDiscountList.length > 0) {
1619
1150
  const allDiscountAmount = (0, import_utils.getDiscountListAmountTotal)(mainDiscountList);
1620
1151
  newTotalWithDiscount = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotalWithDiscount;
@@ -1644,24 +1175,20 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1644
1175
  quantity: 1,
1645
1176
  discount_list: updatedMainDiscountList,
1646
1177
  bundle: newBundleWithDiscount,
1647
- total: newTotalWithDiscount,
1648
- origin_total: newOriginTotalWithDiscount
1178
+ total: new import_decimal.default(newTotalWithDiscount).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber(),
1179
+ origin_total: new import_decimal.default(newOriginTotalWithDiscount).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber()
1649
1180
  })
1650
1181
  );
1651
1182
  if (mainProductQuantity > 1) {
1652
1183
  const newBundleOriginal = [];
1653
- (product.bundle || []).forEach(
1654
- (bundleItem, bundleIndex) => {
1655
- newBundleOriginal.push({
1656
- ...bundleItem,
1657
- discount_list: []
1658
- });
1659
- }
1660
- );
1184
+ (product.bundle || []).forEach((bundleItem, bundleIndex) => {
1185
+ newBundleOriginal.push({
1186
+ ...bundleItem,
1187
+ discount_list: []
1188
+ });
1189
+ });
1661
1190
  let newTotalOriginal = Number(mainProductData.price || 0);
1662
- let newOriginTotalOriginal = Number(
1663
- mainProductData.original_price || mainProductData.price || 0
1664
- );
1191
+ let newOriginTotalOriginal = Number(mainProductData.original_price || mainProductData.price || 0);
1665
1192
  const updatedMainDiscountListOriginal = mainProductData.discount_list.map((discount) => {
1666
1193
  var _a, _b;
1667
1194
  if ((_a = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a.custom_product_bundle_map_id) {
@@ -1677,16 +1204,12 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1677
1204
  // num: mainProductQuantity - 1,
1678
1205
  };
1679
1206
  });
1680
- const mainDiscountListOriginal = updatedMainDiscountListOriginal.filter(
1681
- (item) => {
1682
- var _a;
1683
- return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1684
- }
1685
- );
1207
+ const mainDiscountListOriginal = updatedMainDiscountListOriginal.filter((item) => {
1208
+ var _a;
1209
+ return !((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a.custom_product_bundle_map_id);
1210
+ });
1686
1211
  if (mainDiscountListOriginal && mainDiscountListOriginal.length > 0) {
1687
- const allDiscountAmount = (0, import_utils.getDiscountListAmount)(
1688
- mainDiscountListOriginal
1689
- );
1212
+ const allDiscountAmount = (0, import_utils.getDiscountListAmount)(mainDiscountListOriginal);
1690
1213
  newTotalOriginal = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotalOriginal;
1691
1214
  newOriginTotalOriginal = mainProductData.origin_total ?? newOriginTotalOriginal;
1692
1215
  }
@@ -1723,59 +1246,48 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1723
1246
  const mainProductData = this.hooks.getProduct(mainProduct);
1724
1247
  const newBundle = [];
1725
1248
  if (product.bundle && Array.isArray(product.bundle)) {
1726
- product.bundle.forEach(
1727
- (bundleItem, bundleIndex) => {
1728
- const bundleItemId = `${product._id}_bundle_${bundleIndex}`;
1729
- const processedBundleItems = processedFlatItemsMap2.get(bundleItemId);
1730
- if (!processedBundleItems || processedBundleItems.length === 0) {
1731
- newBundle.push(bundleItem);
1732
- } else {
1733
- processedBundleItems.forEach((item) => {
1734
- const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1735
- var _a2;
1736
- return {
1737
- ...discount,
1738
- metadata: {
1739
- ...discount.metadata,
1740
- num: item.num,
1741
- custom_product_bundle_map_id: (_a2 = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id
1742
- }
1743
- // num: item.num, // 使用拆分后的 num
1744
- };
1745
- });
1746
- newBundle.push({
1747
- ...bundleItem,
1748
- _id: item._id,
1749
- product_id: bundleItem.product_id,
1750
- price: item.price,
1751
- num: item.num,
1752
- quantity: item.num,
1753
- discount_list: updatedDiscountList2,
1754
- bundle_selling_price: bundleItem.bundle_selling_price !== void 0 ? item.price : void 0
1755
- });
1249
+ product.bundle.forEach((bundleItem, bundleIndex) => {
1250
+ const bundleItemId = `${product._id}_bundle_${bundleIndex}`;
1251
+ const processedBundleItems = processedFlatItemsMap2.get(bundleItemId);
1252
+ if (!processedBundleItems || processedBundleItems.length === 0) {
1253
+ newBundle.push(bundleItem);
1254
+ } else {
1255
+ processedBundleItems.forEach((item) => {
1256
+ const updatedDiscountList2 = (item.discount_list || []).map((discount) => {
1257
+ var _a2;
1258
+ return {
1259
+ ...discount,
1260
+ metadata: {
1261
+ ...discount.metadata,
1262
+ num: item.num,
1263
+ custom_product_bundle_map_id: (_a2 = discount == null ? void 0 : discount.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id
1264
+ }
1265
+ // num: item.num, // 使用拆分后的 num
1266
+ };
1756
1267
  });
1757
- }
1268
+ newBundle.push({
1269
+ ...bundleItem,
1270
+ _id: item._id,
1271
+ product_id: bundleItem.product_id,
1272
+ price: item.price,
1273
+ num: item.num,
1274
+ discount_list: updatedDiscountList2
1275
+ });
1276
+ });
1758
1277
  }
1759
- );
1278
+ });
1760
1279
  }
1761
1280
  let newTotal = Number(mainProductData.price || 0);
1762
- let newOriginTotal = Number(
1763
- mainProductData.original_price || mainProductData.price || 0
1764
- );
1765
- const isManualDiscount = typeof mainProductData.isManualDiscount === "boolean" ? mainProductData.isManualDiscount : mainProductData.total != mainProductData.origin_total && (!((_a = mainProductData.discount_list) == null ? void 0 : _a.length) || ((_c = (_b = mainProductData == null ? void 0 : mainProductData.discount_list) == null ? void 0 : _b.every) == null ? void 0 : _c.call(
1766
- _b,
1767
- (item) => item.type === "product"
1768
- )));
1281
+ let newOriginTotal = Number(mainProductData.original_price || mainProductData.price || 0);
1282
+ const isManualDiscount = typeof mainProductData.isManualDiscount === "boolean" ? mainProductData.isManualDiscount : mainProductData.total != mainProductData.origin_total && (!((_a = mainProductData.discount_list) == null ? void 0 : _a.length) || ((_c = (_b = mainProductData == null ? void 0 : mainProductData.discount_list) == null ? void 0 : _b.every) == null ? void 0 : _c.call(_b, (item) => item.type === "product")));
1769
1283
  if (isManualDiscount) {
1770
1284
  newTotal = mainProductData.total ?? newTotal;
1771
1285
  newOriginTotal = mainProductData.origin_total ?? newOriginTotal;
1772
1286
  } else {
1773
- const mainDiscountList = mainProductData.discount_list.filter(
1774
- (item) => {
1775
- var _a2;
1776
- return !((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
1777
- }
1778
- );
1287
+ const mainDiscountList = mainProductData.discount_list.filter((item) => {
1288
+ var _a2;
1289
+ return !((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
1290
+ });
1779
1291
  if (mainDiscountList && mainDiscountList.length > 0) {
1780
1292
  const allDiscountAmount = (0, import_utils.getDiscountListAmount)(mainDiscountList);
1781
1293
  newTotal = new import_decimal.default(mainProductData.price || 0).minus(allDiscountAmount).toNumber() ?? newTotal;
@@ -1783,8 +1295,10 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1783
1295
  }
1784
1296
  if (newBundle.length > 0) {
1785
1297
  newBundle.forEach((item) => {
1786
- var _a2, _b2, _c2;
1787
1298
  newTotal += Number(item.price) * Number(item.num);
1299
+ });
1300
+ newBundle.forEach((item) => {
1301
+ var _a2, _b2, _c2;
1788
1302
  const originalPrice = ((_c2 = (_b2 = (_a2 = item.discount_list) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.discount) == null ? void 0 : _c2.original_amount) || item.price;
1789
1303
  newOriginTotal += Number(originalPrice) * Number(item.num);
1790
1304
  });
@@ -1797,6 +1311,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1797
1311
  return accumulator.add(currentPrice.mul(currentNum));
1798
1312
  }, new import_decimal.default(newTotal)).toNumber();
1799
1313
  }
1314
+ newTotal = new import_decimal.default(newTotal).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber();
1315
+ newOriginTotal = new import_decimal.default(newOriginTotal).toDecimalPlaces(2, import_decimal.default.ROUND_HALF_UP).toNumber();
1800
1316
  result.push(
1801
1317
  this.hooks.setProduct(mainProduct, {
1802
1318
  ...mainProductData,