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 boolean
adjustmentShouldBeProrated(com.broadleafcommerce.order.common.domain.Adjustment adjustment)
Determines if the givenAdjustment
needs to be prorated across offer qualifier and target items.protected com.broadleafcommerce.order.client.domain.OrderItem
buildDependentOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
Build the dependentOrderItem
from the given dependentCartItem
.protected List<com.broadleafcommerce.order.client.domain.OrderItem>
buildDependentOrderItemsFromCartItems(List<com.broadleafcommerce.cart.client.domain.CartItem> cartItems)
Build dependentOrderItems
from the given dependentCartItems
.protected com.broadleafcommerce.order.client.domain.ImageAssetRef
buildImageAssetRef(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
protected O
buildOrderFromCart(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
Build theOrder
from the givenCart
.protected com.broadleafcommerce.order.client.domain.OrderItem
buildOrderItemFromCartItem(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
Build anOrderItem
from the givenCartItem
.protected List<com.broadleafcommerce.order.client.domain.OrderItem>
buildOrderItemsFromCart(C cart, O order)
Build theOrderItems
for the givenCart
.protected com.broadleafcommerce.order.client.domain.OrderPricing
buildOrderPricingFromCart(C cart)
Build theOrderPricing
for the givenCart
.O
generateOrderFromCart(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 ofAdjustments
by offer targetOrderItem
whoseAdjustment.getQualifierDetails()
is referencing the given offer qualifier item id.protected String
getCartCustomerName(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
Get the customer's name from the cart.protected OrderOperationServiceOfferUtils
getOfferUtils()
protected Map<String,com.broadleafcommerce.order.client.domain.OrderItem>
getOrderItemsByOriginalCartItemIds(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems)
Gets a map ofOrderItems
by their originalCartItem.getId()
.protected OrderProvider<O>
getOrderProvider()
protected String
getOriginalCartItemIdFromAttributes(com.broadleafcommerce.order.client.domain.OrderItem item)
protected PaymentProvider
getPaymentProvider()
protected OrderGenerationProperties
getProperties()
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.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
.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.protected com.broadleafcommerce.common.extension.TypeFactory
getTypeFactory()
protected boolean
orderExistsForCart(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
Determine whether anOrder
has already been created for theCart
.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.void
setOfferUtils(OrderOperationServiceOfferUtils offerUtils)
void
setPaymentProvider(PaymentProvider paymentProvider)
protected void
updateOfferQualifierOrderItemDetails(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItemsWithDependentOrderItems)
Updates the offer qualifierOfferItemDetails
that were copied fromCartItems
inOrderItems
to useOrderItem.getId()
asOfferItemDetail.getItemId()
.protected void
updateOrderItemTotalsForVat(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:CartOrderGenerationService
Creates and persists a new order from the given cart only if such an order does not already exist.- Specified by:
generateOrderFromCart
in 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 anOrder
has 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 theOrder
from 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 theOrderPricing
for 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 theOrderItems
for 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 qualifierOfferItemDetails
that were copied fromCartItems
inOrderItems
to useOrderItem.getId()
asOfferItemDetail.getItemId()
.- Parameters:
orderItemsWithDependentOrderItems
- a list ofOrderItems
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 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 discount
refund amount = item unadjusted price - distributed discount
.Note that the offer discount distribution is only done for
Adjustments
whose offer hasDefaultOfferProrationType.TARGET_AND_QUALIFIER
asOfferRef.getProrationType()
.For
Adjustments
withDefaultOfferProrationType.TARGET_ONLY
asOfferRef.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
- theOrder
that theOrderItems
belong toorderItems
- a list ofOrderItems
to 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 ofAdjustments
by offer targetOrderItem
whoseAdjustment.getQualifierDetails()
is referencing the given offer qualifier item id.Note that any
OrderItems
withAdjustments
are considered offer "targets".- Parameters:
orderItems
- theOrderItems
to build the map forqualifierItemId
- the qualifierOfferItemDetail.getItemId()
to filter theAdjustment.getQualifierDetails()
with- Returns:
- a map of
Adjustments
by targetOrderItem
whoseAdjustment.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
- theAdjustment
to proratetargetItem
- the targetOrderItem
receiving the discountorderItemById
- a map ofOrderItem
byOrderItem.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
- theAdjustment
to proratequalifierItem
- the qualifierOrderItem
that the discount should be prorated totargetItem
- the targetOrderItem
that was originally targeted for the discountorderItemById
- a map ofOrderItem
byOrderItem.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 givenAdjustment
needs to be prorated across offer qualifier and target items.- Parameters:
adjustment
- theAdjustment
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 qualifierOrderItems
.This is useful to calculate the price ratio when prorating offer discounts.
- Parameters:
adjustment
- theAdjustment
to get the qualifier items fromorderItemById
- a map ofOrderItem
byOrderItem.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 ofOrderItems
by their originalCartItem.getId()
.- Parameters:
orderItems
- the list ofOrderItems
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 anOrderItem
from 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 dependentOrderItems
from 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 dependentOrderItem
from 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()
-
-