@pisell/pisellos 2.2.244 → 2.2.246
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 +3 -2
- package/dist/model/strategy/adapter/walletPass/utils.js +7 -4
- package/dist/modules/BookingContext/index.d.ts +48 -0
- package/dist/modules/BookingContext/index.js +566 -0
- package/dist/modules/BookingContext/types.d.ts +102 -0
- package/dist/modules/BookingContext/types.js +51 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +284 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +148 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
- package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +218 -0
- package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/dist/modules/BookingContext/utils/flexible.js +56 -0
- package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
- package/dist/modules/BookingContext/utils/index.d.ts +11 -0
- package/dist/modules/BookingContext/utils/index.js +11 -0
- package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/dist/modules/BookingContext/utils/noResource.js +77 -0
- package/dist/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
- package/dist/modules/BookingContext/utils/orderLineDisplay.js +36 -0
- package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/dist/modules/BookingContext/utils/productExtend.js +339 -0
- package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
- package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
- package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
- package/dist/modules/BookingContext/utils/resources.js +486 -0
- package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
- package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
- package/dist/modules/Cart/utils/cartProduct.js +24 -3
- package/dist/modules/Cart/utils/changePrice.js +11 -11
- package/dist/modules/Customer/index.d.ts +20 -0
- package/dist/modules/Customer/index.js +172 -83
- package/dist/modules/Customer/types.d.ts +2 -0
- package/dist/modules/Discount/index.d.ts +1 -1
- package/dist/modules/Discount/index.js +13 -6
- package/dist/modules/Discount/types.d.ts +1 -0
- package/dist/modules/OpenData/index.d.ts +8 -0
- package/dist/modules/OpenData/index.js +37 -17
- package/dist/modules/Order/index.d.ts +277 -18
- package/dist/modules/Order/index.js +3581 -779
- package/dist/modules/Order/types.d.ts +286 -31
- package/dist/modules/Order/types.js +38 -0
- package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
- package/dist/modules/Order/utils/manualProductDiscount.js +210 -0
- package/dist/modules/Order/utils.d.ts +147 -5
- package/dist/modules/Order/utils.js +750 -104
- package/dist/modules/Payment/index.d.ts +10 -13
- package/dist/modules/Payment/index.js +467 -837
- package/dist/modules/Payment/types.d.ts +2 -0
- package/dist/modules/Payment/utils.js +2 -1
- package/dist/modules/Payment/walletpass.js +41 -25
- package/dist/modules/ProductList/index.d.ts +16 -12
- package/dist/modules/ProductList/index.js +133 -59
- package/dist/modules/ProductList/types.d.ts +14 -0
- package/dist/modules/Quotation/index.d.ts +0 -1
- package/dist/modules/Quotation/index.js +25 -22
- package/dist/modules/Rules/index.d.ts +4 -0
- package/dist/modules/Rules/index.js +97 -70
- package/dist/modules/Rules/types.d.ts +1 -0
- package/dist/modules/SalesSummary/index.d.ts +8 -25
- package/dist/modules/SalesSummary/index.js +86 -35
- package/dist/modules/SalesSummary/types.d.ts +4 -1
- package/dist/modules/SalesSummary/utils.d.ts +2 -25
- package/dist/modules/SalesSummary/utils.js +794 -162
- package/dist/modules/Schedule/index.d.ts +7 -0
- package/dist/modules/Schedule/index.js +24 -2
- package/dist/modules/Summary/index.js +4 -3
- package/dist/modules/SurchargeList/index.d.ts +16 -0
- package/dist/modules/SurchargeList/index.js +162 -0
- package/dist/modules/SurchargeList/types.d.ts +11 -0
- package/dist/modules/SurchargeList/types.js +1 -0
- package/dist/modules/index.d.ts +2 -0
- package/dist/modules/index.js +3 -1
- package/dist/plugins/request.d.ts +1 -0
- package/dist/server/index.d.ts +204 -1
- package/dist/server/index.js +3654 -922
- package/dist/server/modules/index.d.ts +2 -0
- package/dist/server/modules/index.js +2 -0
- package/dist/server/modules/order/index.d.ts +120 -3
- package/dist/server/modules/order/index.js +1762 -448
- package/dist/server/modules/order/types.d.ts +32 -3
- package/dist/server/modules/order/types.js +8 -0
- package/dist/server/modules/order/utils/filterBookings.js +26 -3
- package/dist/server/modules/order/utils/filterOrders.js +23 -8
- package/dist/server/modules/payment/index.d.ts +28 -0
- package/dist/server/modules/payment/index.js +305 -0
- package/dist/server/modules/payment/types.d.ts +9 -0
- package/dist/server/modules/payment/types.js +1 -0
- package/dist/server/modules/products/index.d.ts +34 -7
- package/dist/server/modules/products/index.js +631 -317
- package/dist/server/modules/resource/index.d.ts +2 -0
- package/dist/server/modules/resource/index.js +29 -3
- package/dist/server/modules/schedule/index.d.ts +4 -4
- package/dist/server/modules/schedule/index.js +111 -88
- package/dist/server/test.json +713 -0
- package/dist/server/utils/small-ticket.d.ts +71 -0
- package/dist/server/utils/small-ticket.js +840 -0
- package/dist/solution/BaseSales/index.d.ts +133 -10
- package/dist/solution/BaseSales/index.js +1950 -447
- package/dist/solution/BaseSales/types.d.ts +82 -6
- package/dist/solution/BaseSales/types.js +5 -4
- package/dist/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
- package/dist/solution/BaseSales/utils/cartPromotion.js +1438 -0
- package/dist/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/dist/solution/BaseSales/utils/quotationPrice.js +237 -0
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +1 -0
- package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +105 -24
- package/dist/solution/BaseSales/utils.d.ts +1 -1
- package/dist/solution/BaseSales/utils.js +62 -21
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingTicket/index.d.ts +271 -11
- package/dist/solution/BookingTicket/index.js +1777 -242
- package/dist/solution/BookingTicket/types.d.ts +118 -1
- package/dist/solution/BookingTicket/types.js +41 -2
- package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
- package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
- package/dist/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
- package/dist/solution/BookingTicket/utils/addTimeAvailability.js +95 -0
- package/dist/solution/BookingTicket/utils/bookingStatus.d.ts +40 -0
- package/dist/solution/BookingTicket/utils/bookingStatus.js +70 -0
- package/dist/solution/BookingTicket/utils/cartView.d.ts +9 -1
- package/dist/solution/BookingTicket/utils/cartView.js +94 -7
- package/dist/solution/BookingTicket/utils/exampleData.d.ts +123 -0
- package/dist/solution/BookingTicket/utils/exampleData.js +183 -0
- package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
- package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.js +438 -0
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
- package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +400 -0
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
- package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +56 -0
- package/dist/solution/BookingTicket/utils/scan/index.d.ts +5 -0
- package/dist/solution/BookingTicket/utils/scan/index.js +20 -8
- package/dist/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
- package/dist/solution/BookingTicket/utils/scan/scanProductValues.js +150 -0
- package/dist/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
- package/dist/solution/BookingTicket/utils/sessionCatalogStale.js +78 -0
- package/dist/solution/Checkout/index.d.ts +1 -0
- package/dist/solution/Checkout/index.js +10 -9
- package/dist/solution/RegisterAndLogin/config.js +2 -10
- package/dist/solution/ScanOrder/index.d.ts +9 -3
- package/dist/solution/ScanOrder/index.js +241 -134
- package/dist/solution/ScanOrder/types.d.ts +9 -5
- package/dist/solution/ScanOrder/types.js +2 -3
- package/dist/solution/ScanOrder/utils.d.ts +1 -1
- package/dist/solution/ScanOrder/utils.js +84 -22
- package/dist/solution/VenueBooking/index.d.ts +5 -2
- package/dist/solution/VenueBooking/index.js +110 -59
- package/dist/solution/VenueBooking/sales-section-4-annotated.json +0 -2
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/dist/types/index.d.ts +10 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +2 -1
- package/lib/model/strategy/adapter/promotion/index.js +49 -0
- package/lib/model/strategy/adapter/walletPass/utils.js +3 -2
- package/lib/modules/BookingContext/index.d.ts +48 -0
- package/lib/modules/BookingContext/index.js +368 -0
- package/lib/modules/BookingContext/types.d.ts +102 -0
- package/lib/modules/BookingContext/types.js +34 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +276 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +154 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +201 -0
- package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
- package/lib/modules/BookingContext/utils/flexible.js +80 -0
- package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
- package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
- package/lib/modules/BookingContext/utils/index.d.ts +11 -0
- package/lib/modules/BookingContext/utils/index.js +43 -0
- package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
- package/lib/modules/BookingContext/utils/noResource.js +90 -0
- package/lib/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +56 -0
- package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
- package/lib/modules/BookingContext/utils/productExtend.js +283 -0
- package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
- package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
- package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
- package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
- package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
- package/lib/modules/BookingContext/utils/resources.js +377 -0
- package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
- package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
- package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
- package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
- package/lib/modules/Cart/utils/cartProduct.js +20 -3
- package/lib/modules/Cart/utils/changePrice.js +12 -20
- package/lib/modules/Customer/index.d.ts +20 -0
- package/lib/modules/Customer/index.js +64 -11
- package/lib/modules/Customer/types.d.ts +2 -0
- package/lib/modules/Discount/index.d.ts +1 -1
- package/lib/modules/Discount/index.js +9 -1
- package/lib/modules/Discount/types.d.ts +1 -0
- package/lib/modules/OpenData/index.d.ts +8 -0
- package/lib/modules/OpenData/index.js +19 -5
- package/lib/modules/Order/index.d.ts +277 -18
- package/lib/modules/Order/index.js +2317 -337
- package/lib/modules/Order/types.d.ts +286 -31
- package/lib/modules/Order/types.js +1 -0
- package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
- package/lib/modules/Order/utils/manualProductDiscount.js +206 -0
- package/lib/modules/Order/utils.d.ts +147 -5
- package/lib/modules/Order/utils.js +615 -46
- package/lib/modules/Payment/index.d.ts +10 -13
- package/lib/modules/Payment/index.js +18 -150
- package/lib/modules/Payment/types.d.ts +2 -0
- package/lib/modules/Payment/utils.js +2 -1
- package/lib/modules/Payment/walletpass.js +16 -3
- package/lib/modules/ProductList/index.d.ts +16 -12
- package/lib/modules/ProductList/index.js +41 -4
- package/lib/modules/ProductList/types.d.ts +14 -0
- package/lib/modules/Quotation/index.d.ts +0 -1
- package/lib/modules/Quotation/index.js +19 -16
- package/lib/modules/Rules/index.d.ts +4 -0
- package/lib/modules/Rules/index.js +137 -120
- package/lib/modules/Rules/types.d.ts +1 -0
- package/lib/modules/SalesSummary/index.d.ts +8 -25
- package/lib/modules/SalesSummary/index.js +30 -4
- package/lib/modules/SalesSummary/types.d.ts +4 -1
- package/lib/modules/SalesSummary/utils.d.ts +2 -25
- package/lib/modules/SalesSummary/utils.js +645 -91
- package/lib/modules/Schedule/index.d.ts +7 -0
- package/lib/modules/Schedule/index.js +17 -1
- package/lib/modules/Summary/index.js +5 -4
- package/lib/modules/SurchargeList/index.d.ts +16 -0
- package/lib/modules/SurchargeList/index.js +89 -0
- package/lib/modules/SurchargeList/types.d.ts +11 -0
- package/lib/modules/SurchargeList/types.js +17 -0
- package/lib/modules/index.d.ts +2 -0
- package/lib/modules/index.js +5 -1
- package/lib/plugins/request.d.ts +1 -0
- package/lib/server/index.d.ts +204 -1
- package/lib/server/index.js +1891 -59
- package/lib/server/modules/index.d.ts +2 -0
- package/lib/server/modules/index.js +3 -0
- package/lib/server/modules/order/index.d.ts +120 -3
- package/lib/server/modules/order/index.js +887 -94
- package/lib/server/modules/order/types.d.ts +32 -3
- package/lib/server/modules/order/utils/filterBookings.js +24 -5
- package/lib/server/modules/order/utils/filterOrders.js +15 -6
- package/lib/server/modules/payment/index.d.ts +28 -0
- package/lib/server/modules/payment/index.js +192 -0
- package/lib/server/modules/payment/types.d.ts +9 -0
- package/lib/server/modules/payment/types.js +17 -0
- package/lib/server/modules/products/index.d.ts +34 -7
- package/lib/server/modules/products/index.js +189 -54
- package/lib/server/modules/resource/index.d.ts +2 -0
- package/lib/server/modules/resource/index.js +27 -3
- package/lib/server/modules/schedule/index.d.ts +4 -4
- package/lib/server/modules/schedule/index.js +47 -40
- package/lib/server/test.json +713 -0
- package/lib/server/utils/small-ticket.d.ts +71 -0
- package/lib/server/utils/small-ticket.js +800 -0
- package/lib/solution/BaseSales/index.d.ts +133 -10
- package/lib/solution/BaseSales/index.js +1111 -63
- package/lib/solution/BaseSales/types.d.ts +82 -6
- package/lib/solution/BaseSales/types.js +3 -1
- package/lib/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
- package/lib/solution/BaseSales/utils/cartPromotion.js +992 -0
- package/lib/solution/BaseSales/utils/quotationPrice.d.ts +7 -0
- package/lib/solution/BaseSales/utils/quotationPrice.js +277 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +1 -0
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +106 -18
- package/lib/solution/BaseSales/utils.d.ts +1 -1
- package/lib/solution/BaseSales/utils.js +54 -10
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingTicket/index.d.ts +271 -11
- package/lib/solution/BookingTicket/index.js +922 -29
- package/lib/solution/BookingTicket/types.d.ts +118 -1
- package/lib/solution/BookingTicket/types.js +11 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
- package/lib/solution/BookingTicket/utils/addProductDecision.js +318 -0
- package/lib/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +125 -0
- package/lib/solution/BookingTicket/utils/bookingStatus.d.ts +40 -0
- package/lib/solution/BookingTicket/utils/bookingStatus.js +44 -2
- package/lib/solution/BookingTicket/utils/cartView.d.ts +9 -1
- package/lib/solution/BookingTicket/utils/cartView.js +61 -6
- package/lib/solution/BookingTicket/utils/exampleData.d.ts +123 -0
- package/lib/solution/BookingTicket/utils/exampleData.js +0 -0
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +254 -0
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +169 -0
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +51 -0
- package/lib/solution/BookingTicket/utils/scan/index.d.ts +5 -0
- package/lib/solution/BookingTicket/utils/scan/index.js +17 -3
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +127 -0
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +85 -0
- package/lib/solution/Checkout/index.d.ts +1 -0
- package/lib/solution/Checkout/index.js +1 -2
- package/lib/solution/RegisterAndLogin/config.js +2 -10
- package/lib/solution/ScanOrder/index.d.ts +9 -3
- package/lib/solution/ScanOrder/index.js +153 -70
- package/lib/solution/ScanOrder/types.d.ts +9 -5
- package/lib/solution/ScanOrder/utils.d.ts +1 -1
- package/lib/solution/ScanOrder/utils.js +83 -17
- package/lib/solution/VenueBooking/index.d.ts +5 -2
- package/lib/solution/VenueBooking/index.js +54 -17
- package/lib/solution/VenueBooking/sales-section-4-annotated.json +0 -2
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +4 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +10 -0
- package/lib/types/index.d.ts +10 -0
- package/package.json +1 -1
- package/dist/solution/Checkout/appointmentDemo.json +0 -1
- package/lib/solution/Checkout/appointmentDemo.json +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
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/solution/BookingTicket/utils/addTimeAvailability.ts
|
|
30
|
+
var addTimeAvailability_exports = {};
|
|
31
|
+
__export(addTimeAvailability_exports, {
|
|
32
|
+
buildAddTimeCurrentItem: () => buildAddTimeCurrentItem,
|
|
33
|
+
isUsableAddTimeProduct: () => isUsableAddTimeProduct,
|
|
34
|
+
resolveBookingCanAddTime: () => resolveBookingCanAddTime
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(addTimeAvailability_exports);
|
|
37
|
+
var import_dayjs = __toESM(require("dayjs"));
|
|
38
|
+
var import_lodash_es = require("lodash-es");
|
|
39
|
+
var import_serviceTimes = require("../../../modules/BookingContext/utils/serviceTimes");
|
|
40
|
+
var import_timeSlices = require("../../../modules/BookingContext/utils/timeSlices");
|
|
41
|
+
function buildAddTimeCurrentItem({
|
|
42
|
+
booking,
|
|
43
|
+
product,
|
|
44
|
+
productsByUid
|
|
45
|
+
}) {
|
|
46
|
+
var _a, _b, _c;
|
|
47
|
+
if (!booking || !product)
|
|
48
|
+
return null;
|
|
49
|
+
const uid = (_a = product.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
50
|
+
const origin = uid ? (_b = productsByUid == null ? void 0 : productsByUid[String(uid)]) == null ? void 0 : _b.origin : void 0;
|
|
51
|
+
const sourceProduct = origin || booking.product || {};
|
|
52
|
+
const startAt = booking.start_date && booking.start_time ? `${booking.start_date} ${booking.start_time}` : booking.start_date;
|
|
53
|
+
const endAt = booking.end_date && booking.end_time ? `${booking.end_date} ${booking.end_time}` : booking.end_date;
|
|
54
|
+
return {
|
|
55
|
+
...sourceProduct,
|
|
56
|
+
...booking.product,
|
|
57
|
+
product_id: product.product_id ?? sourceProduct.product_id ?? sourceProduct.id,
|
|
58
|
+
id: sourceProduct.id ?? product.product_id,
|
|
59
|
+
collection: sourceProduct.collection || ((_c = booking.product) == null ? void 0 : _c.collection) || [],
|
|
60
|
+
duration: sourceProduct.duration || booking.duration,
|
|
61
|
+
_extend: {
|
|
62
|
+
...sourceProduct._extend || {},
|
|
63
|
+
startDate: startAt ? (0, import_dayjs.default)(startAt) : void 0,
|
|
64
|
+
endDate: endAt ? (0, import_dayjs.default)(endAt) : void 0,
|
|
65
|
+
start_date: booking.start_date,
|
|
66
|
+
end_date: booking.end_date,
|
|
67
|
+
start_time: booking.start_time,
|
|
68
|
+
end_time: booking.end_time,
|
|
69
|
+
sub_type: booking.sub_type
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function resolveBookingCanAddTime(params) {
|
|
74
|
+
var _a, _b, _c, _d;
|
|
75
|
+
const quickTime = (_d = (_c = (_b = (_a = params.bookingConfig) == null ? void 0 : _a.config) == null ? void 0 : _b.information_tab) == null ? void 0 : _c.appointment_card) == null ? void 0 : _d.quick_time;
|
|
76
|
+
if (quickTime !== void 0 && quickTime !== 1)
|
|
77
|
+
return false;
|
|
78
|
+
const currentItem = buildAddTimeCurrentItem(params);
|
|
79
|
+
if (!currentItem || (0, import_serviceTimes.isMultiDayProduct)(currentItem))
|
|
80
|
+
return false;
|
|
81
|
+
return (params.addTimeProducts || []).some(
|
|
82
|
+
(item) => isUsableAddTimeProduct(item == null ? void 0 : item.add_time, currentItem, params.shopOpeningHours)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
function isUsableAddTimeProduct(addTime, currentItem, shopOpeningHours) {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
if (!addTime || !currentItem)
|
|
88
|
+
return false;
|
|
89
|
+
if (addTime.additional_time_options === "unlimited") {
|
|
90
|
+
const startDate = (0, import_dayjs.default)((_a = currentItem._extend) == null ? void 0 : _a.startDate);
|
|
91
|
+
const endDate = (0, import_dayjs.default)((_b = currentItem._extend) == null ? void 0 : _b.endDate);
|
|
92
|
+
if (!startDate.isValid() || !endDate.isValid())
|
|
93
|
+
return false;
|
|
94
|
+
const maxEndDate = (0, import_timeSlices.getEndDate)(startDate, "flexible", "", shopOpeningHours);
|
|
95
|
+
if (endDate.isAfter(maxEndDate))
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const relationProduct = addTime.relation_product || {};
|
|
99
|
+
const type = relationProduct.type;
|
|
100
|
+
const products = Array.isArray(relationProduct.products) ? relationProduct.products : [];
|
|
101
|
+
if (type === "product_all")
|
|
102
|
+
return true;
|
|
103
|
+
if (type === "product_collection") {
|
|
104
|
+
return Boolean(
|
|
105
|
+
(0, import_lodash_es.intersectionBy)(
|
|
106
|
+
products.map((item) => ({
|
|
107
|
+
...item,
|
|
108
|
+
id: item.product_collection_id
|
|
109
|
+
})),
|
|
110
|
+
currentItem.collection || [],
|
|
111
|
+
"id"
|
|
112
|
+
).length
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
if (type === "products") {
|
|
116
|
+
return products.some((item) => item.product_id == currentItem.product_id);
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
121
|
+
0 && (module.exports = {
|
|
122
|
+
buildAddTimeCurrentItem,
|
|
123
|
+
isUsableAddTimeProduct,
|
|
124
|
+
resolveBookingCanAddTime
|
|
125
|
+
});
|
|
@@ -9,6 +9,21 @@
|
|
|
9
9
|
* 字段含义严格对齐既有协议(OrderTempOrder / parseSalesResponse),
|
|
10
10
|
* 不发明等价关系。
|
|
11
11
|
*/
|
|
12
|
+
/**
|
|
13
|
+
* 子预约状态机转移动作(POST /schedule/booking-transition/{schedule_event_id})。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* await bookingTicket.transitionChildBooking({
|
|
17
|
+
* schedule_event_id: 301,
|
|
18
|
+
* action: 'confirm',
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
export type BookingTransitionAction = 'confirm' | 'reject' | 'arrive' | 'start' | 'complete' | 'cancel' | 'no_show' | 'reschedule';
|
|
22
|
+
/** 子预约状态转移入参 */
|
|
23
|
+
export interface TransitionChildBookingParams {
|
|
24
|
+
schedule_event_id: number | string;
|
|
25
|
+
action: BookingTransitionAction;
|
|
26
|
+
}
|
|
12
27
|
/**
|
|
13
28
|
* 从 tempOrder 解析用于调用 appointment-status 接口的 schedule id。
|
|
14
29
|
*
|
|
@@ -35,3 +50,28 @@ export declare function applyBookingsStatus(bookings: any[] | null | undefined,
|
|
|
35
50
|
* 长度不一致时按较短一方对齐(防御式编程,正常路径不会发生)。
|
|
36
51
|
*/
|
|
37
52
|
export declare function restoreBookingsStatus(bookings: any[] | null | undefined, previous: Array<string | undefined>): void;
|
|
53
|
+
/**
|
|
54
|
+
* 将状态机 action 解析为转移后的 `appointment_status`。
|
|
55
|
+
*
|
|
56
|
+
* `reschedule` 暂未在状态矩阵启用,返回 null 表示跳过乐观更新。
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* resolveStatusAfterTransition('confirm'); // 'confirmed'
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolveStatusAfterTransition(action: BookingTransitionAction): string | null;
|
|
62
|
+
/**
|
|
63
|
+
* 在 bookings 中按 `schedule_event_id` 定位子预约并乐观写入 `appointment_status`。
|
|
64
|
+
*
|
|
65
|
+
* @returns 写入前的 status;未命中时返回 undefined(调用方跳过回滚)
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* const prev = applyChildBookingStatus(tempOrder.bookings, 301, 'confirmed');
|
|
69
|
+
*/
|
|
70
|
+
export declare function applyChildBookingStatus(bookings: any[] | null | undefined, scheduleEventId: number | string, status: string): string | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* 撤销 applyChildBookingStatus 对单条子预约的乐观写入。
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* restoreChildBookingStatus(tempOrder.bookings, 301, prev);
|
|
76
|
+
*/
|
|
77
|
+
export declare function restoreChildBookingStatus(bookings: any[] | null | undefined, scheduleEventId: number | string, previous: string | undefined): void;
|
|
@@ -20,8 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
var bookingStatus_exports = {};
|
|
21
21
|
__export(bookingStatus_exports, {
|
|
22
22
|
applyBookingsStatus: () => applyBookingsStatus,
|
|
23
|
+
applyChildBookingStatus: () => applyChildBookingStatus,
|
|
23
24
|
resolveScheduleId: () => resolveScheduleId,
|
|
24
|
-
|
|
25
|
+
resolveStatusAfterTransition: () => resolveStatusAfterTransition,
|
|
26
|
+
restoreBookingsStatus: () => restoreBookingsStatus,
|
|
27
|
+
restoreChildBookingStatus: () => restoreChildBookingStatus
|
|
25
28
|
});
|
|
26
29
|
module.exports = __toCommonJS(bookingStatus_exports);
|
|
27
30
|
function resolveScheduleId(tempOrder) {
|
|
@@ -57,9 +60,48 @@ function restoreBookingsStatus(bookings, previous) {
|
|
|
57
60
|
b.appointment_status = previous[i];
|
|
58
61
|
}
|
|
59
62
|
}
|
|
63
|
+
function resolveStatusAfterTransition(action) {
|
|
64
|
+
const map = {
|
|
65
|
+
confirm: "confirmed",
|
|
66
|
+
reject: "rejected",
|
|
67
|
+
arrive: "arrived",
|
|
68
|
+
start: "started",
|
|
69
|
+
complete: "completed",
|
|
70
|
+
cancel: "cancelled",
|
|
71
|
+
no_show: "no_show",
|
|
72
|
+
reschedule: null
|
|
73
|
+
};
|
|
74
|
+
return map[action] ?? null;
|
|
75
|
+
}
|
|
76
|
+
function applyChildBookingStatus(bookings, scheduleEventId, status) {
|
|
77
|
+
var _a;
|
|
78
|
+
if (!Array.isArray(bookings))
|
|
79
|
+
return void 0;
|
|
80
|
+
const idx = bookings.findIndex(
|
|
81
|
+
(b) => b && String(b.schedule_event_id) === String(scheduleEventId)
|
|
82
|
+
);
|
|
83
|
+
if (idx === -1)
|
|
84
|
+
return void 0;
|
|
85
|
+
const previous = (_a = bookings[idx]) == null ? void 0 : _a.appointment_status;
|
|
86
|
+
bookings[idx].appointment_status = status;
|
|
87
|
+
return previous;
|
|
88
|
+
}
|
|
89
|
+
function restoreChildBookingStatus(bookings, scheduleEventId, previous) {
|
|
90
|
+
if (!Array.isArray(bookings) || previous === void 0)
|
|
91
|
+
return;
|
|
92
|
+
const idx = bookings.findIndex(
|
|
93
|
+
(b) => b && String(b.schedule_event_id) === String(scheduleEventId)
|
|
94
|
+
);
|
|
95
|
+
if (idx === -1)
|
|
96
|
+
return;
|
|
97
|
+
bookings[idx].appointment_status = previous;
|
|
98
|
+
}
|
|
60
99
|
// Annotate the CommonJS export names for ESM import in node:
|
|
61
100
|
0 && (module.exports = {
|
|
62
101
|
applyBookingsStatus,
|
|
102
|
+
applyChildBookingStatus,
|
|
63
103
|
resolveScheduleId,
|
|
64
|
-
|
|
104
|
+
resolveStatusAfterTransition,
|
|
105
|
+
restoreBookingsStatus,
|
|
106
|
+
restoreChildBookingStatus
|
|
65
107
|
});
|
|
@@ -2,6 +2,14 @@ import type { BaseSalesOrderProduct } from '../../BaseSales';
|
|
|
2
2
|
import type { ISalesBooking } from '../../BaseSales/utils/parseSalesResponse';
|
|
3
3
|
import type { BookingTicketCartView, BookingTicketCustomerView, ICustomer } from '../types';
|
|
4
4
|
import type { ScanOrderTempOrder } from '../../ScanOrder/types';
|
|
5
|
+
export interface BuildCartViewOptions {
|
|
6
|
+
addTimeProducts?: any[];
|
|
7
|
+
bookingConfig?: Record<string, any> | null;
|
|
8
|
+
productsByUid?: Record<string, {
|
|
9
|
+
origin?: Record<string, any>;
|
|
10
|
+
}>;
|
|
11
|
+
shopOpeningHours?: string;
|
|
12
|
+
}
|
|
5
13
|
/**
|
|
6
14
|
* 仅按 booking.product_uid 建索引,避免发明 booking 与商品行之间的其它等价关系。
|
|
7
15
|
*/
|
|
@@ -13,7 +21,7 @@ export declare function indexBookingsByProductUid(bookings: ISalesBooking[] | un
|
|
|
13
21
|
* 关联规则(1:1):booking.product_uid ↔ line.metadata.unique_identification_number;
|
|
14
22
|
* 同一 uid 已被更早的 booking 占用时,后续 booking 的 product 为 null。
|
|
15
23
|
*/
|
|
16
|
-
export declare function buildCartView(lines: BaseSalesOrderProduct[] | undefined | null, bookings: ISalesBooking[] | undefined | null): BookingTicketCartView;
|
|
24
|
+
export declare function buildCartView(lines: BaseSalesOrderProduct[] | undefined | null, bookings: ISalesBooking[] | undefined | null, options?: BuildCartViewOptions): BookingTicketCartView;
|
|
17
25
|
export declare function isWalkInCustomer(customer: Pick<ICustomer, 'id'> | null | undefined): boolean;
|
|
18
26
|
/**
|
|
19
27
|
* selected 优先,缺失时回退 tempOrder.customer_*,统一输出 UI 客户视图。
|
|
@@ -25,6 +25,7 @@ __export(cartView_exports, {
|
|
|
25
25
|
isWalkInCustomer: () => isWalkInCustomer
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(cartView_exports);
|
|
28
|
+
var import_addTimeAvailability = require("./addTimeAvailability");
|
|
28
29
|
function indexBookingsByProductUid(bookings) {
|
|
29
30
|
if (!Array.isArray(bookings) || bookings.length === 0)
|
|
30
31
|
return {};
|
|
@@ -51,31 +52,85 @@ function indexProductsByUid(lines) {
|
|
|
51
52
|
return acc;
|
|
52
53
|
}, {});
|
|
53
54
|
}
|
|
54
|
-
function
|
|
55
|
+
function getBookingUid(booking) {
|
|
56
|
+
var _a;
|
|
57
|
+
const uid = (_a = booking == null ? void 0 : booking.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
58
|
+
return uid === void 0 || uid === null ? "" : String(uid);
|
|
59
|
+
}
|
|
60
|
+
function getProductBookingUid(line) {
|
|
61
|
+
var _a;
|
|
62
|
+
const uid = (line == null ? void 0 : line.booking_uid) ?? ((_a = line == null ? void 0 : line.metadata) == null ? void 0 : _a.booking_uid);
|
|
63
|
+
return uid === void 0 || uid === null ? "" : String(uid);
|
|
64
|
+
}
|
|
65
|
+
function isAddTimeProductLine(line) {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
return ((_a = line == null ? void 0 : line.metadata) == null ? void 0 : _a.product_add_schedule_time) !== void 0 && ((_b = line == null ? void 0 : line.metadata) == null ? void 0 : _b.product_add_schedule_time) !== null;
|
|
68
|
+
}
|
|
69
|
+
function indexAddTimeProductsByBookingUid(lines) {
|
|
70
|
+
return lines.reduce((acc, line) => {
|
|
71
|
+
if (!isAddTimeProductLine(line))
|
|
72
|
+
return acc;
|
|
73
|
+
const bookingUid = getProductBookingUid(line);
|
|
74
|
+
if (!bookingUid)
|
|
75
|
+
return acc;
|
|
76
|
+
if (!acc[bookingUid])
|
|
77
|
+
acc[bookingUid] = [];
|
|
78
|
+
acc[bookingUid].push(line);
|
|
79
|
+
return acc;
|
|
80
|
+
}, {});
|
|
81
|
+
}
|
|
82
|
+
function isGiftProductLine(line) {
|
|
83
|
+
var _a;
|
|
84
|
+
return Boolean((_a = line == null ? void 0 : line.metadata) == null ? void 0 : _a._giftInfo);
|
|
85
|
+
}
|
|
86
|
+
function buildCartView(lines, bookings, options = {}) {
|
|
55
87
|
const productLines = Array.isArray(lines) ? lines : [];
|
|
56
88
|
const bookingList = Array.isArray(bookings) ? bookings : [];
|
|
57
89
|
const linesByUid = indexProductsByUid(productLines);
|
|
90
|
+
const addTimeLinesByBookingUid = indexAddTimeProductsByBookingUid(productLines);
|
|
58
91
|
const claimedUids = /* @__PURE__ */ new Set();
|
|
59
|
-
const
|
|
92
|
+
const claimedAddTimeLines = /* @__PURE__ */ new Set();
|
|
93
|
+
const cartBookings = bookingList.filter((booking) => booking.parent_id !== 0).reduce((acc, booking) => {
|
|
60
94
|
const uid = booking == null ? void 0 : booking.product_uid;
|
|
95
|
+
const bookingUid = getBookingUid(booking);
|
|
61
96
|
let product = null;
|
|
62
97
|
if (uid !== void 0 && uid !== null && uid !== "") {
|
|
63
98
|
const key = String(uid);
|
|
64
99
|
if (!claimedUids.has(key)) {
|
|
65
100
|
const line = linesByUid[key];
|
|
101
|
+
if (isGiftProductLine(line))
|
|
102
|
+
return acc;
|
|
66
103
|
if (line) {
|
|
67
104
|
claimedUids.add(key);
|
|
68
105
|
product = line;
|
|
69
106
|
}
|
|
70
107
|
}
|
|
71
108
|
}
|
|
72
|
-
|
|
109
|
+
const addTimeProduct = bookingUid ? addTimeLinesByBookingUid[bookingUid] || [] : [];
|
|
110
|
+
addTimeProduct.forEach((line) => claimedAddTimeLines.add(line));
|
|
111
|
+
acc.push({
|
|
73
112
|
...booking,
|
|
74
|
-
_extend: {
|
|
75
|
-
|
|
76
|
-
|
|
113
|
+
_extend: {
|
|
114
|
+
product,
|
|
115
|
+
addTimeProduct,
|
|
116
|
+
canAddTime: (0, import_addTimeAvailability.resolveBookingCanAddTime)({
|
|
117
|
+
booking,
|
|
118
|
+
product,
|
|
119
|
+
addTimeProducts: options.addTimeProducts,
|
|
120
|
+
bookingConfig: options.bookingConfig,
|
|
121
|
+
productsByUid: options.productsByUid,
|
|
122
|
+
shopOpeningHours: options.shopOpeningHours
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return acc;
|
|
127
|
+
}, []);
|
|
77
128
|
const items = productLines.filter((line) => {
|
|
78
129
|
var _a;
|
|
130
|
+
if (isGiftProductLine(line))
|
|
131
|
+
return false;
|
|
132
|
+
if (claimedAddTimeLines.has(line))
|
|
133
|
+
return false;
|
|
79
134
|
const uid = (_a = line.metadata) == null ? void 0 : _a.unique_identification_number;
|
|
80
135
|
if (uid === void 0 || uid === null || uid === "")
|
|
81
136
|
return true;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
declare let data: ({
|
|
2
|
+
id: number;
|
|
3
|
+
title: string;
|
|
4
|
+
price: number;
|
|
5
|
+
minMinutes: number;
|
|
6
|
+
maxMinutes: number;
|
|
7
|
+
unitMinutes: number;
|
|
8
|
+
unlimited: boolean;
|
|
9
|
+
_originalProduct: {
|
|
10
|
+
id: number;
|
|
11
|
+
extension_id: number;
|
|
12
|
+
extension_type: string;
|
|
13
|
+
shop_id: number;
|
|
14
|
+
title: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
status: string;
|
|
17
|
+
stock_quantity: number;
|
|
18
|
+
sales_quantity: number;
|
|
19
|
+
sum_stock: number;
|
|
20
|
+
price: string;
|
|
21
|
+
original_price: string;
|
|
22
|
+
cost_price: string;
|
|
23
|
+
cover: string;
|
|
24
|
+
channel_application: string[];
|
|
25
|
+
is_track: number;
|
|
26
|
+
over_sold: number;
|
|
27
|
+
is_gst: number;
|
|
28
|
+
code: string;
|
|
29
|
+
barcode: string;
|
|
30
|
+
is_delivery: number;
|
|
31
|
+
weight_unit: string;
|
|
32
|
+
weight_value: string;
|
|
33
|
+
type: string;
|
|
34
|
+
unit: string;
|
|
35
|
+
sort: number;
|
|
36
|
+
subtitle: string;
|
|
37
|
+
minimum_markup_price: string;
|
|
38
|
+
is_bundle: number;
|
|
39
|
+
description: string;
|
|
40
|
+
open_sold_weight: number;
|
|
41
|
+
unit_value: number;
|
|
42
|
+
is_variant: number;
|
|
43
|
+
variant_count: number;
|
|
44
|
+
add_time: {
|
|
45
|
+
unit_duration: number;
|
|
46
|
+
min_add_time: number;
|
|
47
|
+
max_add_time: number;
|
|
48
|
+
calculate_type: string;
|
|
49
|
+
relation_product: {
|
|
50
|
+
type: string;
|
|
51
|
+
products: never[];
|
|
52
|
+
};
|
|
53
|
+
additional_time_options?: undefined;
|
|
54
|
+
};
|
|
55
|
+
shelf_product_datas: never[];
|
|
56
|
+
step_value: number;
|
|
57
|
+
min_num_unit: number;
|
|
58
|
+
is_charge_tax: number;
|
|
59
|
+
base_price: string;
|
|
60
|
+
variant: never[];
|
|
61
|
+
};
|
|
62
|
+
} | {
|
|
63
|
+
id: number;
|
|
64
|
+
title: string;
|
|
65
|
+
price: number;
|
|
66
|
+
minMinutes: number;
|
|
67
|
+
maxMinutes: number;
|
|
68
|
+
unitMinutes: number;
|
|
69
|
+
unlimited: boolean;
|
|
70
|
+
_originalProduct: {
|
|
71
|
+
id: number;
|
|
72
|
+
extension_id: number;
|
|
73
|
+
extension_type: string;
|
|
74
|
+
shop_id: number;
|
|
75
|
+
title: string;
|
|
76
|
+
slug: string;
|
|
77
|
+
status: string;
|
|
78
|
+
stock_quantity: number;
|
|
79
|
+
sales_quantity: number;
|
|
80
|
+
sum_stock: number;
|
|
81
|
+
price: string;
|
|
82
|
+
original_price: string;
|
|
83
|
+
cost_price: string;
|
|
84
|
+
cover: string;
|
|
85
|
+
channel_application: string[];
|
|
86
|
+
is_track: number;
|
|
87
|
+
over_sold: number;
|
|
88
|
+
is_gst: number;
|
|
89
|
+
code: string;
|
|
90
|
+
barcode: string;
|
|
91
|
+
is_delivery: number;
|
|
92
|
+
weight_unit: string;
|
|
93
|
+
weight_value: string;
|
|
94
|
+
type: string;
|
|
95
|
+
unit: string;
|
|
96
|
+
sort: number;
|
|
97
|
+
subtitle: string;
|
|
98
|
+
minimum_markup_price: string;
|
|
99
|
+
is_bundle: number;
|
|
100
|
+
description: string;
|
|
101
|
+
open_sold_weight: number;
|
|
102
|
+
unit_value: number;
|
|
103
|
+
is_variant: number;
|
|
104
|
+
variant_count: number;
|
|
105
|
+
add_time: {
|
|
106
|
+
additional_time_options: string;
|
|
107
|
+
unit_duration: number;
|
|
108
|
+
min_add_time: number;
|
|
109
|
+
max_add_time: number;
|
|
110
|
+
calculate_type: string;
|
|
111
|
+
relation_product: {
|
|
112
|
+
type: string;
|
|
113
|
+
products: never[];
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
shelf_product_datas: never[];
|
|
117
|
+
step_value: number;
|
|
118
|
+
min_num_unit: number;
|
|
119
|
+
is_charge_tax: number;
|
|
120
|
+
base_price: string;
|
|
121
|
+
variant: never[];
|
|
122
|
+
};
|
|
123
|
+
})[];
|
|
File without changes
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 计算指定加时时长下的最优购买方案。
|
|
3
|
+
*
|
|
4
|
+
* 输入的商品结构来自旧版 booking addTimeModal 的加时商品配置映射:
|
|
5
|
+
* - `minMinutes`:该商品第一次可选择的最小时长。
|
|
6
|
+
* - `maxMinutes`:单次购买该商品可覆盖的最大时长。
|
|
7
|
+
* - `unitMinutes`:超过最小时长后,每次递增的时长切片。
|
|
8
|
+
* - `price`:每个 `unitMinutes` 切片的价格。
|
|
9
|
+
* - `unlimited`:固定价格商品,可覆盖任意目标时长。
|
|
10
|
+
*
|
|
11
|
+
* 算法流程:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* products
|
|
15
|
+
* |
|
|
16
|
+
* v
|
|
17
|
+
* 将每个普通商品展开成有限候选档位
|
|
18
|
+
* 商品 A: min=30, max=60, unit=10, price=10
|
|
19
|
+
* => 30m/$30, 40m/$40, 50m/$50, 60m/$60
|
|
20
|
+
* |
|
|
21
|
+
* v
|
|
22
|
+
* 单独加入 unlimited 候选
|
|
23
|
+
* unlimited 商品 => targetMinutes / 固定商品价格
|
|
24
|
+
* |
|
|
25
|
+
* v
|
|
26
|
+
* 按 covered minutes 做动态规划
|
|
27
|
+
* dp[minutes] = 正好覆盖 `minutes` 时的最低价候选组合
|
|
28
|
+
* |
|
|
29
|
+
* v
|
|
30
|
+
* 从所有 dp[minutes >= targetMinutes] 中挑选最优方案
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* 候选档位生成刻意对齐旧版 addTimeModal:
|
|
34
|
+
* `totalPrice = minutes / unitMinutes * price`.
|
|
35
|
+
* 例如 `minMinutes=30`、`unitMinutes=10`、`price=10` 时:
|
|
36
|
+
* - 30 分钟 => 30 / 10 * 10 = 30
|
|
37
|
+
* - 60 分钟 => 60 / 10 * 10 = 60
|
|
38
|
+
*
|
|
39
|
+
* 目标时长不要求精确命中某个档位,只需要覆盖即可。例如目标是 51 分钟时,
|
|
40
|
+
* 60 分钟档位可以作为候选。动态规划也允许跨商品组合,例如商品 A 的 30m
|
|
41
|
+
* 加上商品 B 的 30m。最终方案按以下优先级比较:
|
|
42
|
+
* 1. 总价更低;
|
|
43
|
+
* 2. 超出时长更少,即 `coveredMinutes - targetMinutes` 更小;
|
|
44
|
+
* 3. 结果行数更少,让购买方案尽量简单。
|
|
45
|
+
*
|
|
46
|
+
* 典型匹配示例:
|
|
47
|
+
*
|
|
48
|
+
* 示例 1:精确命中,直接选择更便宜的商品。
|
|
49
|
+
* ```
|
|
50
|
+
* target = 30
|
|
51
|
+
* 商品 A: min=30, max=30, unit=30, price=10 => 30m/$10
|
|
52
|
+
* 商品 B: min=30, max=30, unit=30, price=8 => 30m/$8
|
|
53
|
+
* 结果:选择商品 B,coveredMinutes=30,totalPrice=8
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* 示例 2:目标时长落在两个档位之间,向上选择可覆盖的档位。
|
|
57
|
+
* ```
|
|
58
|
+
* target = 51
|
|
59
|
+
* 商品 A: min=30, max=120, unit=10, price=10
|
|
60
|
+
* 候选:30m/$30, 40m/$40, 50m/$50, 60m/$60 ...
|
|
61
|
+
* 结果:50m 不足以覆盖 51m,因此选择 60m/$60
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* 示例 3:不同商品都能覆盖同一目标时长,比较最终价格。
|
|
65
|
+
* ```
|
|
66
|
+
* target = 51
|
|
67
|
+
* 商品 A: min=30, max=120, unit=10, price=10 => 60m/$60
|
|
68
|
+
* 商品 B: min=30, max=120, unit=30, price=25 => 60m/$50
|
|
69
|
+
* 结果:两个方案都覆盖 60m,但商品 B 更便宜,所以选择商品 B
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* 示例 4:允许跨商品组合,组合价更低时会选择组合。
|
|
73
|
+
* ```
|
|
74
|
+
* target = 90
|
|
75
|
+
* 商品 A: min=30, max=30, unit=30, price=5 => 30m/$5
|
|
76
|
+
* 商品 B: min=60, max=60, unit=60, price=8 => 60m/$8
|
|
77
|
+
* 商品 C: min=90, max=90, unit=90, price=20 => 90m/$20
|
|
78
|
+
* 结果:商品 A + 商品 B = 90m/$13,比商品 C 更便宜
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* 示例 5:允许重复购买同一个候选档位。
|
|
82
|
+
* ```
|
|
83
|
+
* target = 90
|
|
84
|
+
* 商品 A: min=30, max=30, unit=30, price=5 => 30m/$5
|
|
85
|
+
* 结果:购买 3 份商品 A,coveredMinutes=90,totalPrice=15,
|
|
86
|
+
* lines 中会合并为一行:product_add_schedule_time=30,num=3
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* 示例 6:unlimited 可以覆盖任意目标时长,并参与价格比较。
|
|
90
|
+
* ```
|
|
91
|
+
* target = 180
|
|
92
|
+
* 商品 A: min=30, max=120, unit=30, price=10
|
|
93
|
+
* 商品 B: unlimited=true, price=35
|
|
94
|
+
* 普通商品可以组合成 180m,例如 120m + 60m,总价 $60
|
|
95
|
+
* unlimited 商品固定 $35
|
|
96
|
+
* 结果:选择 unlimited 商品,coveredMinutes=180,totalPrice=35
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* 示例 7:unlimited 不一定优先,普通商品更便宜时选择普通商品。
|
|
100
|
+
* ```
|
|
101
|
+
* target = 60
|
|
102
|
+
* 商品 A: min=30, max=60, unit=30, price=10 => 60m/$20
|
|
103
|
+
* 商品 B: unlimited=true, price=50
|
|
104
|
+
* 结果:选择商品 A 的 60m 档位
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* 示例 8:价格相同,优先选择超出时长更少的方案。
|
|
108
|
+
* ```
|
|
109
|
+
* target = 51
|
|
110
|
+
* 商品 A: 60m/$20
|
|
111
|
+
* 商品 B: 90m/$20
|
|
112
|
+
* 结果:选择 60m,因为 overage=9,小于 90m 的 overage=39
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* 示例 9:价格和覆盖时长都相同,优先选择结果行数更少的方案。
|
|
116
|
+
* ```
|
|
117
|
+
* target = 60
|
|
118
|
+
* 商品 A: 60m/$20
|
|
119
|
+
* 商品 B: 30m/$10
|
|
120
|
+
* 商品 C: 30m/$10
|
|
121
|
+
* 结果:商品 A 单行方案和 B+C 两行方案价格、时长相同,选择商品 A
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* 示例 10:没有任何有效商品时返回 `NO_PRODUCTS`。
|
|
125
|
+
* ```
|
|
126
|
+
* target = 30
|
|
127
|
+
* products = []
|
|
128
|
+
* 结果:available=false,unavailableReason='NO_PRODUCTS'
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* 示例 11:有商品但没有可用候选时返回 `NO_COVERAGE`。
|
|
132
|
+
* ```
|
|
133
|
+
* target = 30
|
|
134
|
+
* 商品 A: price=0,或 minMinutes 缺失/无效
|
|
135
|
+
* 结果:available=false,unavailableReason='NO_COVERAGE'
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* 示例 12:目标时长小于等于 0 时无需购买。
|
|
139
|
+
* ```
|
|
140
|
+
* target = 0
|
|
141
|
+
* 结果:available=true,coveredMinutes=0,totalPrice=0,lines=[]
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
144
|
+
* 搜索边界:
|
|
145
|
+
* 有限档位只需要搜索到 `targetMinutes + maxFiniteCandidateMinutes`。
|
|
146
|
+
* 这里的 `maxFiniteCandidateMinutes` 是所有普通候选档位里的最大时长。
|
|
147
|
+
* 例如目标是 51 分钟,最大普通档位是 120 分钟,则只搜索到 171 分钟。
|
|
148
|
+
* 如果某个组合覆盖了 180 分钟,那么移除其中任意一个普通档位后,剩余时长
|
|
149
|
+
* 仍然有机会覆盖 51 分钟,而且价格一定不会更高,所以 180 分钟这个组合不
|
|
150
|
+
* 可能是最优解。
|
|
151
|
+
*/
|
|
152
|
+
export interface AddTimeProduct {
|
|
153
|
+
id: string | number;
|
|
154
|
+
title?: string;
|
|
155
|
+
price: number;
|
|
156
|
+
minMinutes?: number;
|
|
157
|
+
maxMinutes?: number;
|
|
158
|
+
unitMinutes?: number;
|
|
159
|
+
unlimited?: boolean;
|
|
160
|
+
_originalProduct?: unknown;
|
|
161
|
+
}
|
|
162
|
+
export interface AddTimePlanLine {
|
|
163
|
+
product_id: string | number;
|
|
164
|
+
product_title?: string;
|
|
165
|
+
product_add_schedule_time: number;
|
|
166
|
+
num: number;
|
|
167
|
+
price: number;
|
|
168
|
+
_originalProduct?: unknown;
|
|
169
|
+
}
|
|
170
|
+
export interface AddTimePlan {
|
|
171
|
+
available: boolean;
|
|
172
|
+
unavailableReason?: 'NO_PRODUCTS' | 'NO_COVERAGE';
|
|
173
|
+
targetMinutes: number;
|
|
174
|
+
coveredMinutes: number;
|
|
175
|
+
totalPrice: number;
|
|
176
|
+
lines: AddTimePlanLine[];
|
|
177
|
+
}
|
|
178
|
+
interface AddTimeCandidate extends AddTimePlanLine {
|
|
179
|
+
totalPrice: number;
|
|
180
|
+
unlimited?: boolean;
|
|
181
|
+
}
|
|
182
|
+
export declare const ADD_TIME_UNIT_MINUTES: readonly [10, 15, 20, 30, 45, 60];
|
|
183
|
+
export declare function buildAddTimeCandidates(products: AddTimeProduct[]): AddTimeCandidate[];
|
|
184
|
+
export declare function resolveBestAddTimePlan(products: AddTimeProduct[], targetMinutes: number): AddTimePlan;
|
|
185
|
+
export {};
|