@pisell/pisellos 2.3.164 → 2.3.166

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 (77) hide show
  1. package/dist/model/strategy/adapter/promotion/evaluator.js +89 -104
  2. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  3. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +28 -4
  4. package/dist/modules/Holder/utils.d.ts +2 -0
  5. package/dist/modules/Holder/utils.js +32 -2
  6. package/dist/modules/OpenData/contactInfo.d.ts +20 -0
  7. package/dist/modules/OpenData/contactInfo.js +70 -0
  8. package/dist/modules/OpenData/index.d.ts +1 -0
  9. package/dist/modules/OpenData/index.js +1 -0
  10. package/dist/modules/OpenData/types.d.ts +9 -0
  11. package/dist/modules/Order/holderRelations.d.ts +14 -0
  12. package/dist/modules/Order/holderRelations.js +154 -0
  13. package/dist/modules/Order/index.d.ts +1 -1
  14. package/dist/modules/Order/index.js +89 -44
  15. package/dist/modules/Order/types.d.ts +19 -1
  16. package/dist/modules/Order/types.js +2 -0
  17. package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  18. package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
  19. package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
  20. package/dist/modules/Order/utils.d.ts +1 -1
  21. package/dist/modules/Order/utils.js +35 -9
  22. package/dist/modules/Rules/index.js +62 -61
  23. package/dist/server/index.js +18 -12
  24. package/dist/server/modules/order/index.d.ts +4 -0
  25. package/dist/server/modules/order/index.js +255 -190
  26. package/dist/server/modules/order/types.d.ts +3 -0
  27. package/dist/server/modules/products/index.js +3 -2
  28. package/dist/shared/receipt/small-ticket.js +17 -6
  29. package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
  30. package/dist/solution/BaseSales/index.d.ts +4 -0
  31. package/dist/solution/BaseSales/index.js +1116 -935
  32. package/dist/solution/BaseSales/types.d.ts +2 -1
  33. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  34. package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
  35. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +14 -4
  36. package/dist/solution/BookingTicket/index.d.ts +15 -1
  37. package/dist/solution/BookingTicket/index.js +784 -501
  38. package/dist/solution/UnifiedBookingSales/index.js +1 -1
  39. package/lib/model/strategy/adapter/promotion/evaluator.js +9 -14
  40. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  41. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +17 -1
  42. package/lib/modules/Holder/utils.d.ts +2 -0
  43. package/lib/modules/Holder/utils.js +27 -1
  44. package/lib/modules/OpenData/contactInfo.d.ts +20 -0
  45. package/lib/modules/OpenData/contactInfo.js +56 -0
  46. package/lib/modules/OpenData/index.d.ts +1 -0
  47. package/lib/modules/OpenData/index.js +12 -0
  48. package/lib/modules/OpenData/types.d.ts +9 -0
  49. package/lib/modules/Order/holderRelations.d.ts +14 -0
  50. package/lib/modules/Order/holderRelations.js +98 -0
  51. package/lib/modules/Order/index.d.ts +1 -1
  52. package/lib/modules/Order/index.js +44 -12
  53. package/lib/modules/Order/types.d.ts +19 -1
  54. package/lib/modules/Order/types.js +1 -0
  55. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  56. package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
  57. package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
  58. package/lib/modules/Order/utils.d.ts +1 -1
  59. package/lib/modules/Order/utils.js +27 -6
  60. package/lib/modules/Rules/index.js +2 -1
  61. package/lib/server/index.js +6 -0
  62. package/lib/server/modules/order/index.d.ts +4 -0
  63. package/lib/server/modules/order/index.js +46 -4
  64. package/lib/server/modules/order/types.d.ts +3 -0
  65. package/lib/server/modules/products/index.js +2 -1
  66. package/lib/shared/receipt/small-ticket.js +15 -7
  67. package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
  68. package/lib/solution/BaseSales/index.d.ts +4 -0
  69. package/lib/solution/BaseSales/index.js +68 -2
  70. package/lib/solution/BaseSales/types.d.ts +2 -1
  71. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  72. package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
  73. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +16 -8
  74. package/lib/solution/BookingTicket/index.d.ts +15 -1
  75. package/lib/solution/BookingTicket/index.js +132 -3
  76. package/lib/solution/UnifiedBookingSales/index.js +1 -1
  77. package/package.json +1 -1
@@ -1,3 +1,11 @@
1
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
2
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
4
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
8
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
1
9
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
2
10
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
11
  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,6 +18,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
10
18
  import { cloneDeep } from 'lodash-es';
11
19
  import { buildProductLineFingerprint, getSafeProductNum } from "../../../solution/ScanOrder/utils";
12
20
  import { createUuidV4 } from "./orderCollectionIdentity";
21
+ import { getProductHolderRelations } from "../holderRelations";
13
22
 
14
23
  /**
15
24
  * 商品券拆行的身份与回并工具。
@@ -80,15 +89,20 @@ function ensureProductsByUid(tempOrder) {
80
89
  * 正常 Order 写路径会在 normalize 阶段提前创建 UID。
81
90
  */
82
91
  export function ensureUniqueProductLineUids(tempOrder) {
92
+ var discounts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
83
93
  // usedUids 只描述本次 Rules 返回的商品集合,不能直接依赖 productsByUid:
84
94
  // productsByUid 可能还保留已删除行的历史 runtime,历史 UID 不应导致当前行被改号。
85
95
  var usedUids = new Set();
86
96
  var productsByUid = ensureProductsByUid(tempOrder);
97
+ var splitGroups = new Map();
87
98
  tempOrder.products = (tempOrder.products || []).map(function (product) {
88
99
  var sourceUid = getProductLineUid(product);
89
100
  // 单测 mock 或兼容旧 Rules 时可能返回没有 UID 的裸商品。
90
101
  // 这里不主动补 UID,避免一个“校验重复”的工具意外改变旧协议对象形状。
91
102
  if (!sourceUid) return product;
103
+ var group = splitGroups.get(sourceUid) || [];
104
+ group.push(product);
105
+ splitGroups.set(sourceUid, group);
92
106
 
93
107
  // 实际场景:可乐 ×5 首次进入 Rules 时只有一行。
94
108
  // 使用三张券后 Rules 可能返回「可乐 ×2 + 三条可乐 ×1」,但四条都复制原 UID。
@@ -122,6 +136,127 @@ export function ensureUniqueProductLineUids(tempOrder) {
122
136
  usedUids.add(splitUid);
123
137
  return product;
124
138
  });
139
+
140
+ // 仅按本次券上的明确 Holder 分配迁移。数组顺序不能代表券对应的人。
141
+ // 未能明确分配时保留原 UID,不把整组关系复制给每一个拆分行。
142
+ var _iterator = _createForOfIteratorHelper(splitGroups),
143
+ _step;
144
+ try {
145
+ var _loop = function _loop() {
146
+ var _step$value = _slicedToArray(_step.value, 2),
147
+ sourceUid = _step$value[0],
148
+ products = _step$value[1];
149
+ if (products.length < 2) return 0; // continue
150
+ var relations = getProductHolderRelations(tempOrder, {
151
+ metadata: {
152
+ unique_identification_number: sourceUid
153
+ }
154
+ });
155
+ if (!relations.length || relations.some(function (relation) {
156
+ return relation.holder_type !== 'form';
157
+ })) return 0; // continue
158
+ var assignments = new Map();
159
+ var remaining = _toConsumableArray(relations);
160
+ var ambiguous = false;
161
+ var _iterator2 = _createForOfIteratorHelper(products),
162
+ _step2;
163
+ try {
164
+ var _loop2 = function _loop2() {
165
+ var product = _step2.value;
166
+ var holderIds = new Set();
167
+ var _iterator4 = _createForOfIteratorHelper(product.discount_list || []),
168
+ _step4;
169
+ try {
170
+ var _loop3 = function _loop3() {
171
+ var _discount$holder;
172
+ var item = _step4.value;
173
+ var discount = discounts.find(function (candidate) {
174
+ var _item$discount;
175
+ return String(candidate.id) === String((_item$discount = item.discount) === null || _item$discount === void 0 ? void 0 : _item$discount.resource_id);
176
+ });
177
+ if ((discount === null || discount === void 0 || (_discount$holder = discount.holder) === null || _discount$holder === void 0 ? void 0 : _discount$holder.holder_type) !== 'form') return 1; // continue
178
+ var value = discount.holder.holder_id;
179
+ (Array.isArray(value) ? value : [value]).forEach(function (id) {
180
+ var recordId = id && _typeof(id) === 'object' ? id.form_record_id : id;
181
+ if (recordId !== undefined && recordId !== null && recordId !== '') holderIds.add(String(recordId));
182
+ });
183
+ };
184
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
185
+ if (_loop3()) continue;
186
+ }
187
+ } catch (err) {
188
+ _iterator4.e(err);
189
+ } finally {
190
+ _iterator4.f();
191
+ }
192
+ if (!holderIds.size) return 0; // continue
193
+ var assigned = remaining.filter(function (relation) {
194
+ return holderIds.has(String(relation.holder_id));
195
+ });
196
+ if (assigned.length !== Number(product.num)) {
197
+ ambiguous = true;
198
+ return 1; // break
199
+ }
200
+ assignments.set(product, assigned);
201
+ remaining = remaining.filter(function (relation) {
202
+ return !assigned.includes(relation);
203
+ });
204
+ },
205
+ _ret2;
206
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
207
+ _ret2 = _loop2();
208
+ if (_ret2 === 0) continue;
209
+ if (_ret2 === 1) break;
210
+ }
211
+ } catch (err) {
212
+ _iterator2.e(err);
213
+ } finally {
214
+ _iterator2.f();
215
+ }
216
+ var unassigned = products.filter(function (product) {
217
+ return !assignments.has(product);
218
+ });
219
+ if (ambiguous || unassigned.length > 1) return 0; // continue
220
+ if (unassigned.length === 1) {
221
+ if (remaining.length !== Number(unassigned[0].num)) return 0; // continue
222
+ assignments.set(unassigned[0], remaining);
223
+ } else if (remaining.length) return 0; // continue
224
+ var _iterator3 = _createForOfIteratorHelper(assignments),
225
+ _step3;
226
+ try {
227
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
228
+ var _step3$value = _slicedToArray(_step3.value, 2),
229
+ product = _step3$value[0],
230
+ assigned = _step3$value[1];
231
+ var _iterator5 = _createForOfIteratorHelper(assigned),
232
+ _step5;
233
+ try {
234
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
235
+ var relation = _step5.value;
236
+ relation.relation_uuid = String(getProductLineUid(product));
237
+ }
238
+ } catch (err) {
239
+ _iterator5.e(err);
240
+ } finally {
241
+ _iterator5.f();
242
+ }
243
+ }
244
+ } catch (err) {
245
+ _iterator3.e(err);
246
+ } finally {
247
+ _iterator3.f();
248
+ }
249
+ },
250
+ _ret;
251
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
252
+ _ret = _loop();
253
+ if (_ret === 0) continue;
254
+ }
255
+ } catch (err) {
256
+ _iterator.e(err);
257
+ } finally {
258
+ _iterator.f();
259
+ }
125
260
  }
126
261
 
127
262
  /**
@@ -140,12 +275,12 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
140
275
  // 清除客户/商品券后,四行都恢复为无折扣状态,应在本轮重算中立即回并为「可乐 ×5」。
141
276
  var consolidatedProducts = [];
142
277
  var productIndexByKey = new Map();
143
- var _iterator = _createForOfIteratorHelper(tempOrder.products || []),
144
- _step;
278
+ var _iterator6 = _createForOfIteratorHelper(tempOrder.products || []),
279
+ _step6;
145
280
  try {
146
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
281
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
147
282
  var _product$booking_uid, _product$metadata4, _booking_id, _product$metadata5, _product$order_detail, _holder_id, _product$metadata6, _product$metadata7, _product$metadata8, _product$product_sku2, _product$metadata9, _tempOrder$_extend, _product$selling_pric, _product$original_pri, _custom_price, _product$is_charge_ta, _product$gift_card, _product$bundle_edit, _product$metadata$pri, _product$metadata10, _product$metadata$sou, _product$metadata11, _product$metadata$mai, _product$metadata12, _product$metadata$mai2, _product$metadata13, _product$product_vari;
148
- var product = _step.value;
283
+ var product = _step6.value;
149
284
  var productBundle = Array.isArray(product.product_bundle) ? product.product_bundle : [];
150
285
  var hasDiscount = (product.discount_list || []).length > 0 || productBundle.some(function (bundle) {
151
286
  return ((bundle === null || bundle === void 0 ? void 0 : bundle.discount_list) || []).length > 0;
@@ -161,7 +296,7 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
161
296
  // - 手动改价/备注:用户显式表达了不同价格或不同制作要求;
162
297
  // - 称重商品:每次称重的净重和金额属于独立交易事实;
163
298
  // - 预约/holder/历史订单行:分别关联预约、持有人或后端 order_detail。
164
- var hasMergeBoundary = hasDiscount || Boolean(((_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7._giftInfo) || product._giftInfo) || Boolean((_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8._promotion) || isManualProductDiscountLine(product) || hasProductLineNote(product) || Number(((_product$product_sku2 = product.product_sku) === null || _product$product_sku2 === void 0 ? void 0 : _product$product_sku2.open_sold_weight) || 0) === 1 || ((_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.is_edit_for_runtime) === true || bookingId !== undefined && bookingId !== null && bookingId !== 0 && bookingId !== '0' || bookingUid !== undefined && bookingUid !== null && String(bookingUid) !== '' || holderId !== undefined && holderId !== null && String(holderId) !== '' || orderDetailId !== undefined && orderDetailId !== null && orderDetailId !== '';
299
+ var hasMergeBoundary = hasDiscount || Boolean(((_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7._giftInfo) || product._giftInfo) || Boolean((_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8._promotion) || isManualProductDiscountLine(product) || hasProductLineNote(product) || Number(((_product$product_sku2 = product.product_sku) === null || _product$product_sku2 === void 0 ? void 0 : _product$product_sku2.open_sold_weight) || 0) === 1 || ((_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.is_edit_for_runtime) === true || bookingId !== undefined && bookingId !== null && bookingId !== 0 && bookingId !== '0' || bookingUid !== undefined && bookingUid !== null && String(bookingUid) !== '' || getProductHolderRelations(tempOrder, product).length > 0 || holderId !== undefined && holderId !== null && String(holderId) !== '' || orderDetailId !== undefined && orderDetailId !== null && orderDetailId !== '';
165
300
  if (hasMergeBoundary) {
166
301
  consolidatedProducts.push(product);
167
302
  continue;
@@ -219,9 +354,9 @@ export function consolidateDiscountFreeProductLines(tempOrder) {
219
354
  // 保留历史索引比立即清理更安全;当前购物车身份始终以 tempOrder.products 为准。
220
355
  }
221
356
  } catch (err) {
222
- _iterator.e(err);
357
+ _iterator6.e(err);
223
358
  } finally {
224
- _iterator.f();
359
+ _iterator6.f();
225
360
  }
226
361
  tempOrder.products = consolidatedProducts;
227
362
  }
@@ -367,12 +367,26 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
367
367
  _iterator4.f();
368
368
  }
369
369
  if (remap.scope !== 'linked-owner') {
370
- var _iterator5 = _createForOfIteratorHelper(order.products || []),
370
+ var _iterator5 = _createForOfIteratorHelper(order.holder_relations || []),
371
371
  _step5;
372
372
  try {
373
373
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
374
+ var relation = _step5.value;
375
+ if (relation.relation_model === 'order_detail' && String(relation.relation_uuid) === remap.from) {
376
+ relation.relation_uuid = remap.to;
377
+ }
378
+ }
379
+ } catch (err) {
380
+ _iterator5.e(err);
381
+ } finally {
382
+ _iterator5.f();
383
+ }
384
+ var _iterator6 = _createForOfIteratorHelper(order.products || []),
385
+ _step6;
386
+ try {
387
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
374
388
  var _product$metadata, _product$metadata2;
375
- var product = _step5.value;
389
+ var product = _step6.value;
376
390
  if (String((product === null || product === void 0 || (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.parent_unique_identification_number) || '') === remap.from) {
377
391
  product.metadata = _objectSpread(_objectSpread({}, product.metadata || {}), {}, {
378
392
  parent_unique_identification_number: remap.to
@@ -394,9 +408,9 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
394
408
  }
395
409
  }
396
410
  } catch (err) {
397
- _iterator5.e(err);
411
+ _iterator6.e(err);
398
412
  } finally {
399
- _iterator5.f();
413
+ _iterator6.f();
400
414
  }
401
415
  }
402
416
  var productsByUid = (_order$_extend = order._extend) === null || _order$_extend === void 0 ? void 0 : _order$_extend.productsByUid;
@@ -429,12 +443,12 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
429
443
  }
430
444
  }
431
445
  if (remap.kind === 'booking') {
432
- var _iterator6 = _createForOfIteratorHelper(order.products || []),
433
- _step6;
446
+ var _iterator7 = _createForOfIteratorHelper(order.products || []),
447
+ _step7;
434
448
  try {
435
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
449
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
436
450
  var _product$metadata3;
437
- var _product = _step6.value;
451
+ var _product = _step7.value;
438
452
  if (remap.scope === 'linked-owner' && (linkedOwnerIsAmbiguous || getOrderCollectionUid('product', _product) !== remap.referenceOwnerUid)) {
439
453
  continue;
440
454
  }
@@ -448,9 +462,9 @@ export function applyOrderCollectionUidRemaps(sourceOrder, uidRemaps) {
448
462
  }
449
463
  }
450
464
  } catch (err) {
451
- _iterator6.e(err);
465
+ _iterator7.e(err);
452
466
  } finally {
453
- _iterator6.f();
467
+ _iterator7.f();
454
468
  }
455
469
  }
456
470
  },
@@ -173,7 +173,7 @@ export declare function resolveManualOverrideLineOriginalPrice(params: {
173
173
  * // => -4
174
174
  */
175
175
  export declare function resolveEffectivePerUnitDiscount(product: Record<string, any>): number;
176
- export declare function createDefaultOrderRulesHooks(getBookings?: () => OrderTempOrder['bookings']): RulesParamsHooks;
176
+ export declare function createDefaultOrderRulesHooks(getBookings?: () => OrderTempOrder['bookings'], getHolderRelations?: () => OrderTempOrder['holder_relations']): RulesParamsHooks;
177
177
  /**
178
178
  * 通过 session 类商品的开始时间结束时间生成商品的时长
179
179
  * @param {CartItem} cartItem
@@ -1,6 +1,6 @@
1
1
  var _excluded = ["custom_product_bundle_map_id"],
2
2
  _excluded2 = ["unique_identification_number"],
3
- _excluded3 = ["num", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per", "production_code"],
3
+ _excluded3 = ["num", "_extend", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per", "production_code"],
4
4
  _excluded4 = ["_extend", "relation_id", "table_form_id", "resource_id", "summary", "lastOrderInfo", "paid_amount", "shop_id", "shop_note", "shop_service_type", "start_time", "customer", "discount_list", "order_meta_list", "tax_fee", "total_amount", "total_refund_amount", "create_date", "holder_id", "payment_status", "notes"],
5
5
  _excluded5 = ["collect_pax", "table_occupancy_duration", "cart_settlement_key", "cart_settlement_snapshot", "legal_currency_snapshot"];
6
6
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
@@ -22,6 +22,7 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symb
22
22
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
23
23
  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; }
24
24
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
25
+ import { cloneDeep } from 'lodash-es';
25
26
  import dayjs from "dayjs";
26
27
  import customParseFormat from 'dayjs/plugin/customParseFormat';
27
28
  import Decimal from 'decimal.js';
@@ -32,6 +33,7 @@ import { buildProductLineFingerprint, createEmptySummary } from "../../solution/
32
33
  import { createUuidV4 } from "./utils/orderCollectionIdentity";
33
34
  import { encodeSalesNotes } from "./salesNotes";
34
35
  import { isFulfillmentTimingBooking } from "./pickupTiming";
36
+ import { ensureHolderRelationUuids, getProductHolderRelations, hasProductBooking, removeProductHolderRelations } from "./holderRelations";
35
37
  dayjs.extend(customParseFormat);
36
38
  var POINT_CARD_SNAPSHOT_TAG = 'point_card';
37
39
  var VIRTUAL_CURRENCY_SNAPSHOT_TAG = 'virtual_currency';
@@ -796,7 +798,7 @@ export function resolveEffectivePerUnitDiscount(product) {
796
798
  if (!Number.isFinite(originalPrice) || !Number.isFinite(finalPrice)) return fromList;
797
799
  return fromList + (originalPrice - finalPrice);
798
800
  }
799
- export function createDefaultOrderRulesHooks(getBookings) {
801
+ export function createDefaultOrderRulesHooks(getBookings, getHolderRelations) {
800
802
  var getProductStartDate = function getProductStartDate(product) {
801
803
  var _ref17, _product$metadata$uni, _product$metadata2, _ref18, _product$booking_uid, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6;
802
804
  var productUid = String((_ref17 = (_product$metadata$uni = (_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.unique_identification_number) !== null && _product$metadata$uni !== void 0 ? _product$metadata$uni : product.unique_identification_number) !== null && _ref17 !== void 0 ? _ref17 : '');
@@ -919,7 +921,13 @@ export function createDefaultOrderRulesHooks(getBookings) {
919
921
  // 勿写死 false:否则 Rules 不会走 total≠origin_total 的手动价推断,
920
922
  // 无券时会把 bundle 价还原成 original_price(手动改价套餐会从 20 回到 30)。
921
923
  isManualDiscount: resolveRulesManualDiscountFlag(metadataAny),
922
- holder_id: (_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.holder_id,
924
+ holder_id: hasProductBooking(product) || !getHolderRelations ? (_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.holder_id : getProductHolderRelations({
925
+ holder_relations: getHolderRelations()
926
+ }, product).filter(function (relation) {
927
+ return relation.holder_type === 'form';
928
+ }).map(function (relation) {
929
+ return relation.holder_id;
930
+ }),
923
931
  startDate: getProductStartDate(product),
924
932
  main_product_selling_price: metadataAny.main_product_selling_price !== undefined ? new Decimal(Number(metadataAny.main_product_selling_price) || 0).minus(optionSellingSum).toDecimalPlaces(2).toString() : undefined,
925
933
  inPromotion: ((_metadataAny$_promoti = metadataAny._promotion) === null || _metadataAny$_promoti === void 0 ? void 0 : _metadataAny$_promoti.inPromotion) === true,
@@ -1216,6 +1224,7 @@ function normalizeSubmitProduct(product) {
1216
1224
  _runtimeUid = _ref37.unique_identification_number,
1217
1225
  submitProduct = _objectWithoutProperties(_ref37, _excluded2);
1218
1226
  var num = submitProduct.num,
1227
+ _productExtend = submitProduct._extend,
1219
1228
  _productSurchargeFee = submitProduct.surcharge_fee,
1220
1229
  _deprecatedDiscountAmount = submitProduct.discount_amount,
1221
1230
  _deprecatedDiscountType = submitProduct.discount_type,
@@ -1406,6 +1415,7 @@ export function createDefaultTempOrder(params) {
1406
1415
  request_unique_idempotency_token: '',
1407
1416
  vouchers: [],
1408
1417
  products: [],
1418
+ holder_relations: [],
1409
1419
  notes: [],
1410
1420
  bookings: [],
1411
1421
  payments: [],
@@ -1482,6 +1492,7 @@ export function buildSubmitPayload(params) {
1482
1492
  type = params.type,
1483
1493
  summary = params.summary,
1484
1494
  enhance = params.enhance;
1495
+ ensureHolderRelationUuids(tempOrder);
1485
1496
  var scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
1486
1497
  var bookingUuid = createUuidV4();
1487
1498
  var virtualSettlementMode = ((_tempOrder$metadata2 = tempOrder.metadata) === null || _tempOrder$metadata2 === void 0 || (_tempOrder$metadata2 = _tempOrder$metadata2.currency_settlement_config) === null || _tempOrder$metadata2 === void 0 ? void 0 : _tempOrder$metadata2.settlement_type) === 'virtual_currency';
@@ -1518,7 +1529,9 @@ export function buildSubmitPayload(params) {
1518
1529
  tempOrderBusinessCode: tempOrder.business_code,
1519
1530
  bookings: tempOrder.bookings
1520
1531
  });
1521
- var payload = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tempOrderRest), {}, {
1532
+ var payload = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tempOrderRest), tempOrder.holder_relations !== undefined ? {
1533
+ holder_relations: cloneDeep(tempOrder.holder_relations)
1534
+ } : {}), {}, {
1522
1535
  customer_id: (_tempOrder$customer_i = tempOrder.customer_id) !== null && _tempOrder$customer_i !== void 0 ? _tempOrder$customer_i : 1,
1523
1536
  customer_name: tempOrder.customer_name || 'Walk-In',
1524
1537
  country_calling_code: String((_tempOrder$country_ca = tempOrder.country_calling_code) !== null && _tempOrder$country_ca !== void 0 ? _tempOrder$country_ca : ''),
@@ -1705,21 +1718,32 @@ export function hasAssignedHolderId(value) {
1705
1718
  * clearTempOrderHolderAssignments(tempOrder);
1706
1719
  */
1707
1720
  export function clearTempOrderHolderAssignments(tempOrder) {
1708
- var _tempOrder$_extend2;
1709
- var changed = false;
1721
+ var _tempOrder$holder_rel, _tempOrder$holder_rel2, _tempOrder$_extend2;
1722
+ var previousRelationCount = ((_tempOrder$holder_rel = tempOrder.holder_relations) === null || _tempOrder$holder_rel === void 0 ? void 0 : _tempOrder$holder_rel.length) || 0;
1723
+ removeProductHolderRelations(tempOrder, (tempOrder.products || []).filter(function (product) {
1724
+ return !hasProductBooking(product);
1725
+ }));
1726
+ var changed = previousRelationCount !== (((_tempOrder$holder_rel2 = tempOrder.holder_relations) === null || _tempOrder$holder_rel2 === void 0 ? void 0 : _tempOrder$holder_rel2.length) || 0);
1710
1727
  var resetHolderField = function resetHolderField(target) {
1711
1728
  var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'holder_id';
1712
1729
  if (!hasAssignedHolderId(target[key])) return;
1713
1730
  target[key] = null;
1714
1731
  changed = true;
1715
1732
  };
1733
+ var clearHolder = function clearHolder(target) {
1734
+ resetHolderField(target);
1735
+ if (target.holder !== undefined && target.holder !== null) {
1736
+ target.holder = null;
1737
+ changed = true;
1738
+ }
1739
+ };
1716
1740
  var _iterator8 = _createForOfIteratorHelper(tempOrder.products || []),
1717
1741
  _step8;
1718
1742
  try {
1719
1743
  for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
1720
1744
  var product = _step8.value;
1721
1745
  if (product.metadata && _typeof(product.metadata) === 'object') {
1722
- resetHolderField(product.metadata);
1746
+ clearHolder(product.metadata);
1723
1747
  }
1724
1748
  }
1725
1749
  } catch (err) {
@@ -1752,11 +1776,13 @@ export function clearTempOrderHolderAssignments(tempOrder) {
1752
1776
  var entry = _Object$values[_i4];
1753
1777
  var origin = entry === null || entry === void 0 ? void 0 : entry.origin;
1754
1778
  if (!origin || _typeof(origin) !== 'object') continue;
1779
+ clearHolder(origin);
1755
1780
  if (origin.metadata && _typeof(origin.metadata) === 'object') {
1756
- resetHolderField(origin.metadata);
1781
+ clearHolder(origin.metadata);
1757
1782
  }
1758
1783
  if (origin._extend && _typeof(origin._extend) === 'object') {
1759
- resetHolderField(origin._extend);
1784
+ clearHolder(origin._extend);
1785
+ delete origin._extend.holder_relations;
1760
1786
  }
1761
1787
  }
1762
1788
  }