Class ExternalInventoryProvider

    • Constructor Detail

      • ExternalInventoryProvider

        public ExternalInventoryProvider​(org.springframework.web.reactive.function.client.WebClient webClient,
                                         com.fasterxml.jackson.databind.ObjectMapper objectMapper,
                                         com.broadleafcommerce.common.extension.TypeFactory typeFactory,
                                         ExternalInventoryProperties properties)
    • Method Detail

      • isInventoryAvailable

        public boolean isInventoryAvailable​(String skuCode,
                                            int quantity,
                                            @Nullable
                                            com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Description copied from interface: InventoryProvider
        Determines whether Inventory is available for a particular SKU.
        Specified by:
        isInventoryAvailable in interface InventoryProvider
        Parameters:
        skuCode - the sku code for which to check inventory availability
        quantity - the quantity of the sku code that will be requested
        contextInfo - context information surrounding sandboxing and multitenant state
        Returns:
        true if inventory is available for the SKU and quantity, false otherwise
      • isInventoryAvailable

        public Map<String,​Boolean> isInventoryAvailable​(Map<String,​Integer> skuCodesAndQuantity,
                                                              @Nullable
                                                              com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Description copied from interface: InventoryProvider
        Determines whether Inventory is available for a list of SKUs.

        By default, if the SKU is available for one of the SKU locations or vendors, then it's considered available overall.

        Use InventoryProvider.getInventorySummariesBySku(Map, ContextInfo) for custom logic on SKU inventory availability.

        Specified by:
        isInventoryAvailable in interface InventoryProvider
        Parameters:
        skuCodesAndQuantity - a map of the sku codes and quantity for which to check inventory availability
        contextInfo - context information surrounding sandboxing and multitenant state
        Returns:
        a map of the sku code with true if inventory is available for the SKU and quantity, and false otherwise
      • reserveInventory

        public void reserveInventory​(@NonNull
                                     @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                     @Nullable
                                     com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Description copied from interface: InventoryProvider
        Decrement or otherwise "reserve" inventory for a cart during checkout.
        Specified by:
        reserveInventory in interface InventoryProvider
        Parameters:
        cart - The cart for which to decrement inventory.
        contextInfo - Context information around sandbox and multitenant state.
      • buildReservationResponseException

        protected Exception buildReservationResponseException​(@NonNull
                                                              @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                              @NonNull
                                                              @NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex)
        Builds the appropriate exception that should be thrown when a request to reserve inventory fails.

        By default, all errors (even those caused by unexpected issues) will result in an InventoryUnavailableException.

        Parameters:
        cart - the cart for which reservation was requested
        ex - the error that was encountered when making the request
        Returns:
        the appropriate exception that should be thrown when a request to reserve inventory fails
      • buildExceptionForUnexpectedReservationError

        protected InventoryUnavailableException buildExceptionForUnexpectedReservationError​(@NonNull
                                                                                            @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                                                            @NonNull
                                                                                            @NonNull Exception ex)
        Parameters:
        cart - the cart for which inventory reservation was requested
        ex - the unexpected error that was encountered
        Returns:
        an exception that can be thrown when an inventory reservation request encounters an unexpected error
      • isInventoryUnavailableResponse

        protected boolean isInventoryUnavailableResponse​(@NonNull
                                                         @NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex)
      • getErrorType

        @Nullable
        protected String getErrorType​(@NonNull
                                      @NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex)
      • buildSkuToCartItemIdMap

        protected org.springframework.util.MultiValueMap<String,​String> buildSkuToCartItemIdMap​(@NonNull
                                                                                                      @NonNull Collection<com.broadleafcommerce.cart.client.domain.CartItem> cartItems)
      • getSkuReferences

        protected List<String> getSkuReferences​(@NonNull
                                                @NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex)
      • getDocumentContext

        protected com.jayway.jsonpath.DocumentContext getDocumentContext​(@NonNull
                                                                         @NonNull String payload)
      • buildInventoryReservationRequest

        protected Optional<SkuInventoryReservationRequest> buildInventoryReservationRequest​(@NonNull
                                                                                            @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                                                            @Nullable
                                                                                            com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        This allows implementors to build a SkuInventoryReservationRequest or return an empty Optional if no external request should be made (e.g. if all items in the cart are considered implicitly available.
        Parameters:
        cart -
        contextInfo -
        Returns:
        Throws:
        InventoryUnavailableException - - if one or more items are in the cart that are unavailable.
      • getProductType

        @Nullable
        protected Object getProductType​(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      • getReservationUri

        protected String getReservationUri​(@Nullable
                                           com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Return the POST URI for Inventory Reservations.
        Parameters:
        contextInfo -
        Returns:
      • getAvailabilityCheckUri

        protected String getAvailabilityCheckUri​(@NonNull
                                                 @NonNull String skuCode,
                                                 int quantity,
                                                 @Nullable
                                                 com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Return the GET URI for Inventory Availability. By default, this looks for shipping locations only for the provided skuCode.
        Parameters:
        contextInfo -
        Returns:
      • getBulkAvailabilityCheckUri

        protected String getBulkAvailabilityCheckUri​(@Nullable
                                                     com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Return the GET URI for Inventory Availability. By default, this looks for shipping locations only for the provided skuCodes.
        Parameters:
        contextInfo - Context information around sandbox and multitenant state.
        Returns:
      • postProcessReservationResponse

        protected void postProcessReservationResponse​(@NonNull
                                                      @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                      @NonNull
                                                      @NonNull SkuInventoryReservationResponse response,
                                                      @Nullable
                                                      com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Arbitrary hook point to allow for post processing of the Cart and/or the SkuInventoryReservationResponse.
        Parameters:
        cart -
        response -
        contextInfo -
      • getReservationRequestType

        protected String getReservationRequestType​(@NonNull
                                                   @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                   @Nullable
                                                   com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Indicates the reservation request type (e.g. HARD or SOFT). The default is 'SOFT', meaning that the inventory reservation will be temporary to allow for a hard reservation later - usually after order submittal - which makes the reservation permanent.
        Parameters:
        cart -
        contextInfo -
        Returns:
      • getSkuReferenceFieldType

        protected String getSkuReferenceFieldType​(@NonNull
                                                  @NonNull com.broadleafcommerce.cart.client.domain.Cart cart,
                                                  @Nullable
                                                  com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        SkuInventory records can be looked up or reference by a number of field types, including:
        SKU_CODE - Identifies a Product.getSku() or Variant.getSku() by a unique SKU code
        SKU_EXTERNAL_ID - An ID in another 1st or 3rd party system (e.g. in an ERP)
        SKU_CODE - Arbitrary SKU code UPC - Universal Product
        Code EAN - European Article Number (aka International Article Number)
        GTIN - Global Trade Item Number

        The default is SKU_CODE.

        Parameters:
        cart -
        contextInfo -
        Returns:
      • getListType

        protected org.springframework.core.ParameterizedTypeReference<List<SkuInventoryAvailabilitySummary>> getListType()
        Gets the type reference for a list of sku availability.
        Returns:
        type reference for a list of sku availability
      • getServiceClient

        protected String getServiceClient()