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