addio-admin-sdk 1.7.143 → 1.7.144

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 (579) hide show
  1. package/.babelrc +17 -17
  2. package/.env.dev +14 -14
  3. package/.github/workflows/run_unit_test.yaml +48 -48
  4. package/addio-sdk-doc.md +1473 -1473
  5. package/changelog.md +564 -564
  6. package/dist/Interfaces/Address/index.d.ts +21 -21
  7. package/dist/Interfaces/Address/index.js +16 -16
  8. package/dist/Interfaces/Algolia/index.d.ts +177 -177
  9. package/dist/Interfaces/Algolia/index.js +2 -2
  10. package/dist/Interfaces/Attachement/index.d.ts +5 -5
  11. package/dist/Interfaces/Attachement/index.js +2 -2
  12. package/dist/Interfaces/Attribute/index.d.ts +53 -53
  13. package/dist/Interfaces/Attribute/index.js +10 -10
  14. package/dist/Interfaces/BGJob/index.d.ts +56 -56
  15. package/dist/Interfaces/BGJob/index.js +25 -25
  16. package/dist/Interfaces/BaseClass/index.d.ts +8 -8
  17. package/dist/Interfaces/BaseClass/index.js +2 -2
  18. package/dist/Interfaces/Blog/IBlogArticle.d.ts +18 -18
  19. package/dist/Interfaces/Blog/IBlogArticle.js +2 -2
  20. package/dist/Interfaces/Blog/IBlogAuthor.d.ts +7 -7
  21. package/dist/Interfaces/Blog/IBlogAuthor.js +2 -2
  22. package/dist/Interfaces/Blog/IBlogCategory.d.ts +9 -9
  23. package/dist/Interfaces/Blog/IBlogCategory.js +2 -2
  24. package/dist/Interfaces/Blog/IBlogComment.d.ts +13 -13
  25. package/dist/Interfaces/Blog/IBlogComment.js +2 -2
  26. package/dist/Interfaces/Blog/IBlogKeywords.d.ts +9 -9
  27. package/dist/Interfaces/Blog/IBlogKeywords.js +2 -2
  28. package/dist/Interfaces/Booking/index.d.ts +74 -74
  29. package/dist/Interfaces/Booking/index.js +17 -17
  30. package/dist/Interfaces/Brand/index.d.ts +15 -15
  31. package/dist/Interfaces/Brand/index.js +2 -2
  32. package/dist/Interfaces/CMS/index.d.ts +28 -28
  33. package/dist/Interfaces/CMS/index.js +5 -5
  34. package/dist/Interfaces/Cart/IElavonPayload.d.ts +93 -93
  35. package/dist/Interfaces/Cart/IElavonPayload.js +17 -17
  36. package/dist/Interfaces/Cart/IPandaPayload.d.ts +64 -64
  37. package/dist/Interfaces/Cart/IPandaPayload.js +18 -18
  38. package/dist/Interfaces/Cart/IPaymentCard.d.ts +22 -22
  39. package/dist/Interfaces/Cart/IPaymentCard.js +44 -44
  40. package/dist/Interfaces/Cart/IPaypalPayload.d.ts +9 -9
  41. package/dist/Interfaces/Cart/IPaypalPayload.js +2 -2
  42. package/dist/Interfaces/Cart/IPaysafePayload.d.ts +72 -72
  43. package/dist/Interfaces/Cart/IPaysafePayload.js +2 -2
  44. package/dist/Interfaces/Cart/IStripePayload.d.ts +66 -66
  45. package/dist/Interfaces/Cart/IStripePayload.js +2 -2
  46. package/dist/Interfaces/Cart/index.d.ts +444 -439
  47. package/dist/Interfaces/Cart/index.js +197 -197
  48. package/dist/Interfaces/Cart/index.js.map +1 -1
  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 -114
  76. package/dist/Interfaces/Declination/index.js +66 -66
  77. package/dist/Interfaces/Declination/index.js.map +1 -1
  78. package/dist/Interfaces/Document/index.d.ts +8 -8
  79. package/dist/Interfaces/Document/index.js +2 -2
  80. package/dist/Interfaces/Elastic/index.d.ts +89 -89
  81. package/dist/Interfaces/Elastic/index.js +2 -2
  82. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.d.ts +11 -11
  83. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.js +2 -2
  84. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.d.ts +15 -15
  85. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.js +2 -2
  86. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.d.ts +12 -12
  87. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.js +2 -2
  88. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.d.ts +36 -36
  89. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.js +2 -2
  90. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.d.ts +12 -12
  91. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.js +2 -2
  92. package/dist/Interfaces/Email/CustomGR/ITransportEmail.d.ts +12 -12
  93. package/dist/Interfaces/Email/CustomGR/ITransportEmail.js +2 -2
  94. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.d.ts +12 -12
  95. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.js +2 -2
  96. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.d.ts +16 -16
  97. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.js +2 -2
  98. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.d.ts +15 -15
  99. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.js +2 -2
  100. package/dist/Interfaces/Email/IAbandonnedCartEmail.d.ts +29 -29
  101. package/dist/Interfaces/Email/IAbandonnedCartEmail.js +2 -2
  102. package/dist/Interfaces/Email/IAccountConfirmationEmail.d.ts +22 -22
  103. package/dist/Interfaces/Email/IAccountConfirmationEmail.js +2 -2
  104. package/dist/Interfaces/Email/IApplicationEmail.d.ts +19 -19
  105. package/dist/Interfaces/Email/IApplicationEmail.js +2 -2
  106. package/dist/Interfaces/Email/IBackInStockEmail.d.ts +21 -21
  107. package/dist/Interfaces/Email/IBackInStockEmail.js +2 -2
  108. package/dist/Interfaces/Email/IContactEmail.d.ts +20 -20
  109. package/dist/Interfaces/Email/IContactEmail.js +2 -2
  110. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.d.ts +15 -15
  111. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.js +2 -2
  112. package/dist/Interfaces/Email/ICustomerBookingEmail.d.ts +14 -14
  113. package/dist/Interfaces/Email/ICustomerBookingEmail.js +2 -2
  114. package/dist/Interfaces/Email/IEmail.d.ts +20 -20
  115. package/dist/Interfaces/Email/IEmail.js +60 -60
  116. package/dist/Interfaces/Email/IOrderConfirmationEmail.d.ts +47 -47
  117. package/dist/Interfaces/Email/IOrderConfirmationEmail.js +2 -2
  118. package/dist/Interfaces/Email/IPasswordResetEmail.d.ts +17 -17
  119. package/dist/Interfaces/Email/IPasswordResetEmail.js +2 -2
  120. package/dist/Interfaces/Email/IPhotoShootEmail.d.ts +14 -14
  121. package/dist/Interfaces/Email/IPhotoShootEmail.js +2 -2
  122. package/dist/Interfaces/Email/IPickupConfirmation.d.ts +23 -23
  123. package/dist/Interfaces/Email/IPickupConfirmation.js +2 -2
  124. package/dist/Interfaces/Email/IShippingConfirmation.d.ts +23 -23
  125. package/dist/Interfaces/Email/IShippingConfirmation.js +2 -2
  126. package/dist/Interfaces/Email/IWelcomeEmail.d.ts +19 -19
  127. package/dist/Interfaces/Email/IWelcomeEmail.js +2 -2
  128. package/dist/Interfaces/ExportSchema/index.d.ts +7 -7
  129. package/dist/Interfaces/ExportSchema/index.js +2 -2
  130. package/dist/Interfaces/ExternalService/BaseExternalService.d.ts +12 -12
  131. package/dist/Interfaces/ExternalService/BaseExternalService.js +2 -2
  132. package/dist/Interfaces/ExternalService/ExternalProductsService.d.ts +4 -4
  133. package/dist/Interfaces/ExternalService/ExternalProductsService.js +2 -2
  134. package/dist/Interfaces/ExternalService/index.d.ts +9 -9
  135. package/dist/Interfaces/ExternalService/index.js +2 -2
  136. package/dist/Interfaces/FirstOrderTracking/index.d.ts +5 -5
  137. package/dist/Interfaces/FirstOrderTracking/index.js +2 -2
  138. package/dist/Interfaces/G2/index.d.ts +556 -556
  139. package/dist/Interfaces/G2/index.js +38 -38
  140. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.d.ts +20 -20
  141. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.js +2 -2
  142. package/dist/Interfaces/Indexed/Product/index.d.ts +105 -103
  143. package/dist/Interfaces/Indexed/Product/index.js +253 -253
  144. package/dist/Interfaces/Indexed/Product/index.js.map +1 -1
  145. package/dist/Interfaces/Inventory/index.d.ts +19 -19
  146. package/dist/Interfaces/Inventory/index.js +8 -8
  147. package/dist/Interfaces/Invoice/index.d.ts +4 -4
  148. package/dist/Interfaces/Invoice/index.js +2 -2
  149. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.d.ts +3 -3
  150. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.js +2 -2
  151. package/dist/Interfaces/MarketplacePublication/index.d.ts +23 -23
  152. package/dist/Interfaces/MarketplacePublication/index.js +22 -22
  153. package/dist/Interfaces/Menu/index.d.ts +40 -40
  154. package/dist/Interfaces/Menu/index.js +16 -16
  155. package/dist/Interfaces/Note/index.d.ts +10 -10
  156. package/dist/Interfaces/Note/index.js +7 -7
  157. package/dist/Interfaces/Operations/ICreatedBy.d.ts +6 -6
  158. package/dist/Interfaces/Operations/ICreatedBy.js +2 -2
  159. package/dist/Interfaces/Operations/IUpdate.d.ts +5 -5
  160. package/dist/Interfaces/Operations/IUpdate.js +2 -2
  161. package/dist/Interfaces/Order/index.d.ts +4 -4
  162. package/dist/Interfaces/Order/index.js +2 -2
  163. package/dist/Interfaces/Org/IRelUser.d.ts +9 -9
  164. package/dist/Interfaces/Org/IRelUser.js +2 -2
  165. package/dist/Interfaces/Org/index.d.ts +29 -29
  166. package/dist/Interfaces/Org/index.js +12 -12
  167. package/dist/Interfaces/Payment/index.d.ts +26 -26
  168. package/dist/Interfaces/Payment/index.js +14 -14
  169. package/dist/Interfaces/Product/IAttributeFamily.d.ts +6 -6
  170. package/dist/Interfaces/Product/IAttributeFamily.js +2 -2
  171. package/dist/Interfaces/Product/IImportProduct.d.ts +42 -42
  172. package/dist/Interfaces/Product/IImportProduct.js +882 -882
  173. package/dist/Interfaces/Product/IInventoryItem.d.ts +74 -74
  174. package/dist/Interfaces/Product/IInventoryItem.js +38 -38
  175. package/dist/Interfaces/Product/IPricing.d.ts +177 -177
  176. package/dist/Interfaces/Product/IPricing.js +180 -180
  177. package/dist/Interfaces/Product/index.d.ts +138 -138
  178. package/dist/Interfaces/Product/index.js +64 -64
  179. package/dist/Interfaces/ProductAttribute/index.d.ts +11 -11
  180. package/dist/Interfaces/ProductAttribute/index.js +2 -2
  181. package/dist/Interfaces/PromiseToPurchase/BankType.d.ts +41 -41
  182. package/dist/Interfaces/PromiseToPurchase/BankType.js +41 -41
  183. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.d.ts +33 -33
  184. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.js +15 -15
  185. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.d.ts +19 -19
  186. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.js +2 -2
  187. package/dist/Interfaces/PromiseToPurchase/index.d.ts +50 -50
  188. package/dist/Interfaces/PromiseToPurchase/index.js +13 -13
  189. package/dist/Interfaces/PurchaseOrder/index.d.ts +17 -17
  190. package/dist/Interfaces/PurchaseOrder/index.js +2 -2
  191. package/dist/Interfaces/Query/IBrandQueryOptions.d.ts +11 -11
  192. package/dist/Interfaces/Query/IBrandQueryOptions.js +2 -2
  193. package/dist/Interfaces/Query/ICategoryQueryOptions.d.ts +11 -11
  194. package/dist/Interfaces/Query/ICategoryQueryOptions.js +2 -2
  195. package/dist/Interfaces/Query/IProductQueryOptions.d.ts +16 -16
  196. package/dist/Interfaces/Query/IProductQueryOptions.js +2 -2
  197. package/dist/Interfaces/Quote/index.d.ts +5 -5
  198. package/dist/Interfaces/Quote/index.js +2 -2
  199. package/dist/Interfaces/Refunds/index.d.ts +106 -106
  200. package/dist/Interfaces/Refunds/index.js +2 -2
  201. package/dist/Interfaces/Rules/IDiscountRule.d.ts +155 -155
  202. package/dist/Interfaces/Rules/IDiscountRule.js +114 -114
  203. package/dist/Interfaces/Schedule/index.d.ts +48 -48
  204. package/dist/Interfaces/Schedule/index.js +2 -2
  205. package/dist/Interfaces/Services/IAddServiceResponse.d.ts +4 -4
  206. package/dist/Interfaces/Services/IAddServiceResponse.js +2 -2
  207. package/dist/Interfaces/Services/IService.d.ts +16 -16
  208. package/dist/Interfaces/Services/IService.js +2 -2
  209. package/dist/Interfaces/Services/IServiceSecret.d.ts +8 -8
  210. package/dist/Interfaces/Services/IServiceSecret.js +2 -2
  211. package/dist/Interfaces/Shipping/Shipstation/carriers.d.ts +10 -10
  212. package/dist/Interfaces/Shipping/Shipstation/carriers.js +2 -2
  213. package/dist/Interfaces/Shipping/Shipstation/order.d.ts +227 -227
  214. package/dist/Interfaces/Shipping/Shipstation/order.js +2 -2
  215. package/dist/Interfaces/Shipping/Shipstation/quote.d.ts +31 -31
  216. package/dist/Interfaces/Shipping/Shipstation/quote.js +2 -2
  217. package/dist/Interfaces/Shipping/Shiptime/order.d.ts +54 -54
  218. package/dist/Interfaces/Shipping/Shiptime/order.js +71 -71
  219. package/dist/Interfaces/Shipping/Shiptime/quote.d.ts +111 -111
  220. package/dist/Interfaces/Shipping/Shiptime/quote.js +2 -2
  221. package/dist/Interfaces/Slider/GR.d.ts +114 -114
  222. package/dist/Interfaces/Slider/GR.js +271 -271
  223. package/dist/Interfaces/Slider/index.d.ts +30 -30
  224. package/dist/Interfaces/Slider/index.js +2 -2
  225. package/dist/Interfaces/Space/IExternalService.d.ts +53 -52
  226. package/dist/Interfaces/Space/IExternalService.js +44 -43
  227. package/dist/Interfaces/Space/IExternalService.js.map +1 -1
  228. package/dist/Interfaces/Space/IMember.d.ts +16 -16
  229. package/dist/Interfaces/Space/IMember.js +9 -9
  230. package/dist/Interfaces/Space/index.d.ts +405 -405
  231. package/dist/Interfaces/Space/index.js +174 -174
  232. package/dist/Interfaces/Specials/gr.d.ts +61 -61
  233. package/dist/Interfaces/Specials/gr.js +2 -2
  234. package/dist/Interfaces/StockNotification/index.d.ts +7 -7
  235. package/dist/Interfaces/StockNotification/index.js +2 -2
  236. package/dist/Interfaces/Store/index.d.ts +63 -63
  237. package/dist/Interfaces/Store/index.js +27 -27
  238. package/dist/Interfaces/Supplier/ICommand.d.ts +11 -11
  239. package/dist/Interfaces/Supplier/ICommand.js +2 -2
  240. package/dist/Interfaces/Supplier/index.d.ts +36 -36
  241. package/dist/Interfaces/Supplier/index.js +24 -24
  242. package/dist/Interfaces/TCG/index.d.ts +161 -161
  243. package/dist/Interfaces/TCG/index.js +54 -54
  244. package/dist/Interfaces/Tag/index.d.ts +18 -18
  245. package/dist/Interfaces/Tag/index.js +2 -2
  246. package/dist/Interfaces/Tax/index.d.ts +13 -13
  247. package/dist/Interfaces/Tax/index.js +2 -2
  248. package/dist/Interfaces/TransferRequest/index.d.ts +103 -103
  249. package/dist/Interfaces/TransferRequest/index.js +46 -46
  250. package/dist/Interfaces/Translation/index.d.ts +8 -8
  251. package/dist/Interfaces/Translation/index.js +5 -5
  252. package/dist/Interfaces/Update/index.d.ts +10 -10
  253. package/dist/Interfaces/Update/index.js +2 -2
  254. package/dist/Interfaces/User/IUser.d.ts +65 -65
  255. package/dist/Interfaces/User/IUser.js +8 -8
  256. package/dist/Interfaces/Version/index.d.ts +11 -11
  257. package/dist/Interfaces/Version/index.js +2 -2
  258. package/dist/Interfaces/Wishlist/index.d.ts +7 -7
  259. package/dist/Interfaces/Wishlist/index.js +2 -2
  260. package/dist/constants/Interfaces/IBaseApi.d.ts +15 -15
  261. package/dist/constants/Interfaces/IBaseApi.js +2 -2
  262. package/dist/constants/Interfaces/IEndpointResult.d.ts +9 -9
  263. package/dist/constants/Interfaces/IEndpointResult.js +2 -2
  264. package/dist/constants/enums.d.ts +6 -6
  265. package/dist/constants/enums.js +10 -10
  266. package/dist/constants/services.d.ts +2 -2
  267. package/dist/constants/services.js +117 -112
  268. package/dist/constants/services.js.map +1 -1
  269. package/dist/constants/version.d.ts +2 -2
  270. package/dist/constants/version.js +5 -5
  271. package/dist/index.d.ts +50 -50
  272. package/dist/index.js +266 -266
  273. package/dist/lib/Attribute/index.d.ts +14 -14
  274. package/dist/lib/Attribute/index.js +186 -186
  275. package/dist/lib/BGJob/index.d.ts +9 -9
  276. package/dist/lib/BGJob/index.js +216 -216
  277. package/dist/lib/BackgroundWorker/index.d.ts +34 -34
  278. package/dist/lib/BackgroundWorker/index.js +59 -59
  279. package/dist/lib/Blog/BlogArticle.d.ts +5 -5
  280. package/dist/lib/Blog/BlogArticle.js +10 -10
  281. package/dist/lib/Blog/BlogAuthor.d.ts +5 -5
  282. package/dist/lib/Blog/BlogAuthor.js +10 -10
  283. package/dist/lib/Blog/BlogCategory.d.ts +5 -5
  284. package/dist/lib/Blog/BlogCategory.js +10 -10
  285. package/dist/lib/Blog/BlogKeyword.d.ts +5 -5
  286. package/dist/lib/Blog/BlogKeyword.js +10 -10
  287. package/dist/lib/Booking/index.d.ts +85 -85
  288. package/dist/lib/Booking/index.js +596 -596
  289. package/dist/lib/Brand/index.d.ts +26 -26
  290. package/dist/lib/Brand/index.js +131 -131
  291. package/dist/lib/Cart/index.d.ts +335 -335
  292. package/dist/lib/Cart/index.js +3977 -3977
  293. package/dist/lib/CartReservedQuantities/index.d.ts +49 -49
  294. package/dist/lib/CartReservedQuantities/index.js +159 -159
  295. package/dist/lib/CashDrawerShift/index.d.ts +83 -83
  296. package/dist/lib/CashDrawerShift/index.js +205 -205
  297. package/dist/lib/Catalogue/index.d.ts +15 -15
  298. package/dist/lib/Catalogue/index.js +78 -78
  299. package/dist/lib/Category/index.d.ts +34 -34
  300. package/dist/lib/Category/index.js +230 -230
  301. package/dist/lib/Class/index.d.ts +16 -16
  302. package/dist/lib/Class/index.js +66 -66
  303. package/dist/lib/Consent/index.d.ts +4 -4
  304. package/dist/lib/Consent/index.js +29 -29
  305. package/dist/lib/Customer/index.d.ts +30 -30
  306. package/dist/lib/Customer/index.js +92 -92
  307. package/dist/lib/Declination/index.d.ts +9 -9
  308. package/dist/lib/Declination/index.js +26 -26
  309. package/dist/lib/Discount/index.d.ts +27 -27
  310. package/dist/lib/Discount/index.js +493 -493
  311. package/dist/lib/ElasticSearch/index.d.ts +13 -13
  312. package/dist/lib/ElasticSearch/index.js +50 -50
  313. package/dist/lib/Elavon/index.d.ts +18 -18
  314. package/dist/lib/Elavon/index.js +135 -135
  315. package/dist/lib/Email/AbandonedCartEmail.d.ts +16 -16
  316. package/dist/lib/Email/AbandonedCartEmail.js +24 -24
  317. package/dist/lib/Email/AccountConfirmationEmail.d.ts +19 -19
  318. package/dist/lib/Email/AccountConfirmationEmail.js +30 -30
  319. package/dist/lib/Email/AdminOrderConfirmationEmail.d.ts +16 -16
  320. package/dist/lib/Email/AdminOrderConfirmationEmail.js +24 -24
  321. package/dist/lib/Email/ApplicationEmail.d.ts +16 -16
  322. package/dist/lib/Email/ApplicationEmail.js +24 -24
  323. package/dist/lib/Email/BackInStockEmail.d.ts +16 -16
  324. package/dist/lib/Email/BackInStockEmail.js +24 -24
  325. package/dist/lib/Email/ContactEmail.d.ts +16 -16
  326. package/dist/lib/Email/ContactEmail.js +24 -24
  327. package/dist/lib/Email/CustomerBookingAdminEmail.d.ts +16 -16
  328. package/dist/lib/Email/CustomerBookingAdminEmail.js +24 -24
  329. package/dist/lib/Email/CustomerBookingEmail.d.ts +16 -16
  330. package/dist/lib/Email/CustomerBookingEmail.js +24 -24
  331. package/dist/lib/Email/OrderConfirmationEmail.d.ts +16 -16
  332. package/dist/lib/Email/OrderConfirmationEmail.js +24 -24
  333. package/dist/lib/Email/OrderDenounciationEmail.d.ts +16 -16
  334. package/dist/lib/Email/OrderDenounciationEmail.js +24 -24
  335. package/dist/lib/Email/OrderSampleEmail.d.ts +16 -16
  336. package/dist/lib/Email/OrderSampleEmail.js +24 -24
  337. package/dist/lib/Email/OtherTypeEmails.d.ts +16 -16
  338. package/dist/lib/Email/OtherTypeEmails.js +27 -27
  339. package/dist/lib/Email/PasswordResetEmail.d.ts +16 -16
  340. package/dist/lib/Email/PasswordResetEmail.js +24 -24
  341. package/dist/lib/Email/PhotoShootEmail.d.ts +16 -16
  342. package/dist/lib/Email/PhotoShootEmail.js +24 -24
  343. package/dist/lib/Email/PickUpConfirmation.d.ts +16 -16
  344. package/dist/lib/Email/PickUpConfirmation.js +24 -24
  345. package/dist/lib/Email/ShippingConfirmation.d.ts +16 -16
  346. package/dist/lib/Email/ShippingConfirmation.js +24 -24
  347. package/dist/lib/Email/WelcomeEmail.d.ts +16 -16
  348. package/dist/lib/Email/WelcomeEmail.js +24 -24
  349. package/dist/lib/Email/index.d.ts +16 -16
  350. package/dist/lib/Email/index.js +31 -31
  351. package/dist/lib/ExternalService/Ebay.d.ts +74 -74
  352. package/dist/lib/ExternalService/Ebay.js +124 -124
  353. package/dist/lib/ExternalService/index.d.ts +5 -5
  354. package/dist/lib/ExternalService/index.js +10 -10
  355. package/dist/lib/FirstOrderTracking/index.d.ts +5 -5
  356. package/dist/lib/FirstOrderTracking/index.js +10 -10
  357. package/dist/lib/Indexed/IndexedCart.d.ts +13 -13
  358. package/dist/lib/Indexed/IndexedCart.js +91 -91
  359. package/dist/lib/Indexed/Product.d.ts +17 -17
  360. package/dist/lib/Indexed/Product.js +98 -98
  361. package/dist/lib/Inventory/index.d.ts +112 -112
  362. package/dist/lib/Inventory/index.js +492 -492
  363. package/dist/lib/Invoice/index.d.ts +16 -16
  364. package/dist/lib/Invoice/index.js +21 -21
  365. package/dist/lib/MarketplacePublication/index.d.ts +9 -9
  366. package/dist/lib/MarketplacePublication/index.js +426 -426
  367. package/dist/lib/Menu/index.d.ts +11 -11
  368. package/dist/lib/Menu/index.js +107 -107
  369. package/dist/lib/MongoDB/BaseAPI.d.ts +18 -18
  370. package/dist/lib/MongoDB/BaseAPI.js +200 -200
  371. package/dist/lib/Note/index.d.ts +4 -4
  372. package/dist/lib/Note/index.js +6 -6
  373. package/dist/lib/Order/index.d.ts +27 -27
  374. package/dist/lib/Order/index.js +56 -56
  375. package/dist/lib/Org/index.d.ts +68 -68
  376. package/dist/lib/Org/index.js +216 -216
  377. package/dist/lib/PandaPay/index.d.ts +16 -16
  378. package/dist/lib/PandaPay/index.js +176 -176
  379. package/dist/lib/Paysafe/index.d.ts +11 -11
  380. package/dist/lib/Paysafe/index.js +41 -41
  381. package/dist/lib/Product/index.d.ts +182 -182
  382. package/dist/lib/Product/index.js +847 -847
  383. package/dist/lib/ProductAttribute/index.d.ts +15 -15
  384. package/dist/lib/ProductAttribute/index.js +45 -45
  385. package/dist/lib/PromiseToPurchase/index.d.ts +109 -109
  386. package/dist/lib/PromiseToPurchase/index.js +343 -343
  387. package/dist/lib/PurchaseOrder/index.d.ts +20 -20
  388. package/dist/lib/PurchaseOrder/index.js +28 -28
  389. package/dist/lib/Queue/index.d.ts +40 -40
  390. package/dist/lib/Queue/index.js +254 -254
  391. package/dist/lib/Schedule/index.d.ts +5 -5
  392. package/dist/lib/Schedule/index.js +12 -12
  393. package/dist/lib/Service/Enum/ServiceEnum.d.ts +3 -3
  394. package/dist/lib/Service/Enum/ServiceEnum.js +7 -7
  395. package/dist/lib/Service/index.d.ts +13 -13
  396. package/dist/lib/Service/index.js +21 -21
  397. package/dist/lib/Shipment/index.d.ts +28 -28
  398. package/dist/lib/Shipment/index.js +370 -370
  399. package/dist/lib/Slider/index.d.ts +22 -22
  400. package/dist/lib/Slider/index.js +119 -119
  401. package/dist/lib/Space/index.d.ts +1150 -1150
  402. package/dist/lib/Space/index.js +5792 -5792
  403. package/dist/lib/StockNotification/index.d.ts +4 -4
  404. package/dist/lib/StockNotification/index.js +6 -6
  405. package/dist/lib/Store/index.d.ts +5 -5
  406. package/dist/lib/Store/index.js +12 -12
  407. package/dist/lib/Supplier/Command.d.ts +5 -5
  408. package/dist/lib/Supplier/Command.js +10 -10
  409. package/dist/lib/Supplier/index.d.ts +25 -25
  410. package/dist/lib/Supplier/index.js +27 -27
  411. package/dist/lib/Tags/index.d.ts +6 -6
  412. package/dist/lib/Tags/index.js +26 -26
  413. package/dist/lib/Tax/index.d.ts +8 -8
  414. package/dist/lib/Tax/index.js +54 -54
  415. package/dist/lib/TransferRequest/index.d.ts +290 -290
  416. package/dist/lib/TransferRequest/index.js +1026 -1026
  417. package/dist/lib/Update/index.d.ts +10 -10
  418. package/dist/lib/Update/index.js +22 -22
  419. package/dist/lib/User/index.d.ts +89 -89
  420. package/dist/lib/User/index.js +328 -328
  421. package/dist/lib/Wishlist/index.d.ts +5 -5
  422. package/dist/lib/Wishlist/index.js +10 -10
  423. package/dist/lib/base.d.ts +14 -14
  424. package/dist/lib/base.js +62 -62
  425. package/dist/lib/baseService.d.ts +17 -17
  426. package/dist/lib/baseService.js +69 -69
  427. package/dist/rules/GR/constants/data.d.ts +26 -26
  428. package/dist/rules/GR/constants/data.js +81 -81
  429. package/dist/rules/GR/constants/expedition.d.ts +4 -4
  430. package/dist/rules/GR/constants/expedition.js +9 -9
  431. package/dist/rules/GR/constants/products.d.ts +22 -22
  432. package/dist/rules/GR/constants/products.js +263 -263
  433. package/dist/rules/GR/interfaces/cart.d.ts +84 -84
  434. package/dist/rules/GR/interfaces/cart.js +41 -41
  435. package/dist/rules/GR/interfaces/data.d.ts +101 -101
  436. package/dist/rules/GR/interfaces/data.js +114 -114
  437. package/dist/rules/GR/interfaces/products.d.ts +61 -61
  438. package/dist/rules/GR/interfaces/products.js +10 -10
  439. package/dist/rules/GR/utils/cart.d.ts +95 -95
  440. package/dist/rules/GR/utils/cart.js +836 -836
  441. package/dist/rules/GR/utils/data.d.ts +3 -3
  442. package/dist/rules/GR/utils/data.js +28 -28
  443. package/dist/rules/GR/utils/expedition.d.ts +140 -140
  444. package/dist/rules/GR/utils/expedition.js +2016 -2016
  445. package/dist/rules/GR/utils/g2.d.ts +209 -209
  446. package/dist/rules/GR/utils/g2.js +999 -999
  447. package/dist/rules/GR/utils/invoices.d.ts +51 -51
  448. package/dist/rules/GR/utils/invoices.js +215 -215
  449. package/dist/rules/GR/utils/products.d.ts +277 -277
  450. package/dist/rules/GR/utils/products.js +1350 -1350
  451. package/dist/rules/GR/utils/upsells.d.ts +111 -111
  452. package/dist/rules/GR/utils/upsells.js +215 -215
  453. package/dist/services/database/BaseProvider.d.ts +29 -29
  454. package/dist/services/database/BaseProvider.js +28 -28
  455. package/dist/services/database/BatchUtils.d.ts +14 -14
  456. package/dist/services/database/BatchUtils.js +43 -43
  457. package/dist/services/database/Config.d.ts +2 -2
  458. package/dist/services/database/Config.js +5 -5
  459. package/dist/services/database/DatabaseService.d.ts +125 -125
  460. package/dist/services/database/DatabaseService.js +237 -237
  461. package/dist/services/database/FirebaseProvider.d.ts +17 -17
  462. package/dist/services/database/FirebaseProvider.js +235 -235
  463. package/dist/services/database/NotFirebaseProvider.d.ts +49 -49
  464. package/dist/services/database/NotFirebaseProvider.js +262 -262
  465. package/dist/services/g2/G2OrderSlip.d.ts +49 -49
  466. package/dist/services/g2/G2OrderSlip.js +228 -228
  467. package/dist/services/g2/utils.d.ts +19 -19
  468. package/dist/services/g2/utils.js +953 -953
  469. package/dist/services/logs/index.d.ts +23 -23
  470. package/dist/services/logs/index.js +66 -66
  471. package/dist/services/marketplace/BaseMarketServiceClass.d.ts +52 -0
  472. package/dist/services/marketplace/BaseMarketServiceClass.js +112 -0
  473. package/dist/services/marketplace/BaseMarketServiceClass.js.map +1 -0
  474. package/dist/services/marketplace/CardtraderServiceClass.d.ts +17 -0
  475. package/dist/services/marketplace/CardtraderServiceClass.js +140 -0
  476. package/dist/services/marketplace/CardtraderServiceClass.js.map +1 -0
  477. package/dist/services/marketplace/utils.d.ts +14 -0
  478. package/dist/services/marketplace/utils.js +30 -0
  479. package/dist/services/marketplace/utils.js.map +1 -0
  480. package/dist/services/products/BaseClass.d.ts +50 -50
  481. package/dist/services/products/BaseClass.js +66 -66
  482. package/dist/services/products/TCGService.d.ts +32 -32
  483. package/dist/services/products/TCGService.js +555 -555
  484. package/dist/services/products/utils.d.ts +31 -31
  485. package/dist/services/products/utils.js +144 -144
  486. package/dist/utils/algolia.d.ts +46 -46
  487. package/dist/utils/algolia.js +21 -21
  488. package/dist/utils/anonymisation.d.ts +54 -54
  489. package/dist/utils/anonymisation.js +280 -280
  490. package/dist/utils/array.d.ts +5 -5
  491. package/dist/utils/array.js +14 -14
  492. package/dist/utils/aws.d.ts +36 -36
  493. package/dist/utils/aws.js +154 -154
  494. package/dist/utils/booking.d.ts +30 -30
  495. package/dist/utils/booking.js +127 -127
  496. package/dist/utils/cart.d.ts +259 -259
  497. package/dist/utils/cart.js +1145 -1145
  498. package/dist/utils/categories.d.ts +2 -2
  499. package/dist/utils/categories.js +54 -54
  500. package/dist/utils/cmv.d.ts +10 -10
  501. package/dist/utils/cmv.js +107 -107
  502. package/dist/utils/console.d.ts +6 -6
  503. package/dist/utils/console.js +59 -59
  504. package/dist/utils/context.d.ts +20 -20
  505. package/dist/utils/context.js +61 -61
  506. package/dist/utils/currency.d.ts +6 -6
  507. package/dist/utils/currency.js +91 -91
  508. package/dist/utils/data.d.ts +31 -31
  509. package/dist/utils/data.js +296 -296
  510. package/dist/utils/date.d.ts +1 -1
  511. package/dist/utils/date.js +16 -16
  512. package/dist/utils/dimensions.d.ts +3 -3
  513. package/dist/utils/dimensions.js +16 -16
  514. package/dist/utils/discount.d.ts +164 -164
  515. package/dist/utils/discount.js +1111 -1111
  516. package/dist/utils/errors.d.ts +113 -113
  517. package/dist/utils/errors.js +113 -113
  518. package/dist/utils/file-admin.d.ts +8 -8
  519. package/dist/utils/file-admin.js +39 -39
  520. package/dist/utils/file.d.ts +39 -39
  521. package/dist/utils/file.js +208 -208
  522. package/dist/utils/firebase-admin.d.ts +11 -11
  523. package/dist/utils/firebase-admin.js +73 -73
  524. package/dist/utils/firebase.d.ts +58 -58
  525. package/dist/utils/firebase.js +148 -148
  526. package/dist/utils/import.d.ts +1 -1
  527. package/dist/utils/import.js +21 -21
  528. package/dist/utils/inventories.d.ts +101 -101
  529. package/dist/utils/inventories.js +467 -467
  530. package/dist/utils/locale.d.ts +24 -24
  531. package/dist/utils/locale.js +89 -89
  532. package/dist/utils/mailchimp.d.ts +58 -58
  533. package/dist/utils/mailchimp.js +531 -531
  534. package/dist/utils/mathUtils.d.ts +17 -17
  535. package/dist/utils/mathUtils.js +324 -324
  536. package/dist/utils/mongodb.d.ts +1 -1
  537. package/dist/utils/mongodb.js +22 -22
  538. package/dist/utils/object.d.ts +32 -32
  539. package/dist/utils/object.js +133 -133
  540. package/dist/utils/payment.d.ts +10 -10
  541. package/dist/utils/payment.js +23 -23
  542. package/dist/utils/products.d.ts +39 -39
  543. package/dist/utils/products.js +195 -195
  544. package/dist/utils/promiseToPurchase.d.ts +88 -88
  545. package/dist/utils/promiseToPurchase.js +229 -229
  546. package/dist/utils/prosprsearch.d.ts +42 -42
  547. package/dist/utils/prosprsearch.js +216 -216
  548. package/dist/utils/refunds.d.ts +2 -2
  549. package/dist/utils/refunds.js +21 -21
  550. package/dist/utils/sdc.d.ts +10 -10
  551. package/dist/utils/sdc.js +1309 -1309
  552. package/dist/utils/searchIndexes.d.ts +58 -58
  553. package/dist/utils/searchIndexes.js +247 -247
  554. package/dist/utils/services.d.ts +42 -42
  555. package/dist/utils/services.js +409 -409
  556. package/dist/utils/shipment.d.ts +110 -110
  557. package/dist/utils/shipment.js +345 -345
  558. package/dist/utils/simpletexting.d.ts +2 -2
  559. package/dist/utils/simpletexting.js +45 -45
  560. package/dist/utils/sliders.d.ts +4 -4
  561. package/dist/utils/sliders.js +24 -24
  562. package/dist/utils/string.d.ts +16 -16
  563. package/dist/utils/string.js +192 -192
  564. package/dist/utils/tcgService.d.ts +74 -74
  565. package/dist/utils/tcgService.js +308 -308
  566. package/dist/utils/tools.d.ts +5 -5
  567. package/dist/utils/tools.js +13 -13
  568. package/dist/utils/transferRequests.d.ts +43 -43
  569. package/dist/utils/transferRequests.js +67 -67
  570. package/dist/utils/update.d.ts +7 -7
  571. package/dist/utils/update.js +137 -137
  572. package/dist/utils/weight.d.ts +3 -3
  573. package/dist/utils/weight.js +16 -16
  574. package/dist/utils/zones.d.ts +11 -11
  575. package/dist/utils/zones.js +218 -218
  576. package/package.json +107 -107
  577. package/publish.sh +143 -143
  578. package/readme.md +182 -182
  579. package/.env +0 -15
@@ -1,1000 +1,1000 @@
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.getCustomIncentiveInfo = exports.getDiscountRulesWithCustomIncentive = exports.getCustomIncentiveAmount = exports.checkForCustomPriceEquivalent = exports.isEscompteSuppItem = exports.buildEscompteSuppCartItem = exports.groupArrayOfItemsByItemAndCorrespondingEscompteItem = exports.getItemEscompteSupp = exports.getCustomPriceList = exports.fetchCustomPriceList = exports.getG2CustomerTypeFromCode = exports.getG2DiscountFromCode = exports.updateCustomerWithG2Info = exports.checkIfCustomerExistsInG2 = exports.transformG2CustomerToCustomer = exports.getAllNewOrUpdatedCustomersFromG2 = exports.getG2Customer = exports.fetchProductFromG2WithSku = exports.getG2ProductExternalValues = void 0;
18
- const uuid_1 = require("uuid");
19
- const crypto_js_1 = __importDefault(require("crypto-js"));
20
- const moment_1 = __importDefault(require("moment"));
21
- const maxBy_1 = __importDefault(require("lodash/maxBy"));
22
- const orderBy_1 = __importDefault(require("lodash/orderBy"));
23
- const toNumber_1 = __importDefault(require("lodash/toNumber"));
24
- const minBy_1 = __importDefault(require("lodash/minBy"));
25
- const uniqBy_1 = __importDefault(require("lodash/uniqBy"));
26
- const chunk_1 = __importDefault(require("lodash/chunk"));
27
- // Interfaces générales
28
- const Customer_1 = require("../../../Interfaces/Customer");
29
- const G2_1 = require("../../../Interfaces/G2");
30
- const Cart_1 = require("../../../Interfaces/Cart");
31
- // Utils généraux
32
- const data_1 = require("../../../utils/data");
33
- const object_1 = require("../../../utils/object");
34
- const context_1 = require("../../../utils/context");
35
- const locale_1 = require("../../../utils/locale");
36
- // Interfaces spécifiques
37
- const data_2 = require("../interfaces/data");
38
- const flatten_1 = __importDefault(require("lodash/flatten"));
39
- const groupBy_1 = __importDefault(require("lodash/groupBy"));
40
- const string_1 = require("../../../utils/string");
41
- const products_1 = require("../../../utils/products");
42
- const __1 = require("../../..");
43
- const anonymisation_1 = require("../../../utils/anonymisation");
44
- const discount_1 = require("../../../utils/discount");
45
- const cart_1 = require("../../../utils/cart");
46
- const round_1 = __importDefault(require("lodash/round"));
47
- const products_2 = require("../constants/products");
48
- const products_3 = require("./products");
49
- // ---------------------------------------------------------------------------------------------
50
- // #region PRODUCTS
51
- const getG2ProductExternalValues = async (sku, g2Service, space, org) => {
52
- var _a, _b, _c;
53
- const g2Auth = g2Service.external_service_infos.api;
54
- if (!!!g2Auth)
55
- return;
56
- let externalValues = undefined;
57
- try {
58
- // Fetch item from G2
59
- const productG2 = await (0, exports.fetchProductFromG2WithSku)(sku, space, org);
60
- if (!!productG2) {
61
- const noArticle = (_a = productG2.article.noArticle) !== null && _a !== void 0 ? _a : undefined;
62
- const catégorie1 = (_b = productG2.article['catégorie1']) !== null && _b !== void 0 ? _b : undefined;
63
- const catégorie2 = (_c = productG2.article['catégorie2']) !== null && _c !== void 0 ? _c : undefined;
64
- if (!!noArticle || !!catégorie1 || catégorie2) {
65
- externalValues = { noArticle, catégorie1, catégorie2 };
66
- }
67
- }
68
- return externalValues;
69
- }
70
- catch (e) {
71
- console.log('error on fetching external_values for sku from G2: ', e.toString());
72
- }
73
- };
74
- exports.getG2ProductExternalValues = getG2ProductExternalValues;
75
- const fetchProductFromG2WithSku = async (sku, space, org, logError) => {
76
- if (!!!space || !!!org)
77
- return;
78
- const api = __1.API_URL;
79
- const token = (0, context_1.getSpaceToken)(space, org);
80
- const callG2 = async (skuToUse) => {
81
- try {
82
- const g2ProductsQuery = await fetch(`${api}/services/g2/products/${skuToUse}`, {
83
- method: 'GET',
84
- headers: {
85
- 'Content-Type': 'application/json',
86
- Authorization: `Bearer ${token}`
87
- }
88
- });
89
- if (!!!g2ProductsQuery || g2ProductsQuery.status > 300)
90
- throw await g2ProductsQuery.json();
91
- const productG2 = await g2ProductsQuery.json();
92
- if (!!productG2 && productG2[0])
93
- return productG2[0];
94
- else
95
- throw 'Response has no value or array of products is empty.';
96
- }
97
- catch (e) {
98
- if (!!logError)
99
- console.log(`error on fetching prod from G2 for sku ${skuToUse}: `, e.toString());
100
- return;
101
- }
102
- };
103
- let g2Prod = await callG2(sku);
104
- // If no result was returned, and sku does not already include -1, call G2 again with added suffix
105
- if (!!!g2Prod && !sku.includes('-1')) {
106
- g2Prod = await callG2(`${sku}-1`);
107
- }
108
- return g2Prod;
109
- };
110
- exports.fetchProductFromG2WithSku = fetchProductFromG2WithSku;
111
- // #endregion
112
- // ---------------------------------------------------------------------------------------------
113
- // #region CUSTOMERS
114
- const getG2Customer = async (spaceToken, customerId) => {
115
- let allG2Customers = [];
116
- try {
117
- const api = __1.API_URL;
118
- const g2CustomersQuery = await fetch(`${api}/services/g2/customers/${customerId}`, {
119
- method: 'GET',
120
- headers: {
121
- 'Content-Type': 'application/json',
122
- Authorization: `Bearer ${spaceToken}`
123
- }
124
- });
125
- const G2RequestRes = await g2CustomersQuery.json();
126
- if (!!g2CustomersQuery.status && g2CustomersQuery.status !== 200)
127
- throw `Error - ${g2CustomersQuery.status}`;
128
- if (!!!G2RequestRes || !!!G2RequestRes.length)
129
- throw 'Error - no data';
130
- allG2Customers = G2RequestRes;
131
- }
132
- catch (e) {
133
- console.log('error on querying G2: ', e);
134
- }
135
- return allG2Customers;
136
- };
137
- exports.getG2Customer = getG2Customer;
138
- const getAllNewOrUpdatedCustomersFromG2 = async (space, allG2Customers) => {
139
- let allCurrentCustomers = [];
140
- try {
141
- const customerQuery = await space.customers.get();
142
- if (!!customerQuery && !!customerQuery.length)
143
- throw 'Error - no data';
144
- allCurrentCustomers = customerQuery.map((customer) => customer.data());
145
- }
146
- catch (e) {
147
- console.log('error on fetching customers: ', e.toString());
148
- return;
149
- }
150
- let allNewCustomers = [];
151
- let allUpdatedCustomers = [];
152
- for (let g2 of allG2Customers) {
153
- const sameCustomerInDb = allCurrentCustomers.find((c) => !!c.id && c.id.toUpperCase() === g2.client.noClient.toUpperCase());
154
- if (!!!sameCustomerInDb) {
155
- allNewCustomers.push((0, exports.transformG2CustomerToCustomer)(g2));
156
- continue;
157
- }
158
- if (!!(0, object_1.difference)(sameCustomerInDb, (0, exports.transformG2CustomerToCustomer)(g2))) {
159
- allUpdatedCustomers.push((0, exports.transformG2CustomerToCustomer)(g2, sameCustomerInDb));
160
- }
161
- }
162
- return { new: allNewCustomers, updated: allUpdatedCustomers };
163
- };
164
- exports.getAllNewOrUpdatedCustomersFromG2 = getAllNewOrUpdatedCustomersFromG2;
165
- const transformG2CustomerToCustomer = (g2Customer, prevCustomer, allGroups) => {
166
- const client = g2Customer.client;
167
- const getCustomerNameInfo = (aName) => {
168
- return {
169
- customer_firstname: aName.replace(/[0-9]/g, '').replace(/\-\-/g, '').split(' ')[0].trim(),
170
- customer_lastname: aName
171
- .replace(/[0-9]/g, '')
172
- .replace(/\-\-/g, '')
173
- .trim()
174
- .split(' ')
175
- .map((aString, key) => (!!!key ? undefined : aString))
176
- .filter((s) => !!s)
177
- .join(' '),
178
- customer_phone: aName.replace(/[^0-9]/g, '').trim()
179
- };
180
- };
181
- const getOtherCustomerInfo = (propsStr) => {
182
- const clientToCheck = client;
183
- if (!!!clientToCheck[propsStr])
184
- return {};
185
- const email = !!clientToCheck[`${propsStr}Email`] ? clientToCheck[`${propsStr}Email`].toLowerCase() : undefined;
186
- const fax = !!clientToCheck[`${propsStr}FAX`] ? (0, data_1.formatPhoneNumberDB)(clientToCheck[`${propsStr}FAX`]) : undefined;
187
- return Object.assign(Object.assign({}, (!!email
188
- ? {
189
- customer_email: email
190
- }
191
- : {
192
- customer_communicationPreference: 'phone'
193
- })), (!!fax
194
- ? {
195
- customer_photocopier: fax
196
- }
197
- : {}));
198
- };
199
- const getPrevCustomerAddress = (expeditionInfo) => {
200
- const defaultBilling = expeditionInfo.findIndex((ei) => ei.is_default && ei.is_default.includes(Customer_1.defaultExpeditionOptionsEnum.BILLING));
201
- if (defaultBilling !== -1) {
202
- return [
203
- ...expeditionInfo.slice(0, defaultBilling),
204
- Object.assign(Object.assign({}, expeditionInfo[defaultBilling]), { address: Object.assign(Object.assign({}, expeditionInfo[defaultBilling].address), getClientAddress()) }),
205
- ...expeditionInfo.slice(defaultBilling + 1)
206
- ];
207
- }
208
- return [
209
- ...expeditionInfo,
210
- {
211
- address: Object.assign(Object.assign({}, getClientAddress()), { id: (0, uuid_1.v4)() }),
212
- is_default: [Customer_1.defaultExpeditionOptionsEnum.BILLING],
213
- expedition_recipient_name: !!client.nom ? client.nom : '',
214
- expedition_recipient_phone: !!client.téléphone ? (0, data_1.formatPhoneNumberDB)(client.téléphone) : ''
215
- }
216
- ];
217
- };
218
- const getClientAddress = () => {
219
- return {
220
- city: client.ville,
221
- country: !!client.pays ? client.pays : 'CA',
222
- line1: client.adresse || '',
223
- postal_code: !!client.codePostal ? client.codePostal.toUpperCase() : '',
224
- state: client.province || ''
225
- };
226
- };
227
- const shouldCheckForCompany = () => {
228
- return !!client.nom || !!client.téléphone || !!client.personneRessourceComptes;
229
- };
230
- const defaultProGroup = 'aspirant';
231
- const getCustomerGroupFromTypeCode = (type) => {
232
- if (!!!allGroups)
233
- return defaultProGroup;
234
- const sameGroup = allGroups.find((g) => g.external_slug === type);
235
- return !!sameGroup ? sameGroup.slug : defaultProGroup;
236
- };
237
- // Mapping langue G2 -> Addio
238
- // G2: 1=Français, 2=Anglais
239
- // Addio: 'fr' | 'en' (default 'fr')
240
- const mapG2LangToAddioPreferredLang = (g2Lang) => {
241
- return g2Lang === 2 ? 'en' : 'fr';
242
- };
243
- const preferredLang = mapG2LangToAddioPreferredLang(client.langue);
244
- let customerWithNewInfo = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultCustomer)()), (!!prevCustomer ? prevCustomer : { id: client.noClient.toUpperCase() })), (!!!prevCustomer
245
- ? {
246
- hash: crypto_js_1.default.AES.encrypt(client.noClient.toUpperCase(), client.noClient.toUpperCase()).toString(),
247
- type: Customer_1.CustomerTypeEnum.COMPANY
248
- }
249
- : {})), (!!client.limiteDeCrédit && Math.round((0, toNumber_1.default)(client.limiteDeCrédit))
250
- ? {
251
- has_credit_line: true,
252
- credit_line_max: client.limiteDeCrédit
253
- // credit_line_used: ',
254
- }
255
- : {})), (!!client.noReprésentant ? { represented_by: client.noReprésentant } : {})), { basic_info: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), (!!prevCustomer ? prevCustomer.basic_info : { customer_type: Customer_1.BasicCustomerTypeEnum.PRO })), (!!client.email ? { customer_email: client.email.split(';')[0].toLowerCase() } : {})), (!!client.fax ? { customer_photocopier: client.fax } : {})), (!!client.personneRessourceVentes ? getCustomerNameInfo(client.personneRessourceVentes) : {})), (preferredLang ? { customer_prefered_lang: preferredLang } : {})), { customer_professionnal_info: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (!!prevCustomer ? prevCustomer.basic_info.customer_professionnal_info : {})), { professionnal_title: !!client.groupeDeClient && !!(0, exports.getG2CustomerTypeFromCode)(client.groupeDeClient)
256
- ? getCustomerGroupFromTypeCode((0, exports.getG2CustomerTypeFromCode)(client.groupeDeClient))
257
- : defaultProGroup, proof_doc_value: client.noClient.toUpperCase() }), (!!client.noCondition ? { terms_code: client.noCondition } : {})), (!!client.groupeDeClient ? { external_customer_group: client.groupeDeClient } : {})), (!!client.codeFA ? { external_customer_code: client.codeFA } : {})), (!!client.classePrix ? { external_price_class: client.classePrix.toString() } : {})), (!!client.classement5 ? { external_customer_class: client.classement5 } : {})) }) }), ((!!prevCustomer && !!prevCustomer.company_info) || shouldCheckForCompany()
258
- ? {
259
- company_info: Object.assign(Object.assign(Object.assign({}, (!!prevCustomer && !!prevCustomer.company_info ? prevCustomer.company_info : {})), { invoice_info: Object.assign(Object.assign(Object.assign({}, (!!prevCustomer && !!prevCustomer.company_info && !!prevCustomer.company_info.invoice_info
260
- ? prevCustomer.company_info.invoice_info
261
- : {})), { legal_name: !!client.nom ? client.nom : '' }), (!!client.téléphone ? { phone: (0, data_1.formatPhoneNumberDB)(client.téléphone) } : {})) }), (!!client.personneRessourceComptes || !!client.personneRessourceAutres
262
- ? {
263
- other_users: [
264
- ...(!!client.personneRessourceComptes
265
- ? [
266
- Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), getCustomerNameInfo(client.personneRessourceComptes)), getOtherCustomerInfo('personneRessourceComptes'))
267
- ]
268
- : []),
269
- ...(!!client.personneRessourceAutres
270
- ? [
271
- Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), getCustomerNameInfo(client.personneRessourceAutres)), getOtherCustomerInfo('personneRessourceAutres'))
272
- ]
273
- : [])
274
- ]
275
- }
276
- : {}))
277
- }
278
- : {})), { expedition_info: !!prevCustomer && prevCustomer.expedition_info && prevCustomer.expedition_info.length
279
- ? prevCustomer.expedition_info.length > 1
280
- ? getPrevCustomerAddress(prevCustomer.expedition_info)
281
- : [
282
- Object.assign(Object.assign({}, prevCustomer.expedition_info[0]), { address: Object.assign(Object.assign({}, (prevCustomer.expedition_info[0].address ? prevCustomer.expedition_info[0].address : {})), getClientAddress()), is_default: [
283
- ...(prevCustomer.expedition_info[0].is_default || []),
284
- ...(!!!prevCustomer.expedition_info[0].is_default ||
285
- !!!prevCustomer.expedition_info[0].is_default.includes(Customer_1.defaultExpeditionOptionsEnum.BILLING)
286
- ? [Customer_1.defaultExpeditionOptionsEnum.BILLING]
287
- : [])
288
- ] })
289
- ]
290
- : [
291
- {
292
- address: Object.assign(Object.assign({}, getClientAddress()), { id: (0, uuid_1.v4)() }),
293
- is_default: [Customer_1.defaultExpeditionOptionsEnum.BILLING],
294
- expedition_recipient_name: !!client.nom ? client.nom : '',
295
- expedition_recipient_phone: !!client.téléphone ? (0, data_1.formatPhoneNumberDB)(client.téléphone) : ''
296
- }
297
- ] });
298
- // If is test env, and anonymisation process was already done for customer, keep prev customer info for specific props
299
- if (!!__1.isTestEnv &&
300
- !!prevCustomer &&
301
- !!prevCustomer.basic_info.customer_email &&
302
- prevCustomer.basic_info.customer_email.includes('@dummy.com')) {
303
- const allPropsToReset = anonymisation_1.g2Properties.map((p) => p.path);
304
- for (let prop of allPropsToReset) {
305
- const prevValue = (0, object_1.recursiveCheckObject)(prevCustomer, prop);
306
- const currentValue = (0, object_1.recursiveCheckObject)(customerWithNewInfo, prop);
307
- if (prevValue == currentValue)
308
- continue;
309
- customerWithNewInfo = (0, object_1.recursiveSetObject)(customerWithNewInfo, prevValue, prop);
310
- }
311
- }
312
- return customerWithNewInfo;
313
- };
314
- exports.transformG2CustomerToCustomer = transformG2CustomerToCustomer;
315
- /**
316
- * Verifies if customer exists in G2.
317
- * @param customerID - Customer ID for G2 fetch
318
- * @param space - Space Object
319
- * @param org - Org Object
320
- */
321
- const checkIfCustomerExistsInG2 = async (customerID, space, org) => {
322
- try {
323
- const token = (0, context_1.getSpaceToken)(space, org);
324
- if (!!!token)
325
- throw new Error('no token found for space');
326
- const api = __1.API_URL;
327
- let response = await fetch(`${api}/services/g2/customers/${customerID}/exists`, {
328
- method: 'GET',
329
- headers: {
330
- 'Content-Type': 'application/json',
331
- Authorization: `Bearer ${token}`
332
- }
333
- });
334
- if (!!response.status && response.status !== 200)
335
- throw `Error - ${response.status}`;
336
- const { exists } = await response.json();
337
- return exists;
338
- }
339
- catch (e) {
340
- console.log('error on checking customer in G2: ', e.toString());
341
- return false;
342
- }
343
- };
344
- exports.checkIfCustomerExistsInG2 = checkIfCustomerExistsInG2;
345
- /**
346
- * Updates customer in database with new info found in G2.
347
- * @param customerID - Customer ID for G2 fetch
348
- * @param space - Space Object
349
- * @param org - Org Object
350
- * @param addToDB - if updated customer should be saved to database (defaults to true)
351
- * @param skipEmailCheck - if check for unique email should be skiped or not (defaults to false)
352
- */
353
- const updateCustomerWithG2Info = async (customerID, space, org, addToDB = true, skipEmailCheck = false) => {
354
- console.log('===============');
355
- console.log('in v2 sdk updateCustomerWithG2Info');
356
- try {
357
- const token = (0, context_1.getSpaceToken)(space, org);
358
- if (!!!token)
359
- return;
360
- const api = __1.API_URL;
361
- console.log('----------------------');
362
- let delay1 = (0, moment_1.default)();
363
- let updatedCustomerQuery = await fetch(`${api}/services/g2/customers/${customerID}/convert`, {
364
- method: 'GET',
365
- headers: {
366
- 'Content-Type': 'application/json',
367
- Authorization: `Bearer ${token}`
368
- }
369
- });
370
- console.log('called api to update customer delay: ', (0, moment_1.default)().diff(delay1, 'seconds'));
371
- if (!!updatedCustomerQuery.status && updatedCustomerQuery.status !== 200)
372
- throw `Error - ${updatedCustomerQuery.status}`;
373
- const G2RequestRes = await updatedCustomerQuery.json();
374
- if (!!!G2RequestRes)
375
- throw 'Error - no data';
376
- let updatedCustomer = (0, anonymisation_1.hideG2CustomerInfoIfNeeded)(G2RequestRes.customer);
377
- if (!!addToDB) {
378
- console.log('----------------------');
379
- let delay4 = (0, moment_1.default)();
380
- await space.addCustomer(updatedCustomer, undefined, skipEmailCheck);
381
- console.log('saving to database delay: ', (0, moment_1.default)().diff(delay4, 'seconds'));
382
- }
383
- console.log('=====================');
384
- return updatedCustomer;
385
- }
386
- catch (e) {
387
- console.log('error on updating customer info with G2: ', e.toString());
388
- return;
389
- }
390
- };
391
- exports.updateCustomerWithG2Info = updateCustomerWithG2Info;
392
- // #endregion
393
- // ---------------------------------------------------------------------------------------------
394
- // #region ESCOMPTES
395
- const getG2DiscountFromCode = (code) => {
396
- const onlyNb = code.replace(/[^0-9]/gi, '');
397
- return !!!onlyNb || !!isNaN(Number(onlyNb)) ? undefined : (0, toNumber_1.default)(onlyNb);
398
- };
399
- exports.getG2DiscountFromCode = getG2DiscountFromCode;
400
- const getG2CustomerTypeFromCode = (code) => {
401
- let parsedCode = code;
402
- // 1. Remove prefix
403
- const possiblePrefixes = ['BASE', 'PAYS', 'RENC'];
404
- for (let prefix of possiblePrefixes) {
405
- parsedCode = parsedCode.replace(prefix, '');
406
- }
407
- // 2. Remove numbers
408
- parsedCode = parsedCode.replace(/[0-9]/gi, '');
409
- // 3. Remove all non-wanted characters
410
- const possibleTypes = ['AM', 'AL', 'AS', 'AMN'];
411
- const checkWithPossibleTypes = (codeToCheck, removeFrom) => {
412
- if (!!!possibleTypes.includes(codeToCheck)) {
413
- if (codeToCheck.length === 1)
414
- return '';
415
- if (removeFrom == 'start') {
416
- return checkWithPossibleTypes(codeToCheck.substring(1), removeFrom);
417
- }
418
- else {
419
- return checkWithPossibleTypes(codeToCheck.replace(/.$/, ''), removeFrom);
420
- }
421
- }
422
- return codeToCheck;
423
- };
424
- if (!!parsedCode) {
425
- let removedValues = checkWithPossibleTypes(parsedCode, 'end');
426
- if (!!!removedValues)
427
- removedValues = checkWithPossibleTypes(parsedCode, 'start');
428
- parsedCode = removedValues;
429
- }
430
- return parsedCode;
431
- };
432
- exports.getG2CustomerTypeFromCode = getG2CustomerTypeFromCode;
433
- const fetchCustomPriceList = async (spaceToken, customerId, ignoreDashPriceList, onlyForProductSlugs) => {
434
- let prices = [];
435
- try {
436
- const api = __1.API_URL;
437
- const g2PriceListQuery = await fetch(`${api}/services/g2/customers/${customerId}/customPrices`, {
438
- method: 'POST',
439
- headers: {
440
- 'Content-Type': 'application/json',
441
- Authorization: `Bearer ${spaceToken}`
442
- },
443
- body: JSON.stringify(Object.assign({ ignoreDashPriceList: !!ignoreDashPriceList }, (!!onlyForProductSlugs ? { onlyForProductSlugs } : {})))
444
- });
445
- prices = await g2PriceListQuery.json();
446
- if (!!g2PriceListQuery.status && g2PriceListQuery.status !== 200)
447
- throw `Error - ${g2PriceListQuery.status}`;
448
- if (!!!prices || !!!prices.length)
449
- throw 'Error - no data';
450
- }
451
- catch (e) {
452
- console.log('error on fetching custom prices:', e.toString());
453
- }
454
- return prices;
455
- };
456
- exports.fetchCustomPriceList = fetchCustomPriceList;
457
- /**
458
- * Constructs a custom price list for a PRO Groupe Richer customer, based on data from G2 and AddioCommerce.
459
- * @param space - The space Object for appointed customer
460
- * @param idClient - The customer's G2 ID
461
- * @param ignoreDashPriceList - Optionnal. If customer group prices found in Addio should be ignored, and only G2 prices be considered.
462
- * @param onlyForProductSlugs - Optionnal. Array of skus for which the list should be generated (used to not go through all products in database if only certain products are needed)
463
- */
464
- const getCustomPriceList = async (space, idClient, ignoreDashPriceList, onlyForProductSlugs) => {
465
- let priceList = [];
466
- let escomptesClient = [];
467
- let ententesClient = [];
468
- // Fetch api info from space
469
- let G2Auth = '';
470
- let G2Url = '';
471
- const G2Service = space.services({ field: 'external_service_name', value: 'G2' });
472
- if (!!G2Service && !!G2Service.length) {
473
- G2Auth = G2Service[0].external_service_infos.api;
474
- G2Url = G2Service[0].external_service_infos.api_url;
475
- }
476
- if (!!!G2Auth || !!!G2Url)
477
- throw `Error on fetching G2 API info from space`;
478
- // -------------------------------------------------------------------
479
- // 0. Fetch customer from G2
480
- try {
481
- const customerReq = await fetch(`${G2Url}/clients?noClient=${idClient}`, {
482
- method: 'GET',
483
- headers: {
484
- Authorization: G2Auth
485
- }
486
- });
487
- const customers = await customerReq.json();
488
- if (customerReq.status !== 200) {
489
- throw `Error on fetching customers from G2 API: ${customerReq.status}`;
490
- }
491
- const allG2Customers = customers;
492
- const g2Customer = allG2Customers[0];
493
- if (!!!g2Customer)
494
- return priceList;
495
- // -------------------------------------------------------------------
496
- // #region 1. Fetch ententesClient from G2
497
- const today = (0, moment_1.default)();
498
- const allCurrentEntentes = g2Customer.soumissions.filter((s) => !!s.soumission.actif &&
499
- !!s.soumission.dateDébut &&
500
- !!s.soumission.dateFin &&
501
- today.isBetween((0, moment_1.default)(s.soumission.dateDébut), (0, moment_1.default)(s.soumission.dateFin)));
502
- const mostRecent = (0, orderBy_1.default)(allCurrentEntentes, (e) => (0, moment_1.default)(e.soumission.dateDébut).unix(), 'desc');
503
- if (!!mostRecent) {
504
- ententesClient = mostRecent;
505
- }
506
- // #endregion ---------------------------------------------------------
507
- // -------------------------------------------------------------------
508
- // #region 2. Fetch escomptesClient from G2
509
- const { noClient, groupeDeClient, classePrix } = g2Customer.client;
510
- const customerType = !!!groupeDeClient ? undefined : (0, exports.getG2CustomerTypeFromCode)(groupeDeClient);
511
- // const normalCustomerEscompte = !!!groupeDeClient ? undefined : getG2DiscountFromCode(groupeDeClient)
512
- try {
513
- // 2.a fetch escomptes with noClient
514
- const escomptesNumClient = await fetch(`${G2Url}/escompteclient?code=${noClient}`, {
515
- method: 'GET',
516
- headers: {
517
- Authorization: G2Auth
518
- }
519
- });
520
- const numClientResults = await escomptesNumClient.json();
521
- if (!!numClientResults.status && numClientResults.status !== 200) {
522
- console.log(`Error on fetching escompteClients from G2 API with noClient ${noClient}: ${numClientResults.status}`);
523
- }
524
- else {
525
- escomptesClient = [...escomptesClient, ...numClientResults.map((r) => r.escompteClient)];
526
- }
527
- }
528
- catch (e) {
529
- console.log('error on fetching escomptesClient from G2: ', e.toString());
530
- }
531
- try {
532
- // 2.b fetch escomptes with groupeDeClient
533
- // + added logic if groupeClient is same as noClient to no check twice same value
534
- // (happens with test G2 customers)
535
- if (!!groupeDeClient && groupeDeClient !== noClient) {
536
- const escomptesGroupeClient = await fetch(`${G2Url}/escompteclient?code=${groupeDeClient}`, {
537
- method: 'GET',
538
- headers: {
539
- Authorization: G2Auth
540
- }
541
- });
542
- const groupeClientResults = await escomptesGroupeClient.json();
543
- if (!!groupeClientResults.statuts && groupeClientResults.status !== 200) {
544
- console.log(`Error on fetching escompteClients from G2 API with groupeClient ${groupeDeClient}: ${groupeClientResults.status}`);
545
- }
546
- else {
547
- const groupeClientEscomptes = groupeClientResults.map((r) => r.escompteClient);
548
- // Specific user promos always have priority over "group" promos, so we filter out escomptes where code2 is found in numClientEscomptes
549
- const noDuplicates = groupeClientEscomptes.filter((es) => !!!es.code2 || !!!escomptesClient.some((e) => !!e.code2 && e.code2 === es.code2));
550
- escomptesClient = [...escomptesClient, ...noDuplicates];
551
- }
552
- }
553
- else {
554
- console.log('ignoring groupeClient escomptes because id and groupeClient are same');
555
- }
556
- }
557
- catch (e) {
558
- console.log('error on fetching escomptesClient from G2: ', e.toString());
559
- }
560
- // #endregion ---------------------------------------------------------
561
- // -------------------------------------------------------------------
562
- // #region 3. Fetch products (except drafts) from DB
563
- let allProducts = [];
564
- try {
565
- if (!!onlyForProductSlugs && !!onlyForProductSlugs.length) {
566
- if (onlyForProductSlugs.length <= 10) {
567
- allProducts = await space.indexedProducts.get({
568
- query: [{ field: 'slug', operator: 'in', value: onlyForProductSlugs }]
569
- });
570
- }
571
- else {
572
- const batchResults = [];
573
- for (let group of (0, chunk_1.default)(onlyForProductSlugs, 10)) {
574
- let query = await space.indexedProducts.get({
575
- query: [{ field: 'slug', operator: 'in', value: group }]
576
- });
577
- batchResults.push(query);
578
- }
579
- allProducts = (0, flatten_1.default)(batchResults);
580
- }
581
- }
582
- else {
583
- allProducts = await space.indexedProducts.get({
584
- query: [{ field: 'draft', operator: '!=', value: true }]
585
- });
586
- }
587
- }
588
- catch (e) {
589
- console.log('error on fetching all products : ', e.toString());
590
- }
591
- if (!!!allProducts.length)
592
- return priceList;
593
- // #endregion ---------------------------------------------------------
594
- // -------------------------------------------------------------------
595
- // #region 4. Check each product for custom price to push
596
- const allCustomerGroups = space.preferences.customers.groups() || [];
597
- const customerGroupByPriceClass = !!classePrix
598
- ? allCustomerGroups.find((g) => g.external_price_list_slug == classePrix.toString())
599
- : undefined;
600
- const allIncSkus = [];
601
- for (let prod of allProducts) {
602
- const data = prod.data();
603
- if (!!!data || !!data.draft)
604
- continue;
605
- const type = !!data.attributes && data.attributes[data_2.AttributesIdEnumGR.TYPE];
606
- for (let decli of data.declinations.filter((d) => !!!d.is_sample)) {
607
- // const isSpecificBetonProd =
608
- // !!decli.external_values && ['BOLDUC', 'RINOX', 'RICHER', 'OAKS'].includes(decli.external_values['catégorie2'])
609
- // let shouldApplyNormalEscompte = !!!data.is_service && !!isSpecificBetonProd
610
- let isNetPrice = !!decli.external_values && decli.external_values['catégorie2'] === 'NET';
611
- const sku = decli.sku;
612
- if (!!decli.external_values && decli.external_values['catégorie1'] === products_2.allInclusiveCategory) {
613
- allIncSkus.push(sku);
614
- }
615
- // Establish base price for sku ...
616
- let basePrice = (0, toNumber_1.default)(decli.regular_price.amount);
617
- // ... if groupeDeClient is set, check dashboard pricelist for pro price if !!!ignoreDashPriceList
618
- if (!!decli.prices_list && !!decli.prices_list.length && !!!ignoreDashPriceList) {
619
- let priceListItemToUse = undefined;
620
- // ... a. Check group with classe de prix
621
- const samePriceClassInPriceList = !!customerGroupByPriceClass
622
- ? decli.prices_list.find((pl) => pl.group_id == customerGroupByPriceClass.slug)
623
- : undefined;
624
- if (!!samePriceClassInPriceList && !isNaN((0, toNumber_1.default)(samePriceClassInPriceList.amount))) {
625
- priceListItemToUse = samePriceClassInPriceList;
626
- }
627
- // ... a. Check group with groupeDeClient
628
- else if (!!groupeDeClient) {
629
- const samePriceInPriceList = !!customerType
630
- ? decli.prices_list.find((p) => !!p.external_slug && p.external_slug === customerType)
631
- : undefined;
632
- const proPriceInPriceList = decli.prices_list.find((p) => p.group_id === 'aspirant');
633
- if (!!samePriceInPriceList && !isNaN((0, toNumber_1.default)(samePriceInPriceList.amount))) {
634
- priceListItemToUse = samePriceClassInPriceList;
635
- }
636
- else if (!!proPriceInPriceList && !isNaN((0, toNumber_1.default)(proPriceInPriceList.amount))) {
637
- priceListItemToUse = proPriceInPriceList;
638
- }
639
- }
640
- if (!!priceListItemToUse) {
641
- basePrice = (0, toNumber_1.default)(priceListItemToUse.amount);
642
- if (!!!isNetPrice) {
643
- // shouldApplyNormalEscompte = !!priceListItemToUse.custom_promo_applies && !!isSpecificBetonProd
644
- isNetPrice = !!priceListItemToUse.is_net_price;
645
- }
646
- }
647
- }
648
- // Array to stock all promos that could be applied for customer and declination
649
- // By default, contains regular price + regular escompted price
650
- let comparePrices = [
651
- Object.assign(Object.assign({ price: basePrice, type: G2_1.CustomPriceItemTypeEnum.REG }, (!!(0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie1')
652
- ? { code1: (0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie1') }
653
- : {})), (!!(0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie2')
654
- ? { code2: (0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie2') }
655
- : {}))
656
- ];
657
- // Other promo checks, if found, are added to comparePrices array
658
- // -------------------------------------------------------------------
659
- // #region 4.1 Check ententeClient for same sku
660
- let foundEntenteForProduct = false;
661
- if (!!ententesClient.length) {
662
- for (let entente of ententesClient) {
663
- if (!!foundEntenteForProduct)
664
- break;
665
- let sameProd = entente.articles.find((a) => !!a.article.noArticle && a.article.noArticle.toLowerCase() === sku.toLowerCase());
666
- if (!!!sameProd) {
667
- sameProd = entente.articles.find((a) => !!a.article.noArticle && a.article.noArticle.toLowerCase().includes(sku.toLowerCase()));
668
- }
669
- if (!!sameProd) {
670
- const priceToSet = typeof sameProd.article.prixUnitaireNet === 'number'
671
- ? sameProd.article.prixUnitaireNet
672
- : typeof sameProd.article.prixUnitaire === 'number'
673
- ? sameProd.article.prixUnitaire
674
- : undefined;
675
- if (typeof priceToSet === 'number') {
676
- foundEntenteForProduct = true;
677
- comparePrices.push(Object.assign(Object.assign({ price: (0, toNumber_1.default)(priceToSet), type: G2_1.CustomPriceItemTypeEnum.ENTENTE }, (!!decli.external_values ? { code2: decli.external_values['catégorie2'] } : {})), (!!sameProd.article.pourcEscompte
678
- ? Object.assign(Object.assign({}, (typeof sameProd.article.prixUnitaire === 'number'
679
- ? { reg: sameProd.article.prixUnitaire }
680
- : {})), { percent: sameProd.article.pourcEscompte }) : {})));
681
- }
682
- }
683
- }
684
- }
685
- // #endregion ---------------------------------------------------------
686
- // -------------------------------------------------------------------
687
- // #region 4.2 Check escompteClient array
688
- if (!!escomptesClient.length) {
689
- const findBestDeal = (escomptesToCheck) => {
690
- const bestDeal = (0, maxBy_1.default)(escomptesToCheck, (escompte) => (0, toNumber_1.default)(escompte.pourcEscompte));
691
- if (!!bestDeal) {
692
- comparePrices.push(Object.assign({ price: basePrice * ((100 - (0, toNumber_1.default)(bestDeal.pourcEscompte)) / 100), type: G2_1.CustomPriceItemTypeEnum.ESCOMPTE, percent: (0, toNumber_1.default)(bestDeal.pourcEscompte), code1: bestDeal.code1 }, (!!bestDeal.code2 ? { code2: bestDeal.code2 } : {})));
693
- }
694
- };
695
- // Check only if :
696
- // - foundEntenteForProduct = false (entente always has priority over escompte)
697
- if (!!!foundEntenteForProduct) {
698
- // If isNetPrice, check if escompte for cat1 DALLE is found for user. If so, apply escompte even if NET
699
- // ** WORKAROUND pour nouvelle logique GR où certains produits à prix NET dans G2 doivent pouvoir être escomptés dans certaines régions (ici à QC) **
700
- if (!!isNetPrice) {
701
- const sameCat1Escompte = escomptesClient.filter((e) => {
702
- if (!!!e.code2)
703
- return false;
704
- return decli.external_values && e.code2 === decli.external_values['catégorie1'] && e.code2 == 'DALLE';
705
- });
706
- if (!!sameCat1Escompte && !!sameCat1Escompte.length) {
707
- findBestDeal(sameCat1Escompte);
708
- }
709
- }
710
- else {
711
- // a. No 2nd code is found (applies to client or client group directly)
712
- const no2ndCode = escomptesClient.filter((e) => !!!e.code2);
713
- if (!!no2ndCode.length) {
714
- findBestDeal(no2ndCode);
715
- }
716
- // b. 2nd code is current sku && no entente was found for sku
717
- let sameSkuEscompte = escomptesClient.filter((e) => e.code2 && e.code2 === sku);
718
- if (!!!sameSkuEscompte.length) {
719
- sameSkuEscompte = escomptesClient.filter((e) => e.code2 && e.code2.includes(sku));
720
- }
721
- if (!!sameSkuEscompte.length) {
722
- findBestDeal(sameSkuEscompte);
723
- }
724
- // c. 2nd code is prod brand or type
725
- // Only check if no sameSkuEscompte found (precise promo always has precedence over "group" promo)
726
- if (!!!sameSkuEscompte.length) {
727
- const sameBrandEscompte = escomptesClient.filter((e) => {
728
- if (!!!e.code2)
729
- return;
730
- return (decli.external_values &&
731
- (e.code2 === decli.external_values['catégorie2'] || e.code2 === decli.external_values['catégorie1']));
732
- });
733
- if (!!sameBrandEscompte) {
734
- findBestDeal(sameBrandEscompte);
735
- }
736
- }
737
- }
738
- }
739
- }
740
- // #endregion ---------------------------------------------------------
741
- // -------------------------------------------------------------------
742
- // #region 4.3 Set price to apply to variable, ready to be pushed
743
- comparePrices = (0, uniqBy_1.default)(comparePrices, (p) => p.price);
744
- const lowestPrice = (0, minBy_1.default)(comparePrices, (p) => p.price);
745
- let appliedPrice;
746
- if (sku === products_2.installationAllInclusiveSku) {
747
- const ententeFound = comparePrices.find((p) => p.type === G2_1.CustomPriceItemTypeEnum.ENTENTE);
748
- appliedPrice = ententeFound;
749
- }
750
- else {
751
- appliedPrice = lowestPrice;
752
- // If lowestPrice is regular price and entente is found in product, override with entente price, even if amount is higher
753
- if (!!lowestPrice && lowestPrice.type == G2_1.CustomPriceItemTypeEnum.REG) {
754
- const ententeFound = comparePrices.find((p) => p.type == G2_1.CustomPriceItemTypeEnum.ENTENTE);
755
- // set reg props to entente price so both prices have same value, but keep all other props as entente
756
- if (!!ententeFound)
757
- appliedPrice = Object.assign(Object.assign({}, ententeFound), { reg: ententeFound.price });
758
- }
759
- }
760
- let customPriceItemToPush = undefined;
761
- if (!!appliedPrice) {
762
- customPriceItemToPush = Object.assign(Object.assign({ sku: sku, parent_slug: data.slug, name: `${!!decli.parent_name &&
763
- !!!(0, locale_1.getPrincipalWord)(decli.name, space).trim().includes((0, locale_1.getPrincipalWord)(decli.parent_name).trim())
764
- ? (0, locale_1.getPrincipalWord)(decli.name, space) + ' - '
765
- : ''}${(0, locale_1.getPrincipalWord)(decli.name, space)}`, reg: basePrice }, (!!type
766
- ? {
767
- prod_type: type[0]
768
- }
769
- : {})), appliedPrice);
770
- }
771
- // #endregion ---------------------------------------------------------
772
- // ----------------------------------------------------------------
773
- // 6. Push lowest price from comparePrice to priceList
774
- if (!!customPriceItemToPush) {
775
- priceList.push(customPriceItemToPush);
776
- }
777
- }
778
- }
779
- // #endregion ---------------------------------------------------------
780
- // -------------------------------------------------------------------
781
- // #region 5. Use ALLINC decli when all-inclusive installation is active
782
- if (!!allIncSkus.length && !!(0, products_3.getInstallationAllInclusiveFromPriceList)(priceList)) {
783
- priceList = priceList.map((item) => (allIncSkus.includes(item.sku) ? Object.assign(Object.assign({}, item), { price: 0 }) : item));
784
- }
785
- // #endregion ---------------------------------------------------------
786
- return priceList;
787
- }
788
- catch (e) {
789
- console.log('error on fetching customer from G2: ', e.toString());
790
- return e.toString();
791
- }
792
- };
793
- exports.getCustomPriceList = getCustomPriceList;
794
- /**
795
- * Get promise to purchase additionnal escompte equivalent from customPriceList for specific cart item
796
- * @param customPriceList - The pro customers custom price list
797
- * @param item - The cart item to check
798
- */
799
- const getItemEscompteSupp = (customPriceList, item) => {
800
- // Get catégorie 2 from item
801
- const code2InItem = (0, object_1.recursiveCheckObject)(item, `external_values.catégorie2`);
802
- // Get code2 from customPriceList item
803
- let code2InPriceList = undefined;
804
- const customPriceItem = customPriceList.find((priceItem) => priceItem.sku === item.sku);
805
- if (!!customPriceItem && !!customPriceItem.code2) {
806
- code2InPriceList = customPriceItem.code2;
807
- }
808
- // Use customPriceList item code2 if defined, else item's catégorie 2
809
- const code2ToCheck = code2InPriceList !== null && code2InPriceList !== void 0 ? code2InPriceList : code2InItem;
810
- if (!!!code2ToCheck)
811
- return;
812
- let foundEsc = customPriceList.find((priceItem) => priceItem.sku === 'ESC' + code2ToCheck);
813
- if (!!!foundEsc && !!code2InItem) {
814
- foundEsc = customPriceList.find((priceItem) => priceItem.sku === 'ESC' + code2InItem);
815
- }
816
- return foundEsc;
817
- };
818
- exports.getItemEscompteSupp = getItemEscompteSupp;
819
- const groupArrayOfItemsByItemAndCorrespondingEscompteItem = (items) => {
820
- return (0, flatten_1.default)(Object.values((0, groupBy_1.default)(items, (item) => ((0, exports.isEscompteSuppItem)(item.sku) ? (0, string_1.splitFromFirstChar)('-', item.sku)[1] : item.sku))));
821
- };
822
- exports.groupArrayOfItemsByItemAndCorrespondingEscompteItem = groupArrayOfItemsByItemAndCorrespondingEscompteItem;
823
- const buildEscompteSuppCartItem = (escompteItems, customPriceList, escompteSuppItem, item) => {
824
- if (!!!escompteItems[0])
825
- return;
826
- const priceToUse = (0, products_1.getLowestPrice)(item);
827
- const escompteDecli = escompteItems[0].data().declinations.find((decli) => decli.sku === escompteSuppItem.sku);
828
- if (!!!escompteDecli)
829
- return;
830
- // If esc supp found in price list has type reg price and has price of 0.00, it means the escompte does not apply to the customer
831
- const sameInCustomPriceList = customPriceList.find((c) => c.sku === escompteDecli.sku);
832
- if (!!sameInCustomPriceList &&
833
- sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG &&
834
- sameInCustomPriceList.price === 0)
835
- return;
836
- const escompteEquivalent = (0, exports.checkForCustomPriceEquivalent)(escompteDecli, customPriceList);
837
- return Object.assign(Object.assign({}, escompteEquivalent), { is_upsell_of_sku: item.sku, is_temp_prod: true, price_override: true, qte_override: true, qte: item.qte * priceToUse.price.amount, sku: `${escompteEquivalent.sku}-${item.sku}`, regular_price: (0, products_1.getLowestPrice)(escompteEquivalent).price });
838
- };
839
- exports.buildEscompteSuppCartItem = buildEscompteSuppCartItem;
840
- const isEscompteSuppItem = (itemSku) => {
841
- return Object.values(G2_1.EscomptesDeclinationSkusEnum).some((subString) => itemSku.includes(subString));
842
- };
843
- exports.isEscompteSuppItem = isEscompteSuppItem;
844
- // #endregion
845
- // ---------------------------------------------------------------------------------------------
846
- // #region FORMAT CART ITEMS
847
- /**
848
- * Adjusts prices in item provided with corresponding custom price list item, if it exists.
849
- * @param item - The cart item or indexed declination
850
- * @param customPriceList - The customers custom price list
851
- * @param options.removeTierPricing - Optionnal. If tier-pricing should be removed from item returned
852
- * @param options.setNetPriceAsRegular - Optionnal. If true and custom price found is NET (entente), sets the NET price as regular price (normaly set to discount_price)
853
- */
854
- const checkForCustomPriceEquivalent = (item, customPriceList, options = {}) => {
855
- var _a;
856
- const sameInCustomPriceList = customPriceList.find((i) => i.sku === item.sku);
857
- if (!!!sameInCustomPriceList)
858
- return item;
859
- // If price was already overridden and price found in customPriceList is of type regular, return
860
- const hasOverriddenPrice = item.price_override;
861
- if (!!hasOverriddenPrice && sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG)
862
- return item;
863
- if (item.sku === products_2.installationAllInclusiveSku)
864
- return item;
865
- const { regular_price, promo_price, discount_price, tier_pricing } = item, rest = __rest(item, ["regular_price", "promo_price", "discount_price", "tier_pricing"]);
866
- const isReg = sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG;
867
- const isEntente = sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.ENTENTE;
868
- const isPA = !!sameInCustomPriceList.PA_percent;
869
- const shouldUseCustomPriceForRegPrice = (!!isReg && !!!sameInCustomPriceList.percent) || (!!options.setNetPriceAsRegular && !!isEntente);
870
- // MODIF. FRAIS 2024 - Si le prix de la liste de prix est 0, et que le type du priceItem est REG ou ENTENTE, on pousse 0 comme valeur pour le prix régulier
871
- // Le code se chargera alors de retirer le frais de ceux ajoutés au panier si c'est le cas
872
- const currentDiscountPrice = item.discount_price || { currency: 'CAD' };
873
- const currentPromoPrice = item.promo_price || { currency: 'CAD' };
874
- const calculatedRegPrice = !!item.price_override
875
- ? regular_price.amount
876
- : (!!isReg || !!isEntente) && sameInCustomPriceList.price == 0
877
- ? 0
878
- : !!shouldUseCustomPriceForRegPrice
879
- ? sameInCustomPriceList.price
880
- : sameInCustomPriceList.reg;
881
- // #region RECREATE CART ITEM WITH UPDATED PRICES
882
- let updatedCartItem = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), {
883
- // a. Set regular price for product with price_type if not already defined
884
- regular_price: Object.assign(Object.assign(Object.assign({}, regular_price), { amount: calculatedRegPrice }), (sameInCustomPriceList.type !== G2_1.CustomPriceItemTypeEnum.REG && !!!regular_price.price_type
885
- ? { price_type: sameInCustomPriceList.type }
886
- : {})) }), (!!!hasOverriddenPrice
887
- ? Object.assign(Object.assign({}, (sameInCustomPriceList.percent || !!!isReg
888
- ? Object.assign({}, (!!sameInCustomPriceList.percent &&
889
- [G2_1.CustomPriceItemTypeEnum.ESCOMPTE, G2_1.CustomPriceItemTypeEnum.NORMAL_ESCOMPTE].includes(sameInCustomPriceList.type)
890
- ? {
891
- promo_price: Object.assign(Object.assign({}, currentPromoPrice), (!currentPromoPrice.overridden
892
- ? {
893
- amount: sameInCustomPriceList.price,
894
- price_type: sameInCustomPriceList.type
895
- }
896
- : {}))
897
- }
898
- : // c2. Add discount price data if custom price list item has no Net Price as regular price indicator.
899
- // ONLY if current discount price for item is not already overriden!
900
- !!!options.setNetPriceAsRegular
901
- ? Object.assign({ discount_price: Object.assign(Object.assign({}, currentDiscountPrice), (!currentDiscountPrice.overridden
902
- ? {
903
- amount: sameInCustomPriceList.price,
904
- price_type: sameInCustomPriceList.type
905
- }
906
- : {})) }, (!!currentPromoPrice.overridden ? { promo_price: currentPromoPrice } : {})) : {})) : // d. Add discount price data if price is tier pricing price and tier pricing should be kept for product
907
- currentDiscountPrice.price_type === 'tierpricing' && !!!options.removeTierPricing
908
- ? {
909
- discount_price: Object.assign(Object.assign({}, item.discount_price), { original_amount: !!isReg || !!!options.setNetPriceAsRegular ? null : sameInCustomPriceList.price })
910
- }
911
- : {})), (!!isPA
912
- ? {
913
- promo_price: Object.assign(Object.assign({}, currentPromoPrice), { amount: (_a = sameInCustomPriceList.PA_price) !== null && _a !== void 0 ? _a : sameInCustomPriceList.price, price_type: sameInCustomPriceList.type, percent_applied: sameInCustomPriceList.PA_percent }),
914
- discount_price: Object.assign(Object.assign({}, currentDiscountPrice), { amount: sameInCustomPriceList.price, price_type: sameInCustomPriceList.type, percent_applied: sameInCustomPriceList.percent })
915
- }
916
- : {})) : {})), (!!!options.removeTierPricing && !!tier_pricing
917
- ? {
918
- tier_pricing
919
- }
920
- : {}));
921
- // g. If promo price was overriden in POS, and discount_price or reg_price changed, recalculate promo price applied from percentage
922
- const priceUsedForPromoCalculations = !!updatedCartItem.discount_price
923
- ? updatedCartItem.discount_price.amount
924
- : updatedCartItem.regular_price.amount;
925
- const initialPriceToCompare = !!currentDiscountPrice ? currentDiscountPrice.amount : item.regular_price.amount;
926
- if (typeof currentPromoPrice.percent_applied == 'number' &&
927
- !!currentPromoPrice.overridden &&
928
- priceUsedForPromoCalculations != initialPriceToCompare) {
929
- updatedCartItem = Object.assign(Object.assign({}, updatedCartItem), { promo_price: Object.assign(Object.assign({}, (updatedCartItem.promo_price || { currency: 'CAD' })), { amount: (0, round_1.default)((0, cart_1.calculateAmountForCustomPromo)(updatedCartItem, Cart_1.CustomPromoType.EXTRA_PROMO, currentPromoPrice.percent_applied), priceUsedForPromoCalculations.toString().split('.').length) }) });
930
- }
931
- // #endregion
932
- return updatedCartItem;
933
- };
934
- exports.checkForCustomPriceEquivalent = checkForCustomPriceEquivalent;
935
- // #endregion
936
- // ---------------------------------------------------------------------------------------------
937
- // #region CUSTOM INCENTIVE
938
- const getCustomIncentiveAmount = (customPriceList) => {
939
- if (!!!customPriceList)
940
- return;
941
- const ententeSku = 'INCITATIF';
942
- let amount = 0;
943
- const entente = customPriceList.find((priceItem) => priceItem.sku === ententeSku);
944
- // Si l'incitatif n'est pas trouvé dans l'entente, ou correspond au prix "régulier", ne pas le retourner
945
- if (!!!entente || !!!entente.price || entente.type == G2_1.CustomPriceItemTypeEnum.REG)
946
- return;
947
- amount = entente.price * -100;
948
- return amount;
949
- };
950
- exports.getCustomIncentiveAmount = getCustomIncentiveAmount;
951
- const getDiscountRulesWithCustomIncentive = (incentiveAmount, discountRules) => {
952
- let hasBeenUpdated = false;
953
- const updatedDiscountRules = discountRules.map((rule) => {
954
- const promoType = (0, discount_1.getCartPromoType)(rule);
955
- if (promoType === Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES) {
956
- hasBeenUpdated = true;
957
- const updatedRule = rule;
958
- updatedRule.result.action_value = incentiveAmount;
959
- updatedRule.overridden = true;
960
- return updatedRule;
961
- }
962
- else {
963
- return rule;
964
- }
965
- });
966
- if (!hasBeenUpdated)
967
- return;
968
- return updatedDiscountRules;
969
- };
970
- exports.getDiscountRulesWithCustomIncentive = getDiscountRulesWithCustomIncentive;
971
- const getCustomIncentiveInfo = (customPriceList, discountRules, defaultIncentiveAmount) => {
972
- let discountRulesWithCustomIncentive;
973
- let customIncentiveAmount = (0, exports.getCustomIncentiveAmount)(customPriceList);
974
- const incentiveDiscountRule = (0, discount_1.getPaymentIncentiveDiscount)(discountRules);
975
- if (!!!customIncentiveAmount) {
976
- // If already overridden, reset incentive discount if no custom incentive found for customer
977
- if (!!incentiveDiscountRule && !!incentiveDiscountRule.overridden) {
978
- return {
979
- amount: defaultIncentiveAmount || 0,
980
- updatedDiscountRules: discountRules.map((dr) => {
981
- if (dr.id !== incentiveDiscountRule.id)
982
- return dr;
983
- return Object.assign(Object.assign(Object.assign({}, dr), (defaultIncentiveAmount ? { result: Object.assign(Object.assign({}, dr.result), { action_value: defaultIncentiveAmount }) } : {})), { overridden: false });
984
- }),
985
- reset: true
986
- };
987
- }
988
- return;
989
- }
990
- discountRulesWithCustomIncentive = (0, exports.getDiscountRulesWithCustomIncentive)(customIncentiveAmount, discountRules);
991
- if (!!!discountRulesWithCustomIncentive)
992
- return;
993
- return {
994
- amount: customIncentiveAmount,
995
- updatedDiscountRules: discountRulesWithCustomIncentive
996
- };
997
- };
998
- exports.getCustomIncentiveInfo = getCustomIncentiveInfo;
999
- // #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.getCustomIncentiveInfo = exports.getDiscountRulesWithCustomIncentive = exports.getCustomIncentiveAmount = exports.checkForCustomPriceEquivalent = exports.isEscompteSuppItem = exports.buildEscompteSuppCartItem = exports.groupArrayOfItemsByItemAndCorrespondingEscompteItem = exports.getItemEscompteSupp = exports.getCustomPriceList = exports.fetchCustomPriceList = exports.getG2CustomerTypeFromCode = exports.getG2DiscountFromCode = exports.updateCustomerWithG2Info = exports.checkIfCustomerExistsInG2 = exports.transformG2CustomerToCustomer = exports.getAllNewOrUpdatedCustomersFromG2 = exports.getG2Customer = exports.fetchProductFromG2WithSku = exports.getG2ProductExternalValues = void 0;
18
+ const uuid_1 = require("uuid");
19
+ const crypto_js_1 = __importDefault(require("crypto-js"));
20
+ const moment_1 = __importDefault(require("moment"));
21
+ const maxBy_1 = __importDefault(require("lodash/maxBy"));
22
+ const orderBy_1 = __importDefault(require("lodash/orderBy"));
23
+ const toNumber_1 = __importDefault(require("lodash/toNumber"));
24
+ const minBy_1 = __importDefault(require("lodash/minBy"));
25
+ const uniqBy_1 = __importDefault(require("lodash/uniqBy"));
26
+ const chunk_1 = __importDefault(require("lodash/chunk"));
27
+ // Interfaces générales
28
+ const Customer_1 = require("../../../Interfaces/Customer");
29
+ const G2_1 = require("../../../Interfaces/G2");
30
+ const Cart_1 = require("../../../Interfaces/Cart");
31
+ // Utils généraux
32
+ const data_1 = require("../../../utils/data");
33
+ const object_1 = require("../../../utils/object");
34
+ const context_1 = require("../../../utils/context");
35
+ const locale_1 = require("../../../utils/locale");
36
+ // Interfaces spécifiques
37
+ const data_2 = require("../interfaces/data");
38
+ const flatten_1 = __importDefault(require("lodash/flatten"));
39
+ const groupBy_1 = __importDefault(require("lodash/groupBy"));
40
+ const string_1 = require("../../../utils/string");
41
+ const products_1 = require("../../../utils/products");
42
+ const __1 = require("../../..");
43
+ const anonymisation_1 = require("../../../utils/anonymisation");
44
+ const discount_1 = require("../../../utils/discount");
45
+ const cart_1 = require("../../../utils/cart");
46
+ const round_1 = __importDefault(require("lodash/round"));
47
+ const products_2 = require("../constants/products");
48
+ const products_3 = require("./products");
49
+ // ---------------------------------------------------------------------------------------------
50
+ // #region PRODUCTS
51
+ const getG2ProductExternalValues = async (sku, g2Service, space, org) => {
52
+ var _a, _b, _c;
53
+ const g2Auth = g2Service.external_service_infos.api;
54
+ if (!!!g2Auth)
55
+ return;
56
+ let externalValues = undefined;
57
+ try {
58
+ // Fetch item from G2
59
+ const productG2 = await (0, exports.fetchProductFromG2WithSku)(sku, space, org);
60
+ if (!!productG2) {
61
+ const noArticle = (_a = productG2.article.noArticle) !== null && _a !== void 0 ? _a : undefined;
62
+ const catégorie1 = (_b = productG2.article['catégorie1']) !== null && _b !== void 0 ? _b : undefined;
63
+ const catégorie2 = (_c = productG2.article['catégorie2']) !== null && _c !== void 0 ? _c : undefined;
64
+ if (!!noArticle || !!catégorie1 || catégorie2) {
65
+ externalValues = { noArticle, catégorie1, catégorie2 };
66
+ }
67
+ }
68
+ return externalValues;
69
+ }
70
+ catch (e) {
71
+ console.log('error on fetching external_values for sku from G2: ', e.toString());
72
+ }
73
+ };
74
+ exports.getG2ProductExternalValues = getG2ProductExternalValues;
75
+ const fetchProductFromG2WithSku = async (sku, space, org, logError) => {
76
+ if (!!!space || !!!org)
77
+ return;
78
+ const api = __1.API_URL;
79
+ const token = (0, context_1.getSpaceToken)(space, org);
80
+ const callG2 = async (skuToUse) => {
81
+ try {
82
+ const g2ProductsQuery = await fetch(`${api}/services/g2/products/${skuToUse}`, {
83
+ method: 'GET',
84
+ headers: {
85
+ 'Content-Type': 'application/json',
86
+ Authorization: `Bearer ${token}`
87
+ }
88
+ });
89
+ if (!!!g2ProductsQuery || g2ProductsQuery.status > 300)
90
+ throw await g2ProductsQuery.json();
91
+ const productG2 = await g2ProductsQuery.json();
92
+ if (!!productG2 && productG2[0])
93
+ return productG2[0];
94
+ else
95
+ throw 'Response has no value or array of products is empty.';
96
+ }
97
+ catch (e) {
98
+ if (!!logError)
99
+ console.log(`error on fetching prod from G2 for sku ${skuToUse}: `, e.toString());
100
+ return;
101
+ }
102
+ };
103
+ let g2Prod = await callG2(sku);
104
+ // If no result was returned, and sku does not already include -1, call G2 again with added suffix
105
+ if (!!!g2Prod && !sku.includes('-1')) {
106
+ g2Prod = await callG2(`${sku}-1`);
107
+ }
108
+ return g2Prod;
109
+ };
110
+ exports.fetchProductFromG2WithSku = fetchProductFromG2WithSku;
111
+ // #endregion
112
+ // ---------------------------------------------------------------------------------------------
113
+ // #region CUSTOMERS
114
+ const getG2Customer = async (spaceToken, customerId) => {
115
+ let allG2Customers = [];
116
+ try {
117
+ const api = __1.API_URL;
118
+ const g2CustomersQuery = await fetch(`${api}/services/g2/customers/${customerId}`, {
119
+ method: 'GET',
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ Authorization: `Bearer ${spaceToken}`
123
+ }
124
+ });
125
+ const G2RequestRes = await g2CustomersQuery.json();
126
+ if (!!g2CustomersQuery.status && g2CustomersQuery.status !== 200)
127
+ throw `Error - ${g2CustomersQuery.status}`;
128
+ if (!!!G2RequestRes || !!!G2RequestRes.length)
129
+ throw 'Error - no data';
130
+ allG2Customers = G2RequestRes;
131
+ }
132
+ catch (e) {
133
+ console.log('error on querying G2: ', e);
134
+ }
135
+ return allG2Customers;
136
+ };
137
+ exports.getG2Customer = getG2Customer;
138
+ const getAllNewOrUpdatedCustomersFromG2 = async (space, allG2Customers) => {
139
+ let allCurrentCustomers = [];
140
+ try {
141
+ const customerQuery = await space.customers.get();
142
+ if (!!customerQuery && !!customerQuery.length)
143
+ throw 'Error - no data';
144
+ allCurrentCustomers = customerQuery.map((customer) => customer.data());
145
+ }
146
+ catch (e) {
147
+ console.log('error on fetching customers: ', e.toString());
148
+ return;
149
+ }
150
+ let allNewCustomers = [];
151
+ let allUpdatedCustomers = [];
152
+ for (let g2 of allG2Customers) {
153
+ const sameCustomerInDb = allCurrentCustomers.find((c) => !!c.id && c.id.toUpperCase() === g2.client.noClient.toUpperCase());
154
+ if (!!!sameCustomerInDb) {
155
+ allNewCustomers.push((0, exports.transformG2CustomerToCustomer)(g2));
156
+ continue;
157
+ }
158
+ if (!!(0, object_1.difference)(sameCustomerInDb, (0, exports.transformG2CustomerToCustomer)(g2))) {
159
+ allUpdatedCustomers.push((0, exports.transformG2CustomerToCustomer)(g2, sameCustomerInDb));
160
+ }
161
+ }
162
+ return { new: allNewCustomers, updated: allUpdatedCustomers };
163
+ };
164
+ exports.getAllNewOrUpdatedCustomersFromG2 = getAllNewOrUpdatedCustomersFromG2;
165
+ const transformG2CustomerToCustomer = (g2Customer, prevCustomer, allGroups) => {
166
+ const client = g2Customer.client;
167
+ const getCustomerNameInfo = (aName) => {
168
+ return {
169
+ customer_firstname: aName.replace(/[0-9]/g, '').replace(/\-\-/g, '').split(' ')[0].trim(),
170
+ customer_lastname: aName
171
+ .replace(/[0-9]/g, '')
172
+ .replace(/\-\-/g, '')
173
+ .trim()
174
+ .split(' ')
175
+ .map((aString, key) => (!!!key ? undefined : aString))
176
+ .filter((s) => !!s)
177
+ .join(' '),
178
+ customer_phone: aName.replace(/[^0-9]/g, '').trim()
179
+ };
180
+ };
181
+ const getOtherCustomerInfo = (propsStr) => {
182
+ const clientToCheck = client;
183
+ if (!!!clientToCheck[propsStr])
184
+ return {};
185
+ const email = !!clientToCheck[`${propsStr}Email`] ? clientToCheck[`${propsStr}Email`].toLowerCase() : undefined;
186
+ const fax = !!clientToCheck[`${propsStr}FAX`] ? (0, data_1.formatPhoneNumberDB)(clientToCheck[`${propsStr}FAX`]) : undefined;
187
+ return Object.assign(Object.assign({}, (!!email
188
+ ? {
189
+ customer_email: email
190
+ }
191
+ : {
192
+ customer_communicationPreference: 'phone'
193
+ })), (!!fax
194
+ ? {
195
+ customer_photocopier: fax
196
+ }
197
+ : {}));
198
+ };
199
+ const getPrevCustomerAddress = (expeditionInfo) => {
200
+ const defaultBilling = expeditionInfo.findIndex((ei) => ei.is_default && ei.is_default.includes(Customer_1.defaultExpeditionOptionsEnum.BILLING));
201
+ if (defaultBilling !== -1) {
202
+ return [
203
+ ...expeditionInfo.slice(0, defaultBilling),
204
+ Object.assign(Object.assign({}, expeditionInfo[defaultBilling]), { address: Object.assign(Object.assign({}, expeditionInfo[defaultBilling].address), getClientAddress()) }),
205
+ ...expeditionInfo.slice(defaultBilling + 1)
206
+ ];
207
+ }
208
+ return [
209
+ ...expeditionInfo,
210
+ {
211
+ address: Object.assign(Object.assign({}, getClientAddress()), { id: (0, uuid_1.v4)() }),
212
+ is_default: [Customer_1.defaultExpeditionOptionsEnum.BILLING],
213
+ expedition_recipient_name: !!client.nom ? client.nom : '',
214
+ expedition_recipient_phone: !!client.téléphone ? (0, data_1.formatPhoneNumberDB)(client.téléphone) : ''
215
+ }
216
+ ];
217
+ };
218
+ const getClientAddress = () => {
219
+ return {
220
+ city: client.ville,
221
+ country: !!client.pays ? client.pays : 'CA',
222
+ line1: client.adresse || '',
223
+ postal_code: !!client.codePostal ? client.codePostal.toUpperCase() : '',
224
+ state: client.province || ''
225
+ };
226
+ };
227
+ const shouldCheckForCompany = () => {
228
+ return !!client.nom || !!client.téléphone || !!client.personneRessourceComptes;
229
+ };
230
+ const defaultProGroup = 'aspirant';
231
+ const getCustomerGroupFromTypeCode = (type) => {
232
+ if (!!!allGroups)
233
+ return defaultProGroup;
234
+ const sameGroup = allGroups.find((g) => g.external_slug === type);
235
+ return !!sameGroup ? sameGroup.slug : defaultProGroup;
236
+ };
237
+ // Mapping langue G2 -> Addio
238
+ // G2: 1=Français, 2=Anglais
239
+ // Addio: 'fr' | 'en' (default 'fr')
240
+ const mapG2LangToAddioPreferredLang = (g2Lang) => {
241
+ return g2Lang === 2 ? 'en' : 'fr';
242
+ };
243
+ const preferredLang = mapG2LangToAddioPreferredLang(client.langue);
244
+ let customerWithNewInfo = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultCustomer)()), (!!prevCustomer ? prevCustomer : { id: client.noClient.toUpperCase() })), (!!!prevCustomer
245
+ ? {
246
+ hash: crypto_js_1.default.AES.encrypt(client.noClient.toUpperCase(), client.noClient.toUpperCase()).toString(),
247
+ type: Customer_1.CustomerTypeEnum.COMPANY
248
+ }
249
+ : {})), (!!client.limiteDeCrédit && Math.round((0, toNumber_1.default)(client.limiteDeCrédit))
250
+ ? {
251
+ has_credit_line: true,
252
+ credit_line_max: client.limiteDeCrédit
253
+ // credit_line_used: ',
254
+ }
255
+ : {})), (!!client.noReprésentant ? { represented_by: client.noReprésentant } : {})), { basic_info: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), (!!prevCustomer ? prevCustomer.basic_info : { customer_type: Customer_1.BasicCustomerTypeEnum.PRO })), (!!client.email ? { customer_email: client.email.split(';')[0].toLowerCase() } : {})), (!!client.fax ? { customer_photocopier: client.fax } : {})), (!!client.personneRessourceVentes ? getCustomerNameInfo(client.personneRessourceVentes) : {})), (preferredLang ? { customer_prefered_lang: preferredLang } : {})), { customer_professionnal_info: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (!!prevCustomer ? prevCustomer.basic_info.customer_professionnal_info : {})), { professionnal_title: !!client.groupeDeClient && !!(0, exports.getG2CustomerTypeFromCode)(client.groupeDeClient)
256
+ ? getCustomerGroupFromTypeCode((0, exports.getG2CustomerTypeFromCode)(client.groupeDeClient))
257
+ : defaultProGroup, proof_doc_value: client.noClient.toUpperCase() }), (!!client.noCondition ? { terms_code: client.noCondition } : {})), (!!client.groupeDeClient ? { external_customer_group: client.groupeDeClient } : {})), (!!client.codeFA ? { external_customer_code: client.codeFA } : {})), (!!client.classePrix ? { external_price_class: client.classePrix.toString() } : {})), (!!client.classement5 ? { external_customer_class: client.classement5 } : {})) }) }), ((!!prevCustomer && !!prevCustomer.company_info) || shouldCheckForCompany()
258
+ ? {
259
+ company_info: Object.assign(Object.assign(Object.assign({}, (!!prevCustomer && !!prevCustomer.company_info ? prevCustomer.company_info : {})), { invoice_info: Object.assign(Object.assign(Object.assign({}, (!!prevCustomer && !!prevCustomer.company_info && !!prevCustomer.company_info.invoice_info
260
+ ? prevCustomer.company_info.invoice_info
261
+ : {})), { legal_name: !!client.nom ? client.nom : '' }), (!!client.téléphone ? { phone: (0, data_1.formatPhoneNumberDB)(client.téléphone) } : {})) }), (!!client.personneRessourceComptes || !!client.personneRessourceAutres
262
+ ? {
263
+ other_users: [
264
+ ...(!!client.personneRessourceComptes
265
+ ? [
266
+ Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), getCustomerNameInfo(client.personneRessourceComptes)), getOtherCustomerInfo('personneRessourceComptes'))
267
+ ]
268
+ : []),
269
+ ...(!!client.personneRessourceAutres
270
+ ? [
271
+ Object.assign(Object.assign(Object.assign({}, (0, Customer_1.getDefaultBasicCustomer)()), getCustomerNameInfo(client.personneRessourceAutres)), getOtherCustomerInfo('personneRessourceAutres'))
272
+ ]
273
+ : [])
274
+ ]
275
+ }
276
+ : {}))
277
+ }
278
+ : {})), { expedition_info: !!prevCustomer && prevCustomer.expedition_info && prevCustomer.expedition_info.length
279
+ ? prevCustomer.expedition_info.length > 1
280
+ ? getPrevCustomerAddress(prevCustomer.expedition_info)
281
+ : [
282
+ Object.assign(Object.assign({}, prevCustomer.expedition_info[0]), { address: Object.assign(Object.assign({}, (prevCustomer.expedition_info[0].address ? prevCustomer.expedition_info[0].address : {})), getClientAddress()), is_default: [
283
+ ...(prevCustomer.expedition_info[0].is_default || []),
284
+ ...(!!!prevCustomer.expedition_info[0].is_default ||
285
+ !!!prevCustomer.expedition_info[0].is_default.includes(Customer_1.defaultExpeditionOptionsEnum.BILLING)
286
+ ? [Customer_1.defaultExpeditionOptionsEnum.BILLING]
287
+ : [])
288
+ ] })
289
+ ]
290
+ : [
291
+ {
292
+ address: Object.assign(Object.assign({}, getClientAddress()), { id: (0, uuid_1.v4)() }),
293
+ is_default: [Customer_1.defaultExpeditionOptionsEnum.BILLING],
294
+ expedition_recipient_name: !!client.nom ? client.nom : '',
295
+ expedition_recipient_phone: !!client.téléphone ? (0, data_1.formatPhoneNumberDB)(client.téléphone) : ''
296
+ }
297
+ ] });
298
+ // If is test env, and anonymisation process was already done for customer, keep prev customer info for specific props
299
+ if (!!__1.isTestEnv &&
300
+ !!prevCustomer &&
301
+ !!prevCustomer.basic_info.customer_email &&
302
+ prevCustomer.basic_info.customer_email.includes('@dummy.com')) {
303
+ const allPropsToReset = anonymisation_1.g2Properties.map((p) => p.path);
304
+ for (let prop of allPropsToReset) {
305
+ const prevValue = (0, object_1.recursiveCheckObject)(prevCustomer, prop);
306
+ const currentValue = (0, object_1.recursiveCheckObject)(customerWithNewInfo, prop);
307
+ if (prevValue == currentValue)
308
+ continue;
309
+ customerWithNewInfo = (0, object_1.recursiveSetObject)(customerWithNewInfo, prevValue, prop);
310
+ }
311
+ }
312
+ return customerWithNewInfo;
313
+ };
314
+ exports.transformG2CustomerToCustomer = transformG2CustomerToCustomer;
315
+ /**
316
+ * Verifies if customer exists in G2.
317
+ * @param customerID - Customer ID for G2 fetch
318
+ * @param space - Space Object
319
+ * @param org - Org Object
320
+ */
321
+ const checkIfCustomerExistsInG2 = async (customerID, space, org) => {
322
+ try {
323
+ const token = (0, context_1.getSpaceToken)(space, org);
324
+ if (!!!token)
325
+ throw new Error('no token found for space');
326
+ const api = __1.API_URL;
327
+ let response = await fetch(`${api}/services/g2/customers/${customerID}/exists`, {
328
+ method: 'GET',
329
+ headers: {
330
+ 'Content-Type': 'application/json',
331
+ Authorization: `Bearer ${token}`
332
+ }
333
+ });
334
+ if (!!response.status && response.status !== 200)
335
+ throw `Error - ${response.status}`;
336
+ const { exists } = await response.json();
337
+ return exists;
338
+ }
339
+ catch (e) {
340
+ console.log('error on checking customer in G2: ', e.toString());
341
+ return false;
342
+ }
343
+ };
344
+ exports.checkIfCustomerExistsInG2 = checkIfCustomerExistsInG2;
345
+ /**
346
+ * Updates customer in database with new info found in G2.
347
+ * @param customerID - Customer ID for G2 fetch
348
+ * @param space - Space Object
349
+ * @param org - Org Object
350
+ * @param addToDB - if updated customer should be saved to database (defaults to true)
351
+ * @param skipEmailCheck - if check for unique email should be skiped or not (defaults to false)
352
+ */
353
+ const updateCustomerWithG2Info = async (customerID, space, org, addToDB = true, skipEmailCheck = false) => {
354
+ console.log('===============');
355
+ console.log('in v2 sdk updateCustomerWithG2Info');
356
+ try {
357
+ const token = (0, context_1.getSpaceToken)(space, org);
358
+ if (!!!token)
359
+ return;
360
+ const api = __1.API_URL;
361
+ console.log('----------------------');
362
+ let delay1 = (0, moment_1.default)();
363
+ let updatedCustomerQuery = await fetch(`${api}/services/g2/customers/${customerID}/convert`, {
364
+ method: 'GET',
365
+ headers: {
366
+ 'Content-Type': 'application/json',
367
+ Authorization: `Bearer ${token}`
368
+ }
369
+ });
370
+ console.log('called api to update customer delay: ', (0, moment_1.default)().diff(delay1, 'seconds'));
371
+ if (!!updatedCustomerQuery.status && updatedCustomerQuery.status !== 200)
372
+ throw `Error - ${updatedCustomerQuery.status}`;
373
+ const G2RequestRes = await updatedCustomerQuery.json();
374
+ if (!!!G2RequestRes)
375
+ throw 'Error - no data';
376
+ let updatedCustomer = (0, anonymisation_1.hideG2CustomerInfoIfNeeded)(G2RequestRes.customer);
377
+ if (!!addToDB) {
378
+ console.log('----------------------');
379
+ let delay4 = (0, moment_1.default)();
380
+ await space.addCustomer(updatedCustomer, undefined, skipEmailCheck);
381
+ console.log('saving to database delay: ', (0, moment_1.default)().diff(delay4, 'seconds'));
382
+ }
383
+ console.log('=====================');
384
+ return updatedCustomer;
385
+ }
386
+ catch (e) {
387
+ console.log('error on updating customer info with G2: ', e.toString());
388
+ return;
389
+ }
390
+ };
391
+ exports.updateCustomerWithG2Info = updateCustomerWithG2Info;
392
+ // #endregion
393
+ // ---------------------------------------------------------------------------------------------
394
+ // #region ESCOMPTES
395
+ const getG2DiscountFromCode = (code) => {
396
+ const onlyNb = code.replace(/[^0-9]/gi, '');
397
+ return !!!onlyNb || !!isNaN(Number(onlyNb)) ? undefined : (0, toNumber_1.default)(onlyNb);
398
+ };
399
+ exports.getG2DiscountFromCode = getG2DiscountFromCode;
400
+ const getG2CustomerTypeFromCode = (code) => {
401
+ let parsedCode = code;
402
+ // 1. Remove prefix
403
+ const possiblePrefixes = ['BASE', 'PAYS', 'RENC'];
404
+ for (let prefix of possiblePrefixes) {
405
+ parsedCode = parsedCode.replace(prefix, '');
406
+ }
407
+ // 2. Remove numbers
408
+ parsedCode = parsedCode.replace(/[0-9]/gi, '');
409
+ // 3. Remove all non-wanted characters
410
+ const possibleTypes = ['AM', 'AL', 'AS', 'AMN'];
411
+ const checkWithPossibleTypes = (codeToCheck, removeFrom) => {
412
+ if (!!!possibleTypes.includes(codeToCheck)) {
413
+ if (codeToCheck.length === 1)
414
+ return '';
415
+ if (removeFrom == 'start') {
416
+ return checkWithPossibleTypes(codeToCheck.substring(1), removeFrom);
417
+ }
418
+ else {
419
+ return checkWithPossibleTypes(codeToCheck.replace(/.$/, ''), removeFrom);
420
+ }
421
+ }
422
+ return codeToCheck;
423
+ };
424
+ if (!!parsedCode) {
425
+ let removedValues = checkWithPossibleTypes(parsedCode, 'end');
426
+ if (!!!removedValues)
427
+ removedValues = checkWithPossibleTypes(parsedCode, 'start');
428
+ parsedCode = removedValues;
429
+ }
430
+ return parsedCode;
431
+ };
432
+ exports.getG2CustomerTypeFromCode = getG2CustomerTypeFromCode;
433
+ const fetchCustomPriceList = async (spaceToken, customerId, ignoreDashPriceList, onlyForProductSlugs) => {
434
+ let prices = [];
435
+ try {
436
+ const api = __1.API_URL;
437
+ const g2PriceListQuery = await fetch(`${api}/services/g2/customers/${customerId}/customPrices`, {
438
+ method: 'POST',
439
+ headers: {
440
+ 'Content-Type': 'application/json',
441
+ Authorization: `Bearer ${spaceToken}`
442
+ },
443
+ body: JSON.stringify(Object.assign({ ignoreDashPriceList: !!ignoreDashPriceList }, (!!onlyForProductSlugs ? { onlyForProductSlugs } : {})))
444
+ });
445
+ prices = await g2PriceListQuery.json();
446
+ if (!!g2PriceListQuery.status && g2PriceListQuery.status !== 200)
447
+ throw `Error - ${g2PriceListQuery.status}`;
448
+ if (!!!prices || !!!prices.length)
449
+ throw 'Error - no data';
450
+ }
451
+ catch (e) {
452
+ console.log('error on fetching custom prices:', e.toString());
453
+ }
454
+ return prices;
455
+ };
456
+ exports.fetchCustomPriceList = fetchCustomPriceList;
457
+ /**
458
+ * Constructs a custom price list for a PRO Groupe Richer customer, based on data from G2 and AddioCommerce.
459
+ * @param space - The space Object for appointed customer
460
+ * @param idClient - The customer's G2 ID
461
+ * @param ignoreDashPriceList - Optionnal. If customer group prices found in Addio should be ignored, and only G2 prices be considered.
462
+ * @param onlyForProductSlugs - Optionnal. Array of skus for which the list should be generated (used to not go through all products in database if only certain products are needed)
463
+ */
464
+ const getCustomPriceList = async (space, idClient, ignoreDashPriceList, onlyForProductSlugs) => {
465
+ let priceList = [];
466
+ let escomptesClient = [];
467
+ let ententesClient = [];
468
+ // Fetch api info from space
469
+ let G2Auth = '';
470
+ let G2Url = '';
471
+ const G2Service = space.services({ field: 'external_service_name', value: 'G2' });
472
+ if (!!G2Service && !!G2Service.length) {
473
+ G2Auth = G2Service[0].external_service_infos.api;
474
+ G2Url = G2Service[0].external_service_infos.api_url;
475
+ }
476
+ if (!!!G2Auth || !!!G2Url)
477
+ throw `Error on fetching G2 API info from space`;
478
+ // -------------------------------------------------------------------
479
+ // 0. Fetch customer from G2
480
+ try {
481
+ const customerReq = await fetch(`${G2Url}/clients?noClient=${idClient}`, {
482
+ method: 'GET',
483
+ headers: {
484
+ Authorization: G2Auth
485
+ }
486
+ });
487
+ const customers = await customerReq.json();
488
+ if (customerReq.status !== 200) {
489
+ throw `Error on fetching customers from G2 API: ${customerReq.status}`;
490
+ }
491
+ const allG2Customers = customers;
492
+ const g2Customer = allG2Customers[0];
493
+ if (!!!g2Customer)
494
+ return priceList;
495
+ // -------------------------------------------------------------------
496
+ // #region 1. Fetch ententesClient from G2
497
+ const today = (0, moment_1.default)();
498
+ const allCurrentEntentes = g2Customer.soumissions.filter((s) => !!s.soumission.actif &&
499
+ !!s.soumission.dateDébut &&
500
+ !!s.soumission.dateFin &&
501
+ today.isBetween((0, moment_1.default)(s.soumission.dateDébut), (0, moment_1.default)(s.soumission.dateFin)));
502
+ const mostRecent = (0, orderBy_1.default)(allCurrentEntentes, (e) => (0, moment_1.default)(e.soumission.dateDébut).unix(), 'desc');
503
+ if (!!mostRecent) {
504
+ ententesClient = mostRecent;
505
+ }
506
+ // #endregion ---------------------------------------------------------
507
+ // -------------------------------------------------------------------
508
+ // #region 2. Fetch escomptesClient from G2
509
+ const { noClient, groupeDeClient, classePrix } = g2Customer.client;
510
+ const customerType = !!!groupeDeClient ? undefined : (0, exports.getG2CustomerTypeFromCode)(groupeDeClient);
511
+ // const normalCustomerEscompte = !!!groupeDeClient ? undefined : getG2DiscountFromCode(groupeDeClient)
512
+ try {
513
+ // 2.a fetch escomptes with noClient
514
+ const escomptesNumClient = await fetch(`${G2Url}/escompteclient?code=${noClient}`, {
515
+ method: 'GET',
516
+ headers: {
517
+ Authorization: G2Auth
518
+ }
519
+ });
520
+ const numClientResults = await escomptesNumClient.json();
521
+ if (!!numClientResults.status && numClientResults.status !== 200) {
522
+ console.log(`Error on fetching escompteClients from G2 API with noClient ${noClient}: ${numClientResults.status}`);
523
+ }
524
+ else {
525
+ escomptesClient = [...escomptesClient, ...numClientResults.map((r) => r.escompteClient)];
526
+ }
527
+ }
528
+ catch (e) {
529
+ console.log('error on fetching escomptesClient from G2: ', e.toString());
530
+ }
531
+ try {
532
+ // 2.b fetch escomptes with groupeDeClient
533
+ // + added logic if groupeClient is same as noClient to no check twice same value
534
+ // (happens with test G2 customers)
535
+ if (!!groupeDeClient && groupeDeClient !== noClient) {
536
+ const escomptesGroupeClient = await fetch(`${G2Url}/escompteclient?code=${groupeDeClient}`, {
537
+ method: 'GET',
538
+ headers: {
539
+ Authorization: G2Auth
540
+ }
541
+ });
542
+ const groupeClientResults = await escomptesGroupeClient.json();
543
+ if (!!groupeClientResults.statuts && groupeClientResults.status !== 200) {
544
+ console.log(`Error on fetching escompteClients from G2 API with groupeClient ${groupeDeClient}: ${groupeClientResults.status}`);
545
+ }
546
+ else {
547
+ const groupeClientEscomptes = groupeClientResults.map((r) => r.escompteClient);
548
+ // Specific user promos always have priority over "group" promos, so we filter out escomptes where code2 is found in numClientEscomptes
549
+ const noDuplicates = groupeClientEscomptes.filter((es) => !!!es.code2 || !!!escomptesClient.some((e) => !!e.code2 && e.code2 === es.code2));
550
+ escomptesClient = [...escomptesClient, ...noDuplicates];
551
+ }
552
+ }
553
+ else {
554
+ console.log('ignoring groupeClient escomptes because id and groupeClient are same');
555
+ }
556
+ }
557
+ catch (e) {
558
+ console.log('error on fetching escomptesClient from G2: ', e.toString());
559
+ }
560
+ // #endregion ---------------------------------------------------------
561
+ // -------------------------------------------------------------------
562
+ // #region 3. Fetch products (except drafts) from DB
563
+ let allProducts = [];
564
+ try {
565
+ if (!!onlyForProductSlugs && !!onlyForProductSlugs.length) {
566
+ if (onlyForProductSlugs.length <= 10) {
567
+ allProducts = await space.indexedProducts.get({
568
+ query: [{ field: 'slug', operator: 'in', value: onlyForProductSlugs }]
569
+ });
570
+ }
571
+ else {
572
+ const batchResults = [];
573
+ for (let group of (0, chunk_1.default)(onlyForProductSlugs, 10)) {
574
+ let query = await space.indexedProducts.get({
575
+ query: [{ field: 'slug', operator: 'in', value: group }]
576
+ });
577
+ batchResults.push(query);
578
+ }
579
+ allProducts = (0, flatten_1.default)(batchResults);
580
+ }
581
+ }
582
+ else {
583
+ allProducts = await space.indexedProducts.get({
584
+ query: [{ field: 'draft', operator: '!=', value: true }]
585
+ });
586
+ }
587
+ }
588
+ catch (e) {
589
+ console.log('error on fetching all products : ', e.toString());
590
+ }
591
+ if (!!!allProducts.length)
592
+ return priceList;
593
+ // #endregion ---------------------------------------------------------
594
+ // -------------------------------------------------------------------
595
+ // #region 4. Check each product for custom price to push
596
+ const allCustomerGroups = space.preferences.customers.groups() || [];
597
+ const customerGroupByPriceClass = !!classePrix
598
+ ? allCustomerGroups.find((g) => g.external_price_list_slug == classePrix.toString())
599
+ : undefined;
600
+ const allIncSkus = [];
601
+ for (let prod of allProducts) {
602
+ const data = prod.data();
603
+ if (!!!data || !!data.draft)
604
+ continue;
605
+ const type = !!data.attributes && data.attributes[data_2.AttributesIdEnumGR.TYPE];
606
+ for (let decli of data.declinations.filter((d) => !!!d.is_sample)) {
607
+ // const isSpecificBetonProd =
608
+ // !!decli.external_values && ['BOLDUC', 'RINOX', 'RICHER', 'OAKS'].includes(decli.external_values['catégorie2'])
609
+ // let shouldApplyNormalEscompte = !!!data.is_service && !!isSpecificBetonProd
610
+ let isNetPrice = !!decli.external_values && decli.external_values['catégorie2'] === 'NET';
611
+ const sku = decli.sku;
612
+ if (!!decli.external_values && decli.external_values['catégorie1'] === products_2.allInclusiveCategory) {
613
+ allIncSkus.push(sku);
614
+ }
615
+ // Establish base price for sku ...
616
+ let basePrice = (0, toNumber_1.default)(decli.regular_price.amount);
617
+ // ... if groupeDeClient is set, check dashboard pricelist for pro price if !!!ignoreDashPriceList
618
+ if (!!decli.prices_list && !!decli.prices_list.length && !!!ignoreDashPriceList) {
619
+ let priceListItemToUse = undefined;
620
+ // ... a. Check group with classe de prix
621
+ const samePriceClassInPriceList = !!customerGroupByPriceClass
622
+ ? decli.prices_list.find((pl) => pl.group_id == customerGroupByPriceClass.slug)
623
+ : undefined;
624
+ if (!!samePriceClassInPriceList && !isNaN((0, toNumber_1.default)(samePriceClassInPriceList.amount))) {
625
+ priceListItemToUse = samePriceClassInPriceList;
626
+ }
627
+ // ... a. Check group with groupeDeClient
628
+ else if (!!groupeDeClient) {
629
+ const samePriceInPriceList = !!customerType
630
+ ? decli.prices_list.find((p) => !!p.external_slug && p.external_slug === customerType)
631
+ : undefined;
632
+ const proPriceInPriceList = decli.prices_list.find((p) => p.group_id === 'aspirant');
633
+ if (!!samePriceInPriceList && !isNaN((0, toNumber_1.default)(samePriceInPriceList.amount))) {
634
+ priceListItemToUse = samePriceClassInPriceList;
635
+ }
636
+ else if (!!proPriceInPriceList && !isNaN((0, toNumber_1.default)(proPriceInPriceList.amount))) {
637
+ priceListItemToUse = proPriceInPriceList;
638
+ }
639
+ }
640
+ if (!!priceListItemToUse) {
641
+ basePrice = (0, toNumber_1.default)(priceListItemToUse.amount);
642
+ if (!!!isNetPrice) {
643
+ // shouldApplyNormalEscompte = !!priceListItemToUse.custom_promo_applies && !!isSpecificBetonProd
644
+ isNetPrice = !!priceListItemToUse.is_net_price;
645
+ }
646
+ }
647
+ }
648
+ // Array to stock all promos that could be applied for customer and declination
649
+ // By default, contains regular price + regular escompted price
650
+ let comparePrices = [
651
+ Object.assign(Object.assign({ price: basePrice, type: G2_1.CustomPriceItemTypeEnum.REG }, (!!(0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie1')
652
+ ? { code1: (0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie1') }
653
+ : {})), (!!(0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie2')
654
+ ? { code2: (0, object_1.recursiveCheckObject)(decli, 'external_values.catégorie2') }
655
+ : {}))
656
+ ];
657
+ // Other promo checks, if found, are added to comparePrices array
658
+ // -------------------------------------------------------------------
659
+ // #region 4.1 Check ententeClient for same sku
660
+ let foundEntenteForProduct = false;
661
+ if (!!ententesClient.length) {
662
+ for (let entente of ententesClient) {
663
+ if (!!foundEntenteForProduct)
664
+ break;
665
+ let sameProd = entente.articles.find((a) => !!a.article.noArticle && a.article.noArticle.toLowerCase() === sku.toLowerCase());
666
+ if (!!!sameProd) {
667
+ sameProd = entente.articles.find((a) => !!a.article.noArticle && a.article.noArticle.toLowerCase().includes(sku.toLowerCase()));
668
+ }
669
+ if (!!sameProd) {
670
+ const priceToSet = typeof sameProd.article.prixUnitaireNet === 'number'
671
+ ? sameProd.article.prixUnitaireNet
672
+ : typeof sameProd.article.prixUnitaire === 'number'
673
+ ? sameProd.article.prixUnitaire
674
+ : undefined;
675
+ if (typeof priceToSet === 'number') {
676
+ foundEntenteForProduct = true;
677
+ comparePrices.push(Object.assign(Object.assign({ price: (0, toNumber_1.default)(priceToSet), type: G2_1.CustomPriceItemTypeEnum.ENTENTE }, (!!decli.external_values ? { code2: decli.external_values['catégorie2'] } : {})), (!!sameProd.article.pourcEscompte
678
+ ? Object.assign(Object.assign({}, (typeof sameProd.article.prixUnitaire === 'number'
679
+ ? { reg: sameProd.article.prixUnitaire }
680
+ : {})), { percent: sameProd.article.pourcEscompte }) : {})));
681
+ }
682
+ }
683
+ }
684
+ }
685
+ // #endregion ---------------------------------------------------------
686
+ // -------------------------------------------------------------------
687
+ // #region 4.2 Check escompteClient array
688
+ if (!!escomptesClient.length) {
689
+ const findBestDeal = (escomptesToCheck) => {
690
+ const bestDeal = (0, maxBy_1.default)(escomptesToCheck, (escompte) => (0, toNumber_1.default)(escompte.pourcEscompte));
691
+ if (!!bestDeal) {
692
+ comparePrices.push(Object.assign({ price: basePrice * ((100 - (0, toNumber_1.default)(bestDeal.pourcEscompte)) / 100), type: G2_1.CustomPriceItemTypeEnum.ESCOMPTE, percent: (0, toNumber_1.default)(bestDeal.pourcEscompte), code1: bestDeal.code1 }, (!!bestDeal.code2 ? { code2: bestDeal.code2 } : {})));
693
+ }
694
+ };
695
+ // Check only if :
696
+ // - foundEntenteForProduct = false (entente always has priority over escompte)
697
+ if (!!!foundEntenteForProduct) {
698
+ // If isNetPrice, check if escompte for cat1 DALLE is found for user. If so, apply escompte even if NET
699
+ // ** WORKAROUND pour nouvelle logique GR où certains produits à prix NET dans G2 doivent pouvoir être escomptés dans certaines régions (ici à QC) **
700
+ if (!!isNetPrice) {
701
+ const sameCat1Escompte = escomptesClient.filter((e) => {
702
+ if (!!!e.code2)
703
+ return false;
704
+ return decli.external_values && e.code2 === decli.external_values['catégorie1'] && e.code2 == 'DALLE';
705
+ });
706
+ if (!!sameCat1Escompte && !!sameCat1Escompte.length) {
707
+ findBestDeal(sameCat1Escompte);
708
+ }
709
+ }
710
+ else {
711
+ // a. No 2nd code is found (applies to client or client group directly)
712
+ const no2ndCode = escomptesClient.filter((e) => !!!e.code2);
713
+ if (!!no2ndCode.length) {
714
+ findBestDeal(no2ndCode);
715
+ }
716
+ // b. 2nd code is current sku && no entente was found for sku
717
+ let sameSkuEscompte = escomptesClient.filter((e) => e.code2 && e.code2 === sku);
718
+ if (!!!sameSkuEscompte.length) {
719
+ sameSkuEscompte = escomptesClient.filter((e) => e.code2 && e.code2.includes(sku));
720
+ }
721
+ if (!!sameSkuEscompte.length) {
722
+ findBestDeal(sameSkuEscompte);
723
+ }
724
+ // c. 2nd code is prod brand or type
725
+ // Only check if no sameSkuEscompte found (precise promo always has precedence over "group" promo)
726
+ if (!!!sameSkuEscompte.length) {
727
+ const sameBrandEscompte = escomptesClient.filter((e) => {
728
+ if (!!!e.code2)
729
+ return;
730
+ return (decli.external_values &&
731
+ (e.code2 === decli.external_values['catégorie2'] || e.code2 === decli.external_values['catégorie1']));
732
+ });
733
+ if (!!sameBrandEscompte) {
734
+ findBestDeal(sameBrandEscompte);
735
+ }
736
+ }
737
+ }
738
+ }
739
+ }
740
+ // #endregion ---------------------------------------------------------
741
+ // -------------------------------------------------------------------
742
+ // #region 4.3 Set price to apply to variable, ready to be pushed
743
+ comparePrices = (0, uniqBy_1.default)(comparePrices, (p) => p.price);
744
+ const lowestPrice = (0, minBy_1.default)(comparePrices, (p) => p.price);
745
+ let appliedPrice;
746
+ if (sku === products_2.installationAllInclusiveSku) {
747
+ const ententeFound = comparePrices.find((p) => p.type === G2_1.CustomPriceItemTypeEnum.ENTENTE);
748
+ appliedPrice = ententeFound;
749
+ }
750
+ else {
751
+ appliedPrice = lowestPrice;
752
+ // If lowestPrice is regular price and entente is found in product, override with entente price, even if amount is higher
753
+ if (!!lowestPrice && lowestPrice.type == G2_1.CustomPriceItemTypeEnum.REG) {
754
+ const ententeFound = comparePrices.find((p) => p.type == G2_1.CustomPriceItemTypeEnum.ENTENTE);
755
+ // set reg props to entente price so both prices have same value, but keep all other props as entente
756
+ if (!!ententeFound)
757
+ appliedPrice = Object.assign(Object.assign({}, ententeFound), { reg: ententeFound.price });
758
+ }
759
+ }
760
+ let customPriceItemToPush = undefined;
761
+ if (!!appliedPrice) {
762
+ customPriceItemToPush = Object.assign(Object.assign({ sku: sku, parent_slug: data.slug, name: `${!!decli.parent_name &&
763
+ !!!(0, locale_1.getPrincipalWord)(decli.name, space).trim().includes((0, locale_1.getPrincipalWord)(decli.parent_name).trim())
764
+ ? (0, locale_1.getPrincipalWord)(decli.name, space) + ' - '
765
+ : ''}${(0, locale_1.getPrincipalWord)(decli.name, space)}`, reg: basePrice }, (!!type
766
+ ? {
767
+ prod_type: type[0]
768
+ }
769
+ : {})), appliedPrice);
770
+ }
771
+ // #endregion ---------------------------------------------------------
772
+ // ----------------------------------------------------------------
773
+ // 6. Push lowest price from comparePrice to priceList
774
+ if (!!customPriceItemToPush) {
775
+ priceList.push(customPriceItemToPush);
776
+ }
777
+ }
778
+ }
779
+ // #endregion ---------------------------------------------------------
780
+ // -------------------------------------------------------------------
781
+ // #region 5. Use ALLINC decli when all-inclusive installation is active
782
+ if (!!allIncSkus.length && !!(0, products_3.getInstallationAllInclusiveFromPriceList)(priceList)) {
783
+ priceList = priceList.map((item) => (allIncSkus.includes(item.sku) ? Object.assign(Object.assign({}, item), { price: 0 }) : item));
784
+ }
785
+ // #endregion ---------------------------------------------------------
786
+ return priceList;
787
+ }
788
+ catch (e) {
789
+ console.log('error on fetching customer from G2: ', e.toString());
790
+ return e.toString();
791
+ }
792
+ };
793
+ exports.getCustomPriceList = getCustomPriceList;
794
+ /**
795
+ * Get promise to purchase additionnal escompte equivalent from customPriceList for specific cart item
796
+ * @param customPriceList - The pro customers custom price list
797
+ * @param item - The cart item to check
798
+ */
799
+ const getItemEscompteSupp = (customPriceList, item) => {
800
+ // Get catégorie 2 from item
801
+ const code2InItem = (0, object_1.recursiveCheckObject)(item, `external_values.catégorie2`);
802
+ // Get code2 from customPriceList item
803
+ let code2InPriceList = undefined;
804
+ const customPriceItem = customPriceList.find((priceItem) => priceItem.sku === item.sku);
805
+ if (!!customPriceItem && !!customPriceItem.code2) {
806
+ code2InPriceList = customPriceItem.code2;
807
+ }
808
+ // Use customPriceList item code2 if defined, else item's catégorie 2
809
+ const code2ToCheck = code2InPriceList !== null && code2InPriceList !== void 0 ? code2InPriceList : code2InItem;
810
+ if (!!!code2ToCheck)
811
+ return;
812
+ let foundEsc = customPriceList.find((priceItem) => priceItem.sku === 'ESC' + code2ToCheck);
813
+ if (!!!foundEsc && !!code2InItem) {
814
+ foundEsc = customPriceList.find((priceItem) => priceItem.sku === 'ESC' + code2InItem);
815
+ }
816
+ return foundEsc;
817
+ };
818
+ exports.getItemEscompteSupp = getItemEscompteSupp;
819
+ const groupArrayOfItemsByItemAndCorrespondingEscompteItem = (items) => {
820
+ return (0, flatten_1.default)(Object.values((0, groupBy_1.default)(items, (item) => ((0, exports.isEscompteSuppItem)(item.sku) ? (0, string_1.splitFromFirstChar)('-', item.sku)[1] : item.sku))));
821
+ };
822
+ exports.groupArrayOfItemsByItemAndCorrespondingEscompteItem = groupArrayOfItemsByItemAndCorrespondingEscompteItem;
823
+ const buildEscompteSuppCartItem = (escompteItems, customPriceList, escompteSuppItem, item) => {
824
+ if (!!!escompteItems[0])
825
+ return;
826
+ const priceToUse = (0, products_1.getLowestPrice)(item);
827
+ const escompteDecli = escompteItems[0].data().declinations.find((decli) => decli.sku === escompteSuppItem.sku);
828
+ if (!!!escompteDecli)
829
+ return;
830
+ // If esc supp found in price list has type reg price and has price of 0.00, it means the escompte does not apply to the customer
831
+ const sameInCustomPriceList = customPriceList.find((c) => c.sku === escompteDecli.sku);
832
+ if (!!sameInCustomPriceList &&
833
+ sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG &&
834
+ sameInCustomPriceList.price === 0)
835
+ return;
836
+ const escompteEquivalent = (0, exports.checkForCustomPriceEquivalent)(escompteDecli, customPriceList);
837
+ return Object.assign(Object.assign({}, escompteEquivalent), { is_upsell_of_sku: item.sku, is_temp_prod: true, price_override: true, qte_override: true, qte: item.qte * priceToUse.price.amount, sku: `${escompteEquivalent.sku}-${item.sku}`, regular_price: (0, products_1.getLowestPrice)(escompteEquivalent).price });
838
+ };
839
+ exports.buildEscompteSuppCartItem = buildEscompteSuppCartItem;
840
+ const isEscompteSuppItem = (itemSku) => {
841
+ return Object.values(G2_1.EscomptesDeclinationSkusEnum).some((subString) => itemSku.includes(subString));
842
+ };
843
+ exports.isEscompteSuppItem = isEscompteSuppItem;
844
+ // #endregion
845
+ // ---------------------------------------------------------------------------------------------
846
+ // #region FORMAT CART ITEMS
847
+ /**
848
+ * Adjusts prices in item provided with corresponding custom price list item, if it exists.
849
+ * @param item - The cart item or indexed declination
850
+ * @param customPriceList - The customers custom price list
851
+ * @param options.removeTierPricing - Optionnal. If tier-pricing should be removed from item returned
852
+ * @param options.setNetPriceAsRegular - Optionnal. If true and custom price found is NET (entente), sets the NET price as regular price (normaly set to discount_price)
853
+ */
854
+ const checkForCustomPriceEquivalent = (item, customPriceList, options = {}) => {
855
+ var _a;
856
+ const sameInCustomPriceList = customPriceList.find((i) => i.sku === item.sku);
857
+ if (!!!sameInCustomPriceList)
858
+ return item;
859
+ // If price was already overridden and price found in customPriceList is of type regular, return
860
+ const hasOverriddenPrice = item.price_override;
861
+ if (!!hasOverriddenPrice && sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG)
862
+ return item;
863
+ if (item.sku === products_2.installationAllInclusiveSku)
864
+ return item;
865
+ const { regular_price, promo_price, discount_price, tier_pricing } = item, rest = __rest(item, ["regular_price", "promo_price", "discount_price", "tier_pricing"]);
866
+ const isReg = sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.REG;
867
+ const isEntente = sameInCustomPriceList.type === G2_1.CustomPriceItemTypeEnum.ENTENTE;
868
+ const isPA = !!sameInCustomPriceList.PA_percent;
869
+ const shouldUseCustomPriceForRegPrice = (!!isReg && !!!sameInCustomPriceList.percent) || (!!options.setNetPriceAsRegular && !!isEntente);
870
+ // MODIF. FRAIS 2024 - Si le prix de la liste de prix est 0, et que le type du priceItem est REG ou ENTENTE, on pousse 0 comme valeur pour le prix régulier
871
+ // Le code se chargera alors de retirer le frais de ceux ajoutés au panier si c'est le cas
872
+ const currentDiscountPrice = item.discount_price || { currency: 'CAD' };
873
+ const currentPromoPrice = item.promo_price || { currency: 'CAD' };
874
+ const calculatedRegPrice = !!item.price_override
875
+ ? regular_price.amount
876
+ : (!!isReg || !!isEntente) && sameInCustomPriceList.price == 0
877
+ ? 0
878
+ : !!shouldUseCustomPriceForRegPrice
879
+ ? sameInCustomPriceList.price
880
+ : sameInCustomPriceList.reg;
881
+ // #region RECREATE CART ITEM WITH UPDATED PRICES
882
+ let updatedCartItem = Object.assign(Object.assign(Object.assign(Object.assign({}, rest), {
883
+ // a. Set regular price for product with price_type if not already defined
884
+ regular_price: Object.assign(Object.assign(Object.assign({}, regular_price), { amount: calculatedRegPrice }), (sameInCustomPriceList.type !== G2_1.CustomPriceItemTypeEnum.REG && !!!regular_price.price_type
885
+ ? { price_type: sameInCustomPriceList.type }
886
+ : {})) }), (!!!hasOverriddenPrice
887
+ ? Object.assign(Object.assign({}, (sameInCustomPriceList.percent || !!!isReg
888
+ ? Object.assign({}, (!!sameInCustomPriceList.percent &&
889
+ [G2_1.CustomPriceItemTypeEnum.ESCOMPTE, G2_1.CustomPriceItemTypeEnum.NORMAL_ESCOMPTE].includes(sameInCustomPriceList.type)
890
+ ? {
891
+ promo_price: Object.assign(Object.assign({}, currentPromoPrice), (!currentPromoPrice.overridden
892
+ ? {
893
+ amount: sameInCustomPriceList.price,
894
+ price_type: sameInCustomPriceList.type
895
+ }
896
+ : {}))
897
+ }
898
+ : // c2. Add discount price data if custom price list item has no Net Price as regular price indicator.
899
+ // ONLY if current discount price for item is not already overriden!
900
+ !!!options.setNetPriceAsRegular
901
+ ? Object.assign({ discount_price: Object.assign(Object.assign({}, currentDiscountPrice), (!currentDiscountPrice.overridden
902
+ ? {
903
+ amount: sameInCustomPriceList.price,
904
+ price_type: sameInCustomPriceList.type
905
+ }
906
+ : {})) }, (!!currentPromoPrice.overridden ? { promo_price: currentPromoPrice } : {})) : {})) : // d. Add discount price data if price is tier pricing price and tier pricing should be kept for product
907
+ currentDiscountPrice.price_type === 'tierpricing' && !!!options.removeTierPricing
908
+ ? {
909
+ discount_price: Object.assign(Object.assign({}, item.discount_price), { original_amount: !!isReg || !!!options.setNetPriceAsRegular ? null : sameInCustomPriceList.price })
910
+ }
911
+ : {})), (!!isPA
912
+ ? {
913
+ promo_price: Object.assign(Object.assign({}, currentPromoPrice), { amount: (_a = sameInCustomPriceList.PA_price) !== null && _a !== void 0 ? _a : sameInCustomPriceList.price, price_type: sameInCustomPriceList.type, percent_applied: sameInCustomPriceList.PA_percent }),
914
+ discount_price: Object.assign(Object.assign({}, currentDiscountPrice), { amount: sameInCustomPriceList.price, price_type: sameInCustomPriceList.type, percent_applied: sameInCustomPriceList.percent })
915
+ }
916
+ : {})) : {})), (!!!options.removeTierPricing && !!tier_pricing
917
+ ? {
918
+ tier_pricing
919
+ }
920
+ : {}));
921
+ // g. If promo price was overriden in POS, and discount_price or reg_price changed, recalculate promo price applied from percentage
922
+ const priceUsedForPromoCalculations = !!updatedCartItem.discount_price
923
+ ? updatedCartItem.discount_price.amount
924
+ : updatedCartItem.regular_price.amount;
925
+ const initialPriceToCompare = !!currentDiscountPrice ? currentDiscountPrice.amount : item.regular_price.amount;
926
+ if (typeof currentPromoPrice.percent_applied == 'number' &&
927
+ !!currentPromoPrice.overridden &&
928
+ priceUsedForPromoCalculations != initialPriceToCompare) {
929
+ updatedCartItem = Object.assign(Object.assign({}, updatedCartItem), { promo_price: Object.assign(Object.assign({}, (updatedCartItem.promo_price || { currency: 'CAD' })), { amount: (0, round_1.default)((0, cart_1.calculateAmountForCustomPromo)(updatedCartItem, Cart_1.CustomPromoType.EXTRA_PROMO, currentPromoPrice.percent_applied), priceUsedForPromoCalculations.toString().split('.').length) }) });
930
+ }
931
+ // #endregion
932
+ return updatedCartItem;
933
+ };
934
+ exports.checkForCustomPriceEquivalent = checkForCustomPriceEquivalent;
935
+ // #endregion
936
+ // ---------------------------------------------------------------------------------------------
937
+ // #region CUSTOM INCENTIVE
938
+ const getCustomIncentiveAmount = (customPriceList) => {
939
+ if (!!!customPriceList)
940
+ return;
941
+ const ententeSku = 'INCITATIF';
942
+ let amount = 0;
943
+ const entente = customPriceList.find((priceItem) => priceItem.sku === ententeSku);
944
+ // Si l'incitatif n'est pas trouvé dans l'entente, ou correspond au prix "régulier", ne pas le retourner
945
+ if (!!!entente || !!!entente.price || entente.type == G2_1.CustomPriceItemTypeEnum.REG)
946
+ return;
947
+ amount = entente.price * -100;
948
+ return amount;
949
+ };
950
+ exports.getCustomIncentiveAmount = getCustomIncentiveAmount;
951
+ const getDiscountRulesWithCustomIncentive = (incentiveAmount, discountRules) => {
952
+ let hasBeenUpdated = false;
953
+ const updatedDiscountRules = discountRules.map((rule) => {
954
+ const promoType = (0, discount_1.getCartPromoType)(rule);
955
+ if (promoType === Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES) {
956
+ hasBeenUpdated = true;
957
+ const updatedRule = rule;
958
+ updatedRule.result.action_value = incentiveAmount;
959
+ updatedRule.overridden = true;
960
+ return updatedRule;
961
+ }
962
+ else {
963
+ return rule;
964
+ }
965
+ });
966
+ if (!hasBeenUpdated)
967
+ return;
968
+ return updatedDiscountRules;
969
+ };
970
+ exports.getDiscountRulesWithCustomIncentive = getDiscountRulesWithCustomIncentive;
971
+ const getCustomIncentiveInfo = (customPriceList, discountRules, defaultIncentiveAmount) => {
972
+ let discountRulesWithCustomIncentive;
973
+ let customIncentiveAmount = (0, exports.getCustomIncentiveAmount)(customPriceList);
974
+ const incentiveDiscountRule = (0, discount_1.getPaymentIncentiveDiscount)(discountRules);
975
+ if (!!!customIncentiveAmount) {
976
+ // If already overridden, reset incentive discount if no custom incentive found for customer
977
+ if (!!incentiveDiscountRule && !!incentiveDiscountRule.overridden) {
978
+ return {
979
+ amount: defaultIncentiveAmount || 0,
980
+ updatedDiscountRules: discountRules.map((dr) => {
981
+ if (dr.id !== incentiveDiscountRule.id)
982
+ return dr;
983
+ return Object.assign(Object.assign(Object.assign({}, dr), (defaultIncentiveAmount ? { result: Object.assign(Object.assign({}, dr.result), { action_value: defaultIncentiveAmount }) } : {})), { overridden: false });
984
+ }),
985
+ reset: true
986
+ };
987
+ }
988
+ return;
989
+ }
990
+ discountRulesWithCustomIncentive = (0, exports.getDiscountRulesWithCustomIncentive)(customIncentiveAmount, discountRules);
991
+ if (!!!discountRulesWithCustomIncentive)
992
+ return;
993
+ return {
994
+ amount: customIncentiveAmount,
995
+ updatedDiscountRules: discountRulesWithCustomIncentive
996
+ };
997
+ };
998
+ exports.getCustomIncentiveInfo = getCustomIncentiveInfo;
999
+ // #endregion
1000
1000
  //# sourceMappingURL=g2.js.map