Class DefaultPriceInfoService

    • Field Detail

      • DEFAULT_PRICE_LIST_TYPES

        protected static final List<String> DEFAULT_PRICE_LIST_TYPES
    • Constructor Detail

      • DefaultPriceInfoService

        public DefaultPriceInfoService​(PriceDataService<PriceData> priceDataService,
                                       com.broadleafcommerce.rulesengine.expression.service.RuleEvaluationService ruleEvaluationService,
                                       PriceableFieldProperties priceableFields,
                                       PriceListService<PriceList> priceListService,
                                       com.broadleafcommerce.data.tracking.core.mapping.validation.EntityValidator validator,
                                       com.broadleafcommerce.common.extension.TypeFactory typeFactory)
    • Method Detail

      • retrievePriceInfosByPriceContext

        @Transactional("pricingTransactionManager")
        public org.springframework.data.domain.Page<com.broadleafcommerce.pricing.client.domain.PriceInfo> retrievePriceInfosByPriceContext​(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                                                                                                            com.broadleafcommerce.pricing.client.domain.context.PriceContext priceContext,
                                                                                                                                            com.broadleafcommerce.pricing.client.domain.context.PriceInfoContext priceInfoContext)
        Description copied from interface: PriceInfoService

        First retrieves the PriceListRefs for the PriceContext then retrieves the PriceInfo associated thereto.

        Calls PriceInfoService.retrievePriceInfosByPriceLists(ContextInfo, PriceInfoContext)

        Specified by:
        retrievePriceInfosByPriceContext in interface PriceInfoService
      • updateContextInfoCurrency

        protected void updateContextInfoCurrency​(List<PriceList> priceLists,
                                                 com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      • retrievePriceInfosByPriceLists

        public org.springframework.data.domain.Page<com.broadleafcommerce.pricing.client.domain.PriceInfo> retrievePriceInfosByPriceLists​(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                                                                                                          com.broadleafcommerce.pricing.client.domain.context.PriceInfoContext priceInfoContext)
        Description copied from interface: PriceInfoService
        Retrieves PriceData for the provided PriceInfoContext.getPriceLists() and PriceInfoContext.getPriceableTargets(), then translates them into a list of PriceInfo.
        Specified by:
        retrievePriceInfosByPriceLists in interface PriceInfoService
      • retrievePriceInfosByPriceLists

        protected org.springframework.data.domain.Page<com.broadleafcommerce.pricing.client.domain.PriceInfo> retrievePriceInfosByPriceLists​(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                                                                                                             com.broadleafcommerce.pricing.client.domain.context.PriceInfoContext priceInfoContext,
                                                                                                                                             List<PriceList> priceLists)
      • modifyPriceContext

        protected void modifyPriceContext​(com.broadleafcommerce.pricing.client.domain.context.PriceContext priceContext)
        Extend this if you want to modify the provided price context, for example removing certain attributes for security reasons. Left blank by default.
      • prepareEligiblePriceLists

        protected List<PriceList> prepareEligiblePriceLists​(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                            com.broadleafcommerce.pricing.client.domain.context.PriceInfoContext priceInfoContext)
        Reads all priceLists that are in scope for the priceInfo request and splits them in
        Parameters:
        contextInfo -
        priceInfoContext -
        Returns:
      • getPriceListTypes

        protected List<String> getPriceListTypes()
      • getPriceListAndTargetPriceDataMap

        protected Map<org.apache.commons.lang3.tuple.Pair<String,​com.broadleafcommerce.pricing.client.domain.PriceableTargetRef>,​PriceData> getPriceListAndTargetPriceDataMap​(com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                                                                                                                                                          Set<com.broadleafcommerce.pricing.client.domain.PriceableTarget> priceableTargets,
                                                                                                                                                                                          List<PriceList> priceLists)
      • getPriceKey

        protected String getPriceKey​(String type)
      • putPricesForType

        protected void putPricesForType​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                        com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                        Map<String,​List<PriceList>> listsByType,
                                        String type,
                                        PriceableTargetPriceState priceState)
      • getPriceFromPriceData

        protected Optional<javax.money.MonetaryAmount> getPriceFromPriceData​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                                             String priceListId,
                                                                             PriceableTargetPriceState priceState)
      • getPriceFromModifier

        protected Optional<javax.money.MonetaryAmount> getPriceFromModifier​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                                            PriceList priceList,
                                                                            PriceableTargetPriceState priceState,
                                                                            com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      • getPriceModifierForTarget

        protected Optional<PriceModifier> getPriceModifierForTarget​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                                    PriceList priceList,
                                                                    PriceableTargetPriceState priceState,
                                                                    com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      • performOtherOperation

        protected javax.money.MonetaryAmount performOtherOperation​(String modificationType,
                                                                   BigDecimal modificationAmount,
                                                                   javax.money.MonetaryAmount baseAmount)
        Extension point for performing custom PriceModifier operations
      • getPriceFromElsewhere

        protected Optional<javax.money.MonetaryAmount> getPriceFromElsewhere​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                                             PriceList priceList,
                                                                             com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Extension point for getting price from somewhere other than a price data or modifier before defaulting to the base price on the target.
      • getTargetsBaseDetails

        @NonNull
        protected Map<String,​com.broadleafcommerce.pricing.client.domain.PriceDetail> getTargetsBaseDetails​(@NonNull @NonNull
                                                                                                                  @NonNull com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                                                                                  @Nullable
                                                                                                                  com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Builds a map of PriceDetails for each field of PriceableTarget.getPriceableFields() where the key is the type.
        Parameters:
        target - The PriceableTarget
        contextInfo - Additional tenant and sandbox info
        Returns:
        A map of PriceDetails for each field of target#priceableFields where the key is the type.
      • getBasePrice

        @Nullable
        protected javax.money.MonetaryAmount getBasePrice​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                          com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      • getBaseCost

        @Nullable
        protected javax.money.MonetaryAmount getBaseCost​(com.broadleafcommerce.pricing.client.domain.PriceableTarget target,
                                                         com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      • putBestPriceForType

        protected void putBestPriceForType​(String type,
                                           String priceKey,
                                           PriceableTargetPriceState priceState)
        Records the highest-priority best (lowest) price for the price list type out of all the matches found.
      • formatPrice

        protected String formatPrice​(javax.money.MonetaryAmount price)
        Helper method to format a MonetaryAmount as a price string
      • getBestPriceForType

        protected Optional<com.broadleafcommerce.pricing.client.domain.PriceDetail> getBestPriceForType​(Map<PriceList,​javax.money.MonetaryAmount> pricesMap)
        Picks the best (lowest) price for the price list type out of all the matches found.
      • noCurrency

        public boolean noCurrency​(AtomicReference<javax.money.MonetaryAmount> refAmount)
      • getBestPriceOverall

        protected com.broadleafcommerce.pricing.client.domain.PriceDetail getBestPriceOverall​(@Nullable
                                                                                              Map<String,​com.broadleafcommerce.pricing.client.domain.PriceDetail> prices,
                                                                                              @Nullable
                                                                                              Currency defaultCurrency)
        Retrieves all of the PriceableFieldTypes in ascending order by PriceableFieldType.order(). Then, returns a PriceDetail for the best price found for the type.

        Out of the box, if a price with currency matching the default is found, we want to prioritize that. Otherwise, the lowest price is chosen.

        If there are more than one price that are equal to the lowest price (i.e. standard and sale price are equally the lowest), then we want to prioritize whichever PriceDetail that is not a sale price.

        Parameters:
        prices - map of price type (e.g., standardPrice, salePrice, contractPrice) to its corresponding PriceDetail
        defaultCurrency - default currency in the current context
        Returns:
        PriceDetail for the best price found
      • isEqualPrice

        protected boolean isEqualPrice​(com.broadleafcommerce.pricing.client.domain.PriceDetail priceDetail1,
                                       com.broadleafcommerce.pricing.client.domain.PriceDetail priceDetail2)
        Checks if the given PriceDetails have the same price.
        Parameters:
        priceDetail1 - the first PriceDetail to compare
        priceDetail2 - the second PriceDetail to compare
        Returns:
        true if both PriceDetails have the same price, otherwise false
      • isSalePrice

        protected boolean isSalePrice​(com.broadleafcommerce.pricing.client.domain.PriceDetail priceDetail)
        Checks if the given PriceDetail is of type PriceableFieldType.SALE_PRICE.
        Parameters:
        priceDetail - the PriceDetail to check against
        Returns:
        true of the given PriceDetail is of type PriceableFieldType.SALE_PRICE, otherwise false
      • addPriceInfoForTarget

        protected void addPriceInfoForTarget​(List<com.broadleafcommerce.pricing.client.domain.PriceInfo> priceInfos,
                                             com.broadleafcommerce.pricing.client.domain.PriceableTarget priceableTarget,
                                             com.broadleafcommerce.pricing.client.domain.PriceDetail bestPriceDetail,
                                             PriceableTargetPriceState priceState,
                                             boolean skipDetails)
        Uses the best price detail found for the target and creates a PriceInfo for it. Then, adds PriceTypeDetails for each type of price found. Optionally, this also adds PriceDetails for all candidate prices found besides the best one, if skipDetails == false.
        Parameters:
        priceInfos - The current list of PriceInfos into which to add a new PriceInfo.
        priceableTarget - The PriceableTarget for which the new PriceInfo corresponds.
        bestPriceDetail - The PriceDetail of the best overall price from amongst all types of prices.
        priceState - The current PriceableTargetPriceState with fall the important pricing info discovered for the targets.
        skipDetails - Whether to not include PriceDetails in the PriceInfo
      • addPriceTypeDetail

        protected void addPriceTypeDetail​(com.broadleafcommerce.pricing.client.domain.PriceInfo priceInfo,
                                          String type,
                                          com.broadleafcommerce.pricing.client.domain.PriceDetail detail)
      • addPriceDetail

        protected void addPriceDetail​(com.broadleafcommerce.pricing.client.domain.PriceInfo priceInfo,
                                      PriceList priceList,
                                      javax.money.MonetaryAmount price,
                                      Map<String,​List<PriceDataTier>> priceTiers)
      • populatePriceDataTierRef

        protected com.broadleafcommerce.pricing.client.domain.PriceDataTierRef populatePriceDataTierRef​(PriceDataTier priceDataTier)
      • getErrors

        protected org.springframework.validation.Errors getErrors​(com.broadleafcommerce.pricing.client.domain.context.PriceInfoContext priceInfoContext)
        Parameters:
        priceInfoContext - The price info context to bind an errors object to.
        Returns:
        An errors object bound to priceInfoContext
      • getRuleEvaluationService

        protected com.broadleafcommerce.rulesengine.expression.service.RuleEvaluationService getRuleEvaluationService()
      • getValidator

        protected com.broadleafcommerce.data.tracking.core.mapping.validation.EntityValidator getValidator()
      • getTypeFactory

        protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory()