@pisell/pisellos 0.0.567 → 0.0.569

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.
Files changed (557) hide show
  1. package/dist/core/index.js +6 -9
  2. package/dist/model/strategy/adapter/promotion/evaluator.js +3 -2
  3. package/dist/model/strategy/adapter/walletPass/evaluator.js +0 -2
  4. package/dist/model/strategy/adapter/walletPass/example.js +3 -26
  5. package/dist/model/strategy/adapter/walletPass/utils.js +7 -7
  6. package/dist/model/strategy/strategy-example.js +5 -19
  7. package/dist/modules/BaseModule.d.ts +2 -2
  8. package/dist/modules/BaseModule.js +4 -4
  9. package/dist/modules/BookingContext/index.d.ts +48 -0
  10. package/dist/modules/BookingContext/index.js +566 -0
  11. package/dist/modules/BookingContext/types.d.ts +102 -0
  12. package/dist/modules/BookingContext/types.js +51 -0
  13. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  14. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +302 -0
  15. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  16. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +149 -0
  17. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  18. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +249 -0
  19. package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
  20. package/dist/modules/BookingContext/utils/flexible.js +56 -0
  21. package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  22. package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
  23. package/dist/modules/BookingContext/utils/index.d.ts +11 -0
  24. package/dist/modules/BookingContext/utils/index.js +11 -0
  25. package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
  26. package/dist/modules/BookingContext/utils/noResource.js +77 -0
  27. package/dist/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  28. package/dist/modules/BookingContext/utils/orderLineDisplay.js +36 -0
  29. package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
  30. package/dist/modules/BookingContext/utils/productExtend.js +339 -0
  31. package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  32. package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
  33. package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  34. package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
  35. package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
  36. package/dist/modules/BookingContext/utils/resources.js +486 -0
  37. package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  38. package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
  39. package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  40. package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
  41. package/dist/modules/Cart/index.js +0 -3
  42. package/dist/modules/Cart/utils/cartProduct.js +26 -6
  43. package/dist/modules/Cart/utils/changePrice.js +27 -20
  44. package/dist/modules/Customer/index.d.ts +20 -0
  45. package/dist/modules/Customer/index.js +172 -83
  46. package/dist/modules/Customer/types.d.ts +2 -0
  47. package/dist/modules/Date/index.js +1 -5
  48. package/dist/modules/Discount/index.d.ts +2 -1
  49. package/dist/modules/Discount/index.js +37 -12
  50. package/dist/modules/Discount/types.d.ts +1 -0
  51. package/dist/modules/OpenData/index.d.ts +8 -0
  52. package/dist/modules/OpenData/index.js +35 -17
  53. package/dist/modules/Order/index.d.ts +449 -24
  54. package/dist/modules/Order/index.js +5437 -608
  55. package/dist/modules/Order/types.d.ts +693 -88
  56. package/dist/modules/Order/types.js +68 -1
  57. package/dist/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  58. package/dist/modules/Order/utils/bundleDiscountHydration.js +144 -0
  59. package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  60. package/dist/modules/Order/utils/manualProductDiscount.js +210 -0
  61. package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +53 -0
  62. package/dist/modules/Order/utils/orderCollectionIdentity.js +405 -0
  63. package/dist/modules/Order/utils.d.ts +167 -18
  64. package/dist/modules/Order/utils.js +960 -165
  65. package/dist/modules/Payment/index.d.ts +10 -9
  66. package/dist/modules/Payment/index.js +508 -874
  67. package/dist/modules/Payment/types.d.ts +40 -16
  68. package/dist/modules/Payment/utils.d.ts +1 -1
  69. package/dist/modules/Payment/utils.js +4 -3
  70. package/dist/modules/Payment/walletpass.js +48 -34
  71. package/dist/modules/Product/types.d.ts +29 -7
  72. package/dist/modules/ProductList/index.d.ts +17 -13
  73. package/dist/modules/ProductList/index.js +184 -74
  74. package/dist/modules/ProductList/types.d.ts +17 -0
  75. package/dist/modules/Quotation/index.d.ts +22 -2
  76. package/dist/modules/Quotation/index.js +108 -42
  77. package/dist/modules/Quotation/types.d.ts +19 -0
  78. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  79. package/dist/modules/ResourcePlanner/index.js +181 -0
  80. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  81. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  82. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  83. package/dist/modules/ResourcePlanner/types.js +1 -0
  84. package/dist/modules/Rules/index.d.ts +8 -10
  85. package/dist/modules/Rules/index.js +219 -114
  86. package/dist/modules/Rules/types.d.ts +14 -3
  87. package/dist/modules/SalesSummary/index.d.ts +23 -26
  88. package/dist/modules/SalesSummary/index.js +152 -46
  89. package/dist/modules/SalesSummary/types.d.ts +9 -1
  90. package/dist/modules/SalesSummary/utils.d.ts +3 -22
  91. package/dist/modules/SalesSummary/utils.js +803 -163
  92. package/dist/modules/Schedule/getDateIsInSchedule.js +14 -7
  93. package/dist/modules/Schedule/index.d.ts +18 -5
  94. package/dist/modules/Schedule/index.js +78 -24
  95. package/dist/modules/Schedule/types.d.ts +2 -0
  96. package/dist/modules/Schedule/utils.js +0 -1
  97. package/dist/modules/Step/index.js +0 -1
  98. package/dist/modules/Summary/index.js +4 -3
  99. package/dist/modules/SurchargeList/index.d.ts +18 -0
  100. package/dist/modules/SurchargeList/index.js +185 -0
  101. package/dist/modules/SurchargeList/types.d.ts +15 -0
  102. package/dist/modules/SurchargeList/types.js +1 -0
  103. package/dist/modules/index.d.ts +3 -0
  104. package/dist/modules/index.js +4 -1
  105. package/dist/plugins/app.d.ts +2 -0
  106. package/dist/plugins/request.d.ts +1 -0
  107. package/dist/plugins/request.js +1 -4
  108. package/dist/plugins/window.js +2 -6
  109. package/dist/server/index.d.ts +462 -8
  110. package/dist/server/index.js +6137 -714
  111. package/dist/server/modules/floor-plan/index.d.ts +39 -0
  112. package/dist/server/modules/floor-plan/index.js +595 -0
  113. package/dist/server/modules/floor-plan/types.d.ts +43 -0
  114. package/dist/server/modules/floor-plan/types.js +13 -0
  115. package/dist/server/modules/index.d.ts +7 -2
  116. package/dist/server/modules/index.js +6 -0
  117. package/dist/server/modules/menu/index.js +32 -41
  118. package/dist/server/modules/order/index.d.ts +207 -14
  119. package/dist/server/modules/order/index.js +2326 -379
  120. package/dist/server/modules/order/types.d.ts +76 -5
  121. package/dist/server/modules/order/types.js +14 -1
  122. package/dist/server/modules/order/utils/filterBookings.d.ts +7 -1
  123. package/dist/server/modules/order/utils/filterBookings.js +118 -11
  124. package/dist/server/modules/order/utils/filterOrders.js +242 -14
  125. package/dist/server/modules/payment/index.d.ts +28 -0
  126. package/dist/server/modules/payment/index.js +305 -0
  127. package/dist/server/modules/payment/types.d.ts +9 -0
  128. package/dist/server/modules/payment/types.js +1 -0
  129. package/dist/server/modules/products/index.d.ts +105 -14
  130. package/dist/server/modules/products/index.js +1397 -540
  131. package/dist/server/modules/products/types.d.ts +34 -1
  132. package/dist/server/modules/products/types.js +4 -0
  133. package/dist/server/modules/quotation/index.d.ts +39 -0
  134. package/dist/server/modules/quotation/index.js +289 -86
  135. package/dist/server/modules/resource/index.d.ts +2 -3
  136. package/dist/server/modules/resource/index.js +105 -84
  137. package/dist/server/modules/schedule/index.d.ts +6 -4
  138. package/dist/server/modules/schedule/index.js +137 -114
  139. package/dist/server/test.json +713 -0
  140. package/dist/server/types.d.ts +2 -0
  141. package/dist/server/utils/product.js +2 -3
  142. package/dist/server/utils/small-ticket.d.ts +71 -0
  143. package/dist/server/utils/small-ticket.js +963 -0
  144. package/dist/solution/BaseSales/index.d.ts +378 -0
  145. package/dist/solution/BaseSales/index.js +4006 -0
  146. package/dist/solution/BaseSales/types.d.ts +394 -0
  147. package/dist/solution/BaseSales/types.js +40 -0
  148. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  149. package/dist/solution/BaseSales/utils/cartPromotion.js +1450 -0
  150. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +144 -0
  151. package/dist/solution/BaseSales/utils/parseSalesResponse.js +157 -0
  152. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +18 -0
  153. package/dist/solution/BaseSales/utils/quotationPrice.js +250 -0
  154. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +63 -0
  155. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +218 -0
  156. package/dist/solution/BaseSales/utils.d.ts +40 -0
  157. package/dist/solution/BaseSales/utils.js +263 -0
  158. package/dist/solution/BookingByStep/index.js +7 -59
  159. package/dist/solution/BookingByStep/utils/capacity.js +1 -11
  160. package/dist/solution/BookingByStep/utils/resources.js +1 -3
  161. package/dist/solution/BookingByStep/utils/timeslots.js +2 -43
  162. package/dist/solution/BookingTicket/index.d.ts +393 -24
  163. package/dist/solution/BookingTicket/index.js +2506 -445
  164. package/dist/solution/BookingTicket/types.d.ts +191 -6
  165. package/dist/solution/BookingTicket/types.js +83 -10
  166. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  167. package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
  168. package/dist/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  169. package/dist/solution/BookingTicket/utils/addTimeAvailability.js +95 -0
  170. package/dist/solution/BookingTicket/utils/bookingStatus.d.ts +77 -0
  171. package/dist/solution/BookingTicket/utils/bookingStatus.js +136 -0
  172. package/dist/solution/BookingTicket/utils/cartView.d.ts +29 -0
  173. package/dist/solution/BookingTicket/utils/cartView.js +209 -0
  174. package/dist/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  175. package/dist/solution/BookingTicket/utils/exampleData.js +183 -0
  176. package/dist/solution/BookingTicket/utils/orderCustomer.d.ts +4 -0
  177. package/dist/solution/BookingTicket/utils/orderCustomer.js +31 -0
  178. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  179. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.js +438 -0
  180. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  181. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +400 -0
  182. package/dist/solution/BookingTicket/utils/scan/cloudSearch.d.ts +4 -0
  183. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +41 -1
  184. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  185. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +56 -0
  186. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  187. package/dist/solution/BookingTicket/utils/scan/handleScan.js +36 -34
  188. package/dist/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  189. package/dist/solution/BookingTicket/utils/scan/index.js +26 -18
  190. package/dist/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  191. package/dist/solution/BookingTicket/utils/scan/scanProductValues.js +150 -0
  192. package/dist/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  193. package/dist/solution/BookingTicket/utils/sessionCatalogStale.js +78 -0
  194. package/dist/solution/BuyTickets/index.js +9 -12
  195. package/dist/solution/Checkout/index.d.ts +1 -0
  196. package/dist/solution/Checkout/index.js +199 -277
  197. package/dist/solution/Checkout/utils/index.js +8 -20
  198. package/dist/solution/RegisterAndLogin/config.js +2 -10
  199. package/dist/solution/RegisterAndLogin/index.js +30 -76
  200. package/dist/solution/Sales/index.d.ts +50 -5
  201. package/dist/solution/Sales/index.js +484 -92
  202. package/dist/solution/Sales/types.d.ts +26 -2
  203. package/dist/solution/ScanOrder/index.d.ts +27 -21
  204. package/dist/solution/ScanOrder/index.js +509 -454
  205. package/dist/solution/ScanOrder/types.d.ts +33 -11
  206. package/dist/solution/ScanOrder/types.js +4 -5
  207. package/dist/solution/ScanOrder/utils.d.ts +4 -1
  208. package/dist/solution/ScanOrder/utils.js +109 -34
  209. package/dist/solution/ShopDiscount/index.js +6 -11
  210. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  211. package/dist/solution/UnifiedBookingSales/index.js +1871 -0
  212. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  213. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  214. package/dist/solution/VenueBooking/index.d.ts +34 -20
  215. package/dist/solution/VenueBooking/index.js +630 -505
  216. package/dist/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  217. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +6 -0
  218. package/dist/solution/VenueBooking/utils/slotMerge.js +9 -3
  219. package/dist/solution/index.d.ts +2 -0
  220. package/dist/solution/index.js +3 -1
  221. package/dist/types/index.d.ts +11 -1
  222. package/dist/utils/task.js +15 -18
  223. package/dist/utils/watch.js +0 -1
  224. package/lib/apis/picoding.js +2 -0
  225. package/lib/core/index.js +130 -131
  226. package/lib/effects/index.js +46 -57
  227. package/lib/index.js +92 -53
  228. package/lib/model/index.js +14 -21
  229. package/lib/model/strategy/adapter/dataVariant/adapter.js +38 -50
  230. package/lib/model/strategy/adapter/dataVariant/evaluator.js +162 -236
  231. package/lib/model/strategy/adapter/dataVariant/examples.js +229 -237
  232. package/lib/model/strategy/adapter/dataVariant/index.js +39 -34
  233. package/lib/model/strategy/adapter/dataVariant/type.js +57 -28
  234. package/lib/model/strategy/adapter/index.js +100 -64
  235. package/lib/model/strategy/adapter/itemRule/adapter.js +156 -144
  236. package/lib/model/strategy/adapter/itemRule/evaluator.js +36 -48
  237. package/lib/model/strategy/adapter/itemRule/examples.js +295 -225
  238. package/lib/model/strategy/adapter/itemRule/index.js +83 -57
  239. package/lib/model/strategy/adapter/itemRule/type.js +97 -36
  240. package/lib/model/strategy/adapter/promotion/adapter.js +84 -63
  241. package/lib/model/strategy/adapter/promotion/evaluator.js +383 -232
  242. package/lib/model/strategy/adapter/promotion/examples.js +139 -159
  243. package/lib/model/strategy/adapter/promotion/index.js +1 -49
  244. package/lib/model/strategy/adapter/promotion/type.js +199 -35
  245. package/lib/model/strategy/adapter/type.js +4 -16
  246. package/lib/model/strategy/adapter/walletPass/evaluator.js +180 -152
  247. package/lib/model/strategy/adapter/walletPass/example.js +217 -190
  248. package/lib/model/strategy/adapter/walletPass/index.js +75 -51
  249. package/lib/model/strategy/adapter/walletPass/locales.js +36 -58
  250. package/lib/model/strategy/adapter/walletPass/type.js +4 -16
  251. package/lib/model/strategy/adapter/walletPass/utils.js +654 -402
  252. package/lib/model/strategy/engine.js +270 -168
  253. package/lib/model/strategy/index.js +49 -34
  254. package/lib/model/strategy/strategy-example.js +243 -239
  255. package/lib/model/strategy/type.js +100 -40
  256. package/lib/modules/Account/index.js +39 -53
  257. package/lib/modules/Account/types.js +20 -33
  258. package/lib/modules/AccountList/index.js +116 -154
  259. package/lib/modules/AccountList/types.js +30 -31
  260. package/lib/modules/AccountList/utils.js +18 -30
  261. package/lib/modules/BaseModule.d.ts +2 -2
  262. package/lib/modules/BaseModule.js +26 -49
  263. package/lib/modules/BookingContext/index.d.ts +48 -0
  264. package/lib/modules/BookingContext/index.js +390 -0
  265. package/lib/modules/BookingContext/types.d.ts +102 -0
  266. package/lib/modules/BookingContext/types.js +48 -0
  267. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  268. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +286 -0
  269. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  270. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +148 -0
  271. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  272. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +242 -0
  273. package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
  274. package/lib/modules/BookingContext/utils/flexible.js +63 -0
  275. package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  276. package/lib/modules/BookingContext/utils/formatResourceList.js +35 -0
  277. package/lib/modules/BookingContext/utils/index.d.ts +11 -0
  278. package/lib/modules/BookingContext/utils/index.js +126 -0
  279. package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
  280. package/lib/modules/BookingContext/utils/noResource.js +78 -0
  281. package/lib/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  282. package/lib/modules/BookingContext/utils/orderLineDisplay.js +29 -0
  283. package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
  284. package/lib/modules/BookingContext/utils/productExtend.js +330 -0
  285. package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  286. package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
  287. package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  288. package/lib/modules/BookingContext/utils/resourceSelection.js +24 -0
  289. package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
  290. package/lib/modules/BookingContext/utils/resources.js +419 -0
  291. package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  292. package/lib/modules/BookingContext/utils/serviceTimes.js +161 -0
  293. package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  294. package/lib/modules/BookingContext/utils/timeSlices.js +114 -0
  295. package/lib/modules/Cart/index.js +170 -124
  296. package/lib/modules/Cart/types.js +46 -51
  297. package/lib/modules/Cart/utils/cartAccount.js +40 -39
  298. package/lib/modules/Cart/utils/cartDate.js +56 -61
  299. package/lib/modules/Cart/utils/cartDiscount.js +28 -33
  300. package/lib/modules/Cart/utils/cartNote.js +27 -32
  301. package/lib/modules/Cart/utils/cartProduct.js +331 -244
  302. package/lib/modules/Cart/utils/cartRelationForms.js +29 -35
  303. package/lib/modules/Cart/utils/cartResource.js +72 -78
  304. package/lib/modules/Cart/utils/changePrice.js +37 -67
  305. package/lib/modules/Cart/utils/index.js +106 -48
  306. package/lib/modules/Customer/constants.js +13 -34
  307. package/lib/modules/Customer/index.d.ts +20 -0
  308. package/lib/modules/Customer/index.js +270 -154
  309. package/lib/modules/Customer/types.d.ts +2 -0
  310. package/lib/modules/Customer/types.js +38 -35
  311. package/lib/modules/Date/index.js +116 -115
  312. package/lib/modules/Date/types.js +16 -28
  313. package/lib/modules/Date/utils.js +174 -123
  314. package/lib/modules/Discount/index.d.ts +2 -1
  315. package/lib/modules/Discount/index.js +133 -113
  316. package/lib/modules/Discount/types.d.ts +1 -0
  317. package/lib/modules/Discount/types.js +9 -31
  318. package/lib/modules/Guests/index.js +30 -56
  319. package/lib/modules/Guests/types.js +23 -33
  320. package/lib/modules/Holder/index.js +209 -189
  321. package/lib/modules/Holder/types.js +4 -16
  322. package/lib/modules/Holder/utils.js +20 -49
  323. package/lib/modules/OpenData/index.d.ts +8 -0
  324. package/lib/modules/OpenData/index.js +81 -74
  325. package/lib/modules/OpenData/types.js +4 -16
  326. package/lib/modules/OpenData/utils.js +44 -78
  327. package/lib/modules/Order/index.d.ts +449 -24
  328. package/lib/modules/Order/index.js +3834 -489
  329. package/lib/modules/Order/types.d.ts +693 -88
  330. package/lib/modules/Order/types.js +78 -33
  331. package/lib/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  332. package/lib/modules/Order/utils/bundleDiscountHydration.js +106 -0
  333. package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  334. package/lib/modules/Order/utils/manualProductDiscount.js +207 -0
  335. package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +53 -0
  336. package/lib/modules/Order/utils/orderCollectionIdentity.js +353 -0
  337. package/lib/modules/Order/utils.d.ts +167 -18
  338. package/lib/modules/Order/utils.js +1247 -345
  339. package/lib/modules/Payment/cash.js +20 -33
  340. package/lib/modules/Payment/cashRecommendationAlgorithm.js +145 -76
  341. package/lib/modules/Payment/eftpos.js +16 -30
  342. package/lib/modules/Payment/index.d.ts +10 -9
  343. package/lib/modules/Payment/index.js +542 -502
  344. package/lib/modules/Payment/mx51.js +1 -0
  345. package/lib/modules/Payment/types.d.ts +40 -16
  346. package/lib/modules/Payment/types.js +216 -107
  347. package/lib/modules/Payment/utils.d.ts +1 -1
  348. package/lib/modules/Payment/utils.js +53 -49
  349. package/lib/modules/Payment/walletpass.js +231 -203
  350. package/lib/modules/Product/index.js +51 -46
  351. package/lib/modules/Product/types.d.ts +29 -7
  352. package/lib/modules/Product/types.js +4 -16
  353. package/lib/modules/Product/utils.js +32 -33
  354. package/lib/modules/ProductList/index.d.ts +17 -13
  355. package/lib/modules/ProductList/index.js +160 -118
  356. package/lib/modules/ProductList/types.d.ts +17 -0
  357. package/lib/modules/ProductList/types.js +9 -31
  358. package/lib/modules/Quotation/index.d.ts +22 -2
  359. package/lib/modules/Quotation/index.js +123 -89
  360. package/lib/modules/Quotation/types.d.ts +19 -0
  361. package/lib/modules/Quotation/types.js +4 -16
  362. package/lib/modules/Resource/index.js +27 -59
  363. package/lib/modules/Resource/types.js +22 -32
  364. package/lib/modules/Resource/utils.js +30 -38
  365. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  366. package/lib/modules/ResourcePlanner/index.js +147 -0
  367. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  368. package/lib/modules/ResourcePlanner/planner.js +895 -0
  369. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  370. package/lib/modules/ResourcePlanner/types.js +5 -0
  371. package/lib/modules/Rules/index.d.ts +8 -10
  372. package/lib/modules/Rules/index.js +1286 -894
  373. package/lib/modules/Rules/types.d.ts +14 -3
  374. package/lib/modules/Rules/types.js +17 -40
  375. package/lib/modules/SalesSummary/index.d.ts +23 -26
  376. package/lib/modules/SalesSummary/index.js +130 -71
  377. package/lib/modules/SalesSummary/types.d.ts +9 -1
  378. package/lib/modules/SalesSummary/types.js +4 -16
  379. package/lib/modules/SalesSummary/utils.d.ts +3 -22
  380. package/lib/modules/SalesSummary/utils.js +738 -250
  381. package/lib/modules/ScanOrderLogger/index.js +59 -79
  382. package/lib/modules/ScanOrderLogger/providers/feishu.js +54 -78
  383. package/lib/modules/ScanOrderLogger/providers/grafana.js +13 -36
  384. package/lib/modules/ScanOrderLogger/types.js +4 -16
  385. package/lib/modules/Schedule/getDateIsInSchedule.js +345 -171
  386. package/lib/modules/Schedule/index.d.ts +18 -5
  387. package/lib/modules/Schedule/index.js +139 -114
  388. package/lib/modules/Schedule/type.js +4 -16
  389. package/lib/modules/Schedule/types.d.ts +2 -0
  390. package/lib/modules/Schedule/types.js +4 -16
  391. package/lib/modules/Schedule/utils.js +433 -291
  392. package/lib/modules/Step/index.js +40 -52
  393. package/lib/modules/Step/tyeps.js +4 -16
  394. package/lib/modules/Summary/index.js +66 -70
  395. package/lib/modules/Summary/types.js +4 -16
  396. package/lib/modules/Summary/utils.js +782 -429
  397. package/lib/modules/SurchargeList/index.d.ts +18 -0
  398. package/lib/modules/SurchargeList/index.js +95 -0
  399. package/lib/modules/SurchargeList/types.d.ts +15 -0
  400. package/lib/modules/SurchargeList/types.js +5 -0
  401. package/lib/modules/index.d.ts +3 -0
  402. package/lib/modules/index.js +245 -57
  403. package/lib/plugins/app.d.ts +2 -0
  404. package/lib/plugins/app.js +4 -16
  405. package/lib/plugins/index.js +36 -25
  406. package/lib/plugins/request.d.ts +1 -0
  407. package/lib/plugins/request.js +137 -126
  408. package/lib/plugins/shopStore.js +4 -16
  409. package/lib/plugins/user.js +4 -16
  410. package/lib/plugins/window.js +171 -179
  411. package/lib/server/index.d.ts +462 -8
  412. package/lib/server/index.js +4668 -713
  413. package/lib/server/modules/floor-plan/index.d.ts +39 -0
  414. package/lib/server/modules/floor-plan/index.js +306 -0
  415. package/lib/server/modules/floor-plan/types.d.ts +43 -0
  416. package/lib/server/modules/floor-plan/types.js +19 -0
  417. package/lib/server/modules/index.d.ts +7 -2
  418. package/lib/server/modules/index.js +106 -59
  419. package/lib/server/modules/menu/index.js +146 -122
  420. package/lib/server/modules/menu/types.js +18 -31
  421. package/lib/server/modules/order/index.d.ts +207 -14
  422. package/lib/server/modules/order/index.js +1463 -316
  423. package/lib/server/modules/order/types.d.ts +76 -5
  424. package/lib/server/modules/order/types.js +117 -32
  425. package/lib/server/modules/order/utils/filterBookings.d.ts +7 -1
  426. package/lib/server/modules/order/utils/filterBookings.js +288 -146
  427. package/lib/server/modules/order/utils/filterOrders.js +318 -64
  428. package/lib/server/modules/payment/index.d.ts +28 -0
  429. package/lib/server/modules/payment/index.js +168 -0
  430. package/lib/server/modules/payment/types.d.ts +9 -0
  431. package/lib/server/modules/payment/types.js +5 -0
  432. package/lib/server/modules/products/index.d.ts +105 -14
  433. package/lib/server/modules/products/index.js +969 -383
  434. package/lib/server/modules/products/types.d.ts +34 -1
  435. package/lib/server/modules/products/types.js +44 -34
  436. package/lib/server/modules/quotation/index.d.ts +39 -0
  437. package/lib/server/modules/quotation/index.js +220 -77
  438. package/lib/server/modules/quotation/types.js +21 -31
  439. package/lib/server/modules/resource/index.d.ts +2 -3
  440. package/lib/server/modules/resource/index.js +269 -214
  441. package/lib/server/modules/resource/types.js +42 -33
  442. package/lib/server/modules/schedule/index.d.ts +6 -4
  443. package/lib/server/modules/schedule/index.js +158 -132
  444. package/lib/server/modules/schedule/types.js +14 -21
  445. package/lib/server/modules/schedule/utils.js +334 -163
  446. package/lib/server/test.json +713 -0
  447. package/lib/server/types.d.ts +2 -0
  448. package/lib/server/types.js +4 -16
  449. package/lib/server/utils/index.js +25 -23
  450. package/lib/server/utils/product.js +197 -140
  451. package/lib/server/utils/schedule.js +34 -41
  452. package/lib/server/utils/small-ticket.d.ts +71 -0
  453. package/lib/server/utils/small-ticket.js +926 -0
  454. package/lib/server/utils/time.js +40 -49
  455. package/lib/solution/BaseSales/index.d.ts +378 -0
  456. package/lib/solution/BaseSales/index.js +2367 -0
  457. package/lib/solution/BaseSales/types.d.ts +394 -0
  458. package/lib/solution/BaseSales/types.js +47 -0
  459. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  460. package/lib/solution/BaseSales/utils/cartPromotion.js +1155 -0
  461. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +144 -0
  462. package/lib/solution/BaseSales/utils/parseSalesResponse.js +140 -0
  463. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +18 -0
  464. package/lib/solution/BaseSales/utils/quotationPrice.js +231 -0
  465. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +63 -0
  466. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +215 -0
  467. package/lib/solution/BaseSales/utils.d.ts +40 -0
  468. package/lib/solution/BaseSales/utils.js +259 -0
  469. package/lib/solution/BookingByStep/index.js +1530 -1343
  470. package/lib/solution/BookingByStep/types.js +40 -99
  471. package/lib/solution/BookingByStep/utils/capacity.js +192 -160
  472. package/lib/solution/BookingByStep/utils/products.js +42 -52
  473. package/lib/solution/BookingByStep/utils/resources.js +527 -330
  474. package/lib/solution/BookingByStep/utils/stock.js +65 -44
  475. package/lib/solution/BookingByStep/utils/timeslots.js +129 -131
  476. package/lib/solution/BookingTicket/index.d.ts +393 -24
  477. package/lib/solution/BookingTicket/index.js +1459 -160
  478. package/lib/solution/BookingTicket/types.d.ts +191 -6
  479. package/lib/solution/BookingTicket/types.js +101 -66
  480. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  481. package/lib/solution/BookingTicket/utils/addProductDecision.js +353 -0
  482. package/lib/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  483. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +94 -0
  484. package/lib/solution/BookingTicket/utils/bookingStatus.d.ts +77 -0
  485. package/lib/solution/BookingTicket/utils/bookingStatus.js +136 -0
  486. package/lib/solution/BookingTicket/utils/cartView.d.ts +29 -0
  487. package/lib/solution/BookingTicket/utils/cartView.js +200 -0
  488. package/lib/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  489. package/lib/solution/BookingTicket/utils/exampleData.js +185 -0
  490. package/lib/solution/BookingTicket/utils/orderCustomer.d.ts +4 -0
  491. package/lib/solution/BookingTicket/utils/orderCustomer.js +35 -0
  492. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  493. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +387 -0
  494. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  495. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +220 -0
  496. package/lib/solution/BookingTicket/utils/scan/cloudSearch.d.ts +4 -0
  497. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +85 -80
  498. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  499. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +64 -0
  500. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  501. package/lib/solution/BookingTicket/utils/scan/handleScan.js +84 -80
  502. package/lib/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  503. package/lib/solution/BookingTicket/utils/scan/index.js +103 -95
  504. package/lib/solution/BookingTicket/utils/scan/scanCache.js +90 -43
  505. package/lib/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  506. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +115 -0
  507. package/lib/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  508. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +83 -0
  509. package/lib/solution/BuyTickets/index.js +67 -70
  510. package/lib/solution/BuyTickets/types.js +22 -38
  511. package/lib/solution/Checkout/index.d.ts +1 -0
  512. package/lib/solution/Checkout/index.js +1461 -1169
  513. package/lib/solution/Checkout/types.js +91 -61
  514. package/lib/solution/Checkout/utils/index.js +228 -159
  515. package/lib/solution/PlaceOrder/index.js +55 -0
  516. package/lib/solution/RegisterAndLogin/config.js +495 -470
  517. package/lib/solution/RegisterAndLogin/index.js +633 -630
  518. package/lib/solution/RegisterAndLogin/types.js +189 -76
  519. package/lib/solution/RegisterAndLogin/utils.js +183 -125
  520. package/lib/solution/Sales/index.d.ts +50 -5
  521. package/lib/solution/Sales/index.js +495 -220
  522. package/lib/solution/Sales/types.d.ts +26 -2
  523. package/lib/solution/Sales/types.js +27 -33
  524. package/lib/solution/ScanOrder/index.d.ts +27 -21
  525. package/lib/solution/ScanOrder/index.js +908 -904
  526. package/lib/solution/ScanOrder/types.d.ts +33 -11
  527. package/lib/solution/ScanOrder/types.js +33 -34
  528. package/lib/solution/ScanOrder/utils.d.ts +4 -1
  529. package/lib/solution/ScanOrder/utils.js +457 -344
  530. package/lib/solution/ShopDiscount/index.js +230 -236
  531. package/lib/solution/ShopDiscount/types.js +15 -37
  532. package/lib/solution/ShopDiscount/utils.js +309 -172
  533. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  534. package/lib/solution/UnifiedBookingSales/index.js +1050 -0
  535. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  536. package/lib/solution/UnifiedBookingSales/types.js +14 -0
  537. package/lib/solution/VenueBooking/index.d.ts +34 -20
  538. package/lib/solution/VenueBooking/index.js +982 -950
  539. package/lib/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  540. package/lib/solution/VenueBooking/types.js +20 -40
  541. package/lib/solution/VenueBooking/utils/dateSummary.js +22 -54
  542. package/lib/solution/VenueBooking/utils/resource.js +31 -54
  543. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +6 -0
  544. package/lib/solution/VenueBooking/utils/slotMerge.js +96 -108
  545. package/lib/solution/VenueBooking/utils/smartPricing.js +112 -100
  546. package/lib/solution/VenueBooking/utils/timeSlot.js +133 -132
  547. package/lib/solution/VenueBooking/utils.js +130 -67
  548. package/lib/solution/index.d.ts +2 -0
  549. package/lib/solution/index.js +124 -37
  550. package/lib/store/createStore.js +32 -29
  551. package/lib/types/index.d.ts +11 -1
  552. package/lib/types/index.js +4 -16
  553. package/lib/utils/task.js +36 -36
  554. package/lib/utils/watch.js +81 -47
  555. package/package.json +2 -1
  556. package/dist/solution/Checkout/appointmentDemo.json +0 -1
  557. package/lib/solution/Checkout/appointmentDemo.json +0 -1
@@ -1,13 +1,15 @@
1
- var _excluded = ["_origin", "identity_key"],
2
- _excluded2 = ["created_at", "summary", "surcharges"],
3
- _excluded3 = ["collect_pax", "table_occupancy_duration"];
1
+ var _excluded = ["custom_product_bundle_map_id"],
2
+ _excluded2 = ["unique_identification_number"],
3
+ _excluded3 = ["num", "surcharge_fee", "discount_amount", "discount_type", "discountway", "product_discount_reason", "discount_per"],
4
+ _excluded4 = ["_extend", "relation_id", "table_form_id", "resource_id", "summary", "lastOrderInfo", "paid_amount", "shop_id", "shop_note", "shop_service_type", "start_time", "customer", "discount_list", "tax_fee", "total_amount", "total_refund_amount", "create_date", "holder_id"],
5
+ _excluded5 = ["collect_pax", "table_occupancy_duration"];
4
6
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
5
7
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
7
8
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
9
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
10
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
11
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
11
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
14
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
15
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -20,6 +22,7 @@ import dayjs from "dayjs";
20
22
  import Decimal from 'decimal.js';
21
23
  import { getProductHolderConfig } from "../Holder/utils";
22
24
  import { buildProductLineFingerprint, createEmptySummary } from "../../solution/ScanOrder/utils";
25
+ import { createUuidV4 } from "./utils/orderCollectionIdentity";
23
26
  /**
24
27
  * 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
25
28
  *
@@ -43,13 +46,15 @@ export function composeLinePrice(params) {
43
46
  _step;
44
47
  try {
45
48
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
46
- var _ref, _item$original_price, _item$bundle_selling_, _ref2, _item$num;
49
+ var _ref, _item$num;
47
50
  var item = _step.value;
48
- var rawPrice = useOriginalBundle ? (_ref = (_item$original_price = item === null || item === void 0 ? void 0 : item.original_price) !== null && _item$original_price !== void 0 ? _item$original_price : item === null || item === void 0 ? void 0 : item.product_price) !== null && _ref !== void 0 ? _ref : item === null || item === void 0 ? void 0 : item.price : (_item$bundle_selling_ = item === null || item === void 0 ? void 0 : item.bundle_selling_price) !== null && _item$bundle_selling_ !== void 0 ? _item$bundle_selling_ : item === null || item === void 0 ? void 0 : item.price;
49
- var price = new Decimal(Number(rawPrice) || 0);
50
- var rawNum = (_ref2 = (_item$num = item === null || item === void 0 ? void 0 : item.num) !== null && _item$num !== void 0 ? _item$num : item === null || item === void 0 ? void 0 : item.quantity) !== null && _ref2 !== void 0 ? _ref2 : 1;
51
+ // markdown(减价)按带符号净额取减;markup/原价维持相加。
52
+ var signedUnit = getBundleSignedUnit(item, {
53
+ useOriginal: useOriginalBundle
54
+ });
55
+ var rawNum = (_ref = (_item$num = item === null || item === void 0 ? void 0 : item.num) !== null && _item$num !== void 0 ? _item$num : item === null || item === void 0 ? void 0 : item.quantity) !== null && _ref !== void 0 ? _ref : 1;
51
56
  var num = new Decimal(Number(rawNum) || 0);
52
- total = total.plus(price.times(num));
57
+ total = total.plus(signedUnit.times(num));
53
58
  }
54
59
  } catch (err) {
55
60
  _iterator.e(err);
@@ -59,9 +64,30 @@ export function composeLinePrice(params) {
59
64
  }
60
65
  return total.toDecimalPlaces(2).toFixed(2);
61
66
  }
67
+ export function normalizeProductSkuOptions(options) {
68
+ if (!Array.isArray(options)) return [];
69
+ return options.map(function (option) {
70
+ var _normalized$add_price;
71
+ var normalized = _objectSpread({}, option && _typeof(option) === 'object' ? option : {});
72
+ var addPrice = (_normalized$add_price = normalized.add_price) !== null && _normalized$add_price !== void 0 ? _normalized$add_price : normalized.price;
73
+ if (addPrice !== undefined) normalized.add_price = addPrice;
74
+ delete normalized.price;
75
+ return normalized;
76
+ });
77
+ }
78
+ export function ensureProductSku(product) {
79
+ var rawSku = product !== null && product !== void 0 && product.product_sku && _typeof(product.product_sku) === 'object' ? product.product_sku : {};
80
+ return _objectSpread(_objectSpread({}, rawSku), {}, {
81
+ option: normalizeProductSkuOptions(rawSku.option)
82
+ });
83
+ }
84
+ export function getProductSkuOptions(product) {
85
+ return ensureProductSku(product).option;
86
+ }
62
87
 
63
88
  /**
64
- * 计算 option 单价合计:Σ(option.price × option.num)。
89
+ * 计算 option 单价合计:Σ(option.add_price × option.num)。
90
+ * 兼容入参仍带旧 `price` 的调用方,但运行时归一化后只维护 `add_price`。
65
91
  * 在新语义 v2 下,main_product_original_price = source_product_price + 本函数结果。
66
92
  */
67
93
  export function sumOptionUnitPrice(options) {
@@ -71,8 +97,9 @@ export function sumOptionUnitPrice(options) {
71
97
  _step2;
72
98
  try {
73
99
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
100
+ var _opt$add_price;
74
101
  var opt = _step2.value;
75
- var price = new Decimal(Number(opt === null || opt === void 0 ? void 0 : opt.price) || 0);
102
+ var price = new Decimal(Number((_opt$add_price = opt === null || opt === void 0 ? void 0 : opt.add_price) !== null && _opt$add_price !== void 0 ? _opt$add_price : opt === null || opt === void 0 ? void 0 : opt.price) || 0);
76
103
  var num = new Decimal(Number(opt === null || opt === void 0 ? void 0 : opt.num) || 0);
77
104
  total = total.plus(price.times(num));
78
105
  }
@@ -83,6 +110,251 @@ export function sumOptionUnitPrice(options) {
83
110
  }
84
111
  return total;
85
112
  }
113
+ function getSafeOrderProductNum(num) {
114
+ var parsedNum = Number(num !== null && num !== void 0 ? num : 1);
115
+ if (!Number.isFinite(parsedNum) || parsedNum < 1) return 1;
116
+ return Math.floor(parsedNum);
117
+ }
118
+ function getOrderProductDepositUnitTotal(product) {
119
+ var _ref2;
120
+ var metadata = product.metadata || {};
121
+ var paymentPrice = metadata.main_product_attached_bundle_payment_price;
122
+ var mainSellingPrice = metadata.main_product_selling_price;
123
+ var fallbackPrice = product.selling_price;
124
+ return new Decimal(Number((_ref2 = paymentPrice !== null && paymentPrice !== void 0 ? paymentPrice : mainSellingPrice) !== null && _ref2 !== void 0 ? _ref2 : fallbackPrice) || 0);
125
+ }
126
+ function normalizeDepositProtocols(protocols) {
127
+ if (!Array.isArray(protocols)) return [];
128
+ return protocols.reduce(function (result, protocol) {
129
+ var id = Number(protocol === null || protocol === void 0 ? void 0 : protocol.id);
130
+ if (!Number.isFinite(id)) return result;
131
+ result.push({
132
+ id: Math.floor(id),
133
+ title: String((protocol === null || protocol === void 0 ? void 0 : protocol.title) || '')
134
+ });
135
+ return result;
136
+ }, []);
137
+ }
138
+ function getDepositPolicyIds(depositData) {
139
+ var ids = [].concat(_toConsumableArray(Array.isArray(depositData === null || depositData === void 0 ? void 0 : depositData.self_deposit_policy_ids) ? depositData.self_deposit_policy_ids : []), _toConsumableArray(Array.isArray(depositData === null || depositData === void 0 ? void 0 : depositData.deposit_policy_ids) ? depositData.deposit_policy_ids : []));
140
+ return ids.reduce(function (result, id) {
141
+ var normalizedId = Number(id);
142
+ if (!Number.isFinite(normalizedId)) return result;
143
+ result.push(Math.floor(normalizedId));
144
+ return result;
145
+ }, []);
146
+ }
147
+ function handleOrderProductDeposit(params) {
148
+ var depositData = params.depositData,
149
+ total = params.total,
150
+ num = params.num;
151
+ if (!depositData) return {
152
+ result: false,
153
+ depositTotal: new Decimal(0)
154
+ };
155
+ var deposit_fixed = depositData.deposit_fixed,
156
+ deposit_percentage = depositData.deposit_percentage;
157
+ if (typeof deposit_fixed !== 'string' || typeof deposit_percentage !== 'string') {
158
+ return {
159
+ result: false,
160
+ depositTotal: new Decimal(0)
161
+ };
162
+ }
163
+ var depositFixed = new Decimal(deposit_fixed || 0);
164
+ var depositPercent = new Decimal(deposit_percentage || 0);
165
+ var productTotalPrice = new Decimal(total || 0);
166
+ var deposit = depositFixed.plus(depositPercent.times(productTotalPrice));
167
+ return {
168
+ depositTotal: deposit.times(num),
169
+ result: true
170
+ };
171
+ }
172
+ function resolveOrderProductDepositSource(product, runtimeOrigin) {
173
+ var _ref3, _record$custom_deposi, _ref4, _record$variant;
174
+ var record = product;
175
+ var origin = record._origin || runtimeOrigin || {};
176
+ var originProduct = origin.product || {};
177
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, originProduct), origin), record), {}, {
178
+ custom_deposit_data: (_ref3 = (_record$custom_deposi = record.custom_deposit_data) !== null && _record$custom_deposi !== void 0 ? _record$custom_deposi : origin.custom_deposit_data) !== null && _ref3 !== void 0 ? _ref3 : originProduct.custom_deposit_data,
179
+ variant: (_ref4 = (_record$variant = record.variant) !== null && _record$variant !== void 0 ? _record$variant : origin.variant) !== null && _ref4 !== void 0 ? _ref4 : originProduct.variant
180
+ });
181
+ }
182
+ function getOrderProductDeposit(product, runtimeOrigin) {
183
+ var depositProduct = resolveOrderProductDepositSource(product, runtimeOrigin);
184
+ var depositData = depositProduct.custom_deposit_data;
185
+ if ((depositData === null || depositData === void 0 ? void 0 : depositData.has_deposit) != 1) return null;
186
+ var num = getSafeOrderProductNum(product.num);
187
+ var total = getOrderProductDepositUnitTotal(product).times(num);
188
+ var allProtocols = normalizeDepositProtocols(depositData.deposit_policy_data);
189
+ var protocolIds = [];
190
+ var depositTotal = new Decimal(0);
191
+ var hasDeposit = false;
192
+ if (typeof depositData.deposit_fixed === 'string' && typeof depositData.deposit_percentage === 'string') {
193
+ var result = handleOrderProductDeposit({
194
+ depositData: depositData,
195
+ total: total,
196
+ num: num
197
+ });
198
+ if (result.result) {
199
+ depositTotal = result.depositTotal;
200
+ protocolIds.push.apply(protocolIds, _toConsumableArray(getDepositPolicyIds({
201
+ self_deposit_policy_ids: depositData.self_deposit_policy_ids
202
+ })));
203
+ hasDeposit = true;
204
+ }
205
+ } else {
206
+ var _depositProduct$produ;
207
+ var productVariantId = (_depositProduct$produ = depositProduct.product_variant_id) !== null && _depositProduct$produ !== void 0 ? _depositProduct$produ : product.product_variant_id;
208
+ if (productVariantId) {
209
+ var variantProduct = (depositProduct.variant || []).find(function (item) {
210
+ return (item === null || item === void 0 ? void 0 : item.id) === productVariantId;
211
+ });
212
+ var variantDepositData = variantProduct === null || variantProduct === void 0 ? void 0 : variantProduct.custom_deposit_data;
213
+ var _result = handleOrderProductDeposit({
214
+ depositData: variantDepositData,
215
+ total: total,
216
+ num: num
217
+ });
218
+ if (_result.result) {
219
+ depositTotal = _result.depositTotal;
220
+ protocolIds.push.apply(protocolIds, _toConsumableArray(getDepositPolicyIds({
221
+ self_deposit_policy_ids: variantDepositData === null || variantDepositData === void 0 ? void 0 : variantDepositData.self_deposit_policy_ids
222
+ })));
223
+ hasDeposit = true;
224
+ }
225
+ }
226
+ if (Array.isArray(product.product_bundle) && product.product_bundle.length) {
227
+ depositTotal = product.product_bundle.reduce(function (accumulator, bundleProduct) {
228
+ var bundleDepositData = bundleProduct === null || bundleProduct === void 0 ? void 0 : bundleProduct.custom_deposit_data;
229
+ var result = handleOrderProductDeposit({
230
+ depositData: bundleDepositData,
231
+ total: bundleProduct === null || bundleProduct === void 0 ? void 0 : bundleProduct.price,
232
+ num: getSafeOrderProductNum((bundleProduct === null || bundleProduct === void 0 ? void 0 : bundleProduct.num) || 1)
233
+ });
234
+ if (!result.result) return accumulator;
235
+ protocolIds.push.apply(protocolIds, _toConsumableArray(getDepositPolicyIds({
236
+ self_deposit_policy_ids: bundleDepositData === null || bundleDepositData === void 0 ? void 0 : bundleDepositData.self_deposit_policy_ids
237
+ })));
238
+ hasDeposit = true;
239
+ return accumulator.plus(result.depositTotal);
240
+ }, new Decimal(0));
241
+ }
242
+ }
243
+ if (!hasDeposit) return null;
244
+ var protocolIdSet = new Set(protocolIds);
245
+ var protocols = allProtocols.filter(function (protocol) {
246
+ return protocolIdSet.has(protocol.id);
247
+ });
248
+ return {
249
+ total: depositTotal.toNumber(),
250
+ protocols: protocols
251
+ };
252
+ }
253
+
254
+ /**
255
+ * 仅基于 tempOrder.products 重算整单定金。
256
+ *
257
+ * 商品折扣在进入定金计算前已体现在商品行价格字段中,
258
+ * 因此这里只按商品定金规则汇总,不再扣减 discount_list;tempOrder.bookings 不参与这里的计算。
259
+ */
260
+ export function calculateOrderProductsDeposit() {
261
+ var products = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
262
+ var options = arguments.length > 1 ? arguments[1] : undefined;
263
+ var protocolMap = new Map();
264
+ var total = new Decimal(0);
265
+ var hasDeposit = false;
266
+ var _iterator3 = _createForOfIteratorHelper(products || []),
267
+ _step3;
268
+ try {
269
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
270
+ var _product$metadata, _options$productsByUi;
271
+ var product = _step3.value;
272
+ var productUid = (_product$metadata = product.metadata) === null || _product$metadata === void 0 ? void 0 : _product$metadata.unique_identification_number;
273
+ var runtimeOrigin = productUid ? options === null || options === void 0 || (_options$productsByUi = options.productsByUid) === null || _options$productsByUi === void 0 || (_options$productsByUi = _options$productsByUi[productUid]) === null || _options$productsByUi === void 0 ? void 0 : _options$productsByUi.origin : undefined;
274
+ var deposit = getOrderProductDeposit(product, runtimeOrigin);
275
+ product.deposit = deposit;
276
+ if (!(deposit !== null && deposit !== void 0 && deposit.total) || Number(deposit.total) <= 0) continue;
277
+ total = total.plus(deposit.total);
278
+ var _iterator4 = _createForOfIteratorHelper(deposit.protocols || []),
279
+ _step4;
280
+ try {
281
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
282
+ var protocol = _step4.value;
283
+ if (!protocolMap.has(protocol.id)) protocolMap.set(protocol.id, protocol);
284
+ }
285
+ } catch (err) {
286
+ _iterator4.e(err);
287
+ } finally {
288
+ _iterator4.f();
289
+ }
290
+ hasDeposit = true;
291
+ }
292
+ } catch (err) {
293
+ _iterator3.e(err);
294
+ } finally {
295
+ _iterator3.f();
296
+ }
297
+ var roundedTotal = total.toDecimalPlaces(2, Decimal.ROUND_HALF_UP);
298
+ var protocols = _toConsumableArray(protocolMap.values());
299
+ return {
300
+ total: roundedTotal.toNumber(),
301
+ totalText: roundedTotal.toFixed(2),
302
+ protocols: protocols,
303
+ deposit_policy_ids: protocols.map(function (protocol) {
304
+ return protocol.id;
305
+ }),
306
+ hasDeposit: hasDeposit
307
+ };
308
+ }
309
+
310
+ /**
311
+ * 判定套餐子商品是否为 markdown(减价)类型。
312
+ * 与后端口径一致:price_type='markdown' 且 price_type_ext 非 'product_price'(原价子商品)。
313
+ */
314
+ export function isMarkdownBundle(bundle) {
315
+ var _bundle$price_type_ex, _bundle$price_type;
316
+ if (!bundle || _typeof(bundle) !== 'object') return false;
317
+ var ext = (_bundle$price_type_ex = bundle.price_type_ext) !== null && _bundle$price_type_ex !== void 0 ? _bundle$price_type_ex : bundle.custom_price_type_ext;
318
+ var type = (_bundle$price_type = bundle.price_type) !== null && _bundle$price_type !== void 0 ? _bundle$price_type : bundle.custom_price_type;
319
+ return type === 'markdown' && ext !== 'product_price';
320
+ }
321
+
322
+ /**
323
+ * 套餐子商品对「行价」的带符号单位贡献(与后端 markdown 口径对齐)。
324
+ *
325
+ * - markdown(减价):净额 = |catalog 毛价| − Σ(option.add_price×num),**取负**(行内减)。
326
+ * catalog 毛价优先 `price`/`custom_price`(避免读已落净额的 `bundle_selling_price` 造成 option 二次扣减);
327
+ * 仅当毛价缺失(历史/hydrate 仅剩净额)时退回 `bundle_selling_price`,且此时不再扣 option。
328
+ * - markup(加价)/原价子商品:维持 `+(bundle_selling_price ?? price)`,行为不变。
329
+ */
330
+ export function getBundleSignedUnit(bundle, options) {
331
+ var _options$useOriginal, _ref11, _bundle$original_pric2, _bundle$bundle_sellin;
332
+ if (!bundle || _typeof(bundle) !== 'object') return new Decimal(0);
333
+ var useOriginal = (_options$useOriginal = options === null || options === void 0 ? void 0 : options.useOriginal) !== null && _options$useOriginal !== void 0 ? _options$useOriginal : false;
334
+ if (isMarkdownBundle(bundle)) {
335
+ var _ref5, _ref6, _ref7, _bundle$original_pric, _ref8, _ref9, _ref10, _bundle$custom_price;
336
+ var catalog = useOriginal ? (_ref5 = (_ref6 = (_ref7 = (_bundle$original_pric = bundle.original_price) !== null && _bundle$original_pric !== void 0 ? _bundle$original_pric : bundle.product_price) !== null && _ref7 !== void 0 ? _ref7 : bundle.custom_price) !== null && _ref6 !== void 0 ? _ref6 : bundle.base_price) !== null && _ref5 !== void 0 ? _ref5 : bundle.price : (_ref8 = (_ref9 = (_ref10 = (_bundle$custom_price = bundle.custom_price) !== null && _bundle$custom_price !== void 0 ? _bundle$custom_price : bundle.product_price) !== null && _ref10 !== void 0 ? _ref10 : bundle.original_price) !== null && _ref9 !== void 0 ? _ref9 : bundle.base_price) !== null && _ref8 !== void 0 ? _ref8 : bundle.price;
337
+ if (catalog !== undefined && catalog !== null && catalog !== '') {
338
+ var raw = new Decimal(Number(catalog) || 0);
339
+ // 负值表示价格已是「带符号净额」(如 cart/changePrice 产出的 -3.7),直接取用不再扣 option,
340
+ // 避免与下游 option 二次扣减;正值为毛价(H5 路径,如 5),净额 = price − Σoptions 后取负。
341
+ if (raw.lt(0)) return raw;
342
+ return raw.minus(sumOptionUnitPrice(bundle.option)).negated();
343
+ }
344
+ // 仅剩净额(无毛价)兜底:直接取负,不再扣 option
345
+ return new Decimal(Number(bundle.bundle_selling_price) || 0).abs().negated();
346
+ }
347
+ var rawPrice = useOriginal ? (_ref11 = (_bundle$original_pric2 = bundle.original_price) !== null && _bundle$original_pric2 !== void 0 ? _bundle$original_pric2 : bundle.product_price) !== null && _ref11 !== void 0 ? _ref11 : bundle.price : (_bundle$bundle_sellin = bundle.bundle_selling_price) !== null && _bundle$bundle_sellin !== void 0 ? _bundle$bundle_sellin : bundle.price;
348
+ return new Decimal(Number(rawPrice) || 0);
349
+ }
350
+
351
+ /**
352
+ * 套餐子商品 `bundle_selling_price` 的存储净额(正值幅度)。
353
+ * markdown 取净额绝对值(3.70);markup/原价维持原值。
354
+ */
355
+ export function getBundleSellingMagnitude(bundle) {
356
+ return getBundleSignedUnit(bundle).abs();
357
+ }
86
358
 
87
359
  /**
88
360
  * OrderModule 默认 Rules 钩子工厂。
@@ -96,7 +368,7 @@ export function sumOptionUnitPrice(options) {
96
368
  * 不含折扣。**权威源**。
97
369
  * - `metadata.main_product_original_price` = source + Σ(option.price × option.num)(含 option、不含折扣)。
98
370
  * - `metadata.main_product_selling_price` = main_original − 主商品券 per-unit amount(含 option、含折扣)。
99
- * - `payment_price`:出站 payload 中由 `selling_price` 派生以兼容后端(composite)。
371
+ * - `payment_price`:出站 payload 中为行 composite 已减整单折扣均摊价(无折扣时与 `selling_price` 同义)。
100
372
  *
101
373
  * Rules 钩子契约(hook_adapt 方案,Rules 内部保持不变):
102
374
  * - `getProduct.price` / `getProduct.original_price` 回传 **source-level 主价**
@@ -113,17 +385,219 @@ export function sumOptionUnitPrice(options) {
113
385
  *
114
386
  * 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
115
387
  */
388
+
389
+ /** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
390
+ export function resolveRulesManualDiscountFlag(metadata) {
391
+ if (!metadata) return undefined;
392
+ if (metadata.is_manual_discount === true || metadata.is_manual_discount === 1) {
393
+ return true;
394
+ }
395
+ var priceOverride = metadata.price_override;
396
+ if (priceOverride !== undefined && priceOverride !== null && priceOverride !== '') {
397
+ return true;
398
+ }
399
+ return undefined;
400
+ }
401
+ function normalizeOrderProductDiscountAmount(amount) {
402
+ if (amount === undefined || amount === null) return undefined;
403
+ return String(amount);
404
+ }
405
+
406
+ /**
407
+ * 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
408
+ * Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
409
+ */
410
+ export function normalizeOrderProductDiscountList(discountList) {
411
+ if (!Array.isArray(discountList)) return [];
412
+ return discountList.filter(function (item) {
413
+ return !!item && _typeof(item) === 'object';
414
+ }).map(function (item) {
415
+ var normalized = {
416
+ discount_id: Number.isFinite(Number(item.discount_id)) ? Number(item.discount_id) : 0
417
+ };
418
+ if (item.order_discount_id === null) {
419
+ normalized.order_discount_id = null;
420
+ } else if (item.order_discount_id !== undefined) {
421
+ var orderDiscountId = Number(item.order_discount_id);
422
+ if (Number.isFinite(orderDiscountId)) {
423
+ normalized.order_discount_id = orderDiscountId;
424
+ }
425
+ }
426
+ if (item.type !== undefined) normalized.type = item.type;
427
+ var amount = normalizeOrderProductDiscountAmount(item.amount);
428
+ if (amount !== undefined) normalized.amount = amount;
429
+ if (item.discount && _typeof(item.discount) === 'object') {
430
+ normalized.discount = _objectSpread({}, item.discount);
431
+ }
432
+ if (item.metadata === null) {
433
+ normalized.metadata = null;
434
+ } else if (item.metadata && _typeof(item.metadata) === 'object') {
435
+ normalized.metadata = _objectSpread({}, item.metadata);
436
+ }
437
+ return normalized;
438
+ });
439
+ }
440
+ function resolveSubmitBundleMapId(bundle) {
441
+ var _bundle$metadata;
442
+ var metadataMapId = (_bundle$metadata = bundle.metadata) === null || _bundle$metadata === void 0 ? void 0 : _bundle$metadata.custom_product_bundle_map_id;
443
+ if (metadataMapId !== undefined && metadataMapId !== null && metadataMapId !== '') {
444
+ return metadataMapId;
445
+ }
446
+ if (bundle._id !== undefined && bundle._id !== null && bundle._id !== '') {
447
+ return bundle._id;
448
+ }
449
+ return undefined;
450
+ }
451
+ function collectSubmitProductDiscountList(product) {
452
+ var submitDiscountList = Array.isArray(product === null || product === void 0 ? void 0 : product.discount_list) ? _toConsumableArray(product.discount_list) : [];
453
+ var _iterator5 = _createForOfIteratorHelper((product === null || product === void 0 ? void 0 : product.product_bundle) || []),
454
+ _step5;
455
+ try {
456
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
457
+ var bundle = _step5.value;
458
+ if (!bundle || _typeof(bundle) !== 'object') continue;
459
+ var bundleMapId = resolveSubmitBundleMapId(bundle);
460
+ var bundleDiscountList = Array.isArray(bundle.discount_list) ? bundle.discount_list : [];
461
+ var _iterator6 = _createForOfIteratorHelper(bundleDiscountList),
462
+ _step6;
463
+ try {
464
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
465
+ var discount = _step6.value;
466
+ if (!discount || _typeof(discount) !== 'object') continue;
467
+ var discountMetadata = discount.metadata && _typeof(discount.metadata) === 'object' ? discount.metadata : {};
468
+ var discountMapId = discountMetadata.custom_product_bundle_map_id !== undefined && discountMetadata.custom_product_bundle_map_id !== null && discountMetadata.custom_product_bundle_map_id !== '' ? discountMetadata.custom_product_bundle_map_id : bundleMapId;
469
+ submitDiscountList.push(_objectSpread(_objectSpread({}, discount), discountMapId !== undefined ? {
470
+ metadata: _objectSpread(_objectSpread({}, discountMetadata), {}, {
471
+ custom_product_bundle_map_id: discountMapId
472
+ })
473
+ } : {}));
474
+ }
475
+ } catch (err) {
476
+ _iterator6.e(err);
477
+ } finally {
478
+ _iterator6.f();
479
+ }
480
+ }
481
+ } catch (err) {
482
+ _iterator5.e(err);
483
+ } finally {
484
+ _iterator5.f();
485
+ }
486
+ return normalizeOrderProductDiscountList(submitDiscountList);
487
+ }
488
+
489
+ /**
490
+ * 手动改价(price_override)时行级 original_price(composite 单价):
491
+ * 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
492
+ * 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice(如 30)。
493
+ *
494
+ * origin_total 与 SkuDetailModal / cacheItem._extend 一致,为单价语义,不再除以 num。
495
+ */
496
+ export function resolveManualOverrideLineOriginalPrice(params, fallbackCompositeOriginal) {
497
+ var _metadata$origin;
498
+ var metadata = params.metadata || {};
499
+ var priceOverride = metadata.price_override;
500
+ if (priceOverride === undefined || priceOverride === null || priceOverride === '') {
501
+ return fallbackCompositeOriginal;
502
+ }
503
+ var refTotal = (_metadata$origin = metadata.origin) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin._extend) === null || _metadata$origin === void 0 ? void 0 : _metadata$origin.origin_total;
504
+ if (refTotal !== undefined && refTotal !== null && refTotal !== '') {
505
+ var parsed = Number(refTotal);
506
+ if (Number.isFinite(parsed)) {
507
+ return new Decimal(parsed).toDecimalPlaces(2).toFixed(2);
508
+ }
509
+ }
510
+ var lineOriginal = params.lineOriginalPrice;
511
+ if (lineOriginal !== undefined && lineOriginal !== null && lineOriginal !== '') {
512
+ var parsedLine = Number(lineOriginal);
513
+ var parsedFallback = Number(fallbackCompositeOriginal);
514
+ if (Number.isFinite(parsedLine) && Number.isFinite(parsedFallback) && parsedLine > parsedFallback) {
515
+ return new Decimal(parsedLine).toDecimalPlaces(2).toFixed(2);
516
+ }
517
+ }
518
+ return fallbackCompositeOriginal;
519
+ }
520
+
521
+ /**
522
+ * 计算商品行「每单位有效折扣」:discount_list 合计 + 被 Rules 剥离但仍 inPromotion 的差额。
523
+ *
524
+ * Rules.calcDiscount 会把 type=promotion 从 discount_list 去掉,但 metadata._promotion 仍保留;
525
+ * applyProductDiscountPrices 必须回读 _promotion,否则抬价/降价都会在第二步被 source 原价覆盖。
526
+ *
527
+ * @example
528
+ * resolveEffectivePerUnitDiscount({ metadata: { _promotion: { inPromotion: true, originalPrice: 1, finalPrice: 5 } }, discount_list: [] });
529
+ * // => -4
530
+ */
531
+ export function resolveEffectivePerUnitDiscount(product) {
532
+ var discountList = Array.isArray(product === null || product === void 0 ? void 0 : product.discount_list) ? product.discount_list : [];
533
+ var fromList = discountList.reduce(function (sum, discount) {
534
+ return sum + Number((discount === null || discount === void 0 ? void 0 : discount.amount) || 0);
535
+ }, 0);
536
+ var hasPromoDiscountItem = discountList.some(function (item) {
537
+ return (item === null || item === void 0 ? void 0 : item.type) === 'promotion';
538
+ });
539
+ if (hasPromoDiscountItem) return fromList;
540
+ var metadata = (product === null || product === void 0 ? void 0 : product.metadata) || {};
541
+ var promo = metadata._promotion;
542
+ if ((promo === null || promo === void 0 ? void 0 : promo.inPromotion) !== true) return fromList;
543
+ var optionSum = sumOptionUnitPrice(getProductSkuOptions(product)).toNumber();
544
+
545
+ // applyPromotion 写价后、Rules 剥离 promotion discount 的兜底
546
+ if (!discountList.length && metadata.source_product_price != null && metadata.main_product_selling_price != null) {
547
+ var source = Number(metadata.source_product_price);
548
+ var selling = Number(metadata.main_product_selling_price) - optionSum;
549
+ if (Number.isFinite(source) && Number.isFinite(selling) && source !== selling) {
550
+ return fromList + (source - selling);
551
+ }
552
+ }
553
+ var originalPrice = Number(promo.originalPrice);
554
+ var finalPrice = Number(promo.finalPrice);
555
+ if (!Number.isFinite(originalPrice) || !Number.isFinite(finalPrice)) return fromList;
556
+ return fromList + (originalPrice - finalPrice);
557
+ }
116
558
  export function createDefaultOrderRulesHooks() {
117
559
  var toUnitPriceString = function toUnitPriceString(totalLike, num) {
118
560
  var effectiveNum = Number(num) > 0 ? Number(num) : 1;
119
561
  return new Decimal(Number(totalLike) || 0).dividedBy(effectiveNum).toDecimalPlaces(2).toString();
120
562
  };
563
+ var getBundleIdentity = function getBundleIdentity(bundle) {
564
+ var _ref12, _bundle$bundle_id, _ref13, _ref14, _bundle$bundle_produc, _ref15, _ref16, _bundle$bundle_varian, _ref17, _bundle$bundle_group_;
565
+ return [(_ref12 = (_bundle$bundle_id = bundle.bundle_id) !== null && _bundle$bundle_id !== void 0 ? _bundle$bundle_id : bundle.id) !== null && _ref12 !== void 0 ? _ref12 : '', (_ref13 = (_ref14 = (_bundle$bundle_produc = bundle.bundle_product_id) !== null && _bundle$bundle_produc !== void 0 ? _bundle$bundle_produc : bundle._bundle_product_id) !== null && _ref14 !== void 0 ? _ref14 : bundle.product_id) !== null && _ref13 !== void 0 ? _ref13 : '', (_ref15 = (_ref16 = (_bundle$bundle_varian = bundle.bundle_variant_id) !== null && _bundle$bundle_varian !== void 0 ? _bundle$bundle_varian : bundle.variant_id) !== null && _ref16 !== void 0 ? _ref16 : bundle.product_variant_id) !== null && _ref15 !== void 0 ? _ref15 : 0, (_ref17 = (_bundle$bundle_group_ = bundle.bundle_group_id) !== null && _bundle$bundle_group_ !== void 0 ? _bundle$bundle_group_ : bundle.group_id) !== null && _ref17 !== void 0 ? _ref17 : ''].join('|');
566
+ };
567
+ var mergeRulesBundlePrices = function mergeRulesBundlePrices(currentBundle, rulesBundle) {
568
+ if (!Array.isArray(rulesBundle)) return rulesBundle;
569
+ var currentByIdentity = new Map();
570
+ (currentBundle || []).forEach(function (bundle) {
571
+ if (!bundle || _typeof(bundle) !== 'object') return;
572
+ currentByIdentity.set(getBundleIdentity(bundle), bundle);
573
+ });
574
+ return rulesBundle.map(function (bundle) {
575
+ var _bundle$price_type_ex2, _ref18, _ref19, _current$price, _ref20, _ref21, _ref22, _current$original_pri;
576
+ if (!bundle || _typeof(bundle) !== 'object') return bundle;
577
+ var current = currentByIdentity.get(getBundleIdentity(bundle));
578
+ if (!current) return bundle;
579
+ var bundleWithDisplayFields = _objectSpread(_objectSpread({}, bundle), isEmptyOrderProductDisplayValue(bundle.cover) && !isEmptyOrderProductDisplayValue(current.cover) ? {
580
+ cover: current.cover
581
+ } : {});
582
+ var isProductPriceBundle = ((_bundle$price_type_ex2 = bundle.price_type_ext) !== null && _bundle$price_type_ex2 !== void 0 ? _bundle$price_type_ex2 : current.price_type_ext) === 'product_price';
583
+ if (!isProductPriceBundle) return bundleWithDisplayFields;
584
+ var sourcePrice = (_ref18 = (_ref19 = (_current$price = current.price) !== null && _current$price !== void 0 ? _current$price : current.custom_price) !== null && _ref19 !== void 0 ? _ref19 : current.original_price) !== null && _ref18 !== void 0 ? _ref18 : current.bundle_selling_price;
585
+ var originalPrice = (_ref20 = (_ref21 = (_ref22 = (_current$original_pri = current.original_price) !== null && _current$original_pri !== void 0 ? _current$original_pri : current.product_price) !== null && _ref22 !== void 0 ? _ref22 : current.price) !== null && _ref21 !== void 0 ? _ref21 : current.custom_price) !== null && _ref20 !== void 0 ? _ref20 : sourcePrice;
586
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, bundleWithDisplayFields), sourcePrice !== undefined ? {
587
+ price: sourcePrice
588
+ } : {}), originalPrice !== undefined ? {
589
+ original_price: originalPrice
590
+ } : {}), current.original_total !== undefined ? {
591
+ original_total: current.original_total
592
+ } : {});
593
+ });
594
+ };
121
595
  return {
122
596
  getProduct: function getProduct(product) {
123
- var _product$_origin, _product$_origin2, _product$_origin3, _product$_origin4;
597
+ var _product$metadata2, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6, _metadataAny$_promoti;
124
598
  // source_product_price 是权威源;兜底链:source → mainSelling − options(反推)→ 行 selling_price
125
599
  var metadataAny = product.metadata || {};
126
- var optionSum = sumOptionUnitPrice(product.product_option_item);
600
+ var optionSum = sumOptionUnitPrice(getProductSkuOptions(product));
127
601
  var sourcePrice;
128
602
  if (metadataAny.source_product_price !== undefined) {
129
603
  sourcePrice = String(metadataAny.source_product_price);
@@ -145,9 +619,9 @@ export function createDefaultOrderRulesHooks() {
145
619
  id: product.product_id,
146
620
  // Rules 引擎用 _id 作为 processedProductsMap 键;必须与购物车行级 identity 一致,
147
621
  // 否则同 SKU 不同小料会在 calcDiscount 重组时互相覆盖。
148
- // 不透明 identity 契约下,normalizeOrderProduct / restoreTempOrderFromStorage 已保证 identity_key 必存在;
622
+ // 不透明 identity 契约下,normalizeOrderProduct / hydrate 已保证唯一值存在;
149
623
  // 留 fingerprint 分支仅作 Rules 单测里直接传裸 product 时的兜底。
150
- _id: product.identity_key ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.identity_key) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(product.product_option_item, product.product_bundle)),
624
+ _id: (_product$metadata2 = product.metadata) !== null && _product$metadata2 !== void 0 && _product$metadata2.unique_identification_number ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.metadata.unique_identification_number) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(getProductSkuOptions(product), product.product_bundle)),
151
625
  // Rules 内部 getProductTotalPrice / getProductOriginTotalPrice 会各自再叠加 bundle + option,
152
626
  // 所以这里必须喂 source-level(不含 option、不含 bundle、不含折扣)单价,避免双加 option。
153
627
  price: sourcePrice,
@@ -159,19 +633,24 @@ export function createDefaultOrderRulesHooks() {
159
633
  num: product.num || 1,
160
634
  discount_list: product.discount_list || [],
161
635
  bundle: product.product_bundle || [],
162
- booking_id: ((_product$_origin = product._origin) === null || _product$_origin === void 0 ? void 0 : _product$_origin.booking_id) || null,
636
+ booking_id: ((_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.booking_id) || null,
163
637
  isClient: false,
164
- isManualDiscount: ((_product$_origin2 = product._origin) === null || _product$_origin2 === void 0 ? void 0 : _product$_origin2.isManualDiscount) || false,
165
- holder_id: (_product$_origin3 = product._origin) === null || _product$_origin3 === void 0 ? void 0 : _product$_origin3.holder_id,
166
- startDate: (_product$_origin4 = product._origin) === null || _product$_origin4 === void 0 ? void 0 : _product$_origin4.startDate
638
+ // 勿写死 false:否则 Rules 不会走 total≠origin_total 的手动价推断,
639
+ // 无券时会把 bundle 价还原成 original_price(手动改价套餐会从 20 回到 30)。
640
+ isManualDiscount: resolveRulesManualDiscountFlag(metadataAny),
641
+ holder_id: (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.holder_id,
642
+ startDate: ((_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.start_date) || ((_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.startDate),
643
+ main_product_selling_price: metadataAny.main_product_selling_price !== undefined ? new Decimal(Number(metadataAny.main_product_selling_price) || 0).minus(optionSum).toDecimalPlaces(2).toString() : undefined,
644
+ inPromotion: ((_metadataAny$_promoti = metadataAny._promotion) === null || _metadataAny$_promoti === void 0 ? void 0 : _metadataAny$_promoti.inPromotion) === true,
645
+ _promotion: metadataAny._promotion
167
646
  };
168
647
  },
169
648
  setProduct: function setProduct(product, values) {
170
- var _ref3, _values$quantity, _ref4, _metadataAny$source_p, _values$bundle, _values$discount_list, _values$quantity2;
171
- var nextNum = Number((_ref3 = (_values$quantity = values.quantity) !== null && _values$quantity !== void 0 ? _values$quantity : product.num) !== null && _ref3 !== void 0 ? _ref3 : 1) || 1;
649
+ var _ref23, _values$quantity, _ref24, _metadataAny$source_p, _values$discount_list, _values$quantity2;
650
+ var nextNum = Number((_ref23 = (_values$quantity = values.quantity) !== null && _values$quantity !== void 0 ? _values$quantity : product.num) !== null && _ref23 !== void 0 ? _ref23 : 1) || 1;
172
651
  var metadataAny = product.metadata || {};
173
- var existedSource = (_ref4 = (_metadataAny$source_p = metadataAny.source_product_price) !== null && _metadataAny$source_p !== void 0 ? _metadataAny$source_p : product.selling_price) !== null && _ref4 !== void 0 ? _ref4 : '0';
174
- var nextOptions = product.product_option_item;
652
+ var existedSource = (_ref24 = (_metadataAny$source_p = metadataAny.source_product_price) !== null && _metadataAny$source_p !== void 0 ? _metadataAny$source_p : product.selling_price) !== null && _ref24 !== void 0 ? _ref24 : '0';
653
+ var nextOptions = getProductSkuOptions(product);
175
654
  var optionSum = sumOptionUnitPrice(nextOptions);
176
655
 
177
656
  // Rules 返回的 main_product_selling_price / price / total 均为 source-level。
@@ -186,7 +665,7 @@ export function createDefaultOrderRulesHooks() {
186
665
  // 含 option 的 main_product_*
187
666
  var nextMainSellingPrice = new Decimal(Number(nextSourceSellingPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
188
667
  var nextMainOriginalPrice = new Decimal(Number(nextSourceOriginalPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
189
- var nextBundle = (_values$bundle = values.bundle) !== null && _values$bundle !== void 0 ? _values$bundle : product.product_bundle;
668
+ var nextBundle = values.bundle !== undefined ? mergeRulesBundlePrices(product.product_bundle, values.bundle) : product.product_bundle;
190
669
  var composedSellingPrice = composeLinePrice({
191
670
  mainPrice: nextMainSellingPrice,
192
671
  bundle: nextBundle
@@ -196,9 +675,14 @@ export function createDefaultOrderRulesHooks() {
196
675
  bundle: nextBundle,
197
676
  useOriginalBundle: true
198
677
  });
678
+ var finalOriginalPrice = resolveManualOverrideLineOriginalPrice({
679
+ num: nextNum,
680
+ metadata: metadataAny,
681
+ lineOriginalPrice: product.original_price
682
+ }, composedOriginalPrice);
199
683
  return _objectSpread(_objectSpread({}, product), {}, {
200
684
  selling_price: composedSellingPrice,
201
- original_price: composedOriginalPrice,
685
+ original_price: finalOriginalPrice,
202
686
  discount_list: (_values$discount_list = values.discount_list) !== null && _values$discount_list !== void 0 ? _values$discount_list : product.discount_list,
203
687
  num: (_values$quantity2 = values.quantity) !== null && _values$quantity2 !== void 0 ? _values$quantity2 : product.num,
204
688
  product_bundle: nextBundle,
@@ -303,14 +787,7 @@ export var getAllDiscountList = function getAllDiscountList(cartItem) {
303
787
 
304
788
  // ─── 以下为从 ScanOrder/utils.ts 迁入的 Order 专属工具函数 ───
305
789
 
306
- export function createUuidV4() {
307
- var template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
308
- return template.replace(/[xy]/g, function (char) {
309
- var randomValue = Math.floor(Math.random() * 16);
310
- var value = char === 'x' ? randomValue : randomValue & 0x3 | 0x8;
311
- return value.toString(16);
312
- });
313
- }
790
+ export { createUuidV4 };
314
791
  export function isTempOrder(data) {
315
792
  if (!data || _typeof(data) !== 'object') return false;
316
793
  if (!Array.isArray(data.products)) return false;
@@ -329,21 +806,28 @@ export function formatDateTime(date) {
329
806
  return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
330
807
  }
331
808
  function normalizeSubmitPlatform(platform) {
332
- return (platform === null || platform === void 0 ? void 0 : platform.toLowerCase()) === 'pc' ? 'PC' : 'H5';
809
+ var value = String(platform || '').trim();
810
+ if (!value) return 'H5';
811
+ var lower = value.toLowerCase();
812
+ if (lower === 'pc') return 'PC';
813
+ if (lower === 'h5') return 'H5';
814
+ return value;
333
815
  }
334
816
 
335
- // 出站重命名:后端 checkout 协议字段 option_group_item_id;
336
- // tempOrder / UI 运行时一律使用 product_option_item_id。仅保留后端契约字段,
337
- // 与 src/modules/Cart/utils/cartProduct.ts#formatOptionsToOrigin 形状一致。
817
+ // 后端 checkout 协议字段 option_group_item_id;tempOrder 内部也保持同一字段名。
338
818
  function formatSubmitOptionItems(options) {
339
819
  if (!Array.isArray(options)) return [];
340
820
  return options.map(function (d) {
341
- var _d$option_group_item_;
342
- return {
821
+ var _d$add_price;
822
+ var option = _objectSpread(_objectSpread({}, d && _typeof(d) === 'object' ? d : {}), {}, {
343
823
  num: d === null || d === void 0 ? void 0 : d.num,
344
- option_group_item_id: (_d$option_group_item_ = d === null || d === void 0 ? void 0 : d.option_group_item_id) !== null && _d$option_group_item_ !== void 0 ? _d$option_group_item_ : d === null || d === void 0 ? void 0 : d.product_option_item_id,
824
+ option_group_item_id: d === null || d === void 0 ? void 0 : d.option_group_item_id,
345
825
  option_group_id: d === null || d === void 0 ? void 0 : d.option_group_id
346
- };
826
+ });
827
+ var addPrice = (_d$add_price = d === null || d === void 0 ? void 0 : d.add_price) !== null && _d$add_price !== void 0 ? _d$add_price : d === null || d === void 0 ? void 0 : d.price;
828
+ if (addPrice !== undefined) option.add_price = String(addPrice);
829
+ delete option.price;
830
+ return option;
347
831
  });
348
832
  }
349
833
  function toBundleNumber(value) {
@@ -351,56 +835,60 @@ function toBundleNumber(value) {
351
835
  var parsed = Number(value);
352
836
  return Number.isFinite(parsed) ? parsed : fallback;
353
837
  }
354
- function toBundleCustomPriceString(value) {
838
+ function toMoneyString(value) {
355
839
  var parsed = Number(value);
356
840
  if (Number.isFinite(parsed)) return parsed.toFixed(2);
357
841
  if (value === null || value === undefined || value === '') return '0.00';
358
842
  return String(value);
359
843
  }
360
844
 
361
- // 出站补齐:以 additive 方式把 bundle 项补足为后端 checkout 协议所需的形状,
362
- // 同时把 Summary / Rules 运行时写到 bundle 顶层的 surcharge_fee / relation_surcharge_ids
363
- // 和来自 _origin 的 product_discount_difference 汇总到 metadata。
364
- // 保留原对象上已有字段(如 discount_list、metadata.custom_product_bundle_map_id)
365
- // 以兼容运行时 bundle 归一化、Rules、Summary 的消费。
845
+ // 出站补齐:只输出后端 checkout 协议字段,运行时/详情展示字段不进入 bundle payload。
366
846
  function formatSubmitBundleItems(bundle) {
367
847
  if (!Array.isArray(bundle)) return [];
368
848
  return bundle.map(function (b) {
369
- var _rawBundle$bundle_sel, _rawBundle$price_type, _rawBundle$surcharge_, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$extension_, _rawBundle$extension_2, _rawBundle$price_type2, _ref5, _rawBundle$custom_pri;
849
+ var _ref25, _rawBundle$price, _rawBundle$surcharge_, _rawBundle$num, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$quantity, _rawBundle$extension_, _rawBundle$extension_2, _ref26, _rawBundle$price_type, _ref27, _rawBundle$price_type2, _rawBundle$bundle_gro, _rawBundle$bundle_id, _rawBundle$bundle_pro;
370
850
  var rawBundle = b && _typeof(b) === 'object' ? b : {};
371
851
  var existedMetadata = rawBundle.metadata && _typeof(rawBundle.metadata) === 'object' ? rawBundle.metadata : {};
372
- var sellingPriceNum = toBundleNumber((_rawBundle$bundle_sel = rawBundle.bundle_selling_price) !== null && _rawBundle$bundle_sel !== void 0 ? _rawBundle$bundle_sel : rawBundle.price, 0);
373
- var priceNum = toBundleNumber(rawBundle.price, sellingPriceNum);
374
- var priceType = (_rawBundle$price_type = rawBundle.price_type) !== null && _rawBundle$price_type !== void 0 ? _rawBundle$price_type : '';
375
- // const customPriceStr = toBundleCustomPriceString(
376
- // rawBundle.custom_price ?? rawBundle.bundle_selling_price ?? rawBundle.price,
377
- // );
852
+ var _customProductBundleMapId = existedMetadata.custom_product_bundle_map_id,
853
+ submitMetadata = _objectWithoutProperties(existedMetadata, _excluded);
378
854
 
855
+ // bundle_selling_price 出站存「正净额」:markdown 为 |price| − Σoptions(如 3.70),
856
+ // markup/原价维持原值;与后端口径一致(price 仍为毛价)。
857
+ var sellingPrice = getBundleSellingMagnitude(rawBundle).toFixed(2);
858
+ // payment 价由整单折扣均摊层产出;缺省(无折扣)时与 selling 净额同义。
859
+ var paymentPrice = rawBundle.bundle_payment_price !== undefined && rawBundle.bundle_payment_price !== null && rawBundle.bundle_payment_price !== '' ? toMoneyString(rawBundle.bundle_payment_price) : sellingPrice;
860
+ var priceValue = (_ref25 = (_rawBundle$price = rawBundle.price) !== null && _rawBundle$price !== void 0 ? _rawBundle$price : rawBundle.custom_price) !== null && _ref25 !== void 0 ? _ref25 : rawBundle.bundle_selling_price;
379
861
  var relationSurchargeIds = Array.isArray(rawBundle.relation_surcharge_ids) ? rawBundle.relation_surcharge_ids : Array.isArray(existedMetadata.relation_surcharge_ids) ? existedMetadata.relation_surcharge_ids : [];
380
- var surchargeFee = toBundleNumber((_rawBundle$surcharge_ = rawBundle.surcharge_fee) !== null && _rawBundle$surcharge_ !== void 0 ? _rawBundle$surcharge_ : existedMetadata.surcharge_fee, 0);
862
+ var surchargeFee = toMoneyString((_rawBundle$surcharge_ = rawBundle.surcharge_fee) !== null && _rawBundle$surcharge_ !== void 0 ? _rawBundle$surcharge_ : existedMetadata.surcharge_fee);
381
863
  var productDiscountDifference = toBundleNumber(existedMetadata.product_discount_difference, 0);
382
- return _objectSpread(_objectSpread({}, rawBundle), {}, {
864
+ var num = toBundleNumber((_rawBundle$num = rawBundle.num) !== null && _rawBundle$num !== void 0 ? _rawBundle$num : rawBundle.quantity, 1);
865
+ var bundleMapId = resolveSubmitBundleMapId(rawBundle);
866
+ var hasSubmitBundleDiscounts = Array.isArray(rawBundle.discount_list) && rawBundle.discount_list.length > 0;
867
+ return {
383
868
  is_charge_tax: (_rawBundle$is_charge_ = rawBundle.is_charge_tax) !== null && _rawBundle$is_charge_ !== void 0 ? _rawBundle$is_charge_ : 0,
384
- tax_fee: toBundleNumber(rawBundle.tax_fee, 0),
385
869
  bundle_variant_id: (_rawBundle$bundle_var = rawBundle.bundle_variant_id) !== null && _rawBundle$bundle_var !== void 0 ? _rawBundle$bundle_var : 0,
386
- num: toBundleNumber(rawBundle.num, 1),
870
+ num: num,
871
+ quantity: toBundleNumber((_rawBundle$quantity = rawBundle.quantity) !== null && _rawBundle$quantity !== void 0 ? _rawBundle$quantity : rawBundle.num, num),
387
872
  extension_id: (_rawBundle$extension_ = rawBundle.extension_id) !== null && _rawBundle$extension_ !== void 0 ? _rawBundle$extension_ : 0,
388
873
  extension_type: (_rawBundle$extension_2 = rawBundle.extension_type) !== null && _rawBundle$extension_2 !== void 0 ? _rawBundle$extension_2 : 'normal',
389
- price: priceNum,
390
- price_type: priceType,
391
- price_type_ext: (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : '',
392
- // custom_price: customPriceStr,
393
- custom_price_type: (_ref5 = (_rawBundle$custom_pri = rawBundle.custom_price_type) !== null && _rawBundle$custom_pri !== void 0 ? _rawBundle$custom_pri : priceType) !== null && _ref5 !== void 0 ? _ref5 : '',
394
- bundle_selling_price: sellingPriceNum,
874
+ price: priceValue,
875
+ price_type: (_ref26 = (_rawBundle$price_type = rawBundle.price_type) !== null && _rawBundle$price_type !== void 0 ? _rawBundle$price_type : rawBundle.custom_price_type) !== null && _ref26 !== void 0 ? _ref26 : '',
876
+ price_type_ext: (_ref27 = (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : rawBundle.custom_price_type_ext) !== null && _ref27 !== void 0 ? _ref27 : '',
877
+ bundle_selling_price: sellingPrice,
878
+ bundle_payment_price: paymentPrice,
395
879
  option: formatSubmitOptionItems(rawBundle.option),
396
- bundle_group_id: rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.group_id,
397
- bundle_id: rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.id,
398
- metadata: _objectSpread(_objectSpread({}, existedMetadata), {}, {
880
+ bundle_group_id: (_rawBundle$bundle_gro = rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.bundle_group_id) !== null && _rawBundle$bundle_gro !== void 0 ? _rawBundle$bundle_gro : rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.group_id,
881
+ bundle_id: (_rawBundle$bundle_id = rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.bundle_id) !== null && _rawBundle$bundle_id !== void 0 ? _rawBundle$bundle_id : rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.id,
882
+ bundle_product_id: (_rawBundle$bundle_pro = rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.bundle_product_id) !== null && _rawBundle$bundle_pro !== void 0 ? _rawBundle$bundle_pro : rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle._bundle_product_id,
883
+ cover: rawBundle.cover,
884
+ metadata: _objectSpread(_objectSpread(_objectSpread({}, submitMetadata), hasSubmitBundleDiscounts && bundleMapId !== undefined ? {
885
+ custom_product_bundle_map_id: bundleMapId
886
+ } : {}), {}, {
399
887
  surcharge_fee: surchargeFee,
400
888
  relation_surcharge_ids: relationSurchargeIds,
401
889
  product_discount_difference: productDiscountDifference
402
890
  })
403
- });
891
+ };
404
892
  });
405
893
  }
406
894
 
@@ -412,7 +900,7 @@ function formatSubmitBundleItems(bundle) {
412
900
  * = `metadata.main_product_selling_price` + Σ(bundle_selling_price × num)。
413
901
  * - `original_price`:**行 composite 券前单价**
414
902
  * = `metadata.main_product_original_price` + Σ(bundle 原价 × num)。
415
- * - `payment_price`:兼容后端的出站字段,直接从 `selling_price` 派生(composite)。
903
+ * - `payment_price`:兼容后端的出站字段,行 composite 已减整单折扣均摊(无折扣时与 `selling_price` 同义)。
416
904
  * - `metadata.source_product_price`:主商品/variant 基础价(不含 option、不含折扣),权威源。
417
905
  * - `metadata.main_product_original_price`:含 option、不含折扣。
418
906
  * - `metadata.main_product_selling_price`:含 option、含主商品折扣。
@@ -421,59 +909,96 @@ function formatSubmitBundleItems(bundle) {
421
909
  * 本函数不再改造价格字段形状,仅做字段/metadata 裁剪。
422
910
  */
423
911
  function normalizeSubmitProduct(product) {
424
- var _origin = product._origin,
425
- identity_key = product.identity_key,
426
- submitProduct = _objectWithoutProperties(product, _excluded);
912
+ var _rawMetadata$product_, _submitProduct$produc, _submitProduct$paymen;
913
+ var _ref28 = product,
914
+ _runtimeUid = _ref28.unique_identification_number,
915
+ submitProduct = _objectWithoutProperties(_ref28, _excluded2);
916
+ var num = submitProduct.num,
917
+ _productSurchargeFee = submitProduct.surcharge_fee,
918
+ _deprecatedDiscountAmount = submitProduct.discount_amount,
919
+ _deprecatedDiscountType = submitProduct.discount_type,
920
+ _deprecatedDiscountway = submitProduct.discountway,
921
+ _deprecatedProductDiscountReason = submitProduct.product_discount_reason,
922
+ _deprecatedDiscountPer = submitProduct.discount_per,
923
+ productRest = _objectWithoutProperties(submitProduct, _excluded3);
924
+ delete productRest["product_".concat('option', "_item")];
427
925
  var rawMetadata = submitProduct.metadata || {};
428
926
  var bookingUid = rawMetadata.booking_uid;
429
927
  var cleanMetadata = {};
430
928
  if (rawMetadata.unique_identification_number) {
431
929
  cleanMetadata.unique_identification_number = rawMetadata.unique_identification_number;
432
930
  }
433
- var priceMetaKeys = ['main_product_original_price', 'main_product_selling_price', 'source_product_price', 'price_schema_version'];
931
+ var priceMetaKeys = ['main_product_original_price', 'main_product_selling_price', 'main_product_attached_bundle_selling_price', 'main_product_attached_bundle_payment_price', 'average_discount_amount_rate', 'source_product_price', 'main_product_attached_bundle_surcharge_fee', 'main_product_attached_bundle_tax_fee', 'surcharge_rounding_remainder', 'tax_fee_rounding_remainder', 'relation_surcharge_ids', 'discountable_flag', 'parent_unique_identification_number', 'product_add_schedule_time'];
434
932
  for (var _i = 0, _priceMetaKeys = priceMetaKeys; _i < _priceMetaKeys.length; _i++) {
435
933
  var key = _priceMetaKeys[_i];
436
934
  if (rawMetadata[key] !== undefined) {
437
935
  cleanMetadata[key] = rawMetadata[key];
438
936
  }
439
937
  }
938
+ cleanMetadata.product_discount_difference = (_rawMetadata$product_ = rawMetadata.product_discount_difference) !== null && _rawMetadata$product_ !== void 0 ? _rawMetadata$product_ : '';
440
939
  if (rawMetadata.price_breakdown) {
441
940
  cleanMetadata.price_breakdown = rawMetadata.price_breakdown;
442
941
  }
443
942
  if (rawMetadata.is_rule !== undefined) {
444
943
  cleanMetadata.is_rule = rawMetadata.is_rule;
445
944
  }
446
- return _objectSpread(_objectSpread(_objectSpread({}, submitProduct), bookingUid ? {
945
+ if (rawMetadata.holder_config !== undefined) {
946
+ cleanMetadata.holder_config = rawMetadata.holder_config;
947
+ }
948
+ var productSku = _objectSpread(_objectSpread({}, submitProduct.product_sku && _typeof(submitProduct.product_sku) === 'object' ? submitProduct.product_sku : {}), {}, {
949
+ option: formatSubmitOptionItems((_submitProduct$produc = submitProduct.product_sku) === null || _submitProduct$produc === void 0 ? void 0 : _submitProduct$produc.option)
950
+ });
951
+ return _objectSpread(_objectSpread(_objectSpread({}, productRest), bookingUid ? {
447
952
  booking_uid: bookingUid
448
953
  } : {}), {}, {
449
- product_option_item: formatSubmitOptionItems(submitProduct.product_option_item),
450
- discount_list: submitProduct.discount_list || [],
954
+ product_quantity: toBundleNumber(num !== null && num !== void 0 ? num : submitProduct.product_quantity, 1),
955
+ product_sku: productSku,
956
+ discount_list: collectSubmitProductDiscountList(submitProduct),
451
957
  product_bundle: formatSubmitBundleItems(submitProduct.product_bundle),
452
958
  metadata: cleanMetadata,
453
- // 出站兼容:后端消费 payment_price 字段,这里从 selling_price 直接派生。
454
- // 新语义下 selling_price 是 composite(含 option/bundle),payment_price 同语义。
455
- payment_price: submitProduct.selling_price
959
+ // 出站兼容:后端消费 payment_price 字段(行 composite 已减整单折扣均摊)。
960
+ // 由整单折扣均摊层产出;缺省(无折扣)时与 selling_price 同义。
961
+ payment_price: (_submitProduct$paymen = submitProduct.payment_price) !== null && _submitProduct$paymen !== void 0 ? _submitProduct$paymen : submitProduct.selling_price
456
962
  });
457
963
  }
458
- var SUBMIT_BOOKING_METADATA_WHITELIST = ['unique_identification_number', 'collect_pax'];
964
+ var SUBMIT_BOOKING_METADATA_WHITELIST = ['unique_identification_number', 'collect_pax', 'capacity', 'holder_id', 'resource_select_type', 'holder'];
965
+ export function normalizeBookingIsAll(booking) {
966
+ return booking.is_all === true || booking.is_all === 1 || booking.is_all === '1' || booking.is_all === 'true' ? 1 : 0;
967
+ }
968
+ export function normalizeBookingSubType(booking) {
969
+ if (normalizeBookingIsAll(booking) === 1) return 'days';
970
+ if (booking.sub_type !== undefined && booking.sub_type !== null && booking.sub_type !== '') {
971
+ return String(booking.sub_type);
972
+ }
973
+ return 'minutes';
974
+ }
459
975
  export function normalizeSubmitBooking(booking) {
460
976
  var rawMetadata = booking.metadata || {};
461
977
  var cleanMetadata = {};
462
- var _iterator3 = _createForOfIteratorHelper(SUBMIT_BOOKING_METADATA_WHITELIST),
463
- _step3;
978
+ var _iterator7 = _createForOfIteratorHelper(SUBMIT_BOOKING_METADATA_WHITELIST),
979
+ _step7;
464
980
  try {
465
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
466
- var key = _step3.value;
981
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
982
+ var key = _step7.value;
467
983
  if (rawMetadata[key] !== undefined) {
468
984
  cleanMetadata[key] = rawMetadata[key];
469
985
  }
470
986
  }
471
987
  } catch (err) {
472
- _iterator3.e(err);
988
+ _iterator7.e(err);
473
989
  } finally {
474
- _iterator3.f();
990
+ _iterator7.f();
475
991
  }
476
- return _objectSpread(_objectSpread({}, booking), {}, {
992
+ if (cleanMetadata.holder_id === undefined) cleanMetadata.holder_id = null;
993
+ var bookingRecord = booking;
994
+ var startDate = bookingRecord.start_date;
995
+ var shouldRestoreSelectDate = bookingRecord.select_date === undefined || bookingRecord.select_date === null || bookingRecord.select_date === '';
996
+ var selectDateFromStartDate = typeof startDate === 'string' ? startDate.split(/\s+/)[0] : startDate;
997
+ return _objectSpread(_objectSpread(_objectSpread({}, booking), shouldRestoreSelectDate && selectDateFromStartDate ? {
998
+ select_date: selectDateFromStartDate
999
+ } : {}), {}, {
1000
+ is_all: normalizeBookingIsAll(bookingRecord),
1001
+ sub_type: normalizeBookingSubType(bookingRecord),
477
1002
  metadata: cleanMetadata
478
1003
  });
479
1004
  }
@@ -504,27 +1029,26 @@ export function resolveSubmitCollectPax(tempOrder) {
504
1029
  return normalizeSubmitCollectPaxValue((_tempOrder$metadata = tempOrder.metadata) === null || _tempOrder$metadata === void 0 ? void 0 : _tempOrder$metadata.collect_pax);
505
1030
  }
506
1031
  export function createDefaultTempOrder(params) {
507
- var summary = params.summary || createEmptySummary();
508
1032
  return {
509
1033
  order_id: null,
510
- relation_id: undefined,
511
- table_form_id: undefined,
512
- resource_id: undefined,
513
- order_number: '',
514
- shop_order_number: '',
515
- type: 'appointment_booking',
516
- business_code: 'appointment_booking',
1034
+ external_sale_number: '',
1035
+ order_number: null,
1036
+ shop_order_number: null,
1037
+ shop_full_order_number: null,
1038
+ type: '',
1039
+ business_code: undefined,
517
1040
  platform: 'h5',
518
1041
  sales_channel: 'my_pisel',
519
1042
  order_sales_channel: 'online_store',
520
1043
  status: 'normal',
521
1044
  payment_status: 'payment_processing',
522
1045
  shipping_status: 'unfulfilled',
523
- customer_id: null,
1046
+ customer_id: 0,
524
1047
  customer_name: '',
525
1048
  country_calling_code: '',
526
1049
  phone: '',
527
1050
  email: '',
1051
+ customer: null,
528
1052
  is_price_include_tax: 1,
529
1053
  tax_title: '',
530
1054
  tax_country_code: '',
@@ -537,22 +1061,25 @@ export function createDefaultTempOrder(params) {
537
1061
  surcharge_fee: '0.00',
538
1062
  note: '',
539
1063
  schedule_date: params.now,
540
- created_at: params.now,
1064
+ created_at: undefined,
1065
+ request_unique_idempotency_token: '',
1066
+ vouchers: [],
541
1067
  products: [],
542
1068
  bookings: [],
543
1069
  payments: [],
544
1070
  surcharges: [],
545
- discount_list: [],
546
1071
  relation_forms: [],
547
1072
  contacts: [],
548
- contacts_info: [],
1073
+ contacts_info: null,
549
1074
  holder: null,
550
- summary: summary,
551
- metadata: {}
1075
+ metadata: {},
1076
+ _extend: {
1077
+ productsByUid: {}
1078
+ }
552
1079
  };
553
1080
  }
554
1081
  export function buildSubmitPayload(params) {
555
- var _ref6, _ref7, _ref8, _tempOrder$is_price_i, _tempOrder$is_deposit;
1082
+ var _tempOrder$customer_i, _tempOrder$order_numb, _tempOrder$shop_order, _tempOrder$shop_full_, _ref30, _tempOrder$is_price_i, _tempOrder$is_deposit, _enhancedPayload$summ;
556
1083
  var tempOrder = params.tempOrder,
557
1084
  cacheId = params.cacheId,
558
1085
  _params$now = params.now,
@@ -561,49 +1088,52 @@ export function buildSubmitPayload(params) {
561
1088
  businessCode = params.businessCode,
562
1089
  channel = params.channel,
563
1090
  type = params.type,
1091
+ summary = params.summary,
564
1092
  enhance = params.enhance;
565
1093
  var scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
566
- var summary = tempOrder.summary || createEmptySummary();
567
- var relationId = tempOrder.relation_id;
568
- var tableFormId = tempOrder.table_form_id;
569
1094
  var bookingUuid = createUuidV4();
570
- var bookingStart = dayjs(now);
571
- var bookingDuration = resolveTableOccupancyDuration(tempOrder);
572
- var bookingEnd = bookingStart.add(bookingDuration, 'minute');
573
- var bookings = relationId && tableFormId ? [{
574
- relation_id: 0,
575
- form_id: 0,
576
- start_time: bookingStart.format('HH:mm'),
577
- start_date: bookingStart.format('YYYY-MM-DD'),
578
- end_time: bookingEnd.format('HH:mm'),
579
- end_date: bookingEnd.format('YYYY-MM-DD'),
580
- duration: bookingDuration,
581
- metadata: {
582
- unique_identification_number: bookingUuid,
583
- collect_pax: resolveSubmitCollectPax(tempOrder)
584
- },
585
- select_date: bookingStart.format('YYYY-MM-DD'),
586
- is_all: false,
587
- like_status: 'common',
588
- schedule_id: 0,
589
- relation_type: '',
590
- number: 1
591
- }] : tempOrder.bookings || [];
592
- var formRecordIds = relationId && tableFormId ? [{
593
- form_id: tableFormId,
594
- form_record_id: relationId
595
- }] : undefined;
596
- var _createdAt = tempOrder.created_at,
597
- _summary = tempOrder.summary,
598
- _surcharges = tempOrder.surcharges,
599
- tempOrderRest = _objectWithoutProperties(tempOrder, _excluded2);
1095
+ var _ref29 = tempOrder,
1096
+ _extend = _ref29._extend,
1097
+ _relationId = _ref29.relation_id,
1098
+ _tableFormId = _ref29.table_form_id,
1099
+ _resourceId = _ref29.resource_id,
1100
+ _summary = _ref29.summary,
1101
+ _lastOrderInfo = _ref29.lastOrderInfo,
1102
+ _paidAmount = _ref29.paid_amount,
1103
+ _shopId = _ref29.shop_id,
1104
+ _shopNote = _ref29.shop_note,
1105
+ _shopServiceType = _ref29.shop_service_type,
1106
+ _startTime = _ref29.start_time,
1107
+ _customer = _ref29.customer,
1108
+ _discountList = _ref29.discount_list,
1109
+ _rootTaxFee = _ref29.tax_fee,
1110
+ _totalAmount = _ref29.total_amount,
1111
+ _totalRefundAmount = _ref29.total_refund_amount,
1112
+ _createDate = _ref29.create_date,
1113
+ _holderId = _ref29.holder_id,
1114
+ tempOrderRest = _objectWithoutProperties(_ref29, _excluded4);
1115
+ var submitType = type !== null && type !== void 0 ? type : tempOrder.type;
1116
+ if (!submitType) {
1117
+ var _tempOrder$bookings;
1118
+ // 如果外部没有传递 types,根据订单里当前是否有 bookings 来决定是 appointment_booking 还是 virtual
1119
+ if (tempOrder !== null && tempOrder !== void 0 && (_tempOrder$bookings = tempOrder.bookings) !== null && _tempOrder$bookings !== void 0 && _tempOrder$bookings.length) {
1120
+ submitType = 'appointment_booking';
1121
+ } else {
1122
+ submitType = 'virtual';
1123
+ }
1124
+ }
600
1125
  var payload = _objectSpread(_objectSpread({}, tempOrderRest), {}, {
601
- platform: normalizeSubmitPlatform(platform !== null && platform !== void 0 ? platform : tempOrder.platform),
602
- request_unique_idempotency_token: cacheId,
603
- type: (_ref6 = type !== null && type !== void 0 ? type : tempOrder.type) !== null && _ref6 !== void 0 ? _ref6 : 'table-order',
604
- business_code: (_ref7 = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code) !== null && _ref7 !== void 0 ? _ref7 : 'table-order',
1126
+ customer_id: (_tempOrder$customer_i = tempOrder.customer_id) !== null && _tempOrder$customer_i !== void 0 ? _tempOrder$customer_i : 1,
1127
+ customer_name: tempOrder.customer_name || 'Walk-In',
1128
+ order_number: (_tempOrder$order_numb = tempOrder.order_number) !== null && _tempOrder$order_numb !== void 0 ? _tempOrder$order_numb : null,
1129
+ shop_order_number: (_tempOrder$shop_order = tempOrder.shop_order_number) !== null && _tempOrder$shop_order !== void 0 ? _tempOrder$shop_order : null,
1130
+ shop_full_order_number: (_tempOrder$shop_full_ = tempOrder.shop_full_order_number) !== null && _tempOrder$shop_full_ !== void 0 ? _tempOrder$shop_full_ : null,
1131
+ platform: normalizeSubmitPlatform(platform),
1132
+ request_unique_idempotency_token: (params === null || params === void 0 ? void 0 : params.request_unique_idempotency_token) || tempOrder.request_unique_idempotency_token || "".concat(tempOrder.external_sale_number, "_").concat(now.getTime()),
1133
+ type: submitType,
1134
+ business_code: businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code,
605
1135
  sales_channel: tempOrder.sales_channel || 'my_pisel',
606
- order_sales_channel: (_ref8 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref8 !== void 0 ? _ref8 : 'online_store',
1136
+ order_sales_channel: (_ref30 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref30 !== void 0 ? _ref30 : 'online_store',
607
1137
  status: tempOrder.status || 'normal',
608
1138
  payment_status: tempOrder.payment_status || 'payment_processing',
609
1139
  // shipping_status: tempOrder.shipping_status || 'unfulfilled',
@@ -612,63 +1142,127 @@ export function buildSubmitPayload(params) {
612
1142
  is_deposit: (_tempOrder$is_deposit = tempOrder.is_deposit) !== null && _tempOrder$is_deposit !== void 0 ? _tempOrder$is_deposit : 0,
613
1143
  deposit_amount: tempOrder.deposit_amount || '0.00',
614
1144
  shop_discount: tempOrder.shop_discount || '0.00',
615
- surcharge_fee: summary.surcharge_fee || tempOrder.surcharge_fee || '0.00',
1145
+ surcharge_fee: tempOrder.surcharge_fee || '0.00',
616
1146
  note: tempOrder.note || '',
1147
+ delivery_type: tempOrder.delivery_type || 'nil',
617
1148
  schedule_date: scheduleDate,
618
- bookings: bookings.map(function (booking) {
1149
+ // created_at: tempOrder.created_at || formatDateTime(now), 和后端协定这个字段先不提交到接口
1150
+ bookings: (tempOrder.bookings || []).filter(function (booking) {
1151
+ return Number(booking.parent_id) !== 0;
1152
+ }).map(function (booking) {
619
1153
  return normalizeSubmitBooking(booking);
620
1154
  }),
621
1155
  payments: tempOrder.payments || [],
622
- // discount_list: tempOrder.discount_list || [],
623
1156
  relation_forms: tempOrder.relation_forms || [],
624
- form_record_ids: formRecordIds,
625
1157
  // contacts: tempOrder.contacts || [],
626
- contacts_info: tempOrder.contacts_info || [],
1158
+ contacts_info: tempOrder.contacts_info && !Array.isArray(tempOrder.contacts_info) ? tempOrder.contacts_info : null,
627
1159
  // holder: tempOrder.holder || null,
628
- // summary,
1160
+ summary: summary || tempOrder.summary || createEmptySummary(),
629
1161
  metadata: function () {
630
- var _ref9 = tempOrder.metadata || {},
631
- _collectPax = _ref9.collect_pax,
632
- _tableOccupancyDuration = _ref9.table_occupancy_duration,
633
- rest = _objectWithoutProperties(_ref9, _excluded3);
1162
+ var _ref31 = tempOrder.metadata || {},
1163
+ _collectPax = _ref31.collect_pax,
1164
+ _tableOccupancyDuration = _ref31.table_occupancy_duration,
1165
+ rest = _objectWithoutProperties(_ref31, _excluded5);
634
1166
  return _objectSpread({}, rest);
635
1167
  }(),
636
1168
  products: (tempOrder.products || []).map(function (product) {
637
1169
  return normalizeSubmitProduct(product);
638
1170
  })
639
1171
  });
640
- return enhance ? enhance(payload, {
1172
+ if (!enhance) return payload;
1173
+ var enhancedPayload = enhance(payload, {
641
1174
  tempOrder: tempOrder,
642
1175
  bookingUuid: bookingUuid,
643
1176
  now: now
644
- }) : payload;
1177
+ });
1178
+ return _objectSpread(_objectSpread({}, enhancedPayload), {}, {
1179
+ summary: (_enhancedPayload$summ = enhancedPayload.summary) !== null && _enhancedPayload$summ !== void 0 ? _enhancedPayload$summ : payload.summary
1180
+ });
645
1181
  }
646
-
647
- /** 加单(scanOrderMore)不应提交 booking 关联的虚拟规则商品行 */
648
- export function filterProductsForScanOrderMore(products) {
649
- return (products || []).filter(function (p) {
650
- var _p$metadata;
651
- return ((_p$metadata = p.metadata) === null || _p$metadata === void 0 ? void 0 : _p$metadata.is_rule) !== true;
1182
+ export function mapPaymentItemToOrderPayment(paymentItem) {
1183
+ var _item$custom_payment_, _item$payment_time, _item$created_at, _item$amount;
1184
+ var item = paymentItem;
1185
+ var customPaymentId = (_item$custom_payment_ = item.custom_payment_id) !== null && _item$custom_payment_ !== void 0 ? _item$custom_payment_ : item.id;
1186
+ var metadata = item.metadata && _typeof(item.metadata) === 'object' ? _objectSpread({}, item.metadata) : {};
1187
+ if (item.uuid && !metadata.unique_payment_number) {
1188
+ metadata.unique_payment_number = String(item.uuid);
1189
+ }
1190
+ var paymentMetadataKeys = ['rounding_rule', 'shop_wallet_pass_id', 'actual_paid_amount', 'change_given_amount'];
1191
+ for (var _i3 = 0, _paymentMetadataKeys = paymentMetadataKeys; _i3 < _paymentMetadataKeys.length; _i3++) {
1192
+ var key = _paymentMetadataKeys[_i3];
1193
+ if (item[key] !== undefined && metadata[key] === undefined) {
1194
+ metadata[key] = item[key];
1195
+ }
1196
+ }
1197
+ var timestamp = dayjs().format('YYYY-MM-DD HH:mm:ss');
1198
+ var paymentTime = (_item$payment_time = item.payment_time) !== null && _item$payment_time !== void 0 ? _item$payment_time : timestamp;
1199
+ var createdAt = (_item$created_at = item.created_at) !== null && _item$created_at !== void 0 ? _item$created_at : timestamp;
1200
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, item.order_payment_id !== undefined ? {
1201
+ order_payment_id: item.order_payment_id
1202
+ } : {}), {}, {
1203
+ amount: String((_item$amount = item.amount) !== null && _item$amount !== void 0 ? _item$amount : '0.00'),
1204
+ code: String(item.code || ''),
1205
+ custom_payment_id: Number(customPaymentId !== null && customPaymentId !== void 0 ? customPaymentId : 0)
1206
+ }, item.custom_payment_type !== undefined ? {
1207
+ custom_payment_type: String(item.custom_payment_type)
1208
+ } : {}), {}, {
1209
+ name: String(item.name || ''),
1210
+ type: String(item.type || '')
1211
+ }, item.voucher_id !== undefined ? {
1212
+ voucher_id: item.voucher_id
1213
+ } : {}), item.origin_amount !== undefined ? {
1214
+ origin_amount: String(item.origin_amount)
1215
+ } : {}), item.service_fee !== undefined ? {
1216
+ service_fee: String(item.service_fee)
1217
+ } : {}), item.status !== undefined ? {
1218
+ status: item.status
1219
+ } : {}), {}, {
1220
+ payment_time: paymentTime,
1221
+ created_at: createdAt
1222
+ }, item.wallet_pass_usage_unit !== undefined ? {
1223
+ wallet_pass_usage_unit: item.wallet_pass_usage_unit
1224
+ } : {}), item.wallet_pass_use_value !== undefined ? {
1225
+ wallet_pass_use_value: item.wallet_pass_use_value
1226
+ } : {}), item.fund_record && _typeof(item.fund_record) === 'object' && !Array.isArray(item.fund_record) ? {
1227
+ fund_record: _objectSpread({}, item.fund_record)
1228
+ } : {}), {}, {
1229
+ metadata: metadata
1230
+ }, item.rounding_amount !== undefined ? {
1231
+ rounding_amount: String(item.rounding_amount)
1232
+ } : {}), item.service_charge !== undefined ? {
1233
+ service_charge: item.service_charge
1234
+ } : {}), item.order_payment_type !== undefined ? {
1235
+ order_payment_type: item.order_payment_type
1236
+ } : {}), item.updated_at !== undefined ? {
1237
+ updated_at: item.updated_at
1238
+ } : {});
1239
+ }
1240
+ export function mapPaymentItemsToOrderPayments(paymentItems) {
1241
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1242
+ if (!Array.isArray(paymentItems)) return [];
1243
+ return paymentItems.filter(function (item) {
1244
+ return options.includeVoided || item.status !== 'voided';
1245
+ }).map(function (item) {
1246
+ return mapPaymentItemToOrderPayment(item);
652
1247
  });
653
1248
  }
654
1249
 
655
1250
  /**
656
1251
  * 历史 V1 加餐结构映射器。
657
1252
  *
658
- * @deprecated 加餐(`PUT /order/order/product/:id`)已改为与正常 checkout 共用
659
- * `ScanOrderSubmitProduct` 新结构(见 `OrderModule.submitTempOrder` 的加餐分支)。
1253
+ * @deprecated 标准 Sales checkout 已统一提交结构。
660
1254
  * 本函数仅保留以兼容历史接入方,未来会移除。新代码请勿再调用。
661
1255
  */
662
1256
  export function formatV1Product(products) {
663
1257
  return products.map(function (product) {
664
- var _product$note;
1258
+ var _product$product_sku, _product$note;
665
1259
  return {
666
1260
  bundle: product.product_bundle,
667
1261
  key: product.product_id,
668
- option: product.product_option_item,
1262
+ option: ((_product$product_sku = product.product_sku) === null || _product$product_sku === void 0 ? void 0 : _product$product_sku.option) || [],
669
1263
  product_id: product.product_id,
670
1264
  product_variant_id: product.product_variant_id,
671
- num: product.num,
1265
+ num: product.product_quantity,
672
1266
  note: String((_product$note = product.note) !== null && _product$note !== void 0 ? _product$note : ''),
673
1267
  rowKey: product.product_id,
674
1268
  session: null,
@@ -676,4 +1270,205 @@ export function formatV1Product(products) {
676
1270
  };
677
1271
  });
678
1272
  }
679
- export { createEmptySummary } from "../../solution/ScanOrder/utils";
1273
+
1274
+ /**
1275
+ * 判断 holder_id 是否已分配(非空)。
1276
+ *
1277
+ * @example
1278
+ * hasAssignedHolderId(12); // true
1279
+ * hasAssignedHolderId([]); // false
1280
+ */
1281
+ export function hasAssignedHolderId(value) {
1282
+ if (value === undefined || value === null || value === '') return false;
1283
+ if (Array.isArray(value)) return value.length > 0;
1284
+ return true;
1285
+ }
1286
+
1287
+ /**
1288
+ * 清空 tempOrder 购物车行上的 holder 分配(products / bookings / runtime origin)。
1289
+ * 移除或更换下单客户时调用,与 booking 页换客户清 holder 行为对齐。
1290
+ *
1291
+ * @example
1292
+ * clearTempOrderHolderAssignments(tempOrder);
1293
+ */
1294
+ export function clearTempOrderHolderAssignments(tempOrder) {
1295
+ var _tempOrder$_extend;
1296
+ var changed = false;
1297
+ var resetHolderField = function resetHolderField(target) {
1298
+ var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'holder_id';
1299
+ if (!hasAssignedHolderId(target[key])) return;
1300
+ target[key] = null;
1301
+ changed = true;
1302
+ };
1303
+ var _iterator8 = _createForOfIteratorHelper(tempOrder.products || []),
1304
+ _step8;
1305
+ try {
1306
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
1307
+ var product = _step8.value;
1308
+ if (product.metadata && _typeof(product.metadata) === 'object') {
1309
+ resetHolderField(product.metadata);
1310
+ }
1311
+ }
1312
+ } catch (err) {
1313
+ _iterator8.e(err);
1314
+ } finally {
1315
+ _iterator8.f();
1316
+ }
1317
+ var _iterator9 = _createForOfIteratorHelper(tempOrder.bookings || []),
1318
+ _step9;
1319
+ try {
1320
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
1321
+ var booking = _step9.value;
1322
+ var bookingRecord = booking;
1323
+ if (booking.metadata && _typeof(booking.metadata) === 'object') {
1324
+ resetHolderField(booking.metadata);
1325
+ }
1326
+ if (bookingRecord.holder !== undefined && bookingRecord.holder !== null) {
1327
+ delete bookingRecord.holder;
1328
+ changed = true;
1329
+ }
1330
+ }
1331
+ } catch (err) {
1332
+ _iterator9.e(err);
1333
+ } finally {
1334
+ _iterator9.f();
1335
+ }
1336
+ var productsByUid = (_tempOrder$_extend = tempOrder._extend) === null || _tempOrder$_extend === void 0 ? void 0 : _tempOrder$_extend.productsByUid;
1337
+ if (productsByUid && _typeof(productsByUid) === 'object') {
1338
+ for (var _i4 = 0, _Object$values = Object.values(productsByUid); _i4 < _Object$values.length; _i4++) {
1339
+ var entry = _Object$values[_i4];
1340
+ var origin = entry === null || entry === void 0 ? void 0 : entry.origin;
1341
+ if (!origin || _typeof(origin) !== 'object') continue;
1342
+ if (origin.metadata && _typeof(origin.metadata) === 'object') {
1343
+ resetHolderField(origin.metadata);
1344
+ }
1345
+ if (origin._extend && _typeof(origin._extend) === 'object') {
1346
+ resetHolderField(origin._extend);
1347
+ }
1348
+ }
1349
+ }
1350
+ return changed;
1351
+ }
1352
+
1353
+ /**
1354
+ * 读取购物车行的 stable uid(优先 metadata.unique_identification_number)。
1355
+ *
1356
+ * @example
1357
+ * getOrderProductLineUid({ metadata: { unique_identification_number: 'line-1' } }); // 'line-1'
1358
+ */
1359
+ export function getOrderProductLineUid(product) {
1360
+ var _product$metadata$uni, _product$metadata7;
1361
+ if (!product || _typeof(product) !== 'object') return null;
1362
+ var uid = (_product$metadata$uni = (_product$metadata7 = product.metadata) === null || _product$metadata7 === void 0 ? void 0 : _product$metadata7.unique_identification_number) !== null && _product$metadata$uni !== void 0 ? _product$metadata$uni : product.unique_identification_number;
1363
+ if (uid === undefined || uid === null || uid === '') return null;
1364
+ return String(uid);
1365
+ }
1366
+ export function getRuntimeProductOrigin(tempOrder, product) {
1367
+ var _tempOrder$_extend2, _tempOrder$_extend3;
1368
+ var uid = getOrderProductLineUid(product);
1369
+ if (uid && tempOrder !== null && tempOrder !== void 0 && (_tempOrder$_extend2 = tempOrder._extend) !== null && _tempOrder$_extend2 !== void 0 && (_tempOrder$_extend2 = _tempOrder$_extend2.productsByUid) !== null && _tempOrder$_extend2 !== void 0 && (_tempOrder$_extend2 = _tempOrder$_extend2[uid]) !== null && _tempOrder$_extend2 !== void 0 && _tempOrder$_extend2.origin) {
1370
+ return tempOrder._extend.productsByUid[uid].origin;
1371
+ }
1372
+ var matchedProduct = ((tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.products) || []).find(function (item) {
1373
+ var _ref32, _item$product_id, _ref33, _product$product_id;
1374
+ return item === product || getOrderProductLineUid(item) === uid || String((_ref32 = (_item$product_id = item === null || item === void 0 ? void 0 : item.product_id) !== null && _item$product_id !== void 0 ? _item$product_id : item === null || item === void 0 ? void 0 : item.id) !== null && _ref32 !== void 0 ? _ref32 : '') === String((_ref33 = (_product$product_id = product === null || product === void 0 ? void 0 : product.product_id) !== null && _product$product_id !== void 0 ? _product$product_id : product === null || product === void 0 ? void 0 : product.id) !== null && _ref33 !== void 0 ? _ref33 : '');
1375
+ });
1376
+ var matchedUid = matchedProduct ? getOrderProductLineUid(matchedProduct) : '';
1377
+ return matchedUid ? (tempOrder === null || tempOrder === void 0 || (_tempOrder$_extend3 = tempOrder._extend) === null || _tempOrder$_extend3 === void 0 || (_tempOrder$_extend3 = _tempOrder$_extend3.productsByUid) === null || _tempOrder$_extend3 === void 0 || (_tempOrder$_extend3 = _tempOrder$_extend3[matchedUid]) === null || _tempOrder$_extend3 === void 0 ? void 0 : _tempOrder$_extend3.origin) || null : null;
1378
+ }
1379
+ export function isHolderConfigRequired(holderConfig) {
1380
+ if (!holderConfig || _typeof(holderConfig) !== 'object') return false;
1381
+ if (holderConfig.status === 'disable') return false;
1382
+ return Number(holderConfig.required) === 1;
1383
+ }
1384
+ export function productRequiresFormSubject(tempOrder, product) {
1385
+ var _tempOrder$products, _orderProduct$metadat;
1386
+ var _orderProduct = tempOrder === null || tempOrder === void 0 || (_tempOrder$products = tempOrder.products) === null || _tempOrder$products === void 0 ? void 0 : _tempOrder$products.find(function (item) {
1387
+ return item.metadata.unique_identification_number === product._id || item.product_id === product.id;
1388
+ });
1389
+ var runtimeOrigin = getRuntimeProductOrigin(tempOrder, product);
1390
+ return isHolderConfigRequired(_orderProduct === null || _orderProduct === void 0 || (_orderProduct$metadat = _orderProduct.metadata) === null || _orderProduct$metadat === void 0 ? void 0 : _orderProduct$metadat.holder_config) || isHolderConfigRequired(runtimeOrigin === null || runtimeOrigin === void 0 ? void 0 : runtimeOrigin.holder_config) || isHolderConfigRequired(product === null || product === void 0 ? void 0 : product.holder_config);
1391
+ }
1392
+ export function resolveIsFormSubject(tempOrder, product) {
1393
+ var _tempOrder$holder;
1394
+ debugger;
1395
+ // 旧版预约维度的 holder 类型仍然生效;新版则从当前商品 holder_config 判断。
1396
+ if ((tempOrder === null || tempOrder === void 0 || (_tempOrder$holder = tempOrder.holder) === null || _tempOrder$holder === void 0 ? void 0 : _tempOrder$holder.type) === 'form') return true;
1397
+ if (product) return productRequiresFormSubject(tempOrder, product);
1398
+ return ((tempOrder === null || tempOrder === void 0 ? void 0 : tempOrder.products) || []).some(function (item) {
1399
+ return productRequiresFormSubject(tempOrder, item);
1400
+ });
1401
+ }
1402
+
1403
+ /**
1404
+ * 判断展示字段是否为空(含 i18n 对象全空)。
1405
+ *
1406
+ * @example
1407
+ * isEmptyOrderProductDisplayValue(''); // true
1408
+ * isEmptyOrderProductDisplayValue({ auto: '桌台费' }); // false
1409
+ */
1410
+ export function isEmptyOrderProductDisplayValue(value) {
1411
+ if (value === undefined || value === null) return true;
1412
+ if (typeof value === 'string') return value.trim() === '';
1413
+ if (_typeof(value) === 'object') {
1414
+ var record = value;
1415
+ return !Object.values(record).some(function (item) {
1416
+ return typeof item === 'string' && item.trim() !== '';
1417
+ });
1418
+ }
1419
+ return false;
1420
+ }
1421
+
1422
+ /**
1423
+ * calcDiscount / applyDiscount 回写时 Rules 往往不带 product_title 等展示字段;
1424
+ * 用旧行补齐,避免编辑态 hydrate 后标题被冲掉。
1425
+ *
1426
+ * @example
1427
+ * mergeOrderProductDisplayFields(
1428
+ * { product_title: { auto: '桌台费' }, metadata: { unique_identification_number: 'u1' } },
1429
+ * { selling_price: '10.00', metadata: { unique_identification_number: 'u1' } },
1430
+ * );
1431
+ */
1432
+ export function mergeOrderProductDisplayFields(previous, next) {
1433
+ var merged = _objectSpread({}, next);
1434
+ var displayFields = ['product_title', 'product_name', 'product_cover', 'cover', 'product_cover', 'variant_title', 'product_sku', 'payment_price'];
1435
+ displayFields.forEach(function (field) {
1436
+ if (isEmptyOrderProductDisplayValue(merged[field]) && !isEmptyOrderProductDisplayValue(previous[field])) {
1437
+ merged[field] = previous[field];
1438
+ }
1439
+ });
1440
+ if (previous.metadata || next.metadata) {
1441
+ merged.metadata = _objectSpread(_objectSpread({}, previous.metadata || {}), next.metadata || {});
1442
+ ['product_title', 'product_name'].forEach(function (field) {
1443
+ var _previous$metadata;
1444
+ if (isEmptyOrderProductDisplayValue(merged.metadata[field]) && !isEmptyOrderProductDisplayValue((_previous$metadata = previous.metadata) === null || _previous$metadata === void 0 ? void 0 : _previous$metadata[field])) {
1445
+ merged.metadata[field] = previous.metadata[field];
1446
+ }
1447
+ });
1448
+ }
1449
+ if (previous._extend && !merged._extend) {
1450
+ merged._extend = previous._extend;
1451
+ }
1452
+ return merged;
1453
+ }
1454
+
1455
+ /**
1456
+ * 按 uid 索引 tempOrder.products,供 applyDiscount 合并展示字段。
1457
+ *
1458
+ * @example
1459
+ * indexOrderProductsByUid([{ metadata: { unique_identification_number: 'u1' } }]);
1460
+ */
1461
+ export function indexOrderProductsByUid(products) {
1462
+ var map = new Map();
1463
+ (products || []).forEach(function (product, index) {
1464
+ var uid = getOrderProductLineUid(product);
1465
+ if (uid) {
1466
+ map.set(uid, product);
1467
+ return;
1468
+ }
1469
+ map.set("__index__:".concat(index), product);
1470
+ });
1471
+ return map;
1472
+ }
1473
+ export { createEmptySummary } from "../../solution/ScanOrder/utils";
1474
+ export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems } from "./utils/manualProductDiscount";