addio-admin-sdk 1.7.196 → 1.7.197

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