Class DefaultCartOrderGenerationService<C extends com.broadleafcommerce.cart.client.domain.Cart,O extends com.broadleafcommerce.order.client.domain.Order>

java.lang.Object
com.broadleafcommerce.orderoperation.service.generate.DefaultCartOrderGenerationService<C,O>
Type Parameters:
O - A subtype of Order
All Implemented Interfaces:
CartOrderGenerationService<C,O>

public class DefaultCartOrderGenerationService<C extends com.broadleafcommerce.cart.client.domain.Cart,O extends com.broadleafcommerce.order.client.domain.Order> extends Object implements CartOrderGenerationService<C,O>
Default implementation of CartOrderGenerationService
  • Field Details

    • ORDER_ITEM_TYPE_ATTR

      public static final String ORDER_ITEM_TYPE_ATTR
      See Also:
    • ORDER_ITEM_DEPENDENT_ITEM_DETAILS_ATTR

      public static final String ORDER_ITEM_DEPENDENT_ITEM_DETAILS_ATTR
      See Also:
    • orderProvider

      protected final OrderProvider<O extends com.broadleafcommerce.order.client.domain.Order> orderProvider
  • Constructor Details

    • DefaultCartOrderGenerationService

      public DefaultCartOrderGenerationService(OrderProvider<O> orderProvider, com.broadleafcommerce.common.extension.TypeFactory typeFactory, OrderGenerationProperties properties)
  • Method Details

    • generateOrderFromCart

      public O generateOrderFromCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: CartOrderGenerationService
      Creates and persists a new Order from the given cart if such an order does not already exist or returns the existing Order.
      Specified by:
      generateOrderFromCart in interface CartOrderGenerationService<C extends com.broadleafcommerce.cart.client.domain.Cart,O extends com.broadleafcommerce.order.client.domain.Order>
      Parameters:
      cart - The cart to create an order from
      contextInfo - the context around sandboxing and multitenant state
      Returns:
      The order created from the cart, or existing order if it is already exists
    • readOrderForCart

      @Nullable protected O readOrderForCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Reads the Order for the specified cart.
      Parameters:
      cart - The cart to check for an already created order
      contextInfo - the context around sandboxing and multitenant state
      Returns:
      the order with the given cart ID
    • orderExistsForCart

      @Deprecated(since="1.7.2") protected boolean orderExistsForCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Deprecated.
      Determine whether an Order has already been created for the Cart.
      Parameters:
      cart - The cart to check for an already created order
      contextInfo - the context around sandboxing and multitenant state
      Returns:
      Whether an order has already been created for the cart
    • buildOrderFromCart

      protected O buildOrderFromCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Build the Order from the given Cart.
      Parameters:
      cart - The cart to build the order from
      Returns:
      The built order
    • getCartCustomerName

      @Nullable protected String getCartCustomerName(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Get the customer's name from the cart. If there is no customer, use a name from the first payment's billing address.
      Parameters:
      cart - The cart from which to get the customer's name
      Returns:
      The name of the customer for the cart
    • getLatestCheckoutRequestId

      protected String getLatestCheckoutRequestId(@NonNull C cart)
      Gets the latest checkout request id for the given Cart.
      Parameters:
      cart - the Cart to get the latest checkout request id from
      Returns:
      the latest checkout request id for the given Cart
    • buildOrderPricingFromCart

      @Nullable protected com.broadleafcommerce.order.client.domain.OrderPricing buildOrderPricingFromCart(C cart)
      Build the OrderPricing for the given Cart.
      Parameters:
      cart - The cart to build order pricing from
      Returns:
      The build order pricing
    • buildOrderItemsFromCart

      protected List<com.broadleafcommerce.order.client.domain.OrderItem> buildOrderItemsFromCart(C cart, O order)
      Build the OrderItems for the given Cart.
      Parameters:
      cart - The cart containing items to build the order items from
      order - The order to which the order items should belong
      Returns:
      The built order items
    • updateOrderItemTotalsForVat

      protected void updateOrderItemTotalsForVat(C cart, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
    • updateOfferQualifierOrderItemDetails

      protected void updateOfferQualifierOrderItemDetails(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItemsWithDependentOrderItems)
      Updates the offer qualifier OfferItemDetails that were copied from CartItems in OrderItems to use OrderItem.getId() as OfferItemDetail.getItemId().
      Parameters:
      orderItemsWithDependentOrderItems - a list of OrderItems to update offer qualifier order item details for
    • precalculateRefundAmounts

      protected void precalculateRefundAmounts(O order, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
      Pre-calculates and sets OrderItem.getRefundAmount() based on its OrderItem.getProratedOrderAdjustments() and OrderItem.getItemAdjustments() and their offer qualifier and target items. Any custom refund calculation logic should be added here.

      By default, the refund amount is the unadjusted item price minus the proportionally distributed discount for each item based on their price ratio, minus the prorated order discounts, using these formulas:

      price ratio = (unadjusted price of the item / total price of qualifier and target items before offer adjustment)

      proportionally distributed discount = price ratio * total discount

      refund amount = item unadjusted price - distributed discount - prorated order discounts.

      Note that the item offer discount distribution is only done for Adjustments whose offer has DefaultOfferProrationType.TARGET_AND_QUALIFIER as OfferRef.getProrationType().

      For Adjustments with DefaultOfferProrationType.TARGET_ONLY as OfferRef.getProrationType(), the refund amount for qualifiers would be the price of the item, and for targets would be the price of the item minus the discount.

      Parameters:
      order - the Order that the OrderItems belong to
      orderItems - a list of OrderItems to calculate and set the refund amounts for
      See Also:
      • DefaultOfferProrationType
    • populatePaymentDistributionDetails

      protected void populatePaymentDistributionDetails(@NonNull C cart, @NonNull O order, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Populates PaymentDistributionDetails for the Order.
      Parameters:
      cart - the Cart
      order - the Order to populate the PaymentDistributionDetails for
      contextInfo - the context around sandboxing and multitenant state
    • getAdjustmentsByTargetItemWithQualifierItemId

      protected Map<com.broadleafcommerce.order.client.domain.OrderItem,List<com.broadleafcommerce.order.common.domain.Adjustment>> getAdjustmentsByTargetItemWithQualifierItemId(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems, String qualifierItemId)
      Gets a map of Adjustments by offer target OrderItem whose Adjustment.getQualifierDetails() is referencing the given offer qualifier item id.

      Note that any OrderItems with Adjustments are considered offer "targets".

      Parameters:
      orderItems - the OrderItems to build the map for
      qualifierItemId - the qualifier OfferItemDetail.getItemId() to filter the Adjustment.getQualifierDetails() with
      Returns:
      a map of Adjustments by target OrderItem whose Adjustment.getQualifierDetails() is referencing the given qualifier item id
    • getTargetItemDistributedDiscount

      protected javax.money.MonetaryAmount getTargetItemDistributedDiscount(com.broadleafcommerce.order.common.domain.Adjustment adjustment, com.broadleafcommerce.order.client.domain.OrderItem targetItem, Map<String,com.broadleafcommerce.order.client.domain.OrderItem> orderItemById)
      Gets the proportionally distributed discount for the given offer target item based on its price ratio.
      Parameters:
      adjustment - the Adjustment to prorate
      targetItem - the target OrderItem receiving the discount
      orderItemById - a map of OrderItem by OrderItem.getId()
      Returns:
      the proportionally distributed discount for the given offer target item based on its price ratio
    • getQualifierItemDistributedDiscount

      protected javax.money.MonetaryAmount getQualifierItemDistributedDiscount(com.broadleafcommerce.order.common.domain.Adjustment adjustment, com.broadleafcommerce.order.client.domain.OrderItem qualifierItem, com.broadleafcommerce.order.client.domain.OrderItem targetItem, Map<String,com.broadleafcommerce.order.client.domain.OrderItem> orderItemById)
      Gets the proportionally distributed discount for the given offer qualifier item based on its price ratio.
      Parameters:
      adjustment - the Adjustment to prorate
      qualifierItem - the qualifier OrderItem that the discount should be prorated to
      targetItem - the target OrderItem that was originally targeted for the discount
      orderItemById - a map of OrderItem by OrderItem.getId()
      Returns:
      the proportionally distributed discount for the given offer qualifier item based on its price ratio
    • adjustmentShouldBeProrated

      protected boolean adjustmentShouldBeProrated(com.broadleafcommerce.order.common.domain.Adjustment adjustment)
      Determines if the given Adjustment needs to be prorated across offer qualifier and target items.
      Parameters:
      adjustment - the Adjustment to check against
      Returns:
      true if the given Adjustment needs to be prorated across qualifier and target items, otherwise false
    • getQualifierItemsUnadjustedTotal

      protected javax.money.MonetaryAmount getQualifierItemsUnadjustedTotal(com.broadleafcommerce.order.common.domain.Adjustment adjustment, Map<String,com.broadleafcommerce.order.client.domain.OrderItem> orderItemById)
      Gets the unadjusted item total of all the offer qualifier OrderItems.

      This is useful to calculate the price ratio when prorating offer discounts.

      Parameters:
      adjustment - the Adjustment to get the qualifier items from
      orderItemById - a map of OrderItem by OrderItem.getId()
      Returns:
      the unadjusted item total of all the offer qualifier OrderItems
    • getOrderItemsByOriginalCartItemIds

      protected Map<String,com.broadleafcommerce.order.client.domain.OrderItem> getOrderItemsByOriginalCartItemIds(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
      Gets a map of OrderItems by their original CartItem.getId().
      Parameters:
      orderItems - the list of OrderItems to build the map from
      Returns:
      a map from originally-received-cart-item-ids to OrderItems
    • getOriginalCartItemIdFromAttributes

      protected String getOriginalCartItemIdFromAttributes(com.broadleafcommerce.order.client.domain.OrderItem item)
    • buildOrderItemFromCartItem

      protected com.broadleafcommerce.order.client.domain.OrderItem buildOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Build an OrderItem from the given CartItem.
      Parameters:
      cartItem - The cart item to build an order item from
      Returns:
      The built order item
    • buildImageAssetRef

      @Nullable protected com.broadleafcommerce.order.client.domain.ImageAssetRef buildImageAssetRef(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • buildDependentOrderItemsFromCartItems

      protected List<com.broadleafcommerce.order.client.domain.OrderItem> buildDependentOrderItemsFromCartItems(List<com.broadleafcommerce.cart.client.domain.CartItem> cartItems)
      Build dependent OrderItems from the given dependent CartItems.
      Parameters:
      cartItems - The dependent cart items to build dependent order items from
      Returns:
      The built dependent order items
    • buildDependentOrderItemFromCartItem

      protected com.broadleafcommerce.order.client.domain.OrderItem buildDependentOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Build the dependent OrderItem from the given dependent CartItem.
      Parameters:
      cartItem - The dependent cart item to build a dependent order item from
      Returns:
      The built dependent order item
    • getOrderProvider

      protected OrderProvider<O> getOrderProvider()
    • getTypeFactory

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

      protected OrderOperationServiceOfferUtils getOfferUtils()
    • setOfferUtils

      @Autowired public void setOfferUtils(OrderOperationServiceOfferUtils offerUtils)
    • getPaymentProvider

      protected PaymentProvider getPaymentProvider()
    • setPaymentProvider

      @Autowired public void setPaymentProvider(PaymentProvider paymentProvider)
    • getProperties

      protected OrderGenerationProperties getProperties()
    • getOrderOperationServiceProperties

      protected OrderOperationServiceProperties getOrderOperationServiceProperties()
    • setOrderOperationServiceProperties

      @Autowired public void setOrderOperationServiceProperties(OrderOperationServiceProperties orderOperationServiceProperties)
    • getPaymentDistributionService

      protected PaymentDistributionService getPaymentDistributionService()
    • setPaymentDistributionService

      @Autowired public void setPaymentDistributionService(PaymentDistributionService paymentDistributionService)