Class CartItemPricingUtils


  • public class CartItemPricingUtils
    extends Object
    Utility to aid in pricing CartItems.
    Author:
    Chad Harchar (charchar), Nathan Moore (nathandmoore)
    • Constructor Summary

      Constructors 
      Constructor Description
      CartItemPricingUtils​(CartItemPriceableTargetUtils cartItemPriceableTargetUtils, com.fasterxml.jackson.databind.ObjectMapper mapper, com.broadleafcommerce.common.extension.TypeFactory factory)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void attachBundleItemProratedPrices​(List<com.broadleafcommerce.cart.client.domain.CartItem> dependentCartItems, Map<String,​javax.money.MonetaryAmount> roundedDependentItemProratedPrice, javax.money.CurrencyUnit expectedCurrency)  
      protected void calculateAndAttachBundleItemProratedPrices​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem bundleCartItem, @NonNull javax.money.CurrencyUnit expectedCurrency)  
      void calculateAndAttachBundleItemProratedPrices​(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Calculates the prorated prices for the dependent cart items based on the bundle item total price.
      protected Map<String,​javax.money.MonetaryAmount> calculateBundleDependentItemPriceProration​(com.broadleafcommerce.cart.client.domain.CartItem bundleCartItem, javax.money.CurrencyUnit expectedCurrency, javax.money.MonetaryAmount bundleTotalAmount)  
      protected javax.money.MonetaryAmount calculateBundleDependentItemProratedPrice​(com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem, javax.money.MonetaryAmount bundleSubtotal, javax.money.MonetaryAmount dependentItemsTotal, javax.money.CurrencyUnit expectedCurrency)  
      protected com.broadleafcommerce.order.common.domain.Adjustment createBundleDependentItemAdjustment​(javax.money.MonetaryAmount adjustmentAmount)  
      <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Optional<P>
      determineMatchingPriceInfo​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull Collection<P> priceInfos)
      Determines the matching PriceInfo for a CartItem from among the given priceInfos.
      <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Optional<P>
      determineMatchingPriceInfo​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull Collection<P> priceInfos, String variantId)
      Determines the matching PriceInfo for a CartItem from among the given priceInfos.
      protected CartItemPriceableTargetUtils getCartItemPriceableTargetUtils()  
      protected com.broadleafcommerce.common.extension.TypeFactory getFactory()  
      protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getItemChoiceTarget​(com.broadleafcommerce.cart.client.domain.DependentItemDetails details, String vendorRef, int quantity)
      Builds a PriceableTarget for the parent ItemChoice of a dependent CartItem representing a SpecificItemChoice.
      protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Optional<P>
      getItemPriceInfo​(com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem)  
      protected com.fasterxml.jackson.databind.ObjectMapper getMapper()  
      Set<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getPriceableTargets​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, Map<String,​Integer> totalQuantityForTargetId)
      Builds the PriceableTargets for the given CartItem and its dependents.
      protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Optional<P>
      getPriceInfoForDependentItem​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull Collection<P> priceInfos)
      Determines the matching PriceInfo for a dependent CartItem.
      protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Optional<P>
      getPriceInfoForDependentItem​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull Collection<P> priceInfos, String variantId)
      Determines the matching PriceInfo for a dependent CartItem.
      protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo>
      Map<String,​P>
      getPriceInfos​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)  
      protected Object getProductType​(com.broadleafcommerce.cart.client.domain.CartItem cartItem)  
      protected CartPricingRoundingHelper getRoundingHelper()  
      protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getSpecificChoiceTarget​(@NonNull com.broadleafcommerce.cart.client.domain.DependentItemDetails details, String vendorRef, int quantity)
      Builds a PriceableTarget for a dependent CartItem.
      protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getSpecificChoiceVariantOverrideTarget​(@NonNull com.broadleafcommerce.cart.client.domain.SpecificItemChoiceVariantPricingOverride override, String vendorRef, int quantity)  
      protected List<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getTargetsForDependentItem​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, @NonNull Map<String,​Integer> totalQuantityForTargetId, String parentCartItemVariantId)
      Builds the list of PriceableTargets for the given dependent CartItem.
      protected List<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getTargetsForDependentItem​(@NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem, Map<String,​Integer> totalQuantityForTargetId)
      Builds the list of PriceableTargets for the given dependent CartItem.
      void setRoundingHelper​(CartPricingRoundingHelper roundingHelper)  
    • Constructor Detail

      • CartItemPricingUtils

        public CartItemPricingUtils​(CartItemPriceableTargetUtils cartItemPriceableTargetUtils,
                                    com.fasterxml.jackson.databind.ObjectMapper mapper,
                                    com.broadleafcommerce.common.extension.TypeFactory factory)
    • Method Detail

      • getPriceableTargets

        public Set<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getPriceableTargets​(@NonNull
                                                                                                    @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                    Map<String,​Integer> totalQuantityForTargetId)
        Builds the PriceableTargets for the given CartItem and its dependents.
        Parameters:
        cartItem - CartItem for which to build PriceableTargets
        totalQuantityForTargetId - A map of the SKU or pricing key of an underlying item from a cart item to the total quantity of that item across all cart items.
        Returns:
        the PriceableTargets for cartItem and its dependents.
      • determineMatchingPriceInfo

        public <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Optional<P> determineMatchingPriceInfo​(@NonNull
                                                                                                                        @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                                        @NonNull
                                                                                                                        @NonNull Collection<P> priceInfos)
        Determines the matching PriceInfo for a CartItem from among the given priceInfos.
        Type Parameters:
        P - The type of the PriceInfo in the collection
        Parameters:
        cartItem - The CartItem for which to determine a PriceInfo
        priceInfos - Collection of PriceInfos from which to choose a match
        Returns:
        The matching PriceInfo for cartItem.
      • determineMatchingPriceInfo

        public <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Optional<P> determineMatchingPriceInfo​(@NonNull
                                                                                                                        @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                                        @NonNull
                                                                                                                        @NonNull Collection<P> priceInfos,
                                                                                                                        @Nullable
                                                                                                                        String variantId)
        Determines the matching PriceInfo for a CartItem from among the given priceInfos. When given a variantId, this will prioritize a PriceInfo for a variant override pricing if it exists.
        Type Parameters:
        P - The type of the PriceInfo in the collection
        Parameters:
        cartItem - The CartItem for which to determine a PriceInfo
        priceInfos - Collection of PriceInfos from which to choose a match
        variantId - The variant ID of a parent CartItem, if it exists
        Returns:
        The matching PriceInfo for cartItem.
      • calculateAndAttachBundleItemProratedPrices

        public void calculateAndAttachBundleItemProratedPrices​(com.broadleafcommerce.cart.client.domain.Cart cart,
                                                               @Nullable
                                                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Calculates the prorated prices for the dependent cart items based on the bundle item total price. For example, item 1: $6 and item 2: $4, then item 1 takes 60% of the bundle price and item 2 takes 40%. It creates an item adjustment that represents the normal merchandise total minus the prorated merchandise total. For example: unitPrice = $5 | quantity = 2 | proratedMerchTotal = $8 >> item adjustment of $2 (ie = ($5 * 2) - $8) This method also rounds the prorated prices using CartPricingRoundingHelper.roundListOfMonetaryAmounts(java.util.Map, javax.money.MonetaryAmount, javax.money.CurrencyUnit) to the bundle total to add the remainder unit amounts. This prevents the situation e.g when the bundle total is $40 but the sum of the prorated item prices is $39.99.
        Parameters:
        cart - the cart that contains the bundle products to calculate the prorated price
      • getProductType

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

        protected void calculateAndAttachBundleItemProratedPrices​(@NonNull
                                                                  @NonNull com.broadleafcommerce.cart.client.domain.CartItem bundleCartItem,
                                                                  @NonNull
                                                                  @NonNull javax.money.CurrencyUnit expectedCurrency)
      • calculateBundleDependentItemPriceProration

        protected Map<String,​javax.money.MonetaryAmount> calculateBundleDependentItemPriceProration​(com.broadleafcommerce.cart.client.domain.CartItem bundleCartItem,
                                                                                                          javax.money.CurrencyUnit expectedCurrency,
                                                                                                          javax.money.MonetaryAmount bundleTotalAmount)
      • attachBundleItemProratedPrices

        protected void attachBundleItemProratedPrices​(List<com.broadleafcommerce.cart.client.domain.CartItem> dependentCartItems,
                                                      Map<String,​javax.money.MonetaryAmount> roundedDependentItemProratedPrice,
                                                      javax.money.CurrencyUnit expectedCurrency)
      • createBundleDependentItemAdjustment

        protected com.broadleafcommerce.order.common.domain.Adjustment createBundleDependentItemAdjustment​(javax.money.MonetaryAmount adjustmentAmount)
      • getItemPriceInfo

        protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Optional<P> getItemPriceInfo​(com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem)
      • getPriceInfos

        protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Map<String,​P> getPriceInfos​(@NonNull
                                                                                                                      @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      • calculateBundleDependentItemProratedPrice

        protected javax.money.MonetaryAmount calculateBundleDependentItemProratedPrice​(com.broadleafcommerce.cart.client.domain.CartItem dependentCartItem,
                                                                                       javax.money.MonetaryAmount bundleSubtotal,
                                                                                       javax.money.MonetaryAmount dependentItemsTotal,
                                                                                       javax.money.CurrencyUnit expectedCurrency)
      • getPriceInfoForDependentItem

        protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Optional<P> getPriceInfoForDependentItem​(@NonNull
                                                                                                                             @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                                             @NonNull
                                                                                                                             @NonNull Collection<P> priceInfos)
        Determines the matching PriceInfo for a dependent CartItem.
        1. It checks its AdditionalItemPricing from among the given priceInfos.
        2. Then, it checks based on its parent ItemChoice's pricing in the DependentItemDetails.
        Type Parameters:
        P - The type of the PriceInfo in the collection
        Parameters:
        cartItem - The dependent CartItem for which to determine a PriceInfo
        priceInfos - Collection of PriceInfos from which to choose a match
        Returns:
        The matching PriceInfo for cartItem.
      • getPriceInfoForDependentItem

        protected <P extends com.broadleafcommerce.pricing.client.domain.PriceInfo> Optional<P> getPriceInfoForDependentItem​(@NonNull
                                                                                                                             @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                                             @NonNull
                                                                                                                             @NonNull Collection<P> priceInfos,
                                                                                                                             @Nullable
                                                                                                                             String variantId)
        Determines the matching PriceInfo for a dependent CartItem.
        1. It checks based on its DependentItemDetails.getVariantPricing() for an override price that matches the parent CartItem's Variant if present.
        2. Then, it checks its AdditionalItemPricing from among the given priceInfos.
        3. Finally, it checks based on its parent ItemChoice's pricing in the DependentItemDetails.
        Type Parameters:
        P - The type of the PriceInfo in the collection
        Parameters:
        cartItem - The dependent CartItem for which to determine a PriceInfo
        priceInfos - Collection of PriceInfos from which to choose a match
        variantId - The variant ID of a parent CartItem, if it exists
        Returns:
        The matching PriceInfo for cartItem.
      • getTargetsForDependentItem

        protected List<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getTargetsForDependentItem​(@NonNull
                                                                                                               @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                               Map<String,​Integer> totalQuantityForTargetId)
        Builds the list of PriceableTargets for the given dependent CartItem. Assumes that the parent CartItem is not based on a variant, e.g., CartItem.getVariantId() is null—otherwise use getTargetsForDependentItem(CartItem, Map, String) to ensure that any override pricing for the dependent cart item (e.g., a warranty) that matches the parent's variant ID is used.
        Parameters:
        cartItem - CartItem for which to build PriceableTargets
        totalQuantityForTargetId - A map of the SKU or pricing key of an underlying item from a cart item to the total quantity of that item across all cart items.
        Returns:
        The PriceableTargets for cartItem
      • getTargetsForDependentItem

        protected List<com.broadleafcommerce.pricing.client.domain.PriceableTarget> getTargetsForDependentItem​(@NonNull
                                                                                                               @NonNull com.broadleafcommerce.cart.client.domain.CartItem cartItem,
                                                                                                               @NonNull
                                                                                                               @NonNull Map<String,​Integer> totalQuantityForTargetId,
                                                                                                               @Nullable
                                                                                                               String parentCartItemVariantId)
        Builds the list of PriceableTargets for the given dependent CartItem.
        Parameters:
        cartItem - CartItem for which to build PriceableTargets
        totalQuantityForTargetId - A map of the SKU or pricing key of an underlying item from a cart item to the total quantity of that item across all cart items.
        parentCartItemVariantId - The ID of the Variant of the parent CartItem if CartItem.getVariantId() is present. This can affect the pricing of the dependent item.
        Returns:
        The PriceableTargets for cartItem
      • getItemChoiceTarget

        protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getItemChoiceTarget​(com.broadleafcommerce.cart.client.domain.DependentItemDetails details,
                                                                                                  String vendorRef,
                                                                                                  int quantity)
        Builds a PriceableTarget for the parent ItemChoice of a dependent CartItem representing a SpecificItemChoice.
        Parameters:
        details - The DependentItemDetails of the dependent CartItem
        vendorRef - The vendorRef
        quantity - The quantity of the dependent CartItem
        Returns:
        A PriceableTarget for the parent ItemChoice of a dependent CartItem representing a SpecificItemChoice.
      • getSpecificChoiceTarget

        protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getSpecificChoiceTarget​(@NonNull
                                                                                                      @NonNull com.broadleafcommerce.cart.client.domain.DependentItemDetails details,
                                                                                                      @Nullable
                                                                                                      String vendorRef,
                                                                                                      int quantity)
        Builds a PriceableTarget for a dependent CartItem.
        Parameters:
        details - The DependentItemDetails of the dependent CartItem
        vendorRef - The vendorRef
        quantity - The quantity of the dependent CartItem
        Returns:
        A PriceableTarget for a dependent CartItem.
      • getSpecificChoiceVariantOverrideTarget

        protected com.broadleafcommerce.pricing.client.domain.PriceableTarget getSpecificChoiceVariantOverrideTarget​(@NonNull
                                                                                                                     @NonNull com.broadleafcommerce.cart.client.domain.SpecificItemChoiceVariantPricingOverride override,
                                                                                                                     @Nullable
                                                                                                                     String vendorRef,
                                                                                                                     int quantity)
      • getMapper

        protected com.fasterxml.jackson.databind.ObjectMapper getMapper()
      • getFactory

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