@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.
- package/dist/model/strategy/adapter/promotion/evaluator.js +89 -104
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +28 -4
- package/dist/modules/Holder/utils.d.ts +2 -0
- package/dist/modules/Holder/utils.js +32 -2
- package/dist/modules/OpenData/contactInfo.d.ts +20 -0
- package/dist/modules/OpenData/contactInfo.js +70 -0
- package/dist/modules/OpenData/index.d.ts +1 -0
- package/dist/modules/OpenData/index.js +1 -0
- package/dist/modules/OpenData/types.d.ts +9 -0
- package/dist/modules/Order/holderRelations.d.ts +14 -0
- package/dist/modules/Order/holderRelations.js +154 -0
- package/dist/modules/Order/index.d.ts +2 -2
- package/dist/modules/Order/index.js +89 -44
- package/dist/modules/Order/types.d.ts +19 -1
- package/dist/modules/Order/types.js +2 -0
- package/dist/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/dist/modules/Order/utils/discountProductLineIdentity.js +142 -7
- package/dist/modules/Order/utils/orderCollectionIdentity.js +24 -10
- package/dist/modules/Order/utils.d.ts +2 -1
- package/dist/modules/Order/utils.js +36 -10
- package/dist/modules/Rules/index.js +62 -61
- package/dist/server/index.js +36 -28
- package/dist/server/modules/order/index.d.ts +4 -0
- package/dist/server/modules/order/index.js +255 -190
- package/dist/server/modules/order/types.d.ts +3 -0
- package/dist/server/modules/products/index.d.ts +28 -7
- package/dist/server/modules/products/index.js +1297 -770
- package/dist/server/modules/products/replication.d.ts +8 -0
- package/dist/server/modules/products/replication.js +69 -0
- package/dist/server/modules/products/types.d.ts +12 -1
- package/dist/server/modules/products/types.js +4 -0
- package/dist/shared/receipt/small-ticket.js +24 -12
- package/dist/shared/receipt/templateVisibility.d.ts +3 -0
- package/dist/shared/receipt/templateVisibility.js +6 -2
- package/dist/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/dist/solution/BaseSales/index.d.ts +4 -0
- package/dist/solution/BaseSales/index.js +1116 -935
- package/dist/solution/BaseSales/types.d.ts +2 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/dist/solution/BaseSales/utils/parseSalesResponse.js +7 -3
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +14 -4
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +15 -1
- package/dist/solution/BookingTicket/index.js +784 -501
- package/dist/solution/ScanOrder/index.js +65 -31
- package/dist/solution/ScanOrder/types.d.ts +3 -0
- package/dist/solution/UnifiedBookingSales/index.js +1 -1
- package/lib/model/strategy/adapter/promotion/evaluator.js +9 -14
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +3 -1
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +17 -1
- package/lib/modules/Holder/utils.d.ts +2 -0
- package/lib/modules/Holder/utils.js +27 -1
- package/lib/modules/OpenData/contactInfo.d.ts +20 -0
- package/lib/modules/OpenData/contactInfo.js +56 -0
- package/lib/modules/OpenData/index.d.ts +1 -0
- package/lib/modules/OpenData/index.js +12 -0
- package/lib/modules/OpenData/types.d.ts +9 -0
- package/lib/modules/Order/holderRelations.d.ts +14 -0
- package/lib/modules/Order/holderRelations.js +98 -0
- package/lib/modules/Order/index.d.ts +2 -2
- package/lib/modules/Order/index.js +44 -12
- package/lib/modules/Order/types.d.ts +19 -1
- package/lib/modules/Order/types.js +1 -0
- package/lib/modules/Order/utils/discountProductLineIdentity.d.ts +1 -1
- package/lib/modules/Order/utils/discountProductLineIdentity.js +51 -2
- package/lib/modules/Order/utils/orderCollectionIdentity.js +5 -0
- package/lib/modules/Order/utils.d.ts +2 -1
- package/lib/modules/Order/utils.js +28 -6
- package/lib/modules/Rules/index.js +2 -1
- package/lib/server/index.js +8 -2
- package/lib/server/modules/order/index.d.ts +4 -0
- package/lib/server/modules/order/index.js +46 -4
- package/lib/server/modules/order/types.d.ts +3 -0
- package/lib/server/modules/products/index.d.ts +28 -7
- package/lib/server/modules/products/index.js +226 -63
- package/lib/server/modules/products/replication.d.ts +8 -0
- package/lib/server/modules/products/replication.js +30 -0
- package/lib/server/modules/products/types.d.ts +12 -1
- package/lib/server/modules/products/types.js +3 -0
- package/lib/shared/receipt/small-ticket.js +22 -13
- package/lib/shared/receipt/templateVisibility.d.ts +3 -0
- package/lib/shared/receipt/templateVisibility.js +6 -2
- package/lib/shared/sales/loadSalesOrderSnapshot.js +1 -1
- package/lib/solution/BaseSales/index.d.ts +4 -0
- package/lib/solution/BaseSales/index.js +68 -2
- package/lib/solution/BaseSales/types.d.ts +2 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +3 -1
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +4 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +16 -8
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +15 -1
- package/lib/solution/BookingTicket/index.js +132 -3
- package/lib/solution/ScanOrder/index.js +59 -20
- package/lib/solution/ScanOrder/types.d.ts +3 -0
- package/lib/solution/UnifiedBookingSales/index.js +1 -1
- 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) {
|
|
@@ -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
|
-
|
|
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 草稿。 */
|