addio-admin-sdk 1.7.166 → 1.7.167
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/.env.dev +14 -14
- package/.github/workflows/run_unit_test.yaml +48 -48
- package/addio-sdk-doc.md +1473 -1473
- package/changelog.md +573 -573
- package/dist/Interfaces/Address/index.d.ts +21 -21
- package/dist/Interfaces/Address/index.js +16 -16
- package/dist/Interfaces/Algolia/index.d.ts +180 -180
- 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/IMarketPayload.d.ts +12 -12
- package/dist/Interfaces/Cart/IMarketPayload.js +2 -2
- 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 +451 -451
- package/dist/Interfaces/Cart/index.js +216 -216
- package/dist/Interfaces/CartReservedQuantities/index.d.ts +10 -10
- package/dist/Interfaces/CartReservedQuantities/index.js +2 -2
- package/dist/Interfaces/CashDrawers/index.d.ts +38 -38
- 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 +137 -137
- 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 +54 -53
- package/dist/Interfaces/Space/IExternalService.js +45 -44
- package/dist/Interfaces/Space/IExternalService.js.map +1 -1
- package/dist/Interfaces/Space/IMember.d.ts +16 -16
- package/dist/Interfaces/Space/IMember.js +9 -9
- package/dist/Interfaces/Space/index.d.ts +413 -412
- package/dist/Interfaces/Space/index.js +175 -175
- 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 +194 -194
- package/dist/Interfaces/TCG/index.js +60 -60
- 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 +122 -117
- package/dist/constants/services.js.map +1 -1
- 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 +354 -335
- package/dist/lib/Cart/index.js +4031 -3981
- package/dist/lib/Cart/index.js.map +1 -1
- package/dist/lib/CartReservedQuantities/index.d.ts +49 -49
- package/dist/lib/CartReservedQuantities/index.js +159 -159
- package/dist/lib/CashDrawerShift/index.d.ts +84 -84
- package/dist/lib/CashDrawerShift/index.js +206 -206
- 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/Queue/index.d.ts +40 -40
- package/dist/lib/Queue/index.js +254 -254
- 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 +1181 -1181
- package/dist/lib/Space/index.js +5841 -5841
- 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/ADD/utils/buyback.d.ts +4 -4
- package/dist/rules/ADD/utils/buyback.js +135 -135
- 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 -839
- 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 +1002 -1002
- 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 +967 -967
- package/dist/services/logs/index.d.ts +23 -23
- package/dist/services/logs/index.js +66 -66
- package/dist/services/marketplace/BaseMarketServiceClass.d.ts +69 -69
- package/dist/services/marketplace/BaseMarketServiceClass.js +133 -133
- package/dist/services/marketplace/CardtraderServiceClass.d.ts +33 -33
- package/dist/services/marketplace/CardtraderServiceClass.js +215 -215
- package/dist/services/marketplace/utils.d.ts +17 -17
- package/dist/services/marketplace/utils.js +32 -32
- 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 +272 -272
- package/dist/utils/cart.js +1169 -1169
- 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 +174 -174
- package/dist/utils/discount.js +1118 -1118
- package/dist/utils/errors.d.ts +118 -118
- package/dist/utils/errors.js +123 -123
- 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 +91 -91
- 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 +88 -88
- package/dist/utils/tcgService.js +408 -408
- 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/.env +0 -15
package/dist/utils/discount.js
CHANGED
|
@@ -1,1119 +1,1119 @@
|
|
|
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.getPaymentIncentiveDiscount = exports.getPaymentIncentiveDiscountInfo = exports.getAfterTaxesPromoInCart = exports.getAfterTaxesPromosTotalAmount = exports.checkIfCouldApplyIncentivePromo = exports.getOnlyServicesAndFeesSubtotal = exports.getStandardCartPromoFromDiscount = exports.applyDiscountToCart = exports.checkIfCanAddPromo = exports.getItemCategorySlugArray = exports.getResultAppliedDiscountSkus = exports.getSkuArrayForPromo = exports.applyDiscountToPrice = exports.applyDiscountRulesOnProduct = exports.getNewDiscountPriceFromTierPricing = exports.applyTierPricing = exports.getTierPricingToApply = exports.checkPromoCodeEligibility = exports.getCartPromoType = exports.checkAttributes = exports.getResultRuleDetail = exports.shouldApplyRuleToDeclination = exports.getAppliedAmountsForSubtotalPromosOnCart = exports.getCartPromosByAppliesTo = exports.getSubtotalWithoutProductPromos = exports.isPromoAPercentage = exports.shouldCheckPromoCode = exports.getCartPromo = void 0;
|
|
18
|
-
const IDiscountRule_1 = require("../Interfaces/Rules/IDiscountRule");
|
|
19
|
-
const Cart_1 = require("../Interfaces/Cart");
|
|
20
|
-
const flatten_1 = __importDefault(require("lodash/flatten"));
|
|
21
|
-
const round_1 = __importDefault(require("lodash/round"));
|
|
22
|
-
const sumBy_1 = __importDefault(require("lodash/sumBy"));
|
|
23
|
-
const toNumber_1 = __importDefault(require("lodash/toNumber"));
|
|
24
|
-
const orderBy_1 = __importDefault(require("lodash/orderBy"));
|
|
25
|
-
const locale_1 = require("./locale");
|
|
26
|
-
const currency_1 = require("./currency");
|
|
27
|
-
const moment_1 = __importDefault(require("moment"));
|
|
28
|
-
const data_1 = require("./data");
|
|
29
|
-
const products_1 = require("./products");
|
|
30
|
-
const cart_1 = require("../rules/GR/utils/cart");
|
|
31
|
-
const cart_2 = require("../rules/GR/interfaces/cart");
|
|
32
|
-
const object_1 = require("./object");
|
|
33
|
-
const data_2 = require("../rules/GR/constants/data");
|
|
34
|
-
const g2_1 = require("../rules/GR/utils/g2");
|
|
35
|
-
// -----------------------------------------------------------------------------------
|
|
36
|
-
// #region GENERAL
|
|
37
|
-
/**
|
|
38
|
-
* Get formatted array of cart promos applied to a specific cart
|
|
39
|
-
* @param cartData
|
|
40
|
-
*/
|
|
41
|
-
const getCartPromo = (cartData) => {
|
|
42
|
-
if (!!!cartData.cart_promo_applied && !!!cartData.cart_promos_applied)
|
|
43
|
-
return;
|
|
44
|
-
return !!cartData.cart_promo_applied
|
|
45
|
-
? [cartData.cart_promo_applied]
|
|
46
|
-
: !!cartData.cart_promos_applied
|
|
47
|
-
? cartData.cart_promos_applied
|
|
48
|
-
: [];
|
|
49
|
-
};
|
|
50
|
-
exports.getCartPromo = getCartPromo;
|
|
51
|
-
/**
|
|
52
|
-
* Check if current cart promos applied contain a promo_code type promotion
|
|
53
|
-
* @param cartData
|
|
54
|
-
*/
|
|
55
|
-
const shouldCheckPromoCode = (cartData) => {
|
|
56
|
-
return ((!!cartData.cart_promos_applied && !!cartData.cart_promos_applied.some((p) => p.promo_code)) ||
|
|
57
|
-
(!!cartData.cart_promo_applied && !!cartData.cart_promo_applied.promo_code));
|
|
58
|
-
};
|
|
59
|
-
exports.shouldCheckPromoCode = shouldCheckPromoCode;
|
|
60
|
-
/**
|
|
61
|
-
* Check if promo is expressed as a percentage
|
|
62
|
-
* @param promo The promo to check. Works for cart applied promo as well as discount rule
|
|
63
|
-
* @param options.includePaymentIncentiveInCheck Optionnal. If payement incentive promotions should also be included in check
|
|
64
|
-
* @returns {boolean}
|
|
65
|
-
*/
|
|
66
|
-
const isPromoAPercentage = (promo, options = {}) => {
|
|
67
|
-
const promoPercentOptions = [
|
|
68
|
-
IDiscountRule_1.ResultActionEnum.PERCENT,
|
|
69
|
-
IDiscountRule_1.ResultActionEnum.PERCENT_CATEGORY,
|
|
70
|
-
IDiscountRule_1.ResultActionEnum.PERCENT_SKU
|
|
71
|
-
];
|
|
72
|
-
if (options.includePaymentIncentiveInCheck)
|
|
73
|
-
promoPercentOptions.push(IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES);
|
|
74
|
-
let propertyToCheck = (0, object_1.recursiveCheckObject)(promo, 'result.action') || (0, object_1.recursiveCheckObject)(promo, 'amount_unit');
|
|
75
|
-
if (!!!propertyToCheck && options.defaultToPercent)
|
|
76
|
-
propertyToCheck = IDiscountRule_1.ResultActionEnum.PERCENT;
|
|
77
|
-
return !!propertyToCheck && promoPercentOptions.includes(propertyToCheck);
|
|
78
|
-
};
|
|
79
|
-
exports.isPromoAPercentage = isPromoAPercentage;
|
|
80
|
-
const getSubtotalWithoutProductPromos = (cartData, itemPromos) => {
|
|
81
|
-
const currentSubtotal = cartData.subtotalWithoutPromotions || cartData.subtotal;
|
|
82
|
-
let allProductSubtotalAmounts = (0, sumBy_1.default)(itemPromos, (i) => !!(0, data_1.getPromoTotalAmount)(cartData.items, i, 'number')
|
|
83
|
-
? (0, data_1.getPromoTotalAmount)(cartData.items, i, 'number')
|
|
84
|
-
: 0);
|
|
85
|
-
return currentSubtotal - allProductSubtotalAmounts;
|
|
86
|
-
};
|
|
87
|
-
exports.getSubtotalWithoutProductPromos = getSubtotalWithoutProductPromos;
|
|
88
|
-
const getCartPromosByAppliesTo = (cartData) => {
|
|
89
|
-
const appliedPromos = (0, exports.getCartPromo)(cartData) || [];
|
|
90
|
-
let subtotalPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.SUBTOTAL);
|
|
91
|
-
let itemPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.PRODUCT);
|
|
92
|
-
let afterTaxesPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES);
|
|
93
|
-
return {
|
|
94
|
-
subtotal: subtotalPromos,
|
|
95
|
-
items: itemPromos,
|
|
96
|
-
afterTaxes: afterTaxesPromos
|
|
97
|
-
};
|
|
98
|
-
};
|
|
99
|
-
exports.getCartPromosByAppliesTo = getCartPromosByAppliesTo;
|
|
100
|
-
const getAppliedAmountsForSubtotalPromosOnCart = (cartData) => {
|
|
101
|
-
const activePromos = (0, exports.getCartPromosByAppliesTo)(cartData);
|
|
102
|
-
let currentSubtotal = (0, exports.getSubtotalWithoutProductPromos)(cartData, activePromos.items);
|
|
103
|
-
let promoAmounts = {};
|
|
104
|
-
for (let promo of activePromos.subtotal.filter((p) => !!p.discount_id)) {
|
|
105
|
-
if (!!!promo.amount_removed)
|
|
106
|
-
continue;
|
|
107
|
-
let amountRemoved = promo.amount_removed;
|
|
108
|
-
const serviceAndFeesTotal = (0, exports.getOnlyServicesAndFeesSubtotal)(cartData, activePromos.items);
|
|
109
|
-
if ((0, exports.isPromoAPercentage)(promo, { defaultToPercent: true })) {
|
|
110
|
-
// if the promo excludes services and fees, subtract the serviceAndFeesTotal from the subtotal
|
|
111
|
-
if (!!promo.exclude_services_and_fees) {
|
|
112
|
-
amountRemoved = (0, round_1.default)((promo.amount_removed / 100) * (currentSubtotal - serviceAndFeesTotal), 3);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
amountRemoved = (0, round_1.default)((promo.amount_removed / 100) * currentSubtotal, 3);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
promoAmounts[promo.discount_id] = amountRemoved;
|
|
119
|
-
currentSubtotal -= amountRemoved;
|
|
120
|
-
}
|
|
121
|
-
return promoAmounts;
|
|
122
|
-
};
|
|
123
|
-
exports.getAppliedAmountsForSubtotalPromosOnCart = getAppliedAmountsForSubtotalPromosOnCart;
|
|
124
|
-
// #endregion
|
|
125
|
-
// -----------------------------------------------------------------------------------
|
|
126
|
-
// #region CHECK DISCOUNT ELIGIBILITY
|
|
127
|
-
/**
|
|
128
|
-
* Check if a discount rule applies to a specific declination
|
|
129
|
-
* @param discount_rule - The discount rule to check
|
|
130
|
-
* @param declination - The declination to compare
|
|
131
|
-
* @param parentSlug - Optionnal. Used to check parent product slug with 'product' rule specifications. If not provided and 'product' rule found, returns true by default for rule check
|
|
132
|
-
*/
|
|
133
|
-
const shouldApplyRuleToDeclination = (discount_rule, declination, parentSlug) => {
|
|
134
|
-
// If discount has no rules, it means it applies to declination automatically
|
|
135
|
-
if (!!!discount_rule.rules || !!!discount_rule.rules.length)
|
|
136
|
-
return true;
|
|
137
|
-
const currentDiscountMap = discount_rule.rules.map((rule) => {
|
|
138
|
-
const todayDate = (0, moment_1.default)().format('YYYY-MM-DD');
|
|
139
|
-
switch (rule.field) {
|
|
140
|
-
case IDiscountRule_1.RuleFieldEnum.PRODUCT_PRICE:
|
|
141
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
142
|
-
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, declination.price.regular.amount)];
|
|
143
|
-
}));
|
|
144
|
-
case IDiscountRule_1.RuleFieldEnum.SKU:
|
|
145
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
146
|
-
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, declination.sku)];
|
|
147
|
-
}));
|
|
148
|
-
case IDiscountRule_1.RuleFieldEnum.DECLINATION:
|
|
149
|
-
// case 'slug':
|
|
150
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
151
|
-
return [rule.condition, declination.sku === ruleDetail.value[0]];
|
|
152
|
-
}));
|
|
153
|
-
case IDiscountRule_1.RuleFieldEnum.PRODUCT:
|
|
154
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
155
|
-
return [rule.condition, !!!parentSlug || (0, exports.getResultRuleDetail)(ruleDetail, parentSlug)];
|
|
156
|
-
}));
|
|
157
|
-
case IDiscountRule_1.RuleFieldEnum.DATE:
|
|
158
|
-
case IDiscountRule_1.RuleFieldEnum.WEEKDAY:
|
|
159
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
160
|
-
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, (0, moment_1.default)(todayDate).toDate())];
|
|
161
|
-
}));
|
|
162
|
-
case IDiscountRule_1.RuleFieldEnum.ATTRIBUTE:
|
|
163
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
164
|
-
return [rule.condition, (0, exports.checkAttributes)(ruleDetail, declination.attributes)];
|
|
165
|
-
}));
|
|
166
|
-
default:
|
|
167
|
-
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
return _checkRuleApplicationArray(currentDiscountMap);
|
|
171
|
-
};
|
|
172
|
-
exports.shouldApplyRuleToDeclination = shouldApplyRuleToDeclination;
|
|
173
|
-
/**
|
|
174
|
-
* Check if a specific rule of a discount rule is respected
|
|
175
|
-
* @param ruleDetail - The rule details object to check
|
|
176
|
-
* @param cartValue - The value to compare with rule specifications
|
|
177
|
-
*/
|
|
178
|
-
const getResultRuleDetail = (ruleDetail, cartValue, log) => {
|
|
179
|
-
let ruleRespected = false;
|
|
180
|
-
let isDate = false;
|
|
181
|
-
try {
|
|
182
|
-
let amountValue;
|
|
183
|
-
let amountValue2;
|
|
184
|
-
switch (true) {
|
|
185
|
-
case typeof cartValue === 'number':
|
|
186
|
-
if (ruleDetail.operator === 'between') {
|
|
187
|
-
amountValue = Number(ruleDetail.value[0].toString().replace(',', '.')) || [];
|
|
188
|
-
amountValue2 = Number(ruleDetail.value[1].toString().replace(',', '.')) || [];
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
amountValue = ruleDetail.value.map((v) => Number(v.toString().replace(',', '.'))) || [];
|
|
192
|
-
amountValue2 = 0 || [];
|
|
193
|
-
}
|
|
194
|
-
break;
|
|
195
|
-
case typeof cartValue === 'string' && !!!moment_1.default.isDate((0, data_1.formatDate)(cartValue)):
|
|
196
|
-
if (ruleDetail.operator === 'between') {
|
|
197
|
-
amountValue = ruleDetail.value[0] || [];
|
|
198
|
-
amountValue2 = ruleDetail.value[1] || [];
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
amountValue2 = [];
|
|
202
|
-
amountValue = ruleDetail.value || [];
|
|
203
|
-
}
|
|
204
|
-
break;
|
|
205
|
-
default:
|
|
206
|
-
if (!!log)
|
|
207
|
-
console.log('HERE!');
|
|
208
|
-
cartValue = (0, data_1.formatDate)(cartValue);
|
|
209
|
-
if (typeof ruleDetail.value[0] === 'number') {
|
|
210
|
-
if ((0, moment_1.default)(cartValue).isValid())
|
|
211
|
-
cartValue = (0, moment_1.default)(cartValue).day();
|
|
212
|
-
amountValue = ruleDetail.value || [];
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
isDate = true;
|
|
216
|
-
amountValue = (0, moment_1.default)(ruleDetail.value[0]);
|
|
217
|
-
if (!!ruleDetail.value[1] && moment_1.default.isDate(ruleDetail.value[1])) {
|
|
218
|
-
amountValue2 = (0, moment_1.default)(ruleDetail.value[1]);
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
amountValue2 = (0, moment_1.default)();
|
|
222
|
-
}
|
|
223
|
-
switch (ruleDetail.operator) {
|
|
224
|
-
case '==':
|
|
225
|
-
ruleRespected = amountValue.isSame((0, moment_1.default)(cartValue), 'date');
|
|
226
|
-
break;
|
|
227
|
-
case '!=':
|
|
228
|
-
ruleRespected = !!!amountValue.isSame((0, moment_1.default)(cartValue), 'date');
|
|
229
|
-
break;
|
|
230
|
-
case '<=':
|
|
231
|
-
ruleRespected = (0, moment_1.default)(cartValue).isSameOrBefore(amountValue, 'date');
|
|
232
|
-
break;
|
|
233
|
-
case '>=':
|
|
234
|
-
ruleRespected = (0, moment_1.default)(cartValue).isSameOrAfter(amountValue, 'date');
|
|
235
|
-
break;
|
|
236
|
-
case '<':
|
|
237
|
-
ruleRespected = (0, moment_1.default)(cartValue).isBefore(amountValue, 'date');
|
|
238
|
-
break;
|
|
239
|
-
case '>':
|
|
240
|
-
ruleRespected = (0, moment_1.default)(cartValue).isAfter(amountValue, 'date');
|
|
241
|
-
break;
|
|
242
|
-
case 'between':
|
|
243
|
-
ruleRespected = (0, moment_1.default)(cartValue).isBetween(amountValue, amountValue2, 'date', '[]');
|
|
244
|
-
break;
|
|
245
|
-
case 'contains':
|
|
246
|
-
default:
|
|
247
|
-
ruleRespected = false;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
if (!!!isDate) {
|
|
252
|
-
if (!Array.isArray(amountValue) && ruleDetail.operator !== 'between') {
|
|
253
|
-
amountValue = [amountValue];
|
|
254
|
-
}
|
|
255
|
-
switch (ruleDetail.operator) {
|
|
256
|
-
case '==':
|
|
257
|
-
ruleRespected = !!amountValue.some((v) => v === cartValue);
|
|
258
|
-
break;
|
|
259
|
-
case '!=':
|
|
260
|
-
ruleRespected = !!amountValue.every((v) => v !== cartValue);
|
|
261
|
-
break;
|
|
262
|
-
case '<=':
|
|
263
|
-
ruleRespected = !!amountValue.some((v) => cartValue <= v);
|
|
264
|
-
break;
|
|
265
|
-
case '>=':
|
|
266
|
-
ruleRespected = !!amountValue.some((v) => cartValue >= v);
|
|
267
|
-
break;
|
|
268
|
-
case '<':
|
|
269
|
-
ruleRespected = !!amountValue.some((v) => cartValue < v);
|
|
270
|
-
break;
|
|
271
|
-
case '>':
|
|
272
|
-
ruleRespected = !!amountValue.some((v) => cartValue > v);
|
|
273
|
-
break;
|
|
274
|
-
case 'between':
|
|
275
|
-
ruleRespected = cartValue > amountValue && cartValue < amountValue2;
|
|
276
|
-
break;
|
|
277
|
-
case 'contains':
|
|
278
|
-
ruleRespected = !!amountValue.some((v) => cartValue.toString().indexOf(v.toString()) !== -1);
|
|
279
|
-
break;
|
|
280
|
-
case 'contains-not':
|
|
281
|
-
ruleRespected = !!!amountValue.some((v) => cartValue.toString().indexOf(v.toString()) !== -1);
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
catch (error) {
|
|
287
|
-
console.log(error.toString());
|
|
288
|
-
}
|
|
289
|
-
return ruleRespected;
|
|
290
|
-
};
|
|
291
|
-
exports.getResultRuleDetail = getResultRuleDetail;
|
|
292
|
-
/**
|
|
293
|
-
* Check if rule applied to product attributes is respected for specific declination attributes
|
|
294
|
-
* @param attributeAndValues - The rule details object to check
|
|
295
|
-
* @param arrDeclinationAttributes - The declinations attributes to compare
|
|
296
|
-
*/
|
|
297
|
-
const checkAttributes = (attributeAndValues, arrDeclinationAttributes) => {
|
|
298
|
-
const parentAttributeID = attributeAndValues.value[0].parentAttribute;
|
|
299
|
-
const attributeValues = attributeAndValues.value[0].attributeOptions;
|
|
300
|
-
const operator = attributeAndValues.operator;
|
|
301
|
-
let matchingAttributes = false;
|
|
302
|
-
// const attrArray = arrDeclinationAttributes.map(decliAttr=>Array.isArray(decliAttr)?decliAttr.values[0].)
|
|
303
|
-
for (let declinationAttribute of arrDeclinationAttributes) {
|
|
304
|
-
if (!!matchingAttributes)
|
|
305
|
-
return true;
|
|
306
|
-
if (declinationAttribute.attribute_id !== parentAttributeID)
|
|
307
|
-
continue;
|
|
308
|
-
if (!!declinationAttribute.values) {
|
|
309
|
-
matchingAttributes =
|
|
310
|
-
operator === '=='
|
|
311
|
-
? attributeValues.some((attr) => declinationAttribute.values.some((value) => value.slug === attr))
|
|
312
|
-
: !!!attributeValues.some((attr) => declinationAttribute.values.some((value) => value.slug === attr));
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
return matchingAttributes;
|
|
316
|
-
};
|
|
317
|
-
exports.checkAttributes = checkAttributes;
|
|
318
|
-
const getCartPromoType = (discount) => {
|
|
319
|
-
return !!discount.result.action
|
|
320
|
-
? discount.result.action === IDiscountRule_1.ResultActionEnum.GET
|
|
321
|
-
? Cart_1.CartPromoAppliesToEnum.ITEMS
|
|
322
|
-
: [IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING].includes(discount.result.action)
|
|
323
|
-
? Cart_1.CartPromoAppliesToEnum.SHIPPING
|
|
324
|
-
: [
|
|
325
|
-
IDiscountRule_1.ResultActionEnum.AMOUNT_SKU,
|
|
326
|
-
IDiscountRule_1.ResultActionEnum.PERCENT_SKU,
|
|
327
|
-
IDiscountRule_1.ResultActionEnum.AMOUNT_CATEGORY,
|
|
328
|
-
IDiscountRule_1.ResultActionEnum.PERCENT_CATEGORY
|
|
329
|
-
].includes(discount.result.action)
|
|
330
|
-
? Cart_1.CartPromoAppliesToEnum.PRODUCT
|
|
331
|
-
: [IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES, IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES].includes(discount.result.action)
|
|
332
|
-
? Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES
|
|
333
|
-
: Cart_1.CartPromoAppliesToEnum.SUBTOTAL
|
|
334
|
-
: Cart_1.CartPromoAppliesToEnum.SUBTOTAL;
|
|
335
|
-
};
|
|
336
|
-
exports.getCartPromoType = getCartPromoType;
|
|
337
|
-
/**
|
|
338
|
-
* Check if promo code can be applied to a specific cart
|
|
339
|
-
* @param cart - The cart to check
|
|
340
|
-
* @param promoCode - The discount rule with promo code to check
|
|
341
|
-
*/
|
|
342
|
-
const checkPromoCodeEligibility = (cart, promoCode) => {
|
|
343
|
-
var _a;
|
|
344
|
-
let currentDiscountMap = [];
|
|
345
|
-
const promoType = (0, exports.getCartPromoType)(promoCode);
|
|
346
|
-
const currentPromos = (_a = (0, exports.getCartPromo)(cart)) !== null && _a !== void 0 ? _a : [];
|
|
347
|
-
// Only one promo for total_after_taxes can be applied to cart
|
|
348
|
-
if (promoType == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES &&
|
|
349
|
-
currentPromos.some((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES)) {
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
if (promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING && (!!cart.is_pickup || !!!cart.shipping_selected)) {
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
if (promoType === Cart_1.CartPromoAppliesToEnum.PRODUCT &&
|
|
356
|
-
(!!promoCode.result.action_sku || !!promoCode.result.action_categories)) {
|
|
357
|
-
const itemsWherePromoApplicable = (0, exports.getResultAppliedDiscountSkus)(cart.items, promoCode);
|
|
358
|
-
if (!!!itemsWherePromoApplicable.length)
|
|
359
|
-
return false;
|
|
360
|
-
}
|
|
361
|
-
const rules = promoCode.rules;
|
|
362
|
-
if (!!promoCode.noExtraRules || !!!rules || !!!rules.length)
|
|
363
|
-
return true;
|
|
364
|
-
currentDiscountMap = rules.map((rule) => _checkIfRuleAppliesToCart(rule, promoCode.appliesTo, cart));
|
|
365
|
-
return _checkRuleApplicationArray(currentDiscountMap);
|
|
366
|
-
};
|
|
367
|
-
exports.checkPromoCodeEligibility = checkPromoCodeEligibility;
|
|
368
|
-
// #endregion
|
|
369
|
-
// -----------------------------------------------------------------------------------
|
|
370
|
-
// #region TIER PRICING
|
|
371
|
-
/**
|
|
372
|
-
* Returns tier pricing step that should be applied for provided quantity, or undefined if none should apply
|
|
373
|
-
* @param tierPricingToCheck - the indexed tier-pricing array to check
|
|
374
|
-
* @param qte
|
|
375
|
-
*/
|
|
376
|
-
const getTierPricingToApply = (tierPricingToCheck, qte) => {
|
|
377
|
-
if (!!!tierPricingToCheck)
|
|
378
|
-
return;
|
|
379
|
-
return tierPricingToCheck.find((tp) => (0, toNumber_1.default)(tp.from) <= qte && (!!!tp.to || (0, toNumber_1.default)(tp.to) >= qte));
|
|
380
|
-
};
|
|
381
|
-
exports.getTierPricingToApply = getTierPricingToApply;
|
|
382
|
-
/**
|
|
383
|
-
* Converts tier-pricing found in discount_rule to IIndexedTierPricing.
|
|
384
|
-
* @param discountRule - the tier-pricing tier discountRule to check
|
|
385
|
-
* @param price - declinations regular price from which tier-pricing result is calculated
|
|
386
|
-
* @param space
|
|
387
|
-
* @param decimals - the amount of decimals to show on tier-pricing result
|
|
388
|
-
*/
|
|
389
|
-
const applyTierPricing = (discountRule, price, space, decimals) => {
|
|
390
|
-
if (!!!discountRule.rules || !!!discountRule.rules.length)
|
|
391
|
-
return [];
|
|
392
|
-
if (!!discountRule.draft)
|
|
393
|
-
return [];
|
|
394
|
-
const rule = discountRule.rules.find((_rule) => _rule.field === IDiscountRule_1.RuleFieldEnum.QUANTITY && _rule.ruleDetails.find((detail) => detail.operator === 'between'));
|
|
395
|
-
if (!!!rule)
|
|
396
|
-
return [];
|
|
397
|
-
const details = rule.ruleDetails.find((detail) => detail.operator === 'between');
|
|
398
|
-
if (!!!details)
|
|
399
|
-
return [];
|
|
400
|
-
return [
|
|
401
|
-
{
|
|
402
|
-
from: !!!details.value[1] || !!!(0, toNumber_1.default)(details.value[1])
|
|
403
|
-
? details.value[0]
|
|
404
|
-
: (0, toNumber_1.default)(details.value[0]) < (0, toNumber_1.default)(details.value[1])
|
|
405
|
-
? details.value[0]
|
|
406
|
-
: details.value[1],
|
|
407
|
-
to: !!!details.value[1] || !!!(0, toNumber_1.default)(details.value[1])
|
|
408
|
-
? 0
|
|
409
|
-
: (0, toNumber_1.default)(details.value[0]) > (0, toNumber_1.default)(details.value[1])
|
|
410
|
-
? details.value[0]
|
|
411
|
-
: details.value[1],
|
|
412
|
-
price: (0, currency_1.calculateAmountByCurrencyAllDetails)(space, space.preferences.default.currency(), (0, round_1.default)((0, exports.applyDiscountToPrice)(Number(price), discountRule.result), !!decimals ? decimals : 2)),
|
|
413
|
-
check_attribute_value: !!discountRule.appliesTo.check_attribute_value
|
|
414
|
-
? discountRule.appliesTo.check_attribute_value
|
|
415
|
-
: '',
|
|
416
|
-
check_other_items_category: !!discountRule.appliesTo.check_other_items_category
|
|
417
|
-
? discountRule.appliesTo.check_other_items_category
|
|
418
|
-
: '',
|
|
419
|
-
name: discountRule.name
|
|
420
|
-
}
|
|
421
|
-
];
|
|
422
|
-
};
|
|
423
|
-
exports.applyTierPricing = applyTierPricing;
|
|
424
|
-
/**
|
|
425
|
-
* Calculate new discount_price object for cart item base on qte and tier_pricing
|
|
426
|
-
* @param item - the item to check
|
|
427
|
-
* @param setOriginalPrice - if original_amount should be set instead of discount_price.amount
|
|
428
|
-
* @param originalDecli - Optionnal. The IIndexedDeclination used to construct the cart item originally.
|
|
429
|
-
*/
|
|
430
|
-
const getNewDiscountPriceFromTierPricing = (item, setOriginalPrice, originalDecli) => {
|
|
431
|
-
const tierPricingToApply = (0, exports.getTierPricingToApply)(item.tier_pricing, item.qte);
|
|
432
|
-
const currentDiscountPrice = item.discount_price;
|
|
433
|
-
const currentIsTierPricing = !!currentDiscountPrice && currentDiscountPrice.price_type === 'tierpricing';
|
|
434
|
-
const originalDiscountAmount = !!currentDiscountPrice ? currentDiscountPrice.original_amount : null;
|
|
435
|
-
let prevDiscountPrice = null;
|
|
436
|
-
if (!!currentIsTierPricing && typeof originalDiscountAmount === 'number') {
|
|
437
|
-
const { price_type, original_amount } = currentDiscountPrice, rest = __rest(currentDiscountPrice, ["price_type", "original_amount"]);
|
|
438
|
-
prevDiscountPrice = Object.assign(Object.assign({}, rest), { amount: original_amount });
|
|
439
|
-
}
|
|
440
|
-
// if current quantity does not fit in any defined tier_pricing tiers
|
|
441
|
-
if (!!!tierPricingToApply) {
|
|
442
|
-
// if current item has overidden price as discount_price, set original_amount props instead of amount
|
|
443
|
-
if (!!setOriginalPrice && !!currentDiscountPrice) {
|
|
444
|
-
let amountToSet = item.regular_price.amount;
|
|
445
|
-
// if originalDecli was provided, fetch true original price from decli, else use items's regular price
|
|
446
|
-
if (!!originalDecli) {
|
|
447
|
-
const calculatedPrice = (0, products_1.getLowestPrice)(Object.assign(Object.assign({}, originalDecli), { qte: item.qte }));
|
|
448
|
-
amountToSet = calculatedPrice.price.amount;
|
|
449
|
-
}
|
|
450
|
-
return Object.assign(Object.assign({}, currentDiscountPrice), { original_amount: !!originalDecli ? amountToSet : item.regular_price.amount });
|
|
451
|
-
}
|
|
452
|
-
// if current discount_price has 'tierpricing' price_type, return prevDiscountPrice
|
|
453
|
-
// else, return current item discount_price
|
|
454
|
-
return !!currentIsTierPricing ? prevDiscountPrice : (currentDiscountPrice !== null && currentDiscountPrice !== void 0 ? currentDiscountPrice : null);
|
|
455
|
-
}
|
|
456
|
-
// if current item has overidden price as discount_price,
|
|
457
|
-
if (!!setOriginalPrice && !!currentDiscountPrice) {
|
|
458
|
-
return Object.assign(Object.assign({}, currentDiscountPrice), { original_amount: tierPricingToApply.price.amount });
|
|
459
|
-
}
|
|
460
|
-
return Object.assign(Object.assign(Object.assign({}, tierPricingToApply.price), { price_type: 'tierpricing' }), (!!currentDiscountPrice
|
|
461
|
-
? {
|
|
462
|
-
original_amount: typeof originalDiscountAmount === 'number' ? originalDiscountAmount : currentDiscountPrice.amount
|
|
463
|
-
}
|
|
464
|
-
: {}));
|
|
465
|
-
};
|
|
466
|
-
exports.getNewDiscountPriceFromTierPricing = getNewDiscountPriceFromTierPricing;
|
|
467
|
-
// #endregion
|
|
468
|
-
// -----------------------------------------------------------------------------------
|
|
469
|
-
// #region APPLY DISCOUNTS/PROMOS
|
|
470
|
-
/**
|
|
471
|
-
* Get discounted price after applying discount rules to a provided price
|
|
472
|
-
* @param discount_rules - The discount rules to apply
|
|
473
|
-
* @param amount - The initial amount on which to apply discounts
|
|
474
|
-
* @param space
|
|
475
|
-
*/
|
|
476
|
-
const applyDiscountRulesOnProduct = (discount_rules, amount, space) => {
|
|
477
|
-
if (!!!discount_rules || !!!discount_rules.length)
|
|
478
|
-
return undefined;
|
|
479
|
-
let discountIndex = 0;
|
|
480
|
-
let allPromo = discount_rules.filter((discount_rule) => discount_rule.discountRule_type !== 'tier-pricing');
|
|
481
|
-
let current_promo_price = Number(amount);
|
|
482
|
-
for (const discount of allPromo) {
|
|
483
|
-
if (discountIndex > 0 && !discount.is_stackable)
|
|
484
|
-
break;
|
|
485
|
-
let amountToRemove = (0, exports.isPromoAPercentage)(discount)
|
|
486
|
-
? (Number(discount.result.action_value) / 100) * current_promo_price
|
|
487
|
-
: Number(discount.result.action_value);
|
|
488
|
-
current_promo_price -= amountToRemove;
|
|
489
|
-
discountIndex++;
|
|
490
|
-
}
|
|
491
|
-
const spaceProductPrefs = space.preferences.products.get();
|
|
492
|
-
const allowNegativePrices = !!spaceProductPrefs && !!spaceProductPrefs.allow_negative_prices;
|
|
493
|
-
return current_promo_price === Number(amount)
|
|
494
|
-
? undefined
|
|
495
|
-
: current_promo_price < 0 && !!!allowNegativePrices
|
|
496
|
-
? 0
|
|
497
|
-
: current_promo_price;
|
|
498
|
-
};
|
|
499
|
-
exports.applyDiscountRulesOnProduct = applyDiscountRulesOnProduct;
|
|
500
|
-
/**
|
|
501
|
-
* Get result of discount rule discount on a provided amount
|
|
502
|
-
* @param initial - The price on which to apply the discount
|
|
503
|
-
* @param discountResultObj - The discount rule result object
|
|
504
|
-
*/
|
|
505
|
-
const applyDiscountToPrice = (initial, discountResultObj) => {
|
|
506
|
-
return discountResultObj.action === 'amount'
|
|
507
|
-
? initial - Number(discountResultObj.action_value)
|
|
508
|
-
: initial * (1 - Number(discountResultObj.action_value) / 100);
|
|
509
|
-
};
|
|
510
|
-
exports.applyDiscountToPrice = applyDiscountToPrice;
|
|
511
|
-
/**
|
|
512
|
-
* Get sku(s) affected by a promo as an array of strings
|
|
513
|
-
* @param valueToConvert - The sku or sku array associated with the promo
|
|
514
|
-
* @returns And array of strings
|
|
515
|
-
*/
|
|
516
|
-
const getSkuArrayForPromo = (valueToConvert) => {
|
|
517
|
-
if (!!Array.isArray(valueToConvert))
|
|
518
|
-
return valueToConvert;
|
|
519
|
-
return [valueToConvert];
|
|
520
|
-
};
|
|
521
|
-
exports.getSkuArrayForPromo = getSkuArrayForPromo;
|
|
522
|
-
/**
|
|
523
|
-
* Returns a list of all skus where promo applied to specific products should apply. Check for both amount/percent_sku and amount/percent_category options.
|
|
524
|
-
* @param cartItems - The current cart items
|
|
525
|
-
* @param promoToCheck - The promo to check
|
|
526
|
-
* @returns An array of strings
|
|
527
|
-
*/
|
|
528
|
-
const getResultAppliedDiscountSkus = (cartItems, promoToCheck) => {
|
|
529
|
-
var _a, _b, _c;
|
|
530
|
-
const action = (_a = promoToCheck.result.action) !== null && _a !== void 0 ? _a : '';
|
|
531
|
-
const skuArray = (0, exports.getSkuArrayForPromo)((_b = promoToCheck.result.action_sku) !== null && _b !== void 0 ? _b : []);
|
|
532
|
-
const categoryArray = (_c = promoToCheck.result.action_categories) !== null && _c !== void 0 ? _c : [];
|
|
533
|
-
const productsToApplyPromo = cartItems
|
|
534
|
-
.filter((item) => {
|
|
535
|
-
if (!!['amount_category', 'percent_category'].includes(action)) {
|
|
536
|
-
const categorySlugsToCheck = (0, exports.getItemCategorySlugArray)(item.categories);
|
|
537
|
-
// Check if one of the slugs in item is EXACTLY the same as a category slug found in discount
|
|
538
|
-
// -- Done to remove cases where slug in discount is found partially in one of the levels
|
|
539
|
-
return categoryArray.some((cat) => categorySlugsToCheck.includes(cat));
|
|
540
|
-
}
|
|
541
|
-
return skuArray.includes(item.sku);
|
|
542
|
-
})
|
|
543
|
-
.map((item) => item.sku);
|
|
544
|
-
return productsToApplyPromo;
|
|
545
|
-
};
|
|
546
|
-
exports.getResultAppliedDiscountSkus = getResultAppliedDiscountSkus;
|
|
547
|
-
/**
|
|
548
|
-
* Creates array of all category level slugs for a cart item.
|
|
549
|
-
* @param itemCategories - Value found in props cart.categories
|
|
550
|
-
* @returns An array of strings
|
|
551
|
-
*/
|
|
552
|
-
const getItemCategorySlugArray = (itemCategories) => {
|
|
553
|
-
if (!!!itemCategories)
|
|
554
|
-
return [];
|
|
555
|
-
// 1. Reorder item categories by key (can be in diff order in database)
|
|
556
|
-
const orderedByLevel = (0, orderBy_1.default)(Object.entries(itemCategories), ([key, _value]) => key);
|
|
557
|
-
// 2. Then, isolate last category level's value, since it should contain all category levels seperated by string ' > '
|
|
558
|
-
const lastLevelCategory = !!orderedByLevel.length ? orderedByLevel[orderedByLevel.length - 1][1] : '';
|
|
559
|
-
// 3. Split on ' > ' to create array of possible category slug values.
|
|
560
|
-
// Check if one of the slugs is EXACTLY the same as the category slug found in le discount
|
|
561
|
-
return lastLevelCategory.split(' > ');
|
|
562
|
-
};
|
|
563
|
-
exports.getItemCategorySlugArray = getItemCategorySlugArray;
|
|
564
|
-
/**
|
|
565
|
-
* Check if provided discount can be added to currently applied discounts for cart.
|
|
566
|
-
* @param promoToCheck
|
|
567
|
-
* @param currentPromos
|
|
568
|
-
* @param isMultiPromo
|
|
569
|
-
*/
|
|
570
|
-
const checkIfCanAddPromo = (promoToCheck, currentPromos, isMultiPromo) => {
|
|
571
|
-
if (!!!currentPromos || !!!currentPromos.length)
|
|
572
|
-
return { canAdd: true };
|
|
573
|
-
const currentPromosHasPromo = !!currentPromos.some((e) => e.discount_id === promoToCheck.id);
|
|
574
|
-
if (!!currentPromosHasPromo)
|
|
575
|
-
return { canAdd: false, reason: Cart_1.CartErrorEnum.CART_DISCOUNT_CANT_APPLY };
|
|
576
|
-
if (!!isMultiPromo) {
|
|
577
|
-
const isStackable = !!promoToCheck.is_stackable && !!currentPromos.every((x) => !!x.stackable);
|
|
578
|
-
return { canAdd: isStackable, reason: !isStackable ? Cart_1.CartErrorEnum.CART_DISCOUNT_NOT_STACKABLE : undefined };
|
|
579
|
-
}
|
|
580
|
-
return { canAdd: true };
|
|
581
|
-
};
|
|
582
|
-
exports.checkIfCanAddPromo = checkIfCanAddPromo;
|
|
583
|
-
/**
|
|
584
|
-
* Apply all valid discounts found in a specific cart's discount_rules props to cart
|
|
585
|
-
* @param cart - The cart to check
|
|
586
|
-
* @param isMultiPromo
|
|
587
|
-
* @param forceShipping - If cart should be considered as a shipping cart, even if is_pickup is true
|
|
588
|
-
*/
|
|
589
|
-
const applyDiscountToCart = (cart, isMultiPromo, forceShipping = false, forcedPromos) => {
|
|
590
|
-
var _a;
|
|
591
|
-
const discountRules = !!forcedPromos
|
|
592
|
-
? ((_a = cart.discount_rules) !== null && _a !== void 0 ? _a : []).filter((d) => (!!d.created && (0, moment_1.default)((0, data_1.formatDate)(d.created)).isBefore((0, moment_1.default)((0, data_1.formatDate)(cart.paid_at)))) ||
|
|
593
|
-
(!!d.promo_code && !!d.promo_code.code) ||
|
|
594
|
-
!!!d.created)
|
|
595
|
-
: cart.discount_rules;
|
|
596
|
-
if (!!!discountRules || !!!discountRules.length) {
|
|
597
|
-
return Object.assign(Object.assign(Object.assign({}, cart), (!!cart.cart_promo_applied ? { cart_promo_applied: null } : {})), (!!cart.cart_promos_applied ? { cart_promos_applied: null } : {}));
|
|
598
|
-
}
|
|
599
|
-
// Remove all promos not found in cart discount_rules array
|
|
600
|
-
let newCart = Object.assign(Object.assign(Object.assign({}, cart), (!!cart.cart_promo_applied &&
|
|
601
|
-
!!!discountRules.some((dr) => dr.id === cart.cart_promo_applied.discount_id)
|
|
602
|
-
? { cart_promo_applied: null }
|
|
603
|
-
: {})), (!!cart.cart_promos_applied
|
|
604
|
-
? {
|
|
605
|
-
cart_promos_applied: cart.cart_promos_applied.filter((promo) => discountRules.some((dr) => dr.id === promo.discount_id))
|
|
606
|
-
}
|
|
607
|
-
: {}));
|
|
608
|
-
// Chaque fois que les totaux sont recalculés :
|
|
609
|
-
// -- on vérifie les codes promos déjà dans le panier qui s'appliquent sur des skus OU catégories spécifiques
|
|
610
|
-
// -- s'ils n'ont plus d'affaire à s'appliquer, on les retire du cartPromosApplied
|
|
611
|
-
// -- si de nouveaux produits eligibles sont ajoutés, on modifie le array de item_given avec les nouvelles valeurs à jour.
|
|
612
|
-
const currentPromos = (0, exports.getCartPromo)(newCart);
|
|
613
|
-
if (!!currentPromos) {
|
|
614
|
-
let shouldRemovePromo = [];
|
|
615
|
-
let shouldUpdatePromo = [];
|
|
616
|
-
// const currentPromoCodesApplied = currentPromos.filter((p) => !!p.promo_code)
|
|
617
|
-
for (const appliedPromo of currentPromos) {
|
|
618
|
-
if (appliedPromo.applies_to === Cart_1.CartPromoAppliesToEnum.PRODUCT && !!appliedPromo.item_given) {
|
|
619
|
-
const sameInCartDiscounts = discountRules.find((d) => d.id == appliedPromo.discount_id);
|
|
620
|
-
if (!!sameInCartDiscounts) {
|
|
621
|
-
const itemsWherePromoApplicable = (0, exports.getResultAppliedDiscountSkus)(cart.items, sameInCartDiscounts);
|
|
622
|
-
if (!!!itemsWherePromoApplicable.length && !!appliedPromo.discount_id) {
|
|
623
|
-
shouldRemovePromo.push(appliedPromo.discount_id);
|
|
624
|
-
}
|
|
625
|
-
else if (itemsWherePromoApplicable.length !== appliedPromo.item_given.length) {
|
|
626
|
-
shouldUpdatePromo.push(Object.assign(Object.assign({}, appliedPromo), { item_given: itemsWherePromoApplicable }));
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
// Update cart_promos_applied to remove unapplicable promos and update promos to current cart items
|
|
632
|
-
newCart = Object.assign(Object.assign({}, newCart), (!!newCart.cart_promos_applied
|
|
633
|
-
? {
|
|
634
|
-
cart_promos_applied: newCart.cart_promos_applied
|
|
635
|
-
.filter((promo) => !shouldRemovePromo.includes(promo.discount_id))
|
|
636
|
-
.map((promo) => {
|
|
637
|
-
if (!!!shouldUpdatePromo.length)
|
|
638
|
-
return promo;
|
|
639
|
-
const sameInUpdated = shouldUpdatePromo.find((p) => p.discount_id == promo.discount_id);
|
|
640
|
-
return sameInUpdated !== null && sameInUpdated !== void 0 ? sameInUpdated : promo;
|
|
641
|
-
})
|
|
642
|
-
}
|
|
643
|
-
: {}));
|
|
644
|
-
}
|
|
645
|
-
for (const discount of discountRules) {
|
|
646
|
-
if (!!discount.promo_code && !!discount.promo_code.code) {
|
|
647
|
-
// CHECK FOR PROMO_CODE ELIGIBILITY
|
|
648
|
-
const promoCodeInCart = (currentPromos || []).find((p) => p.discount_id == discount.id);
|
|
649
|
-
if (!!promoCodeInCart) {
|
|
650
|
-
const shouldStillApplyCode = (0, exports.checkPromoCodeEligibility)(newCart, discount);
|
|
651
|
-
if (!!!shouldStillApplyCode) {
|
|
652
|
-
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
653
|
-
? { cart_promo_applied: null }
|
|
654
|
-
: {})), (!!newCart.cart_promos_applied
|
|
655
|
-
? {
|
|
656
|
-
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
657
|
-
}
|
|
658
|
-
: {}));
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
continue;
|
|
662
|
-
}
|
|
663
|
-
const promoType = (0, exports.getCartPromoType)(discount);
|
|
664
|
-
let currentDiscountMap = [];
|
|
665
|
-
if (promoType == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES &&
|
|
666
|
-
((0, exports.getCartPromo)(newCart) || []).some((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES && p.discount_id != discount.id)) {
|
|
667
|
-
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, false]];
|
|
668
|
-
}
|
|
669
|
-
else if (promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING &&
|
|
670
|
-
(!!cart.is_pickup || !!!cart.shipping_selected) &&
|
|
671
|
-
!!!forceShipping) {
|
|
672
|
-
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, false]];
|
|
673
|
-
}
|
|
674
|
-
else if (!!!discount.rules || !!!discount.rules.length) {
|
|
675
|
-
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, true]];
|
|
676
|
-
}
|
|
677
|
-
else if (!!discount.draft) {
|
|
678
|
-
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, true]];
|
|
679
|
-
}
|
|
680
|
-
else {
|
|
681
|
-
currentDiscountMap = discount.rules.map((rule) => _checkIfRuleAppliesToCart(rule, discount.appliesTo, cart));
|
|
682
|
-
}
|
|
683
|
-
if (_checkRuleApplicationArray(currentDiscountMap)) {
|
|
684
|
-
if (discount.draft) {
|
|
685
|
-
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
686
|
-
? { cart_promo_applied: null }
|
|
687
|
-
: {})), (!!newCart.cart_promos_applied
|
|
688
|
-
? {
|
|
689
|
-
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
690
|
-
}
|
|
691
|
-
: {}));
|
|
692
|
-
}
|
|
693
|
-
else {
|
|
694
|
-
if (promoType === Cart_1.CartPromoAppliesToEnum.PRODUCT &&
|
|
695
|
-
(!!discount.result.action_sku || !!discount.result.action_categories)) {
|
|
696
|
-
const productsToApplyPromo = (0, exports.getResultAppliedDiscountSkus)(cart.items, discount);
|
|
697
|
-
if (!!productsToApplyPromo.length) {
|
|
698
|
-
const newPromo = Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: Number(discount.result.action_value), amount_unit: discount.result.action, item_given: productsToApplyPromo, item_given_amount: 0, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: 0, stackable: discount.is_stackable, discount_id: discount.id, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
699
|
-
? {
|
|
700
|
-
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
701
|
-
}
|
|
702
|
-
: {}));
|
|
703
|
-
if ((0, exports.checkIfCanAddPromo)(discount, (0, exports.getCartPromo)(newCart), isMultiPromo).canAdd) {
|
|
704
|
-
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...(newCart.cart_promos_applied || []), newPromo] });
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
else {
|
|
708
|
-
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
709
|
-
? { cart_promo_applied: null }
|
|
710
|
-
: {})), (!!newCart.cart_promos_applied
|
|
711
|
-
? {
|
|
712
|
-
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
713
|
-
}
|
|
714
|
-
: {}));
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
const newPromo = Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: promoType !== Cart_1.CartPromoAppliesToEnum.SHIPPING ? Number(discount.result.action_value) : 0, amount_unit: discount.result.action, item_given: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS ? discount.result.action_value.toString() : '', item_given_amount: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS && !!discount.result.action_qte
|
|
719
|
-
? Number(discount.result.action_qte)
|
|
720
|
-
: 0, stackable: discount.is_stackable, discount_id: discount.id, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING &&
|
|
721
|
-
discount.result.action === IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING
|
|
722
|
-
? Number(discount.result.action_value)
|
|
723
|
-
: 0, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
724
|
-
? {
|
|
725
|
-
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
726
|
-
}
|
|
727
|
-
: {}));
|
|
728
|
-
if ((0, exports.checkIfCanAddPromo)(discount, (0, exports.getCartPromo)(newCart), isMultiPromo).canAdd) {
|
|
729
|
-
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...(newCart.cart_promos_applied || []), newPromo] });
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
else {
|
|
735
|
-
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!cart.cart_promo_applied && cart.cart_promo_applied.discount_id === discount.id
|
|
736
|
-
? { cart_promo_applied: null }
|
|
737
|
-
: {})), (!!newCart.cart_promos_applied
|
|
738
|
-
? {
|
|
739
|
-
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
740
|
-
}
|
|
741
|
-
: {}));
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
if (!!newCart.cart_promos_applied && !!isMultiPromo) {
|
|
745
|
-
const shippingPromo = newCart.cart_promos_applied.filter((x) => x.applies_to === Cart_1.CartPromoAppliesToEnum.SHIPPING);
|
|
746
|
-
if (!!shippingPromo && !!shippingPromo.length) {
|
|
747
|
-
let flatPrice = 1000000;
|
|
748
|
-
let promo = 0;
|
|
749
|
-
for (let i = 0; i < shippingPromo.length; i++) {
|
|
750
|
-
if (shippingPromo[i].amount_unit === 'free_shipping') {
|
|
751
|
-
// si free on stop la
|
|
752
|
-
promo = i;
|
|
753
|
-
break;
|
|
754
|
-
}
|
|
755
|
-
if (!!shippingPromo[i].flatrate_shipping && shippingPromo[i].flatrate_shipping < flatPrice) {
|
|
756
|
-
promo = i;
|
|
757
|
-
flatPrice = shippingPromo[i].flatrate_shipping;
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
const promoSansShipping = newCart.cart_promos_applied.filter((x) => x.applies_to !== Cart_1.CartPromoAppliesToEnum.SHIPPING);
|
|
761
|
-
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...promoSansShipping, shippingPromo[promo]] });
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
if (!!forcedPromos && !!forcedPromos.length) {
|
|
765
|
-
const appliedPromos = !!newCart.cart_promos_applied && !!newCart.cart_promos_applied.length
|
|
766
|
-
? newCart.cart_promos_applied.map((p) => p.discount_id)
|
|
767
|
-
: [];
|
|
768
|
-
const newForcedPromos = forcedPromos.filter((f) => !!!appliedPromos.includes(f.discount_id));
|
|
769
|
-
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [
|
|
770
|
-
...(!!newCart.cart_promos_applied && !!newCart.cart_promos_applied.length ? newCart.cart_promos_applied : []),
|
|
771
|
-
...newForcedPromos
|
|
772
|
-
] });
|
|
773
|
-
}
|
|
774
|
-
return Object.assign(Object.assign({}, newCart), { free_shipping: !!newCart.cart_promos_applied
|
|
775
|
-
? newCart.cart_promos_applied.some((p) => !!p.free_shipping)
|
|
776
|
-
: !!newCart.cart_promo_applied && newCart.cart_promo_applied.free_shipping });
|
|
777
|
-
};
|
|
778
|
-
exports.applyDiscountToCart = applyDiscountToCart;
|
|
779
|
-
/**
|
|
780
|
-
* Get the ICartPromoApplied object for a specified discount_rule. Only works for promos that do not apply to products of certain categories/skus.
|
|
781
|
-
* @param cart
|
|
782
|
-
* @param discount
|
|
783
|
-
*/
|
|
784
|
-
const getStandardCartPromoFromDiscount = (cart, discount) => {
|
|
785
|
-
const promoType = (0, exports.getCartPromoType)(discount);
|
|
786
|
-
return Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: promoType !== Cart_1.CartPromoAppliesToEnum.SHIPPING ? Number(discount.result.action_value) : 0, amount_unit: discount.result.action, item_given: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS ? discount.result.action_value.toString() : '', item_given_amount: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS && !!discount.result.action_qte
|
|
787
|
-
? Number(discount.result.action_qte)
|
|
788
|
-
: 0, stackable: discount.is_stackable, discount_id: discount.id, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING && discount.result.action === IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING
|
|
789
|
-
? Number(discount.result.action_value)
|
|
790
|
-
: 0, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
791
|
-
? {
|
|
792
|
-
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
793
|
-
}
|
|
794
|
-
: {}));
|
|
795
|
-
};
|
|
796
|
-
exports.getStandardCartPromoFromDiscount = getStandardCartPromoFromDiscount;
|
|
797
|
-
/**
|
|
798
|
-
* Calculates the cumulative subtotal for all service/fee type items in cart, including any applied promos. Usefull when calculating a promo's amount when all fees and services should be excluded.
|
|
799
|
-
* @param cartData - The cartData to check
|
|
800
|
-
* @param allCurrentAppliedToItemPromos - All currently active cartPromos that apply to items in cart. Sent seperatly in case local state is different from current cartData.
|
|
801
|
-
* @returns A number
|
|
802
|
-
*/
|
|
803
|
-
const getOnlyServicesAndFeesSubtotal = (cartData, allCurrentAppliedToItemPromos) => {
|
|
804
|
-
// Calculate the subtotal for just the fees and services, including their promos
|
|
805
|
-
// ** NEW - Now does not count escompte supp products as services when in promo on subtotal check
|
|
806
|
-
let servicesAndFeesTotal = 0;
|
|
807
|
-
cartData.items.forEach((i) => {
|
|
808
|
-
if (!!!i.is_service || !!(0, g2_1.isEscompteSuppItem)(i.sku))
|
|
809
|
-
return;
|
|
810
|
-
const associatedPromos = allCurrentAppliedToItemPromos.filter((p) => { var _a; return (0, exports.getSkuArrayForPromo)((_a = p.item_given) !== null && _a !== void 0 ? _a : []).includes(i.sku); });
|
|
811
|
-
servicesAndFeesTotal += (0, round_1.default)(i.qte * (0, products_1.getLowestPrice)(i).price.amount, 3);
|
|
812
|
-
if (!!associatedPromos.length) {
|
|
813
|
-
for (const promo of associatedPromos) {
|
|
814
|
-
if (!!!promo.amount_removed)
|
|
815
|
-
continue;
|
|
816
|
-
if ((0, exports.isPromoAPercentage)(promo, { defaultToPercent: true })) {
|
|
817
|
-
servicesAndFeesTotal -= (0, round_1.default)((promo.amount_removed / 100) * (i.qte * (0, products_1.getLowestPrice)(i).price.amount), 3);
|
|
818
|
-
}
|
|
819
|
-
else {
|
|
820
|
-
servicesAndFeesTotal -= promo.amount_removed * i.qte;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
});
|
|
825
|
-
return servicesAndFeesTotal;
|
|
826
|
-
};
|
|
827
|
-
exports.getOnlyServicesAndFeesSubtotal = getOnlyServicesAndFeesSubtotal;
|
|
828
|
-
// =========================================================
|
|
829
|
-
// #region UTILS FOR APPLYING CART DISCOUNTS AND PROMO CODES
|
|
830
|
-
const _checkIfRuleAppliesToCart = (rule, appliesTo, cart) => {
|
|
831
|
-
var _a;
|
|
832
|
-
const todayDate = (0, moment_1.default)().toDate();
|
|
833
|
-
const ruleCondition = (_a = rule.condition) !== null && _a !== void 0 ? _a : IDiscountRule_1.RuleConditionEnum.AND;
|
|
834
|
-
switch (rule.field) {
|
|
835
|
-
case IDiscountRule_1.RuleFieldEnum.CART_TOTAL:
|
|
836
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
837
|
-
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, cart.subtotal)];
|
|
838
|
-
}));
|
|
839
|
-
case IDiscountRule_1.RuleFieldEnum.CART_ITEM_TOTAL:
|
|
840
|
-
let totalCartItems = (0, sumBy_1.default)(cart.items, (item) => item.qte);
|
|
841
|
-
if (!!appliesTo.check_other_items_category) {
|
|
842
|
-
const correspondingCartItems = cart.items.filter((item) => {
|
|
843
|
-
if (!!item.tier_pricing && !!item.tier_pricing.length) {
|
|
844
|
-
return (!!item.tier_pricing[0].check_other_items_category &&
|
|
845
|
-
item.tier_pricing[0].check_other_items_category === appliesTo.check_other_items_category);
|
|
846
|
-
}
|
|
847
|
-
return false;
|
|
848
|
-
});
|
|
849
|
-
totalCartItems = (0, sumBy_1.default)(correspondingCartItems, (item) => {
|
|
850
|
-
let amountInBox = 1;
|
|
851
|
-
const qte = item.qte;
|
|
852
|
-
if (!!item.attributes['8OUv9qj0aDbiLOovd4dp']) {
|
|
853
|
-
amountInBox = Number(item.attributes['8OUv9qj0aDbiLOovd4dp']);
|
|
854
|
-
}
|
|
855
|
-
return amountInBox * qte;
|
|
856
|
-
});
|
|
857
|
-
}
|
|
858
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
859
|
-
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, totalCartItems)];
|
|
860
|
-
}));
|
|
861
|
-
case IDiscountRule_1.RuleFieldEnum.CART_ITEM:
|
|
862
|
-
if (!!cart) {
|
|
863
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
864
|
-
if (ruleDetail.operator === 'contains') {
|
|
865
|
-
return [ruleCondition, ruleDetail.value.every((v) => !!cart.items.some((item) => item.sku === v))];
|
|
866
|
-
}
|
|
867
|
-
return [ruleCondition, !!!cart.items.find((item) => !!ruleDetail.value.find((v) => v === item.sku))];
|
|
868
|
-
}));
|
|
869
|
-
}
|
|
870
|
-
case IDiscountRule_1.RuleFieldEnum.CUSTOMER:
|
|
871
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
872
|
-
return [ruleCondition, cart.customer_id === ruleDetail.value[0]];
|
|
873
|
-
}));
|
|
874
|
-
case IDiscountRule_1.RuleFieldEnum.CUSTOMER_TYPE:
|
|
875
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
876
|
-
if (ruleDetail.operator === '!=') {
|
|
877
|
-
return [
|
|
878
|
-
ruleCondition,
|
|
879
|
-
(!!cart.customer_info && !!!cart.customer_info.pro_title) ||
|
|
880
|
-
(!!cart.customer_info &&
|
|
881
|
-
!!cart.customer_info.pro_title &&
|
|
882
|
-
!!!ruleDetail.value.includes(cart.customer_info.pro_title))
|
|
883
|
-
];
|
|
884
|
-
}
|
|
885
|
-
return [
|
|
886
|
-
ruleCondition,
|
|
887
|
-
!!cart.customer_info &&
|
|
888
|
-
!!cart.customer_info.pro_title &&
|
|
889
|
-
!!ruleDetail.value.includes(cart.customer_info.pro_title)
|
|
890
|
-
];
|
|
891
|
-
}));
|
|
892
|
-
case IDiscountRule_1.RuleFieldEnum.DATE:
|
|
893
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
894
|
-
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, todayDate)];
|
|
895
|
-
}));
|
|
896
|
-
case IDiscountRule_1.RuleFieldEnum.WEEKDAY:
|
|
897
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
898
|
-
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, todayDate)];
|
|
899
|
-
}));
|
|
900
|
-
case IDiscountRule_1.RuleFieldEnum.CART_PLATFORM:
|
|
901
|
-
const cartPlatform = !![Cart_1.CartTypeEnum.POS, Cart_1.CartTypeEnum.POS_TRANSACTIONNAL].includes(cart.cart_type)
|
|
902
|
-
? Cart_1.CartTypeEnum.POS
|
|
903
|
-
: Cart_1.CartTypeEnum.WEB;
|
|
904
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
905
|
-
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, cartPlatform)];
|
|
906
|
-
}));
|
|
907
|
-
case IDiscountRule_1.RuleFieldEnum.CART_TYPE:
|
|
908
|
-
const cartType = cart.cart_content_type === Cart_1.CartContentTypeEnum.MIXED
|
|
909
|
-
? Cart_1.CartContentTypeEnum.MIXED
|
|
910
|
-
: !!(0, cart_1.checkIfCartContainsType)(cart_2.CartGeneralTypeEnum.INSTALLATION, cart)
|
|
911
|
-
? cart_2.CartGeneralTypeEnum.INSTALLATION
|
|
912
|
-
: (0, cart_1.getCartType)(cart);
|
|
913
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
914
|
-
let result = (0, exports.getResultRuleDetail)(ruleDetail, cartType);
|
|
915
|
-
for (const value of ruleDetail.value) {
|
|
916
|
-
if (value === cart_2.CartGeneralTypeEnum.GRASS && cartType === cart_2.CartGeneralTypeEnum.INSTALLATION)
|
|
917
|
-
result = true;
|
|
918
|
-
}
|
|
919
|
-
return [ruleCondition, result];
|
|
920
|
-
}));
|
|
921
|
-
case IDiscountRule_1.RuleFieldEnum.CART_ITEM_CATEGORIES:
|
|
922
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
923
|
-
let result = ruleDetail.operator !== 'contains';
|
|
924
|
-
for (const i of cart.items) {
|
|
925
|
-
const categorySlugsToCheck = (0, exports.getItemCategorySlugArray)(i.categories);
|
|
926
|
-
if (!!categorySlugsToCheck.length) {
|
|
927
|
-
for (const ruleValue of ruleDetail.value) {
|
|
928
|
-
if (!!categorySlugsToCheck.includes(ruleValue))
|
|
929
|
-
result = ruleDetail.operator !== 'contains' ? false : true;
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
return [ruleCondition, result];
|
|
934
|
-
}));
|
|
935
|
-
case IDiscountRule_1.RuleFieldEnum.ORDER_DAY:
|
|
936
|
-
const order_day_day = !!cart.shipping_payload && !!cart.shipping_payload.delivery_or_pickup_date
|
|
937
|
-
? cart.shipping_payload.delivery_or_pickup_date
|
|
938
|
-
: '';
|
|
939
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
940
|
-
return [ruleCondition, !!order_day_day ? (0, exports.getResultRuleDetail)(ruleDetail, (0, moment_1.default)(order_day_day).day()) : false];
|
|
941
|
-
}));
|
|
942
|
-
case IDiscountRule_1.RuleFieldEnum.ORDER_TYPE:
|
|
943
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
944
|
-
return [
|
|
945
|
-
ruleCondition,
|
|
946
|
-
!!cart.is_pickup
|
|
947
|
-
? ruleDetail.operator === '=='
|
|
948
|
-
? !!ruleDetail.value.includes('pickup')
|
|
949
|
-
: !!!ruleDetail.value.includes('pickup')
|
|
950
|
-
: ruleDetail.operator === '=='
|
|
951
|
-
? !!ruleDetail.value.includes('shipping')
|
|
952
|
-
: !!!ruleDetail.value.includes('shipping')
|
|
953
|
-
];
|
|
954
|
-
}));
|
|
955
|
-
case IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD:
|
|
956
|
-
// If incentive custom_payment_type is registered, let this check pass, since payment_method will only be chosen on last step
|
|
957
|
-
// NOTE - Used to only apply to POS and POS_TRASACTIONNAL carts, now applies to all carts.
|
|
958
|
-
if (
|
|
959
|
-
// cart.cart_type != CartTypeEnum.WEB &&
|
|
960
|
-
cart.custom_payment_type &&
|
|
961
|
-
cart.custom_payment_type.method == Cart_1.CustomPaymentTypeEnum.INCENTIVE) {
|
|
962
|
-
return [ruleCondition, true];
|
|
963
|
-
}
|
|
964
|
-
const paymentTypesToCompare = !!cart.custom_payment_type
|
|
965
|
-
? [cart.custom_payment_type.method]
|
|
966
|
-
: !!(0, object_1.recursiveCheckObject)(cart, 'shipping_payload.chosen_payment')
|
|
967
|
-
? [(0, object_1.recursiveCheckObject)(cart, 'shipping_payload.chosen_payment')]
|
|
968
|
-
: !!cart.payment_details && cart.payment_details.length
|
|
969
|
-
? cart.payment_details.map((p) => p.method)
|
|
970
|
-
: !!cart.paid_by
|
|
971
|
-
? [cart.paid_by]
|
|
972
|
-
: [];
|
|
973
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
974
|
-
// Si contains, doit contenir AU MOINS UN des modes de paiement ciblés
|
|
975
|
-
// Si contains-not, ne doit pas contenir QUE les modes de paiement exclus
|
|
976
|
-
let result = ruleDetail.operator == 'contains'
|
|
977
|
-
? paymentTypesToCompare.some((type) => ruleDetail.value.includes(type))
|
|
978
|
-
: !paymentTypesToCompare.every((type) => ruleDetail.value.includes(type));
|
|
979
|
-
return [ruleCondition, result];
|
|
980
|
-
}));
|
|
981
|
-
case IDiscountRule_1.RuleFieldEnum.CUSTOMER_TERMS_CODE:
|
|
982
|
-
let customerTermsCode = (0, object_1.recursiveCheckObject)(cart, 'customer_info.terms_code');
|
|
983
|
-
let customerPrevTermsCode = (0, object_1.recursiveCheckObject)(cart, 'customer_info.previous_terms_code');
|
|
984
|
-
let trueTermsCode = customerTermsCode == 'HOLD' ? 'HOLD' : (customerPrevTermsCode !== null && customerPrevTermsCode !== void 0 ? customerPrevTermsCode : customerTermsCode);
|
|
985
|
-
let termsCodeToCheck = !!!trueTermsCode
|
|
986
|
-
? undefined
|
|
987
|
-
: data_2.allCodesForHold.includes(trueTermsCode)
|
|
988
|
-
? 'HOLD'
|
|
989
|
-
: data_2.allCodesForPSL.includes(trueTermsCode)
|
|
990
|
-
? 'P.S.L'
|
|
991
|
-
: 'NET30';
|
|
992
|
-
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
993
|
-
let operator = ruleDetail.operator;
|
|
994
|
-
if (!!!termsCodeToCheck)
|
|
995
|
-
return [IDiscountRule_1.RuleConditionEnum.AND, operator == '!='];
|
|
996
|
-
return [
|
|
997
|
-
ruleCondition,
|
|
998
|
-
operator == '=='
|
|
999
|
-
? ruleDetail.value.includes(termsCodeToCheck)
|
|
1000
|
-
: !ruleDetail.value.includes(termsCodeToCheck)
|
|
1001
|
-
];
|
|
1002
|
-
}));
|
|
1003
|
-
default:
|
|
1004
|
-
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
1005
|
-
}
|
|
1006
|
-
};
|
|
1007
|
-
/**
|
|
1008
|
-
* Checks if discount rule should be applied to cart based on each rule verification results.
|
|
1009
|
-
* @param checkedRulesApplicationArray - Array where each position is a verified rule result (condition with passed of failed (boolean))
|
|
1010
|
-
* @returns A boolean
|
|
1011
|
-
*/
|
|
1012
|
-
const _checkRuleApplicationArray = (checkedRulesApplicationArray) => {
|
|
1013
|
-
return ((checkedRulesApplicationArray.some((option) => !!option && option.indexOf(IDiscountRule_1.RuleConditionEnum.OR) !== -1) &&
|
|
1014
|
-
checkedRulesApplicationArray.some((option) => !!option && option.indexOf(true) !== -1)) ||
|
|
1015
|
-
(checkedRulesApplicationArray.some((option) => !!option && option.indexOf(IDiscountRule_1.RuleConditionEnum.AND) !== -1) &&
|
|
1016
|
-
!checkedRulesApplicationArray.some((option) => !!option && option.indexOf(false) !== -1)));
|
|
1017
|
-
};
|
|
1018
|
-
// #endregion
|
|
1019
|
-
// #endregion
|
|
1020
|
-
// -----------------------------------------------------------------------------------
|
|
1021
|
-
// #region PAYMENT INCENTIVE DISCOUNTS/PROMOS
|
|
1022
|
-
/**
|
|
1023
|
-
* Checks if an incentive discount could (in theory) by added to provided cart, by checking found incentive discount's rule array.
|
|
1024
|
-
* @param cartData - The cart to check (checks discount_rules for incentive)
|
|
1025
|
-
* @param skipCheckFor - If certain rules should be ignore for check
|
|
1026
|
-
* @returns a boolean
|
|
1027
|
-
*/
|
|
1028
|
-
const checkIfCouldApplyIncentivePromo = (cartData, skipCheckFor = []) => {
|
|
1029
|
-
let afterTaxesPromo = cartData.discount_rules.find((d) => !d.draft &&
|
|
1030
|
-
(d.result.action == IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES ||
|
|
1031
|
-
d.result.action == IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES));
|
|
1032
|
-
if (!!!afterTaxesPromo)
|
|
1033
|
-
return false;
|
|
1034
|
-
if (!!!afterTaxesPromo.rules || afterTaxesPromo.rules.length == 0)
|
|
1035
|
-
return true;
|
|
1036
|
-
const appliesTo = afterTaxesPromo.appliesTo;
|
|
1037
|
-
const canApply = afterTaxesPromo.rules.map((r) => {
|
|
1038
|
-
if (r.field && skipCheckFor.includes(r.field))
|
|
1039
|
-
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
1040
|
-
return _checkIfRuleAppliesToCart(r, appliesTo, cartData);
|
|
1041
|
-
});
|
|
1042
|
-
return _checkRuleApplicationArray(canApply);
|
|
1043
|
-
};
|
|
1044
|
-
exports.checkIfCouldApplyIncentivePromo = checkIfCouldApplyIncentivePromo;
|
|
1045
|
-
/**
|
|
1046
|
-
* Calculates amount to be removed for payment incentive type promos.
|
|
1047
|
-
* @param cartData
|
|
1048
|
-
* @param checkDiscountRules - Optionnal. If cart discount_rules should be checked if cart_promos_applied does not have promo yet.
|
|
1049
|
-
*/
|
|
1050
|
-
const getAfterTaxesPromosTotalAmount = (cartData, checkDiscountRules) => {
|
|
1051
|
-
let currentSubtotal = cartData.subtotal;
|
|
1052
|
-
let afterTaxesPromo = (0, exports.getAfterTaxesPromoInCart)(cartData, checkDiscountRules);
|
|
1053
|
-
let totalAmountForAfterTaxesPromos = 0;
|
|
1054
|
-
if (!!afterTaxesPromo && !!afterTaxesPromo.amount_removed) {
|
|
1055
|
-
if ((0, exports.isPromoAPercentage)(afterTaxesPromo, { includePaymentIncentiveInCheck: true })) {
|
|
1056
|
-
totalAmountForAfterTaxesPromos += currentSubtotal * (afterTaxesPromo.amount_removed / 100);
|
|
1057
|
-
}
|
|
1058
|
-
else {
|
|
1059
|
-
totalAmountForAfterTaxesPromos += afterTaxesPromo.amount_removed;
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
return totalAmountForAfterTaxesPromos;
|
|
1063
|
-
};
|
|
1064
|
-
exports.getAfterTaxesPromosTotalAmount = getAfterTaxesPromosTotalAmount;
|
|
1065
|
-
/**
|
|
1066
|
-
* Returns cart_promos_applied corresponding to payment incentive, if found. Can also check in discount_rules if props provided
|
|
1067
|
-
* @param cartData
|
|
1068
|
-
* @param checkDiscountRules - Optionnal. If the function should check in cart discount_rules if nothing found in cart_promos_applied or if value differs between discount and promo applied
|
|
1069
|
-
*/
|
|
1070
|
-
const getAfterTaxesPromoInCart = (cartData, checkDiscountRules) => {
|
|
1071
|
-
var _a;
|
|
1072
|
-
let cartPromos = (_a = (0, exports.getCartPromo)(cartData)) !== null && _a !== void 0 ? _a : [];
|
|
1073
|
-
let incentivePromo = cartPromos.find((p) => p.applies_to === Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES);
|
|
1074
|
-
// Check discount_rule in case value changed or cart promo
|
|
1075
|
-
let discountIncentive = (0, exports.getPaymentIncentiveDiscount)(cartData.discount_rules);
|
|
1076
|
-
if (!!checkDiscountRules &&
|
|
1077
|
-
!!discountIncentive &&
|
|
1078
|
-
(!!!incentivePromo || discountIncentive.result.action_value != incentivePromo.amount_removed)) {
|
|
1079
|
-
incentivePromo = (0, exports.getStandardCartPromoFromDiscount)(cartData, discountIncentive);
|
|
1080
|
-
}
|
|
1081
|
-
return incentivePromo;
|
|
1082
|
-
};
|
|
1083
|
-
exports.getAfterTaxesPromoInCart = getAfterTaxesPromoInCart;
|
|
1084
|
-
/**
|
|
1085
|
-
* Returns the information regarding the payment incentive promo if found in cart's discount_rules
|
|
1086
|
-
* @param cartData
|
|
1087
|
-
* @param checkForAllPaidByDiscounts Optionnal. If defined, will check all discounts if no specific incentive found
|
|
1088
|
-
*/
|
|
1089
|
-
const getPaymentIncentiveDiscountInfo = (cartData, checkForAllPaidByDiscounts) => {
|
|
1090
|
-
let appliesToPaymentTypes = undefined;
|
|
1091
|
-
let paymentIncentiveDiscount = (0, exports.getPaymentIncentiveDiscount)(cartData.discount_rules);
|
|
1092
|
-
if (!!!paymentIncentiveDiscount) {
|
|
1093
|
-
// If not found and props set, check all discounts and use first found with rule on payment methode
|
|
1094
|
-
if (!!checkForAllPaidByDiscounts)
|
|
1095
|
-
paymentIncentiveDiscount = cartData.discount_rules.find((d) => (d.rules || []).some((r) => r.field == IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD));
|
|
1096
|
-
if (!!!paymentIncentiveDiscount)
|
|
1097
|
-
return;
|
|
1098
|
-
}
|
|
1099
|
-
let ruleForPaymentType = (paymentIncentiveDiscount.rules || []).find((rule) => rule.field == IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD);
|
|
1100
|
-
if (!!ruleForPaymentType) {
|
|
1101
|
-
appliesToPaymentTypes = {
|
|
1102
|
-
amount: (0, toNumber_1.default)(paymentIncentiveDiscount.result.action_value),
|
|
1103
|
-
isPercent: (0, exports.isPromoAPercentage)(paymentIncentiveDiscount, { includePaymentIncentiveInCheck: true }),
|
|
1104
|
-
paymentTypes: (0, flatten_1.default)(ruleForPaymentType.ruleDetails.map((d) => (0, flatten_1.default)(d.value)))
|
|
1105
|
-
};
|
|
1106
|
-
}
|
|
1107
|
-
return appliesToPaymentTypes;
|
|
1108
|
-
};
|
|
1109
|
-
exports.getPaymentIncentiveDiscountInfo = getPaymentIncentiveDiscountInfo;
|
|
1110
|
-
const getPaymentIncentiveDiscount = (discountRules) => {
|
|
1111
|
-
if (!!!discountRules)
|
|
1112
|
-
return;
|
|
1113
|
-
let paymentIncentiveDiscount = discountRules.find((d) => !!d.result.action &&
|
|
1114
|
-
[IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES, IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES].includes(d.result.action));
|
|
1115
|
-
return paymentIncentiveDiscount;
|
|
1116
|
-
};
|
|
1117
|
-
exports.getPaymentIncentiveDiscount = getPaymentIncentiveDiscount;
|
|
1118
|
-
// #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.getPaymentIncentiveDiscount = exports.getPaymentIncentiveDiscountInfo = exports.getAfterTaxesPromoInCart = exports.getAfterTaxesPromosTotalAmount = exports.checkIfCouldApplyIncentivePromo = exports.getOnlyServicesAndFeesSubtotal = exports.getStandardCartPromoFromDiscount = exports.applyDiscountToCart = exports.checkIfCanAddPromo = exports.getItemCategorySlugArray = exports.getResultAppliedDiscountSkus = exports.getSkuArrayForPromo = exports.applyDiscountToPrice = exports.applyDiscountRulesOnProduct = exports.getNewDiscountPriceFromTierPricing = exports.applyTierPricing = exports.getTierPricingToApply = exports.checkPromoCodeEligibility = exports.getCartPromoType = exports.checkAttributes = exports.getResultRuleDetail = exports.shouldApplyRuleToDeclination = exports.getAppliedAmountsForSubtotalPromosOnCart = exports.getCartPromosByAppliesTo = exports.getSubtotalWithoutProductPromos = exports.isPromoAPercentage = exports.shouldCheckPromoCode = exports.getCartPromo = void 0;
|
|
18
|
+
const IDiscountRule_1 = require("../Interfaces/Rules/IDiscountRule");
|
|
19
|
+
const Cart_1 = require("../Interfaces/Cart");
|
|
20
|
+
const flatten_1 = __importDefault(require("lodash/flatten"));
|
|
21
|
+
const round_1 = __importDefault(require("lodash/round"));
|
|
22
|
+
const sumBy_1 = __importDefault(require("lodash/sumBy"));
|
|
23
|
+
const toNumber_1 = __importDefault(require("lodash/toNumber"));
|
|
24
|
+
const orderBy_1 = __importDefault(require("lodash/orderBy"));
|
|
25
|
+
const locale_1 = require("./locale");
|
|
26
|
+
const currency_1 = require("./currency");
|
|
27
|
+
const moment_1 = __importDefault(require("moment"));
|
|
28
|
+
const data_1 = require("./data");
|
|
29
|
+
const products_1 = require("./products");
|
|
30
|
+
const cart_1 = require("../rules/GR/utils/cart");
|
|
31
|
+
const cart_2 = require("../rules/GR/interfaces/cart");
|
|
32
|
+
const object_1 = require("./object");
|
|
33
|
+
const data_2 = require("../rules/GR/constants/data");
|
|
34
|
+
const g2_1 = require("../rules/GR/utils/g2");
|
|
35
|
+
// -----------------------------------------------------------------------------------
|
|
36
|
+
// #region GENERAL
|
|
37
|
+
/**
|
|
38
|
+
* Get formatted array of cart promos applied to a specific cart
|
|
39
|
+
* @param cartData
|
|
40
|
+
*/
|
|
41
|
+
const getCartPromo = (cartData) => {
|
|
42
|
+
if (!!!cartData.cart_promo_applied && !!!cartData.cart_promos_applied)
|
|
43
|
+
return;
|
|
44
|
+
return !!cartData.cart_promo_applied
|
|
45
|
+
? [cartData.cart_promo_applied]
|
|
46
|
+
: !!cartData.cart_promos_applied
|
|
47
|
+
? cartData.cart_promos_applied
|
|
48
|
+
: [];
|
|
49
|
+
};
|
|
50
|
+
exports.getCartPromo = getCartPromo;
|
|
51
|
+
/**
|
|
52
|
+
* Check if current cart promos applied contain a promo_code type promotion
|
|
53
|
+
* @param cartData
|
|
54
|
+
*/
|
|
55
|
+
const shouldCheckPromoCode = (cartData) => {
|
|
56
|
+
return ((!!cartData.cart_promos_applied && !!cartData.cart_promos_applied.some((p) => p.promo_code)) ||
|
|
57
|
+
(!!cartData.cart_promo_applied && !!cartData.cart_promo_applied.promo_code));
|
|
58
|
+
};
|
|
59
|
+
exports.shouldCheckPromoCode = shouldCheckPromoCode;
|
|
60
|
+
/**
|
|
61
|
+
* Check if promo is expressed as a percentage
|
|
62
|
+
* @param promo The promo to check. Works for cart applied promo as well as discount rule
|
|
63
|
+
* @param options.includePaymentIncentiveInCheck Optionnal. If payement incentive promotions should also be included in check
|
|
64
|
+
* @returns {boolean}
|
|
65
|
+
*/
|
|
66
|
+
const isPromoAPercentage = (promo, options = {}) => {
|
|
67
|
+
const promoPercentOptions = [
|
|
68
|
+
IDiscountRule_1.ResultActionEnum.PERCENT,
|
|
69
|
+
IDiscountRule_1.ResultActionEnum.PERCENT_CATEGORY,
|
|
70
|
+
IDiscountRule_1.ResultActionEnum.PERCENT_SKU
|
|
71
|
+
];
|
|
72
|
+
if (options.includePaymentIncentiveInCheck)
|
|
73
|
+
promoPercentOptions.push(IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES);
|
|
74
|
+
let propertyToCheck = (0, object_1.recursiveCheckObject)(promo, 'result.action') || (0, object_1.recursiveCheckObject)(promo, 'amount_unit');
|
|
75
|
+
if (!!!propertyToCheck && options.defaultToPercent)
|
|
76
|
+
propertyToCheck = IDiscountRule_1.ResultActionEnum.PERCENT;
|
|
77
|
+
return !!propertyToCheck && promoPercentOptions.includes(propertyToCheck);
|
|
78
|
+
};
|
|
79
|
+
exports.isPromoAPercentage = isPromoAPercentage;
|
|
80
|
+
const getSubtotalWithoutProductPromos = (cartData, itemPromos) => {
|
|
81
|
+
const currentSubtotal = cartData.subtotalWithoutPromotions || cartData.subtotal;
|
|
82
|
+
let allProductSubtotalAmounts = (0, sumBy_1.default)(itemPromos, (i) => !!(0, data_1.getPromoTotalAmount)(cartData.items, i, 'number')
|
|
83
|
+
? (0, data_1.getPromoTotalAmount)(cartData.items, i, 'number')
|
|
84
|
+
: 0);
|
|
85
|
+
return currentSubtotal - allProductSubtotalAmounts;
|
|
86
|
+
};
|
|
87
|
+
exports.getSubtotalWithoutProductPromos = getSubtotalWithoutProductPromos;
|
|
88
|
+
const getCartPromosByAppliesTo = (cartData) => {
|
|
89
|
+
const appliedPromos = (0, exports.getCartPromo)(cartData) || [];
|
|
90
|
+
let subtotalPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.SUBTOTAL);
|
|
91
|
+
let itemPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.PRODUCT);
|
|
92
|
+
let afterTaxesPromos = appliedPromos.filter((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES);
|
|
93
|
+
return {
|
|
94
|
+
subtotal: subtotalPromos,
|
|
95
|
+
items: itemPromos,
|
|
96
|
+
afterTaxes: afterTaxesPromos
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
exports.getCartPromosByAppliesTo = getCartPromosByAppliesTo;
|
|
100
|
+
const getAppliedAmountsForSubtotalPromosOnCart = (cartData) => {
|
|
101
|
+
const activePromos = (0, exports.getCartPromosByAppliesTo)(cartData);
|
|
102
|
+
let currentSubtotal = (0, exports.getSubtotalWithoutProductPromos)(cartData, activePromos.items);
|
|
103
|
+
let promoAmounts = {};
|
|
104
|
+
for (let promo of activePromos.subtotal.filter((p) => !!p.discount_id)) {
|
|
105
|
+
if (!!!promo.amount_removed)
|
|
106
|
+
continue;
|
|
107
|
+
let amountRemoved = promo.amount_removed;
|
|
108
|
+
const serviceAndFeesTotal = (0, exports.getOnlyServicesAndFeesSubtotal)(cartData, activePromos.items);
|
|
109
|
+
if ((0, exports.isPromoAPercentage)(promo, { defaultToPercent: true })) {
|
|
110
|
+
// if the promo excludes services and fees, subtract the serviceAndFeesTotal from the subtotal
|
|
111
|
+
if (!!promo.exclude_services_and_fees) {
|
|
112
|
+
amountRemoved = (0, round_1.default)((promo.amount_removed / 100) * (currentSubtotal - serviceAndFeesTotal), 3);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
amountRemoved = (0, round_1.default)((promo.amount_removed / 100) * currentSubtotal, 3);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
promoAmounts[promo.discount_id] = amountRemoved;
|
|
119
|
+
currentSubtotal -= amountRemoved;
|
|
120
|
+
}
|
|
121
|
+
return promoAmounts;
|
|
122
|
+
};
|
|
123
|
+
exports.getAppliedAmountsForSubtotalPromosOnCart = getAppliedAmountsForSubtotalPromosOnCart;
|
|
124
|
+
// #endregion
|
|
125
|
+
// -----------------------------------------------------------------------------------
|
|
126
|
+
// #region CHECK DISCOUNT ELIGIBILITY
|
|
127
|
+
/**
|
|
128
|
+
* Check if a discount rule applies to a specific declination
|
|
129
|
+
* @param discount_rule - The discount rule to check
|
|
130
|
+
* @param declination - The declination to compare
|
|
131
|
+
* @param parentSlug - Optionnal. Used to check parent product slug with 'product' rule specifications. If not provided and 'product' rule found, returns true by default for rule check
|
|
132
|
+
*/
|
|
133
|
+
const shouldApplyRuleToDeclination = (discount_rule, declination, parentSlug) => {
|
|
134
|
+
// If discount has no rules, it means it applies to declination automatically
|
|
135
|
+
if (!!!discount_rule.rules || !!!discount_rule.rules.length)
|
|
136
|
+
return true;
|
|
137
|
+
const currentDiscountMap = discount_rule.rules.map((rule) => {
|
|
138
|
+
const todayDate = (0, moment_1.default)().format('YYYY-MM-DD');
|
|
139
|
+
switch (rule.field) {
|
|
140
|
+
case IDiscountRule_1.RuleFieldEnum.PRODUCT_PRICE:
|
|
141
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
142
|
+
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, declination.price.regular.amount)];
|
|
143
|
+
}));
|
|
144
|
+
case IDiscountRule_1.RuleFieldEnum.SKU:
|
|
145
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
146
|
+
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, declination.sku)];
|
|
147
|
+
}));
|
|
148
|
+
case IDiscountRule_1.RuleFieldEnum.DECLINATION:
|
|
149
|
+
// case 'slug':
|
|
150
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
151
|
+
return [rule.condition, declination.sku === ruleDetail.value[0]];
|
|
152
|
+
}));
|
|
153
|
+
case IDiscountRule_1.RuleFieldEnum.PRODUCT:
|
|
154
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
155
|
+
return [rule.condition, !!!parentSlug || (0, exports.getResultRuleDetail)(ruleDetail, parentSlug)];
|
|
156
|
+
}));
|
|
157
|
+
case IDiscountRule_1.RuleFieldEnum.DATE:
|
|
158
|
+
case IDiscountRule_1.RuleFieldEnum.WEEKDAY:
|
|
159
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
160
|
+
return [rule.condition, (0, exports.getResultRuleDetail)(ruleDetail, (0, moment_1.default)(todayDate).toDate())];
|
|
161
|
+
}));
|
|
162
|
+
case IDiscountRule_1.RuleFieldEnum.ATTRIBUTE:
|
|
163
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
164
|
+
return [rule.condition, (0, exports.checkAttributes)(ruleDetail, declination.attributes)];
|
|
165
|
+
}));
|
|
166
|
+
default:
|
|
167
|
+
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return _checkRuleApplicationArray(currentDiscountMap);
|
|
171
|
+
};
|
|
172
|
+
exports.shouldApplyRuleToDeclination = shouldApplyRuleToDeclination;
|
|
173
|
+
/**
|
|
174
|
+
* Check if a specific rule of a discount rule is respected
|
|
175
|
+
* @param ruleDetail - The rule details object to check
|
|
176
|
+
* @param cartValue - The value to compare with rule specifications
|
|
177
|
+
*/
|
|
178
|
+
const getResultRuleDetail = (ruleDetail, cartValue, log) => {
|
|
179
|
+
let ruleRespected = false;
|
|
180
|
+
let isDate = false;
|
|
181
|
+
try {
|
|
182
|
+
let amountValue;
|
|
183
|
+
let amountValue2;
|
|
184
|
+
switch (true) {
|
|
185
|
+
case typeof cartValue === 'number':
|
|
186
|
+
if (ruleDetail.operator === 'between') {
|
|
187
|
+
amountValue = Number(ruleDetail.value[0].toString().replace(',', '.')) || [];
|
|
188
|
+
amountValue2 = Number(ruleDetail.value[1].toString().replace(',', '.')) || [];
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
amountValue = ruleDetail.value.map((v) => Number(v.toString().replace(',', '.'))) || [];
|
|
192
|
+
amountValue2 = 0 || [];
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
case typeof cartValue === 'string' && !!!moment_1.default.isDate((0, data_1.formatDate)(cartValue)):
|
|
196
|
+
if (ruleDetail.operator === 'between') {
|
|
197
|
+
amountValue = ruleDetail.value[0] || [];
|
|
198
|
+
amountValue2 = ruleDetail.value[1] || [];
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
amountValue2 = [];
|
|
202
|
+
amountValue = ruleDetail.value || [];
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
if (!!log)
|
|
207
|
+
console.log('HERE!');
|
|
208
|
+
cartValue = (0, data_1.formatDate)(cartValue);
|
|
209
|
+
if (typeof ruleDetail.value[0] === 'number') {
|
|
210
|
+
if ((0, moment_1.default)(cartValue).isValid())
|
|
211
|
+
cartValue = (0, moment_1.default)(cartValue).day();
|
|
212
|
+
amountValue = ruleDetail.value || [];
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
isDate = true;
|
|
216
|
+
amountValue = (0, moment_1.default)(ruleDetail.value[0]);
|
|
217
|
+
if (!!ruleDetail.value[1] && moment_1.default.isDate(ruleDetail.value[1])) {
|
|
218
|
+
amountValue2 = (0, moment_1.default)(ruleDetail.value[1]);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
amountValue2 = (0, moment_1.default)();
|
|
222
|
+
}
|
|
223
|
+
switch (ruleDetail.operator) {
|
|
224
|
+
case '==':
|
|
225
|
+
ruleRespected = amountValue.isSame((0, moment_1.default)(cartValue), 'date');
|
|
226
|
+
break;
|
|
227
|
+
case '!=':
|
|
228
|
+
ruleRespected = !!!amountValue.isSame((0, moment_1.default)(cartValue), 'date');
|
|
229
|
+
break;
|
|
230
|
+
case '<=':
|
|
231
|
+
ruleRespected = (0, moment_1.default)(cartValue).isSameOrBefore(amountValue, 'date');
|
|
232
|
+
break;
|
|
233
|
+
case '>=':
|
|
234
|
+
ruleRespected = (0, moment_1.default)(cartValue).isSameOrAfter(amountValue, 'date');
|
|
235
|
+
break;
|
|
236
|
+
case '<':
|
|
237
|
+
ruleRespected = (0, moment_1.default)(cartValue).isBefore(amountValue, 'date');
|
|
238
|
+
break;
|
|
239
|
+
case '>':
|
|
240
|
+
ruleRespected = (0, moment_1.default)(cartValue).isAfter(amountValue, 'date');
|
|
241
|
+
break;
|
|
242
|
+
case 'between':
|
|
243
|
+
ruleRespected = (0, moment_1.default)(cartValue).isBetween(amountValue, amountValue2, 'date', '[]');
|
|
244
|
+
break;
|
|
245
|
+
case 'contains':
|
|
246
|
+
default:
|
|
247
|
+
ruleRespected = false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (!!!isDate) {
|
|
252
|
+
if (!Array.isArray(amountValue) && ruleDetail.operator !== 'between') {
|
|
253
|
+
amountValue = [amountValue];
|
|
254
|
+
}
|
|
255
|
+
switch (ruleDetail.operator) {
|
|
256
|
+
case '==':
|
|
257
|
+
ruleRespected = !!amountValue.some((v) => v === cartValue);
|
|
258
|
+
break;
|
|
259
|
+
case '!=':
|
|
260
|
+
ruleRespected = !!amountValue.every((v) => v !== cartValue);
|
|
261
|
+
break;
|
|
262
|
+
case '<=':
|
|
263
|
+
ruleRespected = !!amountValue.some((v) => cartValue <= v);
|
|
264
|
+
break;
|
|
265
|
+
case '>=':
|
|
266
|
+
ruleRespected = !!amountValue.some((v) => cartValue >= v);
|
|
267
|
+
break;
|
|
268
|
+
case '<':
|
|
269
|
+
ruleRespected = !!amountValue.some((v) => cartValue < v);
|
|
270
|
+
break;
|
|
271
|
+
case '>':
|
|
272
|
+
ruleRespected = !!amountValue.some((v) => cartValue > v);
|
|
273
|
+
break;
|
|
274
|
+
case 'between':
|
|
275
|
+
ruleRespected = cartValue > amountValue && cartValue < amountValue2;
|
|
276
|
+
break;
|
|
277
|
+
case 'contains':
|
|
278
|
+
ruleRespected = !!amountValue.some((v) => cartValue.toString().indexOf(v.toString()) !== -1);
|
|
279
|
+
break;
|
|
280
|
+
case 'contains-not':
|
|
281
|
+
ruleRespected = !!!amountValue.some((v) => cartValue.toString().indexOf(v.toString()) !== -1);
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
console.log(error.toString());
|
|
288
|
+
}
|
|
289
|
+
return ruleRespected;
|
|
290
|
+
};
|
|
291
|
+
exports.getResultRuleDetail = getResultRuleDetail;
|
|
292
|
+
/**
|
|
293
|
+
* Check if rule applied to product attributes is respected for specific declination attributes
|
|
294
|
+
* @param attributeAndValues - The rule details object to check
|
|
295
|
+
* @param arrDeclinationAttributes - The declinations attributes to compare
|
|
296
|
+
*/
|
|
297
|
+
const checkAttributes = (attributeAndValues, arrDeclinationAttributes) => {
|
|
298
|
+
const parentAttributeID = attributeAndValues.value[0].parentAttribute;
|
|
299
|
+
const attributeValues = attributeAndValues.value[0].attributeOptions;
|
|
300
|
+
const operator = attributeAndValues.operator;
|
|
301
|
+
let matchingAttributes = false;
|
|
302
|
+
// const attrArray = arrDeclinationAttributes.map(decliAttr=>Array.isArray(decliAttr)?decliAttr.values[0].)
|
|
303
|
+
for (let declinationAttribute of arrDeclinationAttributes) {
|
|
304
|
+
if (!!matchingAttributes)
|
|
305
|
+
return true;
|
|
306
|
+
if (declinationAttribute.attribute_id !== parentAttributeID)
|
|
307
|
+
continue;
|
|
308
|
+
if (!!declinationAttribute.values) {
|
|
309
|
+
matchingAttributes =
|
|
310
|
+
operator === '=='
|
|
311
|
+
? attributeValues.some((attr) => declinationAttribute.values.some((value) => value.slug === attr))
|
|
312
|
+
: !!!attributeValues.some((attr) => declinationAttribute.values.some((value) => value.slug === attr));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return matchingAttributes;
|
|
316
|
+
};
|
|
317
|
+
exports.checkAttributes = checkAttributes;
|
|
318
|
+
const getCartPromoType = (discount) => {
|
|
319
|
+
return !!discount.result.action
|
|
320
|
+
? discount.result.action === IDiscountRule_1.ResultActionEnum.GET
|
|
321
|
+
? Cart_1.CartPromoAppliesToEnum.ITEMS
|
|
322
|
+
: [IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING].includes(discount.result.action)
|
|
323
|
+
? Cart_1.CartPromoAppliesToEnum.SHIPPING
|
|
324
|
+
: [
|
|
325
|
+
IDiscountRule_1.ResultActionEnum.AMOUNT_SKU,
|
|
326
|
+
IDiscountRule_1.ResultActionEnum.PERCENT_SKU,
|
|
327
|
+
IDiscountRule_1.ResultActionEnum.AMOUNT_CATEGORY,
|
|
328
|
+
IDiscountRule_1.ResultActionEnum.PERCENT_CATEGORY
|
|
329
|
+
].includes(discount.result.action)
|
|
330
|
+
? Cart_1.CartPromoAppliesToEnum.PRODUCT
|
|
331
|
+
: [IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES, IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES].includes(discount.result.action)
|
|
332
|
+
? Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES
|
|
333
|
+
: Cart_1.CartPromoAppliesToEnum.SUBTOTAL
|
|
334
|
+
: Cart_1.CartPromoAppliesToEnum.SUBTOTAL;
|
|
335
|
+
};
|
|
336
|
+
exports.getCartPromoType = getCartPromoType;
|
|
337
|
+
/**
|
|
338
|
+
* Check if promo code can be applied to a specific cart
|
|
339
|
+
* @param cart - The cart to check
|
|
340
|
+
* @param promoCode - The discount rule with promo code to check
|
|
341
|
+
*/
|
|
342
|
+
const checkPromoCodeEligibility = (cart, promoCode) => {
|
|
343
|
+
var _a;
|
|
344
|
+
let currentDiscountMap = [];
|
|
345
|
+
const promoType = (0, exports.getCartPromoType)(promoCode);
|
|
346
|
+
const currentPromos = (_a = (0, exports.getCartPromo)(cart)) !== null && _a !== void 0 ? _a : [];
|
|
347
|
+
// Only one promo for total_after_taxes can be applied to cart
|
|
348
|
+
if (promoType == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES &&
|
|
349
|
+
currentPromos.some((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES)) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
if (promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING && (!!cart.is_pickup || !!!cart.shipping_selected)) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
if (promoType === Cart_1.CartPromoAppliesToEnum.PRODUCT &&
|
|
356
|
+
(!!promoCode.result.action_sku || !!promoCode.result.action_categories)) {
|
|
357
|
+
const itemsWherePromoApplicable = (0, exports.getResultAppliedDiscountSkus)(cart.items, promoCode);
|
|
358
|
+
if (!!!itemsWherePromoApplicable.length)
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
const rules = promoCode.rules;
|
|
362
|
+
if (!!promoCode.noExtraRules || !!!rules || !!!rules.length)
|
|
363
|
+
return true;
|
|
364
|
+
currentDiscountMap = rules.map((rule) => _checkIfRuleAppliesToCart(rule, promoCode.appliesTo, cart));
|
|
365
|
+
return _checkRuleApplicationArray(currentDiscountMap);
|
|
366
|
+
};
|
|
367
|
+
exports.checkPromoCodeEligibility = checkPromoCodeEligibility;
|
|
368
|
+
// #endregion
|
|
369
|
+
// -----------------------------------------------------------------------------------
|
|
370
|
+
// #region TIER PRICING
|
|
371
|
+
/**
|
|
372
|
+
* Returns tier pricing step that should be applied for provided quantity, or undefined if none should apply
|
|
373
|
+
* @param tierPricingToCheck - the indexed tier-pricing array to check
|
|
374
|
+
* @param qte
|
|
375
|
+
*/
|
|
376
|
+
const getTierPricingToApply = (tierPricingToCheck, qte) => {
|
|
377
|
+
if (!!!tierPricingToCheck)
|
|
378
|
+
return;
|
|
379
|
+
return tierPricingToCheck.find((tp) => (0, toNumber_1.default)(tp.from) <= qte && (!!!tp.to || (0, toNumber_1.default)(tp.to) >= qte));
|
|
380
|
+
};
|
|
381
|
+
exports.getTierPricingToApply = getTierPricingToApply;
|
|
382
|
+
/**
|
|
383
|
+
* Converts tier-pricing found in discount_rule to IIndexedTierPricing.
|
|
384
|
+
* @param discountRule - the tier-pricing tier discountRule to check
|
|
385
|
+
* @param price - declinations regular price from which tier-pricing result is calculated
|
|
386
|
+
* @param space
|
|
387
|
+
* @param decimals - the amount of decimals to show on tier-pricing result
|
|
388
|
+
*/
|
|
389
|
+
const applyTierPricing = (discountRule, price, space, decimals) => {
|
|
390
|
+
if (!!!discountRule.rules || !!!discountRule.rules.length)
|
|
391
|
+
return [];
|
|
392
|
+
if (!!discountRule.draft)
|
|
393
|
+
return [];
|
|
394
|
+
const rule = discountRule.rules.find((_rule) => _rule.field === IDiscountRule_1.RuleFieldEnum.QUANTITY && _rule.ruleDetails.find((detail) => detail.operator === 'between'));
|
|
395
|
+
if (!!!rule)
|
|
396
|
+
return [];
|
|
397
|
+
const details = rule.ruleDetails.find((detail) => detail.operator === 'between');
|
|
398
|
+
if (!!!details)
|
|
399
|
+
return [];
|
|
400
|
+
return [
|
|
401
|
+
{
|
|
402
|
+
from: !!!details.value[1] || !!!(0, toNumber_1.default)(details.value[1])
|
|
403
|
+
? details.value[0]
|
|
404
|
+
: (0, toNumber_1.default)(details.value[0]) < (0, toNumber_1.default)(details.value[1])
|
|
405
|
+
? details.value[0]
|
|
406
|
+
: details.value[1],
|
|
407
|
+
to: !!!details.value[1] || !!!(0, toNumber_1.default)(details.value[1])
|
|
408
|
+
? 0
|
|
409
|
+
: (0, toNumber_1.default)(details.value[0]) > (0, toNumber_1.default)(details.value[1])
|
|
410
|
+
? details.value[0]
|
|
411
|
+
: details.value[1],
|
|
412
|
+
price: (0, currency_1.calculateAmountByCurrencyAllDetails)(space, space.preferences.default.currency(), (0, round_1.default)((0, exports.applyDiscountToPrice)(Number(price), discountRule.result), !!decimals ? decimals : 2)),
|
|
413
|
+
check_attribute_value: !!discountRule.appliesTo.check_attribute_value
|
|
414
|
+
? discountRule.appliesTo.check_attribute_value
|
|
415
|
+
: '',
|
|
416
|
+
check_other_items_category: !!discountRule.appliesTo.check_other_items_category
|
|
417
|
+
? discountRule.appliesTo.check_other_items_category
|
|
418
|
+
: '',
|
|
419
|
+
name: discountRule.name
|
|
420
|
+
}
|
|
421
|
+
];
|
|
422
|
+
};
|
|
423
|
+
exports.applyTierPricing = applyTierPricing;
|
|
424
|
+
/**
|
|
425
|
+
* Calculate new discount_price object for cart item base on qte and tier_pricing
|
|
426
|
+
* @param item - the item to check
|
|
427
|
+
* @param setOriginalPrice - if original_amount should be set instead of discount_price.amount
|
|
428
|
+
* @param originalDecli - Optionnal. The IIndexedDeclination used to construct the cart item originally.
|
|
429
|
+
*/
|
|
430
|
+
const getNewDiscountPriceFromTierPricing = (item, setOriginalPrice, originalDecli) => {
|
|
431
|
+
const tierPricingToApply = (0, exports.getTierPricingToApply)(item.tier_pricing, item.qte);
|
|
432
|
+
const currentDiscountPrice = item.discount_price;
|
|
433
|
+
const currentIsTierPricing = !!currentDiscountPrice && currentDiscountPrice.price_type === 'tierpricing';
|
|
434
|
+
const originalDiscountAmount = !!currentDiscountPrice ? currentDiscountPrice.original_amount : null;
|
|
435
|
+
let prevDiscountPrice = null;
|
|
436
|
+
if (!!currentIsTierPricing && typeof originalDiscountAmount === 'number') {
|
|
437
|
+
const { price_type, original_amount } = currentDiscountPrice, rest = __rest(currentDiscountPrice, ["price_type", "original_amount"]);
|
|
438
|
+
prevDiscountPrice = Object.assign(Object.assign({}, rest), { amount: original_amount });
|
|
439
|
+
}
|
|
440
|
+
// if current quantity does not fit in any defined tier_pricing tiers
|
|
441
|
+
if (!!!tierPricingToApply) {
|
|
442
|
+
// if current item has overidden price as discount_price, set original_amount props instead of amount
|
|
443
|
+
if (!!setOriginalPrice && !!currentDiscountPrice) {
|
|
444
|
+
let amountToSet = item.regular_price.amount;
|
|
445
|
+
// if originalDecli was provided, fetch true original price from decli, else use items's regular price
|
|
446
|
+
if (!!originalDecli) {
|
|
447
|
+
const calculatedPrice = (0, products_1.getLowestPrice)(Object.assign(Object.assign({}, originalDecli), { qte: item.qte }));
|
|
448
|
+
amountToSet = calculatedPrice.price.amount;
|
|
449
|
+
}
|
|
450
|
+
return Object.assign(Object.assign({}, currentDiscountPrice), { original_amount: !!originalDecli ? amountToSet : item.regular_price.amount });
|
|
451
|
+
}
|
|
452
|
+
// if current discount_price has 'tierpricing' price_type, return prevDiscountPrice
|
|
453
|
+
// else, return current item discount_price
|
|
454
|
+
return !!currentIsTierPricing ? prevDiscountPrice : (currentDiscountPrice !== null && currentDiscountPrice !== void 0 ? currentDiscountPrice : null);
|
|
455
|
+
}
|
|
456
|
+
// if current item has overidden price as discount_price,
|
|
457
|
+
if (!!setOriginalPrice && !!currentDiscountPrice) {
|
|
458
|
+
return Object.assign(Object.assign({}, currentDiscountPrice), { original_amount: tierPricingToApply.price.amount });
|
|
459
|
+
}
|
|
460
|
+
return Object.assign(Object.assign(Object.assign({}, tierPricingToApply.price), { price_type: 'tierpricing' }), (!!currentDiscountPrice
|
|
461
|
+
? {
|
|
462
|
+
original_amount: typeof originalDiscountAmount === 'number' ? originalDiscountAmount : currentDiscountPrice.amount
|
|
463
|
+
}
|
|
464
|
+
: {}));
|
|
465
|
+
};
|
|
466
|
+
exports.getNewDiscountPriceFromTierPricing = getNewDiscountPriceFromTierPricing;
|
|
467
|
+
// #endregion
|
|
468
|
+
// -----------------------------------------------------------------------------------
|
|
469
|
+
// #region APPLY DISCOUNTS/PROMOS
|
|
470
|
+
/**
|
|
471
|
+
* Get discounted price after applying discount rules to a provided price
|
|
472
|
+
* @param discount_rules - The discount rules to apply
|
|
473
|
+
* @param amount - The initial amount on which to apply discounts
|
|
474
|
+
* @param space
|
|
475
|
+
*/
|
|
476
|
+
const applyDiscountRulesOnProduct = (discount_rules, amount, space) => {
|
|
477
|
+
if (!!!discount_rules || !!!discount_rules.length)
|
|
478
|
+
return undefined;
|
|
479
|
+
let discountIndex = 0;
|
|
480
|
+
let allPromo = discount_rules.filter((discount_rule) => discount_rule.discountRule_type !== 'tier-pricing');
|
|
481
|
+
let current_promo_price = Number(amount);
|
|
482
|
+
for (const discount of allPromo) {
|
|
483
|
+
if (discountIndex > 0 && !discount.is_stackable)
|
|
484
|
+
break;
|
|
485
|
+
let amountToRemove = (0, exports.isPromoAPercentage)(discount)
|
|
486
|
+
? (Number(discount.result.action_value) / 100) * current_promo_price
|
|
487
|
+
: Number(discount.result.action_value);
|
|
488
|
+
current_promo_price -= amountToRemove;
|
|
489
|
+
discountIndex++;
|
|
490
|
+
}
|
|
491
|
+
const spaceProductPrefs = space.preferences.products.get();
|
|
492
|
+
const allowNegativePrices = !!spaceProductPrefs && !!spaceProductPrefs.allow_negative_prices;
|
|
493
|
+
return current_promo_price === Number(amount)
|
|
494
|
+
? undefined
|
|
495
|
+
: current_promo_price < 0 && !!!allowNegativePrices
|
|
496
|
+
? 0
|
|
497
|
+
: current_promo_price;
|
|
498
|
+
};
|
|
499
|
+
exports.applyDiscountRulesOnProduct = applyDiscountRulesOnProduct;
|
|
500
|
+
/**
|
|
501
|
+
* Get result of discount rule discount on a provided amount
|
|
502
|
+
* @param initial - The price on which to apply the discount
|
|
503
|
+
* @param discountResultObj - The discount rule result object
|
|
504
|
+
*/
|
|
505
|
+
const applyDiscountToPrice = (initial, discountResultObj) => {
|
|
506
|
+
return discountResultObj.action === 'amount'
|
|
507
|
+
? initial - Number(discountResultObj.action_value)
|
|
508
|
+
: initial * (1 - Number(discountResultObj.action_value) / 100);
|
|
509
|
+
};
|
|
510
|
+
exports.applyDiscountToPrice = applyDiscountToPrice;
|
|
511
|
+
/**
|
|
512
|
+
* Get sku(s) affected by a promo as an array of strings
|
|
513
|
+
* @param valueToConvert - The sku or sku array associated with the promo
|
|
514
|
+
* @returns And array of strings
|
|
515
|
+
*/
|
|
516
|
+
const getSkuArrayForPromo = (valueToConvert) => {
|
|
517
|
+
if (!!Array.isArray(valueToConvert))
|
|
518
|
+
return valueToConvert;
|
|
519
|
+
return [valueToConvert];
|
|
520
|
+
};
|
|
521
|
+
exports.getSkuArrayForPromo = getSkuArrayForPromo;
|
|
522
|
+
/**
|
|
523
|
+
* Returns a list of all skus where promo applied to specific products should apply. Check for both amount/percent_sku and amount/percent_category options.
|
|
524
|
+
* @param cartItems - The current cart items
|
|
525
|
+
* @param promoToCheck - The promo to check
|
|
526
|
+
* @returns An array of strings
|
|
527
|
+
*/
|
|
528
|
+
const getResultAppliedDiscountSkus = (cartItems, promoToCheck) => {
|
|
529
|
+
var _a, _b, _c;
|
|
530
|
+
const action = (_a = promoToCheck.result.action) !== null && _a !== void 0 ? _a : '';
|
|
531
|
+
const skuArray = (0, exports.getSkuArrayForPromo)((_b = promoToCheck.result.action_sku) !== null && _b !== void 0 ? _b : []);
|
|
532
|
+
const categoryArray = (_c = promoToCheck.result.action_categories) !== null && _c !== void 0 ? _c : [];
|
|
533
|
+
const productsToApplyPromo = cartItems
|
|
534
|
+
.filter((item) => {
|
|
535
|
+
if (!!['amount_category', 'percent_category'].includes(action)) {
|
|
536
|
+
const categorySlugsToCheck = (0, exports.getItemCategorySlugArray)(item.categories);
|
|
537
|
+
// Check if one of the slugs in item is EXACTLY the same as a category slug found in discount
|
|
538
|
+
// -- Done to remove cases where slug in discount is found partially in one of the levels
|
|
539
|
+
return categoryArray.some((cat) => categorySlugsToCheck.includes(cat));
|
|
540
|
+
}
|
|
541
|
+
return skuArray.includes(item.sku);
|
|
542
|
+
})
|
|
543
|
+
.map((item) => item.sku);
|
|
544
|
+
return productsToApplyPromo;
|
|
545
|
+
};
|
|
546
|
+
exports.getResultAppliedDiscountSkus = getResultAppliedDiscountSkus;
|
|
547
|
+
/**
|
|
548
|
+
* Creates array of all category level slugs for a cart item.
|
|
549
|
+
* @param itemCategories - Value found in props cart.categories
|
|
550
|
+
* @returns An array of strings
|
|
551
|
+
*/
|
|
552
|
+
const getItemCategorySlugArray = (itemCategories) => {
|
|
553
|
+
if (!!!itemCategories)
|
|
554
|
+
return [];
|
|
555
|
+
// 1. Reorder item categories by key (can be in diff order in database)
|
|
556
|
+
const orderedByLevel = (0, orderBy_1.default)(Object.entries(itemCategories), ([key, _value]) => key);
|
|
557
|
+
// 2. Then, isolate last category level's value, since it should contain all category levels seperated by string ' > '
|
|
558
|
+
const lastLevelCategory = !!orderedByLevel.length ? orderedByLevel[orderedByLevel.length - 1][1] : '';
|
|
559
|
+
// 3. Split on ' > ' to create array of possible category slug values.
|
|
560
|
+
// Check if one of the slugs is EXACTLY the same as the category slug found in le discount
|
|
561
|
+
return lastLevelCategory.split(' > ');
|
|
562
|
+
};
|
|
563
|
+
exports.getItemCategorySlugArray = getItemCategorySlugArray;
|
|
564
|
+
/**
|
|
565
|
+
* Check if provided discount can be added to currently applied discounts for cart.
|
|
566
|
+
* @param promoToCheck
|
|
567
|
+
* @param currentPromos
|
|
568
|
+
* @param isMultiPromo
|
|
569
|
+
*/
|
|
570
|
+
const checkIfCanAddPromo = (promoToCheck, currentPromos, isMultiPromo) => {
|
|
571
|
+
if (!!!currentPromos || !!!currentPromos.length)
|
|
572
|
+
return { canAdd: true };
|
|
573
|
+
const currentPromosHasPromo = !!currentPromos.some((e) => e.discount_id === promoToCheck.id);
|
|
574
|
+
if (!!currentPromosHasPromo)
|
|
575
|
+
return { canAdd: false, reason: Cart_1.CartErrorEnum.CART_DISCOUNT_CANT_APPLY };
|
|
576
|
+
if (!!isMultiPromo) {
|
|
577
|
+
const isStackable = !!promoToCheck.is_stackable && !!currentPromos.every((x) => !!x.stackable);
|
|
578
|
+
return { canAdd: isStackable, reason: !isStackable ? Cart_1.CartErrorEnum.CART_DISCOUNT_NOT_STACKABLE : undefined };
|
|
579
|
+
}
|
|
580
|
+
return { canAdd: true };
|
|
581
|
+
};
|
|
582
|
+
exports.checkIfCanAddPromo = checkIfCanAddPromo;
|
|
583
|
+
/**
|
|
584
|
+
* Apply all valid discounts found in a specific cart's discount_rules props to cart
|
|
585
|
+
* @param cart - The cart to check
|
|
586
|
+
* @param isMultiPromo
|
|
587
|
+
* @param forceShipping - If cart should be considered as a shipping cart, even if is_pickup is true
|
|
588
|
+
*/
|
|
589
|
+
const applyDiscountToCart = (cart, isMultiPromo, forceShipping = false, forcedPromos) => {
|
|
590
|
+
var _a;
|
|
591
|
+
const discountRules = !!forcedPromos
|
|
592
|
+
? ((_a = cart.discount_rules) !== null && _a !== void 0 ? _a : []).filter((d) => (!!d.created && (0, moment_1.default)((0, data_1.formatDate)(d.created)).isBefore((0, moment_1.default)((0, data_1.formatDate)(cart.paid_at)))) ||
|
|
593
|
+
(!!d.promo_code && !!d.promo_code.code) ||
|
|
594
|
+
!!!d.created)
|
|
595
|
+
: cart.discount_rules;
|
|
596
|
+
if (!!!discountRules || !!!discountRules.length) {
|
|
597
|
+
return Object.assign(Object.assign(Object.assign({}, cart), (!!cart.cart_promo_applied ? { cart_promo_applied: null } : {})), (!!cart.cart_promos_applied ? { cart_promos_applied: null } : {}));
|
|
598
|
+
}
|
|
599
|
+
// Remove all promos not found in cart discount_rules array
|
|
600
|
+
let newCart = Object.assign(Object.assign(Object.assign({}, cart), (!!cart.cart_promo_applied &&
|
|
601
|
+
!!!discountRules.some((dr) => dr.id === cart.cart_promo_applied.discount_id)
|
|
602
|
+
? { cart_promo_applied: null }
|
|
603
|
+
: {})), (!!cart.cart_promos_applied
|
|
604
|
+
? {
|
|
605
|
+
cart_promos_applied: cart.cart_promos_applied.filter((promo) => discountRules.some((dr) => dr.id === promo.discount_id))
|
|
606
|
+
}
|
|
607
|
+
: {}));
|
|
608
|
+
// Chaque fois que les totaux sont recalculés :
|
|
609
|
+
// -- on vérifie les codes promos déjà dans le panier qui s'appliquent sur des skus OU catégories spécifiques
|
|
610
|
+
// -- s'ils n'ont plus d'affaire à s'appliquer, on les retire du cartPromosApplied
|
|
611
|
+
// -- si de nouveaux produits eligibles sont ajoutés, on modifie le array de item_given avec les nouvelles valeurs à jour.
|
|
612
|
+
const currentPromos = (0, exports.getCartPromo)(newCart);
|
|
613
|
+
if (!!currentPromos) {
|
|
614
|
+
let shouldRemovePromo = [];
|
|
615
|
+
let shouldUpdatePromo = [];
|
|
616
|
+
// const currentPromoCodesApplied = currentPromos.filter((p) => !!p.promo_code)
|
|
617
|
+
for (const appliedPromo of currentPromos) {
|
|
618
|
+
if (appliedPromo.applies_to === Cart_1.CartPromoAppliesToEnum.PRODUCT && !!appliedPromo.item_given) {
|
|
619
|
+
const sameInCartDiscounts = discountRules.find((d) => d.id == appliedPromo.discount_id);
|
|
620
|
+
if (!!sameInCartDiscounts) {
|
|
621
|
+
const itemsWherePromoApplicable = (0, exports.getResultAppliedDiscountSkus)(cart.items, sameInCartDiscounts);
|
|
622
|
+
if (!!!itemsWherePromoApplicable.length && !!appliedPromo.discount_id) {
|
|
623
|
+
shouldRemovePromo.push(appliedPromo.discount_id);
|
|
624
|
+
}
|
|
625
|
+
else if (itemsWherePromoApplicable.length !== appliedPromo.item_given.length) {
|
|
626
|
+
shouldUpdatePromo.push(Object.assign(Object.assign({}, appliedPromo), { item_given: itemsWherePromoApplicable }));
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
// Update cart_promos_applied to remove unapplicable promos and update promos to current cart items
|
|
632
|
+
newCart = Object.assign(Object.assign({}, newCart), (!!newCart.cart_promos_applied
|
|
633
|
+
? {
|
|
634
|
+
cart_promos_applied: newCart.cart_promos_applied
|
|
635
|
+
.filter((promo) => !shouldRemovePromo.includes(promo.discount_id))
|
|
636
|
+
.map((promo) => {
|
|
637
|
+
if (!!!shouldUpdatePromo.length)
|
|
638
|
+
return promo;
|
|
639
|
+
const sameInUpdated = shouldUpdatePromo.find((p) => p.discount_id == promo.discount_id);
|
|
640
|
+
return sameInUpdated !== null && sameInUpdated !== void 0 ? sameInUpdated : promo;
|
|
641
|
+
})
|
|
642
|
+
}
|
|
643
|
+
: {}));
|
|
644
|
+
}
|
|
645
|
+
for (const discount of discountRules) {
|
|
646
|
+
if (!!discount.promo_code && !!discount.promo_code.code) {
|
|
647
|
+
// CHECK FOR PROMO_CODE ELIGIBILITY
|
|
648
|
+
const promoCodeInCart = (currentPromos || []).find((p) => p.discount_id == discount.id);
|
|
649
|
+
if (!!promoCodeInCart) {
|
|
650
|
+
const shouldStillApplyCode = (0, exports.checkPromoCodeEligibility)(newCart, discount);
|
|
651
|
+
if (!!!shouldStillApplyCode) {
|
|
652
|
+
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
653
|
+
? { cart_promo_applied: null }
|
|
654
|
+
: {})), (!!newCart.cart_promos_applied
|
|
655
|
+
? {
|
|
656
|
+
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
657
|
+
}
|
|
658
|
+
: {}));
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
continue;
|
|
662
|
+
}
|
|
663
|
+
const promoType = (0, exports.getCartPromoType)(discount);
|
|
664
|
+
let currentDiscountMap = [];
|
|
665
|
+
if (promoType == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES &&
|
|
666
|
+
((0, exports.getCartPromo)(newCart) || []).some((p) => p.applies_to == Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES && p.discount_id != discount.id)) {
|
|
667
|
+
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, false]];
|
|
668
|
+
}
|
|
669
|
+
else if (promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING &&
|
|
670
|
+
(!!cart.is_pickup || !!!cart.shipping_selected) &&
|
|
671
|
+
!!!forceShipping) {
|
|
672
|
+
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, false]];
|
|
673
|
+
}
|
|
674
|
+
else if (!!!discount.rules || !!!discount.rules.length) {
|
|
675
|
+
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, true]];
|
|
676
|
+
}
|
|
677
|
+
else if (!!discount.draft) {
|
|
678
|
+
currentDiscountMap = [[IDiscountRule_1.RuleConditionEnum.AND, true]];
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
currentDiscountMap = discount.rules.map((rule) => _checkIfRuleAppliesToCart(rule, discount.appliesTo, cart));
|
|
682
|
+
}
|
|
683
|
+
if (_checkRuleApplicationArray(currentDiscountMap)) {
|
|
684
|
+
if (discount.draft) {
|
|
685
|
+
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
686
|
+
? { cart_promo_applied: null }
|
|
687
|
+
: {})), (!!newCart.cart_promos_applied
|
|
688
|
+
? {
|
|
689
|
+
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
690
|
+
}
|
|
691
|
+
: {}));
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
if (promoType === Cart_1.CartPromoAppliesToEnum.PRODUCT &&
|
|
695
|
+
(!!discount.result.action_sku || !!discount.result.action_categories)) {
|
|
696
|
+
const productsToApplyPromo = (0, exports.getResultAppliedDiscountSkus)(cart.items, discount);
|
|
697
|
+
if (!!productsToApplyPromo.length) {
|
|
698
|
+
const newPromo = Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: Number(discount.result.action_value), amount_unit: discount.result.action, item_given: productsToApplyPromo, item_given_amount: 0, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: 0, stackable: discount.is_stackable, discount_id: discount.id, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
699
|
+
? {
|
|
700
|
+
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
701
|
+
}
|
|
702
|
+
: {}));
|
|
703
|
+
if ((0, exports.checkIfCanAddPromo)(discount, (0, exports.getCartPromo)(newCart), isMultiPromo).canAdd) {
|
|
704
|
+
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...(newCart.cart_promos_applied || []), newPromo] });
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
else {
|
|
708
|
+
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!newCart.cart_promo_applied && newCart.cart_promo_applied.discount_id === discount.id
|
|
709
|
+
? { cart_promo_applied: null }
|
|
710
|
+
: {})), (!!newCart.cart_promos_applied
|
|
711
|
+
? {
|
|
712
|
+
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
713
|
+
}
|
|
714
|
+
: {}));
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
const newPromo = Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: promoType !== Cart_1.CartPromoAppliesToEnum.SHIPPING ? Number(discount.result.action_value) : 0, amount_unit: discount.result.action, item_given: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS ? discount.result.action_value.toString() : '', item_given_amount: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS && !!discount.result.action_qte
|
|
719
|
+
? Number(discount.result.action_qte)
|
|
720
|
+
: 0, stackable: discount.is_stackable, discount_id: discount.id, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING &&
|
|
721
|
+
discount.result.action === IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING
|
|
722
|
+
? Number(discount.result.action_value)
|
|
723
|
+
: 0, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
724
|
+
? {
|
|
725
|
+
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
726
|
+
}
|
|
727
|
+
: {}));
|
|
728
|
+
if ((0, exports.checkIfCanAddPromo)(discount, (0, exports.getCartPromo)(newCart), isMultiPromo).canAdd) {
|
|
729
|
+
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...(newCart.cart_promos_applied || []), newPromo] });
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
newCart = Object.assign(Object.assign(Object.assign({}, newCart), (!!cart.cart_promo_applied && cart.cart_promo_applied.discount_id === discount.id
|
|
736
|
+
? { cart_promo_applied: null }
|
|
737
|
+
: {})), (!!newCart.cart_promos_applied
|
|
738
|
+
? {
|
|
739
|
+
cart_promos_applied: newCart.cart_promos_applied.filter((p) => p.discount_id !== discount.id)
|
|
740
|
+
}
|
|
741
|
+
: {}));
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
if (!!newCart.cart_promos_applied && !!isMultiPromo) {
|
|
745
|
+
const shippingPromo = newCart.cart_promos_applied.filter((x) => x.applies_to === Cart_1.CartPromoAppliesToEnum.SHIPPING);
|
|
746
|
+
if (!!shippingPromo && !!shippingPromo.length) {
|
|
747
|
+
let flatPrice = 1000000;
|
|
748
|
+
let promo = 0;
|
|
749
|
+
for (let i = 0; i < shippingPromo.length; i++) {
|
|
750
|
+
if (shippingPromo[i].amount_unit === 'free_shipping') {
|
|
751
|
+
// si free on stop la
|
|
752
|
+
promo = i;
|
|
753
|
+
break;
|
|
754
|
+
}
|
|
755
|
+
if (!!shippingPromo[i].flatrate_shipping && shippingPromo[i].flatrate_shipping < flatPrice) {
|
|
756
|
+
promo = i;
|
|
757
|
+
flatPrice = shippingPromo[i].flatrate_shipping;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
const promoSansShipping = newCart.cart_promos_applied.filter((x) => x.applies_to !== Cart_1.CartPromoAppliesToEnum.SHIPPING);
|
|
761
|
+
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [...promoSansShipping, shippingPromo[promo]] });
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
if (!!forcedPromos && !!forcedPromos.length) {
|
|
765
|
+
const appliedPromos = !!newCart.cart_promos_applied && !!newCart.cart_promos_applied.length
|
|
766
|
+
? newCart.cart_promos_applied.map((p) => p.discount_id)
|
|
767
|
+
: [];
|
|
768
|
+
const newForcedPromos = forcedPromos.filter((f) => !!!appliedPromos.includes(f.discount_id));
|
|
769
|
+
newCart = Object.assign(Object.assign({}, newCart), { cart_promos_applied: [
|
|
770
|
+
...(!!newCart.cart_promos_applied && !!newCart.cart_promos_applied.length ? newCart.cart_promos_applied : []),
|
|
771
|
+
...newForcedPromos
|
|
772
|
+
] });
|
|
773
|
+
}
|
|
774
|
+
return Object.assign(Object.assign({}, newCart), { free_shipping: !!newCart.cart_promos_applied
|
|
775
|
+
? newCart.cart_promos_applied.some((p) => !!p.free_shipping)
|
|
776
|
+
: !!newCart.cart_promo_applied && newCart.cart_promo_applied.free_shipping });
|
|
777
|
+
};
|
|
778
|
+
exports.applyDiscountToCart = applyDiscountToCart;
|
|
779
|
+
/**
|
|
780
|
+
* Get the ICartPromoApplied object for a specified discount_rule. Only works for promos that do not apply to products of certain categories/skus.
|
|
781
|
+
* @param cart
|
|
782
|
+
* @param discount
|
|
783
|
+
*/
|
|
784
|
+
const getStandardCartPromoFromDiscount = (cart, discount) => {
|
|
785
|
+
const promoType = (0, exports.getCartPromoType)(discount);
|
|
786
|
+
return Object.assign({ promo_name: (0, locale_1.getLocaleOfDictionnary)(discount.name, cart.locale), applies_to: promoType, amount_removed: promoType !== Cart_1.CartPromoAppliesToEnum.SHIPPING ? Number(discount.result.action_value) : 0, amount_unit: discount.result.action, item_given: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS ? discount.result.action_value.toString() : '', item_given_amount: promoType === Cart_1.CartPromoAppliesToEnum.ITEMS && !!discount.result.action_qte
|
|
787
|
+
? Number(discount.result.action_qte)
|
|
788
|
+
: 0, stackable: discount.is_stackable, discount_id: discount.id, free_shipping: discount.result.action === IDiscountRule_1.ResultActionEnum.FREE_SHIPPING, flatrate_shipping: promoType === Cart_1.CartPromoAppliesToEnum.SHIPPING && discount.result.action === IDiscountRule_1.ResultActionEnum.FLATERATE_SHIPPING
|
|
789
|
+
? Number(discount.result.action_value)
|
|
790
|
+
: 0, promo_code: !!discount.promo_code ? discount.promo_code.code : undefined }, (typeof discount.result.exclude_services_and_fees === 'boolean'
|
|
791
|
+
? {
|
|
792
|
+
exclude_services_and_fees: discount.result.exclude_services_and_fees
|
|
793
|
+
}
|
|
794
|
+
: {}));
|
|
795
|
+
};
|
|
796
|
+
exports.getStandardCartPromoFromDiscount = getStandardCartPromoFromDiscount;
|
|
797
|
+
/**
|
|
798
|
+
* Calculates the cumulative subtotal for all service/fee type items in cart, including any applied promos. Usefull when calculating a promo's amount when all fees and services should be excluded.
|
|
799
|
+
* @param cartData - The cartData to check
|
|
800
|
+
* @param allCurrentAppliedToItemPromos - All currently active cartPromos that apply to items in cart. Sent seperatly in case local state is different from current cartData.
|
|
801
|
+
* @returns A number
|
|
802
|
+
*/
|
|
803
|
+
const getOnlyServicesAndFeesSubtotal = (cartData, allCurrentAppliedToItemPromos) => {
|
|
804
|
+
// Calculate the subtotal for just the fees and services, including their promos
|
|
805
|
+
// ** NEW - Now does not count escompte supp products as services when in promo on subtotal check
|
|
806
|
+
let servicesAndFeesTotal = 0;
|
|
807
|
+
cartData.items.forEach((i) => {
|
|
808
|
+
if (!!!i.is_service || !!(0, g2_1.isEscompteSuppItem)(i.sku))
|
|
809
|
+
return;
|
|
810
|
+
const associatedPromos = allCurrentAppliedToItemPromos.filter((p) => { var _a; return (0, exports.getSkuArrayForPromo)((_a = p.item_given) !== null && _a !== void 0 ? _a : []).includes(i.sku); });
|
|
811
|
+
servicesAndFeesTotal += (0, round_1.default)(i.qte * (0, products_1.getLowestPrice)(i).price.amount, 3);
|
|
812
|
+
if (!!associatedPromos.length) {
|
|
813
|
+
for (const promo of associatedPromos) {
|
|
814
|
+
if (!!!promo.amount_removed)
|
|
815
|
+
continue;
|
|
816
|
+
if ((0, exports.isPromoAPercentage)(promo, { defaultToPercent: true })) {
|
|
817
|
+
servicesAndFeesTotal -= (0, round_1.default)((promo.amount_removed / 100) * (i.qte * (0, products_1.getLowestPrice)(i).price.amount), 3);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
servicesAndFeesTotal -= promo.amount_removed * i.qte;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
});
|
|
825
|
+
return servicesAndFeesTotal;
|
|
826
|
+
};
|
|
827
|
+
exports.getOnlyServicesAndFeesSubtotal = getOnlyServicesAndFeesSubtotal;
|
|
828
|
+
// =========================================================
|
|
829
|
+
// #region UTILS FOR APPLYING CART DISCOUNTS AND PROMO CODES
|
|
830
|
+
const _checkIfRuleAppliesToCart = (rule, appliesTo, cart) => {
|
|
831
|
+
var _a;
|
|
832
|
+
const todayDate = (0, moment_1.default)().toDate();
|
|
833
|
+
const ruleCondition = (_a = rule.condition) !== null && _a !== void 0 ? _a : IDiscountRule_1.RuleConditionEnum.AND;
|
|
834
|
+
switch (rule.field) {
|
|
835
|
+
case IDiscountRule_1.RuleFieldEnum.CART_TOTAL:
|
|
836
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
837
|
+
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, cart.subtotal)];
|
|
838
|
+
}));
|
|
839
|
+
case IDiscountRule_1.RuleFieldEnum.CART_ITEM_TOTAL:
|
|
840
|
+
let totalCartItems = (0, sumBy_1.default)(cart.items, (item) => item.qte);
|
|
841
|
+
if (!!appliesTo.check_other_items_category) {
|
|
842
|
+
const correspondingCartItems = cart.items.filter((item) => {
|
|
843
|
+
if (!!item.tier_pricing && !!item.tier_pricing.length) {
|
|
844
|
+
return (!!item.tier_pricing[0].check_other_items_category &&
|
|
845
|
+
item.tier_pricing[0].check_other_items_category === appliesTo.check_other_items_category);
|
|
846
|
+
}
|
|
847
|
+
return false;
|
|
848
|
+
});
|
|
849
|
+
totalCartItems = (0, sumBy_1.default)(correspondingCartItems, (item) => {
|
|
850
|
+
let amountInBox = 1;
|
|
851
|
+
const qte = item.qte;
|
|
852
|
+
if (!!item.attributes['8OUv9qj0aDbiLOovd4dp']) {
|
|
853
|
+
amountInBox = Number(item.attributes['8OUv9qj0aDbiLOovd4dp']);
|
|
854
|
+
}
|
|
855
|
+
return amountInBox * qte;
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
859
|
+
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, totalCartItems)];
|
|
860
|
+
}));
|
|
861
|
+
case IDiscountRule_1.RuleFieldEnum.CART_ITEM:
|
|
862
|
+
if (!!cart) {
|
|
863
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
864
|
+
if (ruleDetail.operator === 'contains') {
|
|
865
|
+
return [ruleCondition, ruleDetail.value.every((v) => !!cart.items.some((item) => item.sku === v))];
|
|
866
|
+
}
|
|
867
|
+
return [ruleCondition, !!!cart.items.find((item) => !!ruleDetail.value.find((v) => v === item.sku))];
|
|
868
|
+
}));
|
|
869
|
+
}
|
|
870
|
+
case IDiscountRule_1.RuleFieldEnum.CUSTOMER:
|
|
871
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
872
|
+
return [ruleCondition, cart.customer_id === ruleDetail.value[0]];
|
|
873
|
+
}));
|
|
874
|
+
case IDiscountRule_1.RuleFieldEnum.CUSTOMER_TYPE:
|
|
875
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
876
|
+
if (ruleDetail.operator === '!=') {
|
|
877
|
+
return [
|
|
878
|
+
ruleCondition,
|
|
879
|
+
(!!cart.customer_info && !!!cart.customer_info.pro_title) ||
|
|
880
|
+
(!!cart.customer_info &&
|
|
881
|
+
!!cart.customer_info.pro_title &&
|
|
882
|
+
!!!ruleDetail.value.includes(cart.customer_info.pro_title))
|
|
883
|
+
];
|
|
884
|
+
}
|
|
885
|
+
return [
|
|
886
|
+
ruleCondition,
|
|
887
|
+
!!cart.customer_info &&
|
|
888
|
+
!!cart.customer_info.pro_title &&
|
|
889
|
+
!!ruleDetail.value.includes(cart.customer_info.pro_title)
|
|
890
|
+
];
|
|
891
|
+
}));
|
|
892
|
+
case IDiscountRule_1.RuleFieldEnum.DATE:
|
|
893
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
894
|
+
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, todayDate)];
|
|
895
|
+
}));
|
|
896
|
+
case IDiscountRule_1.RuleFieldEnum.WEEKDAY:
|
|
897
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
898
|
+
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, todayDate)];
|
|
899
|
+
}));
|
|
900
|
+
case IDiscountRule_1.RuleFieldEnum.CART_PLATFORM:
|
|
901
|
+
const cartPlatform = !![Cart_1.CartTypeEnum.POS, Cart_1.CartTypeEnum.POS_TRANSACTIONNAL].includes(cart.cart_type)
|
|
902
|
+
? Cart_1.CartTypeEnum.POS
|
|
903
|
+
: Cart_1.CartTypeEnum.WEB;
|
|
904
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
905
|
+
return [ruleCondition, (0, exports.getResultRuleDetail)(ruleDetail, cartPlatform)];
|
|
906
|
+
}));
|
|
907
|
+
case IDiscountRule_1.RuleFieldEnum.CART_TYPE:
|
|
908
|
+
const cartType = cart.cart_content_type === Cart_1.CartContentTypeEnum.MIXED
|
|
909
|
+
? Cart_1.CartContentTypeEnum.MIXED
|
|
910
|
+
: !!(0, cart_1.checkIfCartContainsType)(cart_2.CartGeneralTypeEnum.INSTALLATION, cart)
|
|
911
|
+
? cart_2.CartGeneralTypeEnum.INSTALLATION
|
|
912
|
+
: (0, cart_1.getCartType)(cart);
|
|
913
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
914
|
+
let result = (0, exports.getResultRuleDetail)(ruleDetail, cartType);
|
|
915
|
+
for (const value of ruleDetail.value) {
|
|
916
|
+
if (value === cart_2.CartGeneralTypeEnum.GRASS && cartType === cart_2.CartGeneralTypeEnum.INSTALLATION)
|
|
917
|
+
result = true;
|
|
918
|
+
}
|
|
919
|
+
return [ruleCondition, result];
|
|
920
|
+
}));
|
|
921
|
+
case IDiscountRule_1.RuleFieldEnum.CART_ITEM_CATEGORIES:
|
|
922
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
923
|
+
let result = ruleDetail.operator !== 'contains';
|
|
924
|
+
for (const i of cart.items) {
|
|
925
|
+
const categorySlugsToCheck = (0, exports.getItemCategorySlugArray)(i.categories);
|
|
926
|
+
if (!!categorySlugsToCheck.length) {
|
|
927
|
+
for (const ruleValue of ruleDetail.value) {
|
|
928
|
+
if (!!categorySlugsToCheck.includes(ruleValue))
|
|
929
|
+
result = ruleDetail.operator !== 'contains' ? false : true;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
return [ruleCondition, result];
|
|
934
|
+
}));
|
|
935
|
+
case IDiscountRule_1.RuleFieldEnum.ORDER_DAY:
|
|
936
|
+
const order_day_day = !!cart.shipping_payload && !!cart.shipping_payload.delivery_or_pickup_date
|
|
937
|
+
? cart.shipping_payload.delivery_or_pickup_date
|
|
938
|
+
: '';
|
|
939
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
940
|
+
return [ruleCondition, !!order_day_day ? (0, exports.getResultRuleDetail)(ruleDetail, (0, moment_1.default)(order_day_day).day()) : false];
|
|
941
|
+
}));
|
|
942
|
+
case IDiscountRule_1.RuleFieldEnum.ORDER_TYPE:
|
|
943
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
944
|
+
return [
|
|
945
|
+
ruleCondition,
|
|
946
|
+
!!cart.is_pickup
|
|
947
|
+
? ruleDetail.operator === '=='
|
|
948
|
+
? !!ruleDetail.value.includes('pickup')
|
|
949
|
+
: !!!ruleDetail.value.includes('pickup')
|
|
950
|
+
: ruleDetail.operator === '=='
|
|
951
|
+
? !!ruleDetail.value.includes('shipping')
|
|
952
|
+
: !!!ruleDetail.value.includes('shipping')
|
|
953
|
+
];
|
|
954
|
+
}));
|
|
955
|
+
case IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD:
|
|
956
|
+
// If incentive custom_payment_type is registered, let this check pass, since payment_method will only be chosen on last step
|
|
957
|
+
// NOTE - Used to only apply to POS and POS_TRASACTIONNAL carts, now applies to all carts.
|
|
958
|
+
if (
|
|
959
|
+
// cart.cart_type != CartTypeEnum.WEB &&
|
|
960
|
+
cart.custom_payment_type &&
|
|
961
|
+
cart.custom_payment_type.method == Cart_1.CustomPaymentTypeEnum.INCENTIVE) {
|
|
962
|
+
return [ruleCondition, true];
|
|
963
|
+
}
|
|
964
|
+
const paymentTypesToCompare = !!cart.custom_payment_type
|
|
965
|
+
? [cart.custom_payment_type.method]
|
|
966
|
+
: !!(0, object_1.recursiveCheckObject)(cart, 'shipping_payload.chosen_payment')
|
|
967
|
+
? [(0, object_1.recursiveCheckObject)(cart, 'shipping_payload.chosen_payment')]
|
|
968
|
+
: !!cart.payment_details && cart.payment_details.length
|
|
969
|
+
? cart.payment_details.map((p) => p.method)
|
|
970
|
+
: !!cart.paid_by
|
|
971
|
+
? [cart.paid_by]
|
|
972
|
+
: [];
|
|
973
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
974
|
+
// Si contains, doit contenir AU MOINS UN des modes de paiement ciblés
|
|
975
|
+
// Si contains-not, ne doit pas contenir QUE les modes de paiement exclus
|
|
976
|
+
let result = ruleDetail.operator == 'contains'
|
|
977
|
+
? paymentTypesToCompare.some((type) => ruleDetail.value.includes(type))
|
|
978
|
+
: !paymentTypesToCompare.every((type) => ruleDetail.value.includes(type));
|
|
979
|
+
return [ruleCondition, result];
|
|
980
|
+
}));
|
|
981
|
+
case IDiscountRule_1.RuleFieldEnum.CUSTOMER_TERMS_CODE:
|
|
982
|
+
let customerTermsCode = (0, object_1.recursiveCheckObject)(cart, 'customer_info.terms_code');
|
|
983
|
+
let customerPrevTermsCode = (0, object_1.recursiveCheckObject)(cart, 'customer_info.previous_terms_code');
|
|
984
|
+
let trueTermsCode = customerTermsCode == 'HOLD' ? 'HOLD' : (customerPrevTermsCode !== null && customerPrevTermsCode !== void 0 ? customerPrevTermsCode : customerTermsCode);
|
|
985
|
+
let termsCodeToCheck = !!!trueTermsCode
|
|
986
|
+
? undefined
|
|
987
|
+
: data_2.allCodesForHold.includes(trueTermsCode)
|
|
988
|
+
? 'HOLD'
|
|
989
|
+
: data_2.allCodesForPSL.includes(trueTermsCode)
|
|
990
|
+
? 'P.S.L'
|
|
991
|
+
: 'NET30';
|
|
992
|
+
return (0, flatten_1.default)(rule.ruleDetails.map((ruleDetail) => {
|
|
993
|
+
let operator = ruleDetail.operator;
|
|
994
|
+
if (!!!termsCodeToCheck)
|
|
995
|
+
return [IDiscountRule_1.RuleConditionEnum.AND, operator == '!='];
|
|
996
|
+
return [
|
|
997
|
+
ruleCondition,
|
|
998
|
+
operator == '=='
|
|
999
|
+
? ruleDetail.value.includes(termsCodeToCheck)
|
|
1000
|
+
: !ruleDetail.value.includes(termsCodeToCheck)
|
|
1001
|
+
];
|
|
1002
|
+
}));
|
|
1003
|
+
default:
|
|
1004
|
+
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
1005
|
+
}
|
|
1006
|
+
};
|
|
1007
|
+
/**
|
|
1008
|
+
* Checks if discount rule should be applied to cart based on each rule verification results.
|
|
1009
|
+
* @param checkedRulesApplicationArray - Array where each position is a verified rule result (condition with passed of failed (boolean))
|
|
1010
|
+
* @returns A boolean
|
|
1011
|
+
*/
|
|
1012
|
+
const _checkRuleApplicationArray = (checkedRulesApplicationArray) => {
|
|
1013
|
+
return ((checkedRulesApplicationArray.some((option) => !!option && option.indexOf(IDiscountRule_1.RuleConditionEnum.OR) !== -1) &&
|
|
1014
|
+
checkedRulesApplicationArray.some((option) => !!option && option.indexOf(true) !== -1)) ||
|
|
1015
|
+
(checkedRulesApplicationArray.some((option) => !!option && option.indexOf(IDiscountRule_1.RuleConditionEnum.AND) !== -1) &&
|
|
1016
|
+
!checkedRulesApplicationArray.some((option) => !!option && option.indexOf(false) !== -1)));
|
|
1017
|
+
};
|
|
1018
|
+
// #endregion
|
|
1019
|
+
// #endregion
|
|
1020
|
+
// -----------------------------------------------------------------------------------
|
|
1021
|
+
// #region PAYMENT INCENTIVE DISCOUNTS/PROMOS
|
|
1022
|
+
/**
|
|
1023
|
+
* Checks if an incentive discount could (in theory) by added to provided cart, by checking found incentive discount's rule array.
|
|
1024
|
+
* @param cartData - The cart to check (checks discount_rules for incentive)
|
|
1025
|
+
* @param skipCheckFor - If certain rules should be ignore for check
|
|
1026
|
+
* @returns a boolean
|
|
1027
|
+
*/
|
|
1028
|
+
const checkIfCouldApplyIncentivePromo = (cartData, skipCheckFor = []) => {
|
|
1029
|
+
let afterTaxesPromo = cartData.discount_rules.find((d) => !d.draft &&
|
|
1030
|
+
(d.result.action == IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES ||
|
|
1031
|
+
d.result.action == IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES));
|
|
1032
|
+
if (!!!afterTaxesPromo)
|
|
1033
|
+
return false;
|
|
1034
|
+
if (!!!afterTaxesPromo.rules || afterTaxesPromo.rules.length == 0)
|
|
1035
|
+
return true;
|
|
1036
|
+
const appliesTo = afterTaxesPromo.appliesTo;
|
|
1037
|
+
const canApply = afterTaxesPromo.rules.map((r) => {
|
|
1038
|
+
if (r.field && skipCheckFor.includes(r.field))
|
|
1039
|
+
return [IDiscountRule_1.RuleConditionEnum.AND, true];
|
|
1040
|
+
return _checkIfRuleAppliesToCart(r, appliesTo, cartData);
|
|
1041
|
+
});
|
|
1042
|
+
return _checkRuleApplicationArray(canApply);
|
|
1043
|
+
};
|
|
1044
|
+
exports.checkIfCouldApplyIncentivePromo = checkIfCouldApplyIncentivePromo;
|
|
1045
|
+
/**
|
|
1046
|
+
* Calculates amount to be removed for payment incentive type promos.
|
|
1047
|
+
* @param cartData
|
|
1048
|
+
* @param checkDiscountRules - Optionnal. If cart discount_rules should be checked if cart_promos_applied does not have promo yet.
|
|
1049
|
+
*/
|
|
1050
|
+
const getAfterTaxesPromosTotalAmount = (cartData, checkDiscountRules) => {
|
|
1051
|
+
let currentSubtotal = cartData.subtotal;
|
|
1052
|
+
let afterTaxesPromo = (0, exports.getAfterTaxesPromoInCart)(cartData, checkDiscountRules);
|
|
1053
|
+
let totalAmountForAfterTaxesPromos = 0;
|
|
1054
|
+
if (!!afterTaxesPromo && !!afterTaxesPromo.amount_removed) {
|
|
1055
|
+
if ((0, exports.isPromoAPercentage)(afterTaxesPromo, { includePaymentIncentiveInCheck: true })) {
|
|
1056
|
+
totalAmountForAfterTaxesPromos += currentSubtotal * (afterTaxesPromo.amount_removed / 100);
|
|
1057
|
+
}
|
|
1058
|
+
else {
|
|
1059
|
+
totalAmountForAfterTaxesPromos += afterTaxesPromo.amount_removed;
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
return totalAmountForAfterTaxesPromos;
|
|
1063
|
+
};
|
|
1064
|
+
exports.getAfterTaxesPromosTotalAmount = getAfterTaxesPromosTotalAmount;
|
|
1065
|
+
/**
|
|
1066
|
+
* Returns cart_promos_applied corresponding to payment incentive, if found. Can also check in discount_rules if props provided
|
|
1067
|
+
* @param cartData
|
|
1068
|
+
* @param checkDiscountRules - Optionnal. If the function should check in cart discount_rules if nothing found in cart_promos_applied or if value differs between discount and promo applied
|
|
1069
|
+
*/
|
|
1070
|
+
const getAfterTaxesPromoInCart = (cartData, checkDiscountRules) => {
|
|
1071
|
+
var _a;
|
|
1072
|
+
let cartPromos = (_a = (0, exports.getCartPromo)(cartData)) !== null && _a !== void 0 ? _a : [];
|
|
1073
|
+
let incentivePromo = cartPromos.find((p) => p.applies_to === Cart_1.CartPromoAppliesToEnum.TOTAL_AFTER_TAXES);
|
|
1074
|
+
// Check discount_rule in case value changed or cart promo
|
|
1075
|
+
let discountIncentive = (0, exports.getPaymentIncentiveDiscount)(cartData.discount_rules);
|
|
1076
|
+
if (!!checkDiscountRules &&
|
|
1077
|
+
!!discountIncentive &&
|
|
1078
|
+
(!!!incentivePromo || discountIncentive.result.action_value != incentivePromo.amount_removed)) {
|
|
1079
|
+
incentivePromo = (0, exports.getStandardCartPromoFromDiscount)(cartData, discountIncentive);
|
|
1080
|
+
}
|
|
1081
|
+
return incentivePromo;
|
|
1082
|
+
};
|
|
1083
|
+
exports.getAfterTaxesPromoInCart = getAfterTaxesPromoInCart;
|
|
1084
|
+
/**
|
|
1085
|
+
* Returns the information regarding the payment incentive promo if found in cart's discount_rules
|
|
1086
|
+
* @param cartData
|
|
1087
|
+
* @param checkForAllPaidByDiscounts Optionnal. If defined, will check all discounts if no specific incentive found
|
|
1088
|
+
*/
|
|
1089
|
+
const getPaymentIncentiveDiscountInfo = (cartData, checkForAllPaidByDiscounts) => {
|
|
1090
|
+
let appliesToPaymentTypes = undefined;
|
|
1091
|
+
let paymentIncentiveDiscount = (0, exports.getPaymentIncentiveDiscount)(cartData.discount_rules);
|
|
1092
|
+
if (!!!paymentIncentiveDiscount) {
|
|
1093
|
+
// If not found and props set, check all discounts and use first found with rule on payment methode
|
|
1094
|
+
if (!!checkForAllPaidByDiscounts)
|
|
1095
|
+
paymentIncentiveDiscount = cartData.discount_rules.find((d) => (d.rules || []).some((r) => r.field == IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD));
|
|
1096
|
+
if (!!!paymentIncentiveDiscount)
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
1099
|
+
let ruleForPaymentType = (paymentIncentiveDiscount.rules || []).find((rule) => rule.field == IDiscountRule_1.RuleFieldEnum.PAYMENT_METHOD);
|
|
1100
|
+
if (!!ruleForPaymentType) {
|
|
1101
|
+
appliesToPaymentTypes = {
|
|
1102
|
+
amount: (0, toNumber_1.default)(paymentIncentiveDiscount.result.action_value),
|
|
1103
|
+
isPercent: (0, exports.isPromoAPercentage)(paymentIncentiveDiscount, { includePaymentIncentiveInCheck: true }),
|
|
1104
|
+
paymentTypes: (0, flatten_1.default)(ruleForPaymentType.ruleDetails.map((d) => (0, flatten_1.default)(d.value)))
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
return appliesToPaymentTypes;
|
|
1108
|
+
};
|
|
1109
|
+
exports.getPaymentIncentiveDiscountInfo = getPaymentIncentiveDiscountInfo;
|
|
1110
|
+
const getPaymentIncentiveDiscount = (discountRules) => {
|
|
1111
|
+
if (!!!discountRules)
|
|
1112
|
+
return;
|
|
1113
|
+
let paymentIncentiveDiscount = discountRules.find((d) => !!d.result.action &&
|
|
1114
|
+
[IDiscountRule_1.ResultActionEnum.AMOUNT_AFTER_TAXES, IDiscountRule_1.ResultActionEnum.PERCENT_AFTER_TAXES].includes(d.result.action));
|
|
1115
|
+
return paymentIncentiveDiscount;
|
|
1116
|
+
};
|
|
1117
|
+
exports.getPaymentIncentiveDiscount = getPaymentIncentiveDiscount;
|
|
1118
|
+
// #endregion
|
|
1119
1119
|
//# sourceMappingURL=discount.js.map
|