addio-admin-sdk 1.7.165 → 1.7.167

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 (581) hide show
  1. package/.babelrc +17 -17
  2. package/.env.dev +14 -14
  3. package/.github/workflows/run_unit_test.yaml +48 -48
  4. package/addio-sdk-doc.md +1473 -1473
  5. package/changelog.md +573 -573
  6. package/dist/Interfaces/Address/index.d.ts +21 -21
  7. package/dist/Interfaces/Address/index.js +16 -16
  8. package/dist/Interfaces/Algolia/index.d.ts +180 -180
  9. package/dist/Interfaces/Algolia/index.js +2 -2
  10. package/dist/Interfaces/Attachement/index.d.ts +5 -5
  11. package/dist/Interfaces/Attachement/index.js +2 -2
  12. package/dist/Interfaces/Attribute/index.d.ts +53 -53
  13. package/dist/Interfaces/Attribute/index.js +10 -10
  14. package/dist/Interfaces/BGJob/index.d.ts +56 -56
  15. package/dist/Interfaces/BGJob/index.js +25 -25
  16. package/dist/Interfaces/BaseClass/index.d.ts +8 -8
  17. package/dist/Interfaces/BaseClass/index.js +2 -2
  18. package/dist/Interfaces/Blog/IBlogArticle.d.ts +18 -18
  19. package/dist/Interfaces/Blog/IBlogArticle.js +2 -2
  20. package/dist/Interfaces/Blog/IBlogAuthor.d.ts +7 -7
  21. package/dist/Interfaces/Blog/IBlogAuthor.js +2 -2
  22. package/dist/Interfaces/Blog/IBlogCategory.d.ts +9 -9
  23. package/dist/Interfaces/Blog/IBlogCategory.js +2 -2
  24. package/dist/Interfaces/Blog/IBlogComment.d.ts +13 -13
  25. package/dist/Interfaces/Blog/IBlogComment.js +2 -2
  26. package/dist/Interfaces/Blog/IBlogKeywords.d.ts +9 -9
  27. package/dist/Interfaces/Blog/IBlogKeywords.js +2 -2
  28. package/dist/Interfaces/Booking/index.d.ts +74 -74
  29. package/dist/Interfaces/Booking/index.js +17 -17
  30. package/dist/Interfaces/Brand/index.d.ts +15 -15
  31. package/dist/Interfaces/Brand/index.js +2 -2
  32. package/dist/Interfaces/CMS/index.d.ts +28 -28
  33. package/dist/Interfaces/CMS/index.js +5 -5
  34. package/dist/Interfaces/Cart/IElavonPayload.d.ts +93 -93
  35. package/dist/Interfaces/Cart/IElavonPayload.js +17 -17
  36. package/dist/Interfaces/Cart/IMarketPayload.d.ts +12 -12
  37. package/dist/Interfaces/Cart/IMarketPayload.js +2 -2
  38. package/dist/Interfaces/Cart/IPandaPayload.d.ts +64 -64
  39. package/dist/Interfaces/Cart/IPandaPayload.js +18 -18
  40. package/dist/Interfaces/Cart/IPaymentCard.d.ts +22 -22
  41. package/dist/Interfaces/Cart/IPaymentCard.js +44 -44
  42. package/dist/Interfaces/Cart/IPaypalPayload.d.ts +9 -9
  43. package/dist/Interfaces/Cart/IPaypalPayload.js +2 -2
  44. package/dist/Interfaces/Cart/IPaysafePayload.d.ts +72 -72
  45. package/dist/Interfaces/Cart/IPaysafePayload.js +2 -2
  46. package/dist/Interfaces/Cart/IStripePayload.d.ts +66 -66
  47. package/dist/Interfaces/Cart/IStripePayload.js +2 -2
  48. package/dist/Interfaces/Cart/index.d.ts +451 -451
  49. package/dist/Interfaces/Cart/index.js +216 -216
  50. package/dist/Interfaces/CartReservedQuantities/index.d.ts +10 -10
  51. package/dist/Interfaces/CartReservedQuantities/index.js +2 -2
  52. package/dist/Interfaces/CashDrawers/index.d.ts +38 -38
  53. package/dist/Interfaces/CashDrawers/index.js +19 -19
  54. package/dist/Interfaces/Catalogue/index.d.ts +68 -68
  55. package/dist/Interfaces/Catalogue/index.js +37 -37
  56. package/dist/Interfaces/Category/index.d.ts +33 -33
  57. package/dist/Interfaces/Category/index.js +2 -2
  58. package/dist/Interfaces/Chart/index.d.ts +11 -11
  59. package/dist/Interfaces/Chart/index.js +2 -2
  60. package/dist/Interfaces/Class/index.d.ts +8 -8
  61. package/dist/Interfaces/Class/index.js +2 -2
  62. package/dist/Interfaces/Consent/index.d.ts +6 -6
  63. package/dist/Interfaces/Consent/index.js +2 -2
  64. package/dist/Interfaces/Context/IContextProps.d.ts +4 -4
  65. package/dist/Interfaces/Context/IContextProps.js +2 -2
  66. package/dist/Interfaces/Context/IContextState.d.ts +15 -15
  67. package/dist/Interfaces/Context/IContextState.js +2 -2
  68. package/dist/Interfaces/Customer/ICustomerBadge.d.ts +2 -2
  69. package/dist/Interfaces/Customer/ICustomerBadge.js +2 -2
  70. package/dist/Interfaces/Customer/ICustomerRating.d.ts +10 -10
  71. package/dist/Interfaces/Customer/ICustomerRating.js +2 -2
  72. package/dist/Interfaces/Customer/IStoreCredit.d.ts +13 -13
  73. package/dist/Interfaces/Customer/IStoreCredit.js +2 -2
  74. package/dist/Interfaces/Customer/index.d.ts +104 -104
  75. package/dist/Interfaces/Customer/index.js +148 -148
  76. package/dist/Interfaces/Declination/index.d.ts +117 -117
  77. package/dist/Interfaces/Declination/index.js +66 -66
  78. package/dist/Interfaces/Document/index.d.ts +8 -8
  79. package/dist/Interfaces/Document/index.js +2 -2
  80. package/dist/Interfaces/Elastic/index.d.ts +89 -89
  81. package/dist/Interfaces/Elastic/index.js +2 -2
  82. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.d.ts +11 -11
  83. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.js +2 -2
  84. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.d.ts +15 -15
  85. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.js +2 -2
  86. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.d.ts +12 -12
  87. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.js +2 -2
  88. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.d.ts +36 -36
  89. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.js +2 -2
  90. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.d.ts +12 -12
  91. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.js +2 -2
  92. package/dist/Interfaces/Email/CustomGR/ITransportEmail.d.ts +12 -12
  93. package/dist/Interfaces/Email/CustomGR/ITransportEmail.js +2 -2
  94. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.d.ts +12 -12
  95. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.js +2 -2
  96. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.d.ts +16 -16
  97. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.js +2 -2
  98. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.d.ts +15 -15
  99. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.js +2 -2
  100. package/dist/Interfaces/Email/IAbandonnedCartEmail.d.ts +29 -29
  101. package/dist/Interfaces/Email/IAbandonnedCartEmail.js +2 -2
  102. package/dist/Interfaces/Email/IAccountConfirmationEmail.d.ts +22 -22
  103. package/dist/Interfaces/Email/IAccountConfirmationEmail.js +2 -2
  104. package/dist/Interfaces/Email/IApplicationEmail.d.ts +19 -19
  105. package/dist/Interfaces/Email/IApplicationEmail.js +2 -2
  106. package/dist/Interfaces/Email/IBackInStockEmail.d.ts +21 -21
  107. package/dist/Interfaces/Email/IBackInStockEmail.js +2 -2
  108. package/dist/Interfaces/Email/IContactEmail.d.ts +20 -20
  109. package/dist/Interfaces/Email/IContactEmail.js +2 -2
  110. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.d.ts +15 -15
  111. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.js +2 -2
  112. package/dist/Interfaces/Email/ICustomerBookingEmail.d.ts +14 -14
  113. package/dist/Interfaces/Email/ICustomerBookingEmail.js +2 -2
  114. package/dist/Interfaces/Email/IEmail.d.ts +20 -20
  115. package/dist/Interfaces/Email/IEmail.js +60 -60
  116. package/dist/Interfaces/Email/IOrderConfirmationEmail.d.ts +47 -47
  117. package/dist/Interfaces/Email/IOrderConfirmationEmail.js +2 -2
  118. package/dist/Interfaces/Email/IPasswordResetEmail.d.ts +17 -17
  119. package/dist/Interfaces/Email/IPasswordResetEmail.js +2 -2
  120. package/dist/Interfaces/Email/IPhotoShootEmail.d.ts +14 -14
  121. package/dist/Interfaces/Email/IPhotoShootEmail.js +2 -2
  122. package/dist/Interfaces/Email/IPickupConfirmation.d.ts +23 -23
  123. package/dist/Interfaces/Email/IPickupConfirmation.js +2 -2
  124. package/dist/Interfaces/Email/IShippingConfirmation.d.ts +23 -23
  125. package/dist/Interfaces/Email/IShippingConfirmation.js +2 -2
  126. package/dist/Interfaces/Email/IWelcomeEmail.d.ts +19 -19
  127. package/dist/Interfaces/Email/IWelcomeEmail.js +2 -2
  128. package/dist/Interfaces/ExportSchema/index.d.ts +7 -7
  129. package/dist/Interfaces/ExportSchema/index.js +2 -2
  130. package/dist/Interfaces/ExternalService/BaseExternalService.d.ts +12 -12
  131. package/dist/Interfaces/ExternalService/BaseExternalService.js +2 -2
  132. package/dist/Interfaces/ExternalService/ExternalProductsService.d.ts +4 -4
  133. package/dist/Interfaces/ExternalService/ExternalProductsService.js +2 -2
  134. package/dist/Interfaces/ExternalService/index.d.ts +9 -9
  135. package/dist/Interfaces/ExternalService/index.js +2 -2
  136. package/dist/Interfaces/FirstOrderTracking/index.d.ts +5 -5
  137. package/dist/Interfaces/FirstOrderTracking/index.js +2 -2
  138. package/dist/Interfaces/G2/index.d.ts +556 -556
  139. package/dist/Interfaces/G2/index.js +38 -38
  140. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.d.ts +20 -20
  141. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.js +2 -2
  142. package/dist/Interfaces/Indexed/Product/index.d.ts +105 -105
  143. package/dist/Interfaces/Indexed/Product/index.js +253 -253
  144. package/dist/Interfaces/Inventory/index.d.ts +19 -19
  145. package/dist/Interfaces/Inventory/index.js +8 -8
  146. package/dist/Interfaces/Invoice/index.d.ts +4 -4
  147. package/dist/Interfaces/Invoice/index.js +2 -2
  148. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.d.ts +3 -3
  149. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.js +2 -2
  150. package/dist/Interfaces/MarketplacePublication/index.d.ts +23 -23
  151. package/dist/Interfaces/MarketplacePublication/index.js +22 -22
  152. package/dist/Interfaces/Menu/index.d.ts +40 -40
  153. package/dist/Interfaces/Menu/index.js +16 -16
  154. package/dist/Interfaces/Note/index.d.ts +10 -10
  155. package/dist/Interfaces/Note/index.js +7 -7
  156. package/dist/Interfaces/Operations/ICreatedBy.d.ts +6 -6
  157. package/dist/Interfaces/Operations/ICreatedBy.js +2 -2
  158. package/dist/Interfaces/Operations/IUpdate.d.ts +5 -5
  159. package/dist/Interfaces/Operations/IUpdate.js +2 -2
  160. package/dist/Interfaces/Order/index.d.ts +4 -4
  161. package/dist/Interfaces/Order/index.js +2 -2
  162. package/dist/Interfaces/Org/IRelUser.d.ts +9 -9
  163. package/dist/Interfaces/Org/IRelUser.js +2 -2
  164. package/dist/Interfaces/Org/index.d.ts +29 -29
  165. package/dist/Interfaces/Org/index.js +12 -12
  166. package/dist/Interfaces/Payment/index.d.ts +26 -26
  167. package/dist/Interfaces/Payment/index.js +14 -14
  168. package/dist/Interfaces/Product/IAttributeFamily.d.ts +6 -6
  169. package/dist/Interfaces/Product/IAttributeFamily.js +2 -2
  170. package/dist/Interfaces/Product/IImportProduct.d.ts +42 -42
  171. package/dist/Interfaces/Product/IImportProduct.js +882 -882
  172. package/dist/Interfaces/Product/IInventoryItem.d.ts +74 -74
  173. package/dist/Interfaces/Product/IInventoryItem.js +38 -38
  174. package/dist/Interfaces/Product/IPricing.d.ts +177 -177
  175. package/dist/Interfaces/Product/IPricing.js +180 -180
  176. package/dist/Interfaces/Product/index.d.ts +137 -137
  177. package/dist/Interfaces/Product/index.js +64 -64
  178. package/dist/Interfaces/ProductAttribute/index.d.ts +11 -11
  179. package/dist/Interfaces/ProductAttribute/index.js +2 -2
  180. package/dist/Interfaces/PromiseToPurchase/BankType.d.ts +41 -41
  181. package/dist/Interfaces/PromiseToPurchase/BankType.js +41 -41
  182. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.d.ts +33 -33
  183. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.js +15 -15
  184. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.d.ts +19 -19
  185. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.js +2 -2
  186. package/dist/Interfaces/PromiseToPurchase/index.d.ts +50 -50
  187. package/dist/Interfaces/PromiseToPurchase/index.js +13 -13
  188. package/dist/Interfaces/PurchaseOrder/index.d.ts +17 -17
  189. package/dist/Interfaces/PurchaseOrder/index.js +2 -2
  190. package/dist/Interfaces/Query/IBrandQueryOptions.d.ts +11 -11
  191. package/dist/Interfaces/Query/IBrandQueryOptions.js +2 -2
  192. package/dist/Interfaces/Query/ICategoryQueryOptions.d.ts +11 -11
  193. package/dist/Interfaces/Query/ICategoryQueryOptions.js +2 -2
  194. package/dist/Interfaces/Query/IProductQueryOptions.d.ts +16 -16
  195. package/dist/Interfaces/Query/IProductQueryOptions.js +2 -2
  196. package/dist/Interfaces/Quote/index.d.ts +5 -5
  197. package/dist/Interfaces/Quote/index.js +2 -2
  198. package/dist/Interfaces/Refunds/index.d.ts +106 -106
  199. package/dist/Interfaces/Refunds/index.js +2 -2
  200. package/dist/Interfaces/Rules/IDiscountRule.d.ts +155 -155
  201. package/dist/Interfaces/Rules/IDiscountRule.js +114 -114
  202. package/dist/Interfaces/Schedule/index.d.ts +48 -48
  203. package/dist/Interfaces/Schedule/index.js +2 -2
  204. package/dist/Interfaces/Services/IAddServiceResponse.d.ts +4 -4
  205. package/dist/Interfaces/Services/IAddServiceResponse.js +2 -2
  206. package/dist/Interfaces/Services/IService.d.ts +16 -16
  207. package/dist/Interfaces/Services/IService.js +2 -2
  208. package/dist/Interfaces/Services/IServiceSecret.d.ts +8 -8
  209. package/dist/Interfaces/Services/IServiceSecret.js +2 -2
  210. package/dist/Interfaces/Shipping/Shipstation/carriers.d.ts +10 -10
  211. package/dist/Interfaces/Shipping/Shipstation/carriers.js +2 -2
  212. package/dist/Interfaces/Shipping/Shipstation/order.d.ts +227 -227
  213. package/dist/Interfaces/Shipping/Shipstation/order.js +2 -2
  214. package/dist/Interfaces/Shipping/Shipstation/quote.d.ts +31 -31
  215. package/dist/Interfaces/Shipping/Shipstation/quote.js +2 -2
  216. package/dist/Interfaces/Shipping/Shiptime/order.d.ts +54 -54
  217. package/dist/Interfaces/Shipping/Shiptime/order.js +71 -71
  218. package/dist/Interfaces/Shipping/Shiptime/quote.d.ts +111 -111
  219. package/dist/Interfaces/Shipping/Shiptime/quote.js +2 -2
  220. package/dist/Interfaces/Slider/GR.d.ts +114 -114
  221. package/dist/Interfaces/Slider/GR.js +271 -271
  222. package/dist/Interfaces/Slider/index.d.ts +30 -30
  223. package/dist/Interfaces/Slider/index.js +2 -2
  224. package/dist/Interfaces/Space/IExternalService.d.ts +54 -53
  225. package/dist/Interfaces/Space/IExternalService.js +45 -44
  226. package/dist/Interfaces/Space/IExternalService.js.map +1 -1
  227. package/dist/Interfaces/Space/IMember.d.ts +16 -16
  228. package/dist/Interfaces/Space/IMember.js +9 -9
  229. package/dist/Interfaces/Space/index.d.ts +413 -411
  230. package/dist/Interfaces/Space/index.js +175 -174
  231. package/dist/Interfaces/Space/index.js.map +1 -1
  232. package/dist/Interfaces/Specials/gr.d.ts +61 -61
  233. package/dist/Interfaces/Specials/gr.js +2 -2
  234. package/dist/Interfaces/StockNotification/index.d.ts +7 -7
  235. package/dist/Interfaces/StockNotification/index.js +2 -2
  236. package/dist/Interfaces/Store/index.d.ts +63 -63
  237. package/dist/Interfaces/Store/index.js +27 -27
  238. package/dist/Interfaces/Supplier/ICommand.d.ts +11 -11
  239. package/dist/Interfaces/Supplier/ICommand.js +2 -2
  240. package/dist/Interfaces/Supplier/index.d.ts +36 -36
  241. package/dist/Interfaces/Supplier/index.js +24 -24
  242. package/dist/Interfaces/TCG/index.d.ts +194 -194
  243. package/dist/Interfaces/TCG/index.js +60 -60
  244. package/dist/Interfaces/Tag/index.d.ts +18 -18
  245. package/dist/Interfaces/Tag/index.js +2 -2
  246. package/dist/Interfaces/Tax/index.d.ts +13 -13
  247. package/dist/Interfaces/Tax/index.js +2 -2
  248. package/dist/Interfaces/TransferRequest/index.d.ts +103 -103
  249. package/dist/Interfaces/TransferRequest/index.js +46 -46
  250. package/dist/Interfaces/Translation/index.d.ts +8 -8
  251. package/dist/Interfaces/Translation/index.js +5 -5
  252. package/dist/Interfaces/Update/index.d.ts +10 -10
  253. package/dist/Interfaces/Update/index.js +2 -2
  254. package/dist/Interfaces/User/IUser.d.ts +65 -65
  255. package/dist/Interfaces/User/IUser.js +8 -8
  256. package/dist/Interfaces/Version/index.d.ts +11 -11
  257. package/dist/Interfaces/Version/index.js +2 -2
  258. package/dist/Interfaces/Wishlist/index.d.ts +7 -7
  259. package/dist/Interfaces/Wishlist/index.js +2 -2
  260. package/dist/constants/Interfaces/IBaseApi.d.ts +15 -15
  261. package/dist/constants/Interfaces/IBaseApi.js +2 -2
  262. package/dist/constants/Interfaces/IEndpointResult.d.ts +9 -9
  263. package/dist/constants/Interfaces/IEndpointResult.js +2 -2
  264. package/dist/constants/enums.d.ts +6 -6
  265. package/dist/constants/enums.js +10 -10
  266. package/dist/constants/services.d.ts +2 -2
  267. package/dist/constants/services.js +122 -117
  268. package/dist/constants/services.js.map +1 -1
  269. package/dist/constants/version.d.ts +2 -2
  270. package/dist/constants/version.js +5 -5
  271. package/dist/index.d.ts +50 -50
  272. package/dist/index.js +266 -266
  273. package/dist/lib/Attribute/index.d.ts +14 -14
  274. package/dist/lib/Attribute/index.js +186 -186
  275. package/dist/lib/BGJob/index.d.ts +9 -9
  276. package/dist/lib/BGJob/index.js +216 -216
  277. package/dist/lib/BackgroundWorker/index.d.ts +34 -34
  278. package/dist/lib/BackgroundWorker/index.js +59 -59
  279. package/dist/lib/Blog/BlogArticle.d.ts +5 -5
  280. package/dist/lib/Blog/BlogArticle.js +10 -10
  281. package/dist/lib/Blog/BlogAuthor.d.ts +5 -5
  282. package/dist/lib/Blog/BlogAuthor.js +10 -10
  283. package/dist/lib/Blog/BlogCategory.d.ts +5 -5
  284. package/dist/lib/Blog/BlogCategory.js +10 -10
  285. package/dist/lib/Blog/BlogKeyword.d.ts +5 -5
  286. package/dist/lib/Blog/BlogKeyword.js +10 -10
  287. package/dist/lib/Booking/index.d.ts +85 -85
  288. package/dist/lib/Booking/index.js +596 -596
  289. package/dist/lib/Brand/index.d.ts +26 -26
  290. package/dist/lib/Brand/index.js +131 -131
  291. package/dist/lib/Cart/index.d.ts +354 -335
  292. package/dist/lib/Cart/index.js +4031 -3981
  293. package/dist/lib/Cart/index.js.map +1 -1
  294. package/dist/lib/CartReservedQuantities/index.d.ts +49 -49
  295. package/dist/lib/CartReservedQuantities/index.js +159 -159
  296. package/dist/lib/CashDrawerShift/index.d.ts +84 -84
  297. package/dist/lib/CashDrawerShift/index.js +206 -206
  298. package/dist/lib/Catalogue/index.d.ts +15 -15
  299. package/dist/lib/Catalogue/index.js +78 -78
  300. package/dist/lib/Category/index.d.ts +34 -34
  301. package/dist/lib/Category/index.js +230 -230
  302. package/dist/lib/Class/index.d.ts +16 -16
  303. package/dist/lib/Class/index.js +66 -66
  304. package/dist/lib/Consent/index.d.ts +4 -4
  305. package/dist/lib/Consent/index.js +29 -29
  306. package/dist/lib/Customer/index.d.ts +30 -30
  307. package/dist/lib/Customer/index.js +92 -92
  308. package/dist/lib/Declination/index.d.ts +9 -9
  309. package/dist/lib/Declination/index.js +26 -26
  310. package/dist/lib/Discount/index.d.ts +27 -27
  311. package/dist/lib/Discount/index.js +493 -493
  312. package/dist/lib/ElasticSearch/index.d.ts +13 -13
  313. package/dist/lib/ElasticSearch/index.js +50 -50
  314. package/dist/lib/Elavon/index.d.ts +18 -18
  315. package/dist/lib/Elavon/index.js +135 -135
  316. package/dist/lib/Email/AbandonedCartEmail.d.ts +16 -16
  317. package/dist/lib/Email/AbandonedCartEmail.js +24 -24
  318. package/dist/lib/Email/AccountConfirmationEmail.d.ts +19 -19
  319. package/dist/lib/Email/AccountConfirmationEmail.js +30 -30
  320. package/dist/lib/Email/AdminOrderConfirmationEmail.d.ts +16 -16
  321. package/dist/lib/Email/AdminOrderConfirmationEmail.js +24 -24
  322. package/dist/lib/Email/ApplicationEmail.d.ts +16 -16
  323. package/dist/lib/Email/ApplicationEmail.js +24 -24
  324. package/dist/lib/Email/BackInStockEmail.d.ts +16 -16
  325. package/dist/lib/Email/BackInStockEmail.js +24 -24
  326. package/dist/lib/Email/ContactEmail.d.ts +16 -16
  327. package/dist/lib/Email/ContactEmail.js +24 -24
  328. package/dist/lib/Email/CustomerBookingAdminEmail.d.ts +16 -16
  329. package/dist/lib/Email/CustomerBookingAdminEmail.js +24 -24
  330. package/dist/lib/Email/CustomerBookingEmail.d.ts +16 -16
  331. package/dist/lib/Email/CustomerBookingEmail.js +24 -24
  332. package/dist/lib/Email/OrderConfirmationEmail.d.ts +16 -16
  333. package/dist/lib/Email/OrderConfirmationEmail.js +24 -24
  334. package/dist/lib/Email/OrderDenounciationEmail.d.ts +16 -16
  335. package/dist/lib/Email/OrderDenounciationEmail.js +24 -24
  336. package/dist/lib/Email/OrderSampleEmail.d.ts +16 -16
  337. package/dist/lib/Email/OrderSampleEmail.js +24 -24
  338. package/dist/lib/Email/OtherTypeEmails.d.ts +16 -16
  339. package/dist/lib/Email/OtherTypeEmails.js +27 -27
  340. package/dist/lib/Email/PasswordResetEmail.d.ts +16 -16
  341. package/dist/lib/Email/PasswordResetEmail.js +24 -24
  342. package/dist/lib/Email/PhotoShootEmail.d.ts +16 -16
  343. package/dist/lib/Email/PhotoShootEmail.js +24 -24
  344. package/dist/lib/Email/PickUpConfirmation.d.ts +16 -16
  345. package/dist/lib/Email/PickUpConfirmation.js +24 -24
  346. package/dist/lib/Email/ShippingConfirmation.d.ts +16 -16
  347. package/dist/lib/Email/ShippingConfirmation.js +24 -24
  348. package/dist/lib/Email/WelcomeEmail.d.ts +16 -16
  349. package/dist/lib/Email/WelcomeEmail.js +24 -24
  350. package/dist/lib/Email/index.d.ts +16 -16
  351. package/dist/lib/Email/index.js +31 -31
  352. package/dist/lib/ExternalService/Ebay.d.ts +74 -74
  353. package/dist/lib/ExternalService/Ebay.js +124 -124
  354. package/dist/lib/ExternalService/index.d.ts +5 -5
  355. package/dist/lib/ExternalService/index.js +10 -10
  356. package/dist/lib/FirstOrderTracking/index.d.ts +5 -5
  357. package/dist/lib/FirstOrderTracking/index.js +10 -10
  358. package/dist/lib/Indexed/IndexedCart.d.ts +13 -13
  359. package/dist/lib/Indexed/IndexedCart.js +91 -91
  360. package/dist/lib/Indexed/Product.d.ts +17 -17
  361. package/dist/lib/Indexed/Product.js +98 -98
  362. package/dist/lib/Inventory/index.d.ts +112 -112
  363. package/dist/lib/Inventory/index.js +492 -492
  364. package/dist/lib/Invoice/index.d.ts +16 -16
  365. package/dist/lib/Invoice/index.js +21 -21
  366. package/dist/lib/MarketplacePublication/index.d.ts +9 -9
  367. package/dist/lib/MarketplacePublication/index.js +426 -426
  368. package/dist/lib/Menu/index.d.ts +11 -11
  369. package/dist/lib/Menu/index.js +107 -107
  370. package/dist/lib/MongoDB/BaseAPI.d.ts +18 -18
  371. package/dist/lib/MongoDB/BaseAPI.js +200 -200
  372. package/dist/lib/Note/index.d.ts +4 -4
  373. package/dist/lib/Note/index.js +6 -6
  374. package/dist/lib/Order/index.d.ts +27 -27
  375. package/dist/lib/Order/index.js +56 -56
  376. package/dist/lib/Org/index.d.ts +68 -68
  377. package/dist/lib/Org/index.js +216 -216
  378. package/dist/lib/PandaPay/index.d.ts +16 -16
  379. package/dist/lib/PandaPay/index.js +176 -176
  380. package/dist/lib/Paysafe/index.d.ts +11 -11
  381. package/dist/lib/Paysafe/index.js +41 -41
  382. package/dist/lib/Product/index.d.ts +182 -182
  383. package/dist/lib/Product/index.js +847 -847
  384. package/dist/lib/ProductAttribute/index.d.ts +15 -15
  385. package/dist/lib/ProductAttribute/index.js +45 -45
  386. package/dist/lib/PromiseToPurchase/index.d.ts +109 -109
  387. package/dist/lib/PromiseToPurchase/index.js +343 -343
  388. package/dist/lib/PurchaseOrder/index.d.ts +20 -20
  389. package/dist/lib/PurchaseOrder/index.js +28 -28
  390. package/dist/lib/Queue/index.d.ts +40 -0
  391. package/dist/lib/Queue/index.js +255 -0
  392. package/dist/lib/Queue/index.js.map +1 -0
  393. package/dist/lib/Schedule/index.d.ts +5 -5
  394. package/dist/lib/Schedule/index.js +12 -12
  395. package/dist/lib/Service/Enum/ServiceEnum.d.ts +3 -3
  396. package/dist/lib/Service/Enum/ServiceEnum.js +7 -7
  397. package/dist/lib/Service/index.d.ts +13 -13
  398. package/dist/lib/Service/index.js +21 -21
  399. package/dist/lib/Shipment/index.d.ts +28 -28
  400. package/dist/lib/Shipment/index.js +370 -370
  401. package/dist/lib/Slider/index.d.ts +22 -22
  402. package/dist/lib/Slider/index.js +119 -119
  403. package/dist/lib/Space/index.d.ts +1181 -1181
  404. package/dist/lib/Space/index.js +5841 -5841
  405. package/dist/lib/StockNotification/index.d.ts +4 -4
  406. package/dist/lib/StockNotification/index.js +6 -6
  407. package/dist/lib/Store/index.d.ts +5 -5
  408. package/dist/lib/Store/index.js +12 -12
  409. package/dist/lib/Supplier/Command.d.ts +5 -5
  410. package/dist/lib/Supplier/Command.js +10 -10
  411. package/dist/lib/Supplier/index.d.ts +25 -25
  412. package/dist/lib/Supplier/index.js +27 -27
  413. package/dist/lib/Tags/index.d.ts +6 -6
  414. package/dist/lib/Tags/index.js +26 -26
  415. package/dist/lib/Tax/index.d.ts +8 -8
  416. package/dist/lib/Tax/index.js +54 -54
  417. package/dist/lib/TransferRequest/index.d.ts +290 -290
  418. package/dist/lib/TransferRequest/index.js +1026 -1026
  419. package/dist/lib/Update/index.d.ts +10 -10
  420. package/dist/lib/Update/index.js +22 -22
  421. package/dist/lib/User/index.d.ts +89 -89
  422. package/dist/lib/User/index.js +328 -328
  423. package/dist/lib/Wishlist/index.d.ts +5 -5
  424. package/dist/lib/Wishlist/index.js +10 -10
  425. package/dist/lib/base.d.ts +14 -14
  426. package/dist/lib/base.js +62 -62
  427. package/dist/lib/baseService.d.ts +17 -17
  428. package/dist/lib/baseService.js +69 -69
  429. package/dist/rules/ADD/utils/buyback.d.ts +4 -4
  430. package/dist/rules/ADD/utils/buyback.js +135 -135
  431. package/dist/rules/GR/constants/data.d.ts +26 -26
  432. package/dist/rules/GR/constants/data.js +81 -81
  433. package/dist/rules/GR/constants/expedition.d.ts +4 -4
  434. package/dist/rules/GR/constants/expedition.js +9 -9
  435. package/dist/rules/GR/constants/products.d.ts +22 -22
  436. package/dist/rules/GR/constants/products.js +263 -263
  437. package/dist/rules/GR/interfaces/cart.d.ts +84 -84
  438. package/dist/rules/GR/interfaces/cart.js +41 -41
  439. package/dist/rules/GR/interfaces/data.d.ts +101 -101
  440. package/dist/rules/GR/interfaces/data.js +114 -114
  441. package/dist/rules/GR/interfaces/products.d.ts +61 -61
  442. package/dist/rules/GR/interfaces/products.js +10 -10
  443. package/dist/rules/GR/utils/cart.d.ts +95 -95
  444. package/dist/rules/GR/utils/cart.js +839 -839
  445. package/dist/rules/GR/utils/data.d.ts +3 -3
  446. package/dist/rules/GR/utils/data.js +28 -28
  447. package/dist/rules/GR/utils/expedition.d.ts +140 -140
  448. package/dist/rules/GR/utils/expedition.js +2016 -2016
  449. package/dist/rules/GR/utils/g2.d.ts +209 -209
  450. package/dist/rules/GR/utils/g2.js +1002 -1002
  451. package/dist/rules/GR/utils/invoices.d.ts +51 -51
  452. package/dist/rules/GR/utils/invoices.js +215 -215
  453. package/dist/rules/GR/utils/products.d.ts +277 -277
  454. package/dist/rules/GR/utils/products.js +1350 -1350
  455. package/dist/rules/GR/utils/upsells.d.ts +111 -111
  456. package/dist/rules/GR/utils/upsells.js +215 -215
  457. package/dist/services/database/BaseProvider.d.ts +29 -29
  458. package/dist/services/database/BaseProvider.js +28 -28
  459. package/dist/services/database/BatchUtils.d.ts +14 -14
  460. package/dist/services/database/BatchUtils.js +43 -43
  461. package/dist/services/database/Config.d.ts +2 -2
  462. package/dist/services/database/Config.js +5 -5
  463. package/dist/services/database/DatabaseService.d.ts +125 -125
  464. package/dist/services/database/DatabaseService.js +237 -237
  465. package/dist/services/database/FirebaseProvider.d.ts +17 -17
  466. package/dist/services/database/FirebaseProvider.js +235 -235
  467. package/dist/services/database/NotFirebaseProvider.d.ts +49 -49
  468. package/dist/services/database/NotFirebaseProvider.js +262 -262
  469. package/dist/services/g2/G2OrderSlip.d.ts +49 -49
  470. package/dist/services/g2/G2OrderSlip.js +228 -228
  471. package/dist/services/g2/utils.d.ts +19 -19
  472. package/dist/services/g2/utils.js +967 -967
  473. package/dist/services/logs/index.d.ts +23 -23
  474. package/dist/services/logs/index.js +66 -66
  475. package/dist/services/marketplace/BaseMarketServiceClass.d.ts +69 -69
  476. package/dist/services/marketplace/BaseMarketServiceClass.js +133 -133
  477. package/dist/services/marketplace/CardtraderServiceClass.d.ts +33 -33
  478. package/dist/services/marketplace/CardtraderServiceClass.js +215 -215
  479. package/dist/services/marketplace/utils.d.ts +17 -17
  480. package/dist/services/marketplace/utils.js +32 -32
  481. package/dist/services/products/BaseClass.d.ts +50 -50
  482. package/dist/services/products/BaseClass.js +66 -66
  483. package/dist/services/products/TCGService.d.ts +32 -32
  484. package/dist/services/products/TCGService.js +555 -555
  485. package/dist/services/products/utils.d.ts +31 -31
  486. package/dist/services/products/utils.js +144 -144
  487. package/dist/utils/algolia.d.ts +46 -46
  488. package/dist/utils/algolia.js +21 -21
  489. package/dist/utils/anonymisation.d.ts +54 -54
  490. package/dist/utils/anonymisation.js +280 -280
  491. package/dist/utils/array.d.ts +5 -5
  492. package/dist/utils/array.js +14 -14
  493. package/dist/utils/aws.d.ts +36 -36
  494. package/dist/utils/aws.js +154 -154
  495. package/dist/utils/booking.d.ts +30 -30
  496. package/dist/utils/booking.js +127 -127
  497. package/dist/utils/cart.d.ts +272 -272
  498. package/dist/utils/cart.js +1169 -1169
  499. package/dist/utils/categories.d.ts +2 -2
  500. package/dist/utils/categories.js +54 -54
  501. package/dist/utils/cmv.d.ts +10 -10
  502. package/dist/utils/cmv.js +107 -107
  503. package/dist/utils/console.d.ts +6 -6
  504. package/dist/utils/console.js +59 -59
  505. package/dist/utils/context.d.ts +20 -20
  506. package/dist/utils/context.js +61 -61
  507. package/dist/utils/currency.d.ts +6 -6
  508. package/dist/utils/currency.js +91 -91
  509. package/dist/utils/data.d.ts +31 -31
  510. package/dist/utils/data.js +296 -296
  511. package/dist/utils/date.d.ts +1 -1
  512. package/dist/utils/date.js +16 -16
  513. package/dist/utils/dimensions.d.ts +3 -3
  514. package/dist/utils/dimensions.js +16 -16
  515. package/dist/utils/discount.d.ts +174 -174
  516. package/dist/utils/discount.js +1118 -1118
  517. package/dist/utils/errors.d.ts +118 -118
  518. package/dist/utils/errors.js +123 -123
  519. package/dist/utils/file-admin.d.ts +8 -8
  520. package/dist/utils/file-admin.js +39 -39
  521. package/dist/utils/file.d.ts +39 -39
  522. package/dist/utils/file.js +208 -208
  523. package/dist/utils/firebase-admin.d.ts +11 -11
  524. package/dist/utils/firebase-admin.js +73 -73
  525. package/dist/utils/firebase.d.ts +58 -58
  526. package/dist/utils/firebase.js +148 -148
  527. package/dist/utils/import.d.ts +1 -1
  528. package/dist/utils/import.js +21 -21
  529. package/dist/utils/inventories.d.ts +101 -101
  530. package/dist/utils/inventories.js +467 -467
  531. package/dist/utils/locale.d.ts +24 -24
  532. package/dist/utils/locale.js +91 -91
  533. package/dist/utils/mailchimp.d.ts +58 -58
  534. package/dist/utils/mailchimp.js +531 -531
  535. package/dist/utils/mathUtils.d.ts +17 -17
  536. package/dist/utils/mathUtils.js +324 -324
  537. package/dist/utils/mongodb.d.ts +1 -1
  538. package/dist/utils/mongodb.js +22 -22
  539. package/dist/utils/object.d.ts +32 -32
  540. package/dist/utils/object.js +133 -133
  541. package/dist/utils/payment.d.ts +10 -10
  542. package/dist/utils/payment.js +23 -23
  543. package/dist/utils/products.d.ts +39 -39
  544. package/dist/utils/products.js +195 -195
  545. package/dist/utils/promiseToPurchase.d.ts +88 -88
  546. package/dist/utils/promiseToPurchase.js +229 -229
  547. package/dist/utils/prosprsearch.d.ts +42 -42
  548. package/dist/utils/prosprsearch.js +216 -216
  549. package/dist/utils/refunds.d.ts +2 -2
  550. package/dist/utils/refunds.js +21 -21
  551. package/dist/utils/sdc.d.ts +10 -10
  552. package/dist/utils/sdc.js +1309 -1309
  553. package/dist/utils/searchIndexes.d.ts +58 -58
  554. package/dist/utils/searchIndexes.js +247 -247
  555. package/dist/utils/services.d.ts +42 -42
  556. package/dist/utils/services.js +409 -409
  557. package/dist/utils/shipment.d.ts +110 -110
  558. package/dist/utils/shipment.js +345 -345
  559. package/dist/utils/simpletexting.d.ts +2 -2
  560. package/dist/utils/simpletexting.js +45 -45
  561. package/dist/utils/sliders.d.ts +4 -4
  562. package/dist/utils/sliders.js +24 -24
  563. package/dist/utils/string.d.ts +16 -16
  564. package/dist/utils/string.js +192 -192
  565. package/dist/utils/tcgService.d.ts +88 -88
  566. package/dist/utils/tcgService.js +408 -408
  567. package/dist/utils/tools.d.ts +5 -5
  568. package/dist/utils/tools.js +13 -13
  569. package/dist/utils/transferRequests.d.ts +43 -43
  570. package/dist/utils/transferRequests.js +67 -67
  571. package/dist/utils/update.d.ts +7 -7
  572. package/dist/utils/update.js +137 -137
  573. package/dist/utils/weight.d.ts +3 -3
  574. package/dist/utils/weight.js +16 -16
  575. package/dist/utils/zones.d.ts +11 -11
  576. package/dist/utils/zones.js +218 -218
  577. package/package.json +107 -107
  578. package/publish.sh +143 -143
  579. package/readme.md +182 -182
  580. package/.claude/settings.local.json +0 -7
  581. package/.env +0 -14
@@ -1,840 +1,840 @@
1
- "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.getLabelForCartType = exports.getClientNumberForCart = exports.getPercentFromReducedPrice = exports.checkPriceForEscompte = exports.getLowestAppliedPrice = exports.getAppliedPrice = exports.getRecursiveItemsFromSubItems = exports.getRecursiveItems = exports.getGrassProductForCart = exports.getConcreteCartInfo = exports.orderCartItems = exports.getProTitleFromCart = exports.isPro = exports.getCartType = exports.checkCartTypeBeforeAddingItem = exports.checkIfDecliIsOkForMixedSale = exports.checkIfItemCanBeAddedToCart = exports.checkIfCartContainsType = exports.applyInstallationToutInclusToVerifiedItems = exports.handleAddGrassItemsCart = void 0;
18
- const orderBy_1 = __importDefault(require("lodash/orderBy"));
19
- const flatten_1 = __importDefault(require("lodash/flatten"));
20
- const uniqBy_1 = __importDefault(require("lodash/uniqBy"));
21
- const toNumber_1 = __importDefault(require("lodash/toNumber"));
22
- const round_1 = __importDefault(require("lodash/round"));
23
- const moment_1 = __importDefault(require("moment"));
24
- // Rule specific interfaces
25
- const cart_1 = require("../interfaces/cart");
26
- // Rule specific functions/constants
27
- const products_1 = require("./products");
28
- const upsells_1 = require("./upsells");
29
- const expedition_1 = require("./expedition");
30
- const products_2 = require("../constants/products");
31
- const Cart_1 = require("../../../Interfaces/Cart");
32
- const G2_1 = require("../../../Interfaces/G2");
33
- const locale_1 = require("../../../utils/locale");
34
- const inventories_1 = require("../../../utils/inventories");
35
- const products_3 = require("../../../utils/products");
36
- const data_1 = require("../../../utils/data");
37
- const data_2 = require("../interfaces/data");
38
- const g2_1 = require("./g2");
39
- const object_1 = require("../../../utils/object");
40
- const cart_2 = require("../../../utils/cart");
41
- const handleAddGrassItemsCart = async (cart, chosenDeclination, parentProduct, isUpdating, isRecommendedUpsell, formValues, fetchProduct, kentuckyBaseGrass, locale = 'fr', isPro, customPriceList, recommendedUpsellParentSlug) => {
42
- var _a, _b;
43
- if (!!!chosenDeclination || !!!parentProduct)
44
- return {
45
- error: ''
46
- };
47
- let itemsToAdd = [];
48
- let itemsToUpdate = [];
49
- let itemsToDelete = [];
50
- let newShippingPayload = cart.shipping_payload;
51
- const prodUpsell = parentProduct.product_upsells;
52
- const onlySamplesInCart = !!cart.items.length && cart.items.every((item) => !!item.is_sample);
53
- if (!!onlySamplesInCart) {
54
- return {
55
- error: (0, locale_1.translateILang)({
56
- fr: "Pour ajouter ce produit à votre panier vous devez d'abord compléter la commande en cours ou vider votre panier",
57
- en: 'To add this product to your cart, you must first complete your current order or empty your cart'
58
- }, locale)
59
- };
60
- }
61
- if (!!isPro && !!customPriceList) {
62
- chosenDeclination = (0, g2_1.checkForCustomPriceEquivalent)(chosenDeclination, customPriceList, {
63
- removeTierPricing: chosenDeclination.sku == products_2.kentucky || chosenDeclination.parent_slug === 'kentucky'
64
- });
65
- }
66
- // --------------------------------------------------------------------------------
67
- // Ajout gazon aux items
68
- if (isUpdating && !!cart.items.find((i) => i.sku === chosenDeclination.sku)) {
69
- itemsToUpdate.push({
70
- sku: chosenDeclination.sku,
71
- qte: formValues.qte || 0
72
- });
73
- }
74
- else {
75
- itemsToAdd.push(Object.assign(Object.assign({}, chosenDeclination), { qte: formValues.qte || 0, parent_slug: !!isRecommendedUpsell && recommendedUpsellParentSlug ? recommendedUpsellParentSlug : parentProduct.slug, product_upsells: parentProduct.product_upsells, categories: parentProduct.categories }));
76
- }
77
- if (!!!isRecommendedUpsell) {
78
- let baseGrass = parentProduct;
79
- // --------------------------------------------------------------------------------
80
- // If gazon de spécialité, il aura en upsell le gazon de base (Kentucky)...
81
- // (parent_slug: kentucky, sku (declinaison): 010010000) // NOTE - Sku peut varier!!
82
- if (!!prodUpsell &&
83
- !!prodUpsell.find((anUpsell) => anUpsell.recommendation_sku === products_2.kentucky || anUpsell.recommendation_parent_slug == 'kentucky')) {
84
- const baseGrassProd = kentuckyBaseGrass;
85
- if (!!baseGrassProd)
86
- baseGrass = baseGrassProd;
87
- }
88
- // --------------------------------------------------------------------------------
89
- // Check if grass has any other auto_add upsells to add
90
- if (!!prodUpsell) {
91
- for (let anUpsell of prodUpsell) {
92
- if (!!!anUpsell.auto_add)
93
- continue;
94
- const sameProduct = await fetchProduct(anUpsell.recommendation_parent_slug, locale, undefined, true);
95
- if (!!!sameProduct || !!!sameProduct.declinations)
96
- continue;
97
- let sameDecli = (sameProduct.declinations || []).find((decli) => decli.sku === anUpsell.recommendation_sku);
98
- if (!!!sameDecli)
99
- continue;
100
- if (!!isPro && !!customPriceList) {
101
- sameDecli = (0, g2_1.checkForCustomPriceEquivalent)(sameDecli, customPriceList, {
102
- removeTierPricing: sameDecli.sku == 'kentucky' || sameDecli.parent_slug === 'kentucky'
103
- });
104
- }
105
- const anUpsellProduct = Object.assign(Object.assign(Object.assign(Object.assign({}, sameDecli), { parent_slug: anUpsell.recommendation_parent_slug, recommended_qte: anUpsell.recommendation_qty, recommended_sku: anUpsell.recommendation_sku, matching_qte: !!anUpsell.matching_qty, auto_add: anUpsell.auto_add, actual_qte: anUpsell.actual_qty }), (!!anUpsell.is_recommendation ? { is_recommendation: true } : {})), (!!anUpsell.show_recommendation_msg ? { show_recommendation_msg: true } : {}));
106
- const ratio = (0, upsells_1.calculateUpsellQte)(anUpsellProduct, formValues.qte || 0);
107
- if (!!ratio) {
108
- if (isUpdating && !!cart.items.find((i) => i.sku === anUpsellProduct.sku)) {
109
- itemsToUpdate.push({
110
- sku: anUpsellProduct.sku,
111
- qte: ratio
112
- });
113
- }
114
- else {
115
- itemsToAdd.push(Object.assign(Object.assign({}, sameDecli), { qte: ratio, is_upsell_of_sku: chosenDeclination.sku, parent_slug: sameProduct.slug, product_upsells: sameProduct.product_upsells, categories: sameProduct.categories }));
116
- }
117
- }
118
- }
119
- }
120
- // --------------------------------------------------------------------------------
121
- // If installation...
122
- const currentInstallItem = cart.items.find((i) => i.parent_slug === 'installation-gazon');
123
- if (!!formValues.installation) {
124
- const upsell = baseGrass.product_upsells;
125
- if (!!upsell) {
126
- const allInstallFees = await (0, products_1.getInstallationArray)(Number(formValues.qte), upsell, fetchProduct, locale, isPro, chosenDeclination.sku, customPriceList, {
127
- engrais: !!formValues.engrais,
128
- roulage: !!formValues.roulage
129
- });
130
- const installationDecli = allInstallFees.find((fee) => fee.parent_slug === 'installation-gazon');
131
- const installIsDifferent = !!currentInstallItem && !!installationDecli && currentInstallItem.sku !== installationDecli.sku;
132
- for (let fee of allInstallFees) {
133
- if (isUpdating && !!cart.items.find((i) => i.sku === fee.sku) && !!!installIsDifferent) {
134
- itemsToUpdate.push({
135
- sku: fee.sku,
136
- qte: fee.qte
137
- });
138
- }
139
- else {
140
- itemsToAdd.push(fee);
141
- }
142
- }
143
- const minQteInstall = (0, expedition_1.getMinQteInstall)(!!isPro);
144
- // ================================================================================
145
- // Check to delete existing items if necessary
146
- // --------------------------------------------------------------------------------
147
- // If min qty install...
148
- if (typeof formValues.qte === 'number' && formValues.qte >= minQteInstall) {
149
- const minInstall = cart.items.find((item) => item.parent_slug === 'frais-minimum-gazon-pour-installation');
150
- if (!!minInstall) {
151
- itemsToDelete.push(minInstall.sku);
152
- }
153
- }
154
- // --------------------------------------------------------------------------------
155
- // If engrais...
156
- const fertilisationItem = cart.items.find((i) => i.parent_slug === 'installation-fertilisation');
157
- if (isUpdating && !!!formValues.engrais && !!fertilisationItem) {
158
- itemsToDelete.push(fertilisationItem.sku);
159
- }
160
- // --------------------------------------------------------------------------------
161
- // If roulage...
162
- const roulageItem = cart.items.find((i) => i.parent_slug === 'installation-roulage');
163
- if (isUpdating && !!!formValues.roulage && !!roulageItem) {
164
- itemsToDelete.push(roulageItem.sku);
165
- }
166
- // --------------------------------------------------------------------------------
167
- // If cart already has installation item...
168
- // --> Utile pour la modification des items du cart, vu que la props is_upsell_of_sku ne peut pas se modifier on update
169
- const otherInstall = !!installIsDifferent ? currentInstallItem : undefined;
170
- if (!!otherInstall) {
171
- itemsToDelete.push(otherInstall.sku);
172
- itemsToDelete = [
173
- ...itemsToDelete,
174
- ...cart.items.filter((i) => i.is_upsell_of_sku === otherInstall.sku).map((i) => i.sku)
175
- ];
176
- }
177
- // ==================================================================================
178
- // If isPro, check for corresponding pro extra installation fees
179
- if (!!isPro) {
180
- newShippingPayload = Object.assign(Object.assign({}, newShippingPayload), { pro_installation_info: formValues.pro });
181
- const feeProduct = await fetchProduct('frais_extra_pro_installation', locale, undefined, true);
182
- const handleProSpec = (sku, isSelected) => {
183
- if (!!!feeProduct || !!!installationDecli)
184
- return;
185
- const itemIsInCart = !!cart.items.find((i) => i.sku === sku);
186
- if (isSelected) {
187
- let decli = feeProduct.declinations.find((d) => d.sku === sku);
188
- if (!!decli) {
189
- if (!!customPriceList) {
190
- decli = (0, g2_1.checkForCustomPriceEquivalent)(decli, customPriceList);
191
- }
192
- if (isUpdating && itemIsInCart && !!!otherInstall) {
193
- itemsToUpdate.push({
194
- sku: sku,
195
- qte: typeof formValues.qte === 'number' && formValues.qte < minQteInstall
196
- ? minQteInstall
197
- : formValues.qte || 0
198
- });
199
- }
200
- else {
201
- if (!!otherInstall) {
202
- itemsToDelete.push(decli.sku);
203
- }
204
- itemsToAdd.push(Object.assign(Object.assign({}, decli), { qte: typeof formValues.qte === 'number' && formValues.qte < minQteInstall
205
- ? minQteInstall
206
- : formValues.qte || 0, is_upsell_of_sku: installationDecli.sku, parent_slug: 'frais_extra_pro_installation' }));
207
- }
208
- }
209
- }
210
- else {
211
- if (itemIsInCart) {
212
- itemsToDelete.push(sku);
213
- }
214
- }
215
- };
216
- if (!!formValues.pro && !!formValues.pro.specs) {
217
- Object.entries(formValues.pro.specs).forEach((spec) => {
218
- handleProSpec(products_2.installationProSpecSkus[spec[0]], spec[1]);
219
- });
220
- }
221
- }
222
- }
223
- }
224
- else {
225
- if (!!isUpdating && !formValues.installation) {
226
- if (!!newShippingPayload && !!newShippingPayload.pro_installation_info) {
227
- const { pro_installation_info } = newShippingPayload, rest = __rest(newShippingPayload, ["pro_installation_info"]);
228
- newShippingPayload = Object.assign({}, rest);
229
- }
230
- itemsToDelete = [...itemsToDelete, ...(0, products_1.getAllInstallFromItems)(cart.items).map((i) => i.sku)];
231
- // Restore price of kentucky when overriden by all-inclusive installation
232
- if (!!isPro && !!(0, products_1.getInstallationAllInclusiveFromPriceList)(customPriceList)) {
233
- const kentuckyIdx = cart.items.findIndex((i) => !!i.price_override && (i.sku === products_2.kentucky || i.parent_slug == 'kentucky'));
234
- if (kentuckyIdx !== -1) {
235
- const kentuckyItem = cart.items[kentuckyIdx];
236
- itemsToUpdate = itemsToUpdate.filter((u) => u.sku !== kentuckyItem.sku);
237
- const originalDecli = ((_a = kentuckyBaseGrass === null || kentuckyBaseGrass === void 0 ? void 0 : kentuckyBaseGrass.declinations) === null || _a === void 0 ? void 0 : _a.find((d) => d.sku === kentuckyItem.sku)) ||
238
- ((_b = parentProduct.declinations) === null || _b === void 0 ? void 0 : _b.find((d) => d.sku === kentuckyItem.sku));
239
- if (!!originalDecli) {
240
- const restoredDecli = !!customPriceList
241
- ? (0, g2_1.checkForCustomPriceEquivalent)(originalDecli, customPriceList, {
242
- removeTierPricing: true
243
- })
244
- : originalDecli;
245
- cart.items[kentuckyIdx] = Object.assign(Object.assign(Object.assign({}, kentuckyItem), restoredDecli), { qte: kentuckyItem.qte, price_override: false });
246
- }
247
- }
248
- }
249
- }
250
- }
251
- }
252
- itemsToAdd = (0, upsells_1.removeExceptionAutoAddUpsells)(itemsToAdd);
253
- if (!!isUpdating) {
254
- if (!!cart.items) {
255
- const fusion = [
256
- ...cart.items.filter((i) => itemsToUpdate.some((update) => i.sku === update.sku) || i.is_upsell_of_sku === 'summary'),
257
- ...itemsToAdd
258
- ];
259
- let productsToRemove = fusion.filter((item) => {
260
- const removedBecauseException = !!!(0, upsells_1.removeExceptionAutoAddUpsells)(fusion).some((i) => i.sku === item.sku);
261
- return item.is_upsell_of_sku === 'summary' || !!removedBecauseException;
262
- });
263
- itemsToAdd = itemsToAdd.filter((i) => !!!productsToRemove.map((r) => r.sku).includes(i.sku));
264
- if (!!productsToRemove.length) {
265
- itemsToDelete = [...itemsToDelete, ...productsToRemove.map((item) => item.sku)];
266
- if (newShippingPayload) {
267
- const { pro_installation_info } = newShippingPayload;
268
- newShippingPayload = Object.assign(Object.assign({}, newShippingPayload), (!!pro_installation_info ? { pro_installation_info } : {}));
269
- }
270
- }
271
- }
272
- }
273
- // When installation all-inclusive, force kentucky and frais de livraison to 0$
274
- if ((0, products_1.isInstallAllInclusiveActive)(!!formValues.installation, isPro, customPriceList)) {
275
- itemsToAdd = itemsToAdd.map((item) => (0, products_1.applyAllInclusiveOverrides)(item));
276
- // Also override existing Kentucky items that are in the cart but not yet at $0
277
- if (!!isUpdating) {
278
- const kentuckyIdx = cart.items.findIndex((i) => !i.price_override && i.sku === products_2.kentucky);
279
- if (kentuckyIdx !== -1) {
280
- const kentuckyItemToOverride = cart.items[kentuckyIdx];
281
- itemsToUpdate = itemsToUpdate.filter((u) => u.sku !== kentuckyItemToOverride.sku);
282
- cart.items[kentuckyIdx] = (0, products_1.applyAllInclusiveOverrides)(kentuckyItemToOverride);
283
- }
284
- }
285
- }
286
- return {
287
- itemsToAdd,
288
- itemsToUpdate,
289
- itemsToDelete,
290
- newShippingPayload
291
- };
292
- };
293
- exports.handleAddGrassItemsCart = handleAddGrassItemsCart;
294
- /**
295
- * Replaces ventilated installation with installation tout inclus and applies Kentucky overrides.
296
- * Used during cart verification when a pro customer has installation tout inclus but cart has ventilated installation.
297
- */
298
- const applyInstallationToutInclusToVerifiedItems = (verifiedItems, customPriceList, isPro, installationParent) => {
299
- var _a;
300
- const currentInstall = verifiedItems.find((i) => i.parent_slug === 'installation-gazon');
301
- if (!currentInstall || currentInstall.sku === products_2.installationAllInclusiveSku)
302
- return verifiedItems;
303
- const allInclusivePriceItem = (0, products_1.getInstallationAllInclusiveFromPriceList)(customPriceList);
304
- if (!allInclusivePriceItem || !isPro)
305
- return verifiedItems;
306
- if (!installationParent || !installationParent.declinations)
307
- return verifiedItems;
308
- const allInclusiveDecli = installationParent.declinations.find((d) => d.sku === products_2.installationAllInclusiveSku);
309
- if (!!!allInclusiveDecli)
310
- return verifiedItems;
311
- const priceAmount = (_a = allInclusivePriceItem.price) !== null && _a !== void 0 ? _a : allInclusivePriceItem.reg;
312
- const grassItem = verifiedItems.find((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon') && !!!i.is_sample);
313
- const chosenSku = !!grassItem ? grassItem.sku : currentInstall.is_upsell_of_sku || '';
314
- const newInstallItem = Object.assign(Object.assign({}, allInclusiveDecli), { regular_price: Object.assign(Object.assign({}, allInclusiveDecli.regular_price), { amount: priceAmount }), parent_slug: 'installation-gazon', qte: currentInstall.qte, is_upsell_of_sku: chosenSku, product_upsells: installationParent.product_upsells, categories: installationParent.categories });
315
- const installSkusToRemove = (0, products_1.getAllInstallFromItems)(verifiedItems).map((i) => i.sku);
316
- let result = verifiedItems.filter((i) => !installSkusToRemove.includes(i.sku));
317
- result = [...result, newInstallItem];
318
- result = result.map((item) => (0, products_1.applyAllInclusiveOverrides)(item));
319
- return result;
320
- };
321
- exports.applyInstallationToutInclusToVerifiedItems = applyInstallationToutInclusToVerifiedItems;
322
- // -----------------------------------------------------------------------------------------
323
- // #region CART SPECIFIC VERIFICATIONS AND DATA
324
- const checkIfCartContainsType = (type, cartData, excludeUndefinedForAccessories = true, excludeUndefinedForBeton = true) => {
325
- switch (type) {
326
- case cart_1.CartGeneralTypeEnum.RETURN_PALLETS:
327
- return !!cartData.shipping_payload && !!cartData.shipping_payload.pallet_return_memo_ref;
328
- case cart_1.CartGeneralTypeEnum.GRASS:
329
- return !!cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon') && !!!i.is_sample);
330
- case cart_1.CartGeneralTypeEnum.VRAC:
331
- return !!cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'vrac'));
332
- case cart_1.CartGeneralTypeEnum.INSTALLATION:
333
- return !!cartData.items.some((i) => i.parent_slug === 'installation-gazon');
334
- case cart_1.CartGeneralTypeEnum.SAMPLE:
335
- return !!cartData.items.some((i) => !!i.is_sample);
336
- case cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES:
337
- return (!!cartData.items &&
338
- !!cartData.items.length &&
339
- cartData.items
340
- .filter((i) => !!!i.is_service)
341
- .every((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'accessoire', excludeUndefinedForAccessories)));
342
- case cart_1.CartGeneralTypeEnum.BETON:
343
- return (!!cartData.items &&
344
- !!cartData.items.length &&
345
- cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'beton', excludeUndefinedForBeton) && !!!i.is_sample));
346
- default:
347
- return false;
348
- }
349
- };
350
- exports.checkIfCartContainsType = checkIfCartContainsType;
351
- const checkIfItemCanBeAddedToCart = (prod, parentProdType, cartData, addToCart = false, declination = undefined, useParent = false, autoAdd = false) => {
352
- // -----------------------------------------------------------------------------------------------
353
- // If... product can not be added to cart, show error and return false.
354
- const addItToCart = !!autoAdd ? true : (0, exports.checkCartTypeBeforeAddingItem)(prod, declination, cartData);
355
- if (!!!addItToCart) {
356
- return {
357
- addToCart: false,
358
- error: {
359
- fr: "Pour ajouter ce type de produit à votre panier vous devez d'abord compléter la commande en cours ou vider votre panier.",
360
- en: 'To add this type of product to your cart, you must first complete the current order or empty your cart.'
361
- }
362
- };
363
- }
364
- // -----------------------------------------------------------------------------------------------
365
- // Set parentProduct type variable depending on product category
366
- let prodDeclination = declination; // If prodDeclination is set, means customer chose spécific sku and is trying to add to cart.
367
- if (!!!useParent) {
368
- switch (parentProdType) {
369
- case 'gazon':
370
- prodDeclination =
371
- prodDeclination || prod.declinations.find((declination) => !!!declination.is_sample);
372
- break;
373
- case 'beton':
374
- break;
375
- case 'other':
376
- case 'vrac':
377
- if (!!!prod.declinations.find((decli) => !!decli.other_units)) {
378
- prodDeclination =
379
- prodDeclination || prod.declinations.find((declination) => !!!declination.is_sample);
380
- }
381
- }
382
- }
383
- const decliIsSample = !!prodDeclination && !!prodDeclination.is_sample;
384
- // --------------------------------------------------------------------------------------------------
385
- // If... prodDeclination is sample, check if max qte (4) is met or sample already in cart before.
386
- // If so, show error and return false.
387
- // Else if... product is of any type other than grass, set addToCart to true.
388
- if (!!decliIsSample) {
389
- if (!!cartData && !!cartData.items.length) {
390
- switch (true) {
391
- case cartData.items.length === 4:
392
- return {
393
- addToCart: false,
394
- error: {
395
- fr: 'Un maximum de quatre échantillons est permis à la fois par commande.',
396
- en: 'A maximum of four samples can be added to your cart.'
397
- }
398
- };
399
- case !!cartData.items.find((item) => !!prodDeclination && item.sku === prodDeclination.sku):
400
- return {
401
- addToCart: false,
402
- error: {
403
- fr: 'Vous avez déjà cet échantillon au panier.',
404
- en: 'This sample is already in your cart.'
405
- }
406
- };
407
- default:
408
- addToCart = true;
409
- }
410
- }
411
- else {
412
- addToCart = true;
413
- }
414
- }
415
- else if (!!prodDeclination && !!!(0, products_1.checkIfProductIsOfType)(prod, 'gazon')) {
416
- addToCart = true;
417
- }
418
- return {
419
- addToCart: addToCart,
420
- declinationChecked: prodDeclination,
421
- showForm: true
422
- };
423
- };
424
- exports.checkIfItemCanBeAddedToCart = checkIfItemCanBeAddedToCart;
425
- const checkIfDecliIsOkForMixedSale = (decli, typeToCheck) => {
426
- return (decli.attributes &&
427
- !!decli.attributes[data_2.AttributesIdEnumGR.VENTE_MIXTE] &&
428
- !!decli.attributes[data_2.AttributesIdEnumGR.VENTE_MIXTE].includes(typeToCheck));
429
- };
430
- exports.checkIfDecliIsOkForMixedSale = checkIfDecliIsOkForMixedSale;
431
- const checkCartTypeBeforeAddingItem = (prod, declination, cartData, forceCartType) => {
432
- if (!!!cartData || !!!cartData.items || !!!cartData.items.length) {
433
- if (!!!forceCartType)
434
- return true;
435
- }
436
- const cartType = !!forceCartType ? forceCartType : !!cartData ? (0, exports.getCartType)(cartData) : '';
437
- if (!!!cartType)
438
- return true;
439
- const items = !!cartData ? cartData.items : [];
440
- // Can't add items to cart if ...
441
- // -----------------------------------------
442
- // ... cart is of type booking
443
- if (!!cartData && !!cartData.is_booking)
444
- return false;
445
- // --------------------------------------------------------------------------------------------------
446
- // ... if new item is NOT a sample or does NOT contain samples in declinations && cart already contains samples
447
- if ((!!!prod.declinations.find((decli) => !!decli.is_sample) || (!!declination && !declination.is_sample)) &&
448
- cartType === cart_1.CartGeneralTypeEnum.SAMPLE) {
449
- return false;
450
- }
451
- // --------------------------------------------------------------------------------------------------
452
- // ... if new item is a sample && cart has items that are NOT samples
453
- if (!!declination && !!declination.is_sample && cartType !== cart_1.CartGeneralTypeEnum.SAMPLE) {
454
- return false;
455
- }
456
- // ----------------------------------------------------------
457
- // ... new item is of type grass and cart already contains grass or items that cannot be sold with grass
458
- if (!!(0, products_1.checkIfProductIsOfType)(prod, 'gazon') && cartType !== cart_1.CartGeneralTypeEnum.SAMPLE) {
459
- if (!!items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon')))
460
- return false;
461
- if (!!items.some((i) => !!!(0, exports.checkIfDecliIsOkForMixedSale)(i, 'gazon')))
462
- return false;
463
- }
464
- // --------------------------------------------------------------------------------------------------
465
- // ... if cart already has a grass product
466
- let currentCartUpsells = [];
467
- try {
468
- currentCartUpsells = (0, uniqBy_1.default)((0, flatten_1.default)(items.map((i) => i.product_upsells || [])), (i) => !!i.recommendation_sku ? i.recommendation_sku : i.recommendation_parent_slug);
469
- }
470
- catch (e) {
471
- if (!!process.env.IS_TEST_ENV)
472
- console.log('error on fetching cart upsells: ', e.toString());
473
- }
474
- if (cartType === cart_1.CartGeneralTypeEnum.GRASS) {
475
- if (!!!prod.declinations.some((decli) => (0, exports.checkIfDecliIsOkForMixedSale)(decli, 'gazon')) ||
476
- (!!declination && !!!(0, exports.checkIfDecliIsOkForMixedSale)(declination, 'gazon'))) {
477
- if (!!!currentCartUpsells.length ||
478
- (!!currentCartUpsells.length &&
479
- (!!!prod.declinations.find((decli) => !!currentCartUpsells.find((item) => (!!item.use_parent &&
480
- item.recommendation_parent_slug &&
481
- item.recommendation_parent_slug === prod.slug) ||
482
- item.recommendation_sku === decli.sku)) ||
483
- (!!declination &&
484
- !!!currentCartUpsells.find((item) => item.recommendation_sku === declination.sku ||
485
- (!!item.use_parent &&
486
- item.recommendation_parent_slug &&
487
- item.recommendation_parent_slug === prod.slug)))))) {
488
- return false;
489
- }
490
- }
491
- else {
492
- }
493
- }
494
- // --------------------------------------------------------------------------------------------------
495
- // ... if new item is of type vrac and cart contains anything else
496
- if (cartType !== cart_1.CartGeneralTypeEnum.VRAC &&
497
- (prod.declinations.every((decli) => !!(0, products_1.checkIfProductIsOfType)(decli, 'vrac')) ||
498
- (!!declination && !!(0, products_1.checkIfProductIsOfType)(declination, 'vrac'))) &&
499
- items.some((i) => !!!(0, exports.checkIfDecliIsOkForMixedSale)(i, 'vrac'))) {
500
- return false;
501
- }
502
- // --------------------------------------------------------------------------------------------------
503
- // ... if new item is of any other type than vrac and cart contains vrac
504
- if (cartType === cart_1.CartGeneralTypeEnum.VRAC &&
505
- (!!!prod.declinations.some((decli) => !!(0, products_1.checkIfProductIsOfType)(decli, 'vrac') || !!(0, exports.checkIfDecliIsOkForMixedSale)(decli, 'vrac')) ||
506
- (!!declination &&
507
- !!!(0, products_1.checkIfProductIsOfType)(declination, 'vrac', true) &&
508
- !!!(0, exports.checkIfDecliIsOkForMixedSale)(declination, 'vrac')))) {
509
- return false;
510
- }
511
- return true;
512
- };
513
- exports.checkCartTypeBeforeAddingItem = checkCartTypeBeforeAddingItem;
514
- const getCartType = (cartData, prioritizeInstallation) => {
515
- if (!!prioritizeInstallation && (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.INSTALLATION, cartData)) {
516
- return cart_1.CartGeneralTypeEnum.INSTALLATION;
517
- }
518
- switch (true) {
519
- case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.RETURN_PALLETS, cartData):
520
- return cart_1.CartGeneralTypeEnum.RETURN_PALLETS;
521
- case !!cartData.is_booking:
522
- return !!cartData.is_booking_beton ? cart_1.CartGeneralTypeEnum.BOOKING_BETON : cart_1.CartGeneralTypeEnum.BOOKING;
523
- case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.SAMPLE, cartData):
524
- return cart_1.CartGeneralTypeEnum.SAMPLE;
525
- case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.VRAC, cartData):
526
- return cart_1.CartGeneralTypeEnum.VRAC;
527
- case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.GRASS, cartData):
528
- return cart_1.CartGeneralTypeEnum.GRASS;
529
- case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES, cartData):
530
- return cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES;
531
- default:
532
- return cart_1.CartGeneralTypeEnum.BETON;
533
- }
534
- };
535
- exports.getCartType = getCartType;
536
- /**
537
- * Finds out if a cart is for a pro customer or not
538
- * @param {ICart} invoice The cart to test
539
- * @return Returns true if the cart is pro, false if not
540
- */
541
- const isPro = (invoice) => {
542
- return !!(0, exports.getProTitleFromCart)(invoice);
543
- };
544
- exports.isPro = isPro;
545
- const getProTitleFromCart = (invoice) => {
546
- return (0, object_1.recursiveCheckObject)(invoice, 'customer_info.pro_title');
547
- };
548
- exports.getProTitleFromCart = getProTitleFromCart;
549
- const orderCartItems = (cart) => {
550
- return (0, orderBy_1.default)(!!cart.promise_to_purchase && !!cart.promise_to_purchase.ids
551
- ? (0, g2_1.groupArrayOfItemsByItemAndCorrespondingEscompteItem)(cart.items)
552
- : cart.items, (item) => {
553
- const upsellRelativeItem = !!item.is_upsell_of_sku
554
- ? cart.items.find((i) => i.sku === item.is_upsell_of_sku)
555
- : undefined;
556
- if (!!!item.is_service ||
557
- ((0, g2_1.isEscompteSuppItem)(item.sku) && !!upsellRelativeItem && !!!upsellRelativeItem.is_service))
558
- return 0;
559
- if (item.is_service && item.sku === 'FRSBETON')
560
- return 1;
561
- return 2;
562
- });
563
- };
564
- exports.orderCartItems = orderCartItems;
565
- // #endregion
566
- // -----------------------------------------------------------------------------------------
567
- // #region FORMAT CART VALUES
568
- const getConcreteCartInfo = async (cartData, fetchInventoryItem, pickupStoreId, inventoryItemsArray) => {
569
- const containsYellowProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'delais-a-prevoir');
570
- const containsGreenProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'en-stock', true);
571
- const containsRedProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'aucune-production-prevue');
572
- let isInStock = true;
573
- const storeId = !!pickupStoreId ? pickupStoreId : (0, object_1.recursiveCheckObject)(cartData, 'shipping_payload.pickup_store.id');
574
- if (!!storeId && !!containsGreenProduct.length) {
575
- const inventoryItems = !!inventoryItemsArray && !!inventoryItemsArray.length
576
- ? inventoryItemsArray
577
- : (await Promise.all(containsGreenProduct.map(async (item) => !!item.is_service ? undefined : await fetchInventoryItem(item.sku)))).filter((i) => !!i);
578
- isInStock =
579
- !!inventoryItems &&
580
- !!inventoryItems.length &&
581
- inventoryItems.every((inventoryItem) => {
582
- const cartItem = containsGreenProduct.find((i) => i.sku === inventoryItem.sku);
583
- if (!!!cartItem)
584
- return false;
585
- const inventoryStock = inventoryItem.inventories.find((i) => i.store_id === storeId);
586
- if (!!!inventoryStock || !!!inventoryStock.qty)
587
- return false;
588
- const convertedQuantity = (0, inventories_1.getConvertedUnitQuantity)(inventoryItem.other_units || [], inventoryStock.qty.available || 0, 'sale_unit');
589
- return convertedQuantity >= cartItem.qte;
590
- });
591
- }
592
- return {
593
- type: !!containsRedProduct.length ? 'red' : !!containsYellowProduct.length ? 'yellow' : 'green',
594
- inStock: isInStock
595
- };
596
- };
597
- exports.getConcreteCartInfo = getConcreteCartInfo;
598
- /**
599
- * Function getGrassProduct
600
- * @description - Create the essential info needed when checking a grass type product for cart
601
- * @param item
602
- */
603
- const getGrassProductForCart = (item) => {
604
- if (!!!item)
605
- return;
606
- return {
607
- slug: item.parent_slug || '',
608
- sku: item.sku,
609
- qte: item.qte,
610
- price: (0, products_3.getLowestPrice)(item).price.amount
611
- };
612
- };
613
- exports.getGrassProductForCart = getGrassProductForCart;
614
- const getRecursiveItems = (cartItems, cartContainsGrass, keepFees, groupSurcharges) => {
615
- const getRecusiveItem = (item) => {
616
- const subItems = cartItems.filter((i) => i.is_upsell_of_sku === item.sku).map((subI) => getRecusiveItem(subI));
617
- return Object.assign(Object.assign({}, item), { sub_items: !!subItems && !!subItems.length ? subItems : undefined });
618
- };
619
- const newItemList = cartItems
620
- .map((i) => getRecusiveItem(i))
621
- .filter((i) => (!!keepFees && !!i.is_upsell_of_sku && i.is_upsell_of_sku === 'summary') ||
622
- (!!i.sub_items && !!!i.is_upsell_of_sku) ||
623
- (!!!i.is_upsell_of_sku && !!!i.sub_items));
624
- const ordered = !!!cartContainsGrass ? newItemList : (0, orderBy_1.default)(newItemList, (i) => !!i.sub_items, 'desc');
625
- if (!!!groupSurcharges)
626
- return ordered;
627
- const surcharges = cartItems.filter((i) => products_2.fuelSurchargeSkus.includes(i.sku));
628
- if (surcharges.length === 0)
629
- return ordered;
630
- // Retirer les surcharges pour les ré-attacher comme sub_items
631
- const filteredOrdered = ordered.filter((i) => !products_2.fuelSurchargeSkus.includes(i.sku));
632
- // Pour chaque surcharge, retenir le dernier item parent qui matche dans l'arbre
633
- const surchargeParent = new Map();
634
- const findLastParent = (item) => {
635
- if (!(0, products_1.shouldHideItemInCheckout)(item, cartItems)) {
636
- surcharges.forEach((s) => {
637
- if ((0, products_1.matchesFuelSurchargeParent)(s.sku, item))
638
- surchargeParent.set(s.sku, item);
639
- });
640
- }
641
- if (!!item.sub_items && !!item.sub_items.length)
642
- item.sub_items.forEach(findLastParent);
643
- };
644
- filteredOrdered.forEach(findLastParent);
645
- const placed = new Set();
646
- const attachSurcharges = (item) => {
647
- const updatedSubItems = !!item.sub_items && !!item.sub_items.length ? item.sub_items.map(attachSurcharges) : item.sub_items;
648
- if ((0, products_1.shouldHideItemInCheckout)(item, cartItems)) {
649
- return updatedSubItems !== item.sub_items ? Object.assign(Object.assign({}, item), { sub_items: updatedSubItems }) : item;
650
- }
651
- const matching = surcharges.filter((s) => !placed.has(s.sku) && surchargeParent.get(s.sku) === item);
652
- if (matching.length > 0) {
653
- matching.forEach((m) => placed.add(m.sku));
654
- const surchargeNodes = matching.map((s) => (Object.assign(Object.assign({}, s), { sub_items: undefined })));
655
- return Object.assign(Object.assign({}, item), { sub_items: [...(updatedSubItems || []), ...surchargeNodes] });
656
- }
657
- return updatedSubItems !== item.sub_items ? Object.assign(Object.assign({}, item), { sub_items: updatedSubItems }) : item;
658
- };
659
- const placedItems = filteredOrdered.map(attachSurcharges);
660
- const unplaced = surcharges.filter((s) => !!!placed.has(s.sku));
661
- return unplaced.length === 0
662
- ? placedItems
663
- : [...placedItems, ...unplaced.map((s) => (Object.assign(Object.assign({}, s), { sub_items: undefined })))];
664
- };
665
- exports.getRecursiveItems = getRecursiveItems;
666
- const getRecursiveItemsFromSubItems = (item) => {
667
- const getRecusiveItem = (item) => {
668
- const subItems = item.sub_items;
669
- if (!!subItems) {
670
- const items = [item, ...(0, flatten_1.default)(subItems.map((i) => getRecusiveItem(i)))];
671
- return items;
672
- }
673
- return [item];
674
- };
675
- return !!item.sub_items ? [item, ...(0, flatten_1.default)(item.sub_items.map((i) => getRecusiveItem(i)))] : [item];
676
- };
677
- exports.getRecursiveItemsFromSubItems = getRecursiveItemsFromSubItems;
678
- /**
679
- * Get price applied for item in cart. Corresponds to the unit price that the customer paid.
680
- * @param {Space} space
681
- * @param {ICartItem} item
682
- * @param {ICart} cartData
683
- * @param {boolean} options.isBookingBeton Optionnal. Always returns regular price if true (additionnal check)
684
- * @param {boolean} options.getLowest Optionnal. If true, always returns the lowest amount found between all cart item prices, with no other checks.
685
- * @returns
686
- */
687
- const getAppliedPrice = (item, options = {}) => {
688
- const applied = (0, exports.getLowestAppliedPrice)(item);
689
- if (!!options.getLowest) {
690
- return applied.amount;
691
- }
692
- if ((!!!item.promo_price && !!!item.discount_price) || !!options.isBookingBeton) {
693
- return item.regular_price.amount;
694
- }
695
- const itemPriceIsEscompte = (!!item.promo_price && (0, exports.checkPriceForEscompte)(item.promo_price)) ||
696
- (!!item.discount_price && (0, exports.checkPriceForEscompte)(item.discount_price));
697
- if (!!itemPriceIsEscompte) {
698
- if (!!item.discount_price)
699
- return item.discount_price.amount;
700
- return item.regular_price.amount;
701
- }
702
- return applied.amount;
703
- };
704
- exports.getAppliedPrice = getAppliedPrice;
705
- const getLowestAppliedPrice = (item) => {
706
- const regular = item.regular_price;
707
- const promo = item.promo_price;
708
- const discount = item.discount_price;
709
- const regularPrice = regular.amount || 0;
710
- const promoPrice = !!promo ? promo.amount : regularPrice;
711
- const discountPrice = !!discount ? discount.amount : regularPrice;
712
- if (!!promo && promoPrice <= discountPrice && promoPrice <= regularPrice) {
713
- return promo;
714
- }
715
- if (!!discount && discountPrice <= promoPrice && discountPrice <= regularPrice) {
716
- return discount;
717
- }
718
- return regular;
719
- };
720
- exports.getLowestAppliedPrice = getLowestAppliedPrice;
721
- /**
722
- * Checks if the specific item price contains an "escompte"
723
- * @param {ICartItemCustomPrices} price The price to check, Either the discount_price of promo_price of a cart item.
724
- * @returns
725
- */
726
- const checkPriceForEscompte = (price) => {
727
- const priceType = price.price_type;
728
- const posUnitPrice = `pos_custom_${Cart_1.CustomPromoType.UNIT_PRICE}`;
729
- const isEscompteType = !!priceType &&
730
- !!![
731
- G2_1.CustomPriceItemTypeEnum.ENTENTE,
732
- G2_1.CustomPriceItemTypeEnum.REG,
733
- posUnitPrice,
734
- products_3.priceTypeEnum.TIER_PRICING
735
- ].includes(priceType);
736
- return !!isEscompteType;
737
- };
738
- exports.checkPriceForEscompte = checkPriceForEscompte;
739
- /**
740
- * Calculates the percent applied from a discount on a cart item. If promo_price set, checks promo_price, else checks discount_price.
741
- * @param {ICartItem} item
742
- * @param {boolean} isPro
743
- * @returns
744
- */
745
- const getPercentFromReducedPrice = (item, isPro) => {
746
- const typeToCheck = !!item.promo_price && !!item.promo_price.price_type ? 'promo' : 'discount';
747
- const priceToCheck = typeToCheck === 'promo' ? item.promo_price : item.discount_price;
748
- if (!!!priceToCheck || (!!!isPro && !!!priceToCheck.overridden))
749
- return;
750
- if (!!!(0, exports.checkPriceForEscompte)(priceToCheck))
751
- return;
752
- if (typeToCheck === 'promo')
753
- return (0, round_1.default)((0, cart_2.getActualPromoPrice)(item, products_3.unitTypeEnum.PERCENT), 2);
754
- return (0, round_1.default)((0, cart_2.getActualDiscountPrice)(item, products_3.unitTypeEnum.PERCENT), 2);
755
- };
756
- exports.getPercentFromReducedPrice = getPercentFromReducedPrice;
757
- // #endregion
758
- // -----------------------------------------------------------------------------------------
759
- // #region PDF AND LAYOUT FUNCTIONS
760
- /**
761
- * Returns the customer's Client Number to show in order slip and invoice.
762
- * @param cartData
763
- * @param space - Must be defined to check if grass promise to purchase bank was applied to cart
764
- * @param options.isQuote - Optionnal. If current cart is a quote cart
765
- * @param options.checkIfEscPaApplied - Optionnal. If true, will only add PA suffix if some reduce PA price or item is found in cart
766
- */
767
- const getClientNumberForCart = (cartData, space, options = {}) => {
768
- if (!!!cartData)
769
- return '';
770
- const proTitle = (0, object_1.recursiveCheckObject)(cartData, 'customer_info.pro_title');
771
- const isWebCart = cartData.cart_type === Cart_1.CartTypeEnum.WEB || !!cartData.is_from_web;
772
- // If checkIfEscPaApplied option is passed to function, will only set cart as isPA if at least one esc. supp item is found
773
- const paFoundInCart = (0, object_1.recursiveCheckObject)(cartData, 'promise_to_purchase');
774
- let isPA = !!((0, object_1.recursiveCheckObject)(paFoundInCart, 'ids') || []).length;
775
- if (!!paFoundInCart && !!options.checkIfEscPaApplied) {
776
- const bankTypes = !!space ? space.bankTypes.get() : [];
777
- const grassBank = bankTypes.find((b) => (0, locale_1.getLocaleOfDictionnary)(b.name, 'fr').toLowerCase() == 'gazon');
778
- const atLeastOneEscPaApplied = cartData.items.some((i) => (0, g2_1.isEscompteSuppItem)(i.sku)) ||
779
- (!!grassBank &&
780
- (paFoundInCart.banks_used || []).some((b) => b.bank_type_id == grassBank.id) &&
781
- cartData.items.some((i) => i.sku == products_2.kentucky || i.parent_slug == 'kentucky'));
782
- isPA = atLeastOneEscPaApplied;
783
- }
784
- // a. If pro customer, return pro ID + PA if promise banks applied
785
- if (!!proTitle && !!cartData.customer_id) {
786
- return `${cartData.customer_id}${!!isPA ? 'PA' : ''}`;
787
- }
788
- // b. If cart from Web, construct code from expedition type, current date and WEB string
789
- if (!!isWebCart) {
790
- return `${!!cartData.is_pickup ? 'COM' : 'LIV'}${!!cartData.paid_at ? (0, moment_1.default)((0, data_1.formatDate)(cartData.paid_at)).format('YY') : '00'}WEB`;
791
- }
792
- // c. If PDF made for an order quote (soumission), simply show customer type if no customer id set
793
- if (!!options.isQuote) {
794
- return proTitle === 'anonymous-pos-pro' ? 'Paysagiste' : 'Détail';
795
- }
796
- // d. Construct POS specific code from expedition type, assigned store, current date and customer type
797
- return _getPOSCustomerTypeForCart(cartData);
798
- };
799
- exports.getClientNumberForCart = getClientNumberForCart;
800
- const _getPOSCustomerTypeForCart = (cartData) => {
801
- const isPickup = !!cartData && !!cartData.is_pickup;
802
- const isPro = !!cartData.customer_info && !!cartData.customer_info.pro_title;
803
- const currentYear = !!cartData.paid_at ? (0, moment_1.default)((0, data_1.formatDate)(cartData.paid_at)).format('YY') : '00';
804
- const storeNb = !!cartData.created_by && !!cartData.created_by.at_store_number ? cartData.created_by.at_store_number : 0;
805
- // Check if store number is a number
806
- const aNumber = (0, toNumber_1.default)(storeNb);
807
- let endOfCode = '';
808
- if (!!!aNumber) {
809
- endOfCode = `${!!isPro ? '3' : ''}${storeNb}`;
810
- }
811
- else {
812
- endOfCode = `${!!isPro ? '3' : aNumber < 10 ? '0' : ''}${aNumber}`;
813
- }
814
- return `${!!isPickup ? 'COM' : 'LIV'}${currentYear}${endOfCode}`;
815
- };
816
- const getLabelForCartType = (value) => {
817
- switch (value) {
818
- case cart_1.CartGeneralTypeEnum.RETURN_PALLETS:
819
- return 'Retour palettes';
820
- case cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES:
821
- return 'Accessoires seulement';
822
- case cart_1.CartGeneralTypeEnum.BETON:
823
- return 'Béton';
824
- case cart_1.CartGeneralTypeEnum.SAMPLE:
825
- return 'Échantillons';
826
- case cart_1.CartGeneralTypeEnum.GRASS:
827
- return 'Gazon';
828
- case cart_1.CartGeneralTypeEnum.INSTALLATION:
829
- return 'Installation';
830
- case cart_1.CartGeneralTypeEnum.VRAC:
831
- return 'Vrac';
832
- case Cart_1.CartContentTypeEnum.MIXED:
833
- return 'Mixte';
834
- default:
835
- return value;
836
- }
837
- };
838
- exports.getLabelForCartType = getLabelForCartType;
839
- // #endregion
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.getLabelForCartType = exports.getClientNumberForCart = exports.getPercentFromReducedPrice = exports.checkPriceForEscompte = exports.getLowestAppliedPrice = exports.getAppliedPrice = exports.getRecursiveItemsFromSubItems = exports.getRecursiveItems = exports.getGrassProductForCart = exports.getConcreteCartInfo = exports.orderCartItems = exports.getProTitleFromCart = exports.isPro = exports.getCartType = exports.checkCartTypeBeforeAddingItem = exports.checkIfDecliIsOkForMixedSale = exports.checkIfItemCanBeAddedToCart = exports.checkIfCartContainsType = exports.applyInstallationToutInclusToVerifiedItems = exports.handleAddGrassItemsCart = void 0;
18
+ const orderBy_1 = __importDefault(require("lodash/orderBy"));
19
+ const flatten_1 = __importDefault(require("lodash/flatten"));
20
+ const uniqBy_1 = __importDefault(require("lodash/uniqBy"));
21
+ const toNumber_1 = __importDefault(require("lodash/toNumber"));
22
+ const round_1 = __importDefault(require("lodash/round"));
23
+ const moment_1 = __importDefault(require("moment"));
24
+ // Rule specific interfaces
25
+ const cart_1 = require("../interfaces/cart");
26
+ // Rule specific functions/constants
27
+ const products_1 = require("./products");
28
+ const upsells_1 = require("./upsells");
29
+ const expedition_1 = require("./expedition");
30
+ const products_2 = require("../constants/products");
31
+ const Cart_1 = require("../../../Interfaces/Cart");
32
+ const G2_1 = require("../../../Interfaces/G2");
33
+ const locale_1 = require("../../../utils/locale");
34
+ const inventories_1 = require("../../../utils/inventories");
35
+ const products_3 = require("../../../utils/products");
36
+ const data_1 = require("../../../utils/data");
37
+ const data_2 = require("../interfaces/data");
38
+ const g2_1 = require("./g2");
39
+ const object_1 = require("../../../utils/object");
40
+ const cart_2 = require("../../../utils/cart");
41
+ const handleAddGrassItemsCart = async (cart, chosenDeclination, parentProduct, isUpdating, isRecommendedUpsell, formValues, fetchProduct, kentuckyBaseGrass, locale = 'fr', isPro, customPriceList, recommendedUpsellParentSlug) => {
42
+ var _a, _b;
43
+ if (!!!chosenDeclination || !!!parentProduct)
44
+ return {
45
+ error: ''
46
+ };
47
+ let itemsToAdd = [];
48
+ let itemsToUpdate = [];
49
+ let itemsToDelete = [];
50
+ let newShippingPayload = cart.shipping_payload;
51
+ const prodUpsell = parentProduct.product_upsells;
52
+ const onlySamplesInCart = !!cart.items.length && cart.items.every((item) => !!item.is_sample);
53
+ if (!!onlySamplesInCart) {
54
+ return {
55
+ error: (0, locale_1.translateILang)({
56
+ fr: "Pour ajouter ce produit à votre panier vous devez d'abord compléter la commande en cours ou vider votre panier",
57
+ en: 'To add this product to your cart, you must first complete your current order or empty your cart'
58
+ }, locale)
59
+ };
60
+ }
61
+ if (!!isPro && !!customPriceList) {
62
+ chosenDeclination = (0, g2_1.checkForCustomPriceEquivalent)(chosenDeclination, customPriceList, {
63
+ removeTierPricing: chosenDeclination.sku == products_2.kentucky || chosenDeclination.parent_slug === 'kentucky'
64
+ });
65
+ }
66
+ // --------------------------------------------------------------------------------
67
+ // Ajout gazon aux items
68
+ if (isUpdating && !!cart.items.find((i) => i.sku === chosenDeclination.sku)) {
69
+ itemsToUpdate.push({
70
+ sku: chosenDeclination.sku,
71
+ qte: formValues.qte || 0
72
+ });
73
+ }
74
+ else {
75
+ itemsToAdd.push(Object.assign(Object.assign({}, chosenDeclination), { qte: formValues.qte || 0, parent_slug: !!isRecommendedUpsell && recommendedUpsellParentSlug ? recommendedUpsellParentSlug : parentProduct.slug, product_upsells: parentProduct.product_upsells, categories: parentProduct.categories }));
76
+ }
77
+ if (!!!isRecommendedUpsell) {
78
+ let baseGrass = parentProduct;
79
+ // --------------------------------------------------------------------------------
80
+ // If gazon de spécialité, il aura en upsell le gazon de base (Kentucky)...
81
+ // (parent_slug: kentucky, sku (declinaison): 010010000) // NOTE - Sku peut varier!!
82
+ if (!!prodUpsell &&
83
+ !!prodUpsell.find((anUpsell) => anUpsell.recommendation_sku === products_2.kentucky || anUpsell.recommendation_parent_slug == 'kentucky')) {
84
+ const baseGrassProd = kentuckyBaseGrass;
85
+ if (!!baseGrassProd)
86
+ baseGrass = baseGrassProd;
87
+ }
88
+ // --------------------------------------------------------------------------------
89
+ // Check if grass has any other auto_add upsells to add
90
+ if (!!prodUpsell) {
91
+ for (let anUpsell of prodUpsell) {
92
+ if (!!!anUpsell.auto_add)
93
+ continue;
94
+ const sameProduct = await fetchProduct(anUpsell.recommendation_parent_slug, locale, undefined, true);
95
+ if (!!!sameProduct || !!!sameProduct.declinations)
96
+ continue;
97
+ let sameDecli = (sameProduct.declinations || []).find((decli) => decli.sku === anUpsell.recommendation_sku);
98
+ if (!!!sameDecli)
99
+ continue;
100
+ if (!!isPro && !!customPriceList) {
101
+ sameDecli = (0, g2_1.checkForCustomPriceEquivalent)(sameDecli, customPriceList, {
102
+ removeTierPricing: sameDecli.sku == 'kentucky' || sameDecli.parent_slug === 'kentucky'
103
+ });
104
+ }
105
+ const anUpsellProduct = Object.assign(Object.assign(Object.assign(Object.assign({}, sameDecli), { parent_slug: anUpsell.recommendation_parent_slug, recommended_qte: anUpsell.recommendation_qty, recommended_sku: anUpsell.recommendation_sku, matching_qte: !!anUpsell.matching_qty, auto_add: anUpsell.auto_add, actual_qte: anUpsell.actual_qty }), (!!anUpsell.is_recommendation ? { is_recommendation: true } : {})), (!!anUpsell.show_recommendation_msg ? { show_recommendation_msg: true } : {}));
106
+ const ratio = (0, upsells_1.calculateUpsellQte)(anUpsellProduct, formValues.qte || 0);
107
+ if (!!ratio) {
108
+ if (isUpdating && !!cart.items.find((i) => i.sku === anUpsellProduct.sku)) {
109
+ itemsToUpdate.push({
110
+ sku: anUpsellProduct.sku,
111
+ qte: ratio
112
+ });
113
+ }
114
+ else {
115
+ itemsToAdd.push(Object.assign(Object.assign({}, sameDecli), { qte: ratio, is_upsell_of_sku: chosenDeclination.sku, parent_slug: sameProduct.slug, product_upsells: sameProduct.product_upsells, categories: sameProduct.categories }));
116
+ }
117
+ }
118
+ }
119
+ }
120
+ // --------------------------------------------------------------------------------
121
+ // If installation...
122
+ const currentInstallItem = cart.items.find((i) => i.parent_slug === 'installation-gazon');
123
+ if (!!formValues.installation) {
124
+ const upsell = baseGrass.product_upsells;
125
+ if (!!upsell) {
126
+ const allInstallFees = await (0, products_1.getInstallationArray)(Number(formValues.qte), upsell, fetchProduct, locale, isPro, chosenDeclination.sku, customPriceList, {
127
+ engrais: !!formValues.engrais,
128
+ roulage: !!formValues.roulage
129
+ });
130
+ const installationDecli = allInstallFees.find((fee) => fee.parent_slug === 'installation-gazon');
131
+ const installIsDifferent = !!currentInstallItem && !!installationDecli && currentInstallItem.sku !== installationDecli.sku;
132
+ for (let fee of allInstallFees) {
133
+ if (isUpdating && !!cart.items.find((i) => i.sku === fee.sku) && !!!installIsDifferent) {
134
+ itemsToUpdate.push({
135
+ sku: fee.sku,
136
+ qte: fee.qte
137
+ });
138
+ }
139
+ else {
140
+ itemsToAdd.push(fee);
141
+ }
142
+ }
143
+ const minQteInstall = (0, expedition_1.getMinQteInstall)(!!isPro);
144
+ // ================================================================================
145
+ // Check to delete existing items if necessary
146
+ // --------------------------------------------------------------------------------
147
+ // If min qty install...
148
+ if (typeof formValues.qte === 'number' && formValues.qte >= minQteInstall) {
149
+ const minInstall = cart.items.find((item) => item.parent_slug === 'frais-minimum-gazon-pour-installation');
150
+ if (!!minInstall) {
151
+ itemsToDelete.push(minInstall.sku);
152
+ }
153
+ }
154
+ // --------------------------------------------------------------------------------
155
+ // If engrais...
156
+ const fertilisationItem = cart.items.find((i) => i.parent_slug === 'installation-fertilisation');
157
+ if (isUpdating && !!!formValues.engrais && !!fertilisationItem) {
158
+ itemsToDelete.push(fertilisationItem.sku);
159
+ }
160
+ // --------------------------------------------------------------------------------
161
+ // If roulage...
162
+ const roulageItem = cart.items.find((i) => i.parent_slug === 'installation-roulage');
163
+ if (isUpdating && !!!formValues.roulage && !!roulageItem) {
164
+ itemsToDelete.push(roulageItem.sku);
165
+ }
166
+ // --------------------------------------------------------------------------------
167
+ // If cart already has installation item...
168
+ // --> Utile pour la modification des items du cart, vu que la props is_upsell_of_sku ne peut pas se modifier on update
169
+ const otherInstall = !!installIsDifferent ? currentInstallItem : undefined;
170
+ if (!!otherInstall) {
171
+ itemsToDelete.push(otherInstall.sku);
172
+ itemsToDelete = [
173
+ ...itemsToDelete,
174
+ ...cart.items.filter((i) => i.is_upsell_of_sku === otherInstall.sku).map((i) => i.sku)
175
+ ];
176
+ }
177
+ // ==================================================================================
178
+ // If isPro, check for corresponding pro extra installation fees
179
+ if (!!isPro) {
180
+ newShippingPayload = Object.assign(Object.assign({}, newShippingPayload), { pro_installation_info: formValues.pro });
181
+ const feeProduct = await fetchProduct('frais_extra_pro_installation', locale, undefined, true);
182
+ const handleProSpec = (sku, isSelected) => {
183
+ if (!!!feeProduct || !!!installationDecli)
184
+ return;
185
+ const itemIsInCart = !!cart.items.find((i) => i.sku === sku);
186
+ if (isSelected) {
187
+ let decli = feeProduct.declinations.find((d) => d.sku === sku);
188
+ if (!!decli) {
189
+ if (!!customPriceList) {
190
+ decli = (0, g2_1.checkForCustomPriceEquivalent)(decli, customPriceList);
191
+ }
192
+ if (isUpdating && itemIsInCart && !!!otherInstall) {
193
+ itemsToUpdate.push({
194
+ sku: sku,
195
+ qte: typeof formValues.qte === 'number' && formValues.qte < minQteInstall
196
+ ? minQteInstall
197
+ : formValues.qte || 0
198
+ });
199
+ }
200
+ else {
201
+ if (!!otherInstall) {
202
+ itemsToDelete.push(decli.sku);
203
+ }
204
+ itemsToAdd.push(Object.assign(Object.assign({}, decli), { qte: typeof formValues.qte === 'number' && formValues.qte < minQteInstall
205
+ ? minQteInstall
206
+ : formValues.qte || 0, is_upsell_of_sku: installationDecli.sku, parent_slug: 'frais_extra_pro_installation' }));
207
+ }
208
+ }
209
+ }
210
+ else {
211
+ if (itemIsInCart) {
212
+ itemsToDelete.push(sku);
213
+ }
214
+ }
215
+ };
216
+ if (!!formValues.pro && !!formValues.pro.specs) {
217
+ Object.entries(formValues.pro.specs).forEach((spec) => {
218
+ handleProSpec(products_2.installationProSpecSkus[spec[0]], spec[1]);
219
+ });
220
+ }
221
+ }
222
+ }
223
+ }
224
+ else {
225
+ if (!!isUpdating && !formValues.installation) {
226
+ if (!!newShippingPayload && !!newShippingPayload.pro_installation_info) {
227
+ const { pro_installation_info } = newShippingPayload, rest = __rest(newShippingPayload, ["pro_installation_info"]);
228
+ newShippingPayload = Object.assign({}, rest);
229
+ }
230
+ itemsToDelete = [...itemsToDelete, ...(0, products_1.getAllInstallFromItems)(cart.items).map((i) => i.sku)];
231
+ // Restore price of kentucky when overriden by all-inclusive installation
232
+ if (!!isPro && !!(0, products_1.getInstallationAllInclusiveFromPriceList)(customPriceList)) {
233
+ const kentuckyIdx = cart.items.findIndex((i) => !!i.price_override && (i.sku === products_2.kentucky || i.parent_slug == 'kentucky'));
234
+ if (kentuckyIdx !== -1) {
235
+ const kentuckyItem = cart.items[kentuckyIdx];
236
+ itemsToUpdate = itemsToUpdate.filter((u) => u.sku !== kentuckyItem.sku);
237
+ const originalDecli = ((_a = kentuckyBaseGrass === null || kentuckyBaseGrass === void 0 ? void 0 : kentuckyBaseGrass.declinations) === null || _a === void 0 ? void 0 : _a.find((d) => d.sku === kentuckyItem.sku)) ||
238
+ ((_b = parentProduct.declinations) === null || _b === void 0 ? void 0 : _b.find((d) => d.sku === kentuckyItem.sku));
239
+ if (!!originalDecli) {
240
+ const restoredDecli = !!customPriceList
241
+ ? (0, g2_1.checkForCustomPriceEquivalent)(originalDecli, customPriceList, {
242
+ removeTierPricing: true
243
+ })
244
+ : originalDecli;
245
+ cart.items[kentuckyIdx] = Object.assign(Object.assign(Object.assign({}, kentuckyItem), restoredDecli), { qte: kentuckyItem.qte, price_override: false });
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ itemsToAdd = (0, upsells_1.removeExceptionAutoAddUpsells)(itemsToAdd);
253
+ if (!!isUpdating) {
254
+ if (!!cart.items) {
255
+ const fusion = [
256
+ ...cart.items.filter((i) => itemsToUpdate.some((update) => i.sku === update.sku) || i.is_upsell_of_sku === 'summary'),
257
+ ...itemsToAdd
258
+ ];
259
+ let productsToRemove = fusion.filter((item) => {
260
+ const removedBecauseException = !!!(0, upsells_1.removeExceptionAutoAddUpsells)(fusion).some((i) => i.sku === item.sku);
261
+ return item.is_upsell_of_sku === 'summary' || !!removedBecauseException;
262
+ });
263
+ itemsToAdd = itemsToAdd.filter((i) => !!!productsToRemove.map((r) => r.sku).includes(i.sku));
264
+ if (!!productsToRemove.length) {
265
+ itemsToDelete = [...itemsToDelete, ...productsToRemove.map((item) => item.sku)];
266
+ if (newShippingPayload) {
267
+ const { pro_installation_info } = newShippingPayload;
268
+ newShippingPayload = Object.assign(Object.assign({}, newShippingPayload), (!!pro_installation_info ? { pro_installation_info } : {}));
269
+ }
270
+ }
271
+ }
272
+ }
273
+ // When installation all-inclusive, force kentucky and frais de livraison to 0$
274
+ if ((0, products_1.isInstallAllInclusiveActive)(!!formValues.installation, isPro, customPriceList)) {
275
+ itemsToAdd = itemsToAdd.map((item) => (0, products_1.applyAllInclusiveOverrides)(item));
276
+ // Also override existing Kentucky items that are in the cart but not yet at $0
277
+ if (!!isUpdating) {
278
+ const kentuckyIdx = cart.items.findIndex((i) => !i.price_override && i.sku === products_2.kentucky);
279
+ if (kentuckyIdx !== -1) {
280
+ const kentuckyItemToOverride = cart.items[kentuckyIdx];
281
+ itemsToUpdate = itemsToUpdate.filter((u) => u.sku !== kentuckyItemToOverride.sku);
282
+ cart.items[kentuckyIdx] = (0, products_1.applyAllInclusiveOverrides)(kentuckyItemToOverride);
283
+ }
284
+ }
285
+ }
286
+ return {
287
+ itemsToAdd,
288
+ itemsToUpdate,
289
+ itemsToDelete,
290
+ newShippingPayload
291
+ };
292
+ };
293
+ exports.handleAddGrassItemsCart = handleAddGrassItemsCart;
294
+ /**
295
+ * Replaces ventilated installation with installation tout inclus and applies Kentucky overrides.
296
+ * Used during cart verification when a pro customer has installation tout inclus but cart has ventilated installation.
297
+ */
298
+ const applyInstallationToutInclusToVerifiedItems = (verifiedItems, customPriceList, isPro, installationParent) => {
299
+ var _a;
300
+ const currentInstall = verifiedItems.find((i) => i.parent_slug === 'installation-gazon');
301
+ if (!currentInstall || currentInstall.sku === products_2.installationAllInclusiveSku)
302
+ return verifiedItems;
303
+ const allInclusivePriceItem = (0, products_1.getInstallationAllInclusiveFromPriceList)(customPriceList);
304
+ if (!allInclusivePriceItem || !isPro)
305
+ return verifiedItems;
306
+ if (!installationParent || !installationParent.declinations)
307
+ return verifiedItems;
308
+ const allInclusiveDecli = installationParent.declinations.find((d) => d.sku === products_2.installationAllInclusiveSku);
309
+ if (!!!allInclusiveDecli)
310
+ return verifiedItems;
311
+ const priceAmount = (_a = allInclusivePriceItem.price) !== null && _a !== void 0 ? _a : allInclusivePriceItem.reg;
312
+ const grassItem = verifiedItems.find((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon') && !!!i.is_sample);
313
+ const chosenSku = !!grassItem ? grassItem.sku : currentInstall.is_upsell_of_sku || '';
314
+ const newInstallItem = Object.assign(Object.assign({}, allInclusiveDecli), { regular_price: Object.assign(Object.assign({}, allInclusiveDecli.regular_price), { amount: priceAmount }), parent_slug: 'installation-gazon', qte: currentInstall.qte, is_upsell_of_sku: chosenSku, product_upsells: installationParent.product_upsells, categories: installationParent.categories });
315
+ const installSkusToRemove = (0, products_1.getAllInstallFromItems)(verifiedItems).map((i) => i.sku);
316
+ let result = verifiedItems.filter((i) => !installSkusToRemove.includes(i.sku));
317
+ result = [...result, newInstallItem];
318
+ result = result.map((item) => (0, products_1.applyAllInclusiveOverrides)(item));
319
+ return result;
320
+ };
321
+ exports.applyInstallationToutInclusToVerifiedItems = applyInstallationToutInclusToVerifiedItems;
322
+ // -----------------------------------------------------------------------------------------
323
+ // #region CART SPECIFIC VERIFICATIONS AND DATA
324
+ const checkIfCartContainsType = (type, cartData, excludeUndefinedForAccessories = true, excludeUndefinedForBeton = true) => {
325
+ switch (type) {
326
+ case cart_1.CartGeneralTypeEnum.RETURN_PALLETS:
327
+ return !!cartData.shipping_payload && !!cartData.shipping_payload.pallet_return_memo_ref;
328
+ case cart_1.CartGeneralTypeEnum.GRASS:
329
+ return !!cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon') && !!!i.is_sample);
330
+ case cart_1.CartGeneralTypeEnum.VRAC:
331
+ return !!cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'vrac'));
332
+ case cart_1.CartGeneralTypeEnum.INSTALLATION:
333
+ return !!cartData.items.some((i) => i.parent_slug === 'installation-gazon');
334
+ case cart_1.CartGeneralTypeEnum.SAMPLE:
335
+ return !!cartData.items.some((i) => !!i.is_sample);
336
+ case cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES:
337
+ return (!!cartData.items &&
338
+ !!cartData.items.length &&
339
+ cartData.items
340
+ .filter((i) => !!!i.is_service)
341
+ .every((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'accessoire', excludeUndefinedForAccessories)));
342
+ case cart_1.CartGeneralTypeEnum.BETON:
343
+ return (!!cartData.items &&
344
+ !!cartData.items.length &&
345
+ cartData.items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'beton', excludeUndefinedForBeton) && !!!i.is_sample));
346
+ default:
347
+ return false;
348
+ }
349
+ };
350
+ exports.checkIfCartContainsType = checkIfCartContainsType;
351
+ const checkIfItemCanBeAddedToCart = (prod, parentProdType, cartData, addToCart = false, declination = undefined, useParent = false, autoAdd = false) => {
352
+ // -----------------------------------------------------------------------------------------------
353
+ // If... product can not be added to cart, show error and return false.
354
+ const addItToCart = !!autoAdd ? true : (0, exports.checkCartTypeBeforeAddingItem)(prod, declination, cartData);
355
+ if (!!!addItToCart) {
356
+ return {
357
+ addToCart: false,
358
+ error: {
359
+ fr: "Pour ajouter ce type de produit à votre panier vous devez d'abord compléter la commande en cours ou vider votre panier.",
360
+ en: 'To add this type of product to your cart, you must first complete the current order or empty your cart.'
361
+ }
362
+ };
363
+ }
364
+ // -----------------------------------------------------------------------------------------------
365
+ // Set parentProduct type variable depending on product category
366
+ let prodDeclination = declination; // If prodDeclination is set, means customer chose spécific sku and is trying to add to cart.
367
+ if (!!!useParent) {
368
+ switch (parentProdType) {
369
+ case 'gazon':
370
+ prodDeclination =
371
+ prodDeclination || prod.declinations.find((declination) => !!!declination.is_sample);
372
+ break;
373
+ case 'beton':
374
+ break;
375
+ case 'other':
376
+ case 'vrac':
377
+ if (!!!prod.declinations.find((decli) => !!decli.other_units)) {
378
+ prodDeclination =
379
+ prodDeclination || prod.declinations.find((declination) => !!!declination.is_sample);
380
+ }
381
+ }
382
+ }
383
+ const decliIsSample = !!prodDeclination && !!prodDeclination.is_sample;
384
+ // --------------------------------------------------------------------------------------------------
385
+ // If... prodDeclination is sample, check if max qte (4) is met or sample already in cart before.
386
+ // If so, show error and return false.
387
+ // Else if... product is of any type other than grass, set addToCart to true.
388
+ if (!!decliIsSample) {
389
+ if (!!cartData && !!cartData.items.length) {
390
+ switch (true) {
391
+ case cartData.items.length === 4:
392
+ return {
393
+ addToCart: false,
394
+ error: {
395
+ fr: 'Un maximum de quatre échantillons est permis à la fois par commande.',
396
+ en: 'A maximum of four samples can be added to your cart.'
397
+ }
398
+ };
399
+ case !!cartData.items.find((item) => !!prodDeclination && item.sku === prodDeclination.sku):
400
+ return {
401
+ addToCart: false,
402
+ error: {
403
+ fr: 'Vous avez déjà cet échantillon au panier.',
404
+ en: 'This sample is already in your cart.'
405
+ }
406
+ };
407
+ default:
408
+ addToCart = true;
409
+ }
410
+ }
411
+ else {
412
+ addToCart = true;
413
+ }
414
+ }
415
+ else if (!!prodDeclination && !!!(0, products_1.checkIfProductIsOfType)(prod, 'gazon')) {
416
+ addToCart = true;
417
+ }
418
+ return {
419
+ addToCart: addToCart,
420
+ declinationChecked: prodDeclination,
421
+ showForm: true
422
+ };
423
+ };
424
+ exports.checkIfItemCanBeAddedToCart = checkIfItemCanBeAddedToCart;
425
+ const checkIfDecliIsOkForMixedSale = (decli, typeToCheck) => {
426
+ return (decli.attributes &&
427
+ !!decli.attributes[data_2.AttributesIdEnumGR.VENTE_MIXTE] &&
428
+ !!decli.attributes[data_2.AttributesIdEnumGR.VENTE_MIXTE].includes(typeToCheck));
429
+ };
430
+ exports.checkIfDecliIsOkForMixedSale = checkIfDecliIsOkForMixedSale;
431
+ const checkCartTypeBeforeAddingItem = (prod, declination, cartData, forceCartType) => {
432
+ if (!!!cartData || !!!cartData.items || !!!cartData.items.length) {
433
+ if (!!!forceCartType)
434
+ return true;
435
+ }
436
+ const cartType = !!forceCartType ? forceCartType : !!cartData ? (0, exports.getCartType)(cartData) : '';
437
+ if (!!!cartType)
438
+ return true;
439
+ const items = !!cartData ? cartData.items : [];
440
+ // Can't add items to cart if ...
441
+ // -----------------------------------------
442
+ // ... cart is of type booking
443
+ if (!!cartData && !!cartData.is_booking)
444
+ return false;
445
+ // --------------------------------------------------------------------------------------------------
446
+ // ... if new item is NOT a sample or does NOT contain samples in declinations && cart already contains samples
447
+ if ((!!!prod.declinations.find((decli) => !!decli.is_sample) || (!!declination && !declination.is_sample)) &&
448
+ cartType === cart_1.CartGeneralTypeEnum.SAMPLE) {
449
+ return false;
450
+ }
451
+ // --------------------------------------------------------------------------------------------------
452
+ // ... if new item is a sample && cart has items that are NOT samples
453
+ if (!!declination && !!declination.is_sample && cartType !== cart_1.CartGeneralTypeEnum.SAMPLE) {
454
+ return false;
455
+ }
456
+ // ----------------------------------------------------------
457
+ // ... new item is of type grass and cart already contains grass or items that cannot be sold with grass
458
+ if (!!(0, products_1.checkIfProductIsOfType)(prod, 'gazon') && cartType !== cart_1.CartGeneralTypeEnum.SAMPLE) {
459
+ if (!!items.some((i) => !!(0, products_1.checkIfProductIsOfType)(i, 'gazon')))
460
+ return false;
461
+ if (!!items.some((i) => !!!(0, exports.checkIfDecliIsOkForMixedSale)(i, 'gazon')))
462
+ return false;
463
+ }
464
+ // --------------------------------------------------------------------------------------------------
465
+ // ... if cart already has a grass product
466
+ let currentCartUpsells = [];
467
+ try {
468
+ currentCartUpsells = (0, uniqBy_1.default)((0, flatten_1.default)(items.map((i) => i.product_upsells || [])), (i) => !!i.recommendation_sku ? i.recommendation_sku : i.recommendation_parent_slug);
469
+ }
470
+ catch (e) {
471
+ if (!!process.env.IS_TEST_ENV)
472
+ console.log('error on fetching cart upsells: ', e.toString());
473
+ }
474
+ if (cartType === cart_1.CartGeneralTypeEnum.GRASS) {
475
+ if (!!!prod.declinations.some((decli) => (0, exports.checkIfDecliIsOkForMixedSale)(decli, 'gazon')) ||
476
+ (!!declination && !!!(0, exports.checkIfDecliIsOkForMixedSale)(declination, 'gazon'))) {
477
+ if (!!!currentCartUpsells.length ||
478
+ (!!currentCartUpsells.length &&
479
+ (!!!prod.declinations.find((decli) => !!currentCartUpsells.find((item) => (!!item.use_parent &&
480
+ item.recommendation_parent_slug &&
481
+ item.recommendation_parent_slug === prod.slug) ||
482
+ item.recommendation_sku === decli.sku)) ||
483
+ (!!declination &&
484
+ !!!currentCartUpsells.find((item) => item.recommendation_sku === declination.sku ||
485
+ (!!item.use_parent &&
486
+ item.recommendation_parent_slug &&
487
+ item.recommendation_parent_slug === prod.slug)))))) {
488
+ return false;
489
+ }
490
+ }
491
+ else {
492
+ }
493
+ }
494
+ // --------------------------------------------------------------------------------------------------
495
+ // ... if new item is of type vrac and cart contains anything else
496
+ if (cartType !== cart_1.CartGeneralTypeEnum.VRAC &&
497
+ (prod.declinations.every((decli) => !!(0, products_1.checkIfProductIsOfType)(decli, 'vrac')) ||
498
+ (!!declination && !!(0, products_1.checkIfProductIsOfType)(declination, 'vrac'))) &&
499
+ items.some((i) => !!!(0, exports.checkIfDecliIsOkForMixedSale)(i, 'vrac'))) {
500
+ return false;
501
+ }
502
+ // --------------------------------------------------------------------------------------------------
503
+ // ... if new item is of any other type than vrac and cart contains vrac
504
+ if (cartType === cart_1.CartGeneralTypeEnum.VRAC &&
505
+ (!!!prod.declinations.some((decli) => !!(0, products_1.checkIfProductIsOfType)(decli, 'vrac') || !!(0, exports.checkIfDecliIsOkForMixedSale)(decli, 'vrac')) ||
506
+ (!!declination &&
507
+ !!!(0, products_1.checkIfProductIsOfType)(declination, 'vrac', true) &&
508
+ !!!(0, exports.checkIfDecliIsOkForMixedSale)(declination, 'vrac')))) {
509
+ return false;
510
+ }
511
+ return true;
512
+ };
513
+ exports.checkCartTypeBeforeAddingItem = checkCartTypeBeforeAddingItem;
514
+ const getCartType = (cartData, prioritizeInstallation) => {
515
+ if (!!prioritizeInstallation && (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.INSTALLATION, cartData)) {
516
+ return cart_1.CartGeneralTypeEnum.INSTALLATION;
517
+ }
518
+ switch (true) {
519
+ case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.RETURN_PALLETS, cartData):
520
+ return cart_1.CartGeneralTypeEnum.RETURN_PALLETS;
521
+ case !!cartData.is_booking:
522
+ return !!cartData.is_booking_beton ? cart_1.CartGeneralTypeEnum.BOOKING_BETON : cart_1.CartGeneralTypeEnum.BOOKING;
523
+ case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.SAMPLE, cartData):
524
+ return cart_1.CartGeneralTypeEnum.SAMPLE;
525
+ case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.VRAC, cartData):
526
+ return cart_1.CartGeneralTypeEnum.VRAC;
527
+ case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.GRASS, cartData):
528
+ return cart_1.CartGeneralTypeEnum.GRASS;
529
+ case (0, exports.checkIfCartContainsType)(cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES, cartData):
530
+ return cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES;
531
+ default:
532
+ return cart_1.CartGeneralTypeEnum.BETON;
533
+ }
534
+ };
535
+ exports.getCartType = getCartType;
536
+ /**
537
+ * Finds out if a cart is for a pro customer or not
538
+ * @param {ICart} invoice The cart to test
539
+ * @return Returns true if the cart is pro, false if not
540
+ */
541
+ const isPro = (invoice) => {
542
+ return !!(0, exports.getProTitleFromCart)(invoice);
543
+ };
544
+ exports.isPro = isPro;
545
+ const getProTitleFromCart = (invoice) => {
546
+ return (0, object_1.recursiveCheckObject)(invoice, 'customer_info.pro_title');
547
+ };
548
+ exports.getProTitleFromCart = getProTitleFromCart;
549
+ const orderCartItems = (cart) => {
550
+ return (0, orderBy_1.default)(!!cart.promise_to_purchase && !!cart.promise_to_purchase.ids
551
+ ? (0, g2_1.groupArrayOfItemsByItemAndCorrespondingEscompteItem)(cart.items)
552
+ : cart.items, (item) => {
553
+ const upsellRelativeItem = !!item.is_upsell_of_sku
554
+ ? cart.items.find((i) => i.sku === item.is_upsell_of_sku)
555
+ : undefined;
556
+ if (!!!item.is_service ||
557
+ ((0, g2_1.isEscompteSuppItem)(item.sku) && !!upsellRelativeItem && !!!upsellRelativeItem.is_service))
558
+ return 0;
559
+ if (item.is_service && item.sku === 'FRSBETON')
560
+ return 1;
561
+ return 2;
562
+ });
563
+ };
564
+ exports.orderCartItems = orderCartItems;
565
+ // #endregion
566
+ // -----------------------------------------------------------------------------------------
567
+ // #region FORMAT CART VALUES
568
+ const getConcreteCartInfo = async (cartData, fetchInventoryItem, pickupStoreId, inventoryItemsArray) => {
569
+ const containsYellowProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'delais-a-prevoir');
570
+ const containsGreenProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'en-stock', true);
571
+ const containsRedProduct = (0, products_1.getConcreteItemsByAvailability)(cartData, 'aucune-production-prevue');
572
+ let isInStock = true;
573
+ const storeId = !!pickupStoreId ? pickupStoreId : (0, object_1.recursiveCheckObject)(cartData, 'shipping_payload.pickup_store.id');
574
+ if (!!storeId && !!containsGreenProduct.length) {
575
+ const inventoryItems = !!inventoryItemsArray && !!inventoryItemsArray.length
576
+ ? inventoryItemsArray
577
+ : (await Promise.all(containsGreenProduct.map(async (item) => !!item.is_service ? undefined : await fetchInventoryItem(item.sku)))).filter((i) => !!i);
578
+ isInStock =
579
+ !!inventoryItems &&
580
+ !!inventoryItems.length &&
581
+ inventoryItems.every((inventoryItem) => {
582
+ const cartItem = containsGreenProduct.find((i) => i.sku === inventoryItem.sku);
583
+ if (!!!cartItem)
584
+ return false;
585
+ const inventoryStock = inventoryItem.inventories.find((i) => i.store_id === storeId);
586
+ if (!!!inventoryStock || !!!inventoryStock.qty)
587
+ return false;
588
+ const convertedQuantity = (0, inventories_1.getConvertedUnitQuantity)(inventoryItem.other_units || [], inventoryStock.qty.available || 0, 'sale_unit');
589
+ return convertedQuantity >= cartItem.qte;
590
+ });
591
+ }
592
+ return {
593
+ type: !!containsRedProduct.length ? 'red' : !!containsYellowProduct.length ? 'yellow' : 'green',
594
+ inStock: isInStock
595
+ };
596
+ };
597
+ exports.getConcreteCartInfo = getConcreteCartInfo;
598
+ /**
599
+ * Function getGrassProduct
600
+ * @description - Create the essential info needed when checking a grass type product for cart
601
+ * @param item
602
+ */
603
+ const getGrassProductForCart = (item) => {
604
+ if (!!!item)
605
+ return;
606
+ return {
607
+ slug: item.parent_slug || '',
608
+ sku: item.sku,
609
+ qte: item.qte,
610
+ price: (0, products_3.getLowestPrice)(item).price.amount
611
+ };
612
+ };
613
+ exports.getGrassProductForCart = getGrassProductForCart;
614
+ const getRecursiveItems = (cartItems, cartContainsGrass, keepFees, groupSurcharges) => {
615
+ const getRecusiveItem = (item) => {
616
+ const subItems = cartItems.filter((i) => i.is_upsell_of_sku === item.sku).map((subI) => getRecusiveItem(subI));
617
+ return Object.assign(Object.assign({}, item), { sub_items: !!subItems && !!subItems.length ? subItems : undefined });
618
+ };
619
+ const newItemList = cartItems
620
+ .map((i) => getRecusiveItem(i))
621
+ .filter((i) => (!!keepFees && !!i.is_upsell_of_sku && i.is_upsell_of_sku === 'summary') ||
622
+ (!!i.sub_items && !!!i.is_upsell_of_sku) ||
623
+ (!!!i.is_upsell_of_sku && !!!i.sub_items));
624
+ const ordered = !!!cartContainsGrass ? newItemList : (0, orderBy_1.default)(newItemList, (i) => !!i.sub_items, 'desc');
625
+ if (!!!groupSurcharges)
626
+ return ordered;
627
+ const surcharges = cartItems.filter((i) => products_2.fuelSurchargeSkus.includes(i.sku));
628
+ if (surcharges.length === 0)
629
+ return ordered;
630
+ // Retirer les surcharges pour les ré-attacher comme sub_items
631
+ const filteredOrdered = ordered.filter((i) => !products_2.fuelSurchargeSkus.includes(i.sku));
632
+ // Pour chaque surcharge, retenir le dernier item parent qui matche dans l'arbre
633
+ const surchargeParent = new Map();
634
+ const findLastParent = (item) => {
635
+ if (!(0, products_1.shouldHideItemInCheckout)(item, cartItems)) {
636
+ surcharges.forEach((s) => {
637
+ if ((0, products_1.matchesFuelSurchargeParent)(s.sku, item))
638
+ surchargeParent.set(s.sku, item);
639
+ });
640
+ }
641
+ if (!!item.sub_items && !!item.sub_items.length)
642
+ item.sub_items.forEach(findLastParent);
643
+ };
644
+ filteredOrdered.forEach(findLastParent);
645
+ const placed = new Set();
646
+ const attachSurcharges = (item) => {
647
+ const updatedSubItems = !!item.sub_items && !!item.sub_items.length ? item.sub_items.map(attachSurcharges) : item.sub_items;
648
+ if ((0, products_1.shouldHideItemInCheckout)(item, cartItems)) {
649
+ return updatedSubItems !== item.sub_items ? Object.assign(Object.assign({}, item), { sub_items: updatedSubItems }) : item;
650
+ }
651
+ const matching = surcharges.filter((s) => !placed.has(s.sku) && surchargeParent.get(s.sku) === item);
652
+ if (matching.length > 0) {
653
+ matching.forEach((m) => placed.add(m.sku));
654
+ const surchargeNodes = matching.map((s) => (Object.assign(Object.assign({}, s), { sub_items: undefined })));
655
+ return Object.assign(Object.assign({}, item), { sub_items: [...(updatedSubItems || []), ...surchargeNodes] });
656
+ }
657
+ return updatedSubItems !== item.sub_items ? Object.assign(Object.assign({}, item), { sub_items: updatedSubItems }) : item;
658
+ };
659
+ const placedItems = filteredOrdered.map(attachSurcharges);
660
+ const unplaced = surcharges.filter((s) => !!!placed.has(s.sku));
661
+ return unplaced.length === 0
662
+ ? placedItems
663
+ : [...placedItems, ...unplaced.map((s) => (Object.assign(Object.assign({}, s), { sub_items: undefined })))];
664
+ };
665
+ exports.getRecursiveItems = getRecursiveItems;
666
+ const getRecursiveItemsFromSubItems = (item) => {
667
+ const getRecusiveItem = (item) => {
668
+ const subItems = item.sub_items;
669
+ if (!!subItems) {
670
+ const items = [item, ...(0, flatten_1.default)(subItems.map((i) => getRecusiveItem(i)))];
671
+ return items;
672
+ }
673
+ return [item];
674
+ };
675
+ return !!item.sub_items ? [item, ...(0, flatten_1.default)(item.sub_items.map((i) => getRecusiveItem(i)))] : [item];
676
+ };
677
+ exports.getRecursiveItemsFromSubItems = getRecursiveItemsFromSubItems;
678
+ /**
679
+ * Get price applied for item in cart. Corresponds to the unit price that the customer paid.
680
+ * @param {Space} space
681
+ * @param {ICartItem} item
682
+ * @param {ICart} cartData
683
+ * @param {boolean} options.isBookingBeton Optionnal. Always returns regular price if true (additionnal check)
684
+ * @param {boolean} options.getLowest Optionnal. If true, always returns the lowest amount found between all cart item prices, with no other checks.
685
+ * @returns
686
+ */
687
+ const getAppliedPrice = (item, options = {}) => {
688
+ const applied = (0, exports.getLowestAppliedPrice)(item);
689
+ if (!!options.getLowest) {
690
+ return applied.amount;
691
+ }
692
+ if ((!!!item.promo_price && !!!item.discount_price) || !!options.isBookingBeton) {
693
+ return item.regular_price.amount;
694
+ }
695
+ const itemPriceIsEscompte = (!!item.promo_price && (0, exports.checkPriceForEscompte)(item.promo_price)) ||
696
+ (!!item.discount_price && (0, exports.checkPriceForEscompte)(item.discount_price));
697
+ if (!!itemPriceIsEscompte) {
698
+ if (!!item.discount_price)
699
+ return item.discount_price.amount;
700
+ return item.regular_price.amount;
701
+ }
702
+ return applied.amount;
703
+ };
704
+ exports.getAppliedPrice = getAppliedPrice;
705
+ const getLowestAppliedPrice = (item) => {
706
+ const regular = item.regular_price;
707
+ const promo = item.promo_price;
708
+ const discount = item.discount_price;
709
+ const regularPrice = regular.amount || 0;
710
+ const promoPrice = !!promo ? promo.amount : regularPrice;
711
+ const discountPrice = !!discount ? discount.amount : regularPrice;
712
+ if (!!promo && promoPrice <= discountPrice && promoPrice <= regularPrice) {
713
+ return promo;
714
+ }
715
+ if (!!discount && discountPrice <= promoPrice && discountPrice <= regularPrice) {
716
+ return discount;
717
+ }
718
+ return regular;
719
+ };
720
+ exports.getLowestAppliedPrice = getLowestAppliedPrice;
721
+ /**
722
+ * Checks if the specific item price contains an "escompte"
723
+ * @param {ICartItemCustomPrices} price The price to check, Either the discount_price of promo_price of a cart item.
724
+ * @returns
725
+ */
726
+ const checkPriceForEscompte = (price) => {
727
+ const priceType = price.price_type;
728
+ const posUnitPrice = `pos_custom_${Cart_1.CustomPromoType.UNIT_PRICE}`;
729
+ const isEscompteType = !!priceType &&
730
+ !!![
731
+ G2_1.CustomPriceItemTypeEnum.ENTENTE,
732
+ G2_1.CustomPriceItemTypeEnum.REG,
733
+ posUnitPrice,
734
+ products_3.priceTypeEnum.TIER_PRICING
735
+ ].includes(priceType);
736
+ return !!isEscompteType;
737
+ };
738
+ exports.checkPriceForEscompte = checkPriceForEscompte;
739
+ /**
740
+ * Calculates the percent applied from a discount on a cart item. If promo_price set, checks promo_price, else checks discount_price.
741
+ * @param {ICartItem} item
742
+ * @param {boolean} isPro
743
+ * @returns
744
+ */
745
+ const getPercentFromReducedPrice = (item, isPro) => {
746
+ const typeToCheck = !!item.promo_price && !!item.promo_price.price_type ? 'promo' : 'discount';
747
+ const priceToCheck = typeToCheck === 'promo' ? item.promo_price : item.discount_price;
748
+ if (!!!priceToCheck || (!!!isPro && !!!priceToCheck.overridden))
749
+ return;
750
+ if (!!!(0, exports.checkPriceForEscompte)(priceToCheck))
751
+ return;
752
+ if (typeToCheck === 'promo')
753
+ return (0, round_1.default)((0, cart_2.getActualPromoPrice)(item, products_3.unitTypeEnum.PERCENT), 2);
754
+ return (0, round_1.default)((0, cart_2.getActualDiscountPrice)(item, products_3.unitTypeEnum.PERCENT), 2);
755
+ };
756
+ exports.getPercentFromReducedPrice = getPercentFromReducedPrice;
757
+ // #endregion
758
+ // -----------------------------------------------------------------------------------------
759
+ // #region PDF AND LAYOUT FUNCTIONS
760
+ /**
761
+ * Returns the customer's Client Number to show in order slip and invoice.
762
+ * @param cartData
763
+ * @param space - Must be defined to check if grass promise to purchase bank was applied to cart
764
+ * @param options.isQuote - Optionnal. If current cart is a quote cart
765
+ * @param options.checkIfEscPaApplied - Optionnal. If true, will only add PA suffix if some reduce PA price or item is found in cart
766
+ */
767
+ const getClientNumberForCart = (cartData, space, options = {}) => {
768
+ if (!!!cartData)
769
+ return '';
770
+ const proTitle = (0, object_1.recursiveCheckObject)(cartData, 'customer_info.pro_title');
771
+ const isWebCart = cartData.cart_type === Cart_1.CartTypeEnum.WEB || !!cartData.is_from_web;
772
+ // If checkIfEscPaApplied option is passed to function, will only set cart as isPA if at least one esc. supp item is found
773
+ const paFoundInCart = (0, object_1.recursiveCheckObject)(cartData, 'promise_to_purchase');
774
+ let isPA = !!((0, object_1.recursiveCheckObject)(paFoundInCart, 'ids') || []).length;
775
+ if (!!paFoundInCart && !!options.checkIfEscPaApplied) {
776
+ const bankTypes = !!space ? space.bankTypes.get() : [];
777
+ const grassBank = bankTypes.find((b) => (0, locale_1.getLocaleOfDictionnary)(b.name, 'fr').toLowerCase() == 'gazon');
778
+ const atLeastOneEscPaApplied = cartData.items.some((i) => (0, g2_1.isEscompteSuppItem)(i.sku)) ||
779
+ (!!grassBank &&
780
+ (paFoundInCart.banks_used || []).some((b) => b.bank_type_id == grassBank.id) &&
781
+ cartData.items.some((i) => i.sku == products_2.kentucky || i.parent_slug == 'kentucky'));
782
+ isPA = atLeastOneEscPaApplied;
783
+ }
784
+ // a. If pro customer, return pro ID + PA if promise banks applied
785
+ if (!!proTitle && !!cartData.customer_id) {
786
+ return `${cartData.customer_id}${!!isPA ? 'PA' : ''}`;
787
+ }
788
+ // b. If cart from Web, construct code from expedition type, current date and WEB string
789
+ if (!!isWebCart) {
790
+ return `${!!cartData.is_pickup ? 'COM' : 'LIV'}${!!cartData.paid_at ? (0, moment_1.default)((0, data_1.formatDate)(cartData.paid_at)).format('YY') : '00'}WEB`;
791
+ }
792
+ // c. If PDF made for an order quote (soumission), simply show customer type if no customer id set
793
+ if (!!options.isQuote) {
794
+ return proTitle === 'anonymous-pos-pro' ? 'Paysagiste' : 'Détail';
795
+ }
796
+ // d. Construct POS specific code from expedition type, assigned store, current date and customer type
797
+ return _getPOSCustomerTypeForCart(cartData);
798
+ };
799
+ exports.getClientNumberForCart = getClientNumberForCart;
800
+ const _getPOSCustomerTypeForCart = (cartData) => {
801
+ const isPickup = !!cartData && !!cartData.is_pickup;
802
+ const isPro = !!cartData.customer_info && !!cartData.customer_info.pro_title;
803
+ const currentYear = !!cartData.paid_at ? (0, moment_1.default)((0, data_1.formatDate)(cartData.paid_at)).format('YY') : '00';
804
+ const storeNb = !!cartData.created_by && !!cartData.created_by.at_store_number ? cartData.created_by.at_store_number : 0;
805
+ // Check if store number is a number
806
+ const aNumber = (0, toNumber_1.default)(storeNb);
807
+ let endOfCode = '';
808
+ if (!!!aNumber) {
809
+ endOfCode = `${!!isPro ? '3' : ''}${storeNb}`;
810
+ }
811
+ else {
812
+ endOfCode = `${!!isPro ? '3' : aNumber < 10 ? '0' : ''}${aNumber}`;
813
+ }
814
+ return `${!!isPickup ? 'COM' : 'LIV'}${currentYear}${endOfCode}`;
815
+ };
816
+ const getLabelForCartType = (value) => {
817
+ switch (value) {
818
+ case cart_1.CartGeneralTypeEnum.RETURN_PALLETS:
819
+ return 'Retour palettes';
820
+ case cart_1.CartGeneralTypeEnum.ONLY_ACCESSORIES:
821
+ return 'Accessoires seulement';
822
+ case cart_1.CartGeneralTypeEnum.BETON:
823
+ return 'Béton';
824
+ case cart_1.CartGeneralTypeEnum.SAMPLE:
825
+ return 'Échantillons';
826
+ case cart_1.CartGeneralTypeEnum.GRASS:
827
+ return 'Gazon';
828
+ case cart_1.CartGeneralTypeEnum.INSTALLATION:
829
+ return 'Installation';
830
+ case cart_1.CartGeneralTypeEnum.VRAC:
831
+ return 'Vrac';
832
+ case Cart_1.CartContentTypeEnum.MIXED:
833
+ return 'Mixte';
834
+ default:
835
+ return value;
836
+ }
837
+ };
838
+ exports.getLabelForCartType = getLabelForCartType;
839
+ // #endregion
840
840
  //# sourceMappingURL=cart.js.map