addio-admin-sdk 1.7.196 → 1.7.197

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/.babelrc +17 -17
  2. package/.env +14 -0
  3. package/.env.dev +14 -14
  4. package/.github/workflows/run_unit_test.yaml +48 -48
  5. package/.github/workflows/update_docs.yaml +32 -32
  6. package/addio-sdk-doc.md +1473 -1473
  7. package/changelog.md +582 -582
  8. package/dist/Interfaces/Address/index.d.ts +21 -21
  9. package/dist/Interfaces/Address/index.js +16 -16
  10. package/dist/Interfaces/Algolia/index.d.ts +183 -182
  11. package/dist/Interfaces/Algolia/index.js +2 -2
  12. package/dist/Interfaces/Attachement/index.d.ts +5 -5
  13. package/dist/Interfaces/Attachement/index.js +2 -2
  14. package/dist/Interfaces/Attribute/index.d.ts +53 -53
  15. package/dist/Interfaces/Attribute/index.js +10 -10
  16. package/dist/Interfaces/BGJob/index.d.ts +56 -56
  17. package/dist/Interfaces/BGJob/index.js +25 -25
  18. package/dist/Interfaces/BaseClass/index.d.ts +8 -8
  19. package/dist/Interfaces/BaseClass/index.js +2 -2
  20. package/dist/Interfaces/Blog/IBlogArticle.d.ts +18 -18
  21. package/dist/Interfaces/Blog/IBlogArticle.js +2 -2
  22. package/dist/Interfaces/Blog/IBlogAuthor.d.ts +7 -7
  23. package/dist/Interfaces/Blog/IBlogAuthor.js +2 -2
  24. package/dist/Interfaces/Blog/IBlogCategory.d.ts +9 -9
  25. package/dist/Interfaces/Blog/IBlogCategory.js +2 -2
  26. package/dist/Interfaces/Blog/IBlogComment.d.ts +13 -13
  27. package/dist/Interfaces/Blog/IBlogComment.js +2 -2
  28. package/dist/Interfaces/Blog/IBlogKeywords.d.ts +9 -9
  29. package/dist/Interfaces/Blog/IBlogKeywords.js +2 -2
  30. package/dist/Interfaces/Booking/index.d.ts +74 -74
  31. package/dist/Interfaces/Booking/index.js +17 -17
  32. package/dist/Interfaces/Brand/index.d.ts +15 -15
  33. package/dist/Interfaces/Brand/index.js +2 -2
  34. package/dist/Interfaces/Buylist/index.d.ts +19 -19
  35. package/dist/Interfaces/Buylist/index.js +2 -2
  36. package/dist/Interfaces/CMS/index.d.ts +28 -28
  37. package/dist/Interfaces/CMS/index.js +5 -5
  38. package/dist/Interfaces/Cart/IElavonPayload.d.ts +93 -93
  39. package/dist/Interfaces/Cart/IElavonPayload.js +17 -17
  40. package/dist/Interfaces/Cart/IMarketPayload.d.ts +12 -12
  41. package/dist/Interfaces/Cart/IMarketPayload.js +2 -2
  42. package/dist/Interfaces/Cart/IPandaPayload.d.ts +64 -64
  43. package/dist/Interfaces/Cart/IPandaPayload.js +18 -18
  44. package/dist/Interfaces/Cart/IPaymentCard.d.ts +22 -22
  45. package/dist/Interfaces/Cart/IPaymentCard.js +44 -44
  46. package/dist/Interfaces/Cart/IPaypalPayload.d.ts +9 -9
  47. package/dist/Interfaces/Cart/IPaypalPayload.js +2 -2
  48. package/dist/Interfaces/Cart/IPaysafePayload.d.ts +72 -72
  49. package/dist/Interfaces/Cart/IPaysafePayload.js +2 -2
  50. package/dist/Interfaces/Cart/IStripePayload.d.ts +66 -66
  51. package/dist/Interfaces/Cart/IStripePayload.js +2 -2
  52. package/dist/Interfaces/Cart/index.d.ts +478 -476
  53. package/dist/Interfaces/Cart/index.js +283 -283
  54. package/dist/Interfaces/Cart/index.js.map +1 -1
  55. package/dist/Interfaces/CartReservedQuantities/index.d.ts +10 -10
  56. package/dist/Interfaces/CartReservedQuantities/index.js +2 -2
  57. package/dist/Interfaces/CashDrawers/index.d.ts +38 -38
  58. package/dist/Interfaces/CashDrawers/index.js +19 -19
  59. package/dist/Interfaces/Catalogue/index.d.ts +68 -68
  60. package/dist/Interfaces/Catalogue/index.js +37 -37
  61. package/dist/Interfaces/Category/index.d.ts +33 -33
  62. package/dist/Interfaces/Category/index.js +2 -2
  63. package/dist/Interfaces/Chart/index.d.ts +11 -11
  64. package/dist/Interfaces/Chart/index.js +2 -2
  65. package/dist/Interfaces/Class/index.d.ts +8 -8
  66. package/dist/Interfaces/Class/index.js +2 -2
  67. package/dist/Interfaces/Consent/index.d.ts +6 -6
  68. package/dist/Interfaces/Consent/index.js +2 -2
  69. package/dist/Interfaces/Context/IContextProps.d.ts +4 -4
  70. package/dist/Interfaces/Context/IContextProps.js +2 -2
  71. package/dist/Interfaces/Context/IContextState.d.ts +15 -15
  72. package/dist/Interfaces/Context/IContextState.js +2 -2
  73. package/dist/Interfaces/Customer/ICustomerBadge.d.ts +2 -2
  74. package/dist/Interfaces/Customer/ICustomerBadge.js +2 -2
  75. package/dist/Interfaces/Customer/ICustomerRating.d.ts +10 -10
  76. package/dist/Interfaces/Customer/ICustomerRating.js +2 -2
  77. package/dist/Interfaces/Customer/IStoreCredit.d.ts +13 -13
  78. package/dist/Interfaces/Customer/IStoreCredit.js +2 -2
  79. package/dist/Interfaces/Customer/index.d.ts +104 -104
  80. package/dist/Interfaces/Customer/index.js +148 -148
  81. package/dist/Interfaces/Declination/index.d.ts +133 -117
  82. package/dist/Interfaces/Declination/index.js +83 -66
  83. package/dist/Interfaces/Declination/index.js.map +1 -1
  84. package/dist/Interfaces/Document/index.d.ts +8 -8
  85. package/dist/Interfaces/Document/index.js +2 -2
  86. package/dist/Interfaces/Elastic/index.d.ts +89 -89
  87. package/dist/Interfaces/Elastic/index.js +2 -2
  88. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.d.ts +11 -11
  89. package/dist/Interfaces/Email/CustomGR/I3DPrintEmail.js +2 -2
  90. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.d.ts +15 -15
  91. package/dist/Interfaces/Email/CustomGR/IBorrowToolsEmail.js +2 -2
  92. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.d.ts +12 -12
  93. package/dist/Interfaces/Email/CustomGR/IPickupMaterialsEmail.js +2 -2
  94. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.d.ts +36 -36
  95. package/dist/Interfaces/Email/CustomGR/IPreMeetingFormEmail.js +2 -2
  96. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.d.ts +12 -12
  97. package/dist/Interfaces/Email/CustomGR/ISponsorRequestEmail.js +2 -2
  98. package/dist/Interfaces/Email/CustomGR/ITransportEmail.d.ts +12 -12
  99. package/dist/Interfaces/Email/CustomGR/ITransportEmail.js +2 -2
  100. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.d.ts +12 -12
  101. package/dist/Interfaces/Email/CustomGR/ITransportQuoteEmail.js +2 -2
  102. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.d.ts +16 -16
  103. package/dist/Interfaces/Email/CustomGR/IVegetalsEmail.js +2 -2
  104. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.d.ts +15 -15
  105. package/dist/Interfaces/Email/CustomGR/IWishlistEmail.js +2 -2
  106. package/dist/Interfaces/Email/IAbandonnedCartEmail.d.ts +29 -29
  107. package/dist/Interfaces/Email/IAbandonnedCartEmail.js +2 -2
  108. package/dist/Interfaces/Email/IAccountConfirmationEmail.d.ts +22 -22
  109. package/dist/Interfaces/Email/IAccountConfirmationEmail.js +2 -2
  110. package/dist/Interfaces/Email/IApplicationEmail.d.ts +19 -19
  111. package/dist/Interfaces/Email/IApplicationEmail.js +2 -2
  112. package/dist/Interfaces/Email/IBackInStockEmail.d.ts +21 -21
  113. package/dist/Interfaces/Email/IBackInStockEmail.js +2 -2
  114. package/dist/Interfaces/Email/IContactEmail.d.ts +20 -20
  115. package/dist/Interfaces/Email/IContactEmail.js +2 -2
  116. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.d.ts +15 -15
  117. package/dist/Interfaces/Email/ICustomerBookingAdminEmail.js +2 -2
  118. package/dist/Interfaces/Email/ICustomerBookingEmail.d.ts +14 -14
  119. package/dist/Interfaces/Email/ICustomerBookingEmail.js +2 -2
  120. package/dist/Interfaces/Email/IEmail.d.ts +20 -20
  121. package/dist/Interfaces/Email/IEmail.js +46 -46
  122. package/dist/Interfaces/Email/IOrderConfirmationEmail.d.ts +47 -47
  123. package/dist/Interfaces/Email/IOrderConfirmationEmail.js +2 -2
  124. package/dist/Interfaces/Email/IPasswordResetEmail.d.ts +17 -17
  125. package/dist/Interfaces/Email/IPasswordResetEmail.js +2 -2
  126. package/dist/Interfaces/Email/IPhotoShootEmail.d.ts +14 -14
  127. package/dist/Interfaces/Email/IPhotoShootEmail.js +2 -2
  128. package/dist/Interfaces/Email/IPickupConfirmation.d.ts +23 -23
  129. package/dist/Interfaces/Email/IPickupConfirmation.js +2 -2
  130. package/dist/Interfaces/Email/IShippingConfirmation.d.ts +23 -23
  131. package/dist/Interfaces/Email/IShippingConfirmation.js +2 -2
  132. package/dist/Interfaces/Email/IWelcomeEmail.d.ts +19 -19
  133. package/dist/Interfaces/Email/IWelcomeEmail.js +2 -2
  134. package/dist/Interfaces/ExportSchema/index.d.ts +7 -7
  135. package/dist/Interfaces/ExportSchema/index.js +2 -2
  136. package/dist/Interfaces/ExternalService/BaseExternalService.d.ts +12 -12
  137. package/dist/Interfaces/ExternalService/BaseExternalService.js +2 -2
  138. package/dist/Interfaces/ExternalService/ExternalProductsService.d.ts +4 -4
  139. package/dist/Interfaces/ExternalService/ExternalProductsService.js +2 -2
  140. package/dist/Interfaces/ExternalService/index.d.ts +9 -9
  141. package/dist/Interfaces/ExternalService/index.js +2 -2
  142. package/dist/Interfaces/FirstOrderTracking/index.d.ts +5 -5
  143. package/dist/Interfaces/FirstOrderTracking/index.js +2 -2
  144. package/dist/Interfaces/G2/index.d.ts +557 -557
  145. package/dist/Interfaces/G2/index.js +39 -39
  146. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.d.ts +20 -20
  147. package/dist/Interfaces/Indexed/Product/IIndexedLastSavedProduct.js +2 -2
  148. package/dist/Interfaces/Indexed/Product/index.d.ts +126 -111
  149. package/dist/Interfaces/Indexed/Product/index.js +372 -302
  150. package/dist/Interfaces/Indexed/Product/index.js.map +1 -1
  151. package/dist/Interfaces/Inventory/index.d.ts +19 -19
  152. package/dist/Interfaces/Inventory/index.js +8 -8
  153. package/dist/Interfaces/Invoice/index.d.ts +4 -4
  154. package/dist/Interfaces/Invoice/index.js +2 -2
  155. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.d.ts +3 -3
  156. package/dist/Interfaces/MarketplacePublication/MarketplaceOrderData.js +2 -2
  157. package/dist/Interfaces/MarketplacePublication/index.d.ts +23 -23
  158. package/dist/Interfaces/MarketplacePublication/index.js +22 -22
  159. package/dist/Interfaces/Menu/index.d.ts +40 -40
  160. package/dist/Interfaces/Menu/index.js +16 -16
  161. package/dist/Interfaces/Note/index.d.ts +10 -10
  162. package/dist/Interfaces/Note/index.js +7 -7
  163. package/dist/Interfaces/Operations/ICreatedBy.d.ts +6 -6
  164. package/dist/Interfaces/Operations/ICreatedBy.js +2 -2
  165. package/dist/Interfaces/Operations/IUpdate.d.ts +5 -5
  166. package/dist/Interfaces/Operations/IUpdate.js +2 -2
  167. package/dist/Interfaces/Order/index.d.ts +4 -4
  168. package/dist/Interfaces/Order/index.js +2 -2
  169. package/dist/Interfaces/Org/IRelUser.d.ts +9 -9
  170. package/dist/Interfaces/Org/IRelUser.js +2 -2
  171. package/dist/Interfaces/Org/index.d.ts +29 -29
  172. package/dist/Interfaces/Org/index.js +12 -12
  173. package/dist/Interfaces/Payment/index.d.ts +26 -26
  174. package/dist/Interfaces/Payment/index.js +14 -14
  175. package/dist/Interfaces/Product/IAttributeFamily.d.ts +6 -6
  176. package/dist/Interfaces/Product/IAttributeFamily.js +2 -2
  177. package/dist/Interfaces/Product/IImportProduct.d.ts +42 -42
  178. package/dist/Interfaces/Product/IImportProduct.js +882 -882
  179. package/dist/Interfaces/Product/IInventoryItem.d.ts +74 -74
  180. package/dist/Interfaces/Product/IInventoryItem.js +38 -38
  181. package/dist/Interfaces/Product/IPricing.d.ts +177 -177
  182. package/dist/Interfaces/Product/IPricing.js +180 -180
  183. package/dist/Interfaces/Product/index.d.ts +137 -137
  184. package/dist/Interfaces/Product/index.js +64 -64
  185. package/dist/Interfaces/ProductAttribute/index.d.ts +11 -11
  186. package/dist/Interfaces/ProductAttribute/index.js +2 -2
  187. package/dist/Interfaces/PromiseToPurchase/BankType.d.ts +41 -41
  188. package/dist/Interfaces/PromiseToPurchase/BankType.js +41 -41
  189. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.d.ts +33 -33
  190. package/dist/Interfaces/PromiseToPurchase/IIndexedBankUsed.js +15 -15
  191. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.d.ts +19 -19
  192. package/dist/Interfaces/PromiseToPurchase/IIndexedCustomerPromiseToPurchase.js +2 -2
  193. package/dist/Interfaces/PromiseToPurchase/index.d.ts +50 -50
  194. package/dist/Interfaces/PromiseToPurchase/index.js +13 -13
  195. package/dist/Interfaces/PurchaseOrder/index.d.ts +17 -17
  196. package/dist/Interfaces/PurchaseOrder/index.js +2 -2
  197. package/dist/Interfaces/Query/IBrandQueryOptions.d.ts +11 -11
  198. package/dist/Interfaces/Query/IBrandQueryOptions.js +2 -2
  199. package/dist/Interfaces/Query/ICategoryQueryOptions.d.ts +11 -11
  200. package/dist/Interfaces/Query/ICategoryQueryOptions.js +2 -2
  201. package/dist/Interfaces/Query/IProductQueryOptions.d.ts +16 -16
  202. package/dist/Interfaces/Query/IProductQueryOptions.js +2 -2
  203. package/dist/Interfaces/Quote/index.d.ts +5 -5
  204. package/dist/Interfaces/Quote/index.js +2 -2
  205. package/dist/Interfaces/Refunds/index.d.ts +106 -106
  206. package/dist/Interfaces/Refunds/index.js +2 -2
  207. package/dist/Interfaces/Rules/IDiscountRule.d.ts +156 -156
  208. package/dist/Interfaces/Rules/IDiscountRule.js +114 -114
  209. package/dist/Interfaces/Schedule/index.d.ts +48 -48
  210. package/dist/Interfaces/Schedule/index.js +2 -2
  211. package/dist/Interfaces/Services/IAddServiceResponse.d.ts +4 -4
  212. package/dist/Interfaces/Services/IAddServiceResponse.js +2 -2
  213. package/dist/Interfaces/Services/IService.d.ts +16 -16
  214. package/dist/Interfaces/Services/IService.js +2 -2
  215. package/dist/Interfaces/Services/IServiceSecret.d.ts +8 -8
  216. package/dist/Interfaces/Services/IServiceSecret.js +2 -2
  217. package/dist/Interfaces/Shipping/Shipstation/carriers.d.ts +10 -10
  218. package/dist/Interfaces/Shipping/Shipstation/carriers.js +2 -2
  219. package/dist/Interfaces/Shipping/Shipstation/order.d.ts +227 -227
  220. package/dist/Interfaces/Shipping/Shipstation/order.js +2 -2
  221. package/dist/Interfaces/Shipping/Shipstation/quote.d.ts +31 -31
  222. package/dist/Interfaces/Shipping/Shipstation/quote.js +2 -2
  223. package/dist/Interfaces/Shipping/Shiptime/order.d.ts +54 -54
  224. package/dist/Interfaces/Shipping/Shiptime/order.js +71 -71
  225. package/dist/Interfaces/Shipping/Shiptime/quote.d.ts +111 -111
  226. package/dist/Interfaces/Shipping/Shiptime/quote.js +2 -2
  227. package/dist/Interfaces/Slider/GR.d.ts +114 -114
  228. package/dist/Interfaces/Slider/GR.js +271 -271
  229. package/dist/Interfaces/Slider/index.d.ts +30 -30
  230. package/dist/Interfaces/Slider/index.js +2 -2
  231. package/dist/Interfaces/Space/IExternalService.d.ts +54 -54
  232. package/dist/Interfaces/Space/IExternalService.js +45 -45
  233. package/dist/Interfaces/Space/IMember.d.ts +16 -16
  234. package/dist/Interfaces/Space/IMember.js +9 -9
  235. package/dist/Interfaces/Space/index.d.ts +414 -414
  236. package/dist/Interfaces/Space/index.js +176 -176
  237. package/dist/Interfaces/Specials/gr.d.ts +61 -61
  238. package/dist/Interfaces/Specials/gr.js +2 -2
  239. package/dist/Interfaces/StockNotification/index.d.ts +7 -7
  240. package/dist/Interfaces/StockNotification/index.js +2 -2
  241. package/dist/Interfaces/Store/index.d.ts +63 -63
  242. package/dist/Interfaces/Store/index.js +27 -27
  243. package/dist/Interfaces/Supplier/ICommand.d.ts +11 -11
  244. package/dist/Interfaces/Supplier/ICommand.js +2 -2
  245. package/dist/Interfaces/Supplier/index.d.ts +36 -36
  246. package/dist/Interfaces/Supplier/index.js +24 -24
  247. package/dist/Interfaces/TCG/index.d.ts +200 -200
  248. package/dist/Interfaces/TCG/index.js +59 -59
  249. package/dist/Interfaces/Tag/index.d.ts +18 -18
  250. package/dist/Interfaces/Tag/index.js +2 -2
  251. package/dist/Interfaces/Tax/index.d.ts +13 -13
  252. package/dist/Interfaces/Tax/index.js +2 -2
  253. package/dist/Interfaces/TransferRequest/index.d.ts +103 -103
  254. package/dist/Interfaces/TransferRequest/index.js +46 -46
  255. package/dist/Interfaces/Translation/index.d.ts +8 -8
  256. package/dist/Interfaces/Translation/index.js +5 -5
  257. package/dist/Interfaces/Update/index.d.ts +10 -10
  258. package/dist/Interfaces/Update/index.js +2 -2
  259. package/dist/Interfaces/User/IUser.d.ts +65 -65
  260. package/dist/Interfaces/User/IUser.js +8 -8
  261. package/dist/Interfaces/Version/index.d.ts +11 -11
  262. package/dist/Interfaces/Version/index.js +2 -2
  263. package/dist/Interfaces/Wishlist/index.d.ts +7 -7
  264. package/dist/Interfaces/Wishlist/index.js +2 -2
  265. package/dist/constants/Interfaces/IBaseApi.d.ts +15 -15
  266. package/dist/constants/Interfaces/IBaseApi.js +2 -2
  267. package/dist/constants/Interfaces/IEndpointResult.d.ts +9 -9
  268. package/dist/constants/Interfaces/IEndpointResult.js +2 -2
  269. package/dist/constants/enums.d.ts +6 -6
  270. package/dist/constants/enums.js +10 -10
  271. package/dist/constants/services.d.ts +2 -2
  272. package/dist/constants/services.js +122 -122
  273. package/dist/constants/version.d.ts +2 -2
  274. package/dist/constants/version.js +5 -5
  275. package/dist/index.d.ts +50 -50
  276. package/dist/index.js +266 -266
  277. package/dist/lib/Attribute/index.d.ts +14 -14
  278. package/dist/lib/Attribute/index.js +186 -186
  279. package/dist/lib/BGJob/index.d.ts +9 -9
  280. package/dist/lib/BGJob/index.js +216 -216
  281. package/dist/lib/BackgroundWorker/index.d.ts +34 -34
  282. package/dist/lib/BackgroundWorker/index.js +59 -59
  283. package/dist/lib/Blog/BlogArticle.d.ts +5 -5
  284. package/dist/lib/Blog/BlogArticle.js +10 -10
  285. package/dist/lib/Blog/BlogAuthor.d.ts +5 -5
  286. package/dist/lib/Blog/BlogAuthor.js +10 -10
  287. package/dist/lib/Blog/BlogCategory.d.ts +5 -5
  288. package/dist/lib/Blog/BlogCategory.js +10 -10
  289. package/dist/lib/Blog/BlogKeyword.d.ts +5 -5
  290. package/dist/lib/Blog/BlogKeyword.js +10 -10
  291. package/dist/lib/Booking/index.d.ts +85 -85
  292. package/dist/lib/Booking/index.js +596 -596
  293. package/dist/lib/Brand/index.d.ts +26 -26
  294. package/dist/lib/Brand/index.js +131 -131
  295. package/dist/lib/Cart/index.d.ts +357 -357
  296. package/dist/lib/Cart/index.js +4052 -4052
  297. package/dist/lib/CartReservedQuantities/index.d.ts +49 -49
  298. package/dist/lib/CartReservedQuantities/index.js +159 -159
  299. package/dist/lib/CashDrawerShift/index.d.ts +84 -84
  300. package/dist/lib/CashDrawerShift/index.js +206 -206
  301. package/dist/lib/Catalogue/index.d.ts +15 -15
  302. package/dist/lib/Catalogue/index.js +78 -78
  303. package/dist/lib/Category/index.d.ts +34 -34
  304. package/dist/lib/Category/index.js +230 -230
  305. package/dist/lib/Class/index.d.ts +16 -16
  306. package/dist/lib/Class/index.js +66 -66
  307. package/dist/lib/Consent/index.d.ts +4 -4
  308. package/dist/lib/Consent/index.js +29 -29
  309. package/dist/lib/Customer/index.d.ts +30 -30
  310. package/dist/lib/Customer/index.js +92 -92
  311. package/dist/lib/Declination/index.d.ts +9 -9
  312. package/dist/lib/Declination/index.js +26 -26
  313. package/dist/lib/Discount/index.d.ts +27 -27
  314. package/dist/lib/Discount/index.js +493 -493
  315. package/dist/lib/ElasticSearch/index.d.ts +13 -13
  316. package/dist/lib/ElasticSearch/index.js +50 -50
  317. package/dist/lib/Elavon/index.d.ts +18 -18
  318. package/dist/lib/Elavon/index.js +135 -135
  319. package/dist/lib/Email/AbandonedCartEmail.d.ts +16 -16
  320. package/dist/lib/Email/AbandonedCartEmail.js +24 -24
  321. package/dist/lib/Email/AccountConfirmationEmail.d.ts +19 -19
  322. package/dist/lib/Email/AccountConfirmationEmail.js +30 -30
  323. package/dist/lib/Email/AdminOrderConfirmationEmail.d.ts +16 -16
  324. package/dist/lib/Email/AdminOrderConfirmationEmail.js +24 -24
  325. package/dist/lib/Email/ApplicationEmail.d.ts +16 -16
  326. package/dist/lib/Email/ApplicationEmail.js +24 -24
  327. package/dist/lib/Email/BackInStockEmail.d.ts +16 -16
  328. package/dist/lib/Email/BackInStockEmail.js +24 -24
  329. package/dist/lib/Email/ContactEmail.d.ts +16 -16
  330. package/dist/lib/Email/ContactEmail.js +24 -24
  331. package/dist/lib/Email/CustomerBookingAdminEmail.d.ts +16 -16
  332. package/dist/lib/Email/CustomerBookingAdminEmail.js +24 -24
  333. package/dist/lib/Email/CustomerBookingEmail.d.ts +16 -16
  334. package/dist/lib/Email/CustomerBookingEmail.js +24 -24
  335. package/dist/lib/Email/OrderConfirmationEmail.d.ts +16 -16
  336. package/dist/lib/Email/OrderConfirmationEmail.js +24 -24
  337. package/dist/lib/Email/OrderDenounciationEmail.d.ts +16 -16
  338. package/dist/lib/Email/OrderDenounciationEmail.js +24 -24
  339. package/dist/lib/Email/OrderSampleEmail.d.ts +16 -16
  340. package/dist/lib/Email/OrderSampleEmail.js +24 -24
  341. package/dist/lib/Email/OtherTypeEmails.d.ts +16 -16
  342. package/dist/lib/Email/OtherTypeEmails.js +27 -27
  343. package/dist/lib/Email/PasswordResetEmail.d.ts +16 -16
  344. package/dist/lib/Email/PasswordResetEmail.js +24 -24
  345. package/dist/lib/Email/PhotoShootEmail.d.ts +16 -16
  346. package/dist/lib/Email/PhotoShootEmail.js +24 -24
  347. package/dist/lib/Email/PickUpConfirmation.d.ts +16 -16
  348. package/dist/lib/Email/PickUpConfirmation.js +24 -24
  349. package/dist/lib/Email/ShippingConfirmation.d.ts +16 -16
  350. package/dist/lib/Email/ShippingConfirmation.js +24 -24
  351. package/dist/lib/Email/WelcomeEmail.d.ts +16 -16
  352. package/dist/lib/Email/WelcomeEmail.js +24 -24
  353. package/dist/lib/Email/index.d.ts +16 -16
  354. package/dist/lib/Email/index.js +31 -31
  355. package/dist/lib/ExternalService/Ebay.d.ts +74 -74
  356. package/dist/lib/ExternalService/Ebay.js +124 -124
  357. package/dist/lib/ExternalService/index.d.ts +5 -5
  358. package/dist/lib/ExternalService/index.js +10 -10
  359. package/dist/lib/FirstOrderTracking/index.d.ts +5 -5
  360. package/dist/lib/FirstOrderTracking/index.js +10 -10
  361. package/dist/lib/Indexed/IndexedCart.d.ts +13 -13
  362. package/dist/lib/Indexed/IndexedCart.js +91 -91
  363. package/dist/lib/Indexed/Product.d.ts +17 -17
  364. package/dist/lib/Indexed/Product.js +98 -98
  365. package/dist/lib/Inventory/index.d.ts +131 -131
  366. package/dist/lib/Inventory/index.js +545 -545
  367. package/dist/lib/Invoice/index.d.ts +16 -16
  368. package/dist/lib/Invoice/index.js +21 -21
  369. package/dist/lib/MarketplacePublication/index.d.ts +9 -9
  370. package/dist/lib/MarketplacePublication/index.js +426 -426
  371. package/dist/lib/Menu/index.d.ts +11 -11
  372. package/dist/lib/Menu/index.js +107 -107
  373. package/dist/lib/MongoDB/BaseAPI.d.ts +18 -18
  374. package/dist/lib/MongoDB/BaseAPI.js +200 -200
  375. package/dist/lib/Note/index.d.ts +4 -4
  376. package/dist/lib/Note/index.js +6 -6
  377. package/dist/lib/Order/index.d.ts +27 -27
  378. package/dist/lib/Order/index.js +56 -56
  379. package/dist/lib/Org/index.d.ts +68 -68
  380. package/dist/lib/Org/index.js +216 -216
  381. package/dist/lib/PandaPay/index.d.ts +16 -16
  382. package/dist/lib/PandaPay/index.js +176 -176
  383. package/dist/lib/Paysafe/index.d.ts +11 -11
  384. package/dist/lib/Paysafe/index.js +41 -41
  385. package/dist/lib/Product/index.d.ts +182 -182
  386. package/dist/lib/Product/index.js +847 -847
  387. package/dist/lib/ProductAttribute/index.d.ts +15 -15
  388. package/dist/lib/ProductAttribute/index.js +45 -45
  389. package/dist/lib/PromiseToPurchase/index.d.ts +109 -109
  390. package/dist/lib/PromiseToPurchase/index.js +343 -343
  391. package/dist/lib/PurchaseOrder/index.d.ts +20 -20
  392. package/dist/lib/PurchaseOrder/index.js +28 -28
  393. package/dist/lib/Schedule/index.d.ts +5 -5
  394. package/dist/lib/Schedule/index.js +12 -12
  395. package/dist/lib/Service/Enum/ServiceEnum.d.ts +3 -3
  396. package/dist/lib/Service/Enum/ServiceEnum.js +7 -7
  397. package/dist/lib/Service/index.d.ts +13 -13
  398. package/dist/lib/Service/index.js +21 -21
  399. package/dist/lib/Shipment/index.d.ts +28 -28
  400. package/dist/lib/Shipment/index.js +370 -370
  401. package/dist/lib/Slider/index.d.ts +22 -22
  402. package/dist/lib/Slider/index.js +119 -119
  403. package/dist/lib/Space/index.d.ts +1181 -1181
  404. package/dist/lib/Space/index.js +5860 -5856
  405. package/dist/lib/Space/index.js.map +1 -1
  406. package/dist/lib/StockNotification/index.d.ts +4 -4
  407. package/dist/lib/StockNotification/index.js +6 -6
  408. package/dist/lib/Store/index.d.ts +5 -5
  409. package/dist/lib/Store/index.js +12 -12
  410. package/dist/lib/Supplier/Command.d.ts +5 -5
  411. package/dist/lib/Supplier/Command.js +10 -10
  412. package/dist/lib/Supplier/index.d.ts +25 -25
  413. package/dist/lib/Supplier/index.js +27 -27
  414. package/dist/lib/Tags/index.d.ts +6 -6
  415. package/dist/lib/Tags/index.js +26 -26
  416. package/dist/lib/Tax/index.d.ts +8 -8
  417. package/dist/lib/Tax/index.js +54 -54
  418. package/dist/lib/TransferRequest/index.d.ts +298 -298
  419. package/dist/lib/TransferRequest/index.js +1106 -1106
  420. package/dist/lib/Update/index.d.ts +10 -10
  421. package/dist/lib/Update/index.js +22 -22
  422. package/dist/lib/User/index.d.ts +89 -89
  423. package/dist/lib/User/index.js +328 -328
  424. package/dist/lib/Wishlist/index.d.ts +5 -5
  425. package/dist/lib/Wishlist/index.js +10 -10
  426. package/dist/lib/base.d.ts +14 -14
  427. package/dist/lib/base.js +62 -62
  428. package/dist/lib/baseService.d.ts +17 -17
  429. package/dist/lib/baseService.js +69 -69
  430. package/dist/rules/ADD/utils/buyback.d.ts +4 -4
  431. package/dist/rules/ADD/utils/buyback.js +135 -135
  432. package/dist/rules/GR/constants/data.d.ts +26 -26
  433. package/dist/rules/GR/constants/data.js +81 -81
  434. package/dist/rules/GR/constants/expedition.d.ts +4 -4
  435. package/dist/rules/GR/constants/expedition.js +9 -9
  436. package/dist/rules/GR/constants/products.d.ts +27 -22
  437. package/dist/rules/GR/constants/products.js +272 -263
  438. package/dist/rules/GR/constants/products.js.map +1 -1
  439. package/dist/rules/GR/interfaces/cart.d.ts +85 -84
  440. package/dist/rules/GR/interfaces/cart.js +42 -41
  441. package/dist/rules/GR/interfaces/cart.js.map +1 -1
  442. package/dist/rules/GR/interfaces/data.d.ts +101 -101
  443. package/dist/rules/GR/interfaces/data.js +114 -114
  444. package/dist/rules/GR/interfaces/products.d.ts +61 -61
  445. package/dist/rules/GR/interfaces/products.js +10 -10
  446. package/dist/rules/GR/utils/cart.d.ts +95 -95
  447. package/dist/rules/GR/utils/cart.js +879 -839
  448. package/dist/rules/GR/utils/cart.js.map +1 -1
  449. package/dist/rules/GR/utils/data.d.ts +3 -3
  450. package/dist/rules/GR/utils/data.js +28 -28
  451. package/dist/rules/GR/utils/expedition.d.ts +140 -140
  452. package/dist/rules/GR/utils/expedition.js +2098 -2017
  453. package/dist/rules/GR/utils/expedition.js.map +1 -1
  454. package/dist/rules/GR/utils/g2.d.ts +209 -209
  455. package/dist/rules/GR/utils/g2.js +1002 -1002
  456. package/dist/rules/GR/utils/invoices.d.ts +51 -51
  457. package/dist/rules/GR/utils/invoices.js +218 -215
  458. package/dist/rules/GR/utils/invoices.js.map +1 -1
  459. package/dist/rules/GR/utils/products.d.ts +277 -277
  460. package/dist/rules/GR/utils/products.js +1358 -1350
  461. package/dist/rules/GR/utils/products.js.map +1 -1
  462. package/dist/rules/GR/utils/upsells.d.ts +113 -111
  463. package/dist/rules/GR/utils/upsells.js +215 -215
  464. package/dist/services/database/BaseProvider.d.ts +29 -29
  465. package/dist/services/database/BaseProvider.js +28 -28
  466. package/dist/services/database/BatchUtils.d.ts +14 -14
  467. package/dist/services/database/BatchUtils.js +43 -43
  468. package/dist/services/database/Config.d.ts +2 -2
  469. package/dist/services/database/Config.js +5 -5
  470. package/dist/services/database/DatabaseService.d.ts +125 -125
  471. package/dist/services/database/DatabaseService.js +237 -237
  472. package/dist/services/database/FirebaseProvider.d.ts +17 -17
  473. package/dist/services/database/FirebaseProvider.js +235 -235
  474. package/dist/services/database/NotFirebaseProvider.d.ts +49 -49
  475. package/dist/services/database/NotFirebaseProvider.js +262 -262
  476. package/dist/services/g2/G2OrderSlip.d.ts +49 -49
  477. package/dist/services/g2/G2OrderSlip.js +228 -228
  478. package/dist/services/g2/utils.d.ts +19 -19
  479. package/dist/services/g2/utils.js +969 -968
  480. package/dist/services/g2/utils.js.map +1 -1
  481. package/dist/services/logs/index.d.ts +23 -23
  482. package/dist/services/logs/index.js +66 -66
  483. package/dist/services/marketplace/BaseMarketServiceClass.d.ts +78 -78
  484. package/dist/services/marketplace/BaseMarketServiceClass.js +141 -141
  485. package/dist/services/marketplace/CardtraderServiceClass.d.ts +38 -38
  486. package/dist/services/marketplace/CardtraderServiceClass.js +226 -226
  487. package/dist/services/marketplace/utils.d.ts +17 -17
  488. package/dist/services/marketplace/utils.js +32 -32
  489. package/dist/services/products/BaseClass.d.ts +79 -79
  490. package/dist/services/products/BaseClass.js +144 -144
  491. package/dist/services/products/TCGService.d.ts +29 -29
  492. package/dist/services/products/TCGService.js +503 -503
  493. package/dist/services/products/utils.d.ts +31 -31
  494. package/dist/services/products/utils.js +144 -144
  495. package/dist/utils/algolia.d.ts +46 -46
  496. package/dist/utils/algolia.js +21 -21
  497. package/dist/utils/anonymisation.d.ts +54 -54
  498. package/dist/utils/anonymisation.js +280 -280
  499. package/dist/utils/array.d.ts +5 -5
  500. package/dist/utils/array.js +14 -14
  501. package/dist/utils/aws.d.ts +36 -36
  502. package/dist/utils/aws.js +154 -154
  503. package/dist/utils/booking.d.ts +30 -30
  504. package/dist/utils/booking.js +127 -127
  505. package/dist/utils/cart.d.ts +279 -274
  506. package/dist/utils/cart.js +1152 -1143
  507. package/dist/utils/cart.js.map +1 -1
  508. package/dist/utils/categories.d.ts +2 -2
  509. package/dist/utils/categories.js +54 -54
  510. package/dist/utils/cmv.d.ts +12 -12
  511. package/dist/utils/cmv.js +108 -108
  512. package/dist/utils/console.d.ts +6 -6
  513. package/dist/utils/console.js +59 -59
  514. package/dist/utils/context.d.ts +20 -20
  515. package/dist/utils/context.js +61 -61
  516. package/dist/utils/currency.d.ts +6 -6
  517. package/dist/utils/currency.js +91 -91
  518. package/dist/utils/data.d.ts +31 -31
  519. package/dist/utils/data.js +302 -302
  520. package/dist/utils/date.d.ts +1 -1
  521. package/dist/utils/date.js +16 -16
  522. package/dist/utils/dimensions.d.ts +3 -3
  523. package/dist/utils/dimensions.js +16 -16
  524. package/dist/utils/discount.d.ts +192 -192
  525. package/dist/utils/discount.js +1180 -1180
  526. package/dist/utils/errors.d.ts +133 -133
  527. package/dist/utils/errors.js +171 -171
  528. package/dist/utils/file-admin.d.ts +8 -8
  529. package/dist/utils/file-admin.js +39 -39
  530. package/dist/utils/file.d.ts +39 -39
  531. package/dist/utils/file.js +208 -208
  532. package/dist/utils/firebase-admin.d.ts +11 -11
  533. package/dist/utils/firebase-admin.js +73 -73
  534. package/dist/utils/firebase.d.ts +58 -58
  535. package/dist/utils/firebase.js +148 -148
  536. package/dist/utils/import.d.ts +1 -1
  537. package/dist/utils/import.js +21 -21
  538. package/dist/utils/inventories.d.ts +101 -101
  539. package/dist/utils/inventories.js +467 -467
  540. package/dist/utils/locale.d.ts +24 -24
  541. package/dist/utils/locale.js +91 -91
  542. package/dist/utils/mailchimp.d.ts +58 -58
  543. package/dist/utils/mailchimp.js +531 -531
  544. package/dist/utils/mathUtils.d.ts +17 -17
  545. package/dist/utils/mathUtils.js +324 -324
  546. package/dist/utils/mongodb.d.ts +1 -1
  547. package/dist/utils/mongodb.js +22 -22
  548. package/dist/utils/object.d.ts +32 -32
  549. package/dist/utils/object.js +133 -133
  550. package/dist/utils/payment.d.ts +10 -10
  551. package/dist/utils/payment.js +23 -23
  552. package/dist/utils/products.d.ts +47 -47
  553. package/dist/utils/products.js +214 -214
  554. package/dist/utils/promiseToPurchase.d.ts +121 -121
  555. package/dist/utils/promiseToPurchase.js +329 -329
  556. package/dist/utils/prosprsearch.d.ts +42 -42
  557. package/dist/utils/prosprsearch.js +216 -216
  558. package/dist/utils/refunds.d.ts +2 -2
  559. package/dist/utils/refunds.js +21 -21
  560. package/dist/utils/sdc.d.ts +10 -10
  561. package/dist/utils/sdc.js +1309 -1309
  562. package/dist/utils/searchIndexes.d.ts +58 -58
  563. package/dist/utils/searchIndexes.js +247 -247
  564. package/dist/utils/services.d.ts +44 -44
  565. package/dist/utils/services.js +415 -415
  566. package/dist/utils/shipment.d.ts +110 -110
  567. package/dist/utils/shipment.js +341 -345
  568. package/dist/utils/shipment.js.map +1 -1
  569. package/dist/utils/simpletexting.d.ts +2 -2
  570. package/dist/utils/simpletexting.js +45 -45
  571. package/dist/utils/sliders.d.ts +4 -4
  572. package/dist/utils/sliders.js +24 -24
  573. package/dist/utils/string.d.ts +16 -16
  574. package/dist/utils/string.js +192 -192
  575. package/dist/utils/tcgService.d.ts +129 -129
  576. package/dist/utils/tcgService.js +494 -494
  577. package/dist/utils/tools.d.ts +5 -5
  578. package/dist/utils/tools.js +13 -13
  579. package/dist/utils/transferRequests.d.ts +43 -43
  580. package/dist/utils/transferRequests.js +67 -67
  581. package/dist/utils/update.d.ts +7 -7
  582. package/dist/utils/update.js +137 -137
  583. package/dist/utils/weight.d.ts +3 -3
  584. package/dist/utils/weight.js +16 -16
  585. package/dist/utils/zones.d.ts +11 -11
  586. package/dist/utils/zones.js +218 -218
  587. package/package.json +107 -107
  588. package/publish.sh +143 -143
  589. package/readme.md +182 -182
@@ -1,546 +1,546 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const isEqual_1 = __importDefault(require("lodash/isEqual"));
7
- const toNumber_1 = __importDefault(require("lodash/toNumber"));
8
- const DatabaseService_1 = __importDefault(require("../../services/database/DatabaseService"));
9
- const baseService_1 = require("../baseService");
10
- const TransferRequest_1 = require("../../Interfaces/TransferRequest");
11
- const IInventoryItem_1 = require("../../Interfaces/Product/IInventoryItem");
12
- const Cart_1 = require("../../Interfaces/Cart");
13
- const console_1 = require("../../utils/console");
14
- const string_1 = require("../../utils/string");
15
- const inventories_1 = require("../../utils/inventories");
16
- class Inventory extends baseService_1.BaseServiceClass {
17
- constructor(data, collection, user) {
18
- super(data, collection, user);
19
- this.save = async (newInventoryData, options, saveToDatabase = true, update, merge) => {
20
- if (!!!this.data().sku)
21
- return false;
22
- const exists = await DatabaseService_1.default.getDocuments(this._collection.path, {
23
- query: [{ field: 'sku', operator: '==', value: this.data().sku }]
24
- });
25
- if (!!!exists.length) {
26
- return await super.save(Object.assign(Object.assign({}, (newInventoryData ? newInventoryData : this.data())), { id: (0, string_1.string_to_slug)(this.data().sku) }), options, saveToDatabase, update, merge);
27
- }
28
- else {
29
- try {
30
- const doc = exists[0];
31
- const newData = Object.assign(Object.assign({}, this.data()), (!!newInventoryData ? newInventoryData : {}));
32
- await super.save(Object.assign(Object.assign(Object.assign({}, newData), { last_update_by: this.user() }), (!!!newData.id && !!doc ? { id: doc.id } : {})), options, saveToDatabase, update, merge);
33
- }
34
- catch (err) {
35
- console.log('err', err);
36
- return false;
37
- }
38
- return true;
39
- }
40
- };
41
- this.delete = async () => {
42
- try {
43
- await DatabaseService_1.default.deleteDocument(this._collection.path, (0, string_1.string_to_slug)(this.data().sku));
44
- return true;
45
- }
46
- catch (err) {
47
- console.log(err);
48
- return false;
49
- }
50
- };
51
- this.getHistoryInventory = async () => {
52
- if (!!!this._collection || DatabaseService_1.default.getPathParent(this._collection.path) == '/') {
53
- throw new Error('Collection should be defined and have a parent.');
54
- }
55
- try {
56
- const historyQuery = await DatabaseService_1.default.getDocuments(DatabaseService_1.default.addToPath(DatabaseService_1.default.getPathParent(this._collection.path), 'inventory_history'), {
57
- query: [
58
- {
59
- field: 'sku',
60
- operator: 'in',
61
- value: [this.data().sku, this.data().sku.toLowerCase(), this.data().sku.toUpperCase()]
62
- }
63
- ],
64
- orderBy: 'at',
65
- order: 'desc',
66
- limit: 50
67
- });
68
- return historyQuery.map((d) => (Object.assign(Object.assign({}, d.data), { id: d.id })));
69
- }
70
- catch (err) {
71
- (0, console_1.errorMessage)(`Could not get inventory history${err.message}`);
72
- return [];
73
- }
74
- };
75
- this.setQuantitiesWithInventoryItemByStore = async (inventory) => {
76
- return await this.save({
77
- inventories: this.data().inventories.map((_inventory) => {
78
- if (_inventory.store_id.toLowerCase() !== (inventory.store_id || '').toLowerCase())
79
- return _inventory;
80
- return Object.assign(Object.assign({}, _inventory), { qty: Object.assign(Object.assign({}, _inventory.qty), inventory.qty) });
81
- })
82
- }, undefined, true, true);
83
- };
84
- this.setQuantitiesWithWebInventoryItemByStore = async (inventory, webQty) => {
85
- let isDiff = false;
86
- if (!!!this._data.web_inventory ||
87
- !!!this._data.web_inventory.available ||
88
- this._data.web_inventory.available !== webQty)
89
- isDiff = true;
90
- for (const inv of this._data.inventories) {
91
- if (!!inventory.find((i) => (i.store_id || '').toLowerCase() === inv.store_id.toLowerCase() && !(0, isEqual_1.default)(i.qty, inv.qty)))
92
- isDiff = true;
93
- }
94
- if (!isDiff) {
95
- console.log('Inventory didnt change, not saving : ', this._data.sku);
96
- return;
97
- }
98
- return await this.save({
99
- inventories: this.data().inventories.map((_inventory) => {
100
- const newInv = inventory.find((i) => _inventory.store_id.toLowerCase() === (i.store_id || '').toLowerCase());
101
- if (!!!newInv)
102
- return _inventory;
103
- return Object.assign(Object.assign({}, _inventory), { qty: Object.assign(Object.assign({}, _inventory.qty), newInv.qty) });
104
- }),
105
- web_inventory: Object.assign(Object.assign(Object.assign({}, (0, IInventoryItem_1.getDefaultInventoryQuantities)()), (this.data().web_inventory || {})), { available: webQty })
106
- }, undefined, true, true);
107
- };
108
- this._modifyQuantitiesByStore = async (storeId, type, operation, amount = 0, cartType, saveToDatabase = true, updateWeb) => {
109
- var _a;
110
- if (!!!operation)
111
- return 'Must include operation type';
112
- let isWeb = false;
113
- let newQuantity = undefined;
114
- const inventories = this._data.inventories.map((storeInventory) => {
115
- if (storeInventory.store_id !== storeId)
116
- return storeInventory;
117
- const currentQte = (0, toNumber_1.default)(storeInventory.qty[type] || 0);
118
- if (storeInventory.can_sell_online || (!!cartType && cartType !== Cart_1.CartTypeEnum.POS_TRANSACTIONNAL))
119
- isWeb = true;
120
- newQuantity =
121
- operation === IInventoryItem_1.inventoryOperationEnum.ADD ? currentQte + (0, toNumber_1.default)(amount) : currentQte - (0, toNumber_1.default)(amount);
122
- return Object.assign(Object.assign({}, storeInventory), { qty: Object.assign(Object.assign({}, storeInventory.qty), { [type]: newQuantity }) });
123
- });
124
- const willRemoveQuantities = (operation == IInventoryItem_1.inventoryOperationEnum.ADD && amount < 0) ||
125
- (operation == IInventoryItem_1.inventoryOperationEnum.REMOVE && amount > 0);
126
- this._data = Object.assign(Object.assign(Object.assign({}, this._data), { inventories: inventories }), (!!isWeb && typeof newQuantity === 'number' && !!updateWeb
127
- ? {
128
- web_inventory: Object.assign(Object.assign({}, ((_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)())), {
129
- // NEW : If web inventory is updated with store, add props to stop inventory
130
- // from adjusting to high negative values if operation will REMOVE quantities
131
- [type]: this._getNewWebQuantity(type, operation, amount, willRemoveQuantities) })
132
- }
133
- : {}));
134
- if (!!saveToDatabase) {
135
- await this.save({}, undefined, saveToDatabase);
136
- }
137
- };
138
- this._modifyQuantitiesOnlyWeb = async (type, operation, amount = 0, saveToDatabase) => {
139
- var _a;
140
- if (!!!operation)
141
- return 'Must include operation type';
142
- let newQuantity = this._getNewWebQuantity(type, operation, amount);
143
- await this.save({
144
- web_inventory: Object.assign(Object.assign({}, ((_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)())), { [type]: newQuantity })
145
- }, undefined, saveToDatabase);
146
- };
147
- /**
148
- * Returns calculated new value for web inventory
149
- * @param type - The inventory type to calculate
150
- * @param operation - If quantities should be added or removed
151
- * @param amount - The quantity to adjust
152
- * @param ignoreNewNegativeValues - Optionnal. If true, will replace calculated qte with 0 if current qte was positive, and keep current value if it was already negative and is 'available' inventory (since only available web quantites could be negative).
153
- */
154
- this._getNewWebQuantity = (type, operation, amount, ignoreNewNegativeValues) => {
155
- var _a, _b;
156
- const webInventory = (_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)();
157
- const currentQte = (0, toNumber_1.default)((_b = webInventory[type]) !== null && _b !== void 0 ? _b : 0);
158
- let newValue = operation === IInventoryItem_1.inventoryOperationEnum.ADD
159
- ? (0, toNumber_1.default)(currentQte) + (0, toNumber_1.default)(amount)
160
- : (0, toNumber_1.default)(currentQte) - (0, toNumber_1.default)(amount);
161
- if (ignoreNewNegativeValues && newValue < 0)
162
- newValue = currentQte < 0 && type == 'available' ? currentQte : 0;
163
- return newValue;
164
- };
165
- this._orderCompleted = async (storeId, qte, cartType) => {
166
- // If order was completed, we need to ajust :
167
- // - both PROCESSING and COMPLETED quantities
168
- // - for WEB and STORE inventories
169
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, true);
170
- await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, true);
171
- };
172
- this.handleOrderDelivered = async (storeId, qte, cartType) => {
173
- await this._orderCompleted(storeId, qte, cartType);
174
- return this.data();
175
- };
176
- this.handleOrderPickedupInStore = async (storeId, qte, cartType) => {
177
- await this._orderCompleted(storeId, qte, cartType);
178
- return this.data();
179
- };
180
- this.handleOrderProcessedForShipping = async (storeId, qte, cartType) => {
181
- await this._orderCompleted(storeId, qte, cartType);
182
- return this.data();
183
- };
184
- this.handleNewQuantities = async (storeId, qte, cartType, saveToDatabase) => {
185
- const shouldSaveToDB = typeof saveToDatabase != 'undefined' ? saveToDatabase : true;
186
- // If quantities added, we need to ajust :
187
- // - AVAILABLE quantities
188
- // - for WEB and STORE inventories
189
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, shouldSaveToDB, true);
190
- return this._data;
191
- };
192
- this.handleUpdateWebInventory = async (qte) => {
193
- // After inventory is updated through CSV import, we need to adjust :
194
- // - AVAILABLE quantities
195
- // - for WEB inventory
196
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, true);
197
- };
198
- this.handleProductSold = async (storeId, qte, cartType, web = false) => {
199
- // If product was sold and is a web transaction, we need to ajust :
200
- // - both AVAILABLE and PROCESSING quantities
201
- // - for only WEB inventory
202
- if (!!web) {
203
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
204
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte);
205
- return this.data();
206
- }
207
- // If product was sold and is a POS transaction (!!!web), we need to ajust :
208
- // - both AVAILABLE and COMPLETED quantities
209
- // - for WEB and STORE inventory
210
- // - only if storeId is defined
211
- if (!!storeId) {
212
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, true);
213
- await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, true);
214
- }
215
- else {
216
- console.log('no storeId provided!');
217
- }
218
- return this.data();
219
- };
220
- /**
221
- * Update inventory on cart item modified (POS modify cart process).
222
- * @param storeId The store associated to the order. If cart still at status 5, might be undefined (unless quantities already reserved for order)
223
- * @param qte The quantities to ajust
224
- * @param cartType The associated cart's type
225
- * @param options.onlyWeb Optionnal. If only web inventory should be ajusted
226
- * @param options.reservedQteDiff Optionnal. Reserved quantities difference for given cart item. Expressed in sell_unit (must be converted to inventory_unit)
227
- * @returns {Promise<IInventoryItem>}
228
- */
229
- this.handleProductModified = async (storeId, qte, cartType, options = {}) => {
230
- var _a;
231
- // Save store inventory if not only web and storeId is provided
232
- if (!!!options.onlyWeb && !!storeId) {
233
- // If quantities were already reserved for order, should only update inventory according to reserved quantity difference
234
- let qteToUse = (_a = options.reservedQteDiff) !== null && _a !== void 0 ? _a : qte;
235
- await this._modifyQuantitiesByStore(storeId, 'available', qteToUse < 0 ? IInventoryItem_1.inventoryOperationEnum.ADD : IInventoryItem_1.inventoryOperationEnum.REMOVE, qteToUse < 0 ? qteToUse * -1 : qteToUse, cartType, false, // save to database (will be done later on web update)
236
- false // save web (will be done later)
237
- );
238
- await this._modifyQuantitiesByStore(storeId, 'processing', qteToUse < 0 ? IInventoryItem_1.inventoryOperationEnum.REMOVE : IInventoryItem_1.inventoryOperationEnum.ADD, qteToUse < 0 ? qteToUse * -1 : qteToUse, cartType, false, // save to database (will be done later on web update)
239
- false // save web (will be done laters
240
- );
241
- }
242
- // Always update web quantities with total modified quantities
243
- await this._modifyQuantitiesOnlyWeb('available', qte < 0 ? IInventoryItem_1.inventoryOperationEnum.ADD : IInventoryItem_1.inventoryOperationEnum.REMOVE, qte < 0 ? qte * -1 : qte, false);
244
- await this._modifyQuantitiesOnlyWeb('processing', qte < 0 ? IInventoryItem_1.inventoryOperationEnum.REMOVE : IInventoryItem_1.inventoryOperationEnum.ADD, qte < 0 ? qte * -1 : qte, true // save to database done here for all updates to inventories and web_inventory
245
- );
246
- return this.data();
247
- };
248
- /**
249
- * Update inventory for a specific item if order was cancelled or refunded.
250
- * @param toStoreId The store where quantities will be ADDED
251
- * @param fromStoreId The store where quantities will vbe REMOVED
252
- * @param qte The quantity to ajust
253
- * @param operationType If cart was cancelled or refunded
254
- * @param cartType If cart is web, POS, or Pickup Now
255
- * @param options.deleteItem Optionnal. If item should not be returned to the stores inventory (broken, misplaced, old batch, etc...)
256
- * @param options.onlyWeb Optionnal. If inventory should only be updated for web inventory (and not for stores). Mostly depends on the cart's status when cancelled.
257
- * @param options.orderAssociatedTransfers Optionnal. Array of TransferRequest objects associated to cart. Used when cart is cancelled
258
- * @param options.saveToDatabase Optionnal. Mostly used for dev purpuses (and for unit testing). Otherwise, save is done logically at the end of the update process
259
- * @param options.reservedQte Optionnal. Quantity reserved in processing inventory for cart item as of now. Expressed in sell_unit (must be converted to inventory_unit)
260
- * @param options.otherUnits Optionnal. Other units for corresponding cart item. If not defined, will use those found in InventoryItem data
261
- */
262
- this.handleOrderCancelled = async (toStoreId, fromStoreId, qte, operationType, cartType, options = {}) => {
263
- const otherUnitsToUse = options.otherUnits || this._data.other_units;
264
- // If order was cancelled, we need to ajust :
265
- // - PROCESSING quantities always, and AVAILABLE quantities only if item should return in stock
266
- // - for WEB inventory, and STORE inventory if onlyWeb is false, or order has associated transfers
267
- // If order was refunded, we need to ajust :
268
- // - Take quantities from COMPLETED and put them back in AVAILABLE
269
- // - for WEB and STORE inventory, in this case onlyWeb is always false
270
- // ----------------------------------------------------------
271
- // #region CHECK FOR QUANTITIES TO AJUST IN STORE
272
- let qteToUseForStoreUpdate = !!!options.onlyWeb ? qte : 0;
273
- if (!!options.orderAssociatedTransfers && operationType == 'cancelled' && !!options.onlyWeb) {
274
- // A. Calculate initial quantites asked for transfer
275
- let initialQuantitiesInTransfers = 0;
276
- let receivedQuantitesInTransfers = 0;
277
- for (let transfer of options.orderAssociatedTransfers) {
278
- // Skip transfers that were split at creation, to fetch only initial quantities
279
- if (!!!transfer.data().original_transfer_id) {
280
- initialQuantitiesInTransfers += transfer.getOriginalRequestedQuantity(this._data.sku);
281
- }
282
- // Get quantities received from transfers with status RECEIVED or RECEIVED_PARTIAL
283
- if ([TransferRequest_1.TransferRequestStatusEnum.RECEIVED, TransferRequest_1.TransferRequestStatusEnum.RECEIVED_PARTIAL].includes(transfer.data().status)) {
284
- const sameProd = transfer.data().products.find((p) => p.sku == this._data.sku);
285
- if (!!sameProd)
286
- receivedQuantitesInTransfers += sameProd.qte_received || 0;
287
- }
288
- }
289
- // B. Set currently in processing quantities to ...
290
- // ...reserved quantities (if defined)
291
- if (typeof options.reservedQte != 'undefined') {
292
- qteToUseForStoreUpdate = (0, inventories_1.getConvertedUnitQuantity)(otherUnitsToUse, options.reservedQte, 'inventory_unit');
293
- }
294
- else {
295
- // ...the difference between total qte for item in cart and quantities initially set for transfer requests
296
- qteToUseForStoreUpdate = qte - initialQuantitiesInTransfers;
297
- if (qteToUseForStoreUpdate < 0)
298
- qteToUseForStoreUpdate = 0;
299
- // ... and add quantities received from transfers to processing quantites
300
- qteToUseForStoreUpdate += receivedQuantitesInTransfers;
301
- }
302
- }
303
- if (qteToUseForStoreUpdate != 0) {
304
- await this._modifyQuantitiesByStore(fromStoreId, operationType === 'refunded' ? 'completed' : 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qteToUseForStoreUpdate, cartType, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : !!options.deleteItem // save to database
305
- );
306
- if (!!!options.deleteItem) {
307
- await this._modifyQuantitiesByStore(toStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qteToUseForStoreUpdate, cartType, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : true // save to database
308
- );
309
- }
310
- }
311
- // #endregion
312
- // ----------------------------------------------------------
313
- // #region AJUST WEB QUANTITIES
314
- if (!!!options.deleteItem) {
315
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, false);
316
- }
317
- await this._modifyQuantitiesOnlyWeb(operationType === 'refunded' ? 'completed' : 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : true);
318
- // #endregion
319
- return this._data;
320
- };
321
- this.handleOrderReadyForProcessing = async (storeId, qte, cartType) => {
322
- // If order is ready for processing, we need to ajust :
323
- // - both AVAILABLE and PROCESSING quantities
324
- // - for only STORE inventory
325
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, false, false);
326
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, true, false);
327
- return this.data();
328
- };
329
- this.handleOrderInDelivery = async (storeId, qte, cartType) => {
330
- // If order is in delivery, we need to ajust :
331
- // - both PROCESSING and IN_TRANSIT quantities
332
- // - for only STORE inventory
333
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
334
- await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType);
335
- return this.data();
336
- };
337
- this.handleChangedProcessingStore = async (oldStoreId, newStoreId, qte, cartType) => {
338
- // If processing store was updated :
339
- // - for old processing store :
340
- // - remove qties from processing, add to available
341
- // - for new processing store :
342
- // - remove qties from available, add to processing
343
- // - in both cases, only for store inventory (no changes to web inventory)
344
- await this._modifyQuantitiesByStore(oldStoreId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
345
- await this._modifyQuantitiesByStore(oldStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, false);
346
- await this._modifyQuantitiesByStore(newStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
347
- await this._modifyQuantitiesByStore(newStoreId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true);
348
- return this.data();
349
- };
350
- // ---------------------------------------------------------------
351
- // #region TRANSFER REQUESTS INVENTORY MANAGEMENT
352
- this.handleTransferInTransit = async (storeId, qte, cartType, forOrder, fromProcessing) => {
353
- // If transfer is now in transit, we need to ajust :
354
- // - both AVAILABLE|PROCESSING and IN_TRANSIT quantities
355
- // - for STORE inventory always
356
- // - for WEB inventory if transfer was not created though an order
357
- // - inventory removed by default from AVAILABLE inventory, or PROCESSING if fromProcessing=true
358
- await this._modifyQuantitiesByStore(storeId, fromProcessing ? 'processing' : 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, !forOrder);
359
- await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, !forOrder);
360
- return this.data();
361
- };
362
- /**
363
- * Adjust store quantities
364
- * @param storeFromId Origin store id
365
- * @param storeToId Target store id
366
- * @param qte Total quantity received
367
- * @param cartType Cart type, GR only?
368
- * @param options.forOrder True if associated to an order
369
- * @param options.maxProcessingQte Quantity to place in processing, extra will go in available
370
- * @param options.skipWebUpdateForAvailable If web inventory update should be skipped for available quantities (for when transfer is received for a already processed cart)
371
- * @returns the new inventory item data
372
- */
373
- this.handleTransferReceived = async (storeFromId, storeToId, qte, cartType, options) => {
374
- // FROM STORE
375
- // If order transfer was received, we need to ajust :
376
- // - only IN_TRANSIT quantities
377
- // - for only STORE inventory
378
- // - of the storeFromID
379
- await this._modifyQuantitiesByStore(storeFromId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, // don't save to database here, will be done on next steps
380
- !options.forOrder);
381
- // TO STORE
382
- // If order transfer was received, we need to ajust :
383
- // - if transfer is associated to order :
384
- // - only IN_TRANSIT quantities
385
- // - only for STORE inventory
386
- //
387
- // - else :
388
- // - only AVAILABLE quantities
389
- // - for STORE inventory always, and WEB inventory
390
- if (options.maxProcessingQte && options.forOrder) {
391
- qte -= options.maxProcessingQte;
392
- await this._modifyQuantitiesByStore(storeToId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, options.maxProcessingQte, cartType, qte <= 0, // save to database only if logic will not enter next check
393
- !options.forOrder);
394
- }
395
- if (qte > 0) {
396
- // If additionnal quantities sent with transfer were reserved in inventory when transfer changed to status TO_BE_PREPARED, then we need to remove them from reserved quantities
397
- if (options.forOrder && options.additionnalWebQuantitiesReserved && !options.skipWebUpdateForAvailable) {
398
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
399
- }
400
- await this._modifyQuantitiesByStore(storeToId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, // always save to database here
401
- !options.skipWebUpdateForAvailable // only update web inventory if property not set to skip operation
402
- );
403
- }
404
- return this.data();
405
- };
406
- /**
407
- * Cancel value in transit - Adjust the in transit negatively without adjusting any other quantity.
408
- * @param storeId The store to apply the change
409
- * @param qte The quantity to remove
410
- * @param cartType Cart type, GR only?
411
- * @param forOrder True if associated to an order
412
- * @returns updated data
413
- */
414
- this.handleCancelInTransit = async (storeId, qte, cartType, forOrder) => {
415
- await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, true, !forOrder);
416
- return this.data();
417
- };
418
- /**
419
- * Cancelled transfer with status TO_BE_PREPARED - Take quantities reserved in processing inventory, and put back in available. ⚠️ _**IMPORTANT** - Should first check if space has associated space_option before using function!_
420
- * @param storeId The store to apply the change
421
- * @param qte The quantity to remove
422
- * @param cartType Cart type, GR only?
423
- * @param forOrder True if associated to an order
424
- * @param additionnalWebQuantitiesReserved Extra quantities were added to transfer (other than those needed for cart). If so, they were reserved, and must return in stock too.
425
- */
426
- this.handleCancelToBePrepared = async (storeId, qte, cartType, forOrder, additionnalWebQuantitiesReserved) => {
427
- const qteForWeb = !!additionnalWebQuantitiesReserved
428
- ? additionnalWebQuantitiesReserved
429
- : !forOrder
430
- ? qte
431
- : undefined;
432
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, false);
433
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, typeof qteForWeb == 'undefined', false);
434
- // Save web quantities if needed
435
- if (typeof qteForWeb != 'undefined') {
436
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qteForWeb, false);
437
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qteForWeb, true);
438
- }
439
- return this.data();
440
- };
441
- /**
442
- * Reserve inventory for store on transfer changed to status TO_BE_PREPARED. ⚠️ _**IMPORTANT** - Should first check if space has associated space_option before using function!_
443
- * @param storeId The store ID for the "from" store in transfer.
444
- * @param qte The quantity to add or remove from inventory.
445
- * @param cartType Optionnal. Passed to _modifyQuantitiesByStore. Used to check if web inventory should be updated.
446
- * @param forOrder Optionnal. If transfer is associated to an order. WIll not update web inventory if true (since it was already reserved with order)
447
- * @param webQte Optionnal. If provided, used as value to update web inventory. Also bypasses check forOrder, so if provided web inventory is ALWAYS ypdated with provided value.
448
- */
449
- this.handleTransferToBePrepared = async (storeId, qte, cartType, forOrder, webQte) => {
450
- const webQteToUpdate = typeof webQte != 'undefined' ? webQte : !forOrder ? qte : undefined;
451
- // ----------------------------------------------
452
- // Update store inventories first
453
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, false);
454
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, typeof webQteToUpdate == 'undefined', false);
455
- // ---------------------------------------------------------------------------
456
- // Update web inventory
457
- if (typeof webQteToUpdate != 'undefined') {
458
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, webQteToUpdate, false);
459
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, webQteToUpdate, true);
460
- }
461
- return this.data();
462
- };
463
- // #endregion
464
- this.handlePOSCartFastComplete = async (storeId, qte, cartType, quantitiesAlreadyReserved = 0) => {
465
- // If order was triggered by POS Fast complete (button in order interface dashboard), we need to ajust :
466
- // - both PROCESSING and COMPLETE quantities
467
- // - for only WEB inventory
468
- // - if store can sell online
469
- const fromStoreIsWeb = this.data().inventories.find((inventory) => inventory.store_id === storeId).can_sell_online;
470
- if (!!fromStoreIsWeb) {
471
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
472
- await this._modifyQuantitiesOnlyWeb('completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, false);
473
- }
474
- const quantitiesNotReserved = qte - quantitiesAlreadyReserved;
475
- // AND, we need to ajust :
476
- // - potentially AVAILABLE quantities with quantitiesNotReserved (if quantitiesNotReserved != 0)
477
- // - potentially PROCESSING quantities with quantitiesAlreadyReserved (if quantitiesAlreadyReserved != 0)
478
- // - always COMPLETE quantities with full qte from item
479
- // - for only STORE inventory
480
- if (quantitiesNotReserved != 0) {
481
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, quantitiesNotReserved, cartType, false, false);
482
- }
483
- if (quantitiesAlreadyReserved != 0) {
484
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, quantitiesAlreadyReserved, cartType, false, false);
485
- }
486
- await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, false);
487
- return this.data();
488
- };
489
- this.handleChangeCanSellOnline = async (storeId, qte, newCanSellOnline, saveToDatabase) => {
490
- const storeInventoryIndex = this.data().inventories.findIndex((i) => i.store_id === storeId);
491
- if (storeInventoryIndex === -1)
492
- return;
493
- const currentWebInventory = this.data().web_inventory;
494
- const currentAvailable = !!currentWebInventory && !!currentWebInventory.available ? currentWebInventory.available : 0;
495
- const partial = {
496
- web_inventory: Object.assign(Object.assign(Object.assign({}, (0, IInventoryItem_1.getDefaultInventoryQuantities)()), (!!this.data().web_inventory ? this.data().web_inventory : {})), { available: !!newCanSellOnline ? currentAvailable + qte : currentAvailable - qte }),
497
- inventories: [
498
- ...this.data().inventories.slice(0, storeInventoryIndex),
499
- Object.assign(Object.assign({}, this.data().inventories[storeInventoryIndex]), { can_sell_online: newCanSellOnline }),
500
- ...this.data().inventories.slice(storeInventoryIndex + 1)
501
- ]
502
- };
503
- if (!!saveToDatabase) {
504
- await this.save(partial);
505
- }
506
- else {
507
- this._data = Object.assign(Object.assign({}, this.data()), partial);
508
- }
509
- return this.data();
510
- };
511
- /**
512
- * Reserve a quantity from the available web inventory and store if provided
513
- * @param qty The quantity to reserve
514
- * @param storeId The store id to use for reservation, undefined if web only
515
- * @returns the new inventory data
516
- */
517
- this.handleReserveInventory = async (qty, storeId) => {
518
- if (!!storeId) {
519
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, Cart_1.CartTypeEnum.POS, false, true);
520
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qty, Cart_1.CartTypeEnum.POS, true, true);
521
- return this.data();
522
- }
523
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, false);
524
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, qty);
525
- return this.data();
526
- };
527
- /**
528
- * Release a quantity from the processing web inventory and store if provided
529
- * @param qty The quantity to release
530
- * @param storeId The store id to use for reservation, undefined if web only
531
- * @returns the new inventory data
532
- */
533
- this.handleUnreserveInventory = async (qty, storeId) => {
534
- if (!!storeId) {
535
- await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, Cart_1.CartTypeEnum.POS, false, true);
536
- await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qty, Cart_1.CartTypeEnum.POS, true, true);
537
- return this.data();
538
- }
539
- await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, false);
540
- await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qty);
541
- return this.data();
542
- };
543
- }
544
- }
545
- exports.default = Inventory;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const isEqual_1 = __importDefault(require("lodash/isEqual"));
7
+ const toNumber_1 = __importDefault(require("lodash/toNumber"));
8
+ const DatabaseService_1 = __importDefault(require("../../services/database/DatabaseService"));
9
+ const baseService_1 = require("../baseService");
10
+ const TransferRequest_1 = require("../../Interfaces/TransferRequest");
11
+ const IInventoryItem_1 = require("../../Interfaces/Product/IInventoryItem");
12
+ const Cart_1 = require("../../Interfaces/Cart");
13
+ const console_1 = require("../../utils/console");
14
+ const string_1 = require("../../utils/string");
15
+ const inventories_1 = require("../../utils/inventories");
16
+ class Inventory extends baseService_1.BaseServiceClass {
17
+ constructor(data, collection, user) {
18
+ super(data, collection, user);
19
+ this.save = async (newInventoryData, options, saveToDatabase = true, update, merge) => {
20
+ if (!!!this.data().sku)
21
+ return false;
22
+ const exists = await DatabaseService_1.default.getDocuments(this._collection.path, {
23
+ query: [{ field: 'sku', operator: '==', value: this.data().sku }]
24
+ });
25
+ if (!!!exists.length) {
26
+ return await super.save(Object.assign(Object.assign({}, (newInventoryData ? newInventoryData : this.data())), { id: (0, string_1.string_to_slug)(this.data().sku) }), options, saveToDatabase, update, merge);
27
+ }
28
+ else {
29
+ try {
30
+ const doc = exists[0];
31
+ const newData = Object.assign(Object.assign({}, this.data()), (!!newInventoryData ? newInventoryData : {}));
32
+ await super.save(Object.assign(Object.assign(Object.assign({}, newData), { last_update_by: this.user() }), (!!!newData.id && !!doc ? { id: doc.id } : {})), options, saveToDatabase, update, merge);
33
+ }
34
+ catch (err) {
35
+ console.log('err', err);
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ };
41
+ this.delete = async () => {
42
+ try {
43
+ await DatabaseService_1.default.deleteDocument(this._collection.path, (0, string_1.string_to_slug)(this.data().sku));
44
+ return true;
45
+ }
46
+ catch (err) {
47
+ console.log(err);
48
+ return false;
49
+ }
50
+ };
51
+ this.getHistoryInventory = async () => {
52
+ if (!!!this._collection || DatabaseService_1.default.getPathParent(this._collection.path) == '/') {
53
+ throw new Error('Collection should be defined and have a parent.');
54
+ }
55
+ try {
56
+ const historyQuery = await DatabaseService_1.default.getDocuments(DatabaseService_1.default.addToPath(DatabaseService_1.default.getPathParent(this._collection.path), 'inventory_history'), {
57
+ query: [
58
+ {
59
+ field: 'sku',
60
+ operator: 'in',
61
+ value: [this.data().sku, this.data().sku.toLowerCase(), this.data().sku.toUpperCase()]
62
+ }
63
+ ],
64
+ orderBy: 'at',
65
+ order: 'desc',
66
+ limit: 50
67
+ });
68
+ return historyQuery.map((d) => (Object.assign(Object.assign({}, d.data), { id: d.id })));
69
+ }
70
+ catch (err) {
71
+ (0, console_1.errorMessage)(`Could not get inventory history${err.message}`);
72
+ return [];
73
+ }
74
+ };
75
+ this.setQuantitiesWithInventoryItemByStore = async (inventory) => {
76
+ return await this.save({
77
+ inventories: this.data().inventories.map((_inventory) => {
78
+ if (_inventory.store_id.toLowerCase() !== (inventory.store_id || '').toLowerCase())
79
+ return _inventory;
80
+ return Object.assign(Object.assign({}, _inventory), { qty: Object.assign(Object.assign({}, _inventory.qty), inventory.qty) });
81
+ })
82
+ }, undefined, true, true);
83
+ };
84
+ this.setQuantitiesWithWebInventoryItemByStore = async (inventory, webQty) => {
85
+ let isDiff = false;
86
+ if (!!!this._data.web_inventory ||
87
+ !!!this._data.web_inventory.available ||
88
+ this._data.web_inventory.available !== webQty)
89
+ isDiff = true;
90
+ for (const inv of this._data.inventories) {
91
+ if (!!inventory.find((i) => (i.store_id || '').toLowerCase() === inv.store_id.toLowerCase() && !(0, isEqual_1.default)(i.qty, inv.qty)))
92
+ isDiff = true;
93
+ }
94
+ if (!isDiff) {
95
+ console.log('Inventory didnt change, not saving : ', this._data.sku);
96
+ return;
97
+ }
98
+ return await this.save({
99
+ inventories: this.data().inventories.map((_inventory) => {
100
+ const newInv = inventory.find((i) => _inventory.store_id.toLowerCase() === (i.store_id || '').toLowerCase());
101
+ if (!!!newInv)
102
+ return _inventory;
103
+ return Object.assign(Object.assign({}, _inventory), { qty: Object.assign(Object.assign({}, _inventory.qty), newInv.qty) });
104
+ }),
105
+ web_inventory: Object.assign(Object.assign(Object.assign({}, (0, IInventoryItem_1.getDefaultInventoryQuantities)()), (this.data().web_inventory || {})), { available: webQty })
106
+ }, undefined, true, true);
107
+ };
108
+ this._modifyQuantitiesByStore = async (storeId, type, operation, amount = 0, cartType, saveToDatabase = true, updateWeb) => {
109
+ var _a;
110
+ if (!!!operation)
111
+ return 'Must include operation type';
112
+ let isWeb = false;
113
+ let newQuantity = undefined;
114
+ const inventories = this._data.inventories.map((storeInventory) => {
115
+ if (storeInventory.store_id !== storeId)
116
+ return storeInventory;
117
+ const currentQte = (0, toNumber_1.default)(storeInventory.qty[type] || 0);
118
+ if (storeInventory.can_sell_online || (!!cartType && cartType !== Cart_1.CartTypeEnum.POS_TRANSACTIONNAL))
119
+ isWeb = true;
120
+ newQuantity =
121
+ operation === IInventoryItem_1.inventoryOperationEnum.ADD ? currentQte + (0, toNumber_1.default)(amount) : currentQte - (0, toNumber_1.default)(amount);
122
+ return Object.assign(Object.assign({}, storeInventory), { qty: Object.assign(Object.assign({}, storeInventory.qty), { [type]: newQuantity }) });
123
+ });
124
+ const willRemoveQuantities = (operation == IInventoryItem_1.inventoryOperationEnum.ADD && amount < 0) ||
125
+ (operation == IInventoryItem_1.inventoryOperationEnum.REMOVE && amount > 0);
126
+ this._data = Object.assign(Object.assign(Object.assign({}, this._data), { inventories: inventories }), (!!isWeb && typeof newQuantity === 'number' && !!updateWeb
127
+ ? {
128
+ web_inventory: Object.assign(Object.assign({}, ((_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)())), {
129
+ // NEW : If web inventory is updated with store, add props to stop inventory
130
+ // from adjusting to high negative values if operation will REMOVE quantities
131
+ [type]: this._getNewWebQuantity(type, operation, amount, willRemoveQuantities) })
132
+ }
133
+ : {}));
134
+ if (!!saveToDatabase) {
135
+ await this.save({}, undefined, saveToDatabase);
136
+ }
137
+ };
138
+ this._modifyQuantitiesOnlyWeb = async (type, operation, amount = 0, saveToDatabase) => {
139
+ var _a;
140
+ if (!!!operation)
141
+ return 'Must include operation type';
142
+ let newQuantity = this._getNewWebQuantity(type, operation, amount);
143
+ await this.save({
144
+ web_inventory: Object.assign(Object.assign({}, ((_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)())), { [type]: newQuantity })
145
+ }, undefined, saveToDatabase);
146
+ };
147
+ /**
148
+ * Returns calculated new value for web inventory
149
+ * @param type - The inventory type to calculate
150
+ * @param operation - If quantities should be added or removed
151
+ * @param amount - The quantity to adjust
152
+ * @param ignoreNewNegativeValues - Optionnal. If true, will replace calculated qte with 0 if current qte was positive, and keep current value if it was already negative and is 'available' inventory (since only available web quantites could be negative).
153
+ */
154
+ this._getNewWebQuantity = (type, operation, amount, ignoreNewNegativeValues) => {
155
+ var _a, _b;
156
+ const webInventory = (_a = this._data.web_inventory) !== null && _a !== void 0 ? _a : (0, IInventoryItem_1.getDefaultInventoryQuantities)();
157
+ const currentQte = (0, toNumber_1.default)((_b = webInventory[type]) !== null && _b !== void 0 ? _b : 0);
158
+ let newValue = operation === IInventoryItem_1.inventoryOperationEnum.ADD
159
+ ? (0, toNumber_1.default)(currentQte) + (0, toNumber_1.default)(amount)
160
+ : (0, toNumber_1.default)(currentQte) - (0, toNumber_1.default)(amount);
161
+ if (ignoreNewNegativeValues && newValue < 0)
162
+ newValue = currentQte < 0 && type == 'available' ? currentQte : 0;
163
+ return newValue;
164
+ };
165
+ this._orderCompleted = async (storeId, qte, cartType) => {
166
+ // If order was completed, we need to ajust :
167
+ // - both PROCESSING and COMPLETED quantities
168
+ // - for WEB and STORE inventories
169
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, true);
170
+ await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, true);
171
+ };
172
+ this.handleOrderDelivered = async (storeId, qte, cartType) => {
173
+ await this._orderCompleted(storeId, qte, cartType);
174
+ return this.data();
175
+ };
176
+ this.handleOrderPickedupInStore = async (storeId, qte, cartType) => {
177
+ await this._orderCompleted(storeId, qte, cartType);
178
+ return this.data();
179
+ };
180
+ this.handleOrderProcessedForShipping = async (storeId, qte, cartType) => {
181
+ await this._orderCompleted(storeId, qte, cartType);
182
+ return this.data();
183
+ };
184
+ this.handleNewQuantities = async (storeId, qte, cartType, saveToDatabase) => {
185
+ const shouldSaveToDB = typeof saveToDatabase != 'undefined' ? saveToDatabase : true;
186
+ // If quantities added, we need to ajust :
187
+ // - AVAILABLE quantities
188
+ // - for WEB and STORE inventories
189
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, shouldSaveToDB, true);
190
+ return this._data;
191
+ };
192
+ this.handleUpdateWebInventory = async (qte) => {
193
+ // After inventory is updated through CSV import, we need to adjust :
194
+ // - AVAILABLE quantities
195
+ // - for WEB inventory
196
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, true);
197
+ };
198
+ this.handleProductSold = async (storeId, qte, cartType, web = false) => {
199
+ // If product was sold and is a web transaction, we need to ajust :
200
+ // - both AVAILABLE and PROCESSING quantities
201
+ // - for only WEB inventory
202
+ if (!!web) {
203
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
204
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte);
205
+ return this.data();
206
+ }
207
+ // If product was sold and is a POS transaction (!!!web), we need to ajust :
208
+ // - both AVAILABLE and COMPLETED quantities
209
+ // - for WEB and STORE inventory
210
+ // - only if storeId is defined
211
+ if (!!storeId) {
212
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, true);
213
+ await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, true);
214
+ }
215
+ else {
216
+ console.log('no storeId provided!');
217
+ }
218
+ return this.data();
219
+ };
220
+ /**
221
+ * Update inventory on cart item modified (POS modify cart process).
222
+ * @param storeId The store associated to the order. If cart still at status 5, might be undefined (unless quantities already reserved for order)
223
+ * @param qte The quantities to ajust
224
+ * @param cartType The associated cart's type
225
+ * @param options.onlyWeb Optionnal. If only web inventory should be ajusted
226
+ * @param options.reservedQteDiff Optionnal. Reserved quantities difference for given cart item. Expressed in sell_unit (must be converted to inventory_unit)
227
+ * @returns {Promise<IInventoryItem>}
228
+ */
229
+ this.handleProductModified = async (storeId, qte, cartType, options = {}) => {
230
+ var _a;
231
+ // Save store inventory if not only web and storeId is provided
232
+ if (!!!options.onlyWeb && !!storeId) {
233
+ // If quantities were already reserved for order, should only update inventory according to reserved quantity difference
234
+ let qteToUse = (_a = options.reservedQteDiff) !== null && _a !== void 0 ? _a : qte;
235
+ await this._modifyQuantitiesByStore(storeId, 'available', qteToUse < 0 ? IInventoryItem_1.inventoryOperationEnum.ADD : IInventoryItem_1.inventoryOperationEnum.REMOVE, qteToUse < 0 ? qteToUse * -1 : qteToUse, cartType, false, // save to database (will be done later on web update)
236
+ false // save web (will be done later)
237
+ );
238
+ await this._modifyQuantitiesByStore(storeId, 'processing', qteToUse < 0 ? IInventoryItem_1.inventoryOperationEnum.REMOVE : IInventoryItem_1.inventoryOperationEnum.ADD, qteToUse < 0 ? qteToUse * -1 : qteToUse, cartType, false, // save to database (will be done later on web update)
239
+ false // save web (will be done laters
240
+ );
241
+ }
242
+ // Always update web quantities with total modified quantities
243
+ await this._modifyQuantitiesOnlyWeb('available', qte < 0 ? IInventoryItem_1.inventoryOperationEnum.ADD : IInventoryItem_1.inventoryOperationEnum.REMOVE, qte < 0 ? qte * -1 : qte, false);
244
+ await this._modifyQuantitiesOnlyWeb('processing', qte < 0 ? IInventoryItem_1.inventoryOperationEnum.REMOVE : IInventoryItem_1.inventoryOperationEnum.ADD, qte < 0 ? qte * -1 : qte, true // save to database done here for all updates to inventories and web_inventory
245
+ );
246
+ return this.data();
247
+ };
248
+ /**
249
+ * Update inventory for a specific item if order was cancelled or refunded.
250
+ * @param toStoreId The store where quantities will be ADDED
251
+ * @param fromStoreId The store where quantities will vbe REMOVED
252
+ * @param qte The quantity to ajust
253
+ * @param operationType If cart was cancelled or refunded
254
+ * @param cartType If cart is web, POS, or Pickup Now
255
+ * @param options.deleteItem Optionnal. If item should not be returned to the stores inventory (broken, misplaced, old batch, etc...)
256
+ * @param options.onlyWeb Optionnal. If inventory should only be updated for web inventory (and not for stores). Mostly depends on the cart's status when cancelled.
257
+ * @param options.orderAssociatedTransfers Optionnal. Array of TransferRequest objects associated to cart. Used when cart is cancelled
258
+ * @param options.saveToDatabase Optionnal. Mostly used for dev purpuses (and for unit testing). Otherwise, save is done logically at the end of the update process
259
+ * @param options.reservedQte Optionnal. Quantity reserved in processing inventory for cart item as of now. Expressed in sell_unit (must be converted to inventory_unit)
260
+ * @param options.otherUnits Optionnal. Other units for corresponding cart item. If not defined, will use those found in InventoryItem data
261
+ */
262
+ this.handleOrderCancelled = async (toStoreId, fromStoreId, qte, operationType, cartType, options = {}) => {
263
+ const otherUnitsToUse = options.otherUnits || this._data.other_units;
264
+ // If order was cancelled, we need to ajust :
265
+ // - PROCESSING quantities always, and AVAILABLE quantities only if item should return in stock
266
+ // - for WEB inventory, and STORE inventory if onlyWeb is false, or order has associated transfers
267
+ // If order was refunded, we need to ajust :
268
+ // - Take quantities from COMPLETED and put them back in AVAILABLE
269
+ // - for WEB and STORE inventory, in this case onlyWeb is always false
270
+ // ----------------------------------------------------------
271
+ // #region CHECK FOR QUANTITIES TO AJUST IN STORE
272
+ let qteToUseForStoreUpdate = !!!options.onlyWeb ? qte : 0;
273
+ if (!!options.orderAssociatedTransfers && operationType == 'cancelled' && !!options.onlyWeb) {
274
+ // A. Calculate initial quantites asked for transfer
275
+ let initialQuantitiesInTransfers = 0;
276
+ let receivedQuantitesInTransfers = 0;
277
+ for (let transfer of options.orderAssociatedTransfers) {
278
+ // Skip transfers that were split at creation, to fetch only initial quantities
279
+ if (!!!transfer.data().original_transfer_id) {
280
+ initialQuantitiesInTransfers += transfer.getOriginalRequestedQuantity(this._data.sku);
281
+ }
282
+ // Get quantities received from transfers with status RECEIVED or RECEIVED_PARTIAL
283
+ if ([TransferRequest_1.TransferRequestStatusEnum.RECEIVED, TransferRequest_1.TransferRequestStatusEnum.RECEIVED_PARTIAL].includes(transfer.data().status)) {
284
+ const sameProd = transfer.data().products.find((p) => p.sku == this._data.sku);
285
+ if (!!sameProd)
286
+ receivedQuantitesInTransfers += sameProd.qte_received || 0;
287
+ }
288
+ }
289
+ // B. Set currently in processing quantities to ...
290
+ // ...reserved quantities (if defined)
291
+ if (typeof options.reservedQte != 'undefined') {
292
+ qteToUseForStoreUpdate = (0, inventories_1.getConvertedUnitQuantity)(otherUnitsToUse, options.reservedQte, 'inventory_unit');
293
+ }
294
+ else {
295
+ // ...the difference between total qte for item in cart and quantities initially set for transfer requests
296
+ qteToUseForStoreUpdate = qte - initialQuantitiesInTransfers;
297
+ if (qteToUseForStoreUpdate < 0)
298
+ qteToUseForStoreUpdate = 0;
299
+ // ... and add quantities received from transfers to processing quantites
300
+ qteToUseForStoreUpdate += receivedQuantitesInTransfers;
301
+ }
302
+ }
303
+ if (qteToUseForStoreUpdate != 0) {
304
+ await this._modifyQuantitiesByStore(fromStoreId, operationType === 'refunded' ? 'completed' : 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qteToUseForStoreUpdate, cartType, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : !!options.deleteItem // save to database
305
+ );
306
+ if (!!!options.deleteItem) {
307
+ await this._modifyQuantitiesByStore(toStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qteToUseForStoreUpdate, cartType, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : true // save to database
308
+ );
309
+ }
310
+ }
311
+ // #endregion
312
+ // ----------------------------------------------------------
313
+ // #region AJUST WEB QUANTITIES
314
+ if (!!!options.deleteItem) {
315
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, false);
316
+ }
317
+ await this._modifyQuantitiesOnlyWeb(operationType === 'refunded' ? 'completed' : 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, typeof options.saveToDatabase == 'boolean' ? options.saveToDatabase : true);
318
+ // #endregion
319
+ return this._data;
320
+ };
321
+ this.handleOrderReadyForProcessing = async (storeId, qte, cartType) => {
322
+ // If order is ready for processing, we need to ajust :
323
+ // - both AVAILABLE and PROCESSING quantities
324
+ // - for only STORE inventory
325
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, false, false);
326
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, true, false);
327
+ return this.data();
328
+ };
329
+ this.handleOrderInDelivery = async (storeId, qte, cartType) => {
330
+ // If order is in delivery, we need to ajust :
331
+ // - both PROCESSING and IN_TRANSIT quantities
332
+ // - for only STORE inventory
333
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
334
+ await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType);
335
+ return this.data();
336
+ };
337
+ this.handleChangedProcessingStore = async (oldStoreId, newStoreId, qte, cartType) => {
338
+ // If processing store was updated :
339
+ // - for old processing store :
340
+ // - remove qties from processing, add to available
341
+ // - for new processing store :
342
+ // - remove qties from available, add to processing
343
+ // - in both cases, only for store inventory (no changes to web inventory)
344
+ await this._modifyQuantitiesByStore(oldStoreId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
345
+ await this._modifyQuantitiesByStore(oldStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, false);
346
+ await this._modifyQuantitiesByStore(newStoreId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false);
347
+ await this._modifyQuantitiesByStore(newStoreId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true);
348
+ return this.data();
349
+ };
350
+ // ---------------------------------------------------------------
351
+ // #region TRANSFER REQUESTS INVENTORY MANAGEMENT
352
+ this.handleTransferInTransit = async (storeId, qte, cartType, forOrder, fromProcessing) => {
353
+ // If transfer is now in transit, we need to ajust :
354
+ // - both AVAILABLE|PROCESSING and IN_TRANSIT quantities
355
+ // - for STORE inventory always
356
+ // - for WEB inventory if transfer was not created though an order
357
+ // - inventory removed by default from AVAILABLE inventory, or PROCESSING if fromProcessing=true
358
+ await this._modifyQuantitiesByStore(storeId, fromProcessing ? 'processing' : 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, !forOrder);
359
+ await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, !forOrder);
360
+ return this.data();
361
+ };
362
+ /**
363
+ * Adjust store quantities
364
+ * @param storeFromId Origin store id
365
+ * @param storeToId Target store id
366
+ * @param qte Total quantity received
367
+ * @param cartType Cart type, GR only?
368
+ * @param options.forOrder True if associated to an order
369
+ * @param options.maxProcessingQte Quantity to place in processing, extra will go in available
370
+ * @param options.skipWebUpdateForAvailable If web inventory update should be skipped for available quantities (for when transfer is received for a already processed cart)
371
+ * @returns the new inventory item data
372
+ */
373
+ this.handleTransferReceived = async (storeFromId, storeToId, qte, cartType, options) => {
374
+ // FROM STORE
375
+ // If order transfer was received, we need to ajust :
376
+ // - only IN_TRANSIT quantities
377
+ // - for only STORE inventory
378
+ // - of the storeFromID
379
+ await this._modifyQuantitiesByStore(storeFromId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, // don't save to database here, will be done on next steps
380
+ !options.forOrder);
381
+ // TO STORE
382
+ // If order transfer was received, we need to ajust :
383
+ // - if transfer is associated to order :
384
+ // - only IN_TRANSIT quantities
385
+ // - only for STORE inventory
386
+ //
387
+ // - else :
388
+ // - only AVAILABLE quantities
389
+ // - for STORE inventory always, and WEB inventory
390
+ if (options.maxProcessingQte && options.forOrder) {
391
+ qte -= options.maxProcessingQte;
392
+ await this._modifyQuantitiesByStore(storeToId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, options.maxProcessingQte, cartType, qte <= 0, // save to database only if logic will not enter next check
393
+ !options.forOrder);
394
+ }
395
+ if (qte > 0) {
396
+ // If additionnal quantities sent with transfer were reserved in inventory when transfer changed to status TO_BE_PREPARED, then we need to remove them from reserved quantities
397
+ if (options.forOrder && options.additionnalWebQuantitiesReserved && !options.skipWebUpdateForAvailable) {
398
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
399
+ }
400
+ await this._modifyQuantitiesByStore(storeToId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, // always save to database here
401
+ !options.skipWebUpdateForAvailable // only update web inventory if property not set to skip operation
402
+ );
403
+ }
404
+ return this.data();
405
+ };
406
+ /**
407
+ * Cancel value in transit - Adjust the in transit negatively without adjusting any other quantity.
408
+ * @param storeId The store to apply the change
409
+ * @param qte The quantity to remove
410
+ * @param cartType Cart type, GR only?
411
+ * @param forOrder True if associated to an order
412
+ * @returns updated data
413
+ */
414
+ this.handleCancelInTransit = async (storeId, qte, cartType, forOrder) => {
415
+ await this._modifyQuantitiesByStore(storeId, 'in_transit', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, true, !forOrder);
416
+ return this.data();
417
+ };
418
+ /**
419
+ * Cancelled transfer with status TO_BE_PREPARED - Take quantities reserved in processing inventory, and put back in available. ⚠️ _**IMPORTANT** - Should first check if space has associated space_option before using function!_
420
+ * @param storeId The store to apply the change
421
+ * @param qte The quantity to remove
422
+ * @param cartType Cart type, GR only?
423
+ * @param forOrder True if associated to an order
424
+ * @param additionnalWebQuantitiesReserved Extra quantities were added to transfer (other than those needed for cart). If so, they were reserved, and must return in stock too.
425
+ */
426
+ this.handleCancelToBePrepared = async (storeId, qte, cartType, forOrder, additionnalWebQuantitiesReserved) => {
427
+ const qteForWeb = !!additionnalWebQuantitiesReserved
428
+ ? additionnalWebQuantitiesReserved
429
+ : !forOrder
430
+ ? qte
431
+ : undefined;
432
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, false);
433
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, typeof qteForWeb == 'undefined', false);
434
+ // Save web quantities if needed
435
+ if (typeof qteForWeb != 'undefined') {
436
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qteForWeb, false);
437
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qteForWeb, true);
438
+ }
439
+ return this.data();
440
+ };
441
+ /**
442
+ * Reserve inventory for store on transfer changed to status TO_BE_PREPARED. ⚠️ _**IMPORTANT** - Should first check if space has associated space_option before using function!_
443
+ * @param storeId The store ID for the "from" store in transfer.
444
+ * @param qte The quantity to add or remove from inventory.
445
+ * @param cartType Optionnal. Passed to _modifyQuantitiesByStore. Used to check if web inventory should be updated.
446
+ * @param forOrder Optionnal. If transfer is associated to an order. WIll not update web inventory if true (since it was already reserved with order)
447
+ * @param webQte Optionnal. If provided, used as value to update web inventory. Also bypasses check forOrder, so if provided web inventory is ALWAYS ypdated with provided value.
448
+ */
449
+ this.handleTransferToBePrepared = async (storeId, qte, cartType, forOrder, webQte) => {
450
+ const webQteToUpdate = typeof webQte != 'undefined' ? webQte : !forOrder ? qte : undefined;
451
+ // ----------------------------------------------
452
+ // Update store inventories first
453
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, cartType, false, false);
454
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, typeof webQteToUpdate == 'undefined', false);
455
+ // ---------------------------------------------------------------------------
456
+ // Update web inventory
457
+ if (typeof webQteToUpdate != 'undefined') {
458
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, webQteToUpdate, false);
459
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, webQteToUpdate, true);
460
+ }
461
+ return this.data();
462
+ };
463
+ // #endregion
464
+ this.handlePOSCartFastComplete = async (storeId, qte, cartType, quantitiesAlreadyReserved = 0) => {
465
+ // If order was triggered by POS Fast complete (button in order interface dashboard), we need to ajust :
466
+ // - both PROCESSING and COMPLETE quantities
467
+ // - for only WEB inventory
468
+ // - if store can sell online
469
+ const fromStoreIsWeb = this.data().inventories.find((inventory) => inventory.store_id === storeId).can_sell_online;
470
+ if (!!fromStoreIsWeb) {
471
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qte, false);
472
+ await this._modifyQuantitiesOnlyWeb('completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, false);
473
+ }
474
+ const quantitiesNotReserved = qte - quantitiesAlreadyReserved;
475
+ // AND, we need to ajust :
476
+ // - potentially AVAILABLE quantities with quantitiesNotReserved (if quantitiesNotReserved != 0)
477
+ // - potentially PROCESSING quantities with quantitiesAlreadyReserved (if quantitiesAlreadyReserved != 0)
478
+ // - always COMPLETE quantities with full qte from item
479
+ // - for only STORE inventory
480
+ if (quantitiesNotReserved != 0) {
481
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, quantitiesNotReserved, cartType, false, false);
482
+ }
483
+ if (quantitiesAlreadyReserved != 0) {
484
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, quantitiesAlreadyReserved, cartType, false, false);
485
+ }
486
+ await this._modifyQuantitiesByStore(storeId, 'completed', IInventoryItem_1.inventoryOperationEnum.ADD, qte, cartType, true, false);
487
+ return this.data();
488
+ };
489
+ this.handleChangeCanSellOnline = async (storeId, qte, newCanSellOnline, saveToDatabase) => {
490
+ const storeInventoryIndex = this.data().inventories.findIndex((i) => i.store_id === storeId);
491
+ if (storeInventoryIndex === -1)
492
+ return;
493
+ const currentWebInventory = this.data().web_inventory;
494
+ const currentAvailable = !!currentWebInventory && !!currentWebInventory.available ? currentWebInventory.available : 0;
495
+ const partial = {
496
+ web_inventory: Object.assign(Object.assign(Object.assign({}, (0, IInventoryItem_1.getDefaultInventoryQuantities)()), (!!this.data().web_inventory ? this.data().web_inventory : {})), { available: !!newCanSellOnline ? currentAvailable + qte : currentAvailable - qte }),
497
+ inventories: [
498
+ ...this.data().inventories.slice(0, storeInventoryIndex),
499
+ Object.assign(Object.assign({}, this.data().inventories[storeInventoryIndex]), { can_sell_online: newCanSellOnline }),
500
+ ...this.data().inventories.slice(storeInventoryIndex + 1)
501
+ ]
502
+ };
503
+ if (!!saveToDatabase) {
504
+ await this.save(partial);
505
+ }
506
+ else {
507
+ this._data = Object.assign(Object.assign({}, this.data()), partial);
508
+ }
509
+ return this.data();
510
+ };
511
+ /**
512
+ * Reserve a quantity from the available web inventory and store if provided
513
+ * @param qty The quantity to reserve
514
+ * @param storeId The store id to use for reservation, undefined if web only
515
+ * @returns the new inventory data
516
+ */
517
+ this.handleReserveInventory = async (qty, storeId) => {
518
+ if (!!storeId) {
519
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, Cart_1.CartTypeEnum.POS, false, true);
520
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.ADD, qty, Cart_1.CartTypeEnum.POS, true, true);
521
+ return this.data();
522
+ }
523
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, false);
524
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.ADD, qty);
525
+ return this.data();
526
+ };
527
+ /**
528
+ * Release a quantity from the processing web inventory and store if provided
529
+ * @param qty The quantity to release
530
+ * @param storeId The store id to use for reservation, undefined if web only
531
+ * @returns the new inventory data
532
+ */
533
+ this.handleUnreserveInventory = async (qty, storeId) => {
534
+ if (!!storeId) {
535
+ await this._modifyQuantitiesByStore(storeId, 'processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, Cart_1.CartTypeEnum.POS, false, true);
536
+ await this._modifyQuantitiesByStore(storeId, 'available', IInventoryItem_1.inventoryOperationEnum.ADD, qty, Cart_1.CartTypeEnum.POS, true, true);
537
+ return this.data();
538
+ }
539
+ await this._modifyQuantitiesOnlyWeb('processing', IInventoryItem_1.inventoryOperationEnum.REMOVE, qty, false);
540
+ await this._modifyQuantitiesOnlyWeb('available', IInventoryItem_1.inventoryOperationEnum.ADD, qty);
541
+ return this.data();
542
+ };
543
+ }
544
+ }
545
+ exports.default = Inventory;
546
546
  //# sourceMappingURL=index.js.map