@pisell/pisellos 2.2.309 → 2.2.310

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 (121) hide show
  1. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  2. package/dist/model/strategy/adapter/walletPass/evaluator.js +4 -2
  3. package/dist/modules/BookingContext/index.js +4 -4
  4. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +58 -19
  5. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +24 -12
  6. package/dist/modules/Customer/index.js +6 -3
  7. package/dist/modules/Customer/types.d.ts +2 -0
  8. package/dist/modules/Discount/availability.d.ts +7 -0
  9. package/dist/modules/Discount/availability.js +49 -0
  10. package/dist/modules/Discount/entitlementPass.d.ts +34 -0
  11. package/dist/modules/Discount/entitlementPass.js +147 -0
  12. package/dist/modules/Discount/index.d.ts +2 -2
  13. package/dist/modules/Discount/index.js +37 -151
  14. package/dist/modules/Discount/types.d.ts +36 -5
  15. package/dist/modules/OpenData/index.d.ts +1 -1
  16. package/dist/modules/OpenData/index.js +21 -12
  17. package/dist/modules/Order/index.d.ts +32 -4
  18. package/dist/modules/Order/index.js +733 -373
  19. package/dist/modules/Order/types.d.ts +17 -0
  20. package/dist/modules/Order/utils/orderCollectionIdentity.js +16 -12
  21. package/dist/modules/Order/utils.d.ts +14 -2
  22. package/dist/modules/Order/utils.js +275 -76
  23. package/dist/modules/Payment/index.d.ts +0 -5
  24. package/dist/modules/Payment/index.js +35 -85
  25. package/dist/modules/Payment/types.d.ts +21 -1
  26. package/dist/modules/Payment/types.js +2 -0
  27. package/dist/modules/Payment/walletpass.d.ts +1 -1
  28. package/dist/modules/Payment/walletpass.js +80 -47
  29. package/dist/modules/ProductList/index.js +18 -5
  30. package/dist/modules/Rules/index.d.ts +2 -2
  31. package/dist/modules/Rules/index.js +480 -186
  32. package/dist/modules/Rules/types.d.ts +4 -0
  33. package/dist/server/index.js +8 -5
  34. package/dist/server/modules/order/index.js +6 -0
  35. package/dist/server/modules/order/types.d.ts +12 -0
  36. package/dist/server/modules/payment/index.d.ts +25 -6
  37. package/dist/server/modules/payment/index.js +660 -133
  38. package/dist/server/utils/small-ticket.d.ts +8 -5
  39. package/dist/server/utils/small-ticket.js +1269 -199
  40. package/dist/solution/BaseSales/index.d.ts +11 -2
  41. package/dist/solution/BaseSales/index.js +1463 -1173
  42. package/dist/solution/BaseSales/types.d.ts +7 -3
  43. package/dist/solution/BaseSales/utils/cartPromotion.js +141 -126
  44. package/dist/solution/BookingByStep/index.d.ts +1 -1
  45. package/dist/solution/BookingTicket/index.d.ts +12 -3
  46. package/dist/solution/BookingTicket/index.js +663 -542
  47. package/dist/solution/BookingTicket/types.d.ts +5 -1
  48. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
  49. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +338 -147
  50. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
  51. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
  52. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +19 -6
  53. package/dist/solution/ShopDiscount/index.d.ts +2 -0
  54. package/dist/solution/ShopDiscount/index.js +99 -42
  55. package/dist/solution/ShopDiscount/utils.d.ts +4 -2
  56. package/dist/solution/ShopDiscount/utils.js +43 -23
  57. package/dist/solution/UnifiedBookingSales/index.d.ts +2 -2
  58. package/dist/solution/UnifiedBookingSales/index.js +5 -5
  59. package/dist/utils/os-private-payload.d.ts +5 -0
  60. package/dist/utils/os-private-payload.js +17 -0
  61. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
  62. package/lib/model/strategy/adapter/walletPass/evaluator.js +2 -0
  63. package/lib/modules/BookingContext/index.js +3 -3
  64. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +35 -6
  65. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +13 -6
  66. package/lib/modules/Customer/index.js +5 -1
  67. package/lib/modules/Customer/types.d.ts +2 -0
  68. package/lib/modules/Discount/availability.d.ts +7 -0
  69. package/lib/modules/Discount/availability.js +43 -0
  70. package/lib/modules/Discount/entitlementPass.d.ts +34 -0
  71. package/lib/modules/Discount/entitlementPass.js +141 -0
  72. package/lib/modules/Discount/index.d.ts +2 -2
  73. package/lib/modules/Discount/index.js +23 -129
  74. package/lib/modules/Discount/types.d.ts +36 -5
  75. package/lib/modules/OpenData/index.d.ts +1 -1
  76. package/lib/modules/OpenData/index.js +11 -2
  77. package/lib/modules/Order/index.d.ts +32 -4
  78. package/lib/modules/Order/index.js +341 -71
  79. package/lib/modules/Order/types.d.ts +17 -0
  80. package/lib/modules/Order/utils/orderCollectionIdentity.js +14 -11
  81. package/lib/modules/Order/utils.d.ts +14 -2
  82. package/lib/modules/Order/utils.js +186 -3
  83. package/lib/modules/Payment/index.d.ts +0 -5
  84. package/lib/modules/Payment/index.js +3 -28
  85. package/lib/modules/Payment/types.d.ts +21 -1
  86. package/lib/modules/Payment/types.js +1 -0
  87. package/lib/modules/Payment/walletpass.d.ts +1 -1
  88. package/lib/modules/Payment/walletpass.js +29 -9
  89. package/lib/modules/ProductList/index.js +14 -1
  90. package/lib/modules/Rules/index.d.ts +2 -2
  91. package/lib/modules/Rules/index.js +357 -110
  92. package/lib/modules/Rules/types.d.ts +4 -0
  93. package/lib/server/index.js +8 -5
  94. package/lib/server/modules/order/index.js +6 -0
  95. package/lib/server/modules/order/types.d.ts +12 -0
  96. package/lib/server/modules/payment/index.d.ts +25 -6
  97. package/lib/server/modules/payment/index.js +350 -78
  98. package/lib/server/utils/small-ticket.d.ts +8 -5
  99. package/lib/server/utils/small-ticket.js +1009 -121
  100. package/lib/solution/BaseSales/index.d.ts +11 -2
  101. package/lib/solution/BaseSales/index.js +164 -30
  102. package/lib/solution/BaseSales/types.d.ts +7 -3
  103. package/lib/solution/BaseSales/utils/cartPromotion.js +12 -4
  104. package/lib/solution/BookingByStep/index.d.ts +1 -1
  105. package/lib/solution/BookingTicket/index.d.ts +12 -3
  106. package/lib/solution/BookingTicket/index.js +103 -41
  107. package/lib/solution/BookingTicket/types.d.ts +5 -1
  108. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
  109. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +174 -42
  110. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
  111. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
  112. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +11 -3
  113. package/lib/solution/ShopDiscount/index.d.ts +2 -0
  114. package/lib/solution/ShopDiscount/index.js +55 -9
  115. package/lib/solution/ShopDiscount/utils.d.ts +4 -2
  116. package/lib/solution/ShopDiscount/utils.js +42 -25
  117. package/lib/solution/UnifiedBookingSales/index.d.ts +2 -2
  118. package/lib/solution/UnifiedBookingSales/index.js +5 -5
  119. package/lib/utils/os-private-payload.d.ts +5 -0
  120. package/lib/utils/os-private-payload.js +22 -0
  121. package/package.json +1 -1
@@ -5,20 +5,25 @@ var _excluded = ["custom_product_bundle_map_id"],
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; }
7
7
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
8
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
9
- 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."); }
10
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
11
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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; } } }; }
12
9
  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; }
13
10
  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; }
14
11
  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
12
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
13
  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
- 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; } } }; }
14
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
+ 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."); }
16
+ 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; } }
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
19
+ 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."); }
18
20
  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); }
21
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
22
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
19
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; }
20
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); }
21
25
  import dayjs from "dayjs";
26
+ import customParseFormat from 'dayjs/plugin/customParseFormat';
22
27
  import Decimal from 'decimal.js';
23
28
  import { withOriginalBundleOptionPrices } from "./utils/weighedProduct";
24
29
  import { hasManualProductDiscountFlag } from "./utils/manualProductDiscount";
@@ -26,7 +31,9 @@ import { getProductHolderConfig } from "../Holder/utils";
26
31
  import { buildProductLineFingerprint, createEmptySummary } from "../../solution/ScanOrder/utils";
27
32
  import { createUuidV4 } from "./utils/orderCollectionIdentity";
28
33
  import { encodeSalesNotes } from "./salesNotes";
34
+ dayjs.extend(customParseFormat);
29
35
  var POINT_CARD_SNAPSHOT_TAG = 'point_card';
36
+ var VIRTUAL_CURRENCY_SNAPSHOT_TAG = 'virtual_currency';
30
37
  function isPlainObject(value) {
31
38
  return Boolean(value) && _typeof(value) === 'object' && !Array.isArray(value);
32
39
  }
@@ -55,6 +62,10 @@ export function normalizePointCardSnapshotItem(value) {
55
62
  if (productId !== undefined) {
56
63
  snapshot.product_id = productId;
57
64
  }
65
+ var code = normalizeSnapshotScalar(value.code);
66
+ if (code !== undefined) {
67
+ snapshot.code = String(code).trim();
68
+ }
58
69
  return snapshot;
59
70
  }
60
71
  export function buildPointCardSnapshotFromWalletPassList(value) {
@@ -65,6 +76,152 @@ export function buildPointCardSnapshotFromWalletPassList(value) {
65
76
  return result;
66
77
  }, []);
67
78
  }
79
+ export function collectPointCardSnapshotCodeCandidates(value) {
80
+ if (!Array.isArray(value)) return [];
81
+ var codeById = new Map();
82
+ value.forEach(function (item) {
83
+ var _item$id;
84
+ if (!isPlainObject(item)) return;
85
+ var id = normalizeSnapshotScalar((_item$id = item.id) !== null && _item$id !== void 0 ? _item$id : item.voucher_id);
86
+ var code = normalizeSnapshotScalar(item.code);
87
+ if (id === undefined || code === undefined) return;
88
+ var identity = String(id).trim();
89
+ var normalizedCode = String(code).trim();
90
+ if (!identity || !normalizedCode || codeById.has(identity)) return;
91
+ codeById.set(identity, normalizedCode);
92
+ });
93
+ return _toConsumableArray(codeById).map(function (_ref) {
94
+ var _ref2 = _slicedToArray(_ref, 2),
95
+ id = _ref2[0],
96
+ code = _ref2[1];
97
+ return {
98
+ id: id,
99
+ code: code
100
+ };
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Payment 的 WalletPass 列表包含实例 code,而 prepare/config 通常只提供
106
+ * 卡名称和余额。按实例 ID 仅补齐 Snapshot 缺失的 code,避免后到的运行态
107
+ * 数据覆盖下单时已经冻结的卡名称和余额。
108
+ */
109
+ export function mergePointCardSnapshotCodes(snapshotsValue, walletPassesValue) {
110
+ var snapshots = buildPointCardSnapshotFromWalletPassList(snapshotsValue);
111
+ if (!snapshots.length || !Array.isArray(walletPassesValue)) return snapshots;
112
+ var codeById = new Map(collectPointCardSnapshotCodeCandidates(walletPassesValue).map(function (_ref3) {
113
+ var id = _ref3.id,
114
+ code = _ref3.code;
115
+ return [id, code];
116
+ }));
117
+ return snapshots.map(function (snapshot) {
118
+ if (snapshot.code) return snapshot;
119
+ var code = codeById.get(String(snapshot.id).trim());
120
+ return code ? _objectSpread(_objectSpread({}, snapshot), {}, {
121
+ code: code
122
+ }) : snapshot;
123
+ });
124
+ }
125
+ function normalizeSnapshotNameMap(value) {
126
+ if (typeof value === 'string' || typeof value === 'number') {
127
+ var normalizedText = String(value).trim();
128
+ return normalizedText ? {
129
+ original: normalizedText
130
+ } : {};
131
+ }
132
+ if (!isPlainObject(value)) return {};
133
+ return Object.entries(value).reduce(function (result, _ref4) {
134
+ var _ref5 = _slicedToArray(_ref4, 2),
135
+ locale = _ref5[0],
136
+ text = _ref5[1];
137
+ if (!locale.trim()) return result;
138
+ if (typeof text !== 'string' && typeof text !== 'number') return result;
139
+ var normalizedText = String(text).trim();
140
+ if (normalizedText) result[locale] = normalizedText;
141
+ return result;
142
+ }, {});
143
+ }
144
+ function buildVirtualCurrencySnapshotName(value) {
145
+ var _value$amount_format;
146
+ if (!isPlainObject(value)) return {};
147
+ var amountFormat = String((_value$amount_format = value.amount_format) !== null && _value$amount_format !== void 0 ? _value$amount_format : '').trim();
148
+ var configuredName;
149
+ if (amountFormat === '{{amount}} {{unit}}') {
150
+ configuredName = value.unit_label;
151
+ } else if (amountFormat === '{{amount}} {{sym}}') {
152
+ configuredName = value.symbol;
153
+ } else {
154
+ return {};
155
+ }
156
+ var configuredNameMap = normalizeSnapshotNameMap(configuredName);
157
+ var shortNameMap = normalizeSnapshotNameMap(value.short_name);
158
+
159
+ // The configured unit/symbol is resolved before short_name. If it already
160
+ // carries a global fallback, keep it authoritative so (for example)
161
+ // short_name.en cannot mask unit_label.original. When it only has explicit
162
+ // locale entries, merge short_name so other receipt locales can still fall
163
+ // back after the configured value has no match.
164
+ var hasConfiguredGlobalFallback = ['original', 'auto', 'default', 'en'].some(function (locale) {
165
+ return Boolean(configuredNameMap[locale]);
166
+ });
167
+ if (hasConfiguredGlobalFallback) return configuredNameMap;
168
+ return _objectSpread(_objectSpread({}, shortNameMap), configuredNameMap);
169
+ }
170
+ export function normalizeVirtualCurrencySnapshotItem(value) {
171
+ var _value$product_name2, _value$par_value2, _value$used_par_value2;
172
+ if (!isPlainObject(value)) return null;
173
+ var id = normalizeSnapshotScalar(value.id);
174
+ if (id === undefined) return null;
175
+ if (String(value.tag || '').trim().toLowerCase() !== VIRTUAL_CURRENCY_SNAPSHOT_TAG) {
176
+ return null;
177
+ }
178
+ var snapshot = {
179
+ id: id,
180
+ tag: 'virtual_currency',
181
+ product_name: String((_value$product_name2 = value.product_name) !== null && _value$product_name2 !== void 0 ? _value$product_name2 : ''),
182
+ par_value: String((_value$par_value2 = value.par_value) !== null && _value$par_value2 !== void 0 ? _value$par_value2 : ''),
183
+ used_par_value: String((_value$used_par_value2 = value.used_par_value) !== null && _value$used_par_value2 !== void 0 ? _value$used_par_value2 : ''),
184
+ name: normalizeSnapshotNameMap(value.name)
185
+ };
186
+ var productId = normalizeSnapshotScalar(value.product_id);
187
+ if (productId !== undefined) {
188
+ snapshot.product_id = productId;
189
+ }
190
+ return snapshot;
191
+ }
192
+ function normalizeVirtualCurrencySnapshotList(value) {
193
+ if (!Array.isArray(value)) return [];
194
+ return value.reduce(function (result, item) {
195
+ var normalized = normalizeVirtualCurrencySnapshotItem(item);
196
+ if (normalized) result.push(normalized);
197
+ return result;
198
+ }, []);
199
+ }
200
+ export function buildVirtualCurrencySnapshotFromList(value) {
201
+ if (!Array.isArray(value)) return [];
202
+ return value.reduce(function (result, item) {
203
+ var _item$tag, _item$product_name, _item$par_value, _item$used_par_value;
204
+ if (!isPlainObject(item)) return result;
205
+ var id = normalizeSnapshotScalar(item.id);
206
+ if (id === undefined) return result;
207
+ var sourceTag = String((_item$tag = item.tag) !== null && _item$tag !== void 0 ? _item$tag : '').trim().toLowerCase();
208
+ if (sourceTag !== VIRTUAL_CURRENCY_SNAPSHOT_TAG) return result;
209
+ var snapshot = {
210
+ id: id,
211
+ tag: 'virtual_currency',
212
+ product_name: String((_item$product_name = item.product_name) !== null && _item$product_name !== void 0 ? _item$product_name : ''),
213
+ par_value: String((_item$par_value = item.par_value) !== null && _item$par_value !== void 0 ? _item$par_value : ''),
214
+ used_par_value: String((_item$used_par_value = item.used_par_value) !== null && _item$used_par_value !== void 0 ? _item$used_par_value : ''),
215
+ name: buildVirtualCurrencySnapshotName(item.virtual_currency_display)
216
+ };
217
+ var productId = normalizeSnapshotScalar(item.product_id);
218
+ if (productId !== undefined) {
219
+ snapshot.product_id = productId;
220
+ }
221
+ result.push(snapshot);
222
+ return result;
223
+ }, []);
224
+ }
68
225
  export function normalizeOrderMetaList(value) {
69
226
  if (value === undefined) return undefined;
70
227
  if (!isPlainObject(value)) return undefined;
@@ -72,6 +229,9 @@ export function normalizeOrderMetaList(value) {
72
229
  if (Object.prototype.hasOwnProperty.call(value, 'point_cards_snapshot')) {
73
230
  normalized.point_cards_snapshot = buildPointCardSnapshotFromWalletPassList(value.point_cards_snapshot);
74
231
  }
232
+ if (Object.prototype.hasOwnProperty.call(value, 'virtual_currency_snapshot')) {
233
+ normalized.virtual_currency_snapshot = normalizeVirtualCurrencySnapshotList(value.virtual_currency_snapshot);
234
+ }
75
235
  if (Object.keys(normalized).length > 0) return normalized;
76
236
  return {};
77
237
  }
@@ -99,13 +259,13 @@ export function composeLinePrice(params) {
99
259
  _step;
100
260
  try {
101
261
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
102
- var _ref, _item$num;
262
+ var _ref6, _item$num;
103
263
  var item = _step.value;
104
264
  // markdown(减价)按带符号净额取减;markup/原价维持相加。
105
265
  var signedUnit = getBundleSignedUnit(item, {
106
266
  useOriginal: useOriginalBundle
107
267
  });
108
- var rawNum = (_ref = (_item$num = item === null || item === void 0 ? void 0 : item.num) !== null && _item$num !== void 0 ? _item$num : item === null || item === void 0 ? void 0 : item.quantity) !== null && _ref !== void 0 ? _ref : 1;
268
+ var rawNum = (_ref6 = (_item$num = item === null || item === void 0 ? void 0 : item.num) !== null && _item$num !== void 0 ? _item$num : item === null || item === void 0 ? void 0 : item.quantity) !== null && _ref6 !== void 0 ? _ref6 : 1;
109
269
  var num = new Decimal(Number(rawNum) || 0);
110
270
  total = total.plus(signedUnit.times(num));
111
271
  }
@@ -169,12 +329,12 @@ function getSafeOrderProductNum(num) {
169
329
  return Math.floor(parsedNum);
170
330
  }
171
331
  function getOrderProductDepositUnitTotal(product) {
172
- var _ref2;
332
+ var _ref7;
173
333
  var metadata = product.metadata || {};
174
334
  var paymentPrice = metadata.main_product_attached_bundle_payment_price;
175
335
  var mainSellingPrice = metadata.main_product_selling_price;
176
336
  var fallbackPrice = product.selling_price;
177
- return new Decimal(Number((_ref2 = paymentPrice !== null && paymentPrice !== void 0 ? paymentPrice : mainSellingPrice) !== null && _ref2 !== void 0 ? _ref2 : fallbackPrice) || 0);
337
+ return new Decimal(Number((_ref7 = paymentPrice !== null && paymentPrice !== void 0 ? paymentPrice : mainSellingPrice) !== null && _ref7 !== void 0 ? _ref7 : fallbackPrice) || 0);
178
338
  }
179
339
  function normalizeDepositProtocols(protocols) {
180
340
  if (!Array.isArray(protocols)) return [];
@@ -223,13 +383,13 @@ function handleOrderProductDeposit(params) {
223
383
  };
224
384
  }
225
385
  function resolveOrderProductDepositSource(product, runtimeOrigin) {
226
- var _ref3, _record$custom_deposi, _ref4, _record$variant;
386
+ var _ref8, _record$custom_deposi, _ref9, _record$variant;
227
387
  var record = product;
228
388
  var origin = record._origin || runtimeOrigin || {};
229
389
  var originProduct = origin.product || {};
230
390
  return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, originProduct), origin), record), {}, {
231
- custom_deposit_data: (_ref3 = (_record$custom_deposi = record.custom_deposit_data) !== null && _record$custom_deposi !== void 0 ? _record$custom_deposi : origin.custom_deposit_data) !== null && _ref3 !== void 0 ? _ref3 : originProduct.custom_deposit_data,
232
- variant: (_ref4 = (_record$variant = record.variant) !== null && _record$variant !== void 0 ? _record$variant : origin.variant) !== null && _ref4 !== void 0 ? _ref4 : originProduct.variant
391
+ custom_deposit_data: (_ref8 = (_record$custom_deposi = record.custom_deposit_data) !== null && _record$custom_deposi !== void 0 ? _record$custom_deposi : origin.custom_deposit_data) !== null && _ref8 !== void 0 ? _ref8 : originProduct.custom_deposit_data,
392
+ variant: (_ref9 = (_record$variant = record.variant) !== null && _record$variant !== void 0 ? _record$variant : origin.variant) !== null && _ref9 !== void 0 ? _ref9 : originProduct.variant
233
393
  });
234
394
  }
235
395
  function getOrderProductDeposit(product, runtimeOrigin) {
@@ -381,12 +541,12 @@ export function isMarkdownBundle(bundle) {
381
541
  * - markup(加价)/原价子商品:维持 `+(bundle_selling_price ?? price)`,行为不变。
382
542
  */
383
543
  export function getBundleSignedUnit(bundle, options) {
384
- var _options$useOriginal, _ref11, _bundle$original_pric2, _bundle$bundle_sellin;
544
+ var _options$useOriginal, _ref16, _bundle$original_pric2, _bundle$bundle_sellin;
385
545
  if (!bundle || _typeof(bundle) !== 'object') return new Decimal(0);
386
546
  var useOriginal = (_options$useOriginal = options === null || options === void 0 ? void 0 : options.useOriginal) !== null && _options$useOriginal !== void 0 ? _options$useOriginal : false;
387
547
  if (isMarkdownBundle(bundle)) {
388
- var _ref5, _ref6, _ref7, _bundle$original_pric, _ref8, _ref9, _ref10, _bundle$custom_price;
389
- var catalog = useOriginal ? (_ref5 = (_ref6 = (_ref7 = (_bundle$original_pric = bundle.original_price) !== null && _bundle$original_pric !== void 0 ? _bundle$original_pric : bundle.product_price) !== null && _ref7 !== void 0 ? _ref7 : bundle.custom_price) !== null && _ref6 !== void 0 ? _ref6 : bundle.base_price) !== null && _ref5 !== void 0 ? _ref5 : bundle.price : (_ref8 = (_ref9 = (_ref10 = (_bundle$custom_price = bundle.custom_price) !== null && _bundle$custom_price !== void 0 ? _bundle$custom_price : bundle.product_price) !== null && _ref10 !== void 0 ? _ref10 : bundle.original_price) !== null && _ref9 !== void 0 ? _ref9 : bundle.base_price) !== null && _ref8 !== void 0 ? _ref8 : bundle.price;
548
+ var _ref10, _ref11, _ref12, _bundle$original_pric, _ref13, _ref14, _ref15, _bundle$custom_price;
549
+ var catalog = useOriginal ? (_ref10 = (_ref11 = (_ref12 = (_bundle$original_pric = bundle.original_price) !== null && _bundle$original_pric !== void 0 ? _bundle$original_pric : bundle.product_price) !== null && _ref12 !== void 0 ? _ref12 : bundle.custom_price) !== null && _ref11 !== void 0 ? _ref11 : bundle.base_price) !== null && _ref10 !== void 0 ? _ref10 : bundle.price : (_ref13 = (_ref14 = (_ref15 = (_bundle$custom_price = bundle.custom_price) !== null && _bundle$custom_price !== void 0 ? _bundle$custom_price : bundle.product_price) !== null && _ref15 !== void 0 ? _ref15 : bundle.original_price) !== null && _ref14 !== void 0 ? _ref14 : bundle.base_price) !== null && _ref13 !== void 0 ? _ref13 : bundle.price;
390
550
  if (catalog !== undefined && catalog !== null && catalog !== '') {
391
551
  var raw = new Decimal(Number(catalog) || 0);
392
552
  // 负值表示价格已是「带符号净额」(如 cart/changePrice 产出的 -3.7),直接取用不再扣 option,
@@ -397,7 +557,7 @@ export function getBundleSignedUnit(bundle, options) {
397
557
  // 仅剩净额(无毛价)兜底:直接取负,不再扣 option
398
558
  return new Decimal(Number(bundle.bundle_selling_price) || 0).abs().negated();
399
559
  }
400
- var rawPrice = useOriginal ? (_ref11 = (_bundle$original_pric2 = bundle.original_price) !== null && _bundle$original_pric2 !== void 0 ? _bundle$original_pric2 : bundle.product_price) !== null && _ref11 !== void 0 ? _ref11 : bundle.price : (_bundle$bundle_sellin = bundle.bundle_selling_price) !== null && _bundle$bundle_sellin !== void 0 ? _bundle$bundle_sellin : bundle.price;
560
+ var rawPrice = useOriginal ? (_ref16 = (_bundle$original_pric2 = bundle.original_price) !== null && _bundle$original_pric2 !== void 0 ? _bundle$original_pric2 : bundle.product_price) !== null && _ref16 !== void 0 ? _ref16 : bundle.price : (_bundle$bundle_sellin = bundle.bundle_selling_price) !== null && _bundle$bundle_sellin !== void 0 ? _bundle$bundle_sellin : bundle.price;
401
561
  return new Decimal(Number(rawPrice) || 0);
402
562
  }
403
563
 
@@ -501,6 +661,22 @@ function resolveSubmitBundleMapId(bundle) {
501
661
  }
502
662
  return undefined;
503
663
  }
664
+ function ensureSubmitDiscountIdentity(discount) {
665
+ if (!discount || _typeof(discount) !== 'object' || Array.isArray(discount)) {
666
+ return discount;
667
+ }
668
+ var discountRecord = discount;
669
+ var metadata = discountRecord.metadata && _typeof(discountRecord.metadata) === 'object' && !Array.isArray(discountRecord.metadata) ? discountRecord.metadata : {};
670
+ var uniqueIdentificationNumber = metadata.unique_identification_number;
671
+ if (uniqueIdentificationNumber !== undefined && uniqueIdentificationNumber !== null && String(uniqueIdentificationNumber).trim() !== '') {
672
+ return discount;
673
+ }
674
+ return _objectSpread(_objectSpread({}, discountRecord), {}, {
675
+ metadata: _objectSpread(_objectSpread({}, metadata), {}, {
676
+ unique_identification_number: createUuidV4()
677
+ })
678
+ });
679
+ }
504
680
  function collectSubmitProductDiscountList(product) {
505
681
  var submitDiscountList = Array.isArray(product === null || product === void 0 ? void 0 : product.discount_list) ? _toConsumableArray(product.discount_list) : [];
506
682
  var _iterator5 = _createForOfIteratorHelper((product === null || product === void 0 ? void 0 : product.product_bundle) || []),
@@ -536,7 +712,7 @@ function collectSubmitProductDiscountList(product) {
536
712
  } finally {
537
713
  _iterator5.f();
538
714
  }
539
- return normalizeOrderProductDiscountList(submitDiscountList);
715
+ return normalizeOrderProductDiscountList(submitDiscountList.map(ensureSubmitDiscountIdentity));
540
716
  }
541
717
 
542
718
  /**
@@ -609,14 +785,37 @@ export function resolveEffectivePerUnitDiscount(product) {
609
785
  if (!Number.isFinite(originalPrice) || !Number.isFinite(finalPrice)) return fromList;
610
786
  return fromList + (originalPrice - finalPrice);
611
787
  }
612
- export function createDefaultOrderRulesHooks() {
788
+ export function createDefaultOrderRulesHooks(getBookings) {
789
+ var getProductStartDate = function getProductStartDate(product) {
790
+ var _ref17, _product$metadata$uni, _product$metadata2, _ref18, _product$booking_uid, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6;
791
+ 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 : '');
792
+ var bookingUid = String((_ref18 = (_product$booking_uid = product.booking_uid) !== null && _product$booking_uid !== void 0 ? _product$booking_uid : (_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.booking_uid) !== null && _ref18 !== void 0 ? _ref18 : '');
793
+ // 每次读取当前 bookings,覆盖改期、订单回显以及直接调用 Rules 的选券入口。
794
+ var bookings = (getBookings === null || getBookings === void 0 ? void 0 : getBookings()) || [];
795
+ var booking = bookings.find(function (item) {
796
+ var _ref19, _item$product_uid, _item$metadata3;
797
+ return productUid && String((_ref19 = (_item$product_uid = item === null || item === void 0 ? void 0 : item.product_uid) !== null && _item$product_uid !== void 0 ? _item$product_uid : item === null || item === void 0 || (_item$metadata3 = item.metadata) === null || _item$metadata3 === void 0 ? void 0 : _item$metadata3.product_uid) !== null && _ref19 !== void 0 ? _ref19 : '') === productUid;
798
+ }) || bookings.find(function (item) {
799
+ var _ref20, _item$metadata$unique, _item$metadata4;
800
+ return bookingUid && String((_ref20 = (_item$metadata$unique = item === null || item === void 0 || (_item$metadata4 = item.metadata) === null || _item$metadata4 === void 0 ? void 0 : _item$metadata4.unique_identification_number) !== null && _item$metadata$unique !== void 0 ? _item$metadata$unique : item === null || item === void 0 ? void 0 : item.booking_uid) !== null && _ref20 !== void 0 ? _ref20 : '') === bookingUid;
801
+ });
802
+ if (booking) {
803
+ // 严格解析并保留 Invalid Date,让公共时间校验拒绝缺失/非法时间,避免回退到当前时间。
804
+ return dayjs("".concat(booking.start_date, " ").concat(booking.start_time), ['YYYY-MM-DD HH:mm', 'YYYY-MM-DD HH:mm:ss', 'YYYY-MM-DD H:mm', 'YYYY-MM-DD H:mm:ss'], true);
805
+ }
806
+ if (getBookings && (bookingUid || product.booking_id || (_product$metadata4 = product.metadata) !== null && _product$metadata4 !== void 0 && _product$metadata4.booking_id)) {
807
+ return dayjs('');
808
+ }
809
+ var legacyStartDate = ((_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.start_date) || ((_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.startDate);
810
+ return legacyStartDate ? dayjs(legacyStartDate) : undefined;
811
+ };
613
812
  var toUnitPriceString = function toUnitPriceString(totalLike, num) {
614
813
  var effectiveNum = Number(num) > 0 ? Number(num) : 1;
615
814
  return new Decimal(Number(totalLike) || 0).dividedBy(effectiveNum).toDecimalPlaces(2).toString();
616
815
  };
617
816
  var getBundleIdentity = function getBundleIdentity(bundle) {
618
- var _ref12, _bundle$bundle_id, _ref13, _ref14, _bundle$bundle_produc, _ref15, _ref16, _bundle$bundle_varian, _ref17, _bundle$bundle_group_;
619
- return [(_ref12 = (_bundle$bundle_id = bundle.bundle_id) !== null && _bundle$bundle_id !== void 0 ? _bundle$bundle_id : bundle.id) !== null && _ref12 !== void 0 ? _ref12 : '', (_ref13 = (_ref14 = (_bundle$bundle_produc = bundle.bundle_product_id) !== null && _bundle$bundle_produc !== void 0 ? _bundle$bundle_produc : bundle._bundle_product_id) !== null && _ref14 !== void 0 ? _ref14 : bundle.product_id) !== null && _ref13 !== void 0 ? _ref13 : '', (_ref15 = (_ref16 = (_bundle$bundle_varian = bundle.bundle_variant_id) !== null && _bundle$bundle_varian !== void 0 ? _bundle$bundle_varian : bundle.variant_id) !== null && _ref16 !== void 0 ? _ref16 : bundle.product_variant_id) !== null && _ref15 !== void 0 ? _ref15 : 0, (_ref17 = (_bundle$bundle_group_ = bundle.bundle_group_id) !== null && _bundle$bundle_group_ !== void 0 ? _bundle$bundle_group_ : bundle.group_id) !== null && _ref17 !== void 0 ? _ref17 : ''].join('|');
817
+ var _ref21, _bundle$bundle_id, _ref22, _ref23, _bundle$bundle_produc, _ref24, _ref25, _bundle$bundle_varian, _ref26, _bundle$bundle_group_;
818
+ return [(_ref21 = (_bundle$bundle_id = bundle.bundle_id) !== null && _bundle$bundle_id !== void 0 ? _bundle$bundle_id : bundle.id) !== null && _ref21 !== void 0 ? _ref21 : '', (_ref22 = (_ref23 = (_bundle$bundle_produc = bundle.bundle_product_id) !== null && _bundle$bundle_produc !== void 0 ? _bundle$bundle_produc : bundle._bundle_product_id) !== null && _ref23 !== void 0 ? _ref23 : bundle.product_id) !== null && _ref22 !== void 0 ? _ref22 : '', (_ref24 = (_ref25 = (_bundle$bundle_varian = bundle.bundle_variant_id) !== null && _bundle$bundle_varian !== void 0 ? _bundle$bundle_varian : bundle.variant_id) !== null && _ref25 !== void 0 ? _ref25 : bundle.product_variant_id) !== null && _ref24 !== void 0 ? _ref24 : 0, (_ref26 = (_bundle$bundle_group_ = bundle.bundle_group_id) !== null && _bundle$bundle_group_ !== void 0 ? _bundle$bundle_group_ : bundle.group_id) !== null && _ref26 !== void 0 ? _ref26 : ''].join('|');
620
819
  };
621
820
  var mergeRulesBundlePrices = function mergeRulesBundlePrices(currentBundle, rulesBundle) {
622
821
  if (!Array.isArray(rulesBundle)) return rulesBundle;
@@ -626,7 +825,7 @@ export function createDefaultOrderRulesHooks() {
626
825
  currentByIdentity.set(getBundleIdentity(bundle), bundle);
627
826
  });
628
827
  return rulesBundle.map(function (bundle) {
629
- var _bundle$price_type_ex2, _ref18, _ref19, _current$price, _ref20, _ref21, _ref22, _current$original_pri;
828
+ var _bundle$price_type_ex2, _ref27, _ref28, _current$price, _ref29, _ref30, _ref31, _current$original_pri;
630
829
  if (!bundle || _typeof(bundle) !== 'object') return bundle;
631
830
  var current = currentByIdentity.get(getBundleIdentity(bundle));
632
831
  if (!current) return bundle;
@@ -635,8 +834,8 @@ export function createDefaultOrderRulesHooks() {
635
834
  } : {});
636
835
  var isProductPriceBundle = ((_bundle$price_type_ex2 = bundle.price_type_ext) !== null && _bundle$price_type_ex2 !== void 0 ? _bundle$price_type_ex2 : current.price_type_ext) === 'product_price';
637
836
  if (!isProductPriceBundle) return bundleWithDisplayFields;
638
- var sourcePrice = (_ref18 = (_ref19 = (_current$price = current.price) !== null && _current$price !== void 0 ? _current$price : current.custom_price) !== null && _ref19 !== void 0 ? _ref19 : current.original_price) !== null && _ref18 !== void 0 ? _ref18 : current.bundle_selling_price;
639
- var originalPrice = (_ref20 = (_ref21 = (_ref22 = (_current$original_pri = current.original_price) !== null && _current$original_pri !== void 0 ? _current$original_pri : current.product_price) !== null && _ref22 !== void 0 ? _ref22 : current.price) !== null && _ref21 !== void 0 ? _ref21 : current.custom_price) !== null && _ref20 !== void 0 ? _ref20 : sourcePrice;
837
+ var sourcePrice = (_ref27 = (_ref28 = (_current$price = current.price) !== null && _current$price !== void 0 ? _current$price : current.custom_price) !== null && _ref28 !== void 0 ? _ref28 : current.original_price) !== null && _ref27 !== void 0 ? _ref27 : current.bundle_selling_price;
838
+ var originalPrice = (_ref29 = (_ref30 = (_ref31 = (_current$original_pri = current.original_price) !== null && _current$original_pri !== void 0 ? _current$original_pri : current.product_price) !== null && _ref31 !== void 0 ? _ref31 : current.price) !== null && _ref30 !== void 0 ? _ref30 : current.custom_price) !== null && _ref29 !== void 0 ? _ref29 : sourcePrice;
640
839
  return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, bundleWithDisplayFields), sourcePrice !== undefined ? {
641
840
  price: sourcePrice
642
841
  } : {}), originalPrice !== undefined ? {
@@ -648,7 +847,7 @@ export function createDefaultOrderRulesHooks() {
648
847
  };
649
848
  return {
650
849
  getProduct: function getProduct(product) {
651
- var _product$metadata2, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6, _metadataAny$_promoti;
850
+ var _product$metadata7, _product$metadata8, _product$metadata9, _metadataAny$_promoti;
652
851
  // source_product_price 是权威源;兜底链:source → mainSelling − options(反推)→ 行 selling_price
653
852
  var metadataAny = product.metadata || {};
654
853
  var optionSum = sumOptionUnitPrice(getProductSkuOptions(product));
@@ -675,7 +874,7 @@ export function createDefaultOrderRulesHooks() {
675
874
  // 否则同 SKU 不同小料会在 calcDiscount 重组时互相覆盖。
676
875
  // 不透明 identity 契约下,normalizeOrderProduct / hydrate 已保证唯一值存在;
677
876
  // 留 fingerprint 分支仅作 Rules 单测里直接传裸 product 时的兜底。
678
- _id: (_product$metadata2 = product.metadata) !== null && _product$metadata2 !== void 0 && _product$metadata2.unique_identification_number ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.metadata.unique_identification_number) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(getProductSkuOptions(product), product.product_bundle)),
877
+ _id: (_product$metadata7 = product.metadata) !== null && _product$metadata7 !== void 0 && _product$metadata7.unique_identification_number ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.metadata.unique_identification_number) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(getProductSkuOptions(product), product.product_bundle)),
679
878
  // Rules 内部 getProductTotalPrice / getProductOriginTotalPrice 会各自再叠加 bundle + option,
680
879
  // 所以这里必须喂 source-level(不含 option、不含 bundle、不含折扣)单价,避免双加 option。
681
880
  price: sourcePrice,
@@ -687,23 +886,23 @@ export function createDefaultOrderRulesHooks() {
687
886
  num: product.num || 1,
688
887
  discount_list: product.discount_list || [],
689
888
  bundle: product.product_bundle || [],
690
- booking_id: ((_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.booking_id) || null,
889
+ booking_id: ((_product$metadata8 = product.metadata) === null || _product$metadata8 === void 0 ? void 0 : _product$metadata8.booking_id) || null,
691
890
  isClient: false,
692
891
  // 勿写死 false:否则 Rules 不会走 total≠origin_total 的手动价推断,
693
892
  // 无券时会把 bundle 价还原成 original_price(手动改价套餐会从 20 回到 30)。
694
893
  isManualDiscount: resolveRulesManualDiscountFlag(metadataAny),
695
- holder_id: (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.holder_id,
696
- startDate: ((_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.start_date) || ((_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.startDate),
894
+ holder_id: (_product$metadata9 = product.metadata) === null || _product$metadata9 === void 0 ? void 0 : _product$metadata9.holder_id,
895
+ startDate: getProductStartDate(product),
697
896
  main_product_selling_price: metadataAny.main_product_selling_price !== undefined ? new Decimal(Number(metadataAny.main_product_selling_price) || 0).minus(optionSum).toDecimalPlaces(2).toString() : undefined,
698
897
  inPromotion: ((_metadataAny$_promoti = metadataAny._promotion) === null || _metadataAny$_promoti === void 0 ? void 0 : _metadataAny$_promoti.inPromotion) === true,
699
898
  _promotion: metadataAny._promotion
700
899
  };
701
900
  },
702
901
  setProduct: function setProduct(product, values) {
703
- var _ref23, _values$quantity, _ref24, _metadataAny$source_p, _product$product_sku, _values$discount_list, _values$quantity2;
704
- var nextNum = Number((_ref23 = (_values$quantity = values.quantity) !== null && _values$quantity !== void 0 ? _values$quantity : product.num) !== null && _ref23 !== void 0 ? _ref23 : 1) || 1;
902
+ var _ref32, _values$quantity, _ref33, _metadataAny$source_p, _product$product_sku, _values$discount_list, _values$quantity2;
903
+ var nextNum = Number((_ref32 = (_values$quantity = values.quantity) !== null && _values$quantity !== void 0 ? _values$quantity : product.num) !== null && _ref32 !== void 0 ? _ref32 : 1) || 1;
705
904
  var metadataAny = product.metadata || {};
706
- var existedSource = (_ref24 = (_metadataAny$source_p = metadataAny.source_product_price) !== null && _metadataAny$source_p !== void 0 ? _metadataAny$source_p : product.selling_price) !== null && _ref24 !== void 0 ? _ref24 : '0';
905
+ var existedSource = (_ref33 = (_metadataAny$source_p = metadataAny.source_product_price) !== null && _metadataAny$source_p !== void 0 ? _metadataAny$source_p : product.selling_price) !== null && _ref33 !== void 0 ? _ref33 : '0';
707
906
  var nextOptions = getProductSkuOptions(product);
708
907
  var optionSum = sumOptionUnitPrice(nextOptions);
709
908
 
@@ -914,7 +1113,7 @@ function formatSubmitBundleItems(bundle) {
914
1113
  var formatOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
915
1114
  if (!Array.isArray(bundle)) return [];
916
1115
  return bundle.map(function (b) {
917
- var _ref25, _rawBundle$price, _rawBundle$surcharge_, _rawBundle$num, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$quantity, _rawBundle$extension_, _rawBundle$extension_2, _ref26, _rawBundle$price_type, _ref27, _rawBundle$price_type2, _rawBundle$bundle_gro, _rawBundle$bundle_id, _rawBundle$bundle_pro;
1116
+ var _ref34, _rawBundle$price, _rawBundle$surcharge_, _rawBundle$num, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$quantity, _rawBundle$extension_, _rawBundle$extension_2, _ref35, _rawBundle$price_type, _ref36, _rawBundle$price_type2, _rawBundle$bundle_gro, _rawBundle$bundle_id, _rawBundle$bundle_pro;
918
1117
  var rawBundle = b && _typeof(b) === 'object' ? b : {};
919
1118
  var existedMetadata = rawBundle.metadata && _typeof(rawBundle.metadata) === 'object' ? rawBundle.metadata : {};
920
1119
  var _customProductBundleMapId = existedMetadata.custom_product_bundle_map_id,
@@ -925,7 +1124,7 @@ function formatSubmitBundleItems(bundle) {
925
1124
  var sellingPrice = formatOptions.virtualSettlementMode ? '0.00' : getBundleSellingMagnitude(rawBundle).toFixed(2);
926
1125
  // payment 价由整单折扣均摊层产出;缺省(无折扣)时与 selling 净额同义。
927
1126
  var paymentPrice = formatOptions.virtualSettlementMode ? '0.00' : rawBundle.bundle_payment_price !== undefined && rawBundle.bundle_payment_price !== null && rawBundle.bundle_payment_price !== '' ? toMoneyString(rawBundle.bundle_payment_price) : sellingPrice;
928
- var priceValue = formatOptions.virtualSettlementMode ? 0 : (_ref25 = (_rawBundle$price = rawBundle.price) !== null && _rawBundle$price !== void 0 ? _rawBundle$price : rawBundle.custom_price) !== null && _ref25 !== void 0 ? _ref25 : rawBundle.bundle_selling_price;
1127
+ var priceValue = formatOptions.virtualSettlementMode ? 0 : (_ref34 = (_rawBundle$price = rawBundle.price) !== null && _rawBundle$price !== void 0 ? _rawBundle$price : rawBundle.custom_price) !== null && _ref34 !== void 0 ? _ref34 : rawBundle.bundle_selling_price;
929
1128
  var relationSurchargeIds = Array.isArray(rawBundle.relation_surcharge_ids) ? rawBundle.relation_surcharge_ids : Array.isArray(existedMetadata.relation_surcharge_ids) ? existedMetadata.relation_surcharge_ids : [];
930
1129
  var surchargeFee = toMoneyString((_rawBundle$surcharge_ = rawBundle.surcharge_fee) !== null && _rawBundle$surcharge_ !== void 0 ? _rawBundle$surcharge_ : existedMetadata.surcharge_fee);
931
1130
  var productDiscountDifference = toBundleNumber(existedMetadata.product_discount_difference, 0);
@@ -944,8 +1143,8 @@ function formatSubmitBundleItems(bundle) {
944
1143
  extension_id: (_rawBundle$extension_ = rawBundle.extension_id) !== null && _rawBundle$extension_ !== void 0 ? _rawBundle$extension_ : 0,
945
1144
  extension_type: (_rawBundle$extension_2 = rawBundle.extension_type) !== null && _rawBundle$extension_2 !== void 0 ? _rawBundle$extension_2 : 'normal',
946
1145
  price: priceValue,
947
- price_type: (_ref26 = (_rawBundle$price_type = rawBundle.price_type) !== null && _rawBundle$price_type !== void 0 ? _rawBundle$price_type : rawBundle.custom_price_type) !== null && _ref26 !== void 0 ? _ref26 : '',
948
- price_type_ext: (_ref27 = (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : rawBundle.custom_price_type_ext) !== null && _ref27 !== void 0 ? _ref27 : '',
1146
+ price_type: (_ref35 = (_rawBundle$price_type = rawBundle.price_type) !== null && _rawBundle$price_type !== void 0 ? _rawBundle$price_type : rawBundle.custom_price_type) !== null && _ref35 !== void 0 ? _ref35 : '',
1147
+ price_type_ext: (_ref36 = (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : rawBundle.custom_price_type_ext) !== null && _ref36 !== void 0 ? _ref36 : '',
949
1148
  bundle_selling_price: sellingPrice,
950
1149
  bundle_payment_price: paymentPrice,
951
1150
  option: formatSubmitOptionItems(rawBundle.option, formatOptions),
@@ -981,11 +1180,11 @@ function formatSubmitBundleItems(bundle) {
981
1180
  * 法币仅做字段/metadata 裁剪;虚拟币在出站前再次执行零加价与固定单价断言。
982
1181
  */
983
1182
  function normalizeSubmitProduct(product) {
984
- var _ref29, _submitProduct$bundle, _rawMetadata$product_, _rawMetadata$selected, _rawMetadata$selected2, _submitProduct$produc, _submitProduct$paymen;
1183
+ var _ref38, _submitProduct$bundle, _rawMetadata$product_, _rawMetadata$selected, _rawMetadata$selected2, _submitProduct$produc, _submitProduct$paymen;
985
1184
  var formatOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
986
- var _ref28 = product,
987
- _runtimeUid = _ref28.unique_identification_number,
988
- submitProduct = _objectWithoutProperties(_ref28, _excluded2);
1185
+ var _ref37 = product,
1186
+ _runtimeUid = _ref37.unique_identification_number,
1187
+ submitProduct = _objectWithoutProperties(_ref37, _excluded2);
989
1188
  var num = submitProduct.num,
990
1189
  _productSurchargeFee = submitProduct.surcharge_fee,
991
1190
  _deprecatedDiscountAmount = submitProduct.discount_amount,
@@ -1002,7 +1201,7 @@ function normalizeSubmitProduct(product) {
1002
1201
  // 兼容历史 BigSale 编辑链路:bundle_edit 曾被写入 metadata,
1003
1202
  // 出站时需提升到商品顶层;套餐未编辑时也必须显式提交 0。
1004
1203
  var hasProductBundle = Array.isArray(submitProduct.product_bundle) && submitProduct.product_bundle.length > 0;
1005
- var bundleEdit = (_ref29 = (_submitProduct$bundle = submitProduct.bundle_edit) !== null && _submitProduct$bundle !== void 0 ? _submitProduct$bundle : rawMetadata.bundle_edit) !== null && _ref29 !== void 0 ? _ref29 : hasProductBundle ? 0 : undefined;
1204
+ var bundleEdit = (_ref38 = (_submitProduct$bundle = submitProduct.bundle_edit) !== null && _submitProduct$bundle !== void 0 ? _submitProduct$bundle : rawMetadata.bundle_edit) !== null && _ref38 !== void 0 ? _ref38 : hasProductBundle ? 0 : undefined;
1006
1205
  var cleanMetadata = {};
1007
1206
  if (rawMetadata.unique_identification_number) {
1008
1207
  cleanMetadata.unique_identification_number = rawMetadata.unique_identification_number;
@@ -1233,7 +1432,7 @@ export function resolveSubmitOrderType(params) {
1233
1432
  return 'virtual';
1234
1433
  }
1235
1434
  export function buildSubmitPayload(params) {
1236
- var _tempOrder$metadata2, _tempOrder$customer_i, _tempOrder$country_ca, _tempOrder$phone, _tempOrder$email, _tempOrder$order_numb, _tempOrder$shop_order, _tempOrder$shop_full_, _ref31, _tempOrder$is_price_i, _tempOrder$is_deposit, _tempOrder$_extend, _enhancedPayload$summ;
1435
+ var _tempOrder$metadata2, _tempOrder$customer_i, _tempOrder$country_ca, _tempOrder$phone, _tempOrder$email, _tempOrder$order_numb, _tempOrder$shop_order, _tempOrder$shop_full_, _ref40, _tempOrder$is_price_i, _tempOrder$is_deposit, _tempOrder$_extend, _enhancedPayload$summ;
1237
1436
  var tempOrder = params.tempOrder,
1238
1437
  cacheId = params.cacheId,
1239
1438
  _params$now = params.now,
@@ -1247,29 +1446,29 @@ export function buildSubmitPayload(params) {
1247
1446
  var scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
1248
1447
  var bookingUuid = createUuidV4();
1249
1448
  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';
1250
- var _ref30 = tempOrder,
1251
- _extend = _ref30._extend,
1252
- _relationId = _ref30.relation_id,
1253
- _tableFormId = _ref30.table_form_id,
1254
- _resourceId = _ref30.resource_id,
1255
- _summary = _ref30.summary,
1256
- _lastOrderInfo = _ref30.lastOrderInfo,
1257
- _paidAmount = _ref30.paid_amount,
1258
- _shopId = _ref30.shop_id,
1259
- _shopNote = _ref30.shop_note,
1260
- _shopServiceType = _ref30.shop_service_type,
1261
- _startTime = _ref30.start_time,
1262
- _customer = _ref30.customer,
1263
- _discountList = _ref30.discount_list,
1264
- _orderMetaList = _ref30.order_meta_list,
1265
- _rootTaxFee = _ref30.tax_fee,
1266
- _totalAmount = _ref30.total_amount,
1267
- _totalRefundAmount = _ref30.total_refund_amount,
1268
- _createDate = _ref30.create_date,
1269
- _holderId = _ref30.holder_id,
1270
- _paymentStatus = _ref30.payment_status,
1271
- _notes = _ref30.notes,
1272
- tempOrderRest = _objectWithoutProperties(_ref30, _excluded4);
1449
+ var _ref39 = tempOrder,
1450
+ _extend = _ref39._extend,
1451
+ _relationId = _ref39.relation_id,
1452
+ _tableFormId = _ref39.table_form_id,
1453
+ _resourceId = _ref39.resource_id,
1454
+ _summary = _ref39.summary,
1455
+ _lastOrderInfo = _ref39.lastOrderInfo,
1456
+ _paidAmount = _ref39.paid_amount,
1457
+ _shopId = _ref39.shop_id,
1458
+ _shopNote = _ref39.shop_note,
1459
+ _shopServiceType = _ref39.shop_service_type,
1460
+ _startTime = _ref39.start_time,
1461
+ _customer = _ref39.customer,
1462
+ _discountList = _ref39.discount_list,
1463
+ _orderMetaList = _ref39.order_meta_list,
1464
+ _rootTaxFee = _ref39.tax_fee,
1465
+ _totalAmount = _ref39.total_amount,
1466
+ _totalRefundAmount = _ref39.total_refund_amount,
1467
+ _createDate = _ref39.create_date,
1468
+ _holderId = _ref39.holder_id,
1469
+ _paymentStatus = _ref39.payment_status,
1470
+ _notes = _ref39.notes,
1471
+ tempOrderRest = _objectWithoutProperties(_ref39, _excluded4);
1273
1472
  var resolvedBusinessCode = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code;
1274
1473
  var normalizedOrderMetaList = normalizeOrderMetaList(tempOrder.order_meta_list);
1275
1474
  var submitType = resolveSubmitOrderType({
@@ -1294,7 +1493,7 @@ export function buildSubmitPayload(params) {
1294
1493
  type: submitType,
1295
1494
  business_code: resolvedBusinessCode,
1296
1495
  sales_channel: tempOrder.sales_channel || 'my_pisel',
1297
- order_sales_channel: (_ref31 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref31 !== void 0 ? _ref31 : 'online_store',
1496
+ order_sales_channel: (_ref40 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref40 !== void 0 ? _ref40 : 'online_store',
1298
1497
  status: tempOrder.status || 'normal'
1299
1498
  }, params.includePaymentStatus !== false ? {
1300
1499
  payment_status: tempOrder.payment_status || 'payment_processing'
@@ -1322,13 +1521,13 @@ export function buildSubmitPayload(params) {
1322
1521
  // holder: tempOrder.holder || null,
1323
1522
  summary: summary || tempOrder.summary || createEmptySummary(),
1324
1523
  metadata: function () {
1325
- var _ref32 = tempOrder.metadata || {},
1326
- _collectPax = _ref32.collect_pax,
1327
- _tableOccupancyDuration = _ref32.table_occupancy_duration,
1328
- _cartSettlementKey = _ref32.cart_settlement_key,
1329
- _cartSettlementSnapshot = _ref32.cart_settlement_snapshot,
1330
- _legalCurrencySnapshot = _ref32.legal_currency_snapshot,
1331
- rest = _objectWithoutProperties(_ref32, _excluded5);
1524
+ var _ref41 = tempOrder.metadata || {},
1525
+ _collectPax = _ref41.collect_pax,
1526
+ _tableOccupancyDuration = _ref41.table_occupancy_duration,
1527
+ _cartSettlementKey = _ref41.cart_settlement_key,
1528
+ _cartSettlementSnapshot = _ref41.cart_settlement_snapshot,
1529
+ _legalCurrencySnapshot = _ref41.legal_currency_snapshot,
1530
+ rest = _objectWithoutProperties(_ref41, _excluded5);
1332
1531
  return _objectSpread({}, rest);
1333
1532
  }()
1334
1533
  }, (_tempOrder$_extend = tempOrder._extend) !== null && _tempOrder$_extend !== void 0 && (_tempOrder$_extend = _tempOrder$_extend.salesNotesState) !== null && _tempOrder$_extend !== void 0 && _tempOrder$_extend.dirty ? {
@@ -1532,9 +1731,9 @@ export function clearTempOrderHolderAssignments(tempOrder) {
1532
1731
  * getOrderProductLineUid({ metadata: { unique_identification_number: 'line-1' } }); // 'line-1'
1533
1732
  */
1534
1733
  export function getOrderProductLineUid(product) {
1535
- var _product$metadata$uni, _product$metadata7;
1734
+ var _product$metadata$uni2, _product$metadata10;
1536
1735
  if (!product || _typeof(product) !== 'object') return null;
1537
- var uid = (_product$metadata$uni = (_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7.unique_identification_number) !== null && _product$metadata$uni !== void 0 ? _product$metadata$uni : product.unique_identification_number;
1736
+ var uid = (_product$metadata$uni2 = (_product$metadata10 = product.metadata) === null || _product$metadata10 === void 0 ? void 0 : _product$metadata10.unique_identification_number) !== null && _product$metadata$uni2 !== void 0 ? _product$metadata$uni2 : product.unique_identification_number;
1538
1737
  if (uid === undefined || uid === null || uid === '') return null;
1539
1738
  return String(uid);
1540
1739
  }
@@ -1545,8 +1744,8 @@ export function getRuntimeProductOrigin(tempOrder, product) {
1545
1744
  return tempOrder._extend.productsByUid[uid].origin;
1546
1745
  }
1547
1746
  var matchedProduct = ((tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.products) || []).find(function (item) {
1548
- var _ref33, _item$product_id, _ref34, _product$product_id;
1549
- return item === product || getOrderProductLineUid(item) === uid || String((_ref33 = (_item$product_id = item === null || item === void 0 ? void 0 : item.product_id) !== null && _item$product_id !== void 0 ? _item$product_id : item === null || item === void 0 ? void 0 : item.id) !== null && _ref33 !== void 0 ? _ref33 : '') === String((_ref34 = (_product$product_id = product === null || product === void 0 ? void 0 : product.product_id) !== null && _product$product_id !== void 0 ? _product$product_id : product === null || product === void 0 ? void 0 : product.id) !== null && _ref34 !== void 0 ? _ref34 : '');
1747
+ var _ref42, _item$product_id, _ref43, _product$product_id;
1748
+ return item === product || getOrderProductLineUid(item) === uid || String((_ref42 = (_item$product_id = item === null || item === void 0 ? void 0 : item.product_id) !== null && _item$product_id !== void 0 ? _item$product_id : item === null || item === void 0 ? void 0 : item.id) !== null && _ref42 !== void 0 ? _ref42 : '') === String((_ref43 = (_product$product_id = product === null || product === void 0 ? void 0 : product.product_id) !== null && _product$product_id !== void 0 ? _product$product_id : product === null || product === void 0 ? void 0 : product.id) !== null && _ref43 !== void 0 ? _ref43 : '');
1550
1749
  });
1551
1750
  var matchedUid = matchedProduct ? getOrderProductLineUid(matchedProduct) : '';
1552
1751
  return matchedUid ? (tempOrder === null || tempOrder === void 0 || (_tempOrder$_extend4 = tempOrder._extend) === null || _tempOrder$_extend4 === void 0 || (_tempOrder$_extend4 = _tempOrder$_extend4.productsByUid) === null || _tempOrder$_extend4 === void 0 || (_tempOrder$_extend4 = _tempOrder$_extend4[matchedUid]) === null || _tempOrder$_extend4 === void 0 ? void 0 : _tempOrder$_extend4.origin) || null : null;