Class DefaultCartOrderGenerationService<C extends com.broadleafcommerce.cart.client.domain.Cart,O extends com.broadleafcommerce.order.client.domain.Order>
- Type Parameters:
O
- A subtype ofOrder
- All Implemented Interfaces:
CartOrderGenerationService<C,
O>
CartOrderGenerationService
-
Field Summary
Modifier and TypeFieldDescriptionstatic final String
static final String
protected final OrderProvider<O>
-
Constructor Summary
ConstructorDescriptionDefaultCartOrderGenerationService
(OrderProvider<O> orderProvider, com.broadleafcommerce.common.extension.TypeFactory typeFactory, OrderGenerationProperties properties) -
Method Summary
Modifier and TypeMethodDescriptionprotected 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
.generateOrderFromCart
(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Creates and persists a newOrder
from the given cart if such an order does not already exist or returns the existingOrder
.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 String
getLatestCheckoutRequestId
(C cart) Gets the latest checkout request id for the givenCart
.protected OrderOperationServiceOfferUtils
getOrderItemsByOriginalCartItemIds
(List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems) Gets a map ofOrderItems
by their originalCartItem.getId()
.protected OrderOperationServiceProperties
protected OrderProvider<O>
protected String
getOriginalCartItemIdFromAttributes
(com.broadleafcommerce.order.client.domain.OrderItem item) protected PaymentDistributionService
protected PaymentProvider
protected OrderGenerationProperties
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
protected boolean
orderExistsForCart
(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Deprecated.protected void
populatePaymentDistributionDetails
(C cart, O order, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) PopulatesPaymentDistributionDetails
for theOrder
.protected void
precalculateRefundAmounts
(O order, List<com.broadleafcommerce.order.client.domain.OrderItem> orderItems) Pre-calculates and setsOrderItem.getRefundAmount()
based on itsOrderItem.getProratedOrderAdjustments()
andOrderItem.getItemAdjustments()
and their offer qualifier and target items.protected O
readOrderForCart
(C cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Reads theOrder
for the specified cart.void
setOfferUtils
(OrderOperationServiceOfferUtils offerUtils) void
setOrderOperationServiceProperties
(OrderOperationServiceProperties orderOperationServiceProperties) void
setPaymentDistributionService
(PaymentDistributionService paymentDistributionService) 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 Details
-
ORDER_ITEM_TYPE_ATTR
- See Also:
-
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 newOrder
from the given cart if such an order does not already exist or returns the existingOrder
.- 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 existing order if it is already exists
-
readOrderForCart
@Nullable protected O readOrderForCart(C cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) Reads theOrder
for the specified cart.- Parameters:
cart
- The cart to check for an already created ordercontextInfo
- 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.in favour ofreadOrderForCart(Cart, 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
-
getLatestCheckoutRequestId
Gets the latest checkout request id for the givenCart
.- Parameters:
cart
- theCart
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 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
-
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.getProratedOrderAdjustments()
andOrderItem.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 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
-
populatePaymentDistributionDetails
protected void populatePaymentDistributionDetails(@NonNull C cart, @NonNull O order, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo) PopulatesPaymentDistributionDetails
for theOrder
.- Parameters:
cart
- theCart
order
- theOrder
to populate thePaymentDistributionDetails
forcontextInfo
- 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 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
-
getTypeFactory
protected com.broadleafcommerce.common.extension.TypeFactory getTypeFactory() -
getOfferUtils
-
setOfferUtils
-
getPaymentProvider
-
setPaymentProvider
-
getProperties
-
getOrderOperationServiceProperties
-
setOrderOperationServiceProperties
@Autowired public void setOrderOperationServiceProperties(OrderOperationServiceProperties orderOperationServiceProperties) -
getPaymentDistributionService
-
setPaymentDistributionService
@Autowired public void setPaymentDistributionService(PaymentDistributionService paymentDistributionService)
-
readOrderForCart(Cart, ContextInfo)