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 ofOrder
- 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 ofCartOrderGenerationService
-
-
Field Summary
Fields Modifier and Type Field Description protected OrderProvider<O>orderProvider
-
Constructor Summary
Constructors Constructor Description DefaultCartOrderGenerationService(OrderProvider<O> orderProvider, com.broadleafcommerce.common.extension.TypeFactory typeFactory, OrderGenerationProperties properties)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected booleanadjustmentShouldBeProrated(com.broadleafcommerce.order.common.domain.Adjustment adjustment)Determines if the givenAdjustmentneeds to be prorated across offer qualifier and target items.protected com.broadleafcommerce.order.client.domain.OrderItembuildDependentOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)Build the dependentOrderItemfrom the given dependentCartItem.protected List<com.broadleafcommerce.order.client.domain.OrderItem>buildDependentOrderItemsFromCartItems(List<com.broadleafcommerce.cart.client.domain.CartItem> cartItems)Build dependentOrderItemsfrom the given dependentCartItems.protected com.broadleafcommerce.order.client.domain.ImageAssetRefbuildImageAssetRef(com.broadleafcommerce.cart.client.domain.CartItem cartItem)protected ObuildOrderFromCart(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)Build theOrderfrom the givenCart.protected com.broadleafcommerce.order.client.domain.OrderItembuildOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)Build anOrderItemfrom the givenCartItem.protected List<com.broadleafcommerce.order.client.domain.OrderItem>buildOrderItemsFromCart(C cart, O order)Build theOrderItemsfor the givenCart.protected com.broadleafcommerce.order.client.domain.OrderPricingbuildOrderPricingFromCart(C cart)Build theOrderPricingfor the givenCart.OgenerateOrderFromCart(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)Creates and persists a new order from the given cart only if such an order does not already exist.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 ofAdjustmentsby offer targetOrderItemwhoseAdjustment.getQualifierDetails()is referencing the given offer qualifier item id.protected StringgetCartCustomerName(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)Get the customer's name from the cart.protected OrderOperationServiceOfferUtilsgetOfferUtils()protected Map<String,com.broadleafcommerce.order.client.domain.OrderItem>getOrderItemsByOriginalCartItemIds(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)Gets a map ofOrderItemsby their originalCartItem.getId().protected OrderProvider<O>getOrderProvider()protected StringgetOriginalCartItemIdFromAttributes(com.broadleafcommerce.order.client.domain.OrderItem item)protected PaymentProvidergetPaymentProvider()protected OrderGenerationPropertiesgetProperties()protected javax.money.MonetaryAmountgetQualifierItemDistributedDiscount(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.protected javax.money.MonetaryAmountgetQualifierItemsUnadjustedTotal(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 qualifierOrderItems.protected javax.money.MonetaryAmountgetTargetItemDistributedDiscount(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.protected com.broadleafcommerce.common.extension.TypeFactorygetTypeFactory()protected booleanorderExistsForCart(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)Determine whether anOrderhas already been created for theCart.protected voidprecalculateRefundAmounts(O order, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)Pre-calculates and setsOrderItem.getRefundAmount()based on itsOrderItem.getItemAdjustments()and associated offer qualifier and target items.voidsetOfferUtils(OrderOperationServiceOfferUtils offerUtils)voidsetPaymentProvider(PaymentProvider paymentProvider)protected voidupdateOfferQualifierOrderItemDetails(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItemsWithDependentOrderItems)Updates the offer qualifierOfferItemDetailsthat were copied fromCartItemsinOrderItemsto useOrderItem.getId()asOfferItemDetail.getItemId().protected voidupdateOrderItemTotalsForVat(C cart, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
-
-
-
Field Detail
-
orderProvider
protected final OrderProvider<O extends com.broadleafcommerce.order.client.domain.Order> orderProvider
-
-
Constructor Detail
-
DefaultCartOrderGenerationService
public DefaultCartOrderGenerationService(OrderProvider<O> orderProvider, com.broadleafcommerce.common.extension.TypeFactory typeFactory, OrderGenerationProperties properties)
-
-
Method Detail
-
generateOrderFromCart
@Nullable public O generateOrderFromCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
Description copied from interface:CartOrderGenerationServiceCreates and persists a new order from the given cart only if such an order does not already exist.- Specified by:
generateOrderFromCartin interfaceCartOrderGenerationService<C extends com.broadleafcommerce.cart.client.domain.Cart,O extends com.broadleafcommerce.order.client.domain.Order>- Parameters:
cart- The cart to create an order fromcontextInfo- the context around sandboxing and multitenant state- Returns:
- The order created from the cart, or null if an order for the cart already exists
-
orderExistsForCart
protected boolean orderExistsForCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
Determine whether anOrderhas already been created for theCart.- Parameters:
cart- The cart to check for an already created ordercontextInfo- 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 theOrderfrom the givenCart.- 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
-
buildOrderPricingFromCart
@Nullable protected com.broadleafcommerce.order.client.domain.OrderPricing buildOrderPricingFromCart(C cart)
Build theOrderPricingfor the givenCart.- 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 theOrderItemsfor the givenCart.- Parameters:
cart- The cart containing items to build the order items fromorder- 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 qualifierOfferItemDetailsthat were copied fromCartItemsinOrderItemsto useOrderItem.getId()asOfferItemDetail.getItemId().- Parameters:
orderItemsWithDependentOrderItems- a list ofOrderItemsto update offer qualifier order item details for
-
precalculateRefundAmounts
protected void precalculateRefundAmounts(O order, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
Pre-calculates and setsOrderItem.getRefundAmount()based on itsOrderItem.getItemAdjustments()and associated 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, 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 discountrefund amount = item unadjusted price - distributed discount.Note that the offer discount distribution is only done for
Adjustmentswhose offer hasDefaultOfferProrationType.TARGET_AND_QUALIFIERasOfferRef.getProrationType().For
AdjustmentswithDefaultOfferProrationType.TARGET_ONLYasOfferRef.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- theOrderthat theOrderItemsbelong toorderItems- a list ofOrderItemsto calculate and set the refund amounts for- See Also:
DefaultOfferProrationType
-
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 ofAdjustmentsby offer targetOrderItemwhoseAdjustment.getQualifierDetails()is referencing the given offer qualifier item id.Note that any
OrderItemswithAdjustmentsare considered offer "targets".- Parameters:
orderItems- theOrderItemsto build the map forqualifierItemId- the qualifierOfferItemDetail.getItemId()to filter theAdjustment.getQualifierDetails()with- Returns:
- a map of
Adjustmentsby targetOrderItemwhoseAdjustment.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- theAdjustmentto proratetargetItem- the targetOrderItemreceiving the discountorderItemById- a map ofOrderItembyOrderItem.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- theAdjustmentto proratequalifierItem- the qualifierOrderItemthat the discount should be prorated totargetItem- the targetOrderItemthat was originally targeted for the discountorderItemById- a map ofOrderItembyOrderItem.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 givenAdjustmentneeds to be prorated across offer qualifier and target items.- Parameters:
adjustment- theAdjustmentto check against- Returns:
- true if the given
Adjustmentneeds 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 qualifierOrderItems.This is useful to calculate the price ratio when prorating offer discounts.
- Parameters:
adjustment- theAdjustmentto get the qualifier items fromorderItemById- a map ofOrderItembyOrderItem.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 ofOrderItemsby their originalCartItem.getId().- Parameters:
orderItems- the list ofOrderItemsto 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 anOrderItemfrom the givenCartItem.- 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 dependentOrderItemsfrom the given dependentCartItems.- 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 dependentOrderItemfrom the given dependentCartItem.- 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()
-
-