Class DefaultSkuInventoryService<I extends SkuInventory>
- Type Parameters:
I
-
- All Implemented Interfaces:
com.broadleafcommerce.data.tracking.core.service.CrudEntityService<I>
,com.broadleafcommerce.data.tracking.core.service.RsqlCrudEntityService<I>
,SkuInventoryService<I>
SkuInventory
. This is not a typical CRUD
service because it involves multiple access to repositories in a single JPA transaction.- Author:
- Kelly Tisdell (ktisdell)
-
Constructor Summary
ConstructorDescriptionDefaultSkuInventoryService
(SkuInventoryRepository<com.broadleafcommerce.data.tracking.core.Trackable> skuInventoryRepository, InventoryLocationService<InventoryLocation> inventoryLocationService, SkuFieldReferenceTypeUtility skuFieldReferenceTypeUtility, SkuInventoryAdjustmentService<I> skuInventoryAdjustmentService, SkuInventoryAvailabilityStrategy<I> skuInventoryAvailabilityStrategy, StockChangeNotificationService stockChangeNotificationService, SkuInventoryReservationRequestValidator skuInventoryReservationRequestValidator, InventoryTransactionService<InventoryTransaction> inventoryTransactionService, com.broadleafcommerce.data.tracking.core.service.RsqlCrudEntityHelper helper, com.broadleafcommerce.data.tracking.core.mapping.DomainMapperManager domainMapperManager) -
Method Summary
Modifier and TypeMethodDescriptionprotected com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I>
buildBulkResponseOfFailures
(List<com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse.PersistenceFailure<I>> validationFailures) protected ReleaseSkuInventoryReservationResponse
buildReleaseReservationResponse
(@NonNull ReleaseSkuInventoryReservationRequest releaseRequest, @NonNull List<InventoryTransaction> reservationsFound, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Builds aReleaseSkuInventoryReservationResponse
representing the result of releasing reservations.protected String
buildSerializedSku
(String skuRef, SkuInventory skuInventory) cancelInventory
(SkuInventoryAdjustmentRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Performs theDefaultInventoryTransactionType.CANCELLED
InventoryTransactions
to updateSkuInventory
for fulfilled items.createAll
(List<I> businessInstances, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I>
createAllAllowingPartialSuccess
(List<I> businessInstances, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) createSkuInventoryReservations
(SkuInventoryReservationRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Creates HARD or a SOFT Inventory Reservations.void
void
deleteAllByInventoryLocationId
(String inventoryLocationId, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Deletes all theSkuInventory
for the specified inventory location idprotected int
protected String
determineSkuRefValue
(SkuReferenceFieldType skuReferenceFieldType, I skuInventory, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) protected Map<I,
List<SkuInventoryAdjustmentRequestItem>> divideRequestItemsBySkuInventory
(SkuInventoryAdjustmentRequest request, InventoryTransactionType latestExistingTransactionType, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) boolean
existsByInventoryLocationAndSkuRefFieldValues
(String inventoryLocationId, Optional<String> skuContextId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Determines is aSkuInventory
record exists in a given location, based onSkuRef
fields.boolean
existsByParentSkuInventoryId
(@NonNull String parentSkuInventoryId, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Determines if anySkuInventory
records exist with the givenSkuInventory.getParentSkuInventoryId()
.org.springframework.data.domain.Page<I>
findAllByInventoryLocationContextId
(String inventoryLocationId, cz.jirutka.rsql.parser.ast.Node filters, org.springframework.data.domain.Pageable page, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Read all Sku Inventories for the specified inventory location id matching the given filters.fulfillInventory
(SkuInventoryAdjustmentRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Performs theDefaultInventoryTransactionType.FULFILLED
InventoryTransactions
to updateSkuInventory
for fulfilled items.getAlreadyReservedSkuInventories
(SkuInventoryReservationRequestGroup group, Map<String, List<InventoryTransaction>> existingSoftReservationsByReference, Map<String, Integer> nonReservedRequestedQuantitiesBySkuReference, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Reads theSkuInventory
records for the reservation request items which already have existing soft reservations.getAvailableSkuInventories
(SkuInventoryReservationRequestGroup group, SkuReferenceFieldType fieldType, Map<String, Integer> totalRequestedQuantitiesBySkuReference, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) protected com.broadleafcommerce.data.tracking.core.mapping.DomainMapperManager
protected Map<String,
List<InventoryTransaction>> getExistingSoftReservationsByReferences
(SkuInventoryReservationRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) getInventoryIdsForReferenceNumbersBasedOnExistingTransactions
(List<SkuInventoryAdjustmentRequestItem> items, InventoryTransactionType latestExistingTransactionType, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Retrieves theSKU Inventory ID
for the items'reference numbers
based on existing transactions of typelatestExistingTransactionType
.protected InventoryLocationService<InventoryLocation>
protected InventoryTransactionService<InventoryTransaction>
protected SkuFieldReferenceTypeUtility
protected SkuInventoryAdjustmentService<I>
protected SkuInventoryAvailabilityStrategy<I>
getSkuInventoryAvailabilityStrategy
(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Allows for context-specific selection of a strategy for finding inventory availability for browsing and reservation.protected SkuInventoryRepository<com.broadleafcommerce.data.tracking.core.Trackable>
protected SkuInventoryReservationRequestValidator
protected StockChangeNotificationService
protected com.broadleafcommerce.common.extension.TypeFactory
protected Comparator<com.broadleafcommerce.data.tracking.core.service.Update<I>>
Provides aComparator
for sortingUpdate
instances.protected boolean
isSerialized
(String skuReferenceValue) Determines whether the item being adjusted has a serialized sku inventory objectprotected void
notifyStockChangeForCreate
(I created, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Notifies stock change after creating aSkuInventory
.protected void
notifyStockChangeForDelete
(I deleted, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Notifies stock change after deleting aSkuInventory
.protected void
postProcessSkuInventoryCreation
(I created, @NonNull Optional<I> maybeParent, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Perform any additional handling after aSkuInventory
has been created.protected void
postProcessSkuInventoryDeletion
(I deleted, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Perform any additional handling after aSkuInventory
has been deleted.readAll
(Optional<cz.jirutka.rsql.parser.ast.Node> filters, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Generally used for batch export, this allows a caller to query, filter, and stream paged results.readAllByInventoryLocationId
(String inventoryLocationId, cz.jirutka.rsql.parser.ast.Node filters, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Read all Sku Inventories for the specified inventory location id matching the given filters.org.springframework.data.domain.Page<I>
readAllByName
(String nameQuery, cz.jirutka.rsql.parser.ast.Node filters, org.springframework.data.domain.Pageable page, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Read all Inventory Locations, optionally filtered by name or number.readByInventoryLocationAndSkuRefFieldValues
(String inventoryLocationId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Reads a (unique)SkuInventory
record for a given location, based onSkuRef
fields.readByInventoryLocationAndSkuRefFieldValuesAndNotSerialized
(String inventoryLocationId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Reads a (unique) non-serializedSkuInventory
record for a given location, based onSkuRef
fields.readByParentSkuInventoryIdAndSerializationValue
(@NonNull String parentSkuInventoryId, @NonNull String serializationValue, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Reads a (unique)SkuInventory
record for a parent sku inventory id and serialization value.readSkuInventoryDetails
(SkuReferenceFieldType skuRefType, Set<String> skuRefs, InventoryLocation location, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) ReadsSkuInventory
details based on specificSkuRef
details, specified by theSkuReferenceFieldType
for a givenInventoryLocation
.releaseSkuInventoryReservations
(@NonNull ReleaseSkuInventoryReservationRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Releases inventory reservations based on the givenReleaseSkuInventoryReservationRequest
.replace
(String id, I businessInstance, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) replaceAll
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> replacements, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I>
replaceAllAllowingPartialSuccess
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> replacements, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) protected InventoryReservationRequestType
protected SkuInventoryFulfillmentType
Takes a String value and resolves it to an instance ofSkuInventoryFulfillmentType
.returnInventory
(SkuInventoryAdjustmentRequest request, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Performs theDefaultInventoryTransactionType.RETURNED
InventoryTransactions
to updateSkuInventory
for returned items.void
setTypeFactory
(com.broadleafcommerce.common.extension.TypeFactory typeFactory) update
(String id, I businessInstance, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) updateAll
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> updates, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I>
updateAllAllowingPartialSuccess
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> updates, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) protected void
updateHasChildrenFlagIfSerializedInventoryExists
(I inventory, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Sets theSkuInventory.hasChildren()
flag if a child inventory exists.protected void
updateParentHasChildrenFlag
(I inventory, @NonNull Optional<I> maybeParent, boolean hasChildrenFlagToSet, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Sets theSkuInventory.hasChildren()
flag for the parent if the givenSkuInventory
is serialized.protected I
updateSerializedInventorySkuRefBasedOnParent
(I businessInstance, I parent) Updates theSkuInventory.getSkuRef()
of a serialized inventory based on its parent.updateSort
(com.broadleafcommerce.data.tracking.core.sort.SortPositionRequest sortPositionRequest, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) protected List<com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse.PersistenceFailure<I>>
validateAllSkuInventoryModifications
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> changes, List<com.broadleafcommerce.data.tracking.core.service.Update<I>> successfullyValidated, com.broadleafcommerce.data.tracking.core.context.ContextInfo context, boolean useReplaceSemantics) protected void
validateAllSkuInventoryModificationsAndThrowIfError
(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> changes, List<com.broadleafcommerce.data.tracking.core.service.Update<I>> successfullyValidated, com.broadleafcommerce.data.tracking.core.context.ContextInfo context, boolean useReplaceSemantics) validateExpectedInventoryTransactionsExist
(List<SkuInventoryAdjustmentRequestItem> items, List<InventoryTransaction> inventoryTransactions, InventoryTransactionType transactionType) Validates that all expected inventory transactions exist based on the originalitem list
.protected void
validateHasNoChildrenBeforeDeletion
(I toDelete, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Validates that theSkuInventory
being deleted has no children.protected void
validateSingleSkuInventoryModifications
(I current, I changed, boolean useReplaceSemantics) protected void
validateSkuInventoryModifications
(I current, I changed, org.springframework.validation.Errors errors, boolean useReplaceSemantics) Perform any validations onchanged
with consideration to the current state incurrent
.protected void
validateSufficientAvailableInventory
(List<I> availableSkuInventories, Map<String, Integer> totalRequestedQuantitiesBySkuReference, SkuReferenceFieldType skuReferenceFieldType, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Methods inherited from class com.broadleafcommerce.data.tracking.core.service.BaseRsqlCrudEntityService
getRsqlHelper, readAll, readAll, readAll, readAll
Methods inherited from class com.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService
convertFromPersistentDomain, convertToPersistentDomain, getHelper, getRepository, getSortPositionStrategy, readAll, readAll, readAll, readAllByContextId, readByContextId, setSortPositionStrategy
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.broadleafcommerce.data.tracking.core.service.CrudEntityService
readAll, readAll, readAll, readAllByContextId, readByContextId
-
Constructor Details
-
DefaultSkuInventoryService
public DefaultSkuInventoryService(SkuInventoryRepository<com.broadleafcommerce.data.tracking.core.Trackable> skuInventoryRepository, InventoryLocationService<InventoryLocation> inventoryLocationService, SkuFieldReferenceTypeUtility skuFieldReferenceTypeUtility, SkuInventoryAdjustmentService<I> skuInventoryAdjustmentService, SkuInventoryAvailabilityStrategy<I> skuInventoryAvailabilityStrategy, StockChangeNotificationService stockChangeNotificationService, SkuInventoryReservationRequestValidator skuInventoryReservationRequestValidator, InventoryTransactionService<InventoryTransaction> inventoryTransactionService, com.broadleafcommerce.data.tracking.core.service.RsqlCrudEntityHelper helper, com.broadleafcommerce.data.tracking.core.mapping.DomainMapperManager domainMapperManager)
-
-
Method Details
-
readAllByName
public org.springframework.data.domain.Page<I> readAllByName(@Nullable String nameQuery, @Nullable cz.jirutka.rsql.parser.ast.Node filters, @Nullable org.springframework.data.domain.Pageable page, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Read all Inventory Locations, optionally filtered by name or number.- Specified by:
readAllByName
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
nameQuery
- (optional) the name to filter byfilters
- additional filters to apply in the query, can be nullpage
- the requested page of results from the databasecontext
- context information surrounding sandboxing and multitenant state- Returns:
- all SkuInventory, optionally filtered by name
-
findAllByInventoryLocationContextId
public org.springframework.data.domain.Page<I> findAllByInventoryLocationContextId(String inventoryLocationId, @Nullable cz.jirutka.rsql.parser.ast.Node filters, @Nullable org.springframework.data.domain.Pageable page, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Read all Sku Inventories for the specified inventory location id matching the given filters. Read all Inventory Locations,- Specified by:
findAllByInventoryLocationContextId
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
inventoryLocationId
- the inventory location idfilters
- additional filters to apply in the query, can be nullpage
- the requested page of results from the databasecontext
- context information surrounding sandboxing and multitenant state- Returns:
- the Sku Inventories for the specified inventory location id
-
readAllByInventoryLocationId
public Stream<I> readAllByInventoryLocationId(String inventoryLocationId, @Nullable cz.jirutka.rsql.parser.ast.Node filters, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Read all Sku Inventories for the specified inventory location id matching the given filters.- Specified by:
readAllByInventoryLocationId
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
inventoryLocationId
- the inventory location idfilters
- additional filters to apply in the query, can be nullcontext
- context information surrounding sandboxing and multitenant state- Returns:
- the Sku Inventories for the specified inventory location id
-
deleteAllByInventoryLocationId
public void deleteAllByInventoryLocationId(String inventoryLocationId, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:SkuInventoryService
Deletes all theSkuInventory
for the specified inventory location id- Specified by:
deleteAllByInventoryLocationId
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
inventoryLocationId
- the inventory location idcontextInfo
- context information surrounding sandboxing and multitenant state
-
readByInventoryLocationAndSkuRefFieldValues
public Optional<I> readByInventoryLocationAndSkuRefFieldValues(String inventoryLocationId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Reads a (unique)SkuInventory
record for a given location, based onSkuRef
fields.- Specified by:
readByInventoryLocationAndSkuRefFieldValues
in interfaceSkuInventoryService<I extends SkuInventory>
- Returns:
-
readByInventoryLocationAndSkuRefFieldValuesAndNotSerialized
public Optional<I> readByInventoryLocationAndSkuRefFieldValuesAndNotSerialized(String inventoryLocationId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Reads a (unique) non-serializedSkuInventory
record for a given location, based onSkuRef
fields.Typically used for the validation to ensure that the parent of serialized inventories do not have duplicate sku reference.
- Specified by:
readByInventoryLocationAndSkuRefFieldValuesAndNotSerialized
in interfaceSkuInventoryService<I extends SkuInventory>
-
existsByInventoryLocationAndSkuRefFieldValues
public boolean existsByInventoryLocationAndSkuRefFieldValues(String inventoryLocationId, Optional<String> skuContextId, Optional<String> externalId, Optional<String> skuCode, Optional<String> upc, Optional<String> ean, Optional<String> gtin, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Determines is aSkuInventory
record exists in a given location, based onSkuRef
fields.- Specified by:
existsByInventoryLocationAndSkuRefFieldValues
in interfaceSkuInventoryService<I extends SkuInventory>
- Returns:
-
readByParentSkuInventoryIdAndSerializationValue
public Optional<I> readByParentSkuInventoryIdAndSerializationValue(@NonNull @NonNull String parentSkuInventoryId, @NonNull @NonNull String serializationValue, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Reads a (unique)SkuInventory
record for a parent sku inventory id and serialization value.- Specified by:
readByParentSkuInventoryIdAndSerializationValue
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
parentSkuInventoryId
- the parent sku inventory idserializationValue
- the serialization valuecontext
- context information surrounding sandboxing and multitenant state- Returns:
- a (unique)
SkuInventory
record for a given parent sku inventory id and serialization value.
-
existsByParentSkuInventoryId
public boolean existsByParentSkuInventoryId(@NonNull @NonNull String parentSkuInventoryId, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Determines if anySkuInventory
records exist with the givenSkuInventory.getParentSkuInventoryId()
.- Specified by:
existsByParentSkuInventoryId
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
parentSkuInventoryId
- the parent sku inventory id to filter bycontext
- context information surrounding sandboxing and multitenant state- Returns:
- true if any
SkuInventory
records exist with the givenSkuInventory.getParentSkuInventoryId()
, otherwise false
-
createSkuInventoryReservations
public List<InventoryTransaction> createSkuInventoryReservations(@NonNull SkuInventoryReservationRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) throws InventoryUnavailableException Description copied from interface:SkuInventoryService
Creates HARD or a SOFT Inventory Reservations. This results in the creation of 1 or moreInventoryTransaction
records. A SOFT inventory reservation is a temporary reservation that may be removed or rolled back after a period of time. A SOFT reservation typically results in decrementing quantityAvailable on theSkuInventory
record. These are typically created prior to payment processing. A HARD reservation makes the SOFT reservation permanent. These are typically created after payment processing. If a corresponding SOFT reservation does not exist, then the creation of a HARD reservation will attempt to decrement quantityAvailable as well. In this case, the process is similar to creating a SOFT reservation immediately followed by a HARD reservation.- Specified by:
createSkuInventoryReservations
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
request
-SkuInventoryReservationRequest
to be processedcontextInfo
- Context information around sandbox and multitenant state.- Returns:
- The
InventoryTransactions
resulting from processing therequest
. - Throws:
InventoryUnavailableException
- if inventory cannot be reserved or otherwise decremented
-
releaseSkuInventoryReservations
public ReleaseSkuInventoryReservationResponse releaseSkuInventoryReservations(@NonNull @NonNull ReleaseSkuInventoryReservationRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:SkuInventoryService
Releases inventory reservations based on the givenReleaseSkuInventoryReservationRequest
.By default, it only releases the soft reservations
- Specified by:
releaseSkuInventoryReservations
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
request
- theReleaseSkuInventoryReservationRequest
containing details about the releasecontextInfo
- context information around sandbox and multitenant state- Returns:
- a
ReleaseSkuInventoryReservationResponse
represents the result
-
buildReleaseReservationResponse
protected ReleaseSkuInventoryReservationResponse buildReleaseReservationResponse(@NonNull @NonNull ReleaseSkuInventoryReservationRequest releaseRequest, @NonNull @NonNull List<InventoryTransaction> reservationsFound, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Builds aReleaseSkuInventoryReservationResponse
representing the result of releasing reservations.By default it just returns a new
ReleaseSkuInventoryReservationResponse
containing nothing, serves as a hookpoint for customization.- Parameters:
releaseRequest
- the originalReleaseSkuInventoryReservationRequest
reservationsFound
- theInventoryTransactions
that were found and releasedcontextInfo
- the context around sandboxing and multitenant state- Returns:
- a
ReleaseSkuInventoryReservationResponse
representing the result of releasing reservations
-
getExistingSoftReservationsByReferences
protected Map<String,List<InventoryTransaction>> getExistingSoftReservationsByReferences(SkuInventoryReservationRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
getAlreadyReservedSkuInventories
protected Set<I> getAlreadyReservedSkuInventories(SkuInventoryReservationRequestGroup group, Map<String, List<InventoryTransaction>> existingSoftReservationsByReference, Map<String, Integer> nonReservedRequestedQuantitiesBySkuReference, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Reads theSkuInventory
records for the reservation request items which already have existing soft reservations. Also updatesnonReservedRequestedQuantitiesBySkuReference
to remove items and quantities which have already been fully soft-reserved.- Parameters:
group
- the reservation request group to find already reserved inventories forexistingSoftReservationsByReference
- the existing soft reservation transactions mapped by item reference numbernonReservedRequestedQuantitiesBySkuReference
- all of the requested quantities for each sku reference, to have already-reserved quantities removedcontextInfo
- context information surrounding sandboxing and multitenant state- Returns:
- the
SkuInventory
records for the reservation request which have existing soft reservations
-
getAvailableSkuInventories
protected List<I> getAvailableSkuInventories(SkuInventoryReservationRequestGroup group, SkuReferenceFieldType fieldType, Map<String, Integer> totalRequestedQuantitiesBySkuReference, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
fulfillInventory
public List<InventoryTransaction> fulfillInventory(@NonNull SkuInventoryAdjustmentRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) throws InventoryUnavailableException, InventoryNotReservedException Description copied from interface:SkuInventoryService
Performs theDefaultInventoryTransactionType.FULFILLED
InventoryTransactions
to updateSkuInventory
for fulfilled items.This transaction decrements the reserved and on-hand inventory for the requested items. This should only be performed after the items have already been
DefaultInventoryTransactionType.HARD_RESERVED
.- Specified by:
fulfillInventory
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
request
- inventory adjustment to be processed as fulfilledcontextInfo
- Context information around sandbox and multitenant state.- Returns:
- The
InventoryTransactions
resulting from processing therequest
. - Throws:
InventoryUnavailableException
- if inventory could not be decrementedInventoryNotReservedException
- if inventory was not already reserved
-
cancelInventory
public List<InventoryTransaction> cancelInventory(@NonNull SkuInventoryAdjustmentRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) throws InventoryUnavailableException, InventoryNotReservedException Description copied from interface:SkuInventoryService
Performs theDefaultInventoryTransactionType.CANCELLED
InventoryTransactions
to updateSkuInventory
for fulfilled items.This transaction decrements the reserved inventory for the requested items. This should only be performed after the items have already been
DefaultInventoryTransactionType.HARD_RESERVED
.- Specified by:
cancelInventory
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
request
- inventory adjustment to be processed as cancelledcontextInfo
- Context information around sandbox and multitenant state.- Returns:
- The
InventoryTransactions
resulting from processing therequest
. - Throws:
InventoryUnavailableException
- if inventory could not be decrementedInventoryNotReservedException
- if inventory was not already reserved
-
returnInventory
public List<InventoryTransaction> returnInventory(@NonNull SkuInventoryAdjustmentRequest request, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:SkuInventoryService
Performs theDefaultInventoryTransactionType.RETURNED
InventoryTransactions
to updateSkuInventory
for returned items.This transaction increments the on-hand inventory for the requested items.
- Specified by:
returnInventory
in interfaceSkuInventoryService<I extends SkuInventory>
- Parameters:
request
- inventory adjustment to be processed as returnedcontextInfo
- Context information around sandbox and multitenant state.- Returns:
- The
InventoryTransactions
resulting from processing therequest
.
-
divideRequestItemsBySkuInventory
protected Map<I,List<SkuInventoryAdjustmentRequestItem>> divideRequestItemsBySkuInventory(@NonNull SkuInventoryAdjustmentRequest request, @NonNull InventoryTransactionType latestExistingTransactionType, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
getInventoryIdsForReferenceNumbersBasedOnExistingTransactions
protected org.springframework.util.MultiValueMap<String,String> getInventoryIdsForReferenceNumbersBasedOnExistingTransactions(List<SkuInventoryAdjustmentRequestItem> items, InventoryTransactionType latestExistingTransactionType, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Retrieves theSKU Inventory ID
for the items'reference numbers
based on existing transactions of typelatestExistingTransactionType
.For example, if we are fulfilling inventory for items, we will look up the
DefaultInventoryTransactionType.HARD_RESERVED
transactions for the items'reference numbers
and return a map where the keys are the reference numbers and the values are the corresponding SKU Inventory IDs.- Parameters:
items
- the items to find SKU inventory IDs forlatestExistingTransactionType
- the expected latest existing transaction type, which we will look up to find the correct SKU inventory IDcontextInfo
- context information surrounding sandboxing and multitenant state- Returns:
- a map where the keys are the reference numbers and the values are the corresponding SKU Inventory IDs
- Throws:
InventoryTransactionMissingException
- if an expected inventory transaction does not exist.
-
validateExpectedInventoryTransactionsExist
protected Optional<String> validateExpectedInventoryTransactionsExist(List<SkuInventoryAdjustmentRequestItem> items, List<InventoryTransaction> inventoryTransactions, InventoryTransactionType transactionType) Validates that all expected inventory transactions exist based on the originalitem list
. If these don't exist, an error string is returned indicating what went wrong.- Parameters:
items
- The inventory adjustment items to check against.inventoryTransactions
- The found inventory adjustments.transactionType
- The transaction type (for error message purposes)- Returns:
- An optional with an error message string if not all expected transactions are found,
else
empty
-
determineExpectedReservationCount
-
isSerialized
Determines whether the item being adjusted has a serialized sku inventory object- Parameters:
skuReferenceValue
- the sku value of the item- Returns:
- whether the item being adjusted has a serialized sku inventory object
-
determineSkuRefValue
protected String determineSkuRefValue(SkuReferenceFieldType skuReferenceFieldType, I skuInventory, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) -
buildSerializedSku
-
validateSufficientAvailableInventory
protected void validateSufficientAvailableInventory(List<I> availableSkuInventories, Map<String, Integer> totalRequestedQuantitiesBySkuReference, SkuReferenceFieldType skuReferenceFieldType, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) throws InventoryUnavailableException- Throws:
InventoryUnavailableException
-
readSkuInventoryDetails
public List<I> readSkuInventoryDetails(SkuReferenceFieldType skuRefType, Set<String> skuRefs, InventoryLocation location, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Description copied from interface:SkuInventoryService
ReadsSkuInventory
details based on specificSkuRef
details, specified by theSkuReferenceFieldType
for a givenInventoryLocation
.- Specified by:
readSkuInventoryDetails
in interfaceSkuInventoryService<I extends SkuInventory>
- Returns:
-
readAll
public Stream<I> readAll(@NonNull Optional<cz.jirutka.rsql.parser.ast.Node> filters, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) Description copied from interface:SkuInventoryService
Generally used for batch export, this allows a caller to query, filter, and stream paged results.- Specified by:
readAll
in interfaceSkuInventoryService<I extends SkuInventory>
- Returns:
-
update
@Transactional("inventoryTransactionManager") public I update(String id, I businessInstance, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
update
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
update
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
updateAll
public List<I> updateAll(@NonNull List<com.broadleafcommerce.data.tracking.core.service.Update<I>> updates, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
updateAll
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
updateAll
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
updateAllAllowingPartialSuccess
public com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I> updateAllAllowingPartialSuccess(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> updates, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
updateAllAllowingPartialSuccess
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
updateAllAllowingPartialSuccess
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
buildBulkResponseOfFailures
-
updateSort
@Transactional("inventoryTransactionManager") public I updateSort(com.broadleafcommerce.data.tracking.core.sort.SortPositionRequest sortPositionRequest, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
updateSort
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
updateSort
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
replace
@Transactional("inventoryTransactionManager") public I replace(String id, I businessInstance, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
replace
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
replace
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
replaceAll
@Transactional("inventoryTransactionManager") public List<I> replaceAll(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> replacements, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
replaceAll
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
replaceAll
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
replaceAllAllowingPartialSuccess
@Transactional("inventoryTransactionManager") public com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I> replaceAllAllowingPartialSuccess(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> replacements, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
replaceAllAllowingPartialSuccess
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
replaceAllAllowingPartialSuccess
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
validateAllSkuInventoryModificationsAndThrowIfError
protected void validateAllSkuInventoryModificationsAndThrowIfError(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> changes, List<com.broadleafcommerce.data.tracking.core.service.Update<I>> successfullyValidated, com.broadleafcommerce.data.tracking.core.context.ContextInfo context, boolean useReplaceSemantics) -
validateAllSkuInventoryModifications
protected List<com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse.PersistenceFailure<I>> validateAllSkuInventoryModifications(List<com.broadleafcommerce.data.tracking.core.service.Update<I>> changes, List<com.broadleafcommerce.data.tracking.core.service.Update<I>> successfullyValidated, com.broadleafcommerce.data.tracking.core.context.ContextInfo context, boolean useReplaceSemantics) -
validateSingleSkuInventoryModifications
-
validateSkuInventoryModifications
protected void validateSkuInventoryModifications(@NonNull I current, @NonNull I changed, @NonNull org.springframework.validation.Errors errors, boolean useReplaceSemantics) Perform any validations onchanged
with consideration to the current state incurrent
.- Parameters:
current
- the entity instance as it exists in the data store nowchanged
- the changed entity instance representing the update/replace that will be appliederrors
- the errors object on which to register errorsuseReplaceSemantics
- whether or not to consider null values inchanged
as changed. If true, null values will be considered as changed. If false, null values will be considered as unchanged. This matters, since in operations likeCrudEntityService.update(String, Object, ContextInfo)
, a null field value will be ignored and not applied to the entity as a change. However, in operations likeCrudEntityService.replace(String, Object, ContextInfo)
, all values (null or not) are applied to the entity as a change. This hint enables proper validation behavior in each of these flows.
-
create
public I create(I businessInstance, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
create
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
create
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
updateSerializedInventorySkuRefBasedOnParent
protected I updateSerializedInventorySkuRefBasedOnParent(@NonNull I businessInstance, @NonNull I parent) Updates theSkuInventory.getSkuRef()
of a serialized inventory based on its parent. -
createAll
public List<I> createAll(List<I> businessInstances, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
createAll
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
createAll
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
createAllAllowingPartialSuccess
public com.broadleafcommerce.data.tracking.core.service.BulkPersistenceResponse<I> createAllAllowingPartialSuccess(List<I> businessInstances, com.broadleafcommerce.data.tracking.core.context.ContextInfo context) - Specified by:
createAllAllowingPartialSuccess
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
createAllAllowingPartialSuccess
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
postProcessSkuInventoryCreation
protected void postProcessSkuInventoryCreation(@NonNull I created, @NonNull @NonNull Optional<I> maybeParent, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Perform any additional handling after aSkuInventory
has been created.By default, it and notifies stock change.
- Parameters:
created
- the createdSkuInventory
contextInfo
- context information surrounding sandboxing and multitenant state
-
updateParentHasChildrenFlag
protected void updateParentHasChildrenFlag(@NonNull I inventory, @NonNull @NonNull Optional<I> maybeParent, boolean hasChildrenFlagToSet, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Sets theSkuInventory.hasChildren()
flag for the parent if the givenSkuInventory
is serialized.- Parameters:
inventory
- theSkuInventory
to update the parent formaybeParent
- the optional of already-fetched parentSkuInventory
hasChildrenFlagToSet
- theSkuInventory.hasChildren()
flag to setcontextInfo
- context information surrounding sandboxing and multitenant state
-
updateHasChildrenFlagIfSerializedInventoryExists
protected void updateHasChildrenFlagIfSerializedInventoryExists(@NonNull I inventory, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Sets theSkuInventory.hasChildren()
flag if a child inventory exists.- Parameters:
inventory
- theSkuInventory
to check and update the flag forcontextInfo
- context information surrounding sandboxing and multitenant state
-
notifyStockChangeForCreate
protected void notifyStockChangeForCreate(@NonNull I created, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Notifies stock change after creating aSkuInventory
.- Parameters:
created
- the createdSkuInventory
contextInfo
- context information surrounding sandboxing and multitenant state
-
delete
- Specified by:
delete
in interfacecom.broadleafcommerce.data.tracking.core.service.CrudEntityService<I extends SkuInventory>
- Overrides:
delete
in classcom.broadleafcommerce.data.tracking.core.service.BaseCrudEntityService<I extends SkuInventory>
-
validateHasNoChildrenBeforeDeletion
protected void validateHasNoChildrenBeforeDeletion(@NonNull I toDelete, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Validates that theSkuInventory
being deleted has no children.- Parameters:
toDelete
- theSkuInventory
being deletedcontextInfo
- context information surrounding sandboxing and multitenant state- Throws:
UnsupportedOperationException
- if there are still child inventories
-
postProcessSkuInventoryDeletion
protected void postProcessSkuInventoryDeletion(@NonNull I deleted, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Perform any additional handling after aSkuInventory
has been deleted.- Parameters:
deleted
- the deletedSkuInventory
contextInfo
- context information surrounding sandboxing and multitenant state
-
notifyStockChangeForDelete
protected void notifyStockChangeForDelete(@NonNull I deleted, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Notifies stock change after deleting aSkuInventory
.- Parameters:
deleted
- the deletedSkuInventory
contextInfo
- context information surrounding sandboxing and multitenant state
-
resolveInventoryReservationRequestType
-
getUpdateComparator
protected Comparator<com.broadleafcommerce.data.tracking.core.service.Update<I>> getUpdateComparator()Provides aComparator
for sortingUpdate
instances. This is mostly used for updateAll and updateAllAllowingPartialSuccess. The default simply comparesUpdate.getId()
, which is how queries are sorted that apply locks. This is to prevent deadlocking when updating these one at a time (e.g. in anIterator
. This method allows someone to override the comparator, but this will generally be unnecessary.- Returns:
-
getSkuInventoryAvailabilityStrategy
protected SkuInventoryAvailabilityStrategy<I> getSkuInventoryAvailabilityStrategy(@Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Allows for context-specific selection of a strategy for finding inventory availability for browsing and reservation.- Parameters:
contextInfo
-- Returns:
-
resolveSkuInventoryFulfillmentType
Takes a String value and resolves it to an instance ofSkuInventoryFulfillmentType
.- Parameters:
value
-- Returns:
-
getSkuInventoryRepository
@NonNull protected SkuInventoryRepository<com.broadleafcommerce.data.tracking.core.Trackable> getSkuInventoryRepository() -
getInventoryLocationService
-
getSkuInventoryAdjustmentService
-
getDomainMapperManager
@NonNull protected com.broadleafcommerce.data.tracking.core.mapping.DomainMapperManager getDomainMapperManager() -
getSkuFieldReferenceTypeUtility
-
getSkuInventoryReservationRequestValidator
@NonNull protected SkuInventoryReservationRequestValidator getSkuInventoryReservationRequestValidator() -
getStockChangeNotificationService
-
getInventoryTransactionService
@NonNull protected InventoryTransactionService<InventoryTransaction> getInventoryTransactionService() -
getTypeFactory
protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory() -
setTypeFactory
@Autowired public void setTypeFactory(com.broadleafcommerce.common.extension.TypeFactory typeFactory)
-