addio-admin-sdk 1.7.144 → 1.7.146

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 (574) hide show
  1. package/.babelrc +17 -17
  2. package/.env +15 -0
  3. package/.env.dev +14 -14
  4. package/.github/workflows/run_unit_test.yaml +48 -48
  5. package/addio-sdk-doc.md +1473 -1473
  6. package/changelog.md +564 -564
  7. package/dist/Interfaces/Address/index.d.ts +21 -21
  8. package/dist/Interfaces/Address/index.js +16 -16
  9. package/dist/Interfaces/Algolia/index.d.ts +177 -177
  10. package/dist/Interfaces/Algolia/index.js +2 -2
  11. package/dist/Interfaces/Attachement/index.d.ts +5 -5
  12. package/dist/Interfaces/Attachement/index.js +2 -2
  13. package/dist/Interfaces/Attribute/index.d.ts +53 -53
  14. package/dist/Interfaces/Attribute/index.js +10 -10
  15. package/dist/Interfaces/BGJob/index.d.ts +56 -56
  16. package/dist/Interfaces/BGJob/index.js +25 -25
  17. package/dist/Interfaces/BaseClass/index.d.ts +8 -8
  18. package/dist/Interfaces/BaseClass/index.js +2 -2
  19. package/dist/Interfaces/Blog/IBlogArticle.d.ts +18 -18
  20. package/dist/Interfaces/Blog/IBlogArticle.js +2 -2
  21. package/dist/Interfaces/Blog/IBlogAuthor.d.ts +7 -7
  22. package/dist/Interfaces/Blog/IBlogAuthor.js +2 -2
  23. package/dist/Interfaces/Blog/IBlogCategory.d.ts +9 -9
  24. package/dist/Interfaces/Blog/IBlogCategory.js +2 -2
  25. package/dist/Interfaces/Blog/IBlogComment.d.ts +13 -13
  26. package/dist/Interfaces/Blog/IBlogComment.js +2 -2
  27. package/dist/Interfaces/Blog/IBlogKeywords.d.ts +9 -9
  28. package/dist/Interfaces/Blog/IBlogKeywords.js +2 -2
  29. package/dist/Interfaces/Booking/index.d.ts +74 -74
  30. package/dist/Interfaces/Booking/index.js +17 -17
  31. package/dist/Interfaces/Brand/index.d.ts +15 -15
  32. package/dist/Interfaces/Brand/index.js +2 -2
  33. package/dist/Interfaces/CMS/index.d.ts +28 -28
  34. package/dist/Interfaces/CMS/index.js +5 -5
  35. package/dist/Interfaces/Cart/IElavonPayload.d.ts +93 -93
  36. package/dist/Interfaces/Cart/IElavonPayload.js +17 -17
  37. package/dist/Interfaces/Cart/IPandaPayload.d.ts +64 -64
  38. package/dist/Interfaces/Cart/IPandaPayload.js +18 -18
  39. package/dist/Interfaces/Cart/IPaymentCard.d.ts +22 -22
  40. package/dist/Interfaces/Cart/IPaymentCard.js +44 -44
  41. package/dist/Interfaces/Cart/IPaypalPayload.d.ts +9 -9
  42. package/dist/Interfaces/Cart/IPaypalPayload.js +2 -2
  43. package/dist/Interfaces/Cart/IPaysafePayload.d.ts +72 -72
  44. package/dist/Interfaces/Cart/IPaysafePayload.js +2 -2
  45. package/dist/Interfaces/Cart/IStripePayload.d.ts +66 -66
  46. package/dist/Interfaces/Cart/IStripePayload.js +2 -2
  47. package/dist/Interfaces/Cart/index.d.ts +444 -444
  48. package/dist/Interfaces/Cart/index.js +197 -197
  49. package/dist/Interfaces/CartReservedQuantities/index.d.ts +10 -10
  50. package/dist/Interfaces/CartReservedQuantities/index.js +2 -2
  51. package/dist/Interfaces/CashDrawers/index.d.ts +37 -37
  52. package/dist/Interfaces/CashDrawers/index.js +19 -19
  53. package/dist/Interfaces/Catalogue/index.d.ts +68 -68
  54. package/dist/Interfaces/Catalogue/index.js +37 -37
  55. package/dist/Interfaces/Category/index.d.ts +33 -33
  56. package/dist/Interfaces/Category/index.js +2 -2
  57. package/dist/Interfaces/Chart/index.d.ts +11 -11
  58. package/dist/Interfaces/Chart/index.js +2 -2
  59. package/dist/Interfaces/Class/index.d.ts +8 -8
  60. package/dist/Interfaces/Class/index.js +2 -2
  61. package/dist/Interfaces/Consent/index.d.ts +6 -6
  62. package/dist/Interfaces/Consent/index.js +2 -2
  63. package/dist/Interfaces/Context/IContextProps.d.ts +4 -4
  64. package/dist/Interfaces/Context/IContextProps.js +2 -2
  65. package/dist/Interfaces/Context/IContextState.d.ts +15 -15
  66. package/dist/Interfaces/Context/IContextState.js +2 -2
  67. package/dist/Interfaces/Customer/ICustomerBadge.d.ts +2 -2
  68. package/dist/Interfaces/Customer/ICustomerBadge.js +2 -2
  69. package/dist/Interfaces/Customer/ICustomerRating.d.ts +10 -10
  70. package/dist/Interfaces/Customer/ICustomerRating.js +2 -2
  71. package/dist/Interfaces/Customer/IStoreCredit.d.ts +13 -13
  72. package/dist/Interfaces/Customer/IStoreCredit.js +2 -2
  73. package/dist/Interfaces/Customer/index.d.ts +104 -104
  74. package/dist/Interfaces/Customer/index.js +148 -148
  75. package/dist/Interfaces/Declination/index.d.ts +117 -117
  76. package/dist/Interfaces/Declination/index.js +66 -66
  77. package/dist/Interfaces/Document/index.d.ts +8 -8
  78. package/dist/Interfaces/Document/index.js +2 -2
  79. package/dist/Interfaces/Elastic/index.d.ts +89 -89
  80. package/dist/Interfaces/Elastic/index.js +2 -2
  81. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.d.ts +11 -11
  82. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.js +2 -2
  83. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.d.ts +15 -15
  84. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.js +2 -2
  85. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.d.ts +12 -12
  86. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.js +2 -2
  87. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.d.ts +36 -36
  88. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.js +2 -2
  89. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.d.ts +12 -12
  90. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.js +2 -2
  91. package/dist/Interfaces/Email/CustomGR/ITransportEmail.d.ts +12 -12
  92. package/dist/Interfaces/Email/CustomGR/ITransportEmail.js +2 -2
  93. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.d.ts +12 -12
  94. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.js +2 -2
  95. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.d.ts +16 -16
  96. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.js +2 -2
  97. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.d.ts +15 -15
  98. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.js +2 -2
  99. package/dist/Interfaces/Email/IAbandonnedCartEmail.d.ts +29 -29
  100. package/dist/Interfaces/Email/IAbandonnedCartEmail.js +2 -2
  101. package/dist/Interfaces/Email/IAccountConfirmationEmail.d.ts +22 -22
  102. package/dist/Interfaces/Email/IAccountConfirmationEmail.js +2 -2
  103. package/dist/Interfaces/Email/IApplicationEmail.d.ts +19 -19
  104. package/dist/Interfaces/Email/IApplicationEmail.js +2 -2
  105. package/dist/Interfaces/Email/IBackInStockEmail.d.ts +21 -21
  106. package/dist/Interfaces/Email/IBackInStockEmail.js +2 -2
  107. package/dist/Interfaces/Email/IContactEmail.d.ts +20 -20
  108. package/dist/Interfaces/Email/IContactEmail.js +2 -2
  109. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.d.ts +15 -15
  110. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.js +2 -2
  111. package/dist/Interfaces/Email/ICustomerBookingEmail.d.ts +14 -14
  112. package/dist/Interfaces/Email/ICustomerBookingEmail.js +2 -2
  113. package/dist/Interfaces/Email/IEmail.d.ts +20 -20
  114. package/dist/Interfaces/Email/IEmail.js +60 -60
  115. package/dist/Interfaces/Email/IOrderConfirmationEmail.d.ts +47 -47
  116. package/dist/Interfaces/Email/IOrderConfirmationEmail.js +2 -2
  117. package/dist/Interfaces/Email/IPasswordResetEmail.d.ts +17 -17
  118. package/dist/Interfaces/Email/IPasswordResetEmail.js +2 -2
  119. package/dist/Interfaces/Email/IPhotoShootEmail.d.ts +14 -14
  120. package/dist/Interfaces/Email/IPhotoShootEmail.js +2 -2
  121. package/dist/Interfaces/Email/IPickupConfirmation.d.ts +23 -23
  122. package/dist/Interfaces/Email/IPickupConfirmation.js +2 -2
  123. package/dist/Interfaces/Email/IShippingConfirmation.d.ts +23 -23
  124. package/dist/Interfaces/Email/IShippingConfirmation.js +2 -2
  125. package/dist/Interfaces/Email/IWelcomeEmail.d.ts +19 -19
  126. package/dist/Interfaces/Email/IWelcomeEmail.js +2 -2
  127. package/dist/Interfaces/ExportSchema/index.d.ts +7 -7
  128. package/dist/Interfaces/ExportSchema/index.js +2 -2
  129. package/dist/Interfaces/ExternalService/BaseExternalService.d.ts +12 -12
  130. package/dist/Interfaces/ExternalService/BaseExternalService.js +2 -2
  131. package/dist/Interfaces/ExternalService/ExternalProductsService.d.ts +4 -4
  132. package/dist/Interfaces/ExternalService/ExternalProductsService.js +2 -2
  133. package/dist/Interfaces/ExternalService/index.d.ts +9 -9
  134. package/dist/Interfaces/ExternalService/index.js +2 -2
  135. package/dist/Interfaces/FirstOrderTracking/index.d.ts +5 -5
  136. package/dist/Interfaces/FirstOrderTracking/index.js +2 -2
  137. package/dist/Interfaces/G2/index.d.ts +556 -556
  138. package/dist/Interfaces/G2/index.js +38 -38
  139. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.d.ts +20 -20
  140. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.js +2 -2
  141. package/dist/Interfaces/Indexed/Product/index.d.ts +105 -105
  142. package/dist/Interfaces/Indexed/Product/index.js +253 -253
  143. package/dist/Interfaces/Inventory/index.d.ts +19 -19
  144. package/dist/Interfaces/Inventory/index.js +8 -8
  145. package/dist/Interfaces/Invoice/index.d.ts +4 -4
  146. package/dist/Interfaces/Invoice/index.js +2 -2
  147. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.d.ts +3 -3
  148. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.js +2 -2
  149. package/dist/Interfaces/MarketplacePublication/index.d.ts +23 -23
  150. package/dist/Interfaces/MarketplacePublication/index.js +22 -22
  151. package/dist/Interfaces/Menu/index.d.ts +40 -40
  152. package/dist/Interfaces/Menu/index.js +16 -16
  153. package/dist/Interfaces/Note/index.d.ts +10 -10
  154. package/dist/Interfaces/Note/index.js +7 -7
  155. package/dist/Interfaces/Operations/ICreatedBy.d.ts +6 -6
  156. package/dist/Interfaces/Operations/ICreatedBy.js +2 -2
  157. package/dist/Interfaces/Operations/IUpdate.d.ts +5 -5
  158. package/dist/Interfaces/Operations/IUpdate.js +2 -2
  159. package/dist/Interfaces/Order/index.d.ts +4 -4
  160. package/dist/Interfaces/Order/index.js +2 -2
  161. package/dist/Interfaces/Org/IRelUser.d.ts +9 -9
  162. package/dist/Interfaces/Org/IRelUser.js +2 -2
  163. package/dist/Interfaces/Org/index.d.ts +29 -29
  164. package/dist/Interfaces/Org/index.js +12 -12
  165. package/dist/Interfaces/Payment/index.d.ts +26 -26
  166. package/dist/Interfaces/Payment/index.js +14 -14
  167. package/dist/Interfaces/Product/IAttributeFamily.d.ts +6 -6
  168. package/dist/Interfaces/Product/IAttributeFamily.js +2 -2
  169. package/dist/Interfaces/Product/IImportProduct.d.ts +42 -42
  170. package/dist/Interfaces/Product/IImportProduct.js +882 -882
  171. package/dist/Interfaces/Product/IInventoryItem.d.ts +74 -74
  172. package/dist/Interfaces/Product/IInventoryItem.js +38 -38
  173. package/dist/Interfaces/Product/IPricing.d.ts +177 -177
  174. package/dist/Interfaces/Product/IPricing.js +180 -180
  175. package/dist/Interfaces/Product/index.d.ts +138 -138
  176. package/dist/Interfaces/Product/index.js +64 -64
  177. package/dist/Interfaces/ProductAttribute/index.d.ts +11 -11
  178. package/dist/Interfaces/ProductAttribute/index.js +2 -2
  179. package/dist/Interfaces/PromiseToPurchase/BankType.d.ts +41 -41
  180. package/dist/Interfaces/PromiseToPurchase/BankType.js +41 -41
  181. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.d.ts +33 -33
  182. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.js +15 -15
  183. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.d.ts +19 -19
  184. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.js +2 -2
  185. package/dist/Interfaces/PromiseToPurchase/index.d.ts +50 -50
  186. package/dist/Interfaces/PromiseToPurchase/index.js +13 -13
  187. package/dist/Interfaces/PurchaseOrder/index.d.ts +17 -17
  188. package/dist/Interfaces/PurchaseOrder/index.js +2 -2
  189. package/dist/Interfaces/Query/IBrandQueryOptions.d.ts +11 -11
  190. package/dist/Interfaces/Query/IBrandQueryOptions.js +2 -2
  191. package/dist/Interfaces/Query/ICategoryQueryOptions.d.ts +11 -11
  192. package/dist/Interfaces/Query/ICategoryQueryOptions.js +2 -2
  193. package/dist/Interfaces/Query/IProductQueryOptions.d.ts +16 -16
  194. package/dist/Interfaces/Query/IProductQueryOptions.js +2 -2
  195. package/dist/Interfaces/Quote/index.d.ts +5 -5
  196. package/dist/Interfaces/Quote/index.js +2 -2
  197. package/dist/Interfaces/Refunds/index.d.ts +106 -106
  198. package/dist/Interfaces/Refunds/index.js +2 -2
  199. package/dist/Interfaces/Rules/IDiscountRule.d.ts +155 -155
  200. package/dist/Interfaces/Rules/IDiscountRule.js +114 -114
  201. package/dist/Interfaces/Schedule/index.d.ts +48 -48
  202. package/dist/Interfaces/Schedule/index.js +2 -2
  203. package/dist/Interfaces/Services/IAddServiceResponse.d.ts +4 -4
  204. package/dist/Interfaces/Services/IAddServiceResponse.js +2 -2
  205. package/dist/Interfaces/Services/IService.d.ts +16 -16
  206. package/dist/Interfaces/Services/IService.js +2 -2
  207. package/dist/Interfaces/Services/IServiceSecret.d.ts +8 -8
  208. package/dist/Interfaces/Services/IServiceSecret.js +2 -2
  209. package/dist/Interfaces/Shipping/Shipstation/carriers.d.ts +10 -10
  210. package/dist/Interfaces/Shipping/Shipstation/carriers.js +2 -2
  211. package/dist/Interfaces/Shipping/Shipstation/order.d.ts +227 -227
  212. package/dist/Interfaces/Shipping/Shipstation/order.js +2 -2
  213. package/dist/Interfaces/Shipping/Shipstation/quote.d.ts +31 -31
  214. package/dist/Interfaces/Shipping/Shipstation/quote.js +2 -2
  215. package/dist/Interfaces/Shipping/Shiptime/order.d.ts +54 -54
  216. package/dist/Interfaces/Shipping/Shiptime/order.js +71 -71
  217. package/dist/Interfaces/Shipping/Shiptime/quote.d.ts +111 -111
  218. package/dist/Interfaces/Shipping/Shiptime/quote.js +2 -2
  219. package/dist/Interfaces/Slider/GR.d.ts +114 -114
  220. package/dist/Interfaces/Slider/GR.js +271 -271
  221. package/dist/Interfaces/Slider/index.d.ts +30 -30
  222. package/dist/Interfaces/Slider/index.js +2 -2
  223. package/dist/Interfaces/Space/IExternalService.d.ts +53 -53
  224. package/dist/Interfaces/Space/IExternalService.js +44 -44
  225. package/dist/Interfaces/Space/IMember.d.ts +16 -16
  226. package/dist/Interfaces/Space/IMember.js +9 -9
  227. package/dist/Interfaces/Space/index.d.ts +407 -405
  228. package/dist/Interfaces/Space/index.js +174 -174
  229. package/dist/Interfaces/Space/index.js.map +1 -1
  230. package/dist/Interfaces/Specials/gr.d.ts +61 -61
  231. package/dist/Interfaces/Specials/gr.js +2 -2
  232. package/dist/Interfaces/StockNotification/index.d.ts +7 -7
  233. package/dist/Interfaces/StockNotification/index.js +2 -2
  234. package/dist/Interfaces/Store/index.d.ts +63 -63
  235. package/dist/Interfaces/Store/index.js +27 -27
  236. package/dist/Interfaces/Supplier/ICommand.d.ts +11 -11
  237. package/dist/Interfaces/Supplier/ICommand.js +2 -2
  238. package/dist/Interfaces/Supplier/index.d.ts +36 -36
  239. package/dist/Interfaces/Supplier/index.js +24 -24
  240. package/dist/Interfaces/TCG/index.d.ts +161 -161
  241. package/dist/Interfaces/TCG/index.js +54 -54
  242. package/dist/Interfaces/Tag/index.d.ts +18 -18
  243. package/dist/Interfaces/Tag/index.js +2 -2
  244. package/dist/Interfaces/Tax/index.d.ts +13 -13
  245. package/dist/Interfaces/Tax/index.js +2 -2
  246. package/dist/Interfaces/TransferRequest/index.d.ts +103 -103
  247. package/dist/Interfaces/TransferRequest/index.js +46 -46
  248. package/dist/Interfaces/Translation/index.d.ts +8 -8
  249. package/dist/Interfaces/Translation/index.js +5 -5
  250. package/dist/Interfaces/Update/index.d.ts +10 -10
  251. package/dist/Interfaces/Update/index.js +2 -2
  252. package/dist/Interfaces/User/IUser.d.ts +65 -65
  253. package/dist/Interfaces/User/IUser.js +8 -8
  254. package/dist/Interfaces/Version/index.d.ts +11 -11
  255. package/dist/Interfaces/Version/index.js +2 -2
  256. package/dist/Interfaces/Wishlist/index.d.ts +7 -7
  257. package/dist/Interfaces/Wishlist/index.js +2 -2
  258. package/dist/constants/Interfaces/IBaseApi.d.ts +15 -15
  259. package/dist/constants/Interfaces/IBaseApi.js +2 -2
  260. package/dist/constants/Interfaces/IEndpointResult.d.ts +9 -9
  261. package/dist/constants/Interfaces/IEndpointResult.js +2 -2
  262. package/dist/constants/enums.d.ts +6 -6
  263. package/dist/constants/enums.js +10 -10
  264. package/dist/constants/services.d.ts +2 -2
  265. package/dist/constants/services.js +117 -117
  266. package/dist/constants/version.d.ts +2 -2
  267. package/dist/constants/version.js +5 -5
  268. package/dist/index.d.ts +50 -50
  269. package/dist/index.js +266 -266
  270. package/dist/lib/Attribute/index.d.ts +14 -14
  271. package/dist/lib/Attribute/index.js +186 -186
  272. package/dist/lib/BGJob/index.d.ts +9 -9
  273. package/dist/lib/BGJob/index.js +216 -216
  274. package/dist/lib/BackgroundWorker/index.d.ts +34 -34
  275. package/dist/lib/BackgroundWorker/index.js +59 -59
  276. package/dist/lib/Blog/BlogArticle.d.ts +5 -5
  277. package/dist/lib/Blog/BlogArticle.js +10 -10
  278. package/dist/lib/Blog/BlogAuthor.d.ts +5 -5
  279. package/dist/lib/Blog/BlogAuthor.js +10 -10
  280. package/dist/lib/Blog/BlogCategory.d.ts +5 -5
  281. package/dist/lib/Blog/BlogCategory.js +10 -10
  282. package/dist/lib/Blog/BlogKeyword.d.ts +5 -5
  283. package/dist/lib/Blog/BlogKeyword.js +10 -10
  284. package/dist/lib/Booking/index.d.ts +85 -85
  285. package/dist/lib/Booking/index.js +596 -596
  286. package/dist/lib/Brand/index.d.ts +26 -26
  287. package/dist/lib/Brand/index.js +131 -131
  288. package/dist/lib/Cart/index.d.ts +335 -335
  289. package/dist/lib/Cart/index.js +3981 -3977
  290. package/dist/lib/Cart/index.js.map +1 -1
  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/Queue/index.d.ts +40 -40
  388. package/dist/lib/Queue/index.js +254 -254
  389. package/dist/lib/Schedule/index.d.ts +5 -5
  390. package/dist/lib/Schedule/index.js +12 -12
  391. package/dist/lib/Service/Enum/ServiceEnum.d.ts +3 -3
  392. package/dist/lib/Service/Enum/ServiceEnum.js +7 -7
  393. package/dist/lib/Service/index.d.ts +13 -13
  394. package/dist/lib/Service/index.js +21 -21
  395. package/dist/lib/Shipment/index.d.ts +28 -28
  396. package/dist/lib/Shipment/index.js +370 -370
  397. package/dist/lib/Slider/index.d.ts +22 -22
  398. package/dist/lib/Slider/index.js +119 -119
  399. package/dist/lib/Space/index.d.ts +1150 -1150
  400. package/dist/lib/Space/index.js +5792 -5792
  401. package/dist/lib/StockNotification/index.d.ts +4 -4
  402. package/dist/lib/StockNotification/index.js +6 -6
  403. package/dist/lib/Store/index.d.ts +5 -5
  404. package/dist/lib/Store/index.js +12 -12
  405. package/dist/lib/Supplier/Command.d.ts +5 -5
  406. package/dist/lib/Supplier/Command.js +10 -10
  407. package/dist/lib/Supplier/index.d.ts +25 -25
  408. package/dist/lib/Supplier/index.js +27 -27
  409. package/dist/lib/Tags/index.d.ts +6 -6
  410. package/dist/lib/Tags/index.js +26 -26
  411. package/dist/lib/Tax/index.d.ts +8 -8
  412. package/dist/lib/Tax/index.js +54 -54
  413. package/dist/lib/TransferRequest/index.d.ts +290 -290
  414. package/dist/lib/TransferRequest/index.js +1026 -1026
  415. package/dist/lib/Update/index.d.ts +10 -10
  416. package/dist/lib/Update/index.js +22 -22
  417. package/dist/lib/User/index.d.ts +89 -89
  418. package/dist/lib/User/index.js +328 -328
  419. package/dist/lib/Wishlist/index.d.ts +5 -5
  420. package/dist/lib/Wishlist/index.js +10 -10
  421. package/dist/lib/base.d.ts +14 -14
  422. package/dist/lib/base.js +62 -62
  423. package/dist/lib/baseService.d.ts +17 -17
  424. package/dist/lib/baseService.js +69 -69
  425. package/dist/rules/GR/constants/data.d.ts +26 -26
  426. package/dist/rules/GR/constants/data.js +81 -81
  427. package/dist/rules/GR/constants/expedition.d.ts +4 -4
  428. package/dist/rules/GR/constants/expedition.js +9 -9
  429. package/dist/rules/GR/constants/products.d.ts +22 -22
  430. package/dist/rules/GR/constants/products.js +263 -263
  431. package/dist/rules/GR/interfaces/cart.d.ts +84 -84
  432. package/dist/rules/GR/interfaces/cart.js +41 -41
  433. package/dist/rules/GR/interfaces/data.d.ts +101 -101
  434. package/dist/rules/GR/interfaces/data.js +114 -114
  435. package/dist/rules/GR/interfaces/products.d.ts +61 -61
  436. package/dist/rules/GR/interfaces/products.js +10 -10
  437. package/dist/rules/GR/utils/cart.d.ts +95 -95
  438. package/dist/rules/GR/utils/cart.js +839 -836
  439. package/dist/rules/GR/utils/cart.js.map +1 -1
  440. package/dist/rules/GR/utils/data.d.ts +3 -3
  441. package/dist/rules/GR/utils/data.js +28 -28
  442. package/dist/rules/GR/utils/expedition.d.ts +140 -140
  443. package/dist/rules/GR/utils/expedition.js +2016 -2016
  444. package/dist/rules/GR/utils/g2.d.ts +209 -209
  445. package/dist/rules/GR/utils/g2.js +999 -999
  446. package/dist/rules/GR/utils/invoices.d.ts +51 -51
  447. package/dist/rules/GR/utils/invoices.js +215 -215
  448. package/dist/rules/GR/utils/products.d.ts +277 -277
  449. package/dist/rules/GR/utils/products.js +1350 -1350
  450. package/dist/rules/GR/utils/upsells.d.ts +111 -111
  451. package/dist/rules/GR/utils/upsells.js +215 -215
  452. package/dist/services/database/BaseProvider.d.ts +29 -29
  453. package/dist/services/database/BaseProvider.js +28 -28
  454. package/dist/services/database/BatchUtils.d.ts +14 -14
  455. package/dist/services/database/BatchUtils.js +43 -43
  456. package/dist/services/database/Config.d.ts +2 -2
  457. package/dist/services/database/Config.js +5 -5
  458. package/dist/services/database/DatabaseService.d.ts +125 -125
  459. package/dist/services/database/DatabaseService.js +237 -237
  460. package/dist/services/database/FirebaseProvider.d.ts +17 -17
  461. package/dist/services/database/FirebaseProvider.js +235 -235
  462. package/dist/services/database/NotFirebaseProvider.d.ts +49 -49
  463. package/dist/services/database/NotFirebaseProvider.js +262 -262
  464. package/dist/services/g2/G2OrderSlip.d.ts +49 -49
  465. package/dist/services/g2/G2OrderSlip.js +228 -228
  466. package/dist/services/g2/utils.d.ts +19 -19
  467. package/dist/services/g2/utils.js +953 -953
  468. package/dist/services/logs/index.d.ts +23 -23
  469. package/dist/services/logs/index.js +66 -66
  470. package/dist/services/marketplace/BaseMarketServiceClass.d.ts +52 -52
  471. package/dist/services/marketplace/BaseMarketServiceClass.js +111 -111
  472. package/dist/services/marketplace/CardtraderServiceClass.d.ts +17 -17
  473. package/dist/services/marketplace/CardtraderServiceClass.js +139 -139
  474. package/dist/services/marketplace/utils.d.ts +14 -14
  475. package/dist/services/marketplace/utils.js +29 -29
  476. package/dist/services/products/BaseClass.d.ts +50 -50
  477. package/dist/services/products/BaseClass.js +66 -66
  478. package/dist/services/products/TCGService.d.ts +32 -32
  479. package/dist/services/products/TCGService.js +555 -555
  480. package/dist/services/products/utils.d.ts +31 -31
  481. package/dist/services/products/utils.js +144 -144
  482. package/dist/utils/algolia.d.ts +46 -46
  483. package/dist/utils/algolia.js +21 -21
  484. package/dist/utils/anonymisation.d.ts +54 -54
  485. package/dist/utils/anonymisation.js +280 -280
  486. package/dist/utils/array.d.ts +5 -5
  487. package/dist/utils/array.js +14 -14
  488. package/dist/utils/aws.d.ts +36 -36
  489. package/dist/utils/aws.js +154 -154
  490. package/dist/utils/booking.d.ts +30 -30
  491. package/dist/utils/booking.js +127 -127
  492. package/dist/utils/cart.d.ts +259 -259
  493. package/dist/utils/cart.js +1145 -1145
  494. package/dist/utils/categories.d.ts +2 -2
  495. package/dist/utils/categories.js +54 -54
  496. package/dist/utils/cmv.d.ts +10 -10
  497. package/dist/utils/cmv.js +107 -107
  498. package/dist/utils/console.d.ts +6 -6
  499. package/dist/utils/console.js +59 -59
  500. package/dist/utils/context.d.ts +20 -20
  501. package/dist/utils/context.js +61 -61
  502. package/dist/utils/currency.d.ts +6 -6
  503. package/dist/utils/currency.js +91 -91
  504. package/dist/utils/data.d.ts +31 -31
  505. package/dist/utils/data.js +296 -296
  506. package/dist/utils/date.d.ts +1 -1
  507. package/dist/utils/date.js +16 -16
  508. package/dist/utils/dimensions.d.ts +3 -3
  509. package/dist/utils/dimensions.js +16 -16
  510. package/dist/utils/discount.d.ts +164 -164
  511. package/dist/utils/discount.js +1111 -1111
  512. package/dist/utils/errors.d.ts +113 -113
  513. package/dist/utils/errors.js +113 -113
  514. package/dist/utils/file-admin.d.ts +8 -8
  515. package/dist/utils/file-admin.js +39 -39
  516. package/dist/utils/file.d.ts +39 -39
  517. package/dist/utils/file.js +208 -208
  518. package/dist/utils/firebase-admin.d.ts +11 -11
  519. package/dist/utils/firebase-admin.js +73 -73
  520. package/dist/utils/firebase.d.ts +58 -58
  521. package/dist/utils/firebase.js +148 -148
  522. package/dist/utils/import.d.ts +1 -1
  523. package/dist/utils/import.js +21 -21
  524. package/dist/utils/inventories.d.ts +101 -101
  525. package/dist/utils/inventories.js +467 -467
  526. package/dist/utils/locale.d.ts +24 -24
  527. package/dist/utils/locale.js +89 -89
  528. package/dist/utils/mailchimp.d.ts +58 -58
  529. package/dist/utils/mailchimp.js +531 -531
  530. package/dist/utils/mathUtils.d.ts +17 -17
  531. package/dist/utils/mathUtils.js +324 -324
  532. package/dist/utils/mongodb.d.ts +1 -1
  533. package/dist/utils/mongodb.js +22 -22
  534. package/dist/utils/object.d.ts +32 -32
  535. package/dist/utils/object.js +133 -133
  536. package/dist/utils/payment.d.ts +10 -10
  537. package/dist/utils/payment.js +23 -23
  538. package/dist/utils/products.d.ts +39 -39
  539. package/dist/utils/products.js +195 -195
  540. package/dist/utils/promiseToPurchase.d.ts +88 -88
  541. package/dist/utils/promiseToPurchase.js +229 -229
  542. package/dist/utils/prosprsearch.d.ts +42 -42
  543. package/dist/utils/prosprsearch.js +216 -216
  544. package/dist/utils/refunds.d.ts +2 -2
  545. package/dist/utils/refunds.js +21 -21
  546. package/dist/utils/sdc.d.ts +10 -10
  547. package/dist/utils/sdc.js +1309 -1309
  548. package/dist/utils/searchIndexes.d.ts +58 -58
  549. package/dist/utils/searchIndexes.js +247 -247
  550. package/dist/utils/services.d.ts +42 -42
  551. package/dist/utils/services.js +409 -409
  552. package/dist/utils/shipment.d.ts +110 -110
  553. package/dist/utils/shipment.js +345 -345
  554. package/dist/utils/simpletexting.d.ts +2 -2
  555. package/dist/utils/simpletexting.js +45 -45
  556. package/dist/utils/sliders.d.ts +4 -4
  557. package/dist/utils/sliders.js +24 -24
  558. package/dist/utils/string.d.ts +16 -16
  559. package/dist/utils/string.js +192 -192
  560. package/dist/utils/tcgService.d.ts +74 -74
  561. package/dist/utils/tcgService.js +308 -308
  562. package/dist/utils/tools.d.ts +5 -5
  563. package/dist/utils/tools.js +13 -13
  564. package/dist/utils/transferRequests.d.ts +43 -43
  565. package/dist/utils/transferRequests.js +67 -67
  566. package/dist/utils/update.d.ts +7 -7
  567. package/dist/utils/update.js +137 -137
  568. package/dist/utils/weight.d.ts +3 -3
  569. package/dist/utils/weight.js +16 -16
  570. package/dist/utils/zones.d.ts +11 -11
  571. package/dist/utils/zones.js +218 -218
  572. package/package.json +107 -107
  573. package/publish.sh +143 -143
  574. package/readme.md +182 -182
@@ -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