@pisell/pisellos 2.3.73 → 2.3.75
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/core/index.d.ts +7 -0
- package/dist/core/index.js +111 -71
- package/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/model/strategy/adapter/walletPass/example.js +3 -26
- package/dist/model/strategy/strategy-example.js +5 -19
- package/dist/modules/Cart/index.js +0 -3
- package/dist/modules/Cart/utils/cartProduct.js +0 -1
- package/dist/modules/Date/index.js +1 -5
- package/dist/modules/Discount/index.js +2 -4
- package/dist/modules/OpenData/index.js +0 -2
- package/dist/modules/Order/index.d.ts +1 -1
- package/dist/modules/Order/index.js +36 -64
- package/dist/modules/Payment/index.js +97 -162
- package/dist/modules/Quotation/index.d.ts +6 -0
- package/dist/modules/Quotation/index.js +75 -19
- package/dist/modules/Rules/index.js +1 -4
- package/dist/modules/Schedule/index.js +0 -1
- package/dist/modules/Schedule/utils.js +0 -1
- package/dist/modules/Step/index.js +0 -1
- package/dist/plugins/request.d.ts +1 -0
- package/dist/plugins/request.js +1 -4
- package/dist/plugins/window.js +2 -6
- package/dist/server/index.d.ts +8 -2
- package/dist/server/index.js +303 -269
- package/dist/server/modules/floor-plan/index.d.ts +4 -0
- package/dist/server/modules/floor-plan/index.js +240 -98
- package/dist/server/modules/menu/index.js +75 -59
- package/dist/server/modules/order/index.d.ts +17 -7
- package/dist/server/modules/order/index.js +421 -211
- package/dist/server/modules/products/index.d.ts +8 -2
- package/dist/server/modules/products/index.js +191 -117
- package/dist/server/modules/quotation/index.js +29 -38
- package/dist/server/modules/resource/index.js +24 -17
- package/dist/server/modules/schedule/index.js +27 -35
- package/dist/server/utils/product.js +0 -1
- package/dist/solution/BaseSales/index.js +38 -41
- package/dist/solution/BookingByStep/index.d.ts +1 -1
- package/dist/solution/BookingByStep/index.js +7 -59
- package/dist/solution/BookingByStep/utils/capacity.js +1 -11
- package/dist/solution/BookingByStep/utils/resources.js +1 -3
- package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
- package/dist/solution/BookingTicket/index.js +0 -2
- package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +6 -7
- package/dist/solution/BookingTicket/utils/scan/handleScan.js +25 -31
- package/dist/solution/BookingTicket/utils/scan/index.js +6 -10
- package/dist/solution/BuyTickets/index.js +9 -12
- package/dist/solution/Checkout/index.js +177 -252
- package/dist/solution/Checkout/utils/index.js +4 -16
- package/dist/solution/RegisterAndLogin/index.js +30 -76
- package/dist/solution/ScanOrder/index.js +50 -60
- package/dist/solution/ShopDiscount/index.js +2 -7
- package/dist/solution/VenueBooking/index.js +45 -55
- package/dist/utils/task.js +15 -18
- package/dist/utils/watch.js +0 -1
- package/lib/apis/picoding.js +2 -0
- package/lib/core/index.d.ts +7 -0
- package/lib/core/index.js +149 -131
- package/lib/effects/index.js +46 -57
- package/lib/index.js +82 -49
- package/lib/model/index.js +14 -21
- package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
- package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
- package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
- package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
- package/lib/model/strategy/adapter/index.js +100 -64
- package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
- package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
- package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
- package/lib/model/strategy/adapter/itemRule/index.js +83 -57
- package/lib/model/strategy/adapter/itemRule/type.js +97 -36
- package/lib/model/strategy/adapter/promotion/adapter.js +91 -69
- package/lib/model/strategy/adapter/promotion/evaluator.js +444 -310
- package/lib/model/strategy/adapter/promotion/examples.js +222 -234
- package/lib/model/strategy/adapter/promotion/index.js +1 -0
- package/lib/model/strategy/adapter/promotion/type.js +243 -36
- package/lib/model/strategy/adapter/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -150
- package/lib/model/strategy/adapter/walletPass/example.js +217 -190
- package/lib/model/strategy/adapter/walletPass/index.js +75 -51
- package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
- package/lib/model/strategy/adapter/walletPass/type.js +4 -16
- package/lib/model/strategy/adapter/walletPass/utils.js +588 -378
- package/lib/model/strategy/engine.js +270 -168
- package/lib/model/strategy/index.js +49 -34
- package/lib/model/strategy/strategy-example.js +243 -239
- package/lib/model/strategy/type.js +100 -40
- package/lib/modules/Account/index.js +39 -53
- package/lib/modules/Account/types.js +20 -33
- package/lib/modules/AccountList/index.js +116 -154
- package/lib/modules/AccountList/types.js +30 -31
- package/lib/modules/AccountList/utils.js +18 -30
- package/lib/modules/BaseModule.js +23 -42
- package/lib/modules/BookingContext/index.js +158 -136
- package/lib/modules/BookingContext/types.js +46 -32
- package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +138 -146
- package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +78 -83
- package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +170 -150
- package/lib/modules/BookingContext/utils/flexible.js +38 -55
- package/lib/modules/BookingContext/utils/formatResourceList.js +19 -34
- package/lib/modules/BookingContext/utils/index.js +124 -41
- package/lib/modules/BookingContext/utils/noResource.js +58 -70
- package/lib/modules/BookingContext/utils/orderLineDisplay.js +14 -41
- package/lib/modules/BookingContext/utils/productExtend.js +202 -155
- package/lib/modules/BookingContext/utils/resourceErrors.js +53 -53
- package/lib/modules/BookingContext/utils/resourceSelection.js +19 -41
- package/lib/modules/BookingContext/utils/resources.js +209 -167
- package/lib/modules/BookingContext/utils/serviceTimes.js +115 -116
- package/lib/modules/BookingContext/utils/timeSlices.js +76 -86
- package/lib/modules/Cart/index.js +170 -124
- package/lib/modules/Cart/types.js +46 -51
- package/lib/modules/Cart/utils/cartAccount.js +40 -39
- package/lib/modules/Cart/utils/cartDate.js +56 -61
- package/lib/modules/Cart/utils/cartDiscount.js +28 -33
- package/lib/modules/Cart/utils/cartNote.js +27 -32
- package/lib/modules/Cart/utils/cartProduct.js +321 -251
- package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
- package/lib/modules/Cart/utils/cartResource.js +70 -78
- package/lib/modules/Cart/utils/changePrice.js +22 -50
- package/lib/modules/Cart/utils/index.js +106 -48
- package/lib/modules/Customer/constants.js +13 -34
- package/lib/modules/Customer/index.js +235 -172
- package/lib/modules/Customer/types.js +38 -35
- package/lib/modules/Date/index.js +116 -115
- package/lib/modules/Date/types.js +16 -28
- package/lib/modules/Date/utils.js +174 -123
- package/lib/modules/Discount/index.js +122 -127
- package/lib/modules/Discount/types.js +9 -31
- package/lib/modules/Guests/index.js +30 -56
- package/lib/modules/Guests/types.js +23 -33
- package/lib/modules/Holder/index.js +209 -189
- package/lib/modules/Holder/types.js +4 -16
- package/lib/modules/Holder/utils.js +20 -49
- package/lib/modules/OpenData/index.js +70 -76
- package/lib/modules/OpenData/types.js +4 -16
- package/lib/modules/OpenData/utils.js +44 -78
- package/lib/modules/Order/index.d.ts +1 -1
- package/lib/modules/Order/index.js +1713 -2118
- package/lib/modules/Order/payment-utils.js +77 -120
- package/lib/modules/Order/types.js +88 -35
- package/lib/modules/Order/utils/bundleDiscountHydration.js +41 -74
- package/lib/modules/Order/utils/discountProductLineIdentity.js +142 -100
- package/lib/modules/Order/utils/manualProductDiscount.js +124 -123
- package/lib/modules/Order/utils/orderCollectionIdentity.js +184 -244
- package/lib/modules/Order/utils.js +814 -647
- package/lib/modules/Payment/cash.js +20 -33
- package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
- package/lib/modules/Payment/eftpos.js +16 -30
- package/lib/modules/Payment/index.js +532 -399
- package/lib/modules/Payment/mx51.js +1 -0
- package/lib/modules/Payment/types.js +230 -108
- package/lib/modules/Payment/utils.js +52 -51
- package/lib/modules/Payment/walletpass.js +485 -660
- package/lib/modules/Product/index.js +51 -46
- package/lib/modules/Product/types.js +4 -16
- package/lib/modules/Product/utils.js +32 -33
- package/lib/modules/ProductList/index.js +113 -123
- package/lib/modules/ProductList/types.js +9 -31
- package/lib/modules/Quotation/index.d.ts +6 -0
- package/lib/modules/Quotation/index.js +110 -103
- package/lib/modules/Quotation/types.js +4 -16
- package/lib/modules/Resource/index.js +27 -59
- package/lib/modules/Resource/types.js +22 -32
- package/lib/modules/Resource/utils.js +30 -38
- package/lib/modules/ResourcePlanner/index.js +25 -23
- package/lib/modules/ResourcePlanner/localClock.js +54 -119
- package/lib/modules/ResourcePlanner/planner.js +589 -770
- package/lib/modules/ResourcePlanner/types.js +10 -29
- package/lib/modules/Rules/index.js +1218 -959
- package/lib/modules/Rules/types.js +17 -40
- package/lib/modules/SalesSummary/index.js +85 -90
- package/lib/modules/SalesSummary/types.js +4 -16
- package/lib/modules/SalesSummary/utils.js +355 -430
- package/lib/modules/ScanOrderLogger/index.js +59 -79
- package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
- package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
- package/lib/modules/ScanOrderLogger/types.js +4 -16
- package/lib/modules/Schedule/getDateIsInSchedule.js +334 -163
- package/lib/modules/Schedule/index.js +100 -114
- package/lib/modules/Schedule/type.js +4 -16
- package/lib/modules/Schedule/types.js +4 -16
- package/lib/modules/Schedule/utils.js +433 -291
- package/lib/modules/Step/index.js +40 -52
- package/lib/modules/Step/tyeps.js +4 -16
- package/lib/modules/Summary/index.js +66 -71
- package/lib/modules/Summary/types.js +4 -16
- package/lib/modules/Summary/utils.js +773 -418
- package/lib/modules/SurchargeList/index.js +46 -60
- package/lib/modules/SurchargeList/types.js +4 -16
- package/lib/modules/index.js +245 -63
- package/lib/plugins/app.js +4 -16
- package/lib/plugins/index.js +36 -25
- package/lib/plugins/request.d.ts +1 -0
- package/lib/plugins/request.js +137 -126
- package/lib/plugins/shopStore.js +4 -16
- package/lib/plugins/user.js +4 -16
- package/lib/plugins/window.js +171 -179
- package/lib/server/index.d.ts +8 -2
- package/lib/server/index.js +3083 -2663
- package/lib/server/modules/floor-plan/index.d.ts +4 -0
- package/lib/server/modules/floor-plan/index.js +159 -127
- package/lib/server/modules/floor-plan/types.js +15 -30
- package/lib/server/modules/index.js +106 -68
- package/lib/server/modules/menu/index.js +170 -124
- package/lib/server/modules/menu/types.js +18 -31
- package/lib/server/modules/order/index.d.ts +17 -7
- package/lib/server/modules/order/index.js +916 -977
- package/lib/server/modules/order/types.js +122 -33
- package/lib/server/modules/order/utils/filterBookings.js +219 -194
- package/lib/server/modules/order/utils/filterOrders.js +118 -92
- package/lib/server/modules/payment/index.js +59 -83
- package/lib/server/modules/payment/types.js +4 -16
- package/lib/server/modules/products/index.d.ts +8 -2
- package/lib/server/modules/products/index.js +656 -471
- package/lib/server/modules/products/types.js +44 -34
- package/lib/server/modules/quotation/index.js +137 -172
- package/lib/server/modules/quotation/types.js +21 -31
- package/lib/server/modules/resource/index.js +225 -186
- package/lib/server/modules/resource/types.js +42 -33
- package/lib/server/modules/schedule/index.js +135 -123
- package/lib/server/modules/schedule/types.js +14 -21
- package/lib/server/modules/schedule/utils.js +334 -163
- package/lib/server/types.js +4 -16
- package/lib/server/utils/index.js +25 -23
- package/lib/server/utils/product.js +196 -139
- package/lib/server/utils/schedule.js +34 -41
- package/lib/server/utils/small-ticket.js +479 -456
- package/lib/server/utils/time.js +40 -49
- package/lib/solution/BaseSales/index.js +1186 -1410
- package/lib/solution/BaseSales/types.js +42 -38
- package/lib/solution/BaseSales/utils/cartPromotion.js +642 -498
- package/lib/solution/BaseSales/utils/parseSalesResponse.js +85 -105
- package/lib/solution/BaseSales/utils/quotationPrice.js +56 -114
- package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +108 -145
- package/lib/solution/BaseSales/utils.js +158 -143
- package/lib/solution/BookingByStep/index.d.ts +1 -1
- package/lib/solution/BookingByStep/index.js +1527 -1340
- package/lib/solution/BookingByStep/types.js +40 -99
- package/lib/solution/BookingByStep/utils/capacity.js +192 -160
- package/lib/solution/BookingByStep/utils/products.js +42 -52
- package/lib/solution/BookingByStep/utils/resources.js +527 -330
- package/lib/solution/BookingByStep/utils/stock.js +65 -44
- package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
- package/lib/solution/BookingTicket/index.js +607 -522
- package/lib/solution/BookingTicket/types.js +99 -77
- package/lib/solution/BookingTicket/utils/addProductDecision.js +226 -189
- package/lib/solution/BookingTicket/utils/addTimeAvailability.js +58 -89
- package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -78
- package/lib/solution/BookingTicket/utils/cartView.js +114 -99
- package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
- package/lib/solution/BookingTicket/utils/orderCustomer.js +18 -41
- package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +219 -86
- package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +168 -116
- package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +79 -91
- package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +54 -41
- package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -81
- package/lib/solution/BookingTicket/utils/scan/index.js +98 -104
- package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
- package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +52 -64
- package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +56 -58
- package/lib/solution/BookingTicket/utils/weighingProductSku.js +34 -48
- package/lib/solution/BuyTickets/index.js +67 -70
- package/lib/solution/BuyTickets/types.js +22 -38
- package/lib/solution/Checkout/index.js +1451 -1158
- package/lib/solution/Checkout/types.js +91 -61
- package/lib/solution/Checkout/utils/index.js +228 -156
- package/lib/solution/PlaceOrder/index.js +55 -0
- package/lib/solution/RegisterAndLogin/config.js +493 -460
- package/lib/solution/RegisterAndLogin/index.js +633 -630
- package/lib/solution/RegisterAndLogin/types.js +189 -76
- package/lib/solution/RegisterAndLogin/utils.js +183 -125
- package/lib/solution/Sales/index.js +328 -324
- package/lib/solution/Sales/types.js +27 -33
- package/lib/solution/ScanOrder/index.js +832 -864
- package/lib/solution/ScanOrder/types.js +33 -34
- package/lib/solution/ScanOrder/utils.js +409 -374
- package/lib/solution/ShopDiscount/index.js +226 -232
- package/lib/solution/ShopDiscount/types.js +15 -37
- package/lib/solution/ShopDiscount/utils.js +300 -172
- package/lib/solution/UnifiedBookingSales/index.js +1035 -1201
- package/lib/solution/UnifiedBookingSales/remoteOccupancyCache.js +99 -159
- package/lib/solution/UnifiedBookingSales/types.js +10 -32
- package/lib/solution/VenueBooking/index.js +811 -879
- package/lib/solution/VenueBooking/types.js +19 -39
- package/lib/solution/VenueBooking/utils/dateSummary.js +27 -56
- package/lib/solution/VenueBooking/utils/resource.js +31 -54
- package/lib/solution/VenueBooking/utils/slotMerge.js +94 -107
- package/lib/solution/VenueBooking/utils/timeSlot.js +132 -132
- package/lib/solution/VenueBooking/utils.js +130 -67
- package/lib/solution/index.js +124 -41
- package/lib/store/createStore.js +32 -29
- package/lib/types/index.js +4 -16
- package/lib/utils/payment-number.js +26 -46
- package/lib/utils/task.js +36 -36
- package/lib/utils/watch.js +81 -47
- package/package.json +2 -1
|
@@ -1,145 +1,129 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
"use strict";
|
|
18
2
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
__export(parseSalesResponse_exports, {
|
|
22
|
-
parseSalesResponse: () => parseSalesResponse
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
23
5
|
});
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"email",
|
|
45
|
-
"is_price_include_tax",
|
|
46
|
-
"tax_title",
|
|
47
|
-
"tax_country_code",
|
|
48
|
-
"currency_code",
|
|
49
|
-
"currency_symbol",
|
|
50
|
-
"currency_format",
|
|
51
|
-
"is_deposit",
|
|
52
|
-
"deposit_amount",
|
|
53
|
-
"shop_discount",
|
|
54
|
-
"surcharge_fee",
|
|
55
|
-
"note",
|
|
56
|
-
"schedule_date",
|
|
57
|
-
"created_at",
|
|
58
|
-
"updated_at",
|
|
59
|
-
"metadata",
|
|
60
|
-
"total_amount",
|
|
61
|
-
"shop_id",
|
|
62
|
-
"create_date",
|
|
63
|
-
"holder",
|
|
64
|
-
"relation_forms",
|
|
65
|
-
"contacts",
|
|
66
|
-
"contacts_info"
|
|
67
|
-
];
|
|
6
|
+
exports.parseSalesResponse = parseSalesResponse;
|
|
7
|
+
var _orderCollectionIdentity = require("../../../modules/Order/utils/orderCollectionIdentity");
|
|
8
|
+
/**
|
|
9
|
+
* 把 `/order/sales/{id}` 响应(OrderData)解析为 ISalesDetail。
|
|
10
|
+
*
|
|
11
|
+
* - 纯函数:不依赖任何运行时模块/插件,便于单测与 view-model 适配
|
|
12
|
+
* - products 保留 tempOrder / 后端详情原字段,仅规范化集合身份并浅拷贝,避免丢失 product_sku 等协议字段
|
|
13
|
+
* - bookings 平铺保留服务端原顺序,同时输出 byProductUid 反查表与 rootBooking
|
|
14
|
+
* - header 收敛"非数组顶层字段",便于 ticketBooking view-model 直接消费
|
|
15
|
+
*
|
|
16
|
+
* 设计原则参考 `.cursor/rules/data-field-semantics.mdc`:
|
|
17
|
+
* - 字段命名以《统一 Sales 数据协议》为准(OrderData 类型)
|
|
18
|
+
* - root booking 以 `parent_id === 0` 判定,沿用 ticketBooking 现有约定
|
|
19
|
+
* (`packages/private-materials/src/components/ticketBooking/index.tsx`:
|
|
20
|
+
* `booking.parent_id === 0 ? 'list' : 'detail'`)
|
|
21
|
+
* - 不在此处发明等价关系;UI 侧(ticketBooking)若需要别的字段,由 view-model 适配层做转换
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** OrderData 中除大数组外的"顶层 header 字段"白名单,按需扩展。 */
|
|
25
|
+
const HEADER_KEYS = ['order_id', 'order_number', 'shop_order_number', 'shop_full_order_number', 'type', 'business_code', 'platform', 'sales_channel', 'order_sales_channel', 'vouchers', 'status', 'payment_status', 'shipping_status', 'customer_id', 'customer_name', 'country_calling_code', 'phone', 'email', 'is_price_include_tax', 'tax_title', 'tax_country_code', 'currency_code', 'currency_symbol', 'currency_format', 'is_deposit', 'deposit_amount', 'shop_discount', 'surcharge_fee', 'note', 'schedule_date', 'created_at', 'updated_at', 'metadata', 'total_amount', 'shop_id', 'create_date', 'holder', 'relation_forms', 'contacts', 'contacts_info'];
|
|
68
26
|
function pickHeader(raw) {
|
|
69
|
-
const header = {
|
|
70
|
-
|
|
71
|
-
|
|
27
|
+
const header = {
|
|
28
|
+
order_id: raw?.order_id ?? null
|
|
29
|
+
};
|
|
30
|
+
if (!raw || typeof raw !== 'object') return header;
|
|
72
31
|
for (const key of HEADER_KEYS) {
|
|
73
|
-
if (raw[key] !==
|
|
74
|
-
header[key] = raw[key];
|
|
32
|
+
if (raw[key] !== undefined) header[key] = raw[key];
|
|
75
33
|
}
|
|
76
34
|
return header;
|
|
77
35
|
}
|
|
78
36
|
function pickCustomer(raw) {
|
|
79
|
-
if (!raw || typeof raw !==
|
|
80
|
-
return null;
|
|
37
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
81
38
|
const explicit = raw.customer;
|
|
82
|
-
if (explicit && typeof explicit ===
|
|
39
|
+
if (explicit && typeof explicit === 'object') {
|
|
83
40
|
return {
|
|
84
41
|
id: explicit.id ?? raw.customer_id ?? null,
|
|
85
|
-
name: explicit.name ?? raw.customer_name ??
|
|
42
|
+
name: explicit.name ?? raw.customer_name ?? '',
|
|
86
43
|
phone: explicit.phone ?? raw.phone,
|
|
87
44
|
email: explicit.email ?? raw.email,
|
|
88
45
|
country_calling_code: explicit.country_calling_code ?? raw.country_calling_code,
|
|
89
46
|
...explicit
|
|
90
47
|
};
|
|
91
48
|
}
|
|
92
|
-
if (raw.customer_id == null && !raw.customer_name)
|
|
93
|
-
return null;
|
|
49
|
+
if (raw.customer_id == null && !raw.customer_name) return null;
|
|
94
50
|
return {
|
|
95
51
|
id: raw.customer_id ?? null,
|
|
96
|
-
name: raw.customer_name ??
|
|
52
|
+
name: raw.customer_name ?? '',
|
|
97
53
|
phone: raw.phone,
|
|
98
54
|
email: raw.email,
|
|
99
55
|
country_calling_code: raw.country_calling_code
|
|
100
56
|
};
|
|
101
57
|
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 判定根 booking。沿用 ticketBooking 现有约定:
|
|
61
|
+
* `parent_id === 0` 视为根;其余为子(item_type === 'recurring_booking' 也按 parent_id 判定)。
|
|
62
|
+
* 见 `packages/private-materials/src/components/ticketBooking/index.tsx`:
|
|
63
|
+
* `type: booking.parent_id === 0 ? 'list' : 'detail'`。
|
|
64
|
+
*/
|
|
102
65
|
function isRootBooking(booking) {
|
|
103
|
-
if (!booking || typeof booking !==
|
|
104
|
-
return false;
|
|
66
|
+
if (!booking || typeof booking !== 'object') return false;
|
|
105
67
|
const parentId = booking.parent_id;
|
|
106
|
-
if (parentId === 0 || parentId === null || parentId ===
|
|
107
|
-
return true;
|
|
68
|
+
if (parentId === 0 || parentId === null || parentId === undefined) return true;
|
|
108
69
|
return false;
|
|
109
70
|
}
|
|
110
71
|
function indexBookingsByProductUid(bookings) {
|
|
111
|
-
var _a;
|
|
112
72
|
const result = {};
|
|
113
73
|
for (const b of bookings) {
|
|
114
|
-
const uid = b && (b.product_uid ||
|
|
115
|
-
if (!uid)
|
|
116
|
-
continue;
|
|
74
|
+
const uid = b && (b.product_uid || b.metadata?.product_uid) || '';
|
|
75
|
+
if (!uid) continue;
|
|
117
76
|
const key = String(uid);
|
|
118
|
-
if (!result[key])
|
|
119
|
-
result[key] = [];
|
|
77
|
+
if (!result[key]) result[key] = [];
|
|
120
78
|
result[key].push(b);
|
|
121
79
|
}
|
|
122
80
|
return result;
|
|
123
81
|
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 将 `/order/sales/{id}` 响应解析为 ISalesDetail。
|
|
85
|
+
*
|
|
86
|
+
* 注意:
|
|
87
|
+
* - 入参允许是 `{ data: OrderData }` 或直接 `OrderData`,自动识别。
|
|
88
|
+
* - products/bookings/payments 在此补齐集合身份;其余 runtime 字段由 OrderModule hydrate 负责。
|
|
89
|
+
* - 不做远程请求;不修改入参;返回新对象。
|
|
90
|
+
*/
|
|
124
91
|
function parseSalesResponse(input) {
|
|
125
|
-
const sourceRaw = input && typeof input ===
|
|
126
|
-
const raw = (0,
|
|
127
|
-
const productsRaw = Array.isArray(raw
|
|
128
|
-
const products = productsRaw.map(
|
|
129
|
-
const row = {
|
|
130
|
-
|
|
92
|
+
const sourceRaw = input && typeof input === 'object' && input.data && input.order_id == null ? input.data : input || {};
|
|
93
|
+
const raw = (0, _orderCollectionIdentity.normalizeOrderCollections)(sourceRaw).order;
|
|
94
|
+
const productsRaw = Array.isArray(raw?.products) ? raw.products : [];
|
|
95
|
+
const products = productsRaw.map(p => {
|
|
96
|
+
const row = {
|
|
97
|
+
...(p || {})
|
|
98
|
+
};
|
|
99
|
+
const metadata = row.metadata && typeof row.metadata === 'object' ? {
|
|
100
|
+
...row.metadata
|
|
101
|
+
} : {};
|
|
131
102
|
delete metadata.price_schema_version;
|
|
132
103
|
delete row.identity_key;
|
|
133
|
-
return {
|
|
104
|
+
return {
|
|
105
|
+
...row,
|
|
106
|
+
metadata
|
|
107
|
+
};
|
|
134
108
|
});
|
|
135
|
-
const bookingsRaw = Array.isArray(raw
|
|
136
|
-
const bookings = bookingsRaw.map(
|
|
109
|
+
const bookingsRaw = Array.isArray(raw?.bookings) ? raw.bookings : [];
|
|
110
|
+
const bookings = bookingsRaw.map(b => ({
|
|
111
|
+
...(b || {})
|
|
112
|
+
}));
|
|
137
113
|
const rootBooking = bookings.find(isRootBooking) || null;
|
|
138
114
|
const bookingsByProductUid = indexBookingsByProductUid(bookings);
|
|
139
|
-
const payments = Array.isArray(raw
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const
|
|
115
|
+
const payments = Array.isArray(raw?.payments) ? raw.payments.map(p => ({
|
|
116
|
+
...(p || {})
|
|
117
|
+
})) : [];
|
|
118
|
+
const surcharges = Array.isArray(raw?.surcharges) ? raw.surcharges.map(s => ({
|
|
119
|
+
...(s || {})
|
|
120
|
+
})) : [];
|
|
121
|
+
const discount_list = Array.isArray(raw?.discount_list) ? raw.discount_list.map(d => ({
|
|
122
|
+
...(d || {})
|
|
123
|
+
})) : [];
|
|
124
|
+
const summary = raw?.summary && typeof raw.summary === 'object' ? {
|
|
125
|
+
...raw.summary
|
|
126
|
+
} : {};
|
|
143
127
|
return {
|
|
144
128
|
header: pickHeader(raw),
|
|
145
129
|
products,
|
|
@@ -153,8 +137,4 @@ function parseSalesResponse(input) {
|
|
|
153
137
|
summary,
|
|
154
138
|
raw
|
|
155
139
|
};
|
|
156
|
-
}
|
|
157
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
158
|
-
0 && (module.exports = {
|
|
159
|
-
parseSalesResponse
|
|
160
|
-
});
|
|
140
|
+
}
|
|
@@ -1,132 +1,78 @@
|
|
|
1
|
-
|
|
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);
|
|
1
|
+
"use strict";
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
__export(quotationPrice_exports, {
|
|
32
|
-
calculateBaseSalesProductBookingPrice: () => calculateBaseSalesProductBookingPrice
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
33
5
|
});
|
|
34
|
-
|
|
35
|
-
var
|
|
36
|
-
var
|
|
6
|
+
exports.calculateBaseSalesProductBookingPrice = calculateBaseSalesProductBookingPrice;
|
|
7
|
+
var _dayjs = _interopRequireDefault(require("dayjs"));
|
|
8
|
+
var _decimal = _interopRequireDefault(require("decimal.js"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
10
|
function toFiniteNumber(value, fallback = 0) {
|
|
38
11
|
const parsedValue = Number(value);
|
|
39
|
-
if (!Number.isFinite(parsedValue))
|
|
40
|
-
return fallback;
|
|
12
|
+
if (!Number.isFinite(parsedValue)) return fallback;
|
|
41
13
|
return parsedValue;
|
|
42
14
|
}
|
|
43
15
|
function toPositiveInt(value, fallback = 1) {
|
|
44
16
|
const parsedValue = Math.floor(Number(value));
|
|
45
|
-
if (!Number.isFinite(parsedValue) || parsedValue < 1)
|
|
46
|
-
return fallback;
|
|
17
|
+
if (!Number.isFinite(parsedValue) || parsedValue < 1) return fallback;
|
|
47
18
|
return parsedValue;
|
|
48
19
|
}
|
|
49
20
|
function toPriceString(value) {
|
|
50
|
-
return new
|
|
21
|
+
return new _decimal.default(Number(value) || 0).toDecimalPlaces(2).toFixed(2);
|
|
51
22
|
}
|
|
52
23
|
function normalizeDateTime(value) {
|
|
53
|
-
if (typeof value !==
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
if (!datetime.isValid())
|
|
58
|
-
return null;
|
|
24
|
+
if (typeof value !== 'string' || !value.trim()) return null;
|
|
25
|
+
const normalized = value.includes(':') ? value : `${value} 00:00:00`;
|
|
26
|
+
const datetime = (0, _dayjs.default)(normalized);
|
|
27
|
+
if (!datetime.isValid()) return null;
|
|
59
28
|
return datetime;
|
|
60
29
|
}
|
|
61
30
|
function buildBookingDateTime(date, time) {
|
|
62
|
-
if (typeof date !==
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
if (!datetime.isValid())
|
|
67
|
-
return null;
|
|
31
|
+
if (typeof date !== 'string' || !date.trim()) return null;
|
|
32
|
+
const timeText = typeof time === 'string' && time.trim() ? time.trim() : '00:00';
|
|
33
|
+
const datetime = (0, _dayjs.default)(`${date.trim()} ${timeText}`);
|
|
34
|
+
if (!datetime.isValid()) return null;
|
|
68
35
|
return datetime;
|
|
69
36
|
}
|
|
70
37
|
function getDurationUnit(type) {
|
|
71
|
-
const normalizedType = String(type ||
|
|
72
|
-
if (normalizedType ===
|
|
73
|
-
|
|
74
|
-
if (normalizedType === "minute" || normalizedType === "minutes")
|
|
75
|
-
return "minute";
|
|
38
|
+
const normalizedType = String(type || '').toLowerCase();
|
|
39
|
+
if (normalizedType === 'day' || normalizedType === 'days') return 'day';
|
|
40
|
+
if (normalizedType === 'minute' || normalizedType === 'minutes') return 'minute';
|
|
76
41
|
return null;
|
|
77
42
|
}
|
|
78
43
|
function getProductId(product) {
|
|
79
44
|
const productId = toFiniteNumber(product.product_id ?? product.id, NaN);
|
|
80
|
-
if (!Number.isFinite(productId))
|
|
81
|
-
return null;
|
|
45
|
+
if (!Number.isFinite(productId)) return null;
|
|
82
46
|
return productId;
|
|
83
47
|
}
|
|
84
48
|
function getProductVariantId(product) {
|
|
85
|
-
const variantId = toFiniteNumber(
|
|
86
|
-
|
|
87
|
-
0
|
|
88
|
-
);
|
|
89
|
-
if (!Number.isFinite(variantId) || variantId <= 0)
|
|
90
|
-
return void 0;
|
|
49
|
+
const variantId = toFiniteNumber(product.product_variant_id ?? product.variant_id, 0);
|
|
50
|
+
if (!Number.isFinite(variantId) || variantId <= 0) return undefined;
|
|
91
51
|
return variantId;
|
|
92
52
|
}
|
|
93
53
|
function getFallbackPrice(params) {
|
|
94
54
|
const product = params.product || {};
|
|
95
|
-
return toPriceString(
|
|
96
|
-
params.fallback_price ?? product.price ?? product.selling_price ?? product.original_price ?? 0
|
|
97
|
-
);
|
|
55
|
+
return toPriceString(params.fallback_price ?? product.price ?? product.selling_price ?? product.original_price ?? 0);
|
|
98
56
|
}
|
|
99
57
|
function getProductQuantity(product) {
|
|
100
58
|
return toPositiveInt(product.num ?? product.quantity, 1);
|
|
101
59
|
}
|
|
102
60
|
function getBundleProductId(bundle) {
|
|
103
|
-
const productId = toFiniteNumber(
|
|
104
|
-
|
|
105
|
-
NaN
|
|
106
|
-
);
|
|
107
|
-
if (!Number.isFinite(productId))
|
|
108
|
-
return null;
|
|
61
|
+
const productId = toFiniteNumber(bundle.bundle_product_id ?? bundle._bundle_product_id, NaN);
|
|
62
|
+
if (!Number.isFinite(productId)) return null;
|
|
109
63
|
return productId;
|
|
110
64
|
}
|
|
111
65
|
function getBundleVariantId(bundle) {
|
|
112
|
-
const variantId = toFiniteNumber(
|
|
113
|
-
|
|
114
|
-
0
|
|
115
|
-
);
|
|
116
|
-
if (!Number.isFinite(variantId) || variantId <= 0)
|
|
117
|
-
return void 0;
|
|
66
|
+
const variantId = toFiniteNumber(bundle.bundle_variant_id ?? bundle.variant_id, 0);
|
|
67
|
+
if (!Number.isFinite(variantId) || variantId <= 0) return undefined;
|
|
118
68
|
return variantId;
|
|
119
69
|
}
|
|
120
70
|
function getBundleFallbackPrice(bundle) {
|
|
121
|
-
return toPriceString(
|
|
122
|
-
bundle.bundle_selling_price ?? bundle.price ?? bundle.original_price ?? bundle.base_price ?? 0
|
|
123
|
-
);
|
|
71
|
+
return toPriceString(bundle.bundle_selling_price ?? bundle.price ?? bundle.original_price ?? bundle.base_price ?? 0);
|
|
124
72
|
}
|
|
125
73
|
function shouldSplitByDuration(duration, start, end) {
|
|
126
|
-
if (!duration)
|
|
127
|
-
|
|
128
|
-
if (!start || !end || !end.isAfter(start))
|
|
129
|
-
return false;
|
|
74
|
+
if (!duration) return false;
|
|
75
|
+
if (!start || !end || !end.isAfter(start)) return false;
|
|
130
76
|
const unit = getDurationUnit(duration.type);
|
|
131
77
|
const value = toFiniteNumber(duration.value);
|
|
132
78
|
return !!unit && value > 0;
|
|
@@ -135,29 +81,33 @@ function buildTimeSegments(params) {
|
|
|
135
81
|
const booking = params.booking || {};
|
|
136
82
|
const explicitDatetime = normalizeDateTime(params.datetime);
|
|
137
83
|
const bookingStart = buildBookingDateTime(booking.start_date, booking.start_time);
|
|
138
|
-
const start = bookingStart || explicitDatetime || (0,
|
|
84
|
+
const start = bookingStart || explicitDatetime || (0, _dayjs.default)();
|
|
139
85
|
const bookingEnd = buildBookingDateTime(booking.end_date, booking.end_time);
|
|
140
86
|
if (!shouldSplitByDuration(params.duration, start, bookingEnd)) {
|
|
141
|
-
return [{
|
|
87
|
+
return [{
|
|
88
|
+
start
|
|
89
|
+
}];
|
|
142
90
|
}
|
|
143
91
|
const unit = getDurationUnit(params.duration.type);
|
|
144
92
|
const value = toFiniteNumber(params.duration.value);
|
|
145
93
|
const segments = [];
|
|
146
94
|
let cursor = start;
|
|
147
95
|
let guard = 0;
|
|
148
|
-
while (cursor.isBefore(bookingEnd) && guard <
|
|
96
|
+
while (cursor.isBefore(bookingEnd) && guard < 10000) {
|
|
149
97
|
const next = cursor.add(value, unit);
|
|
150
98
|
segments.push({
|
|
151
99
|
start: cursor,
|
|
152
|
-
end: next.isBefore(bookingEnd) ? next : bookingEnd ??
|
|
100
|
+
end: next.isBefore(bookingEnd) ? next : bookingEnd ?? undefined
|
|
153
101
|
});
|
|
154
102
|
cursor = next;
|
|
155
103
|
guard += 1;
|
|
156
104
|
}
|
|
157
|
-
return segments.length ? segments : [{
|
|
105
|
+
return segments.length ? segments : [{
|
|
106
|
+
start
|
|
107
|
+
}];
|
|
158
108
|
}
|
|
159
109
|
function formatTimePoint(datetime) {
|
|
160
|
-
return datetime.format(
|
|
110
|
+
return datetime.format('YYYY-MM-DD HH:mm:ss');
|
|
161
111
|
}
|
|
162
112
|
function buildPriceSegment(params) {
|
|
163
113
|
const timePoint = formatTimePoint(params.segment.start);
|
|
@@ -176,7 +126,7 @@ function buildPriceSegment(params) {
|
|
|
176
126
|
customer_id: params.customerId
|
|
177
127
|
}) : null;
|
|
178
128
|
const unitPrice = toPriceString(quotedPrice ?? params.fallbackPrice);
|
|
179
|
-
const quotationShelfId = quotedPrice !== null ?
|
|
129
|
+
const quotationShelfId = quotedPrice !== null ? match?.quotationShelfId ?? (params.quotation && params.productId !== null ? params.quotation.getQuotationShelfId({
|
|
180
130
|
productId: params.productId,
|
|
181
131
|
variantId: params.variantId,
|
|
182
132
|
datetime: timePoint,
|
|
@@ -185,18 +135,17 @@ function buildPriceSegment(params) {
|
|
|
185
135
|
}) : 0) : 0;
|
|
186
136
|
return {
|
|
187
137
|
start_datetime: timePoint,
|
|
188
|
-
end_datetime: params.segment.end ? formatTimePoint(params.segment.end) :
|
|
138
|
+
end_datetime: params.segment.end ? formatTimePoint(params.segment.end) : undefined,
|
|
189
139
|
time_point: timePoint,
|
|
190
140
|
unit_price: unitPrice,
|
|
191
141
|
quantity: 1,
|
|
192
142
|
total_price: unitPrice,
|
|
193
143
|
quotation_shelf_id: quotationShelfId,
|
|
194
|
-
source: quotedPrice !== null ?
|
|
144
|
+
source: quotedPrice !== null ? 'quotation' : 'fallback'
|
|
195
145
|
};
|
|
196
146
|
}
|
|
197
147
|
function calculatePriceForProduct(params) {
|
|
198
|
-
|
|
199
|
-
const segments = params.segments.map((segment) => buildPriceSegment({
|
|
148
|
+
const segments = params.segments.map(segment => buildPriceSegment({
|
|
200
149
|
quotation: params.quotation,
|
|
201
150
|
productId: params.productId,
|
|
202
151
|
variantId: params.variantId,
|
|
@@ -205,12 +154,9 @@ function calculatePriceForProduct(params) {
|
|
|
205
154
|
fallbackPrice: params.fallbackPrice,
|
|
206
155
|
segment
|
|
207
156
|
}));
|
|
208
|
-
const unitPrice = segments.reduce(
|
|
209
|
-
(total, segment) => total.plus(segment.total_price),
|
|
210
|
-
new import_decimal.default(0)
|
|
211
|
-
);
|
|
157
|
+
const unitPrice = segments.reduce((total, segment) => total.plus(segment.total_price), new _decimal.default(0));
|
|
212
158
|
const totalPrice = unitPrice.times(params.quantity);
|
|
213
|
-
const quotationShelfId =
|
|
159
|
+
const quotationShelfId = segments.find(segment => segment.quotation_shelf_id)?.quotation_shelf_id || 0;
|
|
214
160
|
return {
|
|
215
161
|
unitPrice,
|
|
216
162
|
totalPrice,
|
|
@@ -219,11 +165,9 @@ function calculatePriceForProduct(params) {
|
|
|
219
165
|
};
|
|
220
166
|
}
|
|
221
167
|
function calculateBundlePrices(params, segments) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return void 0;
|
|
226
|
-
return bundleList.map((bundle) => {
|
|
168
|
+
const bundleList = params.product?.product_bundle || [];
|
|
169
|
+
if (!bundleList.length) return undefined;
|
|
170
|
+
return bundleList.map(bundle => {
|
|
227
171
|
const productId = getBundleProductId(bundle);
|
|
228
172
|
const variantId = getBundleVariantId(bundle);
|
|
229
173
|
const quantity = getProductQuantity(bundle);
|
|
@@ -247,7 +191,7 @@ function calculateBundlePrices(params, segments) {
|
|
|
247
191
|
total_price: price.totalPrice.toDecimalPlaces(2).toFixed(2),
|
|
248
192
|
quantity,
|
|
249
193
|
quotation_shelf_id: price.quotationShelfId,
|
|
250
|
-
source: price.segments.some(
|
|
194
|
+
source: price.segments.some(segment => segment.source === 'quotation') ? 'quotation' : 'fallback',
|
|
251
195
|
segments: price.segments
|
|
252
196
|
};
|
|
253
197
|
});
|
|
@@ -280,10 +224,8 @@ function calculateBaseSalesProductBookingPrice(params) {
|
|
|
280
224
|
duration: params.duration,
|
|
281
225
|
quotation_shelf_id: price.quotationShelfId,
|
|
282
226
|
segments: price.segments,
|
|
283
|
-
...bundlePrices ? {
|
|
227
|
+
...(bundlePrices ? {
|
|
228
|
+
product_bundle: bundlePrices
|
|
229
|
+
} : {})
|
|
284
230
|
};
|
|
285
|
-
}
|
|
286
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
287
|
-
0 && (module.exports = {
|
|
288
|
-
calculateBaseSalesProductBookingPrice
|
|
289
|
-
});
|
|
231
|
+
}
|