Class DefaultQualifierAndTargetMarker
java.lang.Object
com.broadleafcommerce.promotion.offer.service.engine.application.processor.helper.item.DefaultQualifierAndTargetMarker
- All Implemented Interfaces:
QualifierAndTargetMarker
- Author:
- Nathan Moore (nathanmoore).
-
Constructor Summary
ConstructorDescriptionDefaultQualifierAndTargetMarker
(com.broadleafcommerce.common.extension.TypeFactory offerFactory) DefaultQualifierAndTargetMarker
(com.broadleafcommerce.common.extension.TypeFactory offerFactory, org.springframework.context.MessageSource messageSource, PotentialSavingsCalculator potentialSavingsCalculator) -
Method Summary
Modifier and TypeMethodDescriptionprotected void
assertCandidateOfferNotNull
(CandidateItemOffer candidateOffer) protected void
assertCommonParamsNotNull
(EnhancedOrder order, CandidateItemOffer candidateOffer) protected List<LineItemOfferDetail>
buildOfferDetailList
(Collection<? extends EnhancedLineItem> orderLineItems) protected javax.money.MonetaryAmount
protected void
clearAllNonFinalizedQuantities
(List<LineItemOfferDetail> lineItemOfferDetails) protected com.broadleafcommerce.promotion.offer.client.web.context.discounts.CodeResponse
createCodeResponse
(OfferNotAppliedReasonEnum notUsedReason) protected void
finalizeQuantities
(List<LineItemOfferDetail> lineItemOfferDetails) protected EnhancedLineItem
findRelatedQualifierRootAncestor
(EnhancedLineItem relatedQualifier) Repeatedly callsEnhancedOrderLineItem.getParent()
until finding the root parent (i.e., an item with no parent) of theitem qualifier
that needs to be related (e.g., ancestor or descendant) to its targets.protected org.springframework.context.MessageSource
protected PotentialSavingsCalculator
protected ItemCriteriaRule
getPreviousItemCriteria
(LineItemOfferDetail detail, Offer offer) protected List<LineItemOfferDetail>
getSortedItemOfferDetails
(Offer offer, Collection<? extends EnhancedLineItem> orderLineItems, boolean isForQualifiers) protected Optional<javax.money.MonetaryAmount>
handleMaxItemSavingsPerOrder
(CandidateItemOffer itemOffer, EnhancedOrder order, boolean isForFulfillment, javax.money.MonetaryAmount runningAdjustmentsTotal) Calculates the currentIterationSavings.protected boolean
isItemRelatedToQualifier
(EnhancedLineItem relatedQualifierRootAncestor, LineItemOfferDetail offerDetail) protected void
logIfDebugOn
(String message, Object... formatArgs) Checks ifdebug is enabled
, then wraps the message inString.format(String, Object...)
with the givenformatArgs
and logs it.protected void
logIfTraceOn
(String message, Object... formatArgs) Checks ifLog.isTraceEnabled()
debug is enabled}, then wraps the message inString.format(String, Object...)
with the givenformatArgs
and logs it.protected boolean
markAllQualifiers
(CandidateItemOffer itemOffer) Marks which items are qualifiers for eachOffer.getItemQualifierCriteria()
protected boolean
markAllTargets
(CandidateItemOffer itemOffer, EnhancedLineItem relatedQualifier, boolean checkOnly) Marks all the items that match aOffer.getTargetItemCriteria()
.void
markQualifiersAndTargets
(EnhancedOrder order, CandidateItemOffer itemOffer, boolean isForFulfillment) MarksEnhancedOrder.getOrderLineItems()
as either targets or qualifiers for a givenCandidateItemOffer
.protected int
markQualifiersForSingleCriteria
(CandidateItemOffer itemOffer, ItemCriteriaRule itemCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks all the qualifiers for a singleOffer.getItemQualifierCriteria()
.protected boolean
Marks item qualifiers and the target items they qualify for anoffer's
discount to ensure that all qualifiers have targets and vice versa.protected org.apache.commons.lang3.tuple.Pair<EnhancedLineItem,
Integer> markRelatedQualifiersAndTargetsForItemCriteria
(CandidateItemOffer itemOffer, ItemCriteriaRule qualifierCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks item qualifiers and the target items they qualify for a singleOffer.getItemQualifierCriteria()
to ensure that all qualifiers have targets and vice versa.protected int
markSingleTargetForItemCriteria
(LineItemOfferDetail offerDetail, CandidateItemOffer itemOffer, ItemCriteriaRule targetCriteria, int targetQtyNeeded, boolean checkOnly) Marks a single item as a target of a singleOffer.getTargetItemCriteria()
protected int
markTargetsForCriteria
(CandidateItemOffer itemOffer, EnhancedLineItem relatedQualifier, boolean checkOnly, ItemCriteriaRule targetCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks the targets related to the provideditem qualifier
(relatedQualifier
) to ensure that there are enough to use for the qualifier'sOffer
.protected void
rollbackQualifierMarkageBecauseMissingTarget
(OfferQualifier offerQualifier, int qtyToMarkAsQualifier, LineItemOfferDetail detail, ItemCriteriaRule previousQualifierCriteria) Undoes marking qualifiers because there were no matching targets.void
setMessageSource
(org.springframework.context.MessageSource messageSource) void
setPotentialSavingsCalculator
(PotentialSavingsCalculator potentialSavingsCalculator) protected void
sortOfferDetailsForQualifiers
(List<LineItemOfferDetail> offerDetails, boolean useSalePrice) SortsLineItemOfferDetails
in preparation for marking qualifier items for offers.protected void
sortOfferDetailsForTargets
(List<LineItemOfferDetail> offerDetails, boolean useSalePrice, String targetGroupingStrategy) SortsLineItemOfferDetails
in preparation for marking targets items for offers.protected void
storeNonFinalizedQuantities
(List<LineItemOfferDetail> lineItemOfferDetails, CandidateItemOffer itemOffer) protected void
updateReasonResponses
(EnhancedOrder order, CandidateItemOffer itemOffer, boolean qualifiersFound)
-
Constructor Details
-
DefaultQualifierAndTargetMarker
public DefaultQualifierAndTargetMarker(com.broadleafcommerce.common.extension.TypeFactory offerFactory) -
DefaultQualifierAndTargetMarker
public DefaultQualifierAndTargetMarker(com.broadleafcommerce.common.extension.TypeFactory offerFactory, org.springframework.context.MessageSource messageSource, PotentialSavingsCalculator potentialSavingsCalculator)
-
-
Method Details
-
markQualifiersAndTargets
public void markQualifiersAndTargets(@NonNull EnhancedOrder order, @NonNull CandidateItemOffer itemOffer, boolean isForFulfillment) Description copied from interface:QualifierAndTargetMarker
MarksEnhancedOrder.getOrderLineItems()
as either targets or qualifiers for a givenCandidateItemOffer
. This will generateLineItemOfferDetails
for eachEnhancedLineItem
to keep track of applicableOffers
and their discounts.- Specified by:
markQualifiersAndTargets
in interfaceQualifierAndTargetMarker
- Parameters:
order
- TheEnhancedOrder
whose items are to be marked as qualifiers or targets for the givenCandidateItemOffer
itemOffer
- TheCandidateItemOffer
for which to mark targets and qualifiersisForFulfillment
- whether this calculation should useEnhancedOrder.getFulfillmentLineItems()
instead ofEnhancedOrder.getOrderLineItems()
-
handleMaxItemSavingsPerOrder
protected Optional<javax.money.MonetaryAmount> handleMaxItemSavingsPerOrder(CandidateItemOffer itemOffer, EnhancedOrder order, boolean isForFulfillment, javax.money.MonetaryAmount runningAdjustmentsTotal) Calculates the currentIterationSavings. If max item offer per order has been exceeded, store temporary stuctures with partial savings on the item offer so that theItemOfferProcessor
can add the partial adjustment.- Parameters:
itemOffer
-order
-isForFulfillment
-runningAdjustmentsTotal
-- Returns:
-
calculateEstimatedSavingsForIteration
protected javax.money.MonetaryAmount calculateEstimatedSavingsForIteration(CandidateItemOffer itemOffer) -
storeNonFinalizedQuantities
protected void storeNonFinalizedQuantities(List<LineItemOfferDetail> lineItemOfferDetails, CandidateItemOffer itemOffer) -
updateReasonResponses
protected void updateReasonResponses(EnhancedOrder order, CandidateItemOffer itemOffer, boolean qualifiersFound) -
markRelatedQualifiersAndTargets
Marks item qualifiers and the target items they qualify for an
offer's
discount to ensure that all qualifiers have targets and vice versa.If the candidate offer's
Offer.isRequiresRelatedTargetAndQualifiers()
is true, then a qualifier must be matched to targets that are in its lineage. SeeOffer.isRequiresRelatedTargetAndQualifiers()
for more details.- Parameters:
itemOffer
-candidate offer
with which to calculate potential savings- Returns:
- whether a suitable qualifier-target pair was found and marked.
-
buildOfferDetailList
protected List<LineItemOfferDetail> buildOfferDetailList(Collection<? extends EnhancedLineItem> orderLineItems) - Returns:
- combined list of all the
LineItemOfferDetails
for eachEnhancedLineItem
provided
-
markRelatedQualifiersAndTargetsForItemCriteria
protected org.apache.commons.lang3.tuple.Pair<EnhancedLineItem,Integer> markRelatedQualifiersAndTargetsForItemCriteria(CandidateItemOffer itemOffer, ItemCriteriaRule qualifierCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks item qualifiers and the target items they qualify for a singleOffer.getItemQualifierCriteria()
to ensure that all qualifiers have targets and vice versa. -
getSortedItemOfferDetails
protected List<LineItemOfferDetail> getSortedItemOfferDetails(Offer offer, Collection<? extends EnhancedLineItem> orderLineItems, boolean isForQualifiers) -
sortOfferDetailsForQualifiers
protected void sortOfferDetailsForQualifiers(List<LineItemOfferDetail> offerDetails, boolean useSalePrice) SortsLineItemOfferDetails
in preparation for marking qualifier items for offers. We want these to be sorted in the opposite direction from when we're working with targets because we don't want the most expensive items marked as qualifiers when they could be marked as targets.- Parameters:
offerDetails
-LineItemOfferDetails
to be sorted.useSalePrice
- Whether to sort byEnhancedLineItem.getSalePrice()
instead ofEnhancedLineItem.getStandardPrice()
-
sortOfferDetailsForTargets
protected void sortOfferDetailsForTargets(List<LineItemOfferDetail> offerDetails, boolean useSalePrice, String targetGroupingStrategy) SortsLineItemOfferDetails
in preparation for marking targets items for offers. We want these to be sorted in the opposite direction from when we're working with qualifiers because we don't want the least expensive items marked as targets before we've marked the more expensive ones.This ensures that we maximize the discount since it could be greater the price of a cheaper item and we only discount until we reach a price of 0. Thus in that case, we would not use all of the discount that we could have if we had discounted the more expensive item.
- Parameters:
offerDetails
-LineItemOfferDetails
to be sorted.useSalePrice
- Whether to sort byEnhancedLineItem.getSalePrice()
instead ofEnhancedLineItem.getStandardPrice()
-
getPreviousItemCriteria
-
markAllTargets
protected boolean markAllTargets(CandidateItemOffer itemOffer, EnhancedLineItem relatedQualifier, boolean checkOnly) Marks all the items that match aOffer.getTargetItemCriteria()
.- Parameters:
relatedQualifier
- When provided, is the item qualifier to which targets need to be related- Returns:
- whether there were enough targets to which to match qualifiers
-
findRelatedQualifierRootAncestor
Repeatedly callsEnhancedOrderLineItem.getParent()
until finding the root parent (i.e., an item with no parent) of theitem qualifier
that needs to be related (e.g., ancestor or descendant) to its targets.- Parameters:
relatedQualifier
- Theitem qualifier
that needs to be related to its targets- Returns:
- The root ancestor of the
related qualifier
-
markTargetsForCriteria
protected int markTargetsForCriteria(CandidateItemOffer itemOffer, EnhancedLineItem relatedQualifier, boolean checkOnly, ItemCriteriaRule targetCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks the targets related to the provideditem qualifier
(relatedQualifier
) to ensure that there are enough to use for the qualifier'sOffer
.- Parameters:
itemOffer
- theCandidateItemOffer
from which to find related target itemsrelatedQualifier
- theitem qualifier
that requires the target items it qualifies to be related to it (e.g., ancestor or descendant)checkOnly
- whether to just check if there are enough targets or to actually simulate using the candidate offertargetCriteria
- the singleOffer.getTargetItemCriteria()
that we are using to determine which items are targetsorderLineItems
- thecandidate target items
- Returns:
- how many targets are still needed
-
isItemRelatedToQualifier
protected boolean isItemRelatedToQualifier(EnhancedLineItem relatedQualifierRootAncestor, LineItemOfferDetail offerDetail) - Returns:
- true if the offer detail's item is the same as the relateQualifier's root ancestor, if it's a parent of the relatedQualifier, or if it's a child of the relatedQualifier.
-
markSingleTargetForItemCriteria
protected int markSingleTargetForItemCriteria(LineItemOfferDetail offerDetail, CandidateItemOffer itemOffer, ItemCriteriaRule targetCriteria, int targetQtyNeeded, boolean checkOnly) Marks a single item as a target of a singleOffer.getTargetItemCriteria()
-
rollbackQualifierMarkageBecauseMissingTarget
protected void rollbackQualifierMarkageBecauseMissingTarget(OfferQualifier offerQualifier, int qtyToMarkAsQualifier, LineItemOfferDetail detail, ItemCriteriaRule previousQualifierCriteria) Undoes marking qualifiers because there were no matching targets. -
markAllQualifiers
Marks which items are qualifiers for eachOffer.getItemQualifierCriteria()
-
markQualifiersForSingleCriteria
protected int markQualifiersForSingleCriteria(CandidateItemOffer itemOffer, ItemCriteriaRule itemCriteria, Collection<? extends EnhancedLineItem> orderLineItems) Marks all the qualifiers for a singleOffer.getItemQualifierCriteria()
. -
createCodeResponse
protected com.broadleafcommerce.promotion.offer.client.web.context.discounts.CodeResponse createCodeResponse(OfferNotAppliedReasonEnum notUsedReason) -
finalizeQuantities
-
clearAllNonFinalizedQuantities
-
assertCommonParamsNotNull
-
assertCandidateOfferNotNull
-
logIfDebugOn
Checks ifdebug is enabled
, then wraps the message inString.format(String, Object...)
with the givenformatArgs
and logs it. -
logIfTraceOn
Checks ifLog.isTraceEnabled()
debug is enabled}, then wraps the message inString.format(String, Object...)
with the givenformatArgs
and logs it. -
getMessageSource
protected org.springframework.context.MessageSource getMessageSource() -
setMessageSource
@Autowired public void setMessageSource(org.springframework.context.MessageSource messageSource) -
getPotentialSavingsCalculator
-
setPotentialSavingsCalculator
@Autowired public void setPotentialSavingsCalculator(PotentialSavingsCalculator potentialSavingsCalculator)
-