@pisell/pisellos 2.2.244 → 2.2.246

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