@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.
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +4 -2
- package/dist/modules/BookingContext/index.js +4 -4
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +58 -19
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +24 -12
- package/dist/modules/Customer/index.js +6 -3
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Discount/availability.d.ts +7 -0
- package/dist/modules/Discount/availability.js +49 -0
- package/dist/modules/Discount/entitlementPass.d.ts +34 -0
- package/dist/modules/Discount/entitlementPass.js +147 -0
- package/dist/modules/Discount/index.d.ts +2 -2
- package/dist/modules/Discount/index.js +37 -151
- package/dist/modules/Discount/types.d.ts +36 -5
- package/dist/modules/OpenData/index.d.ts +1 -1
- package/dist/modules/OpenData/index.js +21 -12
- package/dist/modules/Order/index.d.ts +32 -4
- package/dist/modules/Order/index.js +733 -373
- package/dist/modules/Order/types.d.ts +17 -0
- package/dist/modules/Order/utils/orderCollectionIdentity.js +16 -12
- package/dist/modules/Order/utils.d.ts +14 -2
- package/dist/modules/Order/utils.js +275 -76
- package/dist/modules/Payment/index.d.ts +0 -5
- package/dist/modules/Payment/index.js +35 -85
- package/dist/modules/Payment/types.d.ts +21 -1
- package/dist/modules/Payment/types.js +2 -0
- package/dist/modules/Payment/walletpass.d.ts +1 -1
- package/dist/modules/Payment/walletpass.js +80 -47
- package/dist/modules/ProductList/index.js +18 -5
- package/dist/modules/Rules/index.d.ts +2 -2
- package/dist/modules/Rules/index.js +480 -186
- package/dist/modules/Rules/types.d.ts +4 -0
- package/dist/server/index.js +8 -5
- package/dist/server/modules/order/index.js +6 -0
- package/dist/server/modules/order/types.d.ts +12 -0
- package/dist/server/modules/payment/index.d.ts +25 -6
- package/dist/server/modules/payment/index.js +660 -133
- package/dist/server/utils/small-ticket.d.ts +8 -5
- package/dist/server/utils/small-ticket.js +1269 -199
- package/dist/solution/BaseSales/index.d.ts +11 -2
- package/dist/solution/BaseSales/index.js +1463 -1173
- package/dist/solution/BaseSales/types.d.ts +7 -3
- package/dist/solution/BaseSales/utils/cartPromotion.js +141 -126
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +12 -3
- package/dist/solution/BookingTicket/index.js +663 -542
- package/dist/solution/BookingTicket/types.d.ts +5 -1
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +338 -147
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +19 -6
- package/dist/solution/ShopDiscount/index.d.ts +2 -0
- package/dist/solution/ShopDiscount/index.js +99 -42
- package/dist/solution/ShopDiscount/utils.d.ts +4 -2
- package/dist/solution/ShopDiscount/utils.js +43 -23
- package/dist/solution/UnifiedBookingSales/index.d.ts +2 -2
- package/dist/solution/UnifiedBookingSales/index.js +5 -5
- package/dist/utils/os-private-payload.d.ts +5 -0
- package/dist/utils/os-private-payload.js +17 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +2 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.js +2 -0
- package/lib/modules/BookingContext/index.js +3 -3
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +35 -6
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +13 -6
- package/lib/modules/Customer/index.js +5 -1
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Discount/availability.d.ts +7 -0
- package/lib/modules/Discount/availability.js +43 -0
- package/lib/modules/Discount/entitlementPass.d.ts +34 -0
- package/lib/modules/Discount/entitlementPass.js +141 -0
- package/lib/modules/Discount/index.d.ts +2 -2
- package/lib/modules/Discount/index.js +23 -129
- package/lib/modules/Discount/types.d.ts +36 -5
- package/lib/modules/OpenData/index.d.ts +1 -1
- package/lib/modules/OpenData/index.js +11 -2
- package/lib/modules/Order/index.d.ts +32 -4
- package/lib/modules/Order/index.js +341 -71
- package/lib/modules/Order/types.d.ts +17 -0
- package/lib/modules/Order/utils/orderCollectionIdentity.js +14 -11
- package/lib/modules/Order/utils.d.ts +14 -2
- package/lib/modules/Order/utils.js +186 -3
- package/lib/modules/Payment/index.d.ts +0 -5
- package/lib/modules/Payment/index.js +3 -28
- package/lib/modules/Payment/types.d.ts +21 -1
- package/lib/modules/Payment/types.js +1 -0
- package/lib/modules/Payment/walletpass.d.ts +1 -1
- package/lib/modules/Payment/walletpass.js +29 -9
- package/lib/modules/ProductList/index.js +14 -1
- package/lib/modules/Rules/index.d.ts +2 -2
- package/lib/modules/Rules/index.js +357 -110
- package/lib/modules/Rules/types.d.ts +4 -0
- package/lib/server/index.js +8 -5
- package/lib/server/modules/order/index.js +6 -0
- package/lib/server/modules/order/types.d.ts +12 -0
- package/lib/server/modules/payment/index.d.ts +25 -6
- package/lib/server/modules/payment/index.js +350 -78
- package/lib/server/utils/small-ticket.d.ts +8 -5
- package/lib/server/utils/small-ticket.js +1009 -121
- package/lib/solution/BaseSales/index.d.ts +11 -2
- package/lib/solution/BaseSales/index.js +164 -30
- package/lib/solution/BaseSales/types.d.ts +7 -3
- package/lib/solution/BaseSales/utils/cartPromotion.js +12 -4
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +12 -3
- package/lib/solution/BookingTicket/index.js +103 -41
- package/lib/solution/BookingTicket/types.d.ts +5 -1
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +2 -0
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +174 -42
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +8 -4
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +6 -0
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +11 -3
- package/lib/solution/ShopDiscount/index.d.ts +2 -0
- package/lib/solution/ShopDiscount/index.js +55 -9
- package/lib/solution/ShopDiscount/utils.d.ts +4 -2
- package/lib/solution/ShopDiscount/utils.js +42 -25
- package/lib/solution/UnifiedBookingSales/index.d.ts +2 -2
- package/lib/solution/UnifiedBookingSales/index.js +5 -5
- package/lib/utils/os-private-payload.d.ts +5 -0
- package/lib/utils/os-private-payload.js +22 -0
- package/package.json +1 -1
|
@@ -7,8 +7,10 @@ exports.default = exports.ShopDiscountImpl = void 0;
|
|
|
7
7
|
var _BaseModule = require("../../modules/BaseModule");
|
|
8
8
|
var _Discount = require("../../modules/Discount");
|
|
9
9
|
var _Rules = require("../../modules/Rules");
|
|
10
|
+
var _entitlementPass = require("../../modules/Discount/entitlementPass");
|
|
10
11
|
var _utils = require("./utils");
|
|
11
12
|
var _types = require("../../modules/Rules/types");
|
|
13
|
+
var _availability = require("../../modules/Discount/availability");
|
|
12
14
|
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
13
15
|
var _lodashEs = require("lodash-es");
|
|
14
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -125,7 +127,8 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
125
127
|
customerId: customer.id,
|
|
126
128
|
action: 'create',
|
|
127
129
|
with_good_pass: 1,
|
|
128
|
-
with_discount_card: 1
|
|
130
|
+
with_discount_card: 1,
|
|
131
|
+
with_entitlement_pass: 1
|
|
129
132
|
});
|
|
130
133
|
});
|
|
131
134
|
}
|
|
@@ -347,6 +350,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
347
350
|
const {
|
|
348
351
|
productList: newProductList,
|
|
349
352
|
discountList: newDiscountList,
|
|
353
|
+
evaluatedDiscountList,
|
|
350
354
|
isAvailable,
|
|
351
355
|
unavailableReason
|
|
352
356
|
} = rulesModule.isDiscountListAvailable({
|
|
@@ -361,6 +365,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
361
365
|
productList: this.store.productList || [],
|
|
362
366
|
discountList: this.getDiscountList()
|
|
363
367
|
};
|
|
368
|
+
let isAccepted = isAvailable;
|
|
364
369
|
if (isAvailable) {
|
|
365
370
|
this.setDiscountList(newDiscountList || []);
|
|
366
371
|
this.store.originalDiscountList = newDiscountList || [];
|
|
@@ -368,12 +373,34 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
368
373
|
if (this.isWalkIn() && resultDiscountList.length && this.options.otherParams?.platform === 'shop' && !((resultDiscountList[0].customer_id || 1) === 1)) {
|
|
369
374
|
await this.getCustomerWallet(resultDiscountList[0].customer_id);
|
|
370
375
|
}
|
|
376
|
+
} else {
|
|
377
|
+
const scannedIds = new Set(withScanList.map(discount => String(discount.id)));
|
|
378
|
+
const retainedScannedDiscounts = (evaluatedDiscountList || withScanList).filter(discount => scannedIds.has(String(discount.id)) && !(0, _availability.getDiscountLifecycleReason)(discount));
|
|
379
|
+
if (retainedScannedDiscounts.length) {
|
|
380
|
+
const retainedDiscounts = new Map(this.getDiscountList().map(discount => [String(discount.id), discount]));
|
|
381
|
+
retainedScannedDiscounts.forEach(discount => {
|
|
382
|
+
retainedDiscounts.set(String(discount.id), {
|
|
383
|
+
...discount,
|
|
384
|
+
isScan: true,
|
|
385
|
+
isAvailable: false,
|
|
386
|
+
isSelected: false,
|
|
387
|
+
reasonCode: discount.reasonCode || 'product_not_applicable',
|
|
388
|
+
appliedProductDetails: [],
|
|
389
|
+
savedAmount: 0
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
this.setDiscountList([...retainedDiscounts.values()]);
|
|
393
|
+
this.store.originalDiscountList = this.getDiscountList();
|
|
394
|
+
await this.store.discount?.setOriginalDiscountList(this.getDiscountList());
|
|
395
|
+
isAccepted = true;
|
|
396
|
+
}
|
|
371
397
|
}
|
|
372
398
|
return {
|
|
373
399
|
type: "clientCalc",
|
|
374
400
|
isAvailable: isAvailable || false,
|
|
401
|
+
isAccepted: Boolean(isAccepted),
|
|
375
402
|
productList: newProductList || this.store.productList || [],
|
|
376
|
-
discountList:
|
|
403
|
+
discountList: this.getDiscountList(),
|
|
377
404
|
unavailableReason
|
|
378
405
|
};
|
|
379
406
|
} catch (error) {
|
|
@@ -416,7 +443,7 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
416
443
|
if (item.booking_id) {
|
|
417
444
|
const product = this.hooks?.getProduct(item);
|
|
418
445
|
(item.discount_list || []).forEach(discount => {
|
|
419
|
-
if (discount.id && ['good_pass', 'discount_card'].includes(discount.type)) {
|
|
446
|
+
if (discount.id && ['entitlement_pass', 'good_pass', 'discount_card'].includes(discount.type)) {
|
|
420
447
|
const index = editModeDiscountList.findIndex(n => n.id === (discount.discount?.resource_id || discount.id));
|
|
421
448
|
if (index !== -1) {
|
|
422
449
|
editModeDiscountList[index] = {
|
|
@@ -522,6 +549,8 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
522
549
|
with_good_pass: 1,
|
|
523
550
|
with_discount_card: 1,
|
|
524
551
|
with_wallet_pass_holder: 1,
|
|
552
|
+
with_entitlement_pass: 1,
|
|
553
|
+
filter_order_wallet_pass_usage: 0,
|
|
525
554
|
request_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
526
555
|
...(orderId ? {
|
|
527
556
|
order_id: orderId
|
|
@@ -530,17 +559,34 @@ class ShopDiscountImpl extends _BaseModule.BaseModule {
|
|
|
530
559
|
const goodPassList = prepareConfigResult?.discountList || [];
|
|
531
560
|
const scanDiscount = this.getDiscountList()?.filter(item => item.isScan);
|
|
532
561
|
|
|
533
|
-
//
|
|
534
|
-
|
|
535
|
-
const
|
|
536
|
-
const
|
|
562
|
+
// 扫码 Entitlement Pass 与客户列表重复时保留扫码选择状态,但刷新实时余额。
|
|
563
|
+
// 其他券继续沿用原来的“保留扫码结果、剔除列表重复项”行为。
|
|
564
|
+
const scanDiscountById = new Map(scanDiscount.map(discount => [String(discount.id), discount]));
|
|
565
|
+
const refreshedScanEntitlementIds = new Set();
|
|
566
|
+
const newGoodPassList = goodPassList.flatMap(discount => {
|
|
567
|
+
const key = String(discount.id);
|
|
568
|
+
const scannedDiscount = scanDiscountById.get(key);
|
|
569
|
+
if (!scannedDiscount) return [discount];
|
|
570
|
+
if ((0, _entitlementPass.isEntitlementPass)(scannedDiscount) && (0, _entitlementPass.isEntitlementPass)(discount)) {
|
|
571
|
+
refreshedScanEntitlementIds.add(key);
|
|
572
|
+
return [{
|
|
573
|
+
...discount,
|
|
574
|
+
isScan: true,
|
|
575
|
+
isSelected: scannedDiscount.isSelected ?? discount.isSelected,
|
|
576
|
+
isManualSelect: scannedDiscount.isManualSelect ?? discount.isManualSelect
|
|
577
|
+
}];
|
|
578
|
+
}
|
|
579
|
+
return [];
|
|
580
|
+
});
|
|
581
|
+
const retainedScanDiscounts = scanDiscount.filter(discount => !refreshedScanEntitlementIds.has(String(discount.id)));
|
|
582
|
+
const newDiscountList = [...retainedScanDiscounts, ...newGoodPassList];
|
|
537
583
|
|
|
538
584
|
// 存储原始优惠券列表
|
|
539
585
|
this.store.originalDiscountList = newDiscountList;
|
|
540
586
|
await this.store.discount?.setOriginalDiscountList(newDiscountList);
|
|
541
587
|
|
|
542
|
-
//
|
|
543
|
-
const filteredDiscountList =
|
|
588
|
+
// 日程限制交给 Rules 计算可用状态,展示列表保留当前不可用的卡券。
|
|
589
|
+
const filteredDiscountList = newDiscountList;
|
|
544
590
|
this.store.filteredDiscountList = filteredDiscountList;
|
|
545
591
|
this.setDiscountList(filteredDiscountList || []);
|
|
546
592
|
if (this.store.productList?.length) {
|
|
@@ -59,12 +59,14 @@ export interface ScheduleItem {
|
|
|
59
59
|
}
|
|
60
60
|
export declare const getDateIsInSchedule: (dateTime: string, scheduleList: ScheduleItem[]) => boolean;
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* 根据商品使用时间过滤优惠券列表(预约开始时间或普通商品的当前时间)
|
|
63
63
|
* @param discountList 优惠券列表
|
|
64
|
-
* @param bookingTime
|
|
64
|
+
* @param bookingTime 使用时间 (格式: YYYY-MM-DD HH:mm:ss),未确定时不提前过滤
|
|
65
65
|
* @returns 过滤后的优惠券列表
|
|
66
66
|
*/
|
|
67
67
|
export declare const filterDiscountListByBookingTime: (discountList: Discount[], bookingTime: string | null) => Discount[];
|
|
68
|
+
/** 与抵扣计算共用时间判断,区分未开始、有效期不匹配和日程限制。 */
|
|
69
|
+
export declare const getDiscountTimeUnavailableReason: (discount: Discount, useTime: string) => 'not_started' | 'time_limit' | 'outside_schedule' | undefined;
|
|
68
70
|
/**
|
|
69
71
|
* 判断是否是订单级别的固定金额折扣卡
|
|
70
72
|
* @param discount 折扣
|
|
@@ -3,10 +3,15 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.uniqueById = exports.isOrderLevelFixedAmountDiscount = exports.isNormalProductByDurationSchedule = exports.isAllNormalProduct = exports.getDiscountListAmountTotal = exports.getDiscountListAmount = exports.getDiscountAmount = exports.getDateIsInSchedule = exports.filterDiscountListByBookingTime = exports.calculateOrderLevelDiscountAllocation = void 0;
|
|
6
|
+
exports.uniqueById = exports.isOrderLevelFixedAmountDiscount = exports.isNormalProductByDurationSchedule = exports.isAllNormalProduct = exports.getDiscountTimeUnavailableReason = exports.getDiscountListAmountTotal = exports.getDiscountListAmount = exports.getDiscountAmount = exports.getDateIsInSchedule = exports.filterDiscountListByBookingTime = exports.calculateOrderLevelDiscountAllocation = void 0;
|
|
7
7
|
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
8
8
|
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
9
|
+
var _isSameOrAfter = _interopRequireDefault(require("dayjs/plugin/isSameOrAfter"));
|
|
10
|
+
var _isSameOrBefore = _interopRequireDefault(require("dayjs/plugin/isSameOrBefore"));
|
|
11
|
+
var _entitlementPass = require("../../modules/Discount/entitlementPass");
|
|
9
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
_dayjs.default.extend(_isSameOrAfter.default);
|
|
14
|
+
_dayjs.default.extend(_isSameOrBefore.default);
|
|
10
15
|
const uniqueById = (arr, key = 'id') => {
|
|
11
16
|
const seen = new Set();
|
|
12
17
|
return arr.filter(item => !seen.has(item[key]) && seen.add(item[key]));
|
|
@@ -35,8 +40,8 @@ const isAllNormalProduct = items => {
|
|
|
35
40
|
*/
|
|
36
41
|
exports.isAllNormalProduct = isAllNormalProduct;
|
|
37
42
|
const getDiscountAmount = (discount, total, price) => {
|
|
38
|
-
//
|
|
39
|
-
if (
|
|
43
|
+
// 商品券和 Entitlement Pass 都是全额抵扣。
|
|
44
|
+
if ((0, _entitlementPass.isFullCoveragePass)(discount)) {
|
|
40
45
|
return new _decimal.default(price).minus(new _decimal.default(price || 0)).toNumber();
|
|
41
46
|
}
|
|
42
47
|
|
|
@@ -376,41 +381,53 @@ const isInWeeklyRepeatForDate = (targetDate, startDate, repeatRule) => {
|
|
|
376
381
|
};
|
|
377
382
|
|
|
378
383
|
/**
|
|
379
|
-
*
|
|
384
|
+
* 根据商品使用时间过滤优惠券列表(预约开始时间或普通商品的当前时间)
|
|
380
385
|
* @param discountList 优惠券列表
|
|
381
|
-
* @param bookingTime
|
|
386
|
+
* @param bookingTime 使用时间 (格式: YYYY-MM-DD HH:mm:ss),未确定时不提前过滤
|
|
382
387
|
* @returns 过滤后的优惠券列表
|
|
383
388
|
*/
|
|
384
389
|
const filterDiscountListByBookingTime = (discountList, bookingTime) => {
|
|
385
|
-
if (!bookingTime)
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
390
|
+
if (!bookingTime) return discountList;
|
|
391
|
+
return discountList.filter(discount => !getDiscountTimeUnavailableReason(discount, bookingTime));
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
/** 与抵扣计算共用时间判断,区分未开始、有效期不匹配和日程限制。 */
|
|
395
|
+
exports.filterDiscountListByBookingTime = filterDiscountListByBookingTime;
|
|
396
|
+
const getDiscountTimeUnavailableReason = (discount, useTime) => {
|
|
397
|
+
const useTimeDayjs = (0, _dayjs.default)(useTime);
|
|
398
|
+
if (!useTimeDayjs.isValid()) return 'time_limit';
|
|
399
|
+
try {
|
|
389
400
|
if (discount?.metadata?.validity_type === "custom_schedule_validity") {
|
|
390
|
-
return getDateIsInSchedule(
|
|
401
|
+
return getDateIsInSchedule(useTime, discount.custom_schedule_snapshot?.data || []) ? undefined : 'outside_schedule';
|
|
391
402
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
// 判断预约时间是否在过期时间之前(expire_time 为空时为长期有效)
|
|
401
|
-
const isBeforeExpire = discount.expire_time ? bookingTimeDayjs.isSameOrBefore((0, _dayjs.default)(discount.expire_time)) : true;
|
|
402
|
-
return isAfterStart && isBeforeExpire;
|
|
403
|
-
} catch (error) {
|
|
404
|
-
return true;
|
|
403
|
+
const isHasStart = !!discount.start_date && !!discount.start_time;
|
|
404
|
+
const startDate = (0, _dayjs.default)(`${discount.start_date} ${discount.start_time}`);
|
|
405
|
+
|
|
406
|
+
// 开始时刻包含在有效期内。
|
|
407
|
+
if (isHasStart) {
|
|
408
|
+
if (!startDate.isValid()) return 'time_limit';
|
|
409
|
+
if (useTimeDayjs.isBefore(startDate)) return 'not_started';
|
|
405
410
|
}
|
|
406
|
-
|
|
411
|
+
|
|
412
|
+
// 到期时刻不再可用;expire_time 为空时为长期有效。
|
|
413
|
+
const expireTime = discount.expire_time ? (0, _dayjs.default)(discount.expire_time) : null;
|
|
414
|
+
const isBeforeExpire = expireTime ? expireTime.isValid() && useTimeDayjs.isBefore(expireTime) : true;
|
|
415
|
+
if (!isBeforeExpire) return 'time_limit';
|
|
416
|
+
const validity = discount.extension_data?.find(field => field.field_key === 'valid_times')?.value;
|
|
417
|
+
if (validity?.restrict_use_by_schedule === true && !getDateIsInSchedule(useTime, discount.custom_schedule_snapshot?.data || [])) {
|
|
418
|
+
return 'outside_schedule';
|
|
419
|
+
}
|
|
420
|
+
return undefined;
|
|
421
|
+
} catch (error) {
|
|
422
|
+
return 'time_limit';
|
|
423
|
+
}
|
|
407
424
|
};
|
|
408
425
|
/**
|
|
409
426
|
* 判断是否是订单级别的固定金额折扣卡
|
|
410
427
|
* @param discount 折扣
|
|
411
428
|
* @returns 是否是订单级别的固定金额折扣卡
|
|
412
429
|
*/
|
|
413
|
-
exports.
|
|
430
|
+
exports.getDiscountTimeUnavailableReason = getDiscountTimeUnavailableReason;
|
|
414
431
|
const isOrderLevelFixedAmountDiscount = discount => {
|
|
415
432
|
return discount.tag === 'product_discount_card' && discount?.metadata?.discount_card_type === 'fixed_amount' && discount?.metadata?.discount_calculation_mode === 'order_level';
|
|
416
433
|
};
|
|
@@ -127,8 +127,8 @@ export declare class UnifiedBookingSalesImpl extends BookingTicket {
|
|
|
127
127
|
*/
|
|
128
128
|
clearSessionStorageOrderSnapshot(): void;
|
|
129
129
|
/**
|
|
130
|
-
* H5/Kiosk
|
|
131
|
-
*
|
|
130
|
+
* PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
|
|
131
|
+
* 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
|
|
132
132
|
*/
|
|
133
133
|
protected shouldUseCheckoutSyncTask(): boolean;
|
|
134
134
|
/** UnifiedBookingSales 的真实结账默认请求收据数据,供云端确认后再本地打印。 */
|
|
@@ -159,7 +159,7 @@ function buildPlannerDiscountResult(params) {
|
|
|
159
159
|
const productDiscounts = [...(Array.isArray(product.discount_list) ? product.discount_list : []), ...(Array.isArray(product.product_bundle) ? product.product_bundle.flatMap(bundle => bundle?.discount_list || []) : [])];
|
|
160
160
|
productDiscounts.forEach(discount => {
|
|
161
161
|
const type = discount.tag || discount.type;
|
|
162
|
-
if (!['good_pass', 'discount_card', 'product_discount_card'].includes(type)) return;
|
|
162
|
+
if (!['entitlement_pass', 'good_pass', 'discount_card', 'product_discount_card'].includes(type)) return;
|
|
163
163
|
const discountId = resolvePlannerDiscountId(discount);
|
|
164
164
|
applications.push({
|
|
165
165
|
discountId,
|
|
@@ -201,7 +201,7 @@ function isLocalOrderId(orderId) {
|
|
|
201
201
|
}
|
|
202
202
|
function isCustomerBoundDiscount(discount) {
|
|
203
203
|
const type = discount?.type ?? discount?.tag;
|
|
204
|
-
return type === 'good_pass' || type === 'discount_card' || type === 'product_discount_card';
|
|
204
|
+
return type === 'entitlement_pass' || type === 'good_pass' || type === 'discount_card' || type === 'product_discount_card';
|
|
205
205
|
}
|
|
206
206
|
function filterCustomerBoundDiscounts(discountList) {
|
|
207
207
|
if (!Array.isArray(discountList)) return [];
|
|
@@ -1580,14 +1580,14 @@ class UnifiedBookingSalesImpl extends _BookingTicket.BookingTicket {
|
|
|
1580
1580
|
}
|
|
1581
1581
|
|
|
1582
1582
|
/**
|
|
1583
|
-
* H5/Kiosk
|
|
1584
|
-
*
|
|
1583
|
+
* PC/H5/Kiosk 结账默认直接等待云端 checkout;POS/WebPOS 仍保持本地待同步。
|
|
1584
|
+
* 显式传 checkoutSyncTaskEnabled: true 时仍可回退到本地同步模式。
|
|
1585
1585
|
*/
|
|
1586
1586
|
shouldUseCheckoutSyncTask() {
|
|
1587
1587
|
const configured = this.otherParams?.checkoutSyncTaskEnabled;
|
|
1588
1588
|
if (configured === true) return true;
|
|
1589
1589
|
const platform = (0, _platform.normalizeRuntimePlatform)(this.otherParams?.platform);
|
|
1590
|
-
return platform
|
|
1590
|
+
return !(0, _platform.isCustomerUserPlatform)(platform) && platform !== 'kiosk';
|
|
1591
1591
|
}
|
|
1592
1592
|
|
|
1593
1593
|
/** UnifiedBookingSales 的真实结账默认请求收据数据,供云端确认后再本地打印。 */
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.stripOsPrivatePayloadFields = stripOsPrivatePayloadFields;
|
|
7
|
+
var _lodashEs = require("lodash-es");
|
|
8
|
+
const OS_PRIVATE_FIELD_PREFIX = '_os_';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Remove top-level fields reserved for communication with the PisellOS proxy.
|
|
12
|
+
* Nested business payloads are intentionally left untouched.
|
|
13
|
+
*/
|
|
14
|
+
function stripOsPrivatePayloadFields(data) {
|
|
15
|
+
const next = (0, _lodashEs.cloneDeep)(data);
|
|
16
|
+
if (!next || typeof next !== 'object' || Array.isArray(next)) return next;
|
|
17
|
+
const record = next;
|
|
18
|
+
Object.keys(record).forEach(key => {
|
|
19
|
+
if (key.startsWith(OS_PRIVATE_FIELD_PREFIX)) delete record[key];
|
|
20
|
+
});
|
|
21
|
+
return next;
|
|
22
|
+
}
|