@pisell/pisellos 0.0.568 → 0.10.1

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 (588) hide show
  1. package/dist/core/index.js +10 -6
  2. package/dist/index.d.ts +0 -1
  3. package/dist/index.js +0 -3
  4. package/dist/model/strategy/adapter/promotion/evaluator.js +3 -2
  5. package/dist/model/strategy/adapter/walletPass/evaluator.js +7 -5
  6. package/dist/model/strategy/adapter/walletPass/example.js +26 -3
  7. package/dist/model/strategy/adapter/walletPass/index.js +5 -5
  8. package/dist/model/strategy/adapter/walletPass/type.d.ts +0 -3
  9. package/dist/model/strategy/adapter/walletPass/utils.d.ts +0 -26
  10. package/dist/model/strategy/adapter/walletPass/utils.js +24 -96
  11. package/dist/model/strategy/strategy-example.js +19 -5
  12. package/dist/modules/BaseModule.d.ts +2 -2
  13. package/dist/modules/BaseModule.js +12 -14
  14. package/dist/modules/BookingContext/index.d.ts +48 -0
  15. package/dist/modules/BookingContext/index.js +566 -0
  16. package/dist/modules/BookingContext/types.d.ts +102 -0
  17. package/dist/modules/BookingContext/types.js +51 -0
  18. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  19. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +302 -0
  20. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  21. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +149 -0
  22. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  23. package/dist/modules/BookingContext/utils/cacheItemToBookingInput.js +249 -0
  24. package/dist/modules/BookingContext/utils/flexible.d.ts +28 -0
  25. package/dist/modules/BookingContext/utils/flexible.js +56 -0
  26. package/dist/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  27. package/dist/modules/BookingContext/utils/formatResourceList.js +38 -0
  28. package/dist/modules/BookingContext/utils/index.d.ts +11 -0
  29. package/dist/modules/BookingContext/utils/index.js +11 -0
  30. package/dist/modules/BookingContext/utils/noResource.d.ts +13 -0
  31. package/dist/modules/BookingContext/utils/noResource.js +77 -0
  32. package/dist/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  33. package/dist/modules/BookingContext/utils/orderLineDisplay.js +36 -0
  34. package/dist/modules/BookingContext/utils/productExtend.d.ts +72 -0
  35. package/dist/modules/BookingContext/utils/productExtend.js +339 -0
  36. package/dist/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  37. package/dist/modules/BookingContext/utils/resourceErrors.js +74 -0
  38. package/dist/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  39. package/dist/modules/BookingContext/utils/resourceSelection.js +24 -0
  40. package/dist/modules/BookingContext/utils/resources.d.ts +80 -0
  41. package/dist/modules/BookingContext/utils/resources.js +486 -0
  42. package/dist/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  43. package/dist/modules/BookingContext/utils/serviceTimes.js +151 -0
  44. package/dist/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  45. package/dist/modules/BookingContext/utils/timeSlices.js +100 -0
  46. package/dist/modules/Cart/index.js +3 -0
  47. package/dist/modules/Cart/utils/cartProduct.js +27 -5
  48. package/dist/modules/Cart/utils/cartResource.js +0 -2
  49. package/dist/modules/Cart/utils/changePrice.js +11 -11
  50. package/dist/modules/Customer/index.d.ts +20 -0
  51. package/dist/modules/Customer/index.js +172 -83
  52. package/dist/modules/Customer/types.d.ts +2 -0
  53. package/dist/modules/Date/index.js +5 -1
  54. package/dist/modules/Discount/index.d.ts +2 -2
  55. package/dist/modules/Discount/index.js +43 -30
  56. package/dist/modules/Discount/types.d.ts +1 -1
  57. package/dist/modules/OpenData/index.d.ts +8 -0
  58. package/dist/modules/OpenData/index.js +38 -16
  59. package/dist/modules/Order/index.d.ts +449 -24
  60. package/dist/modules/Order/index.js +5460 -574
  61. package/dist/modules/Order/types.d.ts +693 -88
  62. package/dist/modules/Order/types.js +68 -1
  63. package/dist/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  64. package/dist/modules/Order/utils/bundleDiscountHydration.js +144 -0
  65. package/dist/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  66. package/dist/modules/Order/utils/manualProductDiscount.js +210 -0
  67. package/dist/modules/Order/utils/orderCollectionIdentity.d.ts +53 -0
  68. package/dist/modules/Order/utils/orderCollectionIdentity.js +405 -0
  69. package/dist/modules/Order/utils.d.ts +167 -18
  70. package/dist/modules/Order/utils.js +960 -165
  71. package/dist/modules/Payment/index.d.ts +10 -9
  72. package/dist/modules/Payment/index.js +573 -746
  73. package/dist/modules/Payment/types.d.ts +44 -24
  74. package/dist/modules/Payment/utils.d.ts +1 -1
  75. package/dist/modules/Payment/utils.js +4 -3
  76. package/dist/modules/Payment/walletpass.d.ts +0 -2
  77. package/dist/modules/Payment/walletpass.js +49 -33
  78. package/dist/modules/Product/types.d.ts +29 -7
  79. package/dist/modules/ProductList/index.d.ts +17 -13
  80. package/dist/modules/ProductList/index.js +182 -81
  81. package/dist/modules/ProductList/types.d.ts +16 -0
  82. package/dist/modules/Quotation/index.d.ts +22 -2
  83. package/dist/modules/Quotation/index.js +108 -42
  84. package/dist/modules/Quotation/types.d.ts +19 -0
  85. package/dist/modules/ResourcePlanner/index.d.ts +24 -0
  86. package/dist/modules/ResourcePlanner/index.js +181 -0
  87. package/dist/modules/ResourcePlanner/planner.d.ts +14 -0
  88. package/dist/modules/ResourcePlanner/planner.js +1069 -0
  89. package/dist/modules/ResourcePlanner/types.d.ts +227 -0
  90. package/dist/modules/ResourcePlanner/types.js +1 -0
  91. package/dist/modules/Rules/index.d.ts +8 -10
  92. package/dist/modules/Rules/index.js +324 -513
  93. package/dist/modules/Rules/types.d.ts +14 -3
  94. package/dist/modules/SalesSummary/index.d.ts +23 -26
  95. package/dist/modules/SalesSummary/index.js +152 -46
  96. package/dist/modules/SalesSummary/types.d.ts +9 -1
  97. package/dist/modules/SalesSummary/utils.d.ts +3 -22
  98. package/dist/modules/SalesSummary/utils.js +804 -165
  99. package/dist/modules/Schedule/getDateIsInSchedule.js +14 -12
  100. package/dist/modules/Schedule/index.d.ts +18 -5
  101. package/dist/modules/Schedule/index.js +79 -24
  102. package/dist/modules/Schedule/types.d.ts +2 -0
  103. package/dist/modules/Schedule/utils.js +1 -0
  104. package/dist/modules/Step/index.js +1 -0
  105. package/dist/modules/Summary/index.js +4 -3
  106. package/dist/modules/Summary/utils.js +22 -43
  107. package/dist/modules/SurchargeList/index.d.ts +18 -0
  108. package/dist/modules/SurchargeList/index.js +185 -0
  109. package/dist/modules/SurchargeList/types.d.ts +15 -0
  110. package/dist/modules/SurchargeList/types.js +1 -0
  111. package/dist/modules/index.d.ts +3 -0
  112. package/dist/modules/index.js +4 -1
  113. package/dist/plugins/app.d.ts +2 -0
  114. package/dist/plugins/request.d.ts +1 -0
  115. package/dist/plugins/request.js +4 -1
  116. package/dist/plugins/window.js +6 -2
  117. package/dist/server/index.d.ts +462 -8
  118. package/dist/server/index.js +6168 -680
  119. package/dist/server/modules/floor-plan/index.d.ts +39 -0
  120. package/dist/server/modules/floor-plan/index.js +595 -0
  121. package/dist/server/modules/floor-plan/types.d.ts +43 -0
  122. package/dist/server/modules/floor-plan/types.js +13 -0
  123. package/dist/server/modules/index.d.ts +7 -2
  124. package/dist/server/modules/index.js +6 -0
  125. package/dist/server/modules/menu/index.js +41 -32
  126. package/dist/server/modules/order/index.d.ts +207 -14
  127. package/dist/server/modules/order/index.js +2328 -379
  128. package/dist/server/modules/order/types.d.ts +76 -5
  129. package/dist/server/modules/order/types.js +14 -1
  130. package/dist/server/modules/order/utils/filterBookings.d.ts +7 -1
  131. package/dist/server/modules/order/utils/filterBookings.js +118 -11
  132. package/dist/server/modules/order/utils/filterOrders.js +242 -14
  133. package/dist/server/modules/payment/index.d.ts +28 -0
  134. package/dist/server/modules/payment/index.js +305 -0
  135. package/dist/server/modules/payment/types.d.ts +9 -0
  136. package/dist/server/modules/payment/types.js +1 -0
  137. package/dist/server/modules/products/index.d.ts +105 -14
  138. package/dist/server/modules/products/index.js +1416 -521
  139. package/dist/server/modules/products/types.d.ts +34 -1
  140. package/dist/server/modules/products/types.js +4 -0
  141. package/dist/server/modules/quotation/index.d.ts +39 -0
  142. package/dist/server/modules/quotation/index.js +298 -77
  143. package/dist/server/modules/resource/index.d.ts +2 -3
  144. package/dist/server/modules/resource/index.js +109 -86
  145. package/dist/server/modules/schedule/index.d.ts +6 -4
  146. package/dist/server/modules/schedule/index.js +145 -106
  147. package/dist/server/test.json +713 -0
  148. package/dist/server/types.d.ts +2 -0
  149. package/dist/server/utils/product.js +3 -2
  150. package/dist/server/utils/small-ticket.d.ts +71 -0
  151. package/dist/server/utils/small-ticket.js +963 -0
  152. package/dist/solution/BaseSales/index.d.ts +378 -0
  153. package/dist/solution/BaseSales/index.js +4009 -0
  154. package/dist/solution/BaseSales/types.d.ts +394 -0
  155. package/dist/solution/BaseSales/types.js +40 -0
  156. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  157. package/dist/solution/BaseSales/utils/cartPromotion.js +1450 -0
  158. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +144 -0
  159. package/dist/solution/BaseSales/utils/parseSalesResponse.js +157 -0
  160. package/dist/solution/BaseSales/utils/quotationPrice.d.ts +18 -0
  161. package/dist/solution/BaseSales/utils/quotationPrice.js +250 -0
  162. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +63 -0
  163. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +218 -0
  164. package/dist/solution/BaseSales/utils.d.ts +40 -0
  165. package/dist/solution/BaseSales/utils.js +263 -0
  166. package/dist/solution/BookingByStep/index.d.ts +1 -1
  167. package/dist/solution/BookingByStep/index.js +60 -11
  168. package/dist/solution/BookingByStep/utils/capacity.js +11 -1
  169. package/dist/solution/BookingByStep/utils/resources.js +3 -1
  170. package/dist/solution/BookingByStep/utils/timeslots.js +43 -2
  171. package/dist/solution/BookingTicket/index.d.ts +393 -24
  172. package/dist/solution/BookingTicket/index.js +2508 -443
  173. package/dist/solution/BookingTicket/types.d.ts +191 -6
  174. package/dist/solution/BookingTicket/types.js +83 -10
  175. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  176. package/dist/solution/BookingTicket/utils/addProductDecision.js +346 -0
  177. package/dist/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  178. package/dist/solution/BookingTicket/utils/addTimeAvailability.js +95 -0
  179. package/dist/solution/BookingTicket/utils/bookingStatus.d.ts +77 -0
  180. package/dist/solution/BookingTicket/utils/bookingStatus.js +136 -0
  181. package/dist/solution/BookingTicket/utils/cartView.d.ts +29 -0
  182. package/dist/solution/BookingTicket/utils/cartView.js +209 -0
  183. package/dist/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  184. package/dist/solution/BookingTicket/utils/exampleData.js +183 -0
  185. package/dist/solution/BookingTicket/utils/orderCustomer.d.ts +4 -0
  186. package/dist/solution/BookingTicket/utils/orderCustomer.js +31 -0
  187. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  188. package/dist/solution/BookingTicket/utils/resolveBestAddTimePlan.js +438 -0
  189. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  190. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +400 -0
  191. package/dist/solution/BookingTicket/utils/scan/cloudSearch.d.ts +4 -0
  192. package/dist/solution/BookingTicket/utils/scan/cloudSearch.js +42 -1
  193. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  194. package/dist/solution/BookingTicket/utils/scan/formatGlobalScan.js +56 -0
  195. package/dist/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  196. package/dist/solution/BookingTicket/utils/scan/handleScan.js +42 -28
  197. package/dist/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  198. package/dist/solution/BookingTicket/utils/scan/index.js +30 -14
  199. package/dist/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  200. package/dist/solution/BookingTicket/utils/scan/scanProductValues.js +150 -0
  201. package/dist/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  202. package/dist/solution/BookingTicket/utils/sessionCatalogStale.js +78 -0
  203. package/dist/solution/BuyTickets/index.js +12 -9
  204. package/dist/solution/Checkout/index.d.ts +1 -0
  205. package/dist/solution/Checkout/index.js +275 -209
  206. package/dist/solution/Checkout/utils/index.js +20 -8
  207. package/dist/solution/RegisterAndLogin/config.js +2 -10
  208. package/dist/solution/RegisterAndLogin/index.js +76 -30
  209. package/dist/solution/Sales/index.d.ts +50 -5
  210. package/dist/solution/Sales/index.js +484 -92
  211. package/dist/solution/Sales/types.d.ts +26 -2
  212. package/dist/solution/ScanOrder/index.d.ts +27 -21
  213. package/dist/solution/ScanOrder/index.js +519 -444
  214. package/dist/solution/ScanOrder/types.d.ts +33 -11
  215. package/dist/solution/ScanOrder/types.js +4 -5
  216. package/dist/solution/ScanOrder/utils.d.ts +4 -1
  217. package/dist/solution/ScanOrder/utils.js +109 -34
  218. package/dist/solution/ShopDiscount/index.js +18 -19
  219. package/dist/solution/ShopDiscount/types.d.ts +4 -5
  220. package/dist/solution/ShopDiscount/utils.d.ts +0 -9
  221. package/dist/solution/ShopDiscount/utils.js +0 -9
  222. package/dist/solution/UnifiedBookingSales/index.d.ts +183 -0
  223. package/dist/solution/UnifiedBookingSales/index.js +1871 -0
  224. package/dist/solution/UnifiedBookingSales/types.d.ts +143 -0
  225. package/dist/solution/UnifiedBookingSales/types.js +11 -0
  226. package/dist/solution/VenueBooking/index.d.ts +32 -51
  227. package/dist/solution/VenueBooking/index.js +741 -808
  228. package/dist/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  229. package/dist/solution/VenueBooking/types.d.ts +1 -3
  230. package/dist/solution/VenueBooking/types.js +0 -1
  231. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
  232. package/dist/solution/VenueBooking/utils/dateSummary.js +25 -12
  233. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +6 -0
  234. package/dist/solution/VenueBooking/utils/slotMerge.js +9 -3
  235. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
  236. package/dist/solution/VenueBooking/utils/timeSlot.js +4 -9
  237. package/dist/solution/index.d.ts +2 -0
  238. package/dist/solution/index.js +3 -1
  239. package/dist/types/index.d.ts +12 -2
  240. package/dist/utils/task.js +18 -15
  241. package/dist/utils/watch.js +1 -0
  242. package/lib/apis/picoding.js +0 -2
  243. package/lib/core/index.js +132 -130
  244. package/lib/effects/index.js +57 -46
  245. package/lib/index.d.ts +0 -1
  246. package/lib/index.js +50 -92
  247. package/lib/model/index.js +21 -14
  248. package/lib/model/strategy/adapter/dataVariant/adapter.js +50 -38
  249. package/lib/model/strategy/adapter/dataVariant/evaluator.js +236 -162
  250. package/lib/model/strategy/adapter/dataVariant/examples.js +237 -229
  251. package/lib/model/strategy/adapter/dataVariant/index.js +34 -39
  252. package/lib/model/strategy/adapter/dataVariant/type.js +28 -57
  253. package/lib/model/strategy/adapter/index.js +64 -100
  254. package/lib/model/strategy/adapter/itemRule/adapter.js +144 -156
  255. package/lib/model/strategy/adapter/itemRule/evaluator.js +48 -36
  256. package/lib/model/strategy/adapter/itemRule/examples.js +225 -295
  257. package/lib/model/strategy/adapter/itemRule/index.js +57 -83
  258. package/lib/model/strategy/adapter/itemRule/type.js +36 -97
  259. package/lib/model/strategy/adapter/promotion/adapter.js +63 -84
  260. package/lib/model/strategy/adapter/promotion/evaluator.js +233 -382
  261. package/lib/model/strategy/adapter/promotion/examples.js +159 -139
  262. package/lib/model/strategy/adapter/promotion/index.js +0 -1
  263. package/lib/model/strategy/adapter/promotion/type.js +35 -199
  264. package/lib/model/strategy/adapter/type.js +16 -4
  265. package/lib/model/strategy/adapter/walletPass/evaluator.js +152 -180
  266. package/lib/model/strategy/adapter/walletPass/example.js +190 -217
  267. package/lib/model/strategy/adapter/walletPass/index.js +51 -75
  268. package/lib/model/strategy/adapter/walletPass/locales.js +58 -36
  269. package/lib/model/strategy/adapter/walletPass/type.d.ts +0 -3
  270. package/lib/model/strategy/adapter/walletPass/type.js +16 -4
  271. package/lib/model/strategy/adapter/walletPass/utils.d.ts +0 -26
  272. package/lib/model/strategy/adapter/walletPass/utils.js +383 -676
  273. package/lib/model/strategy/engine.js +168 -270
  274. package/lib/model/strategy/index.js +34 -49
  275. package/lib/model/strategy/strategy-example.js +239 -243
  276. package/lib/model/strategy/type.js +40 -100
  277. package/lib/modules/Account/index.js +53 -39
  278. package/lib/modules/Account/types.js +33 -20
  279. package/lib/modules/AccountList/index.js +154 -116
  280. package/lib/modules/AccountList/types.js +31 -30
  281. package/lib/modules/AccountList/utils.js +30 -18
  282. package/lib/modules/BaseModule.d.ts +2 -2
  283. package/lib/modules/BaseModule.js +50 -29
  284. package/lib/modules/BookingContext/index.d.ts +48 -0
  285. package/lib/modules/BookingContext/index.js +368 -0
  286. package/lib/modules/BookingContext/types.d.ts +102 -0
  287. package/lib/modules/BookingContext/types.js +34 -0
  288. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.d.ts +16 -0
  289. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +298 -0
  290. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.d.ts +8 -0
  291. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +155 -0
  292. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.d.ts +76 -0
  293. package/lib/modules/BookingContext/utils/cacheItemToBookingInput.js +222 -0
  294. package/lib/modules/BookingContext/utils/flexible.d.ts +28 -0
  295. package/lib/modules/BookingContext/utils/flexible.js +80 -0
  296. package/lib/modules/BookingContext/utils/formatResourceList.d.ts +8 -0
  297. package/lib/modules/BookingContext/utils/formatResourceList.js +50 -0
  298. package/lib/modules/BookingContext/utils/index.d.ts +11 -0
  299. package/lib/modules/BookingContext/utils/index.js +43 -0
  300. package/lib/modules/BookingContext/utils/noResource.d.ts +13 -0
  301. package/lib/modules/BookingContext/utils/noResource.js +90 -0
  302. package/lib/modules/BookingContext/utils/orderLineDisplay.d.ts +1 -0
  303. package/lib/modules/BookingContext/utils/orderLineDisplay.js +56 -0
  304. package/lib/modules/BookingContext/utils/productExtend.d.ts +72 -0
  305. package/lib/modules/BookingContext/utils/productExtend.js +283 -0
  306. package/lib/modules/BookingContext/utils/resourceErrors.d.ts +41 -0
  307. package/lib/modules/BookingContext/utils/resourceErrors.js +80 -0
  308. package/lib/modules/BookingContext/utils/resourceSelection.d.ts +7 -0
  309. package/lib/modules/BookingContext/utils/resourceSelection.js +46 -0
  310. package/lib/modules/BookingContext/utils/resources.d.ts +80 -0
  311. package/lib/modules/BookingContext/utils/resources.js +377 -0
  312. package/lib/modules/BookingContext/utils/serviceTimes.d.ts +55 -0
  313. package/lib/modules/BookingContext/utils/serviceTimes.js +162 -0
  314. package/lib/modules/BookingContext/utils/timeSlices.d.ts +42 -0
  315. package/lib/modules/BookingContext/utils/timeSlices.js +124 -0
  316. package/lib/modules/Cart/index.js +124 -170
  317. package/lib/modules/Cart/types.js +51 -46
  318. package/lib/modules/Cart/utils/cartAccount.js +39 -40
  319. package/lib/modules/Cart/utils/cartDate.js +61 -56
  320. package/lib/modules/Cart/utils/cartDiscount.js +33 -28
  321. package/lib/modules/Cart/utils/cartNote.js +32 -27
  322. package/lib/modules/Cart/utils/cartProduct.js +261 -309
  323. package/lib/modules/Cart/utils/cartRelationForms.js +35 -29
  324. package/lib/modules/Cart/utils/cartResource.js +78 -72
  325. package/lib/modules/Cart/utils/changePrice.js +59 -31
  326. package/lib/modules/Cart/utils/index.js +48 -106
  327. package/lib/modules/Customer/constants.js +34 -13
  328. package/lib/modules/Customer/index.d.ts +20 -0
  329. package/lib/modules/Customer/index.js +207 -217
  330. package/lib/modules/Customer/types.d.ts +2 -0
  331. package/lib/modules/Customer/types.js +35 -38
  332. package/lib/modules/Date/index.js +115 -116
  333. package/lib/modules/Date/types.js +28 -16
  334. package/lib/modules/Date/utils.js +123 -174
  335. package/lib/modules/Discount/index.d.ts +2 -2
  336. package/lib/modules/Discount/index.js +133 -119
  337. package/lib/modules/Discount/types.d.ts +1 -1
  338. package/lib/modules/Discount/types.js +31 -9
  339. package/lib/modules/Guests/index.js +56 -30
  340. package/lib/modules/Guests/types.js +33 -23
  341. package/lib/modules/Holder/index.js +189 -209
  342. package/lib/modules/Holder/types.js +16 -4
  343. package/lib/modules/Holder/utils.js +49 -20
  344. package/lib/modules/OpenData/index.d.ts +8 -0
  345. package/lib/modules/OpenData/index.js +88 -63
  346. package/lib/modules/OpenData/types.js +16 -4
  347. package/lib/modules/OpenData/utils.js +78 -44
  348. package/lib/modules/Order/index.d.ts +449 -24
  349. package/lib/modules/Order/index.js +4184 -514
  350. package/lib/modules/Order/types.d.ts +693 -88
  351. package/lib/modules/Order/types.js +35 -24
  352. package/lib/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  353. package/lib/modules/Order/utils/bundleDiscountHydration.js +139 -0
  354. package/lib/modules/Order/utils/manualProductDiscount.d.ts +106 -0
  355. package/lib/modules/Order/utils/manualProductDiscount.js +206 -0
  356. package/lib/modules/Order/utils/orderCollectionIdentity.d.ts +53 -0
  357. package/lib/modules/Order/utils/orderCollectionIdentity.js +415 -0
  358. package/lib/modules/Order/utils.d.ts +167 -18
  359. package/lib/modules/Order/utils.js +1085 -414
  360. package/lib/modules/Payment/cash.js +33 -20
  361. package/lib/modules/Payment/cashRecommendationAlgorithm.js +76 -145
  362. package/lib/modules/Payment/eftpos.js +30 -16
  363. package/lib/modules/Payment/index.d.ts +10 -9
  364. package/lib/modules/Payment/index.js +402 -636
  365. package/lib/modules/Payment/mx51.js +0 -1
  366. package/lib/modules/Payment/types.d.ts +44 -24
  367. package/lib/modules/Payment/types.js +107 -216
  368. package/lib/modules/Payment/utils.d.ts +1 -1
  369. package/lib/modules/Payment/utils.js +50 -52
  370. package/lib/modules/Payment/walletpass.d.ts +0 -2
  371. package/lib/modules/Payment/walletpass.js +216 -221
  372. package/lib/modules/Product/index.js +46 -51
  373. package/lib/modules/Product/types.d.ts +29 -7
  374. package/lib/modules/Product/types.js +16 -4
  375. package/lib/modules/Product/utils.js +33 -32
  376. package/lib/modules/ProductList/index.d.ts +17 -13
  377. package/lib/modules/ProductList/index.js +161 -120
  378. package/lib/modules/ProductList/types.d.ts +16 -0
  379. package/lib/modules/ProductList/types.js +31 -9
  380. package/lib/modules/Quotation/index.d.ts +22 -2
  381. package/lib/modules/Quotation/index.js +154 -64
  382. package/lib/modules/Quotation/types.d.ts +19 -0
  383. package/lib/modules/Quotation/types.js +16 -4
  384. package/lib/modules/Resource/index.js +59 -27
  385. package/lib/modules/Resource/types.js +32 -22
  386. package/lib/modules/Resource/utils.js +38 -30
  387. package/lib/modules/ResourcePlanner/index.d.ts +24 -0
  388. package/lib/modules/ResourcePlanner/index.js +148 -0
  389. package/lib/modules/ResourcePlanner/planner.d.ts +14 -0
  390. package/lib/modules/ResourcePlanner/planner.js +933 -0
  391. package/lib/modules/ResourcePlanner/types.d.ts +227 -0
  392. package/lib/modules/ResourcePlanner/types.js +17 -0
  393. package/lib/modules/Rules/index.d.ts +8 -10
  394. package/lib/modules/Rules/index.js +960 -1440
  395. package/lib/modules/Rules/types.d.ts +14 -3
  396. package/lib/modules/Rules/types.js +40 -17
  397. package/lib/modules/SalesSummary/index.d.ts +23 -26
  398. package/lib/modules/SalesSummary/index.js +134 -61
  399. package/lib/modules/SalesSummary/types.d.ts +9 -1
  400. package/lib/modules/SalesSummary/types.js +16 -4
  401. package/lib/modules/SalesSummary/utils.d.ts +3 -22
  402. package/lib/modules/SalesSummary/utils.js +814 -233
  403. package/lib/modules/ScanOrderLogger/index.js +79 -59
  404. package/lib/modules/ScanOrderLogger/providers/feishu.js +78 -54
  405. package/lib/modules/ScanOrderLogger/providers/grafana.js +36 -13
  406. package/lib/modules/ScanOrderLogger/types.js +16 -4
  407. package/lib/modules/Schedule/getDateIsInSchedule.js +169 -338
  408. package/lib/modules/Schedule/index.d.ts +18 -5
  409. package/lib/modules/Schedule/index.js +153 -104
  410. package/lib/modules/Schedule/type.js +16 -4
  411. package/lib/modules/Schedule/types.d.ts +2 -0
  412. package/lib/modules/Schedule/types.js +16 -4
  413. package/lib/modules/Schedule/utils.js +291 -433
  414. package/lib/modules/Step/index.js +52 -40
  415. package/lib/modules/Step/tyeps.js +16 -4
  416. package/lib/modules/Summary/index.js +71 -66
  417. package/lib/modules/Summary/types.js +16 -4
  418. package/lib/modules/Summary/utils.js +418 -791
  419. package/lib/modules/SurchargeList/index.d.ts +18 -0
  420. package/lib/modules/SurchargeList/index.js +109 -0
  421. package/lib/modules/SurchargeList/types.d.ts +15 -0
  422. package/lib/modules/SurchargeList/types.js +17 -0
  423. package/lib/modules/index.d.ts +3 -0
  424. package/lib/modules/index.js +63 -212
  425. package/lib/plugins/app.d.ts +2 -0
  426. package/lib/plugins/app.js +16 -4
  427. package/lib/plugins/index.js +25 -36
  428. package/lib/plugins/request.d.ts +1 -0
  429. package/lib/plugins/request.js +126 -137
  430. package/lib/plugins/shopStore.js +16 -4
  431. package/lib/plugins/user.js +16 -4
  432. package/lib/plugins/window.js +179 -171
  433. package/lib/server/index.d.ts +462 -8
  434. package/lib/server/index.js +4520 -1162
  435. package/lib/server/modules/floor-plan/index.d.ts +39 -0
  436. package/lib/server/modules/floor-plan/index.js +327 -0
  437. package/lib/server/modules/floor-plan/types.d.ts +43 -0
  438. package/lib/server/modules/floor-plan/types.js +34 -0
  439. package/lib/server/modules/index.d.ts +7 -2
  440. package/lib/server/modules/index.js +67 -84
  441. package/lib/server/modules/menu/index.js +122 -146
  442. package/lib/server/modules/menu/types.js +31 -18
  443. package/lib/server/modules/order/index.d.ts +207 -14
  444. package/lib/server/modules/order/index.js +1543 -285
  445. package/lib/server/modules/order/types.d.ts +76 -5
  446. package/lib/server/modules/order/types.js +32 -107
  447. package/lib/server/modules/order/utils/filterBookings.d.ts +7 -1
  448. package/lib/server/modules/order/utils/filterBookings.js +259 -176
  449. package/lib/server/modules/order/utils/filterOrders.js +293 -94
  450. package/lib/server/modules/payment/index.d.ts +28 -0
  451. package/lib/server/modules/payment/index.js +192 -0
  452. package/lib/server/modules/payment/types.d.ts +9 -0
  453. package/lib/server/modules/payment/types.js +17 -0
  454. package/lib/server/modules/products/index.d.ts +105 -14
  455. package/lib/server/modules/products/index.js +850 -475
  456. package/lib/server/modules/products/types.d.ts +34 -1
  457. package/lib/server/modules/products/types.js +34 -41
  458. package/lib/server/modules/quotation/index.d.ts +39 -0
  459. package/lib/server/modules/quotation/index.js +254 -75
  460. package/lib/server/modules/quotation/types.js +31 -21
  461. package/lib/server/modules/resource/index.d.ts +2 -3
  462. package/lib/server/modules/resource/index.js +240 -243
  463. package/lib/server/modules/resource/types.js +33 -42
  464. package/lib/server/modules/schedule/index.d.ts +6 -4
  465. package/lib/server/modules/schedule/index.js +146 -147
  466. package/lib/server/modules/schedule/types.js +21 -14
  467. package/lib/server/modules/schedule/utils.js +163 -334
  468. package/lib/server/test.json +713 -0
  469. package/lib/server/types.d.ts +2 -0
  470. package/lib/server/types.js +16 -4
  471. package/lib/server/utils/index.js +23 -25
  472. package/lib/server/utils/product.js +140 -197
  473. package/lib/server/utils/schedule.js +41 -34
  474. package/lib/server/utils/small-ticket.d.ts +71 -0
  475. package/lib/server/utils/small-ticket.js +904 -0
  476. package/lib/server/utils/time.js +49 -40
  477. package/lib/solution/BaseSales/index.d.ts +378 -0
  478. package/lib/solution/BaseSales/index.js +2533 -0
  479. package/lib/solution/BaseSales/types.d.ts +394 -0
  480. package/lib/solution/BaseSales/types.js +43 -0
  481. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +287 -0
  482. package/lib/solution/BaseSales/utils/cartPromotion.js +1004 -0
  483. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +144 -0
  484. package/lib/solution/BaseSales/utils/parseSalesResponse.js +160 -0
  485. package/lib/solution/BaseSales/utils/quotationPrice.d.ts +18 -0
  486. package/lib/solution/BaseSales/utils/quotationPrice.js +289 -0
  487. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.d.ts +63 -0
  488. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +256 -0
  489. package/lib/solution/BaseSales/utils.d.ts +40 -0
  490. package/lib/solution/BaseSales/utils.js +244 -0
  491. package/lib/solution/BookingByStep/index.d.ts +1 -1
  492. package/lib/solution/BookingByStep/index.js +1340 -1530
  493. package/lib/solution/BookingByStep/types.js +99 -40
  494. package/lib/solution/BookingByStep/utils/capacity.js +160 -192
  495. package/lib/solution/BookingByStep/utils/products.js +52 -42
  496. package/lib/solution/BookingByStep/utils/resources.js +330 -527
  497. package/lib/solution/BookingByStep/utils/stock.js +44 -65
  498. package/lib/solution/BookingByStep/utils/timeslots.js +131 -129
  499. package/lib/solution/BookingTicket/index.d.ts +393 -24
  500. package/lib/solution/BookingTicket/index.js +1374 -184
  501. package/lib/solution/BookingTicket/types.d.ts +191 -6
  502. package/lib/solution/BookingTicket/types.js +79 -40
  503. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +117 -0
  504. package/lib/solution/BookingTicket/utils/addProductDecision.js +318 -0
  505. package/lib/solution/BookingTicket/utils/addTimeAvailability.d.ts +35 -0
  506. package/lib/solution/BookingTicket/utils/addTimeAvailability.js +125 -0
  507. package/lib/solution/BookingTicket/utils/bookingStatus.d.ts +77 -0
  508. package/lib/solution/BookingTicket/utils/bookingStatus.js +107 -0
  509. package/lib/solution/BookingTicket/utils/cartView.d.ts +29 -0
  510. package/lib/solution/BookingTicket/utils/cartView.js +184 -0
  511. package/lib/solution/BookingTicket/utils/exampleData.d.ts +123 -0
  512. package/lib/solution/BookingTicket/utils/exampleData.js +0 -0
  513. package/lib/solution/BookingTicket/utils/orderCustomer.d.ts +4 -0
  514. package/lib/solution/BookingTicket/utils/orderCustomer.js +58 -0
  515. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.d.ts +185 -0
  516. package/lib/solution/BookingTicket/utils/resolveBestAddTimePlan.js +254 -0
  517. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +36 -0
  518. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +169 -0
  519. package/lib/solution/BookingTicket/utils/scan/cloudSearch.d.ts +4 -0
  520. package/lib/solution/BookingTicket/utils/scan/cloudSearch.js +97 -64
  521. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.d.ts +32 -0
  522. package/lib/solution/BookingTicket/utils/scan/formatGlobalScan.js +51 -0
  523. package/lib/solution/BookingTicket/utils/scan/handleScan.d.ts +3 -1
  524. package/lib/solution/BookingTicket/utils/scan/handleScan.js +81 -82
  525. package/lib/solution/BookingTicket/utils/scan/index.d.ts +5 -0
  526. package/lib/solution/BookingTicket/utils/scan/index.js +109 -91
  527. package/lib/solution/BookingTicket/utils/scan/scanCache.js +43 -90
  528. package/lib/solution/BookingTicket/utils/scan/scanProductValues.d.ts +21 -0
  529. package/lib/solution/BookingTicket/utils/scan/scanProductValues.js +127 -0
  530. package/lib/solution/BookingTicket/utils/sessionCatalogStale.d.ts +23 -0
  531. package/lib/solution/BookingTicket/utils/sessionCatalogStale.js +85 -0
  532. package/lib/solution/BuyTickets/index.js +70 -67
  533. package/lib/solution/BuyTickets/types.js +38 -22
  534. package/lib/solution/Checkout/index.d.ts +1 -0
  535. package/lib/solution/Checkout/index.js +1169 -1463
  536. package/lib/solution/Checkout/types.js +61 -91
  537. package/lib/solution/Checkout/utils/index.js +156 -228
  538. package/lib/solution/PlaceOrder/index.js +0 -55
  539. package/lib/solution/RegisterAndLogin/config.js +462 -503
  540. package/lib/solution/RegisterAndLogin/index.js +630 -633
  541. package/lib/solution/RegisterAndLogin/types.js +76 -189
  542. package/lib/solution/RegisterAndLogin/utils.js +125 -183
  543. package/lib/solution/Sales/index.d.ts +50 -5
  544. package/lib/solution/Sales/index.js +498 -238
  545. package/lib/solution/Sales/types.d.ts +26 -2
  546. package/lib/solution/Sales/types.js +33 -27
  547. package/lib/solution/ScanOrder/index.d.ts +27 -21
  548. package/lib/solution/ScanOrder/index.js +936 -864
  549. package/lib/solution/ScanOrder/types.d.ts +33 -11
  550. package/lib/solution/ScanOrder/types.js +34 -34
  551. package/lib/solution/ScanOrder/utils.d.ts +4 -1
  552. package/lib/solution/ScanOrder/utils.js +422 -385
  553. package/lib/solution/ShopDiscount/index.js +233 -235
  554. package/lib/solution/ShopDiscount/types.d.ts +4 -5
  555. package/lib/solution/ShopDiscount/types.js +37 -15
  556. package/lib/solution/ShopDiscount/utils.d.ts +0 -9
  557. package/lib/solution/ShopDiscount/utils.js +172 -309
  558. package/lib/solution/UnifiedBookingSales/index.d.ts +183 -0
  559. package/lib/solution/UnifiedBookingSales/index.js +1076 -0
  560. package/lib/solution/UnifiedBookingSales/types.d.ts +143 -0
  561. package/lib/solution/UnifiedBookingSales/types.js +33 -0
  562. package/lib/solution/VenueBooking/index.d.ts +32 -51
  563. package/lib/solution/VenueBooking/index.js +1008 -984
  564. package/lib/solution/VenueBooking/sales-section-4-annotated.json +0 -2
  565. package/lib/solution/VenueBooking/types.d.ts +1 -3
  566. package/lib/solution/VenueBooking/types.js +39 -20
  567. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +2 -2
  568. package/lib/solution/VenueBooking/utils/dateSummary.js +62 -25
  569. package/lib/solution/VenueBooking/utils/resource.js +54 -31
  570. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +6 -0
  571. package/lib/solution/VenueBooking/utils/slotMerge.js +109 -90
  572. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +0 -2
  573. package/lib/solution/VenueBooking/utils/timeSlot.js +133 -138
  574. package/lib/solution/VenueBooking/utils.js +67 -130
  575. package/lib/solution/index.d.ts +2 -0
  576. package/lib/solution/index.js +41 -102
  577. package/lib/store/createStore.js +29 -32
  578. package/lib/types/index.d.ts +12 -2
  579. package/lib/types/index.js +16 -4
  580. package/lib/utils/task.js +36 -36
  581. package/lib/utils/watch.js +47 -81
  582. package/package.json +2 -4
  583. package/dist/solution/Checkout/appointmentDemo.json +0 -1
  584. package/dist/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
  585. package/dist/solution/VenueBooking/utils/smartPricing.js +0 -233
  586. package/lib/solution/Checkout/appointmentDemo.json +0 -1
  587. package/lib/solution/VenueBooking/utils/smartPricing.d.ts +0 -70
  588. package/lib/solution/VenueBooking/utils/smartPricing.js +0 -192
@@ -0,0 +1,933 @@
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/modules/ResourcePlanner/planner.ts
30
+ var planner_exports = {};
31
+ __export(planner_exports, {
32
+ DEFAULT_RESOURCE_PLANNER_CONTEXT: () => DEFAULT_RESOURCE_PLANNER_CONTEXT,
33
+ DEFAULT_RESOURCE_PLANNER_SELECTION: () => DEFAULT_RESOURCE_PLANNER_SELECTION,
34
+ autoAssignResources: () => autoAssignResources,
35
+ buildDemandIntervals: () => buildDemandIntervals,
36
+ evaluateResourceForInterval: () => evaluateResourceForInterval,
37
+ normalizePlannerContext: () => normalizePlannerContext,
38
+ queryPlannerAvailability: () => queryPlannerAvailability,
39
+ resolveAssignableSlots: () => resolveAssignableSlots,
40
+ validateAssignments: () => validateAssignments
41
+ });
42
+ module.exports = __toCommonJS(planner_exports);
43
+ var import_dayjs = __toESM(require("dayjs"));
44
+ var DEFAULT_RESOURCE_PLANNER_CONTEXT = {
45
+ products: [],
46
+ resources: [],
47
+ externalEvents: [],
48
+ slotDurationMinutes: 30,
49
+ businessStartTime: "09:00",
50
+ businessEndTime: "18:00"
51
+ };
52
+ var DEFAULT_RESOURCE_PLANNER_SELECTION = {
53
+ productIds: [],
54
+ resourceIds: [],
55
+ assignments: []
56
+ };
57
+ function normalizePlannerContext(input = {}) {
58
+ return {
59
+ products: Array.isArray(input.products) ? input.products : [],
60
+ resources: Array.isArray(input.resources) ? input.resources : [],
61
+ externalEvents: Array.isArray(input.externalEvents) ? input.externalEvents : [],
62
+ slotDurationMinutes: input.slotDurationMinutes || DEFAULT_RESOURCE_PLANNER_CONTEXT.slotDurationMinutes,
63
+ businessStartTime: input.businessStartTime || DEFAULT_RESOURCE_PLANNER_CONTEXT.businessStartTime,
64
+ businessEndTime: input.businessEndTime || DEFAULT_RESOURCE_PLANNER_CONTEXT.businessEndTime
65
+ };
66
+ }
67
+ function sameId(left, right) {
68
+ return String(left) === String(right);
69
+ }
70
+ function dateOf(value) {
71
+ return (0, import_dayjs.default)(value).format("YYYY-MM-DD");
72
+ }
73
+ function timeOf(value) {
74
+ return (0, import_dayjs.default)(value).format("HH:mm");
75
+ }
76
+ function toDateTime(date, time) {
77
+ if (/^\d{4}-\d{2}-\d{2}/.test(time))
78
+ return (0, import_dayjs.default)(time);
79
+ return (0, import_dayjs.default)(`${date} ${time.length === 5 ? `${time}:00` : time}`);
80
+ }
81
+ function overlaps(startA, endA, startB, endB) {
82
+ return startA.isBefore(endB) && endA.isAfter(startB);
83
+ }
84
+ function containsRange(outerStart, outerEnd, innerStart, innerEnd) {
85
+ return !innerStart.isBefore(outerStart) && !innerEnd.isAfter(outerEnd);
86
+ }
87
+ function maxDayjs(left, right) {
88
+ return left.isAfter(right) ? left : right;
89
+ }
90
+ function minDayjs(left, right) {
91
+ return left.isBefore(right) ? left : right;
92
+ }
93
+ function addDays(start, end) {
94
+ const result = [];
95
+ let cursor = (0, import_dayjs.default)(start);
96
+ const finalDay = (0, import_dayjs.default)(end);
97
+ while (!cursor.isAfter(finalDay, "day")) {
98
+ result.push(cursor.format("YYYY-MM-DD"));
99
+ cursor = cursor.add(1, "day");
100
+ }
101
+ return result;
102
+ }
103
+ function getQueryProducts(products, query) {
104
+ var _a;
105
+ if (!((_a = query.productIds) == null ? void 0 : _a.length))
106
+ return products;
107
+ return products.filter((product) => query.productIds.some((id) => sameId(id, product.id)));
108
+ }
109
+ function getQueryResources(resources, query) {
110
+ var _a;
111
+ if (!((_a = query.resourceIds) == null ? void 0 : _a.length))
112
+ return resources;
113
+ return resources.filter((resource) => query.resourceIds.some((id) => sameId(id, resource.id)));
114
+ }
115
+ function matchesResourceRequirement(resource, requirement) {
116
+ var _a;
117
+ const isFormlessCandidate = resource.formId == null;
118
+ const formMatches = requirement.formId == null || isFormlessCandidate || sameId(requirement.formId, resource.formId);
119
+ const resourceMatches = !((_a = requirement.resourceIds) == null ? void 0 : _a.length) || isFormlessCandidate || requirement.resourceIds.some((id) => sameId(id, resource.id));
120
+ return formMatches && resourceMatches;
121
+ }
122
+ function resolveProductTitle(product) {
123
+ var _a, _b, _c;
124
+ const rawTitle = ((_a = product.raw) == null ? void 0 : _a.title) || ((_b = product.raw) == null ? void 0 : _b.name) || ((_c = product.raw) == null ? void 0 : _c.product_title);
125
+ if (typeof product.title === "string")
126
+ return product.title;
127
+ if (typeof rawTitle === "string")
128
+ return rawTitle;
129
+ if (rawTitle && typeof rawTitle === "object") {
130
+ return rawTitle.en || rawTitle.zh || rawTitle.default || Object.values(rawTitle)[0];
131
+ }
132
+ return void 0;
133
+ }
134
+ function buildDemandIntervals(products, query, context) {
135
+ const dates = query.date ? [query.date] : query.dateRange ? addDays(query.dateRange.start, query.dateRange.end) : [];
136
+ const selectedProducts = getQueryProducts(products, query);
137
+ const intervals = [];
138
+ for (const product of selectedProducts) {
139
+ const quantity = Math.max(1, Number(product.quantity || 1));
140
+ const capacityRequired = Math.max(1, Number(query.pax || product.capacityRequired || 1));
141
+ const requirements = product.resourceRequirements || [];
142
+ if (product.kind === "session" || product.kind === "venue_slot") {
143
+ const schedules = product.schedule || [];
144
+ for (const schedule of schedules) {
145
+ const scheduleDate = dateOf(schedule.start_at);
146
+ if (dates.length > 0 && !dates.includes(scheduleDate))
147
+ continue;
148
+ const start = (0, import_dayjs.default)(schedule.start_at);
149
+ const end = (0, import_dayjs.default)(schedule.end_at);
150
+ intervals.push({
151
+ id: `${product.id}:${start.toISOString()}:${end.toISOString()}`,
152
+ productId: product.id,
153
+ source: product.kind,
154
+ date: dateOf(schedule.start_at),
155
+ start_at: start.toISOString(),
156
+ end_at: end.toISOString(),
157
+ durationMinutes: Math.max(1, end.diff(start, "minute")),
158
+ quantity,
159
+ capacityRequired,
160
+ resourceRequirements: requirements
161
+ });
162
+ }
163
+ continue;
164
+ }
165
+ if (product.kind === "duration") {
166
+ const duration = Math.max(1, Number(product.durationMinutes || 30));
167
+ for (const currentDate of dates) {
168
+ const start = query.startTime ? toDateTime(currentDate, query.startTime) : toDateTime(currentDate, (context == null ? void 0 : context.businessStartTime) || DEFAULT_RESOURCE_PLANNER_CONTEXT.businessStartTime);
169
+ let end = query.startTime && query.endTime ? toDateTime(currentDate, query.endTime) : query.startTime ? start.add(duration, "minute") : toDateTime(currentDate, (context == null ? void 0 : context.businessEndTime) || DEFAULT_RESOURCE_PLANNER_CONTEXT.businessEndTime);
170
+ if (!end.isAfter(start))
171
+ end = end.add(1, "day");
172
+ intervals.push({
173
+ id: `${product.id}:${currentDate}:${query.startTime || "range"}`,
174
+ productId: product.id,
175
+ source: "duration",
176
+ date: currentDate,
177
+ start_at: start.toISOString(),
178
+ end_at: end.toISOString(),
179
+ durationMinutes: duration,
180
+ quantity,
181
+ capacityRequired,
182
+ resourceRequirements: requirements
183
+ });
184
+ }
185
+ }
186
+ }
187
+ return intervals;
188
+ }
189
+ function getEventsForResource(resource, contextEvents) {
190
+ const embeddedEvents = resource.times.flatMap((time) => time.event_list || []);
191
+ return [
192
+ ...embeddedEvents,
193
+ ...contextEvents.filter((event) => sameId(event.resourceId ?? event.resource_id, resource.id))
194
+ ].filter(Boolean);
195
+ }
196
+ function collectEventsByResource(resources, contextEvents) {
197
+ const eventsByResource = /* @__PURE__ */ new Map();
198
+ resources.forEach((resource) => {
199
+ eventsByResource.set(String(resource.id), getEventsForResource(resource, contextEvents));
200
+ });
201
+ return eventsByResource;
202
+ }
203
+ function getWorkingSegmentsForInterval(resource, interval) {
204
+ const intervalStart = (0, import_dayjs.default)(interval.start_at);
205
+ const intervalEnd = (0, import_dayjs.default)(interval.end_at);
206
+ return resource.times.map((time) => {
207
+ const start = maxDayjs((0, import_dayjs.default)(time.start_at), intervalStart);
208
+ const end = minDayjs((0, import_dayjs.default)(time.end_at), intervalEnd);
209
+ return { start, end };
210
+ }).filter((segment) => segment.end.isAfter(segment.start));
211
+ }
212
+ function mergeBusySegments(segments) {
213
+ const sorted = [...segments].filter((segment) => segment.end.isAfter(segment.start)).sort((left, right) => left.start.valueOf() - right.start.valueOf());
214
+ const merged = [];
215
+ sorted.forEach((segment) => {
216
+ const previous = merged[merged.length - 1];
217
+ if (previous && !segment.start.isAfter(previous.end)) {
218
+ previous.end = maxDayjs(previous.end, segment.end);
219
+ } else {
220
+ merged.push({ ...segment });
221
+ }
222
+ });
223
+ return merged;
224
+ }
225
+ function subtractBusyIntervals(workingSegments, events) {
226
+ const available = [];
227
+ workingSegments.forEach((working) => {
228
+ const busySegments = mergeBusySegments(events.filter((event) => overlaps(working.start, working.end, (0, import_dayjs.default)(event.start_at), (0, import_dayjs.default)(event.end_at))).map((event) => ({
229
+ start: maxDayjs((0, import_dayjs.default)(event.start_at), working.start),
230
+ end: minDayjs((0, import_dayjs.default)(event.end_at), working.end)
231
+ })));
232
+ let cursor = working.start;
233
+ busySegments.forEach((busy) => {
234
+ if (busy.start.isAfter(cursor)) {
235
+ available.push({ start: cursor, end: busy.start });
236
+ }
237
+ if (busy.end.isAfter(cursor))
238
+ cursor = busy.end;
239
+ });
240
+ if (working.end.isAfter(cursor)) {
241
+ available.push({ start: cursor, end: working.end });
242
+ }
243
+ });
244
+ return available;
245
+ }
246
+ function buildCapacityRanges(params) {
247
+ const { workingSegments, events, maxCapacity, requiredCapacity } = params;
248
+ const ranges = [];
249
+ workingSegments.forEach((working) => {
250
+ const boundaries = /* @__PURE__ */ new Map([
251
+ [working.start.valueOf(), working.start],
252
+ [working.end.valueOf(), working.end]
253
+ ]);
254
+ events.forEach((event) => {
255
+ const eventStart = (0, import_dayjs.default)(event.start_at);
256
+ const eventEnd = (0, import_dayjs.default)(event.end_at);
257
+ if (!overlaps(working.start, working.end, eventStart, eventEnd))
258
+ return;
259
+ const clippedStart = maxDayjs(eventStart, working.start);
260
+ const clippedEnd = minDayjs(eventEnd, working.end);
261
+ boundaries.set(clippedStart.valueOf(), clippedStart);
262
+ boundaries.set(clippedEnd.valueOf(), clippedEnd);
263
+ });
264
+ const points = Array.from(boundaries.values()).sort((left, right) => left.valueOf() - right.valueOf());
265
+ for (let index = 0; index < points.length - 1; index += 1) {
266
+ const start = points[index];
267
+ const end = points[index + 1];
268
+ if (!end.isAfter(start))
269
+ continue;
270
+ const usedCapacity = events.filter((event) => overlaps(start, end, (0, import_dayjs.default)(event.start_at), (0, import_dayjs.default)(event.end_at))).reduce((sum, event) => sum + Math.max(1, Number(event.pax || 1)), 0);
271
+ const remainingCapacity = Math.max(0, maxCapacity - usedCapacity);
272
+ if (remainingCapacity < requiredCapacity)
273
+ continue;
274
+ const status = remainingCapacity < maxCapacity ? "limited" : "available";
275
+ const previous = ranges[ranges.length - 1];
276
+ if (previous && previous.end.isSame(start) && previous.remainingCapacity === remainingCapacity && previous.maxCapacity === maxCapacity && previous.status === status) {
277
+ previous.end = end;
278
+ } else {
279
+ ranges.push({
280
+ start,
281
+ end,
282
+ remainingCapacity,
283
+ maxCapacity,
284
+ status
285
+ });
286
+ }
287
+ }
288
+ });
289
+ return ranges;
290
+ }
291
+ function rangeFitsDuration(segment, durationMinutes) {
292
+ return segment.end.diff(segment.start, "minute") >= durationMinutes;
293
+ }
294
+ function makeAvailabilityRangeCell(params) {
295
+ const { interval, resource, segment } = params;
296
+ const maxCapacity = Math.max(1, Number(segment.maxCapacity || resource.capacity || 1));
297
+ const remainingCapacity = resource.resourceType === "single" ? 1 : Math.max(0, Number(segment.remainingCapacity ?? maxCapacity));
298
+ const status = resource.resourceType === "single" ? "available" : segment.status || (remainingCapacity < maxCapacity ? "limited" : "available");
299
+ return {
300
+ key: `${interval.productId}:${resource.id}:${segment.start.toISOString()}:${segment.end.toISOString()}`,
301
+ productId: interval.productId,
302
+ resourceId: resource.id,
303
+ date: interval.date,
304
+ start_at: segment.start.toISOString(),
305
+ end_at: segment.end.toISOString(),
306
+ startTime: segment.start.format("HH:mm"),
307
+ endTime: segment.end.format("HH:mm"),
308
+ durationMinutes: interval.durationMinutes,
309
+ cellType: "availability_range",
310
+ status,
311
+ remainingCapacity,
312
+ maxCapacity,
313
+ reasonCodes: [],
314
+ conflicts: []
315
+ };
316
+ }
317
+ function buildAvailabilityCellsForResource(params) {
318
+ const { resource, interval, events } = params;
319
+ const requiredCapacity = Math.max(1, Number(interval.capacityRequired || 1));
320
+ const durationMinutes = Math.max(1, Number(interval.durationMinutes || 1));
321
+ const maxCapacity = Math.max(1, Number(resource.capacity || 1));
322
+ let workingSegments = getWorkingSegmentsForInterval(resource, interval);
323
+ const now = (0, import_dayjs.default)();
324
+ workingSegments = workingSegments.map((segment) => ({
325
+ start: segment.end.isAfter(now) ? maxDayjs(segment.start, now) : segment.start,
326
+ end: segment.end
327
+ })).filter((segment) => segment.end.isAfter(segment.start));
328
+ const availableSegments = resource.resourceType === "single" ? subtractBusyIntervals(workingSegments, events).map((segment) => ({
329
+ ...segment,
330
+ remainingCapacity: 1,
331
+ maxCapacity: 1,
332
+ status: "available"
333
+ })) : buildCapacityRanges({
334
+ workingSegments,
335
+ events,
336
+ maxCapacity,
337
+ requiredCapacity
338
+ });
339
+ return availableSegments.filter((segment) => rangeFitsDuration(segment, durationMinutes)).map((segment) => makeAvailabilityRangeCell({
340
+ interval,
341
+ resource,
342
+ segment
343
+ }));
344
+ }
345
+ function evaluateResourceForInterval(params) {
346
+ const { resource, interval, context } = params;
347
+ const start = (0, import_dayjs.default)(interval.start_at);
348
+ const end = (0, import_dayjs.default)(interval.end_at);
349
+ const conflicts = [];
350
+ const reasonCodes = [];
351
+ const maxCapacity = Math.max(1, Number(resource.capacity || 1));
352
+ const requiredCapacity = Math.max(1, Number(interval.capacityRequired || 1));
353
+ if (start.isBefore((0, import_dayjs.default)())) {
354
+ reasonCodes.push("past");
355
+ conflicts.push({
356
+ type: "past",
357
+ message: "时间已过期",
358
+ resourceId: resource.id,
359
+ productId: interval.productId
360
+ });
361
+ }
362
+ const insideResourceTime = resource.times.some((time) => {
363
+ return containsRange((0, import_dayjs.default)(time.start_at), (0, import_dayjs.default)(time.end_at), start, end);
364
+ });
365
+ if (!insideResourceTime) {
366
+ reasonCodes.push("outside_resource_time");
367
+ conflicts.push({
368
+ type: "outside_resource_time",
369
+ message: "所选时间不在资源可用时间内",
370
+ resourceId: resource.id,
371
+ productId: interval.productId
372
+ });
373
+ }
374
+ const events = getEventsForResource(resource, context.externalEvents);
375
+ const overlapping = events.filter((event) => overlaps(start, end, (0, import_dayjs.default)(event.start_at), (0, import_dayjs.default)(event.end_at)));
376
+ const usedCapacity = resource.resourceType === "single" ? overlapping.length : overlapping.reduce((sum, event) => sum + Math.max(1, Number(event.pax || 1)), 0);
377
+ const remainingCapacity = resource.resourceType === "single" ? overlapping.length > 0 ? 0 : 1 : Math.max(0, maxCapacity - usedCapacity);
378
+ if (overlapping.length > 0 && resource.resourceType === "single") {
379
+ reasonCodes.push("remote_event_overlap");
380
+ conflicts.push(...overlapping.map((event) => ({
381
+ type: "remote_event_overlap",
382
+ message: "资源时间被已有预约占用",
383
+ event,
384
+ resourceId: resource.id,
385
+ productId: interval.productId
386
+ })));
387
+ }
388
+ if (resource.resourceType !== "single" && remainingCapacity < requiredCapacity) {
389
+ reasonCodes.push("capacity_full");
390
+ conflicts.push({
391
+ type: "capacity_full",
392
+ message: "资源剩余容量不足",
393
+ resourceId: resource.id,
394
+ productId: interval.productId
395
+ });
396
+ }
397
+ let status = "available";
398
+ if (reasonCodes.includes("past"))
399
+ status = "past";
400
+ else if (reasonCodes.includes("outside_resource_time"))
401
+ status = "unavailable";
402
+ else if (reasonCodes.includes("remote_event_overlap") || reasonCodes.includes("capacity_full")) {
403
+ status = "full";
404
+ } else if (remainingCapacity < maxCapacity) {
405
+ status = "limited";
406
+ }
407
+ return {
408
+ key: `${interval.productId}:${resource.id}:${interval.start_at}:${interval.end_at}`,
409
+ productId: interval.productId,
410
+ resourceId: resource.id,
411
+ date: interval.date,
412
+ start_at: interval.start_at,
413
+ end_at: interval.end_at,
414
+ startTime: timeOf(interval.start_at),
415
+ endTime: timeOf(interval.end_at),
416
+ durationMinutes: interval.durationMinutes,
417
+ cellType: status === "available" || status === "limited" ? "fixed_interval" : "unavailable",
418
+ status,
419
+ remainingCapacity,
420
+ maxCapacity,
421
+ reasonCodes,
422
+ conflicts
423
+ };
424
+ }
425
+ function aggregateStatus(cells) {
426
+ if (!cells.length)
427
+ return "unavailable";
428
+ if (cells.some((cell) => cell.status === "available"))
429
+ return "available";
430
+ if (cells.some((cell) => cell.status === "limited"))
431
+ return "limited";
432
+ if (cells.some((cell) => cell.status === "past"))
433
+ return "past";
434
+ if (cells.some((cell) => cell.status === "full"))
435
+ return "full";
436
+ if (cells.some((cell) => cell.status === "conflict"))
437
+ return "conflict";
438
+ return "unavailable";
439
+ }
440
+ function uniqueReasonCodes(cells) {
441
+ return Array.from(new Set(cells.flatMap((cell) => cell.reasonCodes || [])));
442
+ }
443
+ function buildProductOptions(products, cells, query) {
444
+ const queryProducts = getQueryProducts(products, query);
445
+ return queryProducts.map((product) => {
446
+ const productCells = cells.filter((cell) => sameId(cell.productId, product.id));
447
+ const status = product.kind === "normal" ? "available" : aggregateStatus(productCells);
448
+ return {
449
+ productId: product.id,
450
+ title: resolveProductTitle(product),
451
+ status,
452
+ reasonCodes: uniqueReasonCodes(productCells)
453
+ };
454
+ });
455
+ }
456
+ function buildResourceOptions(resources, cells, query) {
457
+ const queryResources = getQueryResources(resources, query);
458
+ return queryResources.map((resource) => {
459
+ const resourceCells = cells.filter((cell) => cell.resourceId !== void 0 && sameId(cell.resourceId, resource.id));
460
+ const bestCell = resourceCells.find((cell) => cell.status === "available") || resourceCells.find((cell) => cell.status === "limited") || resourceCells[0];
461
+ return {
462
+ resourceId: resource.id,
463
+ resourceName: resource.name,
464
+ resourceFormId: resource.formId,
465
+ resourceType: resource.resourceType,
466
+ status: resourceCells.length ? aggregateStatus(resourceCells) : "unavailable",
467
+ remainingCapacity: bestCell == null ? void 0 : bestCell.remainingCapacity,
468
+ maxCapacity: (bestCell == null ? void 0 : bestCell.maxCapacity) || resource.capacity,
469
+ reasonCodes: uniqueReasonCodes(resourceCells)
470
+ };
471
+ });
472
+ }
473
+ function buildDateSummary(cells, query) {
474
+ const dates = query.date ? [query.date] : query.dateRange ? addDays(query.dateRange.start, query.dateRange.end) : Array.from(new Set(cells.map((cell) => cell.date).filter(Boolean)));
475
+ return dates.map((date) => {
476
+ const dateCells = cells.filter((cell) => cell.date === date);
477
+ const availableCount = dateCells.filter((cell) => cell.status === "available" || cell.status === "limited").length;
478
+ return {
479
+ date,
480
+ status: dateCells.length ? aggregateStatus(dateCells) : "unavailable",
481
+ availableCount,
482
+ totalCount: dateCells.length
483
+ };
484
+ });
485
+ }
486
+ function buildTimeLabels(date, context, query) {
487
+ if (!date)
488
+ return [];
489
+ const slotMinutes = query.slotDurationMinutes || context.slotDurationMinutes;
490
+ const labels = [];
491
+ let cursor = toDateTime(date, context.businessStartTime);
492
+ let end = toDateTime(date, context.businessEndTime);
493
+ if (!end.isAfter(cursor))
494
+ end = end.add(1, "day");
495
+ while (cursor.isBefore(end)) {
496
+ labels.push(cursor.format("HH:mm"));
497
+ cursor = cursor.add(slotMinutes, "minute");
498
+ }
499
+ return labels;
500
+ }
501
+ function buildGridSlotInterval(product, date, label, context, query) {
502
+ const slotMinutes = product.kind === "duration" ? Math.max(1, Number(product.durationMinutes || query.slotDurationMinutes || context.slotDurationMinutes)) : query.slotDurationMinutes || context.slotDurationMinutes;
503
+ const start = toDateTime(date, label);
504
+ const end = start.add(slotMinutes, "minute");
505
+ return {
506
+ id: `${product.id}:${date}:${label}`,
507
+ productId: product.id,
508
+ source: product.kind === "session" ? "session" : product.kind === "venue_slot" ? "venue_slot" : "duration",
509
+ date,
510
+ start_at: start.toISOString(),
511
+ end_at: end.toISOString(),
512
+ durationMinutes: slotMinutes,
513
+ quantity: Math.max(1, Number(product.quantity || 1)),
514
+ capacityRequired: Math.max(1, Number(query.pax || product.capacityRequired || 1)),
515
+ resourceRequirements: product.resourceRequirements || []
516
+ };
517
+ }
518
+ function buildTimeGrid(context, query, cells) {
519
+ var _a;
520
+ const date = query.date || ((_a = query.dateRange) == null ? void 0 : _a.start);
521
+ const products = getQueryProducts(context.products, query).filter((product) => product.kind !== "normal");
522
+ const resources = getQueryResources(context.resources, query);
523
+ const timeLabels = buildTimeLabels(date, context, query);
524
+ if (!date || !products.length || !resources.length) {
525
+ return { date, timeLabels, resources: [] };
526
+ }
527
+ const rows = resources.map((resource) => {
528
+ const slots = timeLabels.map((label) => {
529
+ const product = products[0];
530
+ const interval = buildGridSlotInterval(product, date, label, context, query);
531
+ const start = (0, import_dayjs.default)(interval.start_at);
532
+ const end = (0, import_dayjs.default)(interval.end_at);
533
+ const cell = cells.find((item) => sameId(item.productId, product.id) && sameId(item.resourceId, resource.id) && item.date === date && (item.status === "available" || item.status === "limited") && containsRange((0, import_dayjs.default)(item.start_at), (0, import_dayjs.default)(item.end_at), start, end));
534
+ return {
535
+ startTime: label,
536
+ endTime: (0, import_dayjs.default)(interval.end_at).format("HH:mm"),
537
+ status: (cell == null ? void 0 : cell.status) || "unavailable",
538
+ resourceId: resource.id,
539
+ productId: product.id,
540
+ remainingCapacity: cell == null ? void 0 : cell.remainingCapacity,
541
+ maxCapacity: (cell == null ? void 0 : cell.maxCapacity) || resource.capacity,
542
+ reasonCodes: (cell == null ? void 0 : cell.reasonCodes) || ["outside_available_range"]
543
+ };
544
+ });
545
+ return {
546
+ resourceId: resource.id,
547
+ resourceName: resource.name,
548
+ resourceFormId: resource.formId,
549
+ slots
550
+ };
551
+ });
552
+ return { date, timeLabels, resources: rows };
553
+ }
554
+ function queryPlannerAvailability(contextInput, query = {}) {
555
+ const context = normalizePlannerContext(contextInput);
556
+ const intervals = buildDemandIntervals(context.products, query, context);
557
+ const resources = getQueryResources(context.resources, query);
558
+ const eventsByResource = collectEventsByResource(resources, context.externalEvents);
559
+ const cells = [];
560
+ for (const interval of intervals) {
561
+ const candidateResources = resources.filter((resource) => {
562
+ const requirements = interval.resourceRequirements || [];
563
+ if (!requirements.length)
564
+ return true;
565
+ return requirements.some((requirement) => matchesResourceRequirement(resource, requirement));
566
+ });
567
+ if (!candidateResources.length) {
568
+ cells.push({
569
+ key: `${interval.productId}:missing-resource:${interval.start_at}`,
570
+ productId: interval.productId,
571
+ date: interval.date,
572
+ start_at: interval.start_at,
573
+ end_at: interval.end_at,
574
+ startTime: timeOf(interval.start_at),
575
+ endTime: timeOf(interval.end_at),
576
+ durationMinutes: interval.durationMinutes,
577
+ cellType: "unavailable",
578
+ status: "unavailable",
579
+ reasonCodes: ["missing_resource"],
580
+ conflicts: [{
581
+ type: "missing_resource",
582
+ message: "没有匹配商品需求的资源",
583
+ productId: interval.productId
584
+ }]
585
+ });
586
+ continue;
587
+ }
588
+ candidateResources.forEach((resource) => {
589
+ if (interval.source === "duration" && !query.startTime) {
590
+ cells.push(...buildAvailabilityCellsForResource({
591
+ resource,
592
+ interval,
593
+ events: eventsByResource.get(String(resource.id)) || []
594
+ }));
595
+ return;
596
+ }
597
+ cells.push(evaluateResourceForInterval({ resource, interval, context }));
598
+ });
599
+ }
600
+ return {
601
+ query,
602
+ demandIntervals: intervals,
603
+ productOptions: buildProductOptions(context.products, cells, query),
604
+ resourceOptions: buildResourceOptions(context.resources, cells, query),
605
+ dateSummary: buildDateSummary(cells, query),
606
+ timeGrid: buildTimeGrid(context, query, cells),
607
+ cells
608
+ };
609
+ }
610
+ function getIntervalRequirements(interval) {
611
+ return interval.resourceRequirements.length ? interval.resourceRequirements : [{
612
+ capacityRequired: interval.capacityRequired,
613
+ required: true
614
+ }];
615
+ }
616
+ function buildAssignableCandidateGroups(params) {
617
+ const { interval, cells, resources } = params;
618
+ const conflicts = [];
619
+ const groups = getIntervalRequirements(interval).map((requirement) => {
620
+ const candidateCells = cells.filter((cell) => {
621
+ if (!sameId(cell.productId, interval.productId))
622
+ return false;
623
+ if (cell.date !== interval.date)
624
+ return false;
625
+ if (cell.resourceId === void 0)
626
+ return false;
627
+ if (cell.status !== "available" && cell.status !== "limited")
628
+ return false;
629
+ const cellStart = (0, import_dayjs.default)(cell.start_at);
630
+ const cellEnd = (0, import_dayjs.default)(cell.end_at);
631
+ const intervalStart = (0, import_dayjs.default)(interval.start_at);
632
+ const intervalEnd = (0, import_dayjs.default)(interval.end_at);
633
+ return containsRange(cellStart, cellEnd, intervalStart, intervalEnd) || interval.source === "duration";
634
+ });
635
+ return candidateCells.flatMap((cell) => {
636
+ const resource = resources.find((item) => sameId(item.id, cell.resourceId));
637
+ if (!resource || !matchesResourceRequirement(resource, requirement))
638
+ return [];
639
+ return [{ requirement, resource, cell }];
640
+ });
641
+ });
642
+ groups.forEach((group, index) => {
643
+ var _a, _b;
644
+ if (group.length)
645
+ return;
646
+ conflicts.push({
647
+ type: "missing_resource",
648
+ message: "没有匹配商品需求的可用资源",
649
+ productId: interval.productId,
650
+ resourceId: (_b = (_a = interval.resourceRequirements[index]) == null ? void 0 : _a.resourceIds) == null ? void 0 : _b[0]
651
+ });
652
+ });
653
+ return { groups, conflicts };
654
+ }
655
+ function combineCandidateGroups(groups) {
656
+ if (!groups.length || groups.some((group) => group.length === 0))
657
+ return [];
658
+ return groups.reduce((combinations, group) => combinations.flatMap((combination) => group.map((candidate) => [...combination, candidate])), [[]]);
659
+ }
660
+ function buildSlotFromCandidates(params) {
661
+ const { interval, candidates, start, end } = params;
662
+ if (!end.isAfter(start))
663
+ return null;
664
+ const status = candidates.some((candidate) => candidate.cell.status === "limited") ? "limited" : "available";
665
+ const assignments = candidates.map((candidate) => ({
666
+ productId: interval.productId,
667
+ resourceId: candidate.resource.id,
668
+ start_at: start.toISOString(),
669
+ end_at: end.toISOString(),
670
+ capacityRequired: Math.max(1, Number(
671
+ candidate.requirement.capacityRequired || interval.capacityRequired || 1
672
+ ))
673
+ }));
674
+ return {
675
+ key: [
676
+ interval.productId,
677
+ start.toISOString(),
678
+ end.toISOString(),
679
+ ...candidates.map((candidate) => candidate.resource.id)
680
+ ].join(":"),
681
+ productId: interval.productId,
682
+ date: interval.date,
683
+ start_at: start.toISOString(),
684
+ end_at: end.toISOString(),
685
+ startTime: start.format("HH:mm"),
686
+ endTime: end.format("HH:mm"),
687
+ durationMinutes: Math.max(1, end.diff(start, "minute")),
688
+ status,
689
+ resources: candidates.map((candidate) => ({
690
+ resourceId: candidate.resource.id,
691
+ resourceName: candidate.resource.name,
692
+ resourceFormId: candidate.resource.formId,
693
+ resourceType: candidate.resource.resourceType,
694
+ capacityRequired: Math.max(1, Number(
695
+ candidate.requirement.capacityRequired || interval.capacityRequired || 1
696
+ )),
697
+ remainingCapacity: candidate.cell.remainingCapacity,
698
+ maxCapacity: candidate.cell.maxCapacity
699
+ })),
700
+ assignments,
701
+ conflicts: []
702
+ };
703
+ }
704
+ function buildSlotsForInterval(params) {
705
+ const { interval, candidates, query, context } = params;
706
+ const start = candidates.reduce(
707
+ (current, candidate) => maxDayjs(current, (0, import_dayjs.default)(candidate.cell.start_at)),
708
+ (0, import_dayjs.default)(interval.start_at)
709
+ );
710
+ const end = candidates.reduce(
711
+ (current, candidate) => minDayjs(current, (0, import_dayjs.default)(candidate.cell.end_at)),
712
+ (0, import_dayjs.default)(interval.end_at)
713
+ );
714
+ const durationMinutes = Math.max(1, Number(interval.durationMinutes || 1));
715
+ if (interval.source !== "duration" || query.startTime) {
716
+ const fixedStart = (0, import_dayjs.default)(interval.start_at);
717
+ const fixedEnd = (0, import_dayjs.default)(interval.end_at);
718
+ if (containsRange(start, end, fixedStart, fixedEnd) || candidates.every((candidate) => candidate.cell.cellType === "fixed_interval")) {
719
+ const slot = buildSlotFromCandidates({
720
+ interval,
721
+ candidates,
722
+ start: fixedStart,
723
+ end: fixedEnd
724
+ });
725
+ return slot ? [slot] : [];
726
+ }
727
+ return [];
728
+ }
729
+ const stepMinutes = Math.max(1, Number(query.slotDurationMinutes || context.slotDurationMinutes || 30));
730
+ const slots = [];
731
+ let cursor = start;
732
+ while (!cursor.add(durationMinutes, "minute").isAfter(end)) {
733
+ const slotEnd = cursor.add(durationMinutes, "minute");
734
+ const slot = buildSlotFromCandidates({
735
+ interval,
736
+ candidates,
737
+ start: cursor,
738
+ end: slotEnd
739
+ });
740
+ if (slot)
741
+ slots.push(slot);
742
+ cursor = cursor.add(stepMinutes, "minute");
743
+ }
744
+ return slots;
745
+ }
746
+ function resolveAssignableSlots(contextInput, query = {}) {
747
+ const context = normalizePlannerContext(contextInput);
748
+ const projection = queryPlannerAvailability(context, query);
749
+ const resources = getQueryResources(context.resources, query);
750
+ const slotsByKey = /* @__PURE__ */ new Map();
751
+ const conflicts = [];
752
+ projection.demandIntervals.forEach((interval) => {
753
+ const { groups, conflicts: groupConflicts } = buildAssignableCandidateGroups({
754
+ interval,
755
+ cells: projection.cells,
756
+ resources
757
+ });
758
+ conflicts.push(...groupConflicts);
759
+ combineCandidateGroups(groups).forEach((candidates) => {
760
+ buildSlotsForInterval({
761
+ interval,
762
+ candidates,
763
+ query,
764
+ context
765
+ }).forEach((slot) => {
766
+ if (!slotsByKey.has(slot.key))
767
+ slotsByKey.set(slot.key, slot);
768
+ });
769
+ });
770
+ });
771
+ return {
772
+ projection,
773
+ slots: Array.from(slotsByKey.values()),
774
+ conflicts
775
+ };
776
+ }
777
+ function autoAssignResources(contextInput, query = {}) {
778
+ const baseContext = normalizePlannerContext(contextInput);
779
+ const projection = queryPlannerAvailability(baseContext, query);
780
+ const assignments = [];
781
+ const conflicts = [];
782
+ const missingTimeProductIds = /* @__PURE__ */ new Set();
783
+ for (const interval of projection.demandIntervals) {
784
+ if (interval.source === "duration" && !query.startTime) {
785
+ const productKey = String(interval.productId);
786
+ if (!missingTimeProductIds.has(productKey)) {
787
+ missingTimeProductIds.add(productKey);
788
+ conflicts.push({
789
+ type: "missing_time",
790
+ message: "duration 商品需要先确定开始时间后才能自动分配资源",
791
+ productId: interval.productId
792
+ });
793
+ }
794
+ continue;
795
+ }
796
+ const contextWithAssignments = withAssignmentEvents(baseContext, assignments);
797
+ const candidateResources = getQueryResources(contextWithAssignments.resources, query).filter((resource) => {
798
+ const requirements = interval.resourceRequirements || [];
799
+ if (!requirements.length)
800
+ return true;
801
+ return requirements.some((requirement) => matchesResourceRequirement(resource, requirement));
802
+ });
803
+ const availableCell = candidateResources.map((resource) => evaluateResourceForInterval({
804
+ resource,
805
+ interval,
806
+ context: contextWithAssignments
807
+ })).find((cell) => cell.status === "available" || cell.status === "limited");
808
+ if (!(availableCell == null ? void 0 : availableCell.resourceId)) {
809
+ conflicts.push({
810
+ type: "missing_resource",
811
+ message: "无法为商品自动分配可用资源",
812
+ productId: interval.productId
813
+ });
814
+ continue;
815
+ }
816
+ assignments.push({
817
+ productId: interval.productId,
818
+ resourceId: availableCell.resourceId,
819
+ start_at: interval.start_at,
820
+ end_at: interval.end_at,
821
+ capacityRequired: interval.capacityRequired
822
+ });
823
+ }
824
+ return { assignments, conflicts };
825
+ }
826
+ function withAssignmentEvents(context, assignments) {
827
+ if (!assignments.length)
828
+ return context;
829
+ return {
830
+ ...context,
831
+ externalEvents: [
832
+ ...context.externalEvents,
833
+ ...assignments.map((assignment) => ({
834
+ resourceId: assignment.resourceId,
835
+ start_at: assignment.start_at,
836
+ end_at: assignment.end_at,
837
+ pax: assignment.capacityRequired || 1,
838
+ source: "selection"
839
+ }))
840
+ ]
841
+ };
842
+ }
843
+ function validateAssignments(contextInput, selection) {
844
+ if (selection.assignments.length > 0) {
845
+ const context = normalizePlannerContext(contextInput);
846
+ const conflicts2 = [];
847
+ for (let index = 0; index < selection.assignments.length; index += 1) {
848
+ const assignment = selection.assignments[index];
849
+ const product = context.products.find((item) => sameId(item.id, assignment.productId));
850
+ const resource = context.resources.find((item) => sameId(item.id, assignment.resourceId));
851
+ if (!product) {
852
+ conflicts2.push({
853
+ type: "missing_resource",
854
+ message: "assignment 对应的商品不存在",
855
+ productId: assignment.productId
856
+ });
857
+ continue;
858
+ }
859
+ if (!resource) {
860
+ conflicts2.push({
861
+ type: "missing_resource",
862
+ message: "assignment 对应的资源不存在",
863
+ productId: assignment.productId,
864
+ resourceId: assignment.resourceId
865
+ });
866
+ continue;
867
+ }
868
+ const start = (0, import_dayjs.default)(assignment.start_at);
869
+ const end = (0, import_dayjs.default)(assignment.end_at);
870
+ const interval = {
871
+ id: `${assignment.productId}:${assignment.resourceId}:${assignment.start_at}:${assignment.end_at}`,
872
+ productId: assignment.productId,
873
+ source: product.kind === "session" ? "session" : product.kind === "venue_slot" ? "venue_slot" : "duration",
874
+ date: start.format("YYYY-MM-DD"),
875
+ start_at: assignment.start_at,
876
+ end_at: assignment.end_at,
877
+ durationMinutes: Math.max(1, end.diff(start, "minute")),
878
+ quantity: Math.max(1, Number(product.quantity || 1)),
879
+ capacityRequired: Math.max(1, Number(assignment.capacityRequired || product.capacityRequired || 1)),
880
+ resourceRequirements: product.resourceRequirements || []
881
+ };
882
+ const cell = evaluateResourceForInterval({ resource, interval, context });
883
+ if (cell.status !== "available" && cell.status !== "limited") {
884
+ conflicts2.push(...cell.conflicts);
885
+ }
886
+ const priorContext = withAssignmentEvents(
887
+ context,
888
+ selection.assignments.slice(0, index)
889
+ );
890
+ const selfConflictCell = evaluateResourceForInterval({
891
+ resource,
892
+ interval,
893
+ context: priorContext
894
+ });
895
+ if (selfConflictCell.status !== "available" && selfConflictCell.status !== "limited") {
896
+ conflicts2.push(...selfConflictCell.conflicts.map((conflict) => ({
897
+ ...conflict,
898
+ type: "cart_overlap",
899
+ message: "本次选择中存在资源时间冲突"
900
+ })));
901
+ }
902
+ }
903
+ return {
904
+ ok: conflicts2.length === 0,
905
+ conflicts: conflicts2
906
+ };
907
+ }
908
+ const projection = queryPlannerAvailability(contextInput, {
909
+ productIds: selection.productIds,
910
+ date: selection.date,
911
+ startTime: selection.startTime,
912
+ endTime: selection.endTime,
913
+ resourceIds: selection.resourceIds,
914
+ mode: selection.mode
915
+ });
916
+ const conflicts = projection.cells.filter((cell) => cell.status !== "available" && cell.status !== "limited").flatMap((cell) => cell.conflicts);
917
+ return {
918
+ ok: conflicts.length === 0,
919
+ conflicts
920
+ };
921
+ }
922
+ // Annotate the CommonJS export names for ESM import in node:
923
+ 0 && (module.exports = {
924
+ DEFAULT_RESOURCE_PLANNER_CONTEXT,
925
+ DEFAULT_RESOURCE_PLANNER_SELECTION,
926
+ autoAssignResources,
927
+ buildDemandIntervals,
928
+ evaluateResourceForInterval,
929
+ normalizePlannerContext,
930
+ queryPlannerAvailability,
931
+ resolveAssignableSlots,
932
+ validateAssignments
933
+ });