@pisell/pisellos 2.2.315 → 2.2.316

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 (97) 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 +2 -2
  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 +2 -1
  21. package/dist/modules/Order/utils.js +36 -10
  22. package/dist/modules/Rules/index.js +62 -61
  23. package/dist/server/index.js +36 -28
  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.d.ts +28 -7
  28. package/dist/server/modules/products/index.js +1297 -770
  29. package/dist/server/modules/products/replication.d.ts +8 -0
  30. package/dist/server/modules/products/replication.js +69 -0
  31. package/dist/server/modules/products/types.d.ts +12 -1
  32. package/dist/server/modules/products/types.js +4 -0
  33. package/dist/shared/receipt/small-ticket.js +24 -12
  34. package/dist/shared/receipt/templateVisibility.d.ts +3 -0
  35. package/dist/shared/receipt/templateVisibility.js +6 -2
  36. package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
  37. package/dist/solution/BaseSales/index.d.ts +4 -0
  38. package/dist/solution/BaseSales/index.js +1116 -935
  39. package/dist/solution/BaseSales/types.d.ts +2 -1
  40. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  41. package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
  42. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +14 -4
  43. package/dist/solution/BookingByStep/index.d.ts +1 -1
  44. package/dist/solution/BookingTicket/index.d.ts +15 -1
  45. package/dist/solution/BookingTicket/index.js +784 -501
  46. package/dist/solution/ScanOrder/index.js +65 -31
  47. package/dist/solution/ScanOrder/types.d.ts +3 -0
  48. package/dist/solution/UnifiedBookingSales/index.js +1 -1
  49. package/lib/model/strategy/adapter/promotion/evaluator.js +9 -14
  50. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
  51. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +17 -1
  52. package/lib/modules/Holder/utils.d.ts +2 -0
  53. package/lib/modules/Holder/utils.js +27 -1
  54. package/lib/modules/OpenData/contactInfo.d.ts +20 -0
  55. package/lib/modules/OpenData/contactInfo.js +56 -0
  56. package/lib/modules/OpenData/index.d.ts +1 -0
  57. package/lib/modules/OpenData/index.js +12 -0
  58. package/lib/modules/OpenData/types.d.ts +9 -0
  59. package/lib/modules/Order/holderRelations.d.ts +14 -0
  60. package/lib/modules/Order/holderRelations.js +98 -0
  61. package/lib/modules/Order/index.d.ts +2 -2
  62. package/lib/modules/Order/index.js +44 -12
  63. package/lib/modules/Order/types.d.ts +19 -1
  64. package/lib/modules/Order/types.js +1 -0
  65. package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
  66. package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
  67. package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
  68. package/lib/modules/Order/utils.d.ts +2 -1
  69. package/lib/modules/Order/utils.js +28 -6
  70. package/lib/modules/Rules/index.js +2 -1
  71. package/lib/server/index.js +8 -2
  72. package/lib/server/modules/order/index.d.ts +4 -0
  73. package/lib/server/modules/order/index.js +46 -4
  74. package/lib/server/modules/order/types.d.ts +3 -0
  75. package/lib/server/modules/products/index.d.ts +28 -7
  76. package/lib/server/modules/products/index.js +226 -63
  77. package/lib/server/modules/products/replication.d.ts +8 -0
  78. package/lib/server/modules/products/replication.js +30 -0
  79. package/lib/server/modules/products/types.d.ts +12 -1
  80. package/lib/server/modules/products/types.js +3 -0
  81. package/lib/shared/receipt/small-ticket.js +22 -13
  82. package/lib/shared/receipt/templateVisibility.d.ts +3 -0
  83. package/lib/shared/receipt/templateVisibility.js +6 -2
  84. package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
  85. package/lib/solution/BaseSales/index.d.ts +4 -0
  86. package/lib/solution/BaseSales/index.js +68 -2
  87. package/lib/solution/BaseSales/types.d.ts +2 -1
  88. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
  89. package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
  90. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +16 -8
  91. package/lib/solution/BookingByStep/index.d.ts +1 -1
  92. package/lib/solution/BookingTicket/index.d.ts +15 -1
  93. package/lib/solution/BookingTicket/index.js +132 -3
  94. package/lib/solution/ScanOrder/index.js +59 -20
  95. package/lib/solution/ScanOrder/types.d.ts +3 -0
  96. package/lib/solution/UnifiedBookingSales/index.js +1 -1
  97. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import type { CommittedProducts, ReplicatedProducts } from './types';
2
+ /** A separate committed view: failed writes must never leak into recovery snapshots. */
3
+ export declare class CommittedProductState {
4
+ private products;
5
+ private revision;
6
+ commit(change: ReplicatedProducts): CommittedProducts;
7
+ snapshot(): CommittedProducts;
8
+ }
@@ -0,0 +1,69 @@
1
+ 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); }
2
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ 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."); }
4
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
5
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ 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; } } }; }
9
+ 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); }
10
+ 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; }
11
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
13
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
+ /** A separate committed view: failed writes must never leak into recovery snapshots. */
18
+ export var CommittedProductState = /*#__PURE__*/function () {
19
+ function CommittedProductState() {
20
+ _classCallCheck(this, CommittedProductState);
21
+ _defineProperty(this, "products", new Map());
22
+ _defineProperty(this, "revision", 0);
23
+ }
24
+ _createClass(CommittedProductState, [{
25
+ key: "commit",
26
+ value: function commit(change) {
27
+ var copy = structuredClone(change);
28
+ if (copy.kind === 'snapshot') this.products.clear();
29
+ var _iterator = _createForOfIteratorHelper(copy.deletedIds),
30
+ _step;
31
+ try {
32
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
33
+ var id = _step.value;
34
+ this.products.delete(id);
35
+ }
36
+ } catch (err) {
37
+ _iterator.e(err);
38
+ } finally {
39
+ _iterator.f();
40
+ }
41
+ var _iterator2 = _createForOfIteratorHelper(copy.upserts),
42
+ _step2;
43
+ try {
44
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
45
+ var product = _step2.value;
46
+ this.products.set(product.id, product);
47
+ }
48
+ } catch (err) {
49
+ _iterator2.e(err);
50
+ } finally {
51
+ _iterator2.f();
52
+ }
53
+ return _objectSpread(_objectSpread({}, copy), {}, {
54
+ revision: ++this.revision
55
+ });
56
+ }
57
+ }, {
58
+ key: "snapshot",
59
+ value: function snapshot() {
60
+ return {
61
+ kind: 'snapshot',
62
+ revision: this.revision,
63
+ upserts: structuredClone(_toConsumableArray(this.products.values())),
64
+ deletedIds: []
65
+ };
66
+ }
67
+ }]);
68
+ return CommittedProductState;
69
+ }();
@@ -32,6 +32,15 @@ export interface ProductSnapshot {
32
32
  cover?: ProductData['cover'];
33
33
  holder_config?: ProductData['holder_config'];
34
34
  }
35
+ /** Raw product data only; each screen applies its own query/pricing context. */
36
+ export interface ReplicatedProducts {
37
+ kind: 'snapshot' | 'delta';
38
+ upserts: ProductData[];
39
+ deletedIds: number[];
40
+ }
41
+ export interface CommittedProducts extends ReplicatedProducts {
42
+ revision: number;
43
+ }
35
44
  /**
36
45
  * 加载报价单商品价格参数
37
46
  */
@@ -96,7 +105,9 @@ export declare enum ProductsHooks {
96
105
  onProductSelected = "products:onProductSelected",
97
106
  onProductsPriceApplied = "products:onProductsPriceApplied",
98
107
  /** pubsub 同步批次处理完成后触发,Server 层监听此事件重新计算并推送 */
99
- onProductsSyncCompleted = "products:onProductsSyncCompleted"
108
+ onProductsSyncCompleted = "products:onProductsSyncCompleted",
109
+ onProductsCommitted = "products:onProductsCommitted",
110
+ onProductSyncDestroyed = "products:onProductSyncDestroyed"
100
111
  }
101
112
  /** pubsub 商品同步消息结构 */
102
113
  export interface ProductSyncMessage {
@@ -10,6 +10,8 @@
10
10
  * 商品轻量查询范围
11
11
  */
12
12
 
13
+ /** Raw product data only; each screen applies its own query/pricing context. */
14
+
13
15
  /**
14
16
  * 加载报价单商品价格参数
15
17
  */
@@ -35,6 +37,8 @@ export var ProductsHooks = /*#__PURE__*/function (ProductsHooks) {
35
37
  ProductsHooks["onProductSelected"] = "products:onProductSelected";
36
38
  ProductsHooks["onProductsPriceApplied"] = "products:onProductsPriceApplied";
37
39
  ProductsHooks["onProductsSyncCompleted"] = "products:onProductsSyncCompleted";
40
+ ProductsHooks["onProductsCommitted"] = "products:onProductsCommitted";
41
+ ProductsHooks["onProductSyncDestroyed"] = "products:onProductSyncDestroyed";
38
42
  return ProductsHooks;
39
43
  }({});
40
44
 
@@ -20,6 +20,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
20
20
  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); }
21
21
  import dayjs from 'dayjs';
22
22
  import Decimal from 'decimal.js';
23
+ import { getProductHolderRelations, hasProductBooking } from "../../modules/Order/holderRelations";
23
24
  import { isFulfillmentTimingBooking } from "../../modules/Order/pickupTiming";
24
25
  import { resolveInvoiceDataVisibility } from "./templateVisibility";
25
26
  var DEFAULT_LOCALES = ['en', 'zh_CN'];
@@ -115,6 +116,7 @@ var LABELS = {
115
116
  bookingDateTime: 'Date & time',
116
117
  bookingResource: 'Resource',
117
118
  bookingHolder: 'Holder',
119
+ productHolder: 'Holder',
118
120
  orderDiscount: 'Order discount',
119
121
  manualDiscount: 'Manual discount',
120
122
  manualMarkup: 'Manual markup',
@@ -160,6 +162,7 @@ var LABELS = {
160
162
  bookingDateTime: '日期和时间',
161
163
  bookingResource: '资源',
162
164
  bookingHolder: '预约人',
165
+ productHolder: '持有人',
163
166
  orderDiscount: '整单折扣',
164
167
  manualDiscount: '手动折扣',
165
168
  manualMarkup: '手动加价',
@@ -205,6 +208,7 @@ var LABELS = {
205
208
  bookingDateTime: '日期和時間',
206
209
  bookingResource: '資源',
207
210
  bookingHolder: '預約人',
211
+ productHolder: '持有人',
208
212
  orderDiscount: '整單折扣',
209
213
  manualDiscount: '手動折扣',
210
214
  manualMarkup: '手動加價',
@@ -248,6 +252,7 @@ var LABELS = {
248
252
  bookingDateTime: '日時',
249
253
  bookingResource: 'リソース',
250
254
  bookingHolder: '予約者',
255
+ productHolder: '利用者',
251
256
  orderDiscount: '注文割引',
252
257
  manualDiscount: '手動割引',
253
258
  manualMarkup: '手動値上げ',
@@ -292,6 +297,7 @@ var LABELS = {
292
297
  bookingDateTime: 'Data e hora',
293
298
  bookingResource: 'Recurso',
294
299
  bookingHolder: 'Titular',
300
+ productHolder: 'Titular',
295
301
  orderDiscount: 'Desconto do pedido',
296
302
  manualDiscount: 'Desconto manual',
297
303
  manualMarkup: 'Acréscimo manual',
@@ -357,7 +363,7 @@ function buildLocaleData(params) {
357
363
  financials: financials
358
364
  }),
359
365
  customer: buildCustomer(order, locale, visibility.customer),
360
- appointment: buildAppointment(order, locale)
366
+ appointment: buildAppointment(order, locale, visibility.lineGroups.resourceTitle)
361
367
  }, delivery.length ? {
362
368
  delivery: delivery
363
369
  } : {}), {}, {
@@ -461,6 +467,17 @@ function buildProducts(order, locale, productMap) {
461
467
  quantity: quantity,
462
468
  originalPrice: originalPrice
463
469
  });
470
+ var holderName = hasProductBooking(product) ? '' : getProductHolderRelations(order, product).map(function (relation) {
471
+ var _relation$metadata;
472
+ return getLocalizedValue((_relation$metadata = relation.metadata) === null || _relation$metadata === void 0 ? void 0 : _relation$metadata.name, locale).trim();
473
+ }).filter(Boolean).join(', ');
474
+ if (holderName) {
475
+ // 复用 Web Invoice / 原生均支持的文本扩展行,不混入金额或商品备注。
476
+ extensionList.push(_objectSpread(_objectSpread({}, receiptKey(rawProduct, 'product-holder')), {}, {
477
+ item: "".concat(label(locale, 'productHolder'), ": ").concat(holderName),
478
+ value: ''
479
+ }));
480
+ }
464
481
  var productNote = resolveProductNote(product, locale);
465
482
  var allergy = isPresentId(productUid) ? allergyByProductUid.get(String(productUid).trim()) || '' : '';
466
483
  var basePrice = resolveProductBasePrice(product);
@@ -1222,12 +1239,6 @@ function buildFees(params) {
1222
1239
  var isPriceIncludeTax = firstPresentValue(summary.is_price_include_tax, order.is_price_include_tax, shopInfo.is_price_include_tax);
1223
1240
  var roundingAmount = firstPresentValue(summary.rounding_amount, order.rounding_amount);
1224
1241
  var payProcessingFee = financials.payProcessingFee;
1225
- if (isNonZero(payProcessingFee)) {
1226
- fees.push(_objectSpread(_objectSpread({}, receiptKey(order, 'payment-processing-fee')), {}, {
1227
- item: label(locale, 'payProcessingFee'),
1228
- value: formatMoney(payProcessingFee, currencySymbol)
1229
- }));
1230
- }
1231
1242
  var productExpectAmount = firstPresentValue(summary.product_expect_amount, summary.product_amount, order.product_expect_amount);
1232
1243
  var productOriginalAmount = (_firstPresentValue2 = firstPresentValue(summary.product_original_amount, order.product_original_amount)) !== null && _firstPresentValue2 !== void 0 ? _firstPresentValue2 : calculateProductOriginalAmount(order);
1233
1244
  var totalSavingsAmount = new Decimal(toMoneyNumber(productOriginalAmount)).minus(toMoneyNumber(productExpectAmount)).plus(toMoneyNumber(discountAmount));
@@ -1383,7 +1394,7 @@ function formatPickupBookingStart(bookings, locale) {
1383
1394
  var dateText = locale === 'en' ? "".concat(day, "/").concat(month, "/").concat(year) : "".concat(year, "/").concat(month, "/").concat(day);
1384
1395
  return "".concat(time.slice(0, 5), " ").concat(dateText);
1385
1396
  }
1386
- function buildAppointment(order, locale) {
1397
+ function buildAppointment(order, locale, showResourceTitle) {
1387
1398
  var _order$metadata13, _order$metadata14, _order$metadata15, _order$form_data;
1388
1399
  var parentScheduleId = (_order$metadata13 = order.metadata) === null || _order$metadata13 === void 0 ? void 0 : _order$metadata13.appointment_booking_parent_schedule_id;
1389
1400
  var bookings = sortBookings(normalizeArray(order.bookings).filter(function (booking) {
@@ -1396,7 +1407,8 @@ function buildAppointment(order, locale) {
1396
1407
  booking: booking,
1397
1408
  allResources: allResources,
1398
1409
  bookingCount: bookings.length,
1399
- locale: locale
1410
+ locale: locale,
1411
+ showResourceTitle: showResourceTitle
1400
1412
  });
1401
1413
  });
1402
1414
  }
@@ -1434,7 +1446,7 @@ function buildAppointmentRows(params) {
1434
1446
  };
1435
1447
  var bookingId = stringify(firstPresentValue(booking.booking_id, booking.schedule_event_id, bookingUid)).trim();
1436
1448
  var bookingTime = formatBookingRange(booking, locale);
1437
- var resourceText = formatBookingResources(resolveBookingResourcesForReceipt(booking, allResources, bookingCount), locale);
1449
+ var resourceText = formatBookingResources(resolveBookingResourcesForReceipt(booking, allResources, bookingCount), locale, params.showResourceTitle);
1438
1450
  var holder = getLocalizedValue((_booking$holder$name = (_booking$holder = booking.holder) === null || _booking$holder === void 0 ? void 0 : _booking$holder.name) !== null && _booking$holder$name !== void 0 ? _booking$holder$name : (_booking$metadata3 = booking.metadata) === null || _booking$metadata3 === void 0 || (_booking$metadata3 = _booking$metadata3.holder) === null || _booking$metadata3 === void 0 ? void 0 : _booking$metadata3.name, locale).trim();
1439
1451
  return [_objectSpread(_objectSpread({}, receiptKey(booking, 'booking-id')), {}, {
1440
1452
  item: label(locale, 'bookingId'),
@@ -1512,10 +1524,10 @@ function resolveBookingResourcesForReceipt(booking, allResources, bookingCount)
1512
1524
  if (bookingCount === 1 && allResources.length) return allResources;
1513
1525
  return [];
1514
1526
  }
1515
- function formatBookingResources(resources, locale) {
1527
+ function formatBookingResources(resources, locale, showResourceTitle) {
1516
1528
  return resources.map(function (resource) {
1517
1529
  var _resource$metadata, _resource$metadata2, _resource$metadata3, _resource$metadata4;
1518
- return [getLocalizedValue(resource.form_title || ((_resource$metadata = resource.metadata) === null || _resource$metadata === void 0 ? void 0 : _resource$metadata.form_name) || resource.relation_form_name || ((_resource$metadata2 = resource.metadata) === null || _resource$metadata2 === void 0 ? void 0 : _resource$metadata2.relation_form_name), locale), getLocalizedValue(resource.title || resource.name || resource.main_field || ((_resource$metadata3 = resource.metadata) === null || _resource$metadata3 === void 0 ? void 0 : _resource$metadata3.main_field) || ((_resource$metadata4 = resource.metadata) === null || _resource$metadata4 === void 0 ? void 0 : _resource$metadata4.resource_name), locale)].filter(Boolean).join(' ');
1530
+ return [showResourceTitle ? getLocalizedValue(resource.form_title || ((_resource$metadata = resource.metadata) === null || _resource$metadata === void 0 ? void 0 : _resource$metadata.form_name) || resource.relation_form_name || ((_resource$metadata2 = resource.metadata) === null || _resource$metadata2 === void 0 ? void 0 : _resource$metadata2.relation_form_name), locale) : '', getLocalizedValue(resource.title || resource.name || resource.main_field || ((_resource$metadata3 = resource.metadata) === null || _resource$metadata3 === void 0 ? void 0 : _resource$metadata3.main_field) || ((_resource$metadata4 = resource.metadata) === null || _resource$metadata4 === void 0 ? void 0 : _resource$metadata4.resource_name), locale)].filter(Boolean).join(' ');
1519
1531
  }).filter(Boolean).join(', ');
1520
1532
  }
1521
1533
  function sortBookings(bookings) {
@@ -1,5 +1,8 @@
1
1
  /** Template children are direct module members; legacy missing values stay visible. */
2
2
  export interface InvoiceDataVisibility {
3
+ lineGroups: {
4
+ resourceTitle: boolean;
5
+ };
3
6
  handover: {
4
7
  show: boolean;
5
8
  method: boolean;
@@ -36,6 +36,9 @@ export function resolveInvoiceDataVisibility(settings) {
36
36
  return typeof tag === 'string' && tag.length > 0;
37
37
  })) : null;
38
38
  return {
39
+ lineGroups: {
40
+ resourceTitle: field(module('line_groups'), 'resource_title')
41
+ },
39
42
  handover: {
40
43
  show: invoiceSettingIsVisible(handover === null || handover === void 0 ? void 0 : handover.is_show),
41
44
  method: field(handover, 'method'),
@@ -59,6 +62,7 @@ export function requiresInvoiceDataFiltering(settings) {
59
62
  var _resolveInvoiceDataVi = resolveInvoiceDataVisibility(settings),
60
63
  handover = _resolveInvoiceDataVi.handover,
61
64
  customer = _resolveInvoiceDataVi.customer,
62
- card = _resolveInvoiceDataVi.card;
63
- return !handover.show || !handover.method || !handover.fulfillmentTime || !customer.show || !customer.name || !customer.email || !customer.phone || !card.show || card.passTypes !== null;
65
+ card = _resolveInvoiceDataVi.card,
66
+ lineGroups = _resolveInvoiceDataVi.lineGroups;
67
+ return !lineGroups.resourceTitle || !handover.show || !handover.method || !handover.fulfillmentTime || !customer.show || !customer.name || !customer.email || !customer.phone || !card.show || card.passTypes !== null;
64
68
  }
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
6
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- export var SALES_ORDER_RELATIONS = ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info', 'order_meta_list', 'refunds', 'notes'];
7
+ export var SALES_ORDER_RELATIONS = ['products', 'bookings', 'payments', 'customer', 'summary', 'contacts_info', 'order_meta_list', 'refunds', 'notes', 'holder_relations'];
8
8
 
9
9
  /** Shared transport contract; remote callers use their host's /h5 prefix. */
10
10
  export function loadSalesOrderSnapshot(request, params) {
@@ -5,6 +5,7 @@ import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentS
5
5
  import { OrderModule } from '../../modules/Order';
6
6
  import { type PickupTimingBookingInput } from '../../modules/Order/pickupTiming';
7
7
  import type { PickupTimingAvailability, PickupTimingSelection, PickupTimingValidationResult } from '../../modules/FulfillmentTiming';
8
+ import { type ContactInfoConfig } from '../../modules/OpenData/contactInfo';
8
9
  import type { AddProductBookingInput, AddProductToOrderOptions, LoadSalesDetailParams, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions, RemoveProductsFromOrderOptions, ReplaceTempOrderOptions, SalesNote, SalesNotesMutationSnapshot, SetSalesNoteInput, PickupReferenceMode, ShopServiceData, ShopServiceType } from '../../modules/Order/types';
9
10
  import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
10
11
  import type { Discount, VirtualCurrencyAsset } from '../../modules/Discount/types';
@@ -281,6 +282,9 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
281
282
  setPickupTimingBooking(input: PickupTimingBookingInput): import("../../modules/Order").PickupTimingBooking;
282
283
  clearPickupTimingBooking(): void;
283
284
  updateTempOrderContactsInfo(contactsInfo: Record<string, any> | null): Record<string, any> | null;
285
+ protected loadContactInfoOpenData(): Promise<OpenDataConfig | null>;
286
+ getContactInfoConfig(): Promise<ContactInfoConfig>;
287
+ validateContactInfo(): Promise<void>;
284
288
  /** @deprecated OrderModule 不再负责 tempOrder localStorage 持久化。 */
285
289
  setEnableTempOrderPersist(enabled: boolean): void;
286
290
  /** 是否允许 saveDraft 写入 IndexedDB 草稿。 */