@pisell/pisellos 2.3.49 → 2.3.50

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 (162) hide show
  1. package/dist/modules/Discount/index.d.ts +1 -0
  2. package/dist/modules/Discount/index.js +40 -11
  3. package/dist/modules/Discount/types.d.ts +1 -0
  4. package/dist/modules/Holder/index.d.ts +48 -0
  5. package/dist/modules/Holder/index.js +640 -0
  6. package/dist/modules/Holder/types.d.ts +123 -0
  7. package/dist/modules/Holder/types.js +1 -0
  8. package/dist/modules/Holder/utils.d.ts +13 -0
  9. package/dist/modules/Holder/utils.js +34 -0
  10. package/dist/modules/OpenData/index.js +2 -2
  11. package/dist/modules/Order/index.d.ts +3 -1
  12. package/dist/modules/Order/index.js +54 -25
  13. package/dist/modules/Order/types.d.ts +9 -0
  14. package/dist/modules/Order/utils.d.ts +10 -0
  15. package/dist/modules/Order/utils.js +35 -3
  16. package/dist/modules/Payment/types.d.ts +0 -8
  17. package/dist/modules/Payment/walletpass.d.ts +1 -7
  18. package/dist/modules/Payment/walletpass.js +45 -155
  19. package/dist/modules/Product/types.d.ts +1 -0
  20. package/dist/modules/ProductList/index.js +33 -14
  21. package/dist/modules/Quotation/index.d.ts +1 -1
  22. package/dist/modules/Quotation/index.js +2 -2
  23. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  24. package/dist/modules/ResourcePlanner/index.js +181 -0
  25. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  26. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  27. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  28. package/dist/modules/ResourcePlanner/types.js +1 -0
  29. package/dist/modules/Rules/index.js +47 -13
  30. package/dist/modules/SalesSummary/index.js +12 -13
  31. package/dist/modules/ScanOrderLogger/index.d.ts +2 -0
  32. package/dist/modules/ScanOrderLogger/index.js +15 -2
  33. package/dist/modules/ScanOrderLogger/providers/feishu.js +45 -27
  34. package/dist/modules/ScanOrderLogger/types.d.ts +1 -0
  35. package/dist/modules/Schedule/index.d.ts +3 -1
  36. package/dist/modules/Schedule/index.js +21 -16
  37. package/dist/modules/Summary/utils.js +38 -13
  38. package/dist/modules/index.d.ts +2 -0
  39. package/dist/modules/index.js +3 -1
  40. package/dist/plugins/window.d.ts +1 -0
  41. package/dist/server/index.d.ts +14 -0
  42. package/dist/server/index.js +907 -793
  43. package/dist/server/modules/index.d.ts +1 -1
  44. package/dist/server/modules/order/index.d.ts +0 -16
  45. package/dist/server/modules/order/index.js +776 -964
  46. package/dist/server/modules/order/types.d.ts +0 -14
  47. package/dist/server/modules/order/types.js +0 -6
  48. package/dist/solution/BaseSales/index.d.ts +8 -3
  49. package/dist/solution/BaseSales/index.js +64 -50
  50. package/dist/solution/BookingByStep/index.d.ts +17 -2
  51. package/dist/solution/BookingByStep/index.js +294 -215
  52. package/dist/solution/BookingByStep/types.d.ts +2 -1
  53. package/dist/solution/BookingByStep/types.js +3 -1
  54. package/dist/solution/BookingByStep/utils/capacity.js +17 -1
  55. package/dist/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  56. package/dist/solution/BookingByStep/utils/timeslots.js +19 -12
  57. package/dist/solution/BookingTicket/index.d.ts +1 -1
  58. package/dist/solution/BookingTicket/index.js +2 -2
  59. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  60. package/dist/solution/BookingTicket/utils/scan/handleScan.js +10 -2
  61. package/dist/solution/ScanOrder/index.d.ts +26 -14
  62. package/dist/solution/ScanOrder/index.js +1142 -739
  63. package/dist/solution/ScanOrder/types.d.ts +21 -1
  64. package/dist/solution/ScanOrder/utils.d.ts +8 -0
  65. package/dist/solution/ScanOrder/utils.js +66 -25
  66. package/dist/solution/ShopDiscount/index.d.ts +1 -0
  67. package/dist/solution/ShopDiscount/index.js +125 -87
  68. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  69. package/dist/solution/UnifiedBookingSales/index.js +1891 -0
  70. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  71. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  72. package/dist/solution/VenueBooking/index.d.ts +39 -11
  73. package/dist/solution/VenueBooking/index.js +1167 -841
  74. package/dist/solution/VenueBooking/types.d.ts +3 -0
  75. package/dist/solution/VenueBooking/utils/resource.js +1 -0
  76. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  77. package/dist/solution/VenueBooking/utils/slotMerge.js +10 -5
  78. package/dist/solution/index.d.ts +1 -0
  79. package/dist/solution/index.js +2 -1
  80. package/dist/types/index.d.ts +1 -0
  81. package/lib/model/strategy/adapter/promotion/index.js +51 -0
  82. package/lib/modules/Discount/index.d.ts +1 -0
  83. package/lib/modules/Discount/index.js +9 -0
  84. package/lib/modules/Discount/types.d.ts +1 -0
  85. package/lib/modules/Holder/index.d.ts +48 -0
  86. package/lib/modules/Holder/index.js +402 -0
  87. package/lib/modules/Holder/types.d.ts +123 -0
  88. package/lib/modules/Holder/types.js +17 -0
  89. package/lib/modules/Holder/utils.d.ts +13 -0
  90. package/lib/modules/Holder/utils.js +71 -0
  91. package/lib/modules/OpenData/index.js +1 -1
  92. package/lib/modules/Order/index.d.ts +3 -1
  93. package/lib/modules/Order/index.js +26 -10
  94. package/lib/modules/Order/types.d.ts +9 -0
  95. package/lib/modules/Order/utils.d.ts +10 -0
  96. package/lib/modules/Order/utils.js +36 -5
  97. package/lib/modules/Payment/types.d.ts +0 -8
  98. package/lib/modules/Payment/walletpass.d.ts +1 -7
  99. package/lib/modules/Payment/walletpass.js +9 -107
  100. package/lib/modules/Product/types.d.ts +1 -0
  101. package/lib/modules/ProductList/index.js +40 -31
  102. package/lib/modules/Quotation/index.d.ts +1 -1
  103. package/lib/modules/Quotation/index.js +2 -2
  104. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  105. package/lib/modules/ResourcePlanner/index.js +148 -0
  106. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  107. package/lib/modules/ResourcePlanner/planner.js +933 -0
  108. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  109. package/lib/modules/ResourcePlanner/types.js +17 -0
  110. package/lib/modules/Rules/index.js +33 -16
  111. package/lib/modules/SalesSummary/index.js +6 -7
  112. package/lib/modules/ScanOrderLogger/index.d.ts +2 -0
  113. package/lib/modules/ScanOrderLogger/index.js +13 -1
  114. package/lib/modules/ScanOrderLogger/providers/feishu.js +15 -6
  115. package/lib/modules/ScanOrderLogger/types.d.ts +1 -0
  116. package/lib/modules/Schedule/index.d.ts +3 -1
  117. package/lib/modules/Schedule/index.js +10 -8
  118. package/lib/modules/Summary/utils.js +21 -1
  119. package/lib/modules/index.d.ts +2 -0
  120. package/lib/modules/index.js +5 -1
  121. package/lib/plugins/window.d.ts +1 -0
  122. package/lib/server/index.d.ts +14 -0
  123. package/lib/server/index.js +72 -15
  124. package/lib/server/modules/index.d.ts +1 -1
  125. package/lib/server/modules/order/index.d.ts +0 -16
  126. package/lib/server/modules/order/index.js +4 -140
  127. package/lib/server/modules/order/types.d.ts +0 -14
  128. package/lib/server/modules/order/types.js +0 -1
  129. package/lib/solution/BaseSales/index.d.ts +8 -3
  130. package/lib/solution/BaseSales/index.js +24 -14
  131. package/lib/solution/BookingByStep/index.d.ts +17 -2
  132. package/lib/solution/BookingByStep/index.js +60 -18
  133. package/lib/solution/BookingByStep/types.d.ts +2 -1
  134. package/lib/solution/BookingByStep/types.js +5 -0
  135. package/lib/solution/BookingByStep/utils/capacity.js +20 -1
  136. package/lib/solution/BookingByStep/utils/timeslots.d.ts +3 -1
  137. package/lib/solution/BookingByStep/utils/timeslots.js +19 -11
  138. package/lib/solution/BookingTicket/index.d.ts +1 -1
  139. package/lib/solution/BookingTicket/index.js +10 -2
  140. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  141. package/lib/solution/BookingTicket/utils/scan/handleScan.js +2 -2
  142. package/lib/solution/ScanOrder/index.d.ts +26 -14
  143. package/lib/solution/ScanOrder/index.js +449 -182
  144. package/lib/solution/ScanOrder/types.d.ts +21 -1
  145. package/lib/solution/ScanOrder/utils.d.ts +8 -0
  146. package/lib/solution/ScanOrder/utils.js +31 -0
  147. package/lib/solution/ShopDiscount/index.d.ts +1 -0
  148. package/lib/solution/ShopDiscount/index.js +14 -0
  149. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  150. package/lib/solution/UnifiedBookingSales/index.js +1084 -0
  151. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  152. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  153. package/lib/solution/VenueBooking/index.d.ts +39 -11
  154. package/lib/solution/VenueBooking/index.js +322 -110
  155. package/lib/solution/VenueBooking/types.d.ts +3 -0
  156. package/lib/solution/VenueBooking/utils/resource.js +1 -0
  157. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -4
  158. package/lib/solution/VenueBooking/utils/slotMerge.js +6 -4
  159. package/lib/solution/index.d.ts +1 -0
  160. package/lib/solution/index.js +3 -1
  161. package/lib/types/index.d.ts +1 -0
  162. package/package.json +1 -1
@@ -46,12 +46,6 @@ function matchesWalletAssetCode(asset, normalizedCode) {
46
46
  (identifier) => String(identifier ?? "").trim() === normalizedCode
47
47
  );
48
48
  }
49
- function normalizeWalletAssetCode(code) {
50
- return String(code ?? "").trim().toUpperCase();
51
- }
52
- function getWalletAssetCodeKeys(asset) {
53
- return [asset == null ? void 0 : asset.code, asset == null ? void 0 : asset.encoded].map(normalizeWalletAssetCode).filter(Boolean);
54
- }
55
49
  function isWalletAssetAvailable(asset) {
56
50
  if (!asset)
57
51
  return false;
@@ -113,23 +107,11 @@ var WalletPassPaymentImpl = class {
113
107
  this.walletInitData = null;
114
108
  this.walletAssetsState = createInitialWalletAssetsState();
115
109
  this.walletAssetsRequestSequence = 0;
116
- this.walletAssetsBehavior = {
117
- autoSelectAfterSearch: true
118
- };
119
- this.pendingAutoSelectSearchCodes = /* @__PURE__ */ new Set();
120
110
  this.walletAssetsCalculationContext = {
121
111
  orderTotalAmount: 0,
122
112
  products: []
123
113
  };
124
114
  }
125
- configureWalletAssetsBehavior(options) {
126
- if (options.autoSelectAfterSearch === void 0)
127
- return;
128
- this.walletAssetsBehavior.autoSelectAfterSearch = options.autoSelectAfterSearch;
129
- if (!options.autoSelectAfterSearch) {
130
- this.pendingAutoSelectSearchCodes.clear();
131
- }
132
- }
133
115
  /**
134
116
  * 发送事件的辅助方法
135
117
  * 支持使用WalletPassHooks或PaymentHooks
@@ -268,25 +250,6 @@ var WalletPassPaymentImpl = class {
268
250
  refreshedAssets
269
251
  );
270
252
  }
271
- isPendingAutoSelectAsset(asset) {
272
- return getWalletAssetCodeKeys(asset).some(
273
- (code) => this.pendingAutoSelectSearchCodes.has(code)
274
- );
275
- }
276
- clearPendingAutoSelectForAsset(asset) {
277
- getWalletAssetCodeKeys(asset).forEach((code) => {
278
- this.pendingAutoSelectSearchCodes.delete(code);
279
- });
280
- }
281
- queuePendingAutoSelectForAssets(assets) {
282
- if (!this.walletAssetsBehavior.autoSelectAfterSearch)
283
- return;
284
- assets.forEach((asset) => {
285
- getWalletAssetCodeKeys(asset).forEach((code) => {
286
- this.pendingAutoSelectSearchCodes.add(code);
287
- });
288
- });
289
- }
290
253
  /**
291
254
  * 生成钱包API默认参数
292
255
  * 根据业务数据生成标准的钱包API参数,并存储在模块中
@@ -814,12 +777,7 @@ var WalletPassPaymentImpl = class {
814
777
  );
815
778
  const selectedIds = preserveSelection ? [...this.walletAssetsState.selectedIds] : [];
816
779
  const selectionSources = preserveSelection ? { ...this.walletAssetsState.selectionSources } : {};
817
- const scanSelectedAssets = preserveSelection ? this.walletAssetsState.selectedItems.filter((asset) => {
818
- const assetId = getWalletAssetId(asset);
819
- return assetId !== void 0 && assetId !== null && selectionSources[String(assetId)] === "scan";
820
- }) : [];
821
780
  if (!((_a = businessData.products) == null ? void 0 : _a.length)) {
822
- this.queuePendingAutoSelectForAssets(scanSelectedAssets);
823
781
  this.generateWalletParams(businessData);
824
782
  const restoredSearchedAssets = this.searchResults.filter(isWalletPaymentAsset).map((item) => ({
825
783
  ...item,
@@ -924,43 +882,11 @@ var WalletPassPaymentImpl = class {
924
882
  }));
925
883
  const latestSelectedIds = preserveSelection ? authoritativeSelectedIds : [];
926
884
  const latestSelectionSources = preserveSelection ? { ...this.walletAssetsState.selectionSources } : {};
927
- const pendingAutoSelectAssets = this.walletAssetsBehavior.autoSelectAfterSearch ? items.filter(
928
- (asset) => this.isPendingAutoSelectAsset(asset) && isWalletAssetAvailable(asset)
929
- ) : [];
930
- const requestedKeySet = new Set(
931
- latestSelectedIds.map((id) => String(id))
932
- );
933
- pendingAutoSelectAssets.forEach((asset) => {
934
- const assetId = getWalletAssetId(asset);
935
- if (assetId === void 0 || assetId === null)
936
- return;
937
- const assetKey = String(assetId);
938
- if (!requestedKeySet.has(assetKey)) {
939
- requestedKeySet.add(assetKey);
940
- latestSelectedIds.push(assetId);
941
- }
942
- latestSelectionSources[assetKey] = "scan";
943
- });
944
- const nextState = this.recalculateWalletAssets(
885
+ return this.recalculateWalletAssets(
945
886
  items,
946
887
  latestSelectedIds,
947
888
  latestSelectionSources
948
889
  );
949
- const selectedKeySet = new Set(
950
- nextState.selectedIds.map((id) => String(id))
951
- );
952
- pendingAutoSelectAssets.forEach((asset) => {
953
- const assetId = getWalletAssetId(asset);
954
- if (assetId !== void 0 && assetId !== null && selectedKeySet.has(String(assetId))) {
955
- this.clearPendingAutoSelectForAsset(asset);
956
- }
957
- });
958
- const droppedScanSelectedAssets = scanSelectedAssets.filter((asset) => {
959
- const assetId = getWalletAssetId(asset);
960
- return assetId !== void 0 && assetId !== null && !selectedKeySet.has(String(assetId));
961
- });
962
- this.queuePendingAutoSelectForAssets(droppedScanSelectedAssets);
963
- return nextState;
964
890
  } catch (error) {
965
891
  if (requestSequence !== this.walletAssetsRequestSequence) {
966
892
  return this.getWalletAssetsState();
@@ -1000,9 +926,6 @@ var WalletPassPaymentImpl = class {
1000
926
  return {
1001
927
  state: this.getWalletAssetsState(),
1002
928
  searchResults: [...this.searchResults],
1003
- pendingAutoSelectSearchCodes: [
1004
- ...this.pendingAutoSelectSearchCodes
1005
- ],
1006
929
  walletParams: this.walletParams ? { ...this.walletParams } : null,
1007
930
  calculationContext: {
1008
931
  orderTotalAmount: this.walletAssetsCalculationContext.orderTotalAmount,
@@ -1016,9 +939,6 @@ var WalletPassPaymentImpl = class {
1016
939
  return this.getWalletAssetsState();
1017
940
  this.walletAssetsRequestSequence += 1;
1018
941
  this.searchResults = Array.isArray(snapshot.searchResults) ? [...snapshot.searchResults] : [];
1019
- this.pendingAutoSelectSearchCodes = this.walletAssetsBehavior.autoSelectAfterSearch && Array.isArray(snapshot.pendingAutoSelectSearchCodes) ? new Set(
1020
- snapshot.pendingAutoSelectSearchCodes.map(normalizeWalletAssetCode).filter(Boolean)
1021
- ) : /* @__PURE__ */ new Set();
1022
942
  this.walletParams = snapshot.walletParams ? { ...snapshot.walletParams } : null;
1023
943
  this.walletAssetsCalculationContext = {
1024
944
  orderTotalAmount: Number(
@@ -1037,9 +957,6 @@ var WalletPassPaymentImpl = class {
1037
957
  }
1038
958
  selectWalletAsset(assetId, options) {
1039
959
  const assetKey = String(assetId);
1040
- const asset = this.walletAssetsState.items.find(
1041
- (item) => getWalletAssetKey(item) === assetKey
1042
- );
1043
960
  const committedKeys = new Set(
1044
961
  this.walletAssetsState.committedIds.map((id) => String(id))
1045
962
  );
@@ -1051,23 +968,20 @@ var WalletPassPaymentImpl = class {
1051
968
  const selectionSources = { ...this.walletAssetsState.selectionSources };
1052
969
  delete selectionSources[assetKey];
1053
970
  if (options.selected) {
971
+ const asset = this.walletAssetsState.items.find(
972
+ (item) => getWalletAssetKey(item) === assetKey
973
+ );
1054
974
  if (!asset || !isWalletAssetAvailable(asset)) {
1055
975
  return this.getWalletAssetsState();
1056
976
  }
1057
977
  selectedIds.push(assetId);
1058
978
  selectionSources[assetKey] = options.source || "manual";
1059
- } else if (asset) {
1060
- this.clearPendingAutoSelectForAsset(asset);
1061
979
  }
1062
- const nextState = this.recalculateWalletAssets(
980
+ return this.recalculateWalletAssets(
1063
981
  this.walletAssetsState.items,
1064
982
  selectedIds,
1065
983
  selectionSources
1066
984
  );
1067
- if (options.selected && asset && nextState.selectedIds.some((id) => String(id) === assetKey)) {
1068
- this.clearPendingAutoSelectForAsset(asset);
1069
- }
1070
- return nextState;
1071
985
  }
1072
986
  async scanWalletAssetAsync(code) {
1073
987
  const normalizedCode = String(code || "").trim();
@@ -1110,34 +1024,24 @@ var WalletPassPaymentImpl = class {
1110
1024
  };
1111
1025
  }
1112
1026
  const items = mergeWalletAssets(this.walletAssetsState.items, [asset]);
1113
- const recalculatedState = this.recalculateWalletAssets(
1027
+ this.recalculateWalletAssets(
1114
1028
  items,
1115
1029
  this.walletAssetsState.selectedIds,
1116
1030
  this.walletAssetsState.selectionSources
1117
1031
  );
1118
1032
  const assetId = getWalletAssetId(asset);
1119
- const selected = this.walletAssetsBehavior.autoSelectAfterSearch && assetId !== void 0 && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
1033
+ const selected = assetId !== void 0 && isWalletAssetAvailable(asset) ? this.selectWalletAsset(assetId, {
1120
1034
  selected: true,
1121
1035
  source: "scan"
1122
- }) : recalculatedState;
1123
- const isSelected = assetId !== void 0 && selected.selectedIds.some((id) => String(id) === String(assetId));
1124
- if (isSelected) {
1125
- this.clearPendingAutoSelectForAsset(asset);
1126
- } else if (this.walletAssetsBehavior.autoSelectAfterSearch) {
1127
- this.pendingAutoSelectSearchCodes.add(
1128
- normalizeWalletAssetCode(normalizedCode)
1129
- );
1130
- this.queuePendingAutoSelectForAssets([asset]);
1131
- }
1036
+ }) : this.getWalletAssetsState();
1132
1037
  return {
1133
1038
  type: result.type,
1134
1039
  asset,
1135
- selected: isSelected,
1040
+ selected: assetId !== void 0 && selected.selectedIds.some((id) => String(id) === String(assetId)),
1136
1041
  state: selected
1137
1042
  };
1138
1043
  }
1139
1044
  clearWalletAssetSelection() {
1140
- this.pendingAutoSelectSearchCodes.clear();
1141
1045
  return this.recalculateWalletAssets(
1142
1046
  this.walletAssetsState.items,
1143
1047
  [],
@@ -1252,7 +1156,6 @@ var WalletPassPaymentImpl = class {
1252
1156
  */
1253
1157
  clearSearchResults() {
1254
1158
  this.searchResults = [];
1255
- this.pendingAutoSelectSearchCodes.clear();
1256
1159
  this.paymentModule.logInfo("[WalletPass] 搜索结果缓存已清除");
1257
1160
  }
1258
1161
  /**
@@ -1275,7 +1178,6 @@ var WalletPassPaymentImpl = class {
1275
1178
  this.walletRecommendList = [];
1276
1179
  this.userIdentificationCodes = [];
1277
1180
  this.searchResults = [];
1278
- this.pendingAutoSelectSearchCodes.clear();
1279
1181
  this.walletParams = null;
1280
1182
  this.walletInitData = null;
1281
1183
  this.walletAssetsRequestSequence += 1;
@@ -193,6 +193,7 @@ export interface ProductData {
193
193
  status?: string;
194
194
  required?: number | string | boolean;
195
195
  resource_id?: number | string | null;
196
+ [key: string]: any;
196
197
  };
197
198
  /** 组合商品id,动态附加 */
198
199
  product_variant_id?: number;
@@ -106,39 +106,48 @@ var ProductList = class extends import_BaseModule.BaseModule {
106
106
  } catch (error) {
107
107
  console.error(error);
108
108
  }
109
+ const channelMap = {
110
+ online_store: "online-store",
111
+ scan_to_order: "online-store",
112
+ "scan-to-order": "online-store",
113
+ scan_to_order_2: "mobile_order",
114
+ scan_to_order_3: "scantoorder3"
115
+ };
116
+ const rawApplicationCode = (_b = this.otherParams) == null ? void 0 : _b.channel;
117
+ const mappedApplicationCode = typeof rawApplicationCode === "string" ? channelMap[rawApplicationCode] || rawApplicationCode : rawApplicationCode;
118
+ const queryPayload = {
119
+ open_quotation: 1,
120
+ open_bundle: 0,
121
+ exclude_extension_type: [
122
+ "product_party",
123
+ "product_event",
124
+ "product_series_event",
125
+ "product_package_ticket",
126
+ "ticket",
127
+ "event_item"
128
+ ],
129
+ with: ["category", "collection", "resourceRelation"],
130
+ status,
131
+ num: 500,
132
+ skip: 1,
133
+ customer_id,
134
+ ...Array.isArray(category_ids) && category_ids.length ? { category_ids } : {},
135
+ ...Array.isArray(product_ids) && product_ids.length ? { ids: product_ids } : {},
136
+ ...Array.isArray(collection) && collection.length ? { collection } : {},
137
+ front_end_cache_id: cacheId,
138
+ ...Array.isArray(menu_list_ids) && menu_list_ids.length ? { menu_list_ids } : {},
139
+ with_count,
140
+ // client_schedule_ids: schedule_ids,
141
+ schedule_date,
142
+ application_code: mappedApplicationCode,
143
+ is_eject: 1,
144
+ with_schedule,
145
+ schedule_datetime,
146
+ extension_type
147
+ };
109
148
  const productsData = await this.request.post(
110
149
  `/product/query`,
111
- {
112
- open_quotation: 1,
113
- open_bundle: 0,
114
- exclude_extension_type: [
115
- "product_party",
116
- "product_event",
117
- "product_series_event",
118
- "product_package_ticket",
119
- "ticket",
120
- "event_item"
121
- ],
122
- with: ["category", "collection", "resourceRelation"],
123
- status,
124
- num: 500,
125
- skip: 1,
126
- customer_id,
127
- category_ids,
128
- ids: product_ids,
129
- collection,
130
- front_end_cache_id: cacheId,
131
- menu_list_ids,
132
- with_count,
133
- // client_schedule_ids: schedule_ids,
134
- schedule_date,
135
- application_code: (_b = this.otherParams) == null ? void 0 : _b.channel,
136
- is_eject: 1,
137
- with_schedule,
138
- schedule_datetime,
139
- extension_type,
140
- strategy_context
141
- },
150
+ queryPayload,
142
151
  { osServer: true, callback: options == null ? void 0 : options.callback, subscriberId: options == null ? void 0 : options.subscriberId, customToast: () => {
143
152
  } }
144
153
  );
@@ -21,7 +21,7 @@ export declare class QuotationModule extends BaseModule implements Module {
21
21
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
22
22
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
23
23
  *
24
- * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
24
+ * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
25
25
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
26
26
  * the requested productId wins.
27
27
  */
@@ -52,7 +52,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
52
52
  { useCache: false, osServer: true }
53
53
  );
54
54
  const list = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.list) || (res == null ? void 0 : res.list) || [];
55
- list.sort((a, b) => a.sort - b.sort);
55
+ list.sort((a, b) => b.sort - a.sort);
56
56
  this.store.list = list;
57
57
  }
58
58
  getQuotationList() {
@@ -96,7 +96,7 @@ var QuotationModule = class extends import_BaseModule.BaseModule {
96
96
  * Look up the quotation price for a specific product (+ optional variant) at a given datetime.
97
97
  * Returns the price as a string (e.g. "300.00"), or null if no quotation applies.
98
98
  *
99
- * Priority: iterates quotations already sorted by `sort` ascending (lowest = highest priority).
99
+ * Priority: iterates quotations already sorted by `sort` descending (highest = highest priority).
100
100
  * First matching quotation whose schedule covers `datetime` and whose product_data contains
101
101
  * the requested productId wins.
102
102
  */
@@ -0,0 +1,24 @@
1
+ import { BaseModule } from '../BaseModule';
2
+ import type { Module, ModuleOptions, PisellCore } from '../../types';
3
+ import type { ResourcePlannerAssignmentResult, ResourcePlannerAssignableSlotResult, ResourcePlannerContextInput, ResourcePlannerProjection, ResourcePlannerQuery, ResourcePlannerSelectionPatch, ResourcePlannerSnapshot, ResourcePlannerValidationResult } from './types';
4
+ export * from './types';
5
+ export * from './planner';
6
+ export declare enum ResourcePlannerHooks {
7
+ onContextChanged = "resourcePlanner:onContextChanged",
8
+ onSelectionChanged = "resourcePlanner:onSelectionChanged",
9
+ onProjectionChanged = "resourcePlanner:onProjectionChanged"
10
+ }
11
+ export declare class ResourcePlannerModule extends BaseModule implements Module {
12
+ protected defaultName: string;
13
+ protected defaultVersion: string;
14
+ private store;
15
+ initialize(core: PisellCore, options: ModuleOptions): Promise<void>;
16
+ setContext(input: ResourcePlannerContextInput): ResourcePlannerSnapshot;
17
+ mergeContext(input: ResourcePlannerContextInput): ResourcePlannerSnapshot;
18
+ setSelectionPatch(patch: ResourcePlannerSelectionPatch): ResourcePlannerSnapshot;
19
+ queryAvailability(query?: ResourcePlannerQuery): ResourcePlannerProjection;
20
+ autoAssign(query?: ResourcePlannerQuery): ResourcePlannerAssignmentResult;
21
+ resolveAssignableSlots(query?: ResourcePlannerQuery): ResourcePlannerAssignableSlotResult;
22
+ validateSelection(): ResourcePlannerValidationResult;
23
+ getSnapshot(): ResourcePlannerSnapshot;
24
+ }
@@ -0,0 +1,148 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/modules/ResourcePlanner/index.ts
21
+ var ResourcePlanner_exports = {};
22
+ __export(ResourcePlanner_exports, {
23
+ ResourcePlannerHooks: () => ResourcePlannerHooks,
24
+ ResourcePlannerModule: () => ResourcePlannerModule
25
+ });
26
+ module.exports = __toCommonJS(ResourcePlanner_exports);
27
+ var import_BaseModule = require("../BaseModule");
28
+ var import_planner = require("./planner");
29
+ __reExport(ResourcePlanner_exports, require("./types"), module.exports);
30
+ __reExport(ResourcePlanner_exports, require("./planner"), module.exports);
31
+ var ResourcePlannerHooks = /* @__PURE__ */ ((ResourcePlannerHooks2) => {
32
+ ResourcePlannerHooks2["onContextChanged"] = "resourcePlanner:onContextChanged";
33
+ ResourcePlannerHooks2["onSelectionChanged"] = "resourcePlanner:onSelectionChanged";
34
+ ResourcePlannerHooks2["onProjectionChanged"] = "resourcePlanner:onProjectionChanged";
35
+ return ResourcePlannerHooks2;
36
+ })(ResourcePlannerHooks || {});
37
+ var ResourcePlannerModule = class extends import_BaseModule.BaseModule {
38
+ constructor() {
39
+ super(...arguments);
40
+ this.defaultName = "resourcePlanner";
41
+ this.defaultVersion = "1.0.0";
42
+ }
43
+ async initialize(core, options) {
44
+ this.core = core;
45
+ const initialState = options.initialState;
46
+ this.store = {
47
+ context: (0, import_planner.normalizePlannerContext)((initialState == null ? void 0 : initialState.context) || import_planner.DEFAULT_RESOURCE_PLANNER_CONTEXT),
48
+ selection: (initialState == null ? void 0 : initialState.selection) || { ...import_planner.DEFAULT_RESOURCE_PLANNER_SELECTION },
49
+ projection: (initialState == null ? void 0 : initialState.projection) || null,
50
+ version: (initialState == null ? void 0 : initialState.version) || 0
51
+ };
52
+ }
53
+ setContext(input) {
54
+ this.store.context = (0, import_planner.normalizePlannerContext)(input);
55
+ this.store.version += 1;
56
+ this.store.projection = null;
57
+ const snapshot = this.getSnapshot();
58
+ void this.core.effects.emit(`${this.name}:contextChanged`, snapshot);
59
+ return snapshot;
60
+ }
61
+ mergeContext(input) {
62
+ return this.setContext({
63
+ ...this.store.context,
64
+ ...input,
65
+ products: input.products || this.store.context.products,
66
+ resources: input.resources || this.store.context.resources,
67
+ externalEvents: input.externalEvents || this.store.context.externalEvents
68
+ });
69
+ }
70
+ setSelectionPatch(patch) {
71
+ const assignments = patch.assignments ? patch.replaceAssignments === false ? [...this.store.selection.assignments, ...patch.assignments] : patch.assignments : this.store.selection.assignments;
72
+ this.store.selection = {
73
+ ...this.store.selection,
74
+ ...patch,
75
+ productIds: patch.productIds || this.store.selection.productIds,
76
+ resourceIds: patch.resourceIds || this.store.selection.resourceIds,
77
+ assignments
78
+ };
79
+ this.store.version += 1;
80
+ const snapshot = this.getSnapshot();
81
+ void this.core.effects.emit(`${this.name}:selectionChanged`, snapshot);
82
+ return snapshot;
83
+ }
84
+ queryAvailability(query = {}) {
85
+ const mergedQuery = {
86
+ mode: this.store.selection.mode,
87
+ productIds: this.store.selection.productIds,
88
+ date: this.store.selection.date,
89
+ startTime: this.store.selection.startTime,
90
+ endTime: this.store.selection.endTime,
91
+ resourceIds: this.store.selection.resourceIds,
92
+ ...query
93
+ };
94
+ const projection = (0, import_planner.queryPlannerAvailability)(this.store.context, mergedQuery);
95
+ this.store.projection = projection;
96
+ this.store.version += 1;
97
+ void this.core.effects.emit(`${this.name}:projectionChanged`, this.getSnapshot());
98
+ return projection;
99
+ }
100
+ autoAssign(query = {}) {
101
+ const result = (0, import_planner.autoAssignResources)(this.store.context, {
102
+ mode: this.store.selection.mode,
103
+ productIds: this.store.selection.productIds,
104
+ date: this.store.selection.date,
105
+ startTime: this.store.selection.startTime,
106
+ endTime: this.store.selection.endTime,
107
+ resourceIds: this.store.selection.resourceIds,
108
+ ...query
109
+ });
110
+ const resourceIds = Array.from(new Map(
111
+ result.assignments.map((assignment) => [String(assignment.resourceId), assignment.resourceId])
112
+ ).values());
113
+ this.setSelectionPatch({
114
+ assignments: result.assignments,
115
+ ...resourceIds.length ? { resourceIds } : {}
116
+ });
117
+ return result;
118
+ }
119
+ resolveAssignableSlots(query = {}) {
120
+ return (0, import_planner.resolveAssignableSlots)(this.store.context, {
121
+ mode: this.store.selection.mode,
122
+ productIds: this.store.selection.productIds,
123
+ date: this.store.selection.date,
124
+ startTime: this.store.selection.startTime,
125
+ endTime: this.store.selection.endTime,
126
+ resourceIds: this.store.selection.resourceIds,
127
+ ...query
128
+ });
129
+ }
130
+ validateSelection() {
131
+ return (0, import_planner.validateAssignments)(this.store.context, this.store.selection);
132
+ }
133
+ getSnapshot() {
134
+ return {
135
+ context: this.store.context,
136
+ selection: this.store.selection,
137
+ projection: this.store.projection,
138
+ version: this.store.version
139
+ };
140
+ }
141
+ };
142
+ // Annotate the CommonJS export names for ESM import in node:
143
+ 0 && (module.exports = {
144
+ ResourcePlannerHooks,
145
+ ResourcePlannerModule,
146
+ ...require("./types"),
147
+ ...require("./planner")
148
+ });
@@ -0,0 +1,14 @@
1
+ import type { ResourcePlannerAssignmentResult, ResourcePlannerAssignableSlotResult, ResourcePlannerAvailabilityCell, ResourcePlannerContextInput, ResourcePlannerDemandInterval, ResourcePlannerProduct, ResourcePlannerProjection, ResourcePlannerQuery, ResourcePlannerResource, ResourcePlannerSelection, ResourcePlannerValidationResult } from './types';
2
+ export declare const DEFAULT_RESOURCE_PLANNER_CONTEXT: Required<ResourcePlannerContextInput>;
3
+ export declare const DEFAULT_RESOURCE_PLANNER_SELECTION: ResourcePlannerSelection;
4
+ export declare function normalizePlannerContext(input?: ResourcePlannerContextInput): Required<ResourcePlannerContextInput>;
5
+ export declare function buildDemandIntervals(products: ResourcePlannerProduct[], query: ResourcePlannerQuery, context?: Required<ResourcePlannerContextInput>): ResourcePlannerDemandInterval[];
6
+ export declare function evaluateResourceForInterval(params: {
7
+ resource: ResourcePlannerResource;
8
+ interval: ResourcePlannerDemandInterval;
9
+ context: Required<ResourcePlannerContextInput>;
10
+ }): ResourcePlannerAvailabilityCell;
11
+ export declare function queryPlannerAvailability(contextInput: ResourcePlannerContextInput, query?: ResourcePlannerQuery): ResourcePlannerProjection;
12
+ export declare function resolveAssignableSlots(contextInput: ResourcePlannerContextInput, query?: ResourcePlannerQuery): ResourcePlannerAssignableSlotResult;
13
+ export declare function autoAssignResources(contextInput: ResourcePlannerContextInput, query?: ResourcePlannerQuery): ResourcePlannerAssignmentResult;
14
+ export declare function validateAssignments(contextInput: ResourcePlannerContextInput, selection: ResourcePlannerSelection): ResourcePlannerValidationResult;