Class ExternalInventoryProvider
- All Implemented Interfaces:
InventoryProvider
- Author:
- Kelly Tisdell (ktisdell)
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final String
protected static final String
protected static final String
protected static final String
protected static final String
static final String
Represents the soft inventory reservation typeprotected static final String
Fields inherited from class com.broadleafcommerce.cartoperation.service.provider.external.AbstractExternalProvider
ENTITY_NOT_FOUND
-
Constructor Summary
ConstructorsConstructorDescriptionExternalInventoryProvider
(org.springframework.web.reactive.function.client.WebClient webClient, com.fasterxml.jackson.databind.ObjectMapper objectMapper, com.broadleafcommerce.common.extension.TypeFactory typeFactory, ExternalInventoryProperties properties) -
Method Summary
Modifier and TypeMethodDescriptionprotected InventoryUnavailableException
buildExceptionForUnexpectedReservationError
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull Exception ex) protected Optional<SkuInventoryReservationRequest>
buildInventoryReservationRequest
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull List<com.broadleafcommerce.cart.client.domain.CartItem> cartItems, String inventoryReservationType, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) protected Optional<SkuInventoryReservationRequest>
buildInventoryReservationRequest
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) This allows implementors to build aSkuInventoryReservationRequest
or return an emptyOptional
if no external request should be made (e.g.protected Exception
buildReservationResponseException
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex) Builds the appropriate exception that should be thrown when a request to reserve inventory fails.protected List<SkuInventoryAvailabilityRequest>
buildSkuInventoryAvailabilityRequests
(Map<String, Integer> skuCodesAndQuantity) Builds a listSkuInventoryAvailabilityRequest
to verify the availability of the SKU for the provided quantity.buildSkuToCartItemIdMap
(@NonNull Collection<com.broadleafcommerce.cart.client.domain.CartItem> cartItems) protected String
getAvailabilityCheckUri
(@NonNull String skuCode, int quantity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Return the GET URI for Inventory Availability.protected String
getBulkAvailabilityCheckUri
(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Return the GET URI for Inventory Availability.protected com.jayway.jsonpath.DocumentContext
getDocumentContext
(@NonNull String payload) protected String
getErrorType
(@NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex) protected List<SkuInventoryAvailabilitySummary>
getInventorySummaries
(@NonNull Map<String, Integer> skuCodesAndQuantity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) getInventorySummariesBySku
(@NonNull Map<String, Integer> skuCodesAndQuantity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Gets a map ofSkuInventoryAvailabilitySummaries
by SKU.protected org.springframework.core.ParameterizedTypeReference<List<SkuInventoryAvailabilitySummary>>
Gets the type reference for a list of sku availability.protected Object
getProductType
(com.broadleafcommerce.cart.client.domain.CartItem cartItem) protected ExternalInventoryProperties
protected String
getReservationRequestType
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Indicates the reservation request type (e.g.protected String
getReservationUri
(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Return the POST URI for Inventory Reservations.protected String
protected String
getSkuReferenceFieldType
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, 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 aCatalogItem.getSku()
orVariant.getSku()
by a unique SKU code
SKU_EXTERNAL_ID - An ID in another 1st or 3rd party system (e.g.getSkuReferences
(@NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex) boolean
isInventoryAvailable
(@NonNull InventoryAvailabilityRequest inventoryAvailabilityRequest, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Determines whether Inventory is available for a particular catalog item.isInventoryAvailable
(@NonNull List<InventoryAvailabilityRequest> inventoryAvailabilityRequests, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Determines whether Inventory is available for a list of catalog items.isInventoryAvailable
(@NonNull Map<String, Integer> skuCodesAndQuantity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Determines whether Inventory is available for a list of SKUs.boolean
isInventoryAvailable
(String skuCode, int quantity, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Determines whether Inventory is available for a particular SKU.protected boolean
isInventoryUnavailableResponse
(@NonNull org.springframework.web.reactive.function.client.WebClientResponseException ex) protected void
postProcessReservationResponse
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull SkuInventoryReservationResponse response, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Arbitrary hook point to allow for post processing of theCart
and/or theSkuInventoryReservationResponse
.void
reserveInventory
(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Decrement or otherwise "reserve" inventory for a cart during checkout.void
softReserveInventory
(com.broadleafcommerce.cart.client.domain.Cart cart, List<com.broadleafcommerce.cart.client.domain.CartItem> itemsToReserve, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Perform a soft reservation on a specific item.Methods inherited from class com.broadleafcommerce.cartoperation.service.provider.external.AbstractExternalProvider
buildNotFoundException, executeRequest, getHeaders, getObjectMapper, getTypeFactory, getWebClient, isEntityNotFound, pageableToParams, uriVars
-
Field Details
-
SOFT_RESERVATION
Represents the soft inventory reservation type- See Also:
-
DEFAULT_RESERVATION_REQUEST_TYPE
- See Also:
-
DEFAULT_SKU_REF_FIELD_TYPE
- See Also:
-
INVENTORY_UNAVAILABLE
- See Also:
-
CANNOT_DETERMINE_CART_ITEM_INVENTORY_ERROR_MSG
- See Also:
-
UNAVAILABLE_CART_ITEM_INVENTORY_ERROR_MSG
- See Also:
-
AVAILABILITY_CHECK_UNEXPECTED_FAILURE_ERROR_MSG
- See Also:
-
-
Constructor Details
-
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 Details
-
isInventoryAvailable
public boolean isInventoryAvailable(@NonNull @NonNull InventoryAvailabilityRequest inventoryAvailabilityRequest, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:InventoryProvider
Determines whether Inventory is available for a particular catalog item.- Specified by:
isInventoryAvailable
in interfaceInventoryProvider
- Parameters:
inventoryAvailabilityRequest
- the catalog item for which to check inventory availabilitycontextInfo
- context information surrounding sandboxing and multitenant state- Returns:
true
if inventory is available for the catalog item and quantity,false
otherwise
-
isInventoryAvailable
public Map<String,Boolean> isInventoryAvailable(@NonNull @NonNull List<InventoryAvailabilityRequest> inventoryAvailabilityRequests, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:InventoryProvider
Determines whether Inventory is available for a list of catalog items.By default, if the catalog item 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 interfaceInventoryProvider
- Parameters:
inventoryAvailabilityRequests
- a list ofinventory requests
for which to check inventory availabilitycontextInfo
- 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, andfalse
otherwise
-
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 interfaceInventoryProvider
- Parameters:
skuCode
- the sku code for which to check inventory availabilityquantity
- the quantity of the sku code that will be requestedcontextInfo
- 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(@NonNull @NonNull 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 interfaceInventoryProvider
- Parameters:
skuCodesAndQuantity
- a map of the sku codes and quantity for which to check inventory availabilitycontextInfo
- 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, andfalse
otherwise
-
getInventorySummariesBySku
public Map<String,List<SkuInventoryAvailabilitySummary>> getInventorySummariesBySku(@NonNull @NonNull Map<String, Integer> skuCodesAndQuantity, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:InventoryProvider
Gets a map ofSkuInventoryAvailabilitySummaries
by SKU.There can be multiple
SkuInventoryAvailabilitySummaries
for one SKU, if there are SKU inventories set up at multiple inventory locations or vendors.This is useful for custom SKU inventory availability logic.
- Specified by:
getInventorySummariesBySku
in interfaceInventoryProvider
- Parameters:
skuCodesAndQuantity
- a map of the sku codes and quantity for which to check inventory availabilitycontextInfo
- context information surrounding sandboxing and multitenant state- Returns:
- a map of
SkuInventoryAvailabilitySummaries
by SKU
-
getInventorySummaries
protected List<SkuInventoryAvailabilitySummary> getInventorySummaries(@NonNull @NonNull Map<String, Integer> skuCodesAndQuantity, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
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 interfaceInventoryProvider
- Parameters:
cart
- The cart for which to decrement inventory.contextInfo
- Context information around sandbox and multitenant state.
-
softReserveInventory
public void softReserveInventory(com.broadleafcommerce.cart.client.domain.Cart cart, List<com.broadleafcommerce.cart.client.domain.CartItem> itemsToReserve, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:InventoryProvider
Perform a soft reservation on a specific item. Intended to be used if an item has an "Add to Cart" reservation strategy- Specified by:
softReserveInventory
in interfaceInventoryProvider
itemsToReserve
- The items added to the cart to be soft reservedcontextInfo
- 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 requestedex
- 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 requestedex
- the unexpected error that was encountered- Returns:
- an exception that can be thrown when an inventory reservation request encounters an unexpected error
-
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
-
getDocumentContext
-
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 aSkuInventoryReservationRequest
or return an emptyOptional
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.
-
buildInventoryReservationRequest
protected Optional<SkuInventoryReservationRequest> buildInventoryReservationRequest(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull List<com.broadleafcommerce.cart.client.domain.CartItem> cartItems, String inventoryReservationType, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
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 providedskuCode
.- 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 providedskuCodes
.- 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 theCart
and/or theSkuInventoryReservationResponse
.- 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 aCatalogItem.getSku()
orVariant.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
-
buildSkuInventoryAvailabilityRequests
protected List<SkuInventoryAvailabilityRequest> buildSkuInventoryAvailabilityRequests(Map<String, Integer> skuCodesAndQuantity) Builds a listSkuInventoryAvailabilityRequest
to verify the availability of the SKU for the provided quantity.- Returns:
- a list of sku inventory availability requests
-
getServiceClient
-
getProperties
-