@pisell/pisellos 2.1.173 → 2.1.174

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 (93) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +9 -0
  2. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  3. package/dist/model/strategy/adapter/walletPass/evaluator.js +4 -2
  4. package/dist/modules/Discount/availability.d.ts +7 -0
  5. package/dist/modules/Discount/availability.js +52 -0
  6. package/dist/modules/Discount/entitlementPass.d.ts +34 -0
  7. package/dist/modules/Discount/entitlementPass.js +147 -0
  8. package/dist/modules/Discount/entitlementState.d.ts +8 -0
  9. package/dist/modules/Discount/entitlementState.js +205 -0
  10. package/dist/modules/Discount/index.d.ts +6 -3
  11. package/dist/modules/Discount/index.js +125 -23
  12. package/dist/modules/Discount/types.d.ts +34 -5
  13. package/dist/modules/Holder/index.d.ts +48 -0
  14. package/dist/modules/Holder/index.js +640 -0
  15. package/dist/modules/Holder/types.d.ts +123 -0
  16. package/dist/modules/Holder/types.js +1 -0
  17. package/dist/modules/Holder/utils.d.ts +13 -0
  18. package/dist/modules/Holder/utils.js +34 -0
  19. package/dist/modules/Order/index.d.ts +1 -0
  20. package/dist/modules/Order/index.js +18 -1
  21. package/dist/modules/Order/types.d.ts +2 -0
  22. package/dist/modules/Order/utils.d.ts +10 -0
  23. package/dist/modules/Order/utils.js +35 -3
  24. package/dist/modules/Product/types.d.ts +7 -0
  25. package/dist/modules/Rules/entitlementLines.d.ts +8 -0
  26. package/dist/modules/Rules/entitlementLines.js +157 -0
  27. package/dist/modules/Rules/index.d.ts +12 -2
  28. package/dist/modules/Rules/index.js +377 -112
  29. package/dist/modules/Rules/types.d.ts +2 -2
  30. package/dist/modules/index.d.ts +1 -0
  31. package/dist/modules/index.js +2 -1
  32. package/dist/plugins/window.d.ts +3 -0
  33. package/dist/solution/BookingByStep/index.d.ts +17 -2
  34. package/dist/solution/BookingByStep/index.js +276 -204
  35. package/dist/solution/BookingByStep/types.d.ts +2 -1
  36. package/dist/solution/BookingByStep/types.js +3 -1
  37. package/dist/solution/ScanOrder/index.js +1 -1
  38. package/dist/solution/ScanOrder/types.d.ts +1 -0
  39. package/dist/solution/ShopDiscount/index.d.ts +3 -0
  40. package/dist/solution/ShopDiscount/index.js +161 -78
  41. package/dist/solution/ShopDiscount/utils.d.ts +1 -0
  42. package/dist/solution/ShopDiscount/utils.js +40 -1
  43. package/dist/solution/VenueBooking/index.d.ts +19 -0
  44. package/dist/solution/VenueBooking/index.js +978 -748
  45. package/dist/solution/VenueBooking/types.d.ts +2 -0
  46. package/dist/types/index.d.ts +1 -0
  47. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  48. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  49. package/lib/model/strategy/adapter/walletPass/evaluator.js +4 -2
  50. package/lib/modules/Discount/availability.d.ts +7 -0
  51. package/lib/modules/Discount/availability.js +91 -0
  52. package/lib/modules/Discount/entitlementPass.d.ts +34 -0
  53. package/lib/modules/Discount/entitlementPass.js +184 -0
  54. package/lib/modules/Discount/entitlementState.d.ts +8 -0
  55. package/lib/modules/Discount/entitlementState.js +206 -0
  56. package/lib/modules/Discount/index.d.ts +6 -3
  57. package/lib/modules/Discount/index.js +66 -16
  58. package/lib/modules/Discount/types.d.ts +34 -5
  59. package/lib/modules/Holder/index.d.ts +48 -0
  60. package/lib/modules/Holder/index.js +402 -0
  61. package/lib/modules/Holder/types.d.ts +123 -0
  62. package/lib/modules/Holder/types.js +17 -0
  63. package/lib/modules/Holder/utils.d.ts +13 -0
  64. package/lib/modules/Holder/utils.js +71 -0
  65. package/lib/modules/Order/index.d.ts +1 -0
  66. package/lib/modules/Order/index.js +14 -0
  67. package/lib/modules/Order/types.d.ts +2 -0
  68. package/lib/modules/Order/utils.d.ts +10 -0
  69. package/lib/modules/Order/utils.js +36 -5
  70. package/lib/modules/Product/types.d.ts +7 -0
  71. package/lib/modules/Rules/entitlementLines.d.ts +8 -0
  72. package/lib/modules/Rules/entitlementLines.js +158 -0
  73. package/lib/modules/Rules/index.d.ts +12 -2
  74. package/lib/modules/Rules/index.js +304 -70
  75. package/lib/modules/Rules/types.d.ts +2 -2
  76. package/lib/modules/index.d.ts +1 -0
  77. package/lib/modules/index.js +3 -1
  78. package/lib/plugins/window.d.ts +3 -0
  79. package/lib/solution/BookingByStep/index.d.ts +17 -2
  80. package/lib/solution/BookingByStep/index.js +39 -0
  81. package/lib/solution/BookingByStep/types.d.ts +2 -1
  82. package/lib/solution/BookingByStep/types.js +5 -0
  83. package/lib/solution/ScanOrder/index.js +1 -1
  84. package/lib/solution/ScanOrder/types.d.ts +1 -0
  85. package/lib/solution/ShopDiscount/index.d.ts +3 -0
  86. package/lib/solution/ShopDiscount/index.js +78 -28
  87. package/lib/solution/ShopDiscount/utils.d.ts +1 -0
  88. package/lib/solution/ShopDiscount/utils.js +42 -1
  89. package/lib/solution/VenueBooking/index.d.ts +19 -0
  90. package/lib/solution/VenueBooking/index.js +134 -16
  91. package/lib/solution/VenueBooking/types.d.ts +2 -0
  92. package/lib/types/index.d.ts +1 -0
  93. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { ProductList, CartModule, ProductData, AccountModule, AccountListModule, DateModule, GuestListModule, OrderModule, PaymentModule, ResourceListModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule } from '../../modules';
1
+ import { ProductList, CartModule, ProductData, AccountModule, AccountListModule, DateModule, GuestListModule, OrderModule, PaymentModule, ResourceListModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule, HolderModule } from '../../modules';
2
2
  export interface BookingByStepState {
3
3
  cart: CartModule;
4
4
  summary: SummaryModule;
@@ -16,6 +16,7 @@ export interface BookingByStepState {
16
16
  schedule: ScheduleModule;
17
17
  salesSummary?: SalesSummaryModule;
18
18
  scanOrderLogger?: ScanOrderLoggerModule;
19
+ holder: HolderModule;
19
20
  }
20
21
  export declare function createModule<T extends keyof BookingByStepState>(moduleName: T, solutionName: string, name?: string, version?: string): BookingByStepState[T];
21
22
  export declare enum BookingByStepHooks {
@@ -1,4 +1,4 @@
1
- import { ProductList, CartModule, AccountListModule, DateModule, OrderModule, PaymentModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule } from "../../modules";
1
+ import { ProductList, CartModule, AccountListModule, DateModule, OrderModule, PaymentModule, StepModule, SummaryModule, SalesSummaryModule, ScheduleModule, ScanOrderLoggerModule, HolderModule } from "../../modules";
2
2
  export function createModule(moduleName, solutionName, name, version) {
3
3
  switch (moduleName) {
4
4
  case 'cart':
@@ -23,6 +23,8 @@ export function createModule(moduleName, solutionName, name, version) {
23
23
  return new ScheduleModule("".concat(solutionName, "_").concat(name || moduleName), version);
24
24
  case 'scanOrderLogger':
25
25
  return new ScanOrderLoggerModule("".concat(solutionName, "_").concat(name || moduleName), version);
26
+ case 'holder':
27
+ return new HolderModule("".concat(solutionName, "_").concat(name || moduleName), version);
26
28
  default:
27
29
  throw new Error("Unknown module type: ".concat(moduleName));
28
30
  }
@@ -857,7 +857,7 @@ export var ScanOrderImpl = /*#__PURE__*/function (_BaseModule) {
857
857
  var tempOrder = this.store.order.ensureTempOrder();
858
858
  tempOrder.metadata = _objectSpread(_objectSpread({}, tempOrder.metadata || {}), {}, {
859
859
  shop_service_data: _objectSpread(_objectSpread({}, (tempOrder.metadata || {}).shop_service_data || {}), {}, {
860
- service_type: ((_this$otherParams4 = this.otherParams) === null || _this$otherParams4 === void 0 ? void 0 : _this$otherParams4.businessCode) === 'dine_in' ? 'dine_in' : 'take_away',
860
+ service_type: ((_this$otherParams4 = this.otherParams) === null || _this$otherParams4 === void 0 ? void 0 : _this$otherParams4.businessCode) === 'dine_in' ? 'dine_in' : '',
861
861
  pickup_reference_mode: mode
862
862
  })
863
863
  });
@@ -34,6 +34,7 @@ export interface ScanOrderOrderProductIdentity {
34
34
  /** 参与合并/匹配;与 remove 通配语义见 isSkuOnlyDeleteIdentity */
35
35
  product_option_item?: any[];
36
36
  product_bundle?: any[];
37
+ shop_id?: number | string;
37
38
  }
38
39
  export interface ScanOrderOrderProduct extends ScanOrderOrderProductIdentity {
39
40
  order_detail_id: number | null;
@@ -12,6 +12,8 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
12
12
  private store;
13
13
  private options;
14
14
  private hooks?;
15
+ private entitlementPassEnabled;
16
+ setEntitlementPassEnabled(enabled: boolean): void;
15
17
  constructor(name?: string, version?: string);
16
18
  initialize(core: PisellCore, options: any): Promise<void>;
17
19
  destroy(): Promise<void>;
@@ -42,6 +44,7 @@ export declare class ShopDiscountImpl extends BaseModule implements Module {
42
44
  batchSearchByProductIds(productIds: number[]): Promise<Discount[]>;
43
45
  scanCode(code: string, customerId?: number): Promise<{
44
46
  isAvailable: boolean;
47
+ isAccepted?: boolean;
45
48
  productList: Record<string, any>[];
46
49
  discountList: Discount[];
47
50
  type: "server" | "clientCalc";
@@ -31,6 +31,9 @@ import { filterDiscountListByBookingTime as _filterDiscountListByBookingTime, is
31
31
  import { UnavailableReason } from "../../modules/Rules/types";
32
32
  import Decimal from 'decimal.js';
33
33
  import { isBoolean } from 'lodash-es';
34
+ import { isEntitlementPass } from "../../modules/Discount/entitlementPass";
35
+ import { getDiscountLifecycleReason } from "../../modules/Discount/availability";
36
+ import { mergeEntitlementDiscountLists, retainScannedEntitlements, withCommittedEntitlementDetails } from "../../modules/Discount/entitlementState";
34
37
  export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
35
38
  _inherits(ShopDiscountImpl, _BaseModule);
36
39
  var _super = _createSuper(ShopDiscountImpl);
@@ -47,6 +50,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
47
50
  _defineProperty(_assertThisInitialized(_this), "store", void 0);
48
51
  _defineProperty(_assertThisInitialized(_this), "options", {});
49
52
  _defineProperty(_assertThisInitialized(_this), "hooks", void 0);
53
+ _defineProperty(_assertThisInitialized(_this), "entitlementPassEnabled", false);
50
54
  _this.store = {
51
55
  customer: null,
52
56
  productList: [],
@@ -64,6 +68,21 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
64
68
 
65
69
  // =========== 生命周期方法 ===========
66
70
  _createClass(ShopDiscountImpl, [{
71
+ key: "setEntitlementPassEnabled",
72
+ value:
73
+ // 由使用多次卡的预约组件显式开启,其他入口沿用原券流程。
74
+ function setEntitlementPassEnabled(enabled) {
75
+ var _this$store$rules;
76
+ this.entitlementPassEnabled = enabled;
77
+ (_this$store$rules = this.store.rules) === null || _this$store$rules === void 0 || _this$store$rules.setEntitlementPassEnabled(enabled);
78
+ if (!enabled) {
79
+ var _this$store$discount;
80
+ (_this$store$discount = this.store.discount) === null || _this$store$discount === void 0 || _this$store$discount.setDiscountList(this.getDiscountList().filter(function (item) {
81
+ return !isEntitlementPass(item);
82
+ }));
83
+ }
84
+ }
85
+ }, {
67
86
  key: "initialize",
68
87
  value: function () {
69
88
  var _initialize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(core, options) {
@@ -100,14 +119,14 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
100
119
  key: "destroy",
101
120
  value: function () {
102
121
  var _destroy = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
103
- var _this$store$discount, _this$store$rules;
122
+ var _this$store$discount2, _this$store$rules2;
104
123
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
105
124
  while (1) switch (_context2.prev = _context2.next) {
106
125
  case 0:
107
126
  this.store.productList = [];
108
127
  this.store.customer = null;
109
- (_this$store$discount = this.store.discount) === null || _this$store$discount === void 0 || _this$store$discount.destroy();
110
- (_this$store$rules = this.store.rules) === null || _this$store$rules === void 0 || _this$store$rules.destroy();
128
+ (_this$store$discount2 = this.store.discount) === null || _this$store$discount2 === void 0 || _this$store$discount2.destroy();
129
+ (_this$store$rules2 = this.store.rules) === null || _this$store$rules2 === void 0 || _this$store$rules2.destroy();
111
130
  this.core.effects.offByModuleDestroy(this.name);
112
131
  _context2.next = 7;
113
132
  return this.core.effects.emit("".concat(this.name, ":onDestroy"), {});
@@ -128,14 +147,14 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
128
147
  key: "clear",
129
148
  value: function () {
130
149
  var _clear = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
131
- var _this$store$discount2, _this$store$rules2;
150
+ var _this$store$discount3, _this$store$rules3;
132
151
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
133
152
  while (1) switch (_context3.prev = _context3.next) {
134
153
  case 0:
135
154
  this.store.productList = [];
136
155
  this.store.customer = null;
137
- (_this$store$discount2 = this.store.discount) === null || _this$store$discount2 === void 0 || _this$store$discount2.clear();
138
- (_this$store$rules2 = this.store.rules) === null || _this$store$rules2 === void 0 || _this$store$rules2.clear();
156
+ (_this$store$discount3 = this.store.discount) === null || _this$store$discount3 === void 0 || _this$store$discount3.clear();
157
+ (_this$store$rules3 = this.store.rules) === null || _this$store$rules3 === void 0 || _this$store$rules3.clear();
139
158
  console.log('[ShopDiscount] clear');
140
159
  case 5:
141
160
  case "end":
@@ -200,9 +219,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
200
219
  var _this2 = this;
201
220
  this.core.effects.only("".concat(this.name, ":onCustomerChange"), function (customer) {
202
221
  var _this2$options$otherP;
203
- if ((_this2$options$otherP = _this2.options.otherParams) !== null && _this2$options$otherP !== void 0 && _this2$options$otherP.cacheId && _this2.getDiscountList().length) {
204
- return;
205
- }
222
+ if (!_this2.entitlementPassEnabled && (_this2$options$otherP = _this2.options.otherParams) !== null && _this2$options$otherP !== void 0 && _this2$options$otherP.cacheId && _this2.getDiscountList().length) return;
206
223
  _this2.loadPrepareConfig({
207
224
  customerId: customer.id,
208
225
  action: 'create',
@@ -269,17 +286,28 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
269
286
  value: function () {
270
287
  var _setCustomer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(customer) {
271
288
  var _this$store$customer;
289
+ var _this$store$discount4, retained;
272
290
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
273
291
  while (1) switch (_context4.prev = _context4.next) {
274
292
  case 0:
275
293
  if (!(((_this$store$customer = this.store.customer) === null || _this$store$customer === void 0 ? void 0 : _this$store$customer.id) !== customer.id)) {
276
- _context4.next = 4;
294
+ _context4.next = 8;
277
295
  break;
278
296
  }
279
297
  this.store.customer = customer;
280
- _context4.next = 4;
298
+ if (!this.entitlementPassEnabled) {
299
+ _context4.next = 6;
300
+ break;
301
+ }
302
+ retained = this.getDiscountList().filter(function (item) {
303
+ return !isEntitlementPass(item) || item.isEditMode || item.isScan && String(item.customer_id) === String(customer.id);
304
+ });
305
+ _context4.next = 6;
306
+ return (_this$store$discount4 = this.store.discount) === null || _this$store$discount4 === void 0 ? void 0 : _this$store$discount4.setDiscountList(retained);
307
+ case 6:
308
+ _context4.next = 8;
281
309
  return this.core.effects.emit("".concat(this.name, ":onCustomerChange"), customer);
282
- case 4:
310
+ case 8:
283
311
  case "end":
284
312
  return _context4.stop();
285
313
  }
@@ -330,6 +358,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
330
358
  },
331
359
  newProductList = _ref.productList,
332
360
  newDiscountList = _ref.discountList;
361
+ if (this.entitlementPassEnabled) this.store.productList = newProductList || productList;
333
362
  if (newDiscountList) {
334
363
  newDiscountList = this.setDiscountList(newDiscountList);
335
364
  }
@@ -394,13 +423,13 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
394
423
  key: "batchSearchByProductIds",
395
424
  value: function () {
396
425
  var _batchSearchByProductIds = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(productIds) {
397
- var _this$store$discount3;
426
+ var _this$store$discount5;
398
427
  var resultDiscountList, currentDiscountList, newDiscountList;
399
428
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
400
429
  while (1) switch (_context5.prev = _context5.next) {
401
430
  case 0:
402
431
  _context5.next = 2;
403
- return (_this$store$discount3 = this.store.discount) === null || _this$store$discount3 === void 0 ? void 0 : _this$store$discount3.batchSearchByProductIds(productIds);
432
+ return (_this$store$discount5 = this.store.discount) === null || _this$store$discount5 === void 0 ? void 0 : _this$store$discount5.batchSearchByProductIds(productIds);
404
433
  case 2:
405
434
  _context5.t0 = _context5.sent;
406
435
  if (_context5.t0) {
@@ -434,15 +463,16 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
434
463
  key: "scanCode",
435
464
  value: function () {
436
465
  var _scanCode = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(code, customerId) {
437
- var _this$store$discount4, _this$store$bookingSu2, resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, isAvailable, unavailableReason, _this$options$otherPa6;
466
+ var _this$store$discount6, _this$store$bookingSu2, _find, resultDiscountWithReason, resultDiscountList, unavailableReasonKey, rulesModule, withScanList, currentSelectedDiscountList, _ref2, newProductList, newDiscountList, evaluatedDiscountList, isAvailable, unavailableReason, isAccepted, _this$options$otherPa6, ids, retainable, _this$store$discount7;
438
467
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
439
468
  while (1) switch (_context6.prev = _context6.next) {
440
469
  case 0:
441
470
  _context6.prev = 0;
442
471
  _context6.next = 3;
443
- return (_this$store$discount4 = this.store.discount) === null || _this$store$discount4 === void 0 ? void 0 : _this$store$discount4.batchSearch(code, {
472
+ return (_this$store$discount6 = this.store.discount) === null || _this$store$discount6 === void 0 ? void 0 : _this$store$discount6.batchSearch(code, {
444
473
  customerId: customerId,
445
- orderId: this.store.orderId
474
+ orderId: this.store.orderId,
475
+ withEntitlementPass: this.entitlementPassEnabled
446
476
  });
447
477
  case 3:
448
478
  _context6.t0 = _context6.sent;
@@ -490,7 +520,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
490
520
  currentSelectedDiscountList = this.getDiscountList().filter(function (n) {
491
521
  return n.isSelected;
492
522
  });
493
- if (!(currentSelectedDiscountList.length && currentSelectedDiscountList.some(function (n) {
523
+ if (!(!withScanList.some(isEntitlementPass) && currentSelectedDiscountList.length && currentSelectedDiscountList.some(function (n) {
494
524
  return withScanList.some(function (m) {
495
525
  return m.id === n.id;
496
526
  });
@@ -515,30 +545,58 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
515
545
  isAvailable: false,
516
546
  productList: this.store.productList || [],
517
547
  discountList: this.getDiscountList()
518
- }, newProductList = _ref2.productList, newDiscountList = _ref2.discountList, isAvailable = _ref2.isAvailable, unavailableReason = _ref2.unavailableReason;
548
+ }, newProductList = _ref2.productList, newDiscountList = _ref2.discountList, evaluatedDiscountList = _ref2.evaluatedDiscountList, isAvailable = _ref2.isAvailable, unavailableReason = _ref2.unavailableReason;
549
+ isAccepted = isAvailable;
519
550
  if (!isAvailable) {
520
- _context6.next = 25;
551
+ _context6.next = 27;
521
552
  break;
522
553
  }
554
+ if (this.entitlementPassEnabled) this.setProductList(newProductList || []);
523
555
  this.setDiscountList(newDiscountList || []);
524
556
  this.store.originalDiscountList = newDiscountList || [];
525
- this.setProductList(newProductList || []);
557
+ if (!this.entitlementPassEnabled) this.setProductList(newProductList || []);
526
558
  if (!(this.isWalkIn() && resultDiscountList.length && ((_this$options$otherPa6 = this.options.otherParams) === null || _this$options$otherPa6 === void 0 ? void 0 : _this$options$otherPa6.platform) === 'shop')) {
527
- _context6.next = 25;
559
+ _context6.next = 27;
528
560
  break;
529
561
  }
530
- _context6.next = 25;
562
+ _context6.next = 27;
531
563
  return this.getCustomerWallet(resultDiscountList[0].customer_id);
532
- case 25:
564
+ case 27:
565
+ if (!isAvailable) {
566
+ ids = new Set(withScanList.map(function (item) {
567
+ return String(item.id);
568
+ }));
569
+ retainable = (evaluatedDiscountList || []).filter(function (item) {
570
+ return ids.has(String(item.id)) && isEntitlementPass(item) && !getDiscountLifecycleReason(item);
571
+ });
572
+ if (retainable.length) {
573
+ this.setDiscountList(retainScannedEntitlements(this.getDiscountList(), retainable));
574
+ isAccepted = true;
575
+ }
576
+ }
577
+ if (!this.entitlementPassEnabled) {
578
+ _context6.next = 32;
579
+ break;
580
+ }
581
+ this.store.originalDiscountList = this.getDiscountList();
582
+ _context6.next = 32;
583
+ return (_this$store$discount7 = this.store.discount) === null || _this$store$discount7 === void 0 ? void 0 : _this$store$discount7.setOriginalDiscountList(this.getDiscountList());
584
+ case 32:
533
585
  return _context6.abrupt("return", {
534
586
  type: "clientCalc",
535
587
  isAvailable: isAvailable || false,
536
- productList: newProductList || this.store.productList || [],
537
- discountList: newDiscountList || this.getDiscountList(),
538
- unavailableReason: unavailableReason
588
+ isAccepted: isAccepted,
589
+ productList: isAvailable ? newProductList : this.store.productList || [],
590
+ discountList: this.getDiscountList(),
591
+ unavailableReason: unavailableReason,
592
+ unavailableReasonKey: ((_find = (evaluatedDiscountList || []).find(function (item) {
593
+ return withScanList.some(function (scanned) {
594
+ return String(scanned.id) === String(item.id);
595
+ }) && item.reasonCode;
596
+ })) === null || _find === void 0 ? void 0 : _find.reasonCode) || unavailableReasonKey
539
597
  });
540
- case 28:
541
- _context6.prev = 28;
598
+ case 35:
599
+ _context6.prev = 35;
542
600
  _context6.t1 = _context6["catch"](0);
543
601
  console.error('[ShopDiscount] 扫码出错:', _context6.t1);
544
602
  return _context6.abrupt("return", {
@@ -548,11 +606,11 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
548
606
  discountList: this.getDiscountList(),
549
607
  unavailableReason: UnavailableReason.Unknown
550
608
  });
551
- case 32:
609
+ case 39:
552
610
  case "end":
553
611
  return _context6.stop();
554
612
  }
555
- }, _callee6, this, [[0, 28]]);
613
+ }, _callee6, this, [[0, 35]]);
556
614
  }));
557
615
  function scanCode(_x5, _x6) {
558
616
  return _scanCode.apply(this, arguments);
@@ -562,8 +620,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
562
620
  }, {
563
621
  key: "calcDiscountApplicableProductTotalPrice",
564
622
  value: function calcDiscountApplicableProductTotalPrice(discount) {
565
- var _this$store$discount5;
566
- return (_this$store$discount5 = this.store.discount) === null || _this$store$discount5 === void 0 ? void 0 : _this$store$discount5.calcDiscountApplicableProductTotalPrice(discount);
623
+ var _this$store$discount8;
624
+ return (_this$store$discount8 = this.store.discount) === null || _this$store$discount8 === void 0 ? void 0 : _this$store$discount8.calcDiscountApplicableProductTotalPrice(discount);
567
625
  }
568
626
 
569
627
  // =========== 私有辅助方法 ===========
@@ -608,7 +666,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
608
666
  key: "setDiscountList",
609
667
  value: function setDiscountList(discountList) {
610
668
  var _this3 = this,
611
- _this$store$discount6;
669
+ _this$hooks,
670
+ _this$store$discount9;
612
671
  var productList = this.store.productList || [];
613
672
  var editModeDiscountList = [];
614
673
  productList.forEach(function (item) {
@@ -649,8 +708,14 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
649
708
  });
650
709
  }
651
710
  });
652
- var newDiscountList = [].concat(editModeDiscountList, _toConsumableArray(discountList.filter(function (item) {
653
- return !item.isDisabled;
711
+ var newDiscountList = this.entitlementPassEnabled ? withCommittedEntitlementDetails([].concat(_toConsumableArray(editModeDiscountList.filter(function (item) {
712
+ return !isEntitlementPass(item);
713
+ })), _toConsumableArray(discountList.filter(function (item) {
714
+ return isEntitlementPass(item) || !item.isDisabled;
715
+ }))), productList, ((_this$hooks = this.hooks) === null || _this$hooks === void 0 ? void 0 : _this$hooks.getProduct) || function (item) {
716
+ return item;
717
+ }) : [].concat(editModeDiscountList, _toConsumableArray(discountList.filter(function (item) {
718
+ return !item.isDisabled && !isEntitlementPass(item);
654
719
  })));
655
720
  var isProductFree = function isProductFree(id) {
656
721
  var _this3$hooks2;
@@ -691,7 +756,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
691
756
  item.isDisabledForProductUsed = false;
692
757
  }
693
758
  });
694
- (_this$store$discount6 = this.store.discount) === null || _this$store$discount6 === void 0 || _this$store$discount6.setDiscountList(newDiscountList);
759
+ (_this$store$discount9 = this.store.discount) === null || _this$store$discount9 === void 0 || _this$store$discount9.setDiscountList(newDiscountList);
695
760
  this.emitDiscountListChange(newDiscountList);
696
761
  return newDiscountList;
697
762
  }
@@ -700,8 +765,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
700
765
  }, {
701
766
  key: "getDiscountList",
702
767
  value: function getDiscountList() {
703
- var _this$store$discount7;
704
- return ((_this$store$discount7 = this.store.discount) === null || _this$store$discount7 === void 0 ? void 0 : _this$store$discount7.getDiscountList()) || [];
768
+ var _this$store$discount10;
769
+ return ((_this$store$discount10 = this.store.discount) === null || _this$store$discount10 === void 0 ? void 0 : _this$store$discount10.getDiscountList()) || [];
705
770
  }
706
771
 
707
772
  // 获取客户钱包信息
@@ -709,7 +774,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
709
774
  key: "getCustomerWallet",
710
775
  value: function () {
711
776
  var _getCustomerWallet = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(id) {
712
- var _result, customer;
777
+ var _result, customer, customerUpdate;
713
778
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
714
779
  while (1) switch (_context8.prev = _context8.next) {
715
780
  case 0:
@@ -721,25 +786,32 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
721
786
  case 3:
722
787
  _result = _context8.sent;
723
788
  if (!(_result !== null && _result !== void 0 && _result.data)) {
724
- _context8.next = 9;
789
+ _context8.next = 12;
725
790
  break;
726
791
  }
727
792
  customer = Object.assign({}, (_objectDestructuringEmpty(_result.data), _result.data));
728
- this.setCustomer(customer);
729
- _context8.next = 9;
793
+ customerUpdate = this.setCustomer(customer);
794
+ if (!this.entitlementPassEnabled) {
795
+ _context8.next = 10;
796
+ break;
797
+ }
798
+ _context8.next = 10;
799
+ return customerUpdate;
800
+ case 10:
801
+ _context8.next = 12;
730
802
  return this.core.effects.emit("".concat(this.name, ":onScanCustomerChange"), customer);
731
- case 9:
732
- _context8.next = 14;
803
+ case 12:
804
+ _context8.next = 17;
733
805
  break;
734
- case 11:
735
- _context8.prev = 11;
806
+ case 14:
807
+ _context8.prev = 14;
736
808
  _context8.t0 = _context8["catch"](0);
737
809
  console.error('[ShopDiscount] 获取客户钱包信息出错:', _context8.t0);
738
- case 14:
810
+ case 17:
739
811
  case "end":
740
812
  return _context8.stop();
741
813
  }
742
- }, _callee8, this, [[0, 11]]);
814
+ }, _callee8, this, [[0, 14]]);
743
815
  }));
744
816
  function getCustomerWallet(_x8) {
745
817
  return _getCustomerWallet.apply(this, arguments);
@@ -783,68 +855,79 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
783
855
  key: "loadPrepareConfig",
784
856
  value: function () {
785
857
  var _loadPrepareConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(params) {
786
- var _this$getCustomer2, _this$store$discount8, _this$getDiscountList, _this$store$discount9, _this$store$productLi2, orderId, customerId, goodPassList, scanDiscount, scanDiscountIds, newGoodPassList, newDiscountList, filteredDiscountList, _result3;
858
+ var _this4 = this;
859
+ var _this$getCustomer2, _this$store$discount11, _this$getCustomer3, _this$store$discount12, _this$store$discount13, _this$store$productLi2, entitlementPassEnabled, orderId, customerId, goodPassList, newDiscountList, filteredDiscountList, _result3;
787
860
  return _regeneratorRuntime().wrap(function _callee10$(_context10) {
788
861
  while (1) switch (_context10.prev = _context10.next) {
789
862
  case 0:
790
863
  _context10.prev = 0;
864
+ entitlementPassEnabled = this.entitlementPassEnabled;
791
865
  orderId = this.store.orderId;
792
866
  customerId = params.customerId || ((_this$getCustomer2 = this.getCustomer()) === null || _this$getCustomer2 === void 0 ? void 0 : _this$getCustomer2.id); // if (customerId === 1 || !customerId) {
793
867
  // return
794
868
  // }
795
- _context10.next = 5;
796
- return (_this$store$discount8 = this.store.discount) === null || _this$store$discount8 === void 0 ? void 0 : _this$store$discount8.loadPrepareConfig(_objectSpread({
869
+ _context10.next = 6;
870
+ return (_this$store$discount11 = this.store.discount) === null || _this$store$discount11 === void 0 ? void 0 : _this$store$discount11.loadPrepareConfig(_objectSpread(_objectSpread({
797
871
  customer_id: customerId,
798
872
  action: orderId ? 'edit' : 'create',
799
873
  with_good_pass: 1,
800
874
  with_discount_card: 1,
801
- with_wallet_pass_holder: 1,
875
+ with_wallet_pass_holder: 1
876
+ }, this.entitlementPassEnabled ? {
877
+ with_entitlement_pass: 1,
878
+ filter_order_wallet_pass_usage: 0
879
+ } : {}), {}, {
802
880
  request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
803
881
  }, orderId ? {
804
882
  order_id: orderId
805
883
  } : {}));
806
- case 5:
884
+ case 6:
807
885
  goodPassList = _context10.sent;
808
- scanDiscount = (_this$getDiscountList = this.getDiscountList()) === null || _this$getDiscountList === void 0 ? void 0 : _this$getDiscountList.filter(function (item) {
809
- return item.isScan;
810
- }); // goodPassList 里可能有 scanDiscount 重合的部分,goodPassList 需要剔除
811
- scanDiscountIds = scanDiscount.map(function (n) {
812
- return n.id;
813
- });
814
- newGoodPassList = goodPassList === null || goodPassList === void 0 ? void 0 : goodPassList.filter(function (n) {
815
- return !scanDiscountIds.includes(n.id);
816
- });
817
- newDiscountList = [].concat(_toConsumableArray(scanDiscount), _toConsumableArray(newGoodPassList || [])); // 存储原始优惠券列表
886
+ if (!(entitlementPassEnabled !== this.entitlementPassEnabled)) {
887
+ _context10.next = 9;
888
+ break;
889
+ }
890
+ return _context10.abrupt("return");
891
+ case 9:
892
+ if (!(entitlementPassEnabled && (String(customerId) !== String((_this$getCustomer3 = this.getCustomer()) === null || _this$getCustomer3 === void 0 ? void 0 : _this$getCustomer3.id) || String(orderId) !== String(this.store.orderId)))) {
893
+ _context10.next = 11;
894
+ break;
895
+ }
896
+ return _context10.abrupt("return");
897
+ case 11:
898
+ newDiscountList = mergeEntitlementDiscountLists(this.getDiscountList(), goodPassList || [], (_this$store$discount12 = this.store.discount) === null || _this$store$discount12 === void 0 ? void 0 : _this$store$discount12.getOriginalDiscountList()); // 存储原始优惠券列表
818
899
  this.store.originalDiscountList = newDiscountList;
819
- _context10.next = 13;
820
- return (_this$store$discount9 = this.store.discount) === null || _this$store$discount9 === void 0 ? void 0 : _this$store$discount9.setOriginalDiscountList(newDiscountList);
821
- case 13:
900
+ _context10.next = 15;
901
+ return (_this$store$discount13 = this.store.discount) === null || _this$store$discount13 === void 0 ? void 0 : _this$store$discount13.setOriginalDiscountList(newDiscountList);
902
+ case 15:
822
903
  // 根据当前预约时间过滤优惠券列表
823
- filteredDiscountList = this.filterDiscountListByBookingTime(newDiscountList, this.store.currentBookingTime);
904
+ filteredDiscountList = newDiscountList.filter(function (item) {
905
+ return isEntitlementPass(item) || _this4.filterDiscountListByBookingTime([item], _this4.store.currentBookingTime).length > 0;
906
+ });
824
907
  this.store.filteredDiscountList = filteredDiscountList;
825
908
  this.setDiscountList(filteredDiscountList || []);
826
909
  if (!((_this$store$productLi2 = this.store.productList) !== null && _this$store$productLi2 !== void 0 && _this$store$productLi2.length)) {
827
- _context10.next = 20;
910
+ _context10.next = 22;
828
911
  break;
829
912
  }
830
913
  _result3 = this.calcDiscount(this.store.productList);
831
- _context10.next = 20;
832
- return this.core.effects.emit("".concat(this.name, ":onLoadPrepareCalcResult"), _result3);
833
- case 20:
834
914
  _context10.next = 22;
835
- return this.core.effects.emit("".concat(this.name, ":onLoadDiscountList"), filteredDiscountList);
915
+ return this.core.effects.emit("".concat(this.name, ":onLoadPrepareCalcResult"), _result3);
836
916
  case 22:
837
- _context10.next = 27;
838
- break;
917
+ _context10.next = 24;
918
+ return this.core.effects.emit("".concat(this.name, ":onLoadDiscountList"), filteredDiscountList);
839
919
  case 24:
840
- _context10.prev = 24;
920
+ _context10.next = 29;
921
+ break;
922
+ case 26:
923
+ _context10.prev = 26;
841
924
  _context10.t0 = _context10["catch"](0);
842
925
  console.error('[ShopDiscount] 加载准备配置出错:', _context10.t0);
843
- case 27:
926
+ case 29:
844
927
  case "end":
845
928
  return _context10.stop();
846
929
  }
847
- }, _callee10, this, [[0, 24]]);
930
+ }, _callee10, this, [[0, 26]]);
848
931
  }));
849
932
  function loadPrepareConfig(_x10) {
850
933
  return _loadPrepareConfig.apply(this, arguments);
@@ -89,3 +89,4 @@ export declare const calculateOrderLevelDiscountAllocation: (discount: Discount,
89
89
  discountAmount: number;
90
90
  difference: number;
91
91
  }>;
92
+ export declare const getDiscountTimeUnavailableReason: (discount: Discount, useTime: string) => 'not_started' | 'time_limit' | 'outside_schedule' | undefined;
@@ -9,6 +9,11 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
9
9
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10
10
  import Decimal from "decimal.js";
11
11
  import dayjs from "dayjs";
12
+ import isSameOrAfter from "dayjs/plugin/isSameOrAfter";
13
+ import isSameOrBefore from "dayjs/plugin/isSameOrBefore";
14
+ import { isEntitlementPass, isFullCoveragePass } from "../../modules/Discount/entitlementPass";
15
+ dayjs.extend(isSameOrAfter);
16
+ dayjs.extend(isSameOrBefore);
12
17
  export var uniqueById = function uniqueById(arr) {
13
18
  var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'id';
14
19
  var seen = new Set();
@@ -42,7 +47,7 @@ export var isAllNormalProduct = function isAllNormalProduct(items) {
42
47
  export var getDiscountAmount = function getDiscountAmount(discount, total, price) {
43
48
  var _discount$metadata;
44
49
  // 商品券
45
- if (discount.tag === 'good_pass') {
50
+ if (isFullCoveragePass(discount)) {
46
51
  return new Decimal(price).minus(new Decimal(price || 0)).toNumber();
47
52
  }
48
53
 
@@ -450,6 +455,7 @@ export var filterDiscountListByBookingTime = function filterDiscountListByBookin
450
455
  }
451
456
  return discountList.filter(function (discount) {
452
457
  var _discount$metadata2;
458
+ if (isEntitlementPass(discount)) return !getDiscountTimeUnavailableReason(discount, bookingTime);
453
459
  if ((discount === null || discount === void 0 || (_discount$metadata2 = discount.metadata) === null || _discount$metadata2 === void 0 ? void 0 : _discount$metadata2.validity_type) === "custom_schedule_validity") {
454
460
  var _discount$custom_sche;
455
461
  return getDateIsInSchedule(bookingTime, ((_discount$custom_sche = discount.custom_schedule_snapshot) === null || _discount$custom_sche === void 0 ? void 0 : _discount$custom_sche.data) || []);
@@ -596,4 +602,37 @@ export var calculateOrderLevelDiscountAllocation = function calculateOrderLevelD
596
602
  }
597
603
  }
598
604
  return result;
605
+ };
606
+ export var getDiscountTimeUnavailableReason = function getDiscountTimeUnavailableReason(discount, useTime) {
607
+ var useTimeDayjs = dayjs(useTime);
608
+ if (!useTimeDayjs.isValid()) return 'time_limit';
609
+ try {
610
+ var _discount$metadata5, _discount$extension_d, _discount$custom_sche3;
611
+ if ((discount === null || discount === void 0 || (_discount$metadata5 = discount.metadata) === null || _discount$metadata5 === void 0 ? void 0 : _discount$metadata5.validity_type) === "custom_schedule_validity") {
612
+ var _discount$custom_sche2;
613
+ return getDateIsInSchedule(useTime, ((_discount$custom_sche2 = discount.custom_schedule_snapshot) === null || _discount$custom_sche2 === void 0 ? void 0 : _discount$custom_sche2.data) || []) ? undefined : 'outside_schedule';
614
+ }
615
+ var isHasStart = !!discount.start_date && !!discount.start_time;
616
+ var startDate = dayjs("".concat(discount.start_date, " ").concat(discount.start_time));
617
+
618
+ // 开始时刻包含在有效期内。
619
+ if (isHasStart) {
620
+ if (!startDate.isValid()) return 'time_limit';
621
+ if (useTimeDayjs.isBefore(startDate)) return 'not_started';
622
+ }
623
+
624
+ // 到期时刻不再可用;expire_time 为空时为长期有效。
625
+ var expireTime = discount.expire_time ? dayjs(discount.expire_time) : null;
626
+ var isBeforeExpire = expireTime ? expireTime.isValid() && useTimeDayjs.isBefore(expireTime) : true;
627
+ if (!isBeforeExpire) return 'time_limit';
628
+ var validity = (_discount$extension_d = discount.extension_data) === null || _discount$extension_d === void 0 || (_discount$extension_d = _discount$extension_d.find(function (field) {
629
+ return field.field_key === 'valid_times';
630
+ })) === null || _discount$extension_d === void 0 ? void 0 : _discount$extension_d.value;
631
+ if ((validity === null || validity === void 0 ? void 0 : validity.restrict_use_by_schedule) === true && !getDateIsInSchedule(useTime, ((_discount$custom_sche3 = discount.custom_schedule_snapshot) === null || _discount$custom_sche3 === void 0 ? void 0 : _discount$custom_sche3.data) || [])) {
632
+ return 'outside_schedule';
633
+ }
634
+ return undefined;
635
+ } catch (error) {
636
+ return 'time_limit';
637
+ }
599
638
  };