@pisell/pisellos 2.1.60 → 2.1.61
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/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/modules/Cart/types.d.ts +0 -2
- package/dist/modules/Cart/utils/cartProduct.js +0 -11
- package/dist/modules/Customer/index.js +1 -1
- package/dist/modules/Discount/types.d.ts +0 -15
- package/dist/modules/Payment/index.d.ts +1 -2
- package/dist/modules/Payment/index.js +7 -10
- package/dist/modules/Payment/utils.js +0 -3
- package/dist/modules/Payment/walletpass.d.ts +0 -23
- package/dist/modules/Payment/walletpass.js +95 -191
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Rules/index.d.ts +3 -8
- package/dist/modules/Rules/index.js +28 -158
- package/dist/modules/Rules/types.d.ts +0 -1
- package/dist/modules/Summary/types.d.ts +0 -2
- package/dist/modules/Summary/utils.d.ts +0 -6
- package/dist/modules/Summary/utils.js +0 -21
- package/dist/plugins/window.d.ts +0 -2
- package/dist/solution/BookingByStep/index.d.ts +0 -1
- package/dist/solution/BookingTicket/index.d.ts +1 -1
- package/dist/solution/Checkout/index.js +0 -2
- package/dist/solution/ShopDiscount/index.d.ts +0 -1
- package/dist/solution/ShopDiscount/index.js +1 -11
- package/dist/solution/ShopDiscount/types.d.ts +0 -1
- package/dist/solution/ShopDiscount/utils.js +11 -26
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -3
- package/lib/modules/Cart/types.d.ts +0 -2
- package/lib/modules/Cart/utils/cartProduct.js +0 -9
- package/lib/modules/Customer/index.js +1 -1
- package/lib/modules/Discount/types.d.ts +0 -15
- package/lib/modules/Payment/index.d.ts +1 -2
- package/lib/modules/Payment/index.js +0 -1
- package/lib/modules/Payment/utils.js +0 -3
- package/lib/modules/Payment/walletpass.d.ts +0 -23
- package/lib/modules/Payment/walletpass.js +17 -94
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Rules/index.d.ts +3 -8
- package/lib/modules/Rules/index.js +191 -373
- package/lib/modules/Rules/types.d.ts +0 -1
- package/lib/modules/Summary/types.d.ts +0 -2
- package/lib/modules/Summary/utils.d.ts +0 -6
- package/lib/modules/Summary/utils.js +0 -15
- package/lib/plugins/window.d.ts +0 -2
- package/lib/solution/BookingByStep/index.d.ts +0 -1
- package/lib/solution/BookingTicket/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.js +6 -0
- package/lib/solution/Checkout/index.js +0 -2
- package/lib/solution/ShopDiscount/index.d.ts +0 -1
- package/lib/solution/ShopDiscount/index.js +0 -6
- package/lib/solution/ShopDiscount/types.d.ts +0 -1
- package/lib/solution/ShopDiscount/utils.js +6 -10
- package/package.json +1 -1
- package/dist/model/index.d.ts +0 -1
- package/dist/model/index.js +0 -1
- package/dist/model/strategy/adapter/index.d.ts +0 -3
- package/dist/model/strategy/adapter/index.js +0 -4
- package/dist/model/strategy/adapter/type.d.ts +0 -28
- package/dist/model/strategy/adapter/type.js +0 -1
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +0 -84
- package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -496
- package/dist/model/strategy/adapter/walletPass/example.d.ts +0 -4
- package/dist/model/strategy/adapter/walletPass/example.js +0 -258
- package/dist/model/strategy/adapter/walletPass/index.d.ts +0 -32
- package/dist/model/strategy/adapter/walletPass/index.js +0 -182
- package/dist/model/strategy/adapter/walletPass/locales.d.ts +0 -1
- package/dist/model/strategy/adapter/walletPass/locales.js +0 -23
- package/dist/model/strategy/adapter/walletPass/type.d.ts +0 -163
- package/dist/model/strategy/adapter/walletPass/type.js +0 -1
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +0 -50
- package/dist/model/strategy/adapter/walletPass/utils.js +0 -965
- package/dist/model/strategy/index.d.ts +0 -94
- package/dist/model/strategy/index.js +0 -551
- package/dist/model/strategy/strategy-example.d.ts +0 -5
- package/dist/model/strategy/strategy-example.js +0 -331
- package/dist/model/strategy/type.d.ts +0 -228
- package/dist/model/strategy/type.js +0 -94
- package/lib/model/index.d.ts +0 -1
- package/lib/model/index.js +0 -23
- package/lib/model/strategy/adapter/index.d.ts +0 -3
- package/lib/model/strategy/adapter/index.js +0 -45
- package/lib/model/strategy/adapter/type.d.ts +0 -28
- package/lib/model/strategy/adapter/type.js +0 -17
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +0 -84
- package/lib/model/strategy/adapter/walletPass/evaluator.js +0 -420
- package/lib/model/strategy/adapter/walletPass/example.d.ts +0 -4
- package/lib/model/strategy/adapter/walletPass/example.js +0 -207
- package/lib/model/strategy/adapter/walletPass/index.d.ts +0 -32
- package/lib/model/strategy/adapter/walletPass/index.js +0 -142
- package/lib/model/strategy/adapter/walletPass/locales.d.ts +0 -1
- package/lib/model/strategy/adapter/walletPass/locales.js +0 -51
- package/lib/model/strategy/adapter/walletPass/type.d.ts +0 -163
- package/lib/model/strategy/adapter/walletPass/type.js +0 -17
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +0 -50
- package/lib/model/strategy/adapter/walletPass/utils.js +0 -660
- package/lib/model/strategy/index.d.ts +0 -94
- package/lib/model/strategy/index.js +0 -413
- package/lib/model/strategy/strategy-example.d.ts +0 -5
- package/lib/model/strategy/strategy-example.js +0 -318
- package/lib/model/strategy/type.d.ts +0 -228
- package/lib/model/strategy/type.js +0 -44
|
@@ -1,660 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
-
|
|
29
|
-
// src/model/strategy/adapter/walletPass/utils.ts
|
|
30
|
-
var utils_exports = {};
|
|
31
|
-
__export(utils_exports, {
|
|
32
|
-
getApplicableProductIds: () => getApplicableProductIds,
|
|
33
|
-
getBundleItemIsDiscountPrice: () => getBundleItemIsDiscountPrice,
|
|
34
|
-
getBundleItemIsMarkupOrDiscountPrice: () => getBundleItemIsMarkupOrDiscountPrice,
|
|
35
|
-
getBundleItemIsMarkupPrice: () => getBundleItemIsMarkupPrice,
|
|
36
|
-
getBundleItemIsOriginalPrice: () => getBundleItemIsOriginalPrice,
|
|
37
|
-
getBundleItemPrice: () => getBundleItemPrice,
|
|
38
|
-
getMainProductPrice: () => getMainProductPrice,
|
|
39
|
-
getProductQuantity: () => getProductQuantity,
|
|
40
|
-
processVouchers: () => processVouchers,
|
|
41
|
-
recalculateVouchers: () => recalculateVouchers
|
|
42
|
-
});
|
|
43
|
-
module.exports = __toCommonJS(utils_exports);
|
|
44
|
-
var import_decimal = __toESM(require("decimal.js"));
|
|
45
|
-
var getRecommendedAmount = (voucher) => {
|
|
46
|
-
console.log("voucher312", voucher);
|
|
47
|
-
const { config, recommended_usage_amount, recommended_pure_product_usage_amount } = voucher;
|
|
48
|
-
const deductTaxAndFee = (config == null ? void 0 : config.deductTaxAndFee) ?? true;
|
|
49
|
-
return deductTaxAndFee ? recommended_usage_amount : recommended_pure_product_usage_amount ?? recommended_usage_amount;
|
|
50
|
-
};
|
|
51
|
-
var getApplicableProductIds = (voucher) => {
|
|
52
|
-
const { available_product_type, available_product_ids } = voucher;
|
|
53
|
-
const productType = available_product_type || "product_all";
|
|
54
|
-
if (productType === "product_all") {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
if (productType === "product_collection" || productType === "products") {
|
|
58
|
-
return available_product_ids || [];
|
|
59
|
-
}
|
|
60
|
-
return [];
|
|
61
|
-
};
|
|
62
|
-
var getApplicableProductsAmount = (voucher, productsData) => {
|
|
63
|
-
const applicableProductIds = getApplicableProductIds(voucher);
|
|
64
|
-
const { config } = voucher;
|
|
65
|
-
const deductTaxAndFee = (config == null ? void 0 : config.deductTaxAndFee) ?? true;
|
|
66
|
-
const amountField = deductTaxAndFee ? "remainingAmountWithTax" : "remainingAmountPure";
|
|
67
|
-
if (applicableProductIds === null) {
|
|
68
|
-
return productsData.filter((p) => p[amountField].greaterThan(0)).reduce((sum, p) => sum.plus(p[amountField]), new import_decimal.default(0));
|
|
69
|
-
}
|
|
70
|
-
if (applicableProductIds.length === 0) {
|
|
71
|
-
return new import_decimal.default(0);
|
|
72
|
-
}
|
|
73
|
-
return productsData.filter((p) => applicableProductIds.includes(p.product_id) && p[amountField].greaterThan(0)).reduce((sum, p) => sum.plus(p[amountField]), new import_decimal.default(0));
|
|
74
|
-
};
|
|
75
|
-
var getApplicableProducts = (voucher, productsData) => {
|
|
76
|
-
const applicableProductIds = getApplicableProductIds(voucher);
|
|
77
|
-
if (applicableProductIds === null) {
|
|
78
|
-
return productsData;
|
|
79
|
-
}
|
|
80
|
-
if (applicableProductIds.length === 0) {
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
return productsData.filter((p) => applicableProductIds.includes(p.product_id));
|
|
84
|
-
};
|
|
85
|
-
function processVouchers(applicableVouchers, orderTotalAmount, products) {
|
|
86
|
-
console.log(products, "products123");
|
|
87
|
-
const productsCopy = expandProductsWithBundleItems(products, true);
|
|
88
|
-
let remainingOrderAmount = new import_decimal.default(orderTotalAmount);
|
|
89
|
-
const calculateAvailableMaxAmount = (voucher, productsData) => {
|
|
90
|
-
const { config } = voucher;
|
|
91
|
-
const { maxDeductionAmount = 0, allowCrossProduct = true, applicableProductLimit = 0, deductTaxAndFee = true } = config ?? {};
|
|
92
|
-
const recommendedAmount = getRecommendedAmount(voucher);
|
|
93
|
-
const baseAmount = import_decimal.default.min(
|
|
94
|
-
new import_decimal.default(recommendedAmount),
|
|
95
|
-
new import_decimal.default(maxDeductionAmount)
|
|
96
|
-
);
|
|
97
|
-
const unitPriceField = deductTaxAndFee ? "unitPriceWithTax" : "unitPricePure";
|
|
98
|
-
const amountField = deductTaxAndFee ? "remainingAmountWithTax" : "remainingAmountPure";
|
|
99
|
-
const applicableProducts = getApplicableProducts(voucher, productsData).filter((p) => p[amountField].greaterThan(0));
|
|
100
|
-
if (applicableProducts.length === 0) {
|
|
101
|
-
return new import_decimal.default(0);
|
|
102
|
-
}
|
|
103
|
-
let finalApplicableAmount = new import_decimal.default(0);
|
|
104
|
-
if (allowCrossProduct) {
|
|
105
|
-
if (applicableProductLimit > 0) {
|
|
106
|
-
const sortedProducts = [...applicableProducts].sort((a, b) => a[amountField].comparedTo(b[amountField]) > 0 ? -1 : 1);
|
|
107
|
-
let remainingLimit = applicableProductLimit;
|
|
108
|
-
for (const product of sortedProducts) {
|
|
109
|
-
if (remainingLimit <= 0)
|
|
110
|
-
break;
|
|
111
|
-
const currentAvailableQty = Math.ceil(product[amountField].dividedBy(product[unitPriceField]).toNumber());
|
|
112
|
-
const deductQty = Math.min(currentAvailableQty, remainingLimit);
|
|
113
|
-
const deductAmount = import_decimal.default.min(
|
|
114
|
-
product[unitPriceField].times(deductQty),
|
|
115
|
-
product[amountField]
|
|
116
|
-
);
|
|
117
|
-
finalApplicableAmount = finalApplicableAmount.plus(deductAmount);
|
|
118
|
-
remainingLimit -= deductQty;
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
finalApplicableAmount = applicableProducts.reduce(
|
|
122
|
-
(sum, p) => sum.plus(p[amountField]),
|
|
123
|
-
new import_decimal.default(0)
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
} else {
|
|
127
|
-
const maxProduct = applicableProducts.reduce(
|
|
128
|
-
(max, p) => p[amountField].greaterThan(max[amountField]) ? p : max
|
|
129
|
-
);
|
|
130
|
-
const currentAvailableQty = Math.ceil(maxProduct[amountField].dividedBy(maxProduct[unitPriceField]).toNumber());
|
|
131
|
-
const deductQty = applicableProductLimit > 0 ? Math.min(currentAvailableQty, applicableProductLimit) : currentAvailableQty;
|
|
132
|
-
finalApplicableAmount = import_decimal.default.min(
|
|
133
|
-
maxProduct[unitPriceField].times(deductQty),
|
|
134
|
-
maxProduct[amountField]
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
return import_decimal.default.min(baseAmount, finalApplicableAmount, remainingOrderAmount);
|
|
138
|
-
};
|
|
139
|
-
const isVoucherAvailable = (voucher, productsData, usedVoucherCounts2) => {
|
|
140
|
-
const { config, id, product_id } = voucher;
|
|
141
|
-
const recommendedAmount = getRecommendedAmount(voucher);
|
|
142
|
-
if (recommendedAmount <= 0) {
|
|
143
|
-
return { isAvailable: false, reasonCode: "not_meet_the_required_conditions" };
|
|
144
|
-
}
|
|
145
|
-
if (remainingOrderAmount.lessThanOrEqualTo(0)) {
|
|
146
|
-
return { isAvailable: false, reasonCode: "exceeds_the_maximum_deduction_limit" };
|
|
147
|
-
}
|
|
148
|
-
const applicableAmount = getApplicableProductsAmount(voucher, productsData);
|
|
149
|
-
if (applicableAmount.lessThanOrEqualTo(0)) {
|
|
150
|
-
return { isAvailable: false, reasonCode: "not_meet_the_required_conditions" };
|
|
151
|
-
}
|
|
152
|
-
if (((config == null ? void 0 : config.maxUsagePerOrder) || 0) > 0) {
|
|
153
|
-
const usedCount = usedVoucherCounts2.get(product_id) || 0;
|
|
154
|
-
if (usedCount >= ((config == null ? void 0 : config.maxUsagePerOrder) || 0)) {
|
|
155
|
-
return { isAvailable: false, reasonCode: "usage_limit_reached" };
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return { isAvailable: true };
|
|
159
|
-
};
|
|
160
|
-
const usedVoucherCountsForAll = /* @__PURE__ */ new Map();
|
|
161
|
-
const allVouchersWithStatus = applicableVouchers.map((voucher) => {
|
|
162
|
-
const _available_max_amount = calculateAvailableMaxAmount(
|
|
163
|
-
voucher,
|
|
164
|
-
productsCopy
|
|
165
|
-
);
|
|
166
|
-
const availabilityResult = isVoucherAvailable(
|
|
167
|
-
voucher,
|
|
168
|
-
productsCopy,
|
|
169
|
-
usedVoucherCountsForAll
|
|
170
|
-
);
|
|
171
|
-
const _unified_available_status = availabilityResult.isAvailable ? 1 : 0;
|
|
172
|
-
return {
|
|
173
|
-
...voucher,
|
|
174
|
-
_available_max_amount: _available_max_amount.toNumber(),
|
|
175
|
-
// 转换为数字
|
|
176
|
-
_unified_available_status,
|
|
177
|
-
...availabilityResult.reasonCode && { reasonCode: availabilityResult.reasonCode }
|
|
178
|
-
};
|
|
179
|
-
});
|
|
180
|
-
const recommendedVouchers = [];
|
|
181
|
-
const usedVoucherCounts = /* @__PURE__ */ new Map();
|
|
182
|
-
const productsForRecommendation = expandProductsWithBundleItems(products, true);
|
|
183
|
-
remainingOrderAmount = new import_decimal.default(orderTotalAmount);
|
|
184
|
-
const applyVoucher = (voucher) => {
|
|
185
|
-
const availabilityCheck = isVoucherAvailable(
|
|
186
|
-
voucher,
|
|
187
|
-
productsForRecommendation,
|
|
188
|
-
usedVoucherCounts
|
|
189
|
-
);
|
|
190
|
-
if (!availabilityCheck.isAvailable) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
const { config, id, product_id } = voucher;
|
|
194
|
-
const { maxDeductionAmount = 0, allowCrossProduct = true, applicableProductLimit = 0, deductTaxAndFee = true } = config ?? {};
|
|
195
|
-
const unitPriceField = deductTaxAndFee ? "unitPriceWithTax" : "unitPricePure";
|
|
196
|
-
const amountField = deductTaxAndFee ? "remainingAmountWithTax" : "remainingAmountPure";
|
|
197
|
-
let applicableProducts = getApplicableProducts(
|
|
198
|
-
voucher,
|
|
199
|
-
productsForRecommendation
|
|
200
|
-
).filter((p) => p[amountField].greaterThan(0));
|
|
201
|
-
if (applicableProducts.length === 0)
|
|
202
|
-
return false;
|
|
203
|
-
const usageAmount = typeof voucher.edit_current_amount === "number" ? voucher.edit_current_amount : getRecommendedAmount(voucher);
|
|
204
|
-
const baseAmount = import_decimal.default.min(
|
|
205
|
-
new import_decimal.default(usageAmount),
|
|
206
|
-
new import_decimal.default(maxDeductionAmount)
|
|
207
|
-
);
|
|
208
|
-
let calculatedAvailableMaxAmount = new import_decimal.default(0);
|
|
209
|
-
if (allowCrossProduct) {
|
|
210
|
-
if (applicableProductLimit > 0) {
|
|
211
|
-
const sortedProducts = [...applicableProducts].sort((a, b) => a[amountField].comparedTo(b[amountField]) > 0 ? -1 : 1);
|
|
212
|
-
let remainingLimit = applicableProductLimit;
|
|
213
|
-
for (const product of sortedProducts) {
|
|
214
|
-
if (remainingLimit <= 0)
|
|
215
|
-
break;
|
|
216
|
-
const currentAvailableQty = Math.ceil(product[amountField].dividedBy(product[unitPriceField]).toNumber());
|
|
217
|
-
const deductQty = Math.min(currentAvailableQty, remainingLimit);
|
|
218
|
-
const deductAmount = import_decimal.default.min(
|
|
219
|
-
product[unitPriceField].times(deductQty),
|
|
220
|
-
product[amountField]
|
|
221
|
-
);
|
|
222
|
-
calculatedAvailableMaxAmount = calculatedAvailableMaxAmount.plus(deductAmount);
|
|
223
|
-
remainingLimit -= deductQty;
|
|
224
|
-
}
|
|
225
|
-
} else {
|
|
226
|
-
calculatedAvailableMaxAmount = applicableProducts.reduce(
|
|
227
|
-
(sum, p) => sum.plus(p[amountField]),
|
|
228
|
-
new import_decimal.default(0)
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
} else {
|
|
232
|
-
const maxProduct = applicableProducts.reduce(
|
|
233
|
-
(max, p) => p[amountField].greaterThan(max[amountField]) ? p : max
|
|
234
|
-
);
|
|
235
|
-
const currentAvailableQty = Math.ceil(maxProduct[amountField].dividedBy(maxProduct[unitPriceField]).toNumber());
|
|
236
|
-
const deductQty = applicableProductLimit > 0 ? Math.min(currentAvailableQty, applicableProductLimit) : currentAvailableQty;
|
|
237
|
-
calculatedAvailableMaxAmount = import_decimal.default.min(
|
|
238
|
-
maxProduct[unitPriceField].times(deductQty),
|
|
239
|
-
maxProduct[amountField]
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
const availableMaxAmount = import_decimal.default.min(
|
|
243
|
-
baseAmount,
|
|
244
|
-
calculatedAvailableMaxAmount,
|
|
245
|
-
remainingOrderAmount
|
|
246
|
-
);
|
|
247
|
-
const maxDeduction = import_decimal.default.min(
|
|
248
|
-
new import_decimal.default(usageAmount),
|
|
249
|
-
new import_decimal.default(maxDeductionAmount)
|
|
250
|
-
);
|
|
251
|
-
let deductionLeft = maxDeduction;
|
|
252
|
-
const deductionDetails = [];
|
|
253
|
-
if (allowCrossProduct) {
|
|
254
|
-
const sortedProducts = [...applicableProducts].sort(
|
|
255
|
-
(a, b) => a[amountField].comparedTo(b[amountField]) > 0 ? -1 : 1
|
|
256
|
-
);
|
|
257
|
-
let remainingLimit = applicableProductLimit > 0 ? applicableProductLimit : Infinity;
|
|
258
|
-
for (const product of sortedProducts) {
|
|
259
|
-
if (deductionLeft.lessThanOrEqualTo(0) || remainingLimit <= 0)
|
|
260
|
-
break;
|
|
261
|
-
const currentAvailableQty = Math.ceil(product[amountField].dividedBy(product[unitPriceField]).toNumber());
|
|
262
|
-
const availableQty = Math.min(currentAvailableQty, remainingLimit);
|
|
263
|
-
const maxDeductForProduct = import_decimal.default.min(
|
|
264
|
-
product[unitPriceField].times(availableQty),
|
|
265
|
-
product[amountField]
|
|
266
|
-
);
|
|
267
|
-
const actualDeductAmount = import_decimal.default.min(deductionLeft, maxDeductForProduct);
|
|
268
|
-
const actualDeductQty = Math.ceil(actualDeductAmount.dividedBy(product[unitPriceField]).toNumber());
|
|
269
|
-
product[amountField] = product[amountField].minus(actualDeductAmount);
|
|
270
|
-
deductionLeft = deductionLeft.minus(actualDeductAmount);
|
|
271
|
-
remainingLimit -= actualDeductQty;
|
|
272
|
-
deductionDetails.push({
|
|
273
|
-
product_id: product.product_id,
|
|
274
|
-
parent_product_id: product.parent_product_id || null,
|
|
275
|
-
is_bundle_item: product.is_bundle_item || false,
|
|
276
|
-
deductAmount: actualDeductAmount.toNumber(),
|
|
277
|
-
// 转换为数字
|
|
278
|
-
deductQuantity: actualDeductQty
|
|
279
|
-
// 抵扣涉及的数量(用于记录)
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
} else {
|
|
283
|
-
const targetProduct = applicableProducts.reduce(
|
|
284
|
-
(max, p) => p[amountField].greaterThan(max[amountField]) ? p : max
|
|
285
|
-
);
|
|
286
|
-
const currentAvailableQty = Math.ceil(targetProduct[amountField].dividedBy(targetProduct[unitPriceField]).toNumber());
|
|
287
|
-
const availableQty = applicableProductLimit > 0 ? Math.min(currentAvailableQty, applicableProductLimit) : currentAvailableQty;
|
|
288
|
-
const maxDeductForProduct = import_decimal.default.min(
|
|
289
|
-
targetProduct[unitPriceField].times(availableQty),
|
|
290
|
-
targetProduct[amountField]
|
|
291
|
-
);
|
|
292
|
-
const actualDeductAmount = import_decimal.default.min(deductionLeft, maxDeductForProduct);
|
|
293
|
-
const actualDeductQty = Math.ceil(actualDeductAmount.dividedBy(targetProduct[unitPriceField]).toNumber());
|
|
294
|
-
targetProduct[amountField] = targetProduct[amountField].minus(actualDeductAmount);
|
|
295
|
-
deductionLeft = deductionLeft.minus(actualDeductAmount);
|
|
296
|
-
deductionDetails.push({
|
|
297
|
-
product_id: targetProduct.product_id,
|
|
298
|
-
parent_product_id: targetProduct.parent_product_id || null,
|
|
299
|
-
is_bundle_item: targetProduct.is_bundle_item || false,
|
|
300
|
-
deductAmount: actualDeductAmount.toNumber(),
|
|
301
|
-
// 转换为数字
|
|
302
|
-
deductQuantity: actualDeductQty
|
|
303
|
-
// 抵扣涉及的数量(用于记录)
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
const totalDeducted = maxDeduction.minus(deductionLeft);
|
|
307
|
-
if (totalDeducted.greaterThan(0)) {
|
|
308
|
-
remainingOrderAmount = remainingOrderAmount.minus(totalDeducted);
|
|
309
|
-
usedVoucherCounts.set(product_id, (usedVoucherCounts.get(product_id) || 0) + 1);
|
|
310
|
-
recommendedVouchers.push({
|
|
311
|
-
...voucher,
|
|
312
|
-
actualDeduction: totalDeducted.toNumber(),
|
|
313
|
-
// 转换为数字
|
|
314
|
-
deductionDetails,
|
|
315
|
-
_available_max_amount: availableMaxAmount.toNumber(),
|
|
316
|
-
// 转换为数字
|
|
317
|
-
_unified_available_status: 1
|
|
318
|
-
});
|
|
319
|
-
return true;
|
|
320
|
-
}
|
|
321
|
-
return false;
|
|
322
|
-
};
|
|
323
|
-
applicableVouchers.forEach((voucher) => {
|
|
324
|
-
applyVoucher(voucher);
|
|
325
|
-
});
|
|
326
|
-
const recommendedMap = /* @__PURE__ */ new Map();
|
|
327
|
-
recommendedVouchers.forEach((v) => {
|
|
328
|
-
recommendedMap.set(v.id, v);
|
|
329
|
-
});
|
|
330
|
-
const allWithEnhancedData = allVouchersWithStatus.map((voucher) => {
|
|
331
|
-
if (recommendedMap.has(voucher.id)) {
|
|
332
|
-
return recommendedMap.get(voucher.id);
|
|
333
|
-
} else {
|
|
334
|
-
return {
|
|
335
|
-
...voucher,
|
|
336
|
-
actualDeduction: 0,
|
|
337
|
-
deductionDetails: []
|
|
338
|
-
// 保留 reasonCode(如果不可用的话)
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
});
|
|
342
|
-
return {
|
|
343
|
-
recommended: recommendedVouchers,
|
|
344
|
-
transformList: allWithEnhancedData
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
function recalculateVouchers(allVouchers, selectedVouchers, orderTotalAmount, products) {
|
|
348
|
-
const productsForCalc = expandProductsWithBundleItems(products, true);
|
|
349
|
-
let remainingOrderAmount = new import_decimal.default(orderTotalAmount);
|
|
350
|
-
const selectedWithDetails = [];
|
|
351
|
-
selectedVouchers.forEach((selectedVoucher) => {
|
|
352
|
-
const { config, id } = selectedVoucher;
|
|
353
|
-
const { maxDeductionAmount, allowCrossProduct, applicableProductLimit, deductTaxAndFee = true } = config;
|
|
354
|
-
const unitPriceField = deductTaxAndFee ? "unitPriceWithTax" : "unitPricePure";
|
|
355
|
-
const amountField = deductTaxAndFee ? "remainingAmountWithTax" : "remainingAmountPure";
|
|
356
|
-
let applicableProducts = getApplicableProducts(
|
|
357
|
-
selectedVoucher,
|
|
358
|
-
productsForCalc
|
|
359
|
-
).filter((p) => p[amountField].greaterThan(0));
|
|
360
|
-
if (applicableProducts.length === 0) {
|
|
361
|
-
selectedWithDetails.push({
|
|
362
|
-
...selectedVoucher,
|
|
363
|
-
actualDeduction: 0,
|
|
364
|
-
deductionDetails: [],
|
|
365
|
-
_available_max_amount: 0,
|
|
366
|
-
_unified_available_status: 0,
|
|
367
|
-
reasonCode: "not_meet_the_required_conditions"
|
|
368
|
-
});
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
const usageAmount = typeof selectedVoucher.edit_current_amount === "number" ? selectedVoucher.edit_current_amount : getRecommendedAmount(selectedVoucher);
|
|
372
|
-
const maxDeduction = import_decimal.default.min(
|
|
373
|
-
new import_decimal.default(usageAmount),
|
|
374
|
-
new import_decimal.default(maxDeductionAmount),
|
|
375
|
-
remainingOrderAmount
|
|
376
|
-
);
|
|
377
|
-
let deductionLeft = maxDeduction;
|
|
378
|
-
const deductionDetails = [];
|
|
379
|
-
if (allowCrossProduct) {
|
|
380
|
-
const sortedProducts = [...applicableProducts].sort(
|
|
381
|
-
(a, b) => a[amountField].comparedTo(b[amountField]) > 0 ? -1 : 1
|
|
382
|
-
);
|
|
383
|
-
let remainingLimit = applicableProductLimit > 0 ? applicableProductLimit : Infinity;
|
|
384
|
-
for (const product of sortedProducts) {
|
|
385
|
-
if (deductionLeft.lessThanOrEqualTo(0) || remainingLimit <= 0)
|
|
386
|
-
break;
|
|
387
|
-
const currentAvailableQty = Math.ceil(product[amountField].dividedBy(product[unitPriceField]).toNumber());
|
|
388
|
-
const availableQty = Math.min(currentAvailableQty, remainingLimit);
|
|
389
|
-
const maxDeductForProduct = import_decimal.default.min(
|
|
390
|
-
product[unitPriceField].times(availableQty),
|
|
391
|
-
product[amountField]
|
|
392
|
-
);
|
|
393
|
-
const actualDeductAmount = import_decimal.default.min(deductionLeft, maxDeductForProduct);
|
|
394
|
-
const actualDeductQty = Math.ceil(actualDeductAmount.dividedBy(product[unitPriceField]).toNumber());
|
|
395
|
-
product[amountField] = product[amountField].minus(actualDeductAmount);
|
|
396
|
-
deductionLeft = deductionLeft.minus(actualDeductAmount);
|
|
397
|
-
remainingLimit -= actualDeductQty;
|
|
398
|
-
deductionDetails.push({
|
|
399
|
-
product_id: product.product_id,
|
|
400
|
-
parent_product_id: product.parent_product_id || null,
|
|
401
|
-
is_bundle_item: product.is_bundle_item || false,
|
|
402
|
-
deductAmount: actualDeductAmount.toNumber(),
|
|
403
|
-
// 转换为数字
|
|
404
|
-
deductQuantity: actualDeductQty
|
|
405
|
-
// 抵扣涉及的数量(用于记录)
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
} else {
|
|
409
|
-
const targetProduct = applicableProducts.reduce(
|
|
410
|
-
(max, p) => p[amountField].greaterThan(max[amountField]) ? p : max
|
|
411
|
-
);
|
|
412
|
-
const currentAvailableQty = Math.ceil(targetProduct[amountField].dividedBy(targetProduct[unitPriceField]).toNumber());
|
|
413
|
-
const availableQty = applicableProductLimit > 0 ? Math.min(currentAvailableQty, applicableProductLimit) : currentAvailableQty;
|
|
414
|
-
const maxDeductForProduct = import_decimal.default.min(
|
|
415
|
-
targetProduct[unitPriceField].times(availableQty),
|
|
416
|
-
targetProduct[amountField]
|
|
417
|
-
);
|
|
418
|
-
const actualDeductAmount = import_decimal.default.min(deductionLeft, maxDeductForProduct);
|
|
419
|
-
const actualDeductQty = Math.ceil(actualDeductAmount.dividedBy(targetProduct[unitPriceField]).toNumber());
|
|
420
|
-
targetProduct[amountField] = targetProduct[amountField].minus(actualDeductAmount);
|
|
421
|
-
deductionLeft = deductionLeft.minus(actualDeductAmount);
|
|
422
|
-
deductionDetails.push({
|
|
423
|
-
product_id: targetProduct.product_id,
|
|
424
|
-
parent_product_id: targetProduct.parent_product_id || null,
|
|
425
|
-
is_bundle_item: targetProduct.is_bundle_item || false,
|
|
426
|
-
deductAmount: actualDeductAmount.toNumber(),
|
|
427
|
-
// 转换为数字
|
|
428
|
-
deductQuantity: actualDeductQty
|
|
429
|
-
// 抵扣涉及的数量(用于记录)
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
const totalDeducted = maxDeduction.minus(deductionLeft);
|
|
433
|
-
remainingOrderAmount = remainingOrderAmount.minus(totalDeducted);
|
|
434
|
-
selectedWithDetails.push({
|
|
435
|
-
...selectedVoucher,
|
|
436
|
-
actualDeduction: totalDeducted.toNumber(),
|
|
437
|
-
// 转换为数字
|
|
438
|
-
deductionDetails,
|
|
439
|
-
_available_max_amount: totalDeducted.toNumber(),
|
|
440
|
-
// 转换为数字
|
|
441
|
-
_unified_available_status: totalDeducted.greaterThan(0) ? 1 : 0
|
|
442
|
-
});
|
|
443
|
-
});
|
|
444
|
-
const selectedIds = new Set(selectedVouchers.map((v) => v.id));
|
|
445
|
-
const usedVoucherCounts = /* @__PURE__ */ new Map();
|
|
446
|
-
selectedVouchers.forEach((v) => {
|
|
447
|
-
usedVoucherCounts.set(v.product_id, (usedVoucherCounts.get(v.product_id) || 0) + 1);
|
|
448
|
-
});
|
|
449
|
-
const allWithUpdatedStatus = allVouchers.map((voucher) => {
|
|
450
|
-
if (selectedIds.has(voucher.id)) {
|
|
451
|
-
const selectedDetail = selectedWithDetails.find(
|
|
452
|
-
(v) => v.id === voucher.id
|
|
453
|
-
);
|
|
454
|
-
return selectedDetail || voucher;
|
|
455
|
-
}
|
|
456
|
-
const { config, id, product_id } = voucher;
|
|
457
|
-
const { maxDeductionAmount, allowCrossProduct, applicableProductLimit, deductTaxAndFee = true } = config;
|
|
458
|
-
const unitPriceField = deductTaxAndFee ? "unitPriceWithTax" : "unitPricePure";
|
|
459
|
-
const amountField = deductTaxAndFee ? "remainingAmountWithTax" : "remainingAmountPure";
|
|
460
|
-
const recommendedAmount = getRecommendedAmount(voucher);
|
|
461
|
-
let isAvailable = true;
|
|
462
|
-
let calculatedMaxAmount = new import_decimal.default(0);
|
|
463
|
-
let reasonCode;
|
|
464
|
-
if (recommendedAmount <= 0) {
|
|
465
|
-
isAvailable = false;
|
|
466
|
-
reasonCode = "not_meet_the_required_conditions";
|
|
467
|
-
} else if (remainingOrderAmount.lessThanOrEqualTo(0)) {
|
|
468
|
-
isAvailable = false;
|
|
469
|
-
reasonCode = "exceeds_the_maximum_deduction_limit";
|
|
470
|
-
} else {
|
|
471
|
-
if (config.maxUsagePerOrder > 0) {
|
|
472
|
-
const usedCount = usedVoucherCounts.get(product_id) || 0;
|
|
473
|
-
if (usedCount >= config.maxUsagePerOrder) {
|
|
474
|
-
isAvailable = false;
|
|
475
|
-
reasonCode = "usage_limit_reached";
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
if (isAvailable) {
|
|
479
|
-
let applicableProducts = getApplicableProducts(
|
|
480
|
-
voucher,
|
|
481
|
-
productsForCalc
|
|
482
|
-
).filter((p) => p[amountField].greaterThan(0));
|
|
483
|
-
if (applicableProducts.length === 0) {
|
|
484
|
-
isAvailable = false;
|
|
485
|
-
reasonCode = "not_meet_the_required_conditions";
|
|
486
|
-
} else {
|
|
487
|
-
const baseAmount = import_decimal.default.min(
|
|
488
|
-
new import_decimal.default(recommendedAmount),
|
|
489
|
-
new import_decimal.default(maxDeductionAmount)
|
|
490
|
-
);
|
|
491
|
-
if (allowCrossProduct) {
|
|
492
|
-
if (applicableProductLimit > 0) {
|
|
493
|
-
const sortedProducts = [...applicableProducts].sort((a, b) => a[amountField].comparedTo(b[amountField]) > 0 ? -1 : 1);
|
|
494
|
-
let remainingLimit = applicableProductLimit;
|
|
495
|
-
for (const product of sortedProducts) {
|
|
496
|
-
if (remainingLimit <= 0)
|
|
497
|
-
break;
|
|
498
|
-
const currentAvailableQty = Math.ceil(product[amountField].dividedBy(product[unitPriceField]).toNumber());
|
|
499
|
-
const deductQty = Math.min(currentAvailableQty, remainingLimit);
|
|
500
|
-
const deductAmount = import_decimal.default.min(
|
|
501
|
-
product[unitPriceField].times(deductQty),
|
|
502
|
-
product[amountField]
|
|
503
|
-
);
|
|
504
|
-
calculatedMaxAmount = calculatedMaxAmount.plus(deductAmount);
|
|
505
|
-
remainingLimit -= deductQty;
|
|
506
|
-
}
|
|
507
|
-
} else {
|
|
508
|
-
calculatedMaxAmount = applicableProducts.reduce(
|
|
509
|
-
(sum, p) => sum.plus(p[amountField]),
|
|
510
|
-
new import_decimal.default(0)
|
|
511
|
-
);
|
|
512
|
-
}
|
|
513
|
-
} else {
|
|
514
|
-
const maxProduct = applicableProducts.reduce(
|
|
515
|
-
(max, p) => p[amountField].greaterThan(max[amountField]) ? p : max
|
|
516
|
-
);
|
|
517
|
-
const currentAvailableQty = Math.ceil(maxProduct[amountField].dividedBy(maxProduct[unitPriceField]).toNumber());
|
|
518
|
-
const deductQty = applicableProductLimit > 0 ? Math.min(currentAvailableQty, applicableProductLimit) : currentAvailableQty;
|
|
519
|
-
calculatedMaxAmount = import_decimal.default.min(
|
|
520
|
-
maxProduct[unitPriceField].times(deductQty),
|
|
521
|
-
maxProduct[amountField]
|
|
522
|
-
);
|
|
523
|
-
}
|
|
524
|
-
calculatedMaxAmount = import_decimal.default.min(
|
|
525
|
-
baseAmount,
|
|
526
|
-
calculatedMaxAmount,
|
|
527
|
-
remainingOrderAmount
|
|
528
|
-
);
|
|
529
|
-
if (calculatedMaxAmount.lessThanOrEqualTo(0)) {
|
|
530
|
-
isAvailable = false;
|
|
531
|
-
reasonCode = "exceeds_the_maximum_deduction_limit";
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
return {
|
|
537
|
-
...voucher,
|
|
538
|
-
_available_max_amount: calculatedMaxAmount.toNumber(),
|
|
539
|
-
// 转换为数字
|
|
540
|
-
_unified_available_status: isAvailable ? 1 : 0,
|
|
541
|
-
...reasonCode && { reasonCode }
|
|
542
|
-
};
|
|
543
|
-
});
|
|
544
|
-
return {
|
|
545
|
-
allWithUpdatedStatus,
|
|
546
|
-
selectedWithDetails
|
|
547
|
-
};
|
|
548
|
-
}
|
|
549
|
-
var getMainProductPrice = (product, isDeductTaxAndFee) => {
|
|
550
|
-
var _a, _b, _c, _d;
|
|
551
|
-
let mainProductPrice = new import_decimal.default((product == null ? void 0 : product.main_product_selling_price) || ((_a = product.metadata) == null ? void 0 : _a.main_product_selling_price) || 0);
|
|
552
|
-
for (let bundleItem of (product == null ? void 0 : product.product_bundle) || []) {
|
|
553
|
-
if (getBundleItemIsMarkupOrDiscountPrice(bundleItem)) {
|
|
554
|
-
const bundleItemPrice = new import_decimal.default(bundleItem.bundle_selling_price ?? 0);
|
|
555
|
-
mainProductPrice = mainProductPrice.add(bundleItemPrice.times(bundleItem.num));
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
let taxFee = new import_decimal.default((product == null ? void 0 : product.tax_fee) || ((_b = product == null ? void 0 : product.metadata) == null ? void 0 : _b.main_product_attached_bundle_tax_fee) || 0);
|
|
559
|
-
if (product.is_price_include_tax === 1) {
|
|
560
|
-
taxFee = new import_decimal.default(0);
|
|
561
|
-
}
|
|
562
|
-
const surchargeFee = new import_decimal.default(((_c = product == null ? void 0 : product.metadata) == null ? void 0 : _c.main_product_attached_bundle_surcharge_fee) || 0).add(((_d = product == null ? void 0 : product.metadata) == null ? void 0 : _d.surcharge_rounding_remainder) || 0);
|
|
563
|
-
const taxAndFeeTotal = taxFee.add(surchargeFee);
|
|
564
|
-
if (isDeductTaxAndFee) {
|
|
565
|
-
mainProductPrice = mainProductPrice.add(taxAndFeeTotal);
|
|
566
|
-
}
|
|
567
|
-
return mainProductPrice.toNumber();
|
|
568
|
-
};
|
|
569
|
-
var getBundleItemPrice = (bundleItem, parentQuantity, isDeductTaxAndFee) => {
|
|
570
|
-
var _a;
|
|
571
|
-
const totalQuantity = bundleItem.num * parentQuantity;
|
|
572
|
-
let bundleItemPrice = new import_decimal.default(bundleItem.bundle_selling_price ?? 0).times(totalQuantity);
|
|
573
|
-
if (isDeductTaxAndFee) {
|
|
574
|
-
let taxFee = new import_decimal.default(bundleItem.tax_fee ?? 0).times(totalQuantity);
|
|
575
|
-
if (bundleItem.is_price_include_tax === 1) {
|
|
576
|
-
taxFee = new import_decimal.default(0);
|
|
577
|
-
}
|
|
578
|
-
const surchargeFee = new import_decimal.default(((_a = bundleItem.metadata) == null ? void 0 : _a.surcharge_fee) ?? 0).times(totalQuantity);
|
|
579
|
-
bundleItemPrice = bundleItemPrice.add(taxFee).add(surchargeFee);
|
|
580
|
-
}
|
|
581
|
-
return bundleItemPrice.toNumber();
|
|
582
|
-
};
|
|
583
|
-
var expandProductsWithBundleItems = (products, deductTaxAndFee) => {
|
|
584
|
-
const expandedProducts = [];
|
|
585
|
-
products.forEach((product) => {
|
|
586
|
-
const productQuantity = getProductQuantity(product);
|
|
587
|
-
const unitPriceWithTax = getMainProductPrice(product, true);
|
|
588
|
-
const unitPricePure = getMainProductPrice(product, false);
|
|
589
|
-
expandedProducts.push({
|
|
590
|
-
...product,
|
|
591
|
-
is_bundle_item: false,
|
|
592
|
-
parent_product_id: null,
|
|
593
|
-
// 单价(用于按 quantity 计算抵扣)
|
|
594
|
-
unitPriceWithTax: new import_decimal.default(unitPriceWithTax),
|
|
595
|
-
unitPricePure: new import_decimal.default(unitPricePure),
|
|
596
|
-
// 剩余可抵扣数量
|
|
597
|
-
remainingQuantity: productQuantity,
|
|
598
|
-
// 含税费的剩余金额
|
|
599
|
-
remainingAmountWithTax: new import_decimal.default(unitPriceWithTax).times(productQuantity),
|
|
600
|
-
// 纯商品金额(不含税费)
|
|
601
|
-
remainingAmountPure: new import_decimal.default(unitPricePure).times(productQuantity)
|
|
602
|
-
});
|
|
603
|
-
if (product.product_bundle && product.product_bundle.length > 0) {
|
|
604
|
-
product.product_bundle.forEach((bundleItem) => {
|
|
605
|
-
if (getBundleItemIsOriginalPrice(bundleItem)) {
|
|
606
|
-
const bundleQuantity = bundleItem.num * productQuantity;
|
|
607
|
-
const bundleUnitPriceWithTax = new import_decimal.default(getBundleItemPrice(bundleItem, 1, true)).dividedBy(bundleItem.num);
|
|
608
|
-
const bundleUnitPricePure = new import_decimal.default(getBundleItemPrice(bundleItem, 1, false)).dividedBy(bundleItem.num);
|
|
609
|
-
expandedProducts.push({
|
|
610
|
-
...bundleItem,
|
|
611
|
-
product_id: bundleItem.bundle_product_id,
|
|
612
|
-
// 使用 bundle_product_id 作为 product_id
|
|
613
|
-
is_bundle_item: true,
|
|
614
|
-
parent_product_id: product.product_id,
|
|
615
|
-
quantity: bundleQuantity,
|
|
616
|
-
// 子商品数量 * 主商品数量
|
|
617
|
-
// 单价(用于按 quantity 计算抵扣)
|
|
618
|
-
unitPriceWithTax: bundleUnitPriceWithTax,
|
|
619
|
-
unitPricePure: bundleUnitPricePure,
|
|
620
|
-
// 剩余可抵扣数量
|
|
621
|
-
remainingQuantity: bundleQuantity,
|
|
622
|
-
// 含税费的剩余金额
|
|
623
|
-
remainingAmountWithTax: new import_decimal.default(getBundleItemPrice(bundleItem, productQuantity, true)),
|
|
624
|
-
// 纯商品金额(不含税费)
|
|
625
|
-
remainingAmountPure: new import_decimal.default(getBundleItemPrice(bundleItem, productQuantity, false))
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
});
|
|
631
|
-
return expandedProducts;
|
|
632
|
-
};
|
|
633
|
-
var getProductQuantity = (product) => {
|
|
634
|
-
return product.quantity || product.product_quantity || 1;
|
|
635
|
-
};
|
|
636
|
-
var getBundleItemIsOriginalPrice = (item) => {
|
|
637
|
-
return (item == null ? void 0 : item.price_type) === "markup" && (item == null ? void 0 : item.price_type_ext) === "product_price";
|
|
638
|
-
};
|
|
639
|
-
var getBundleItemIsMarkupPrice = (item) => {
|
|
640
|
-
return (item == null ? void 0 : item.price_type) === "markup" && ((item == null ? void 0 : item.price_type_ext) === "" || !(item == null ? void 0 : item.price_type_ext));
|
|
641
|
-
};
|
|
642
|
-
var getBundleItemIsDiscountPrice = (item) => {
|
|
643
|
-
return (item == null ? void 0 : item.price_type) === "markdown" && ((item == null ? void 0 : item.price_type_ext) === "" || !(item == null ? void 0 : item.price_type_ext));
|
|
644
|
-
};
|
|
645
|
-
var getBundleItemIsMarkupOrDiscountPrice = (item) => {
|
|
646
|
-
return getBundleItemIsMarkupPrice(item) || getBundleItemIsDiscountPrice(item);
|
|
647
|
-
};
|
|
648
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
649
|
-
0 && (module.exports = {
|
|
650
|
-
getApplicableProductIds,
|
|
651
|
-
getBundleItemIsDiscountPrice,
|
|
652
|
-
getBundleItemIsMarkupOrDiscountPrice,
|
|
653
|
-
getBundleItemIsMarkupPrice,
|
|
654
|
-
getBundleItemIsOriginalPrice,
|
|
655
|
-
getBundleItemPrice,
|
|
656
|
-
getMainProductPrice,
|
|
657
|
-
getProductQuantity,
|
|
658
|
-
processVouchers,
|
|
659
|
-
recalculateVouchers
|
|
660
|
-
});
|