addio-admin-sdk 1.7.144 → 1.7.145

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