java.lang.Object
com.broadleafcommerce.cartoperation.service.provider.external.AbstractExternalProvider
com.broadleafcommerce.cartoperation.service.provider.external.ExternalOfferProvider
All Implemented Interfaces:
OfferProvider

public class ExternalOfferProvider extends AbstractExternalProvider implements OfferProvider
Author:
Chad Harchar (charchar)
  • Field Summary

    Fields inherited from class com.broadleafcommerce.cartoperation.service.provider.external.AbstractExternalProvider

    ENTITY_NOT_FOUND
  • Constructor Summary

    Constructors
    Constructor
    Description
    ExternalOfferProvider(org.springframework.web.reactive.function.client.WebClient webClient, com.fasterxml.jackson.databind.ObjectMapper objectMapper, com.broadleafcommerce.common.extension.TypeFactory typeFactory, ExternalOfferProperties properties, UserTargetGenerationService userTargetGenerationService, CartTotalsCalculator cartTotalsCalculator)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    applyOffers(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, boolean runOrderAndItemOffers, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
    Handles requests against the Offer Engine to retrieve and apply discounts for a Cart and its contents.
    void
    applyOffers(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
    Handles requests against the Offer Engine to retrieve and apply discounts for a Cart and its contents.
    protected com.broadleafcommerce.order.common.domain.Adjustment
    buildAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferRef myItemOffer, com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment offerAdjustment)
     
    protected com.broadleafcommerce.order.common.domain.Adjustment
    buildItemAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment offerAdjustment, boolean isForFulfillment)
    Builds an Adjustment based on the given parameters for a CartItem or FulfillmentItem.
    protected com.broadleafcommerce.order.common.domain.ItemProrationDetail
    buildItemProrationDetail(com.broadleafcommerce.promotion.offer.client.web.context.info.ItemProrationDetail clientDetail)
    Builds an ItemProrationDetail based on the given ItemProrationDetail.
    protected com.broadleafcommerce.order.common.domain.OfferItemDetail
    buildOfferItemDetails(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferItemDetail offerItemDetail)
    Builds an OfferItemDetail from the given OfferItemDetail.
    protected com.broadleafcommerce.order.common.domain.OfferRef
    buildOfferRef(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferRef clientOfferRef)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.OrderDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto>>
    buildOrderDto(com.broadleafcommerce.cart.client.domain.Cart cart, boolean runOrderAndItemOffers, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
     
    protected com.broadleafcommerce.order.common.domain.ProratedOfferAdjustment
    buildProratedOrderAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedOfferAdjustment clientAdjustment)
    Builds an ProratedOfferAdjustment based on the given ProratedOfferAdjustment.
    protected com.broadleafcommerce.order.common.domain.Voucher
    buildVoucher(com.broadleafcommerce.promotion.offer.client.web.context.info.Voucher voucher)
    Builds a Voucher from the given Voucher.
    protected com.broadleafcommerce.promotion.offer.client.web.context.Destination
    convertAddressToDestination(@NonNull com.broadleafcommerce.order.common.domain.Address address)
    Converts an Address to a Destination.
    protected com.broadleafcommerce.promotion.offer.client.web.context.CustomerContext
    Create a CustomerContext and add customer and customer segments.
    protected List<com.broadleafcommerce.order.common.domain.Adjustment>
    getAdjustments(List<com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment> adjustments)
     
    protected List<com.broadleafcommerce.order.common.domain.Adjustment>
    getCartItemAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponseDetail<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> itemResponseDetail)
    Gets a list of Adjustments for a CartItem based on the given ItemResponseDetail.
     
     
     
    protected org.springframework.core.ParameterizedTypeReference<Map<String,com.broadleafcommerce.promotion.offer.client.web.context.CodeUsabilityInfo>>
     
    getCodeUsabilityType(@NonNull String code, @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
    Determines the usability type of the promo code in the context of the given cart.
    protected List<com.broadleafcommerce.order.common.domain.Adjustment>
    getFulfillmentItemAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponseDetail<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> itemResponseDetail)
    Gets a list of Adjustments for a FulfillmentItem based on the given ItemResponseDetail.
    protected Object
    getProductType(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
    protected List<com.broadleafcommerce.order.common.domain.ProratedOfferAdjustment>
    getProratedOrderAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> orderItemResponse)
    Gets a list of ProratedOfferAdjustments for a CartItem based on the given ItemResponse.
    protected String
     
    protected Optional<javax.money.MonetaryAmount>
    getStandardPrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
     
    protected List<com.broadleafcommerce.order.common.domain.Voucher>
    getVouchers(List<com.broadleafcommerce.promotion.offer.client.web.context.info.Voucher> vouchers)
     
    protected boolean
    hasSalePrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
    protected boolean
    hasStandardPrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
    protected boolean
    isFulfillmentItemForBundle(com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem, Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto
    populateBundleFulfillmentLineItemDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.Codes
    populateCodes(com.broadleafcommerce.cart.client.domain.Cart cart)
    Deprecated.
    protected void
    populateDependentLineItemDto(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto>
    populateFulfillmentGroupDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentGroup fulfillmentGroup)
     
    protected List<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto>>
    populateFulfillmentGroupDtos(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.Cart cart)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto
    populateFulfillmentLineItemDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
     
    protected com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto
    populateLineItemDto(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    Returns a populated OrderLineItemDto from given CartItem.
    protected void
    populateLineItemDto(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    Deprecated.
    in favor of populateLineItemDto(CartItem) for simpler client extension
    protected List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto>
    populateLineItems(com.broadleafcommerce.cart.client.domain.Cart cart)
     
    protected Map<String,Object>
    populateOfferCodeAttributes(com.broadleafcommerce.promotion.offer.client.web.context.OfferCodeDto offerCode, com.broadleafcommerce.cart.client.domain.Cart cart)
    Hook point to add additonal attributes to the offer codes before sending to the offer service.
    protected List<com.broadleafcommerce.promotion.offer.client.web.context.OfferCodeDto>
    populateOfferCodes(com.broadleafcommerce.cart.client.domain.Cart cart)
     
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    processFreeGiftOffers(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
     
    void
     
    void
     
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateCartAdjustments(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse, boolean didRunOrderAndItemOffers)
    Updates the cart, items, and fulfillment groups and items with the discount adjustments contained in the response from the offer engine.
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateCartForFulfillmentOffers(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
    Updates fulfillment groups and items with adjustments after the offer engine has processed the order.
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateCartForOrderAndOrderItemOffers(@NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
    Updates order and order items with adjustments after the offer engine has processed the order.
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateCartItem(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<T> orderItemResponse, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
     
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateFulfillmentGroup(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.FulfillmentGroupResponse<T> fgResponse, com.broadleafcommerce.cart.client.domain.FulfillmentGroup fulfillmentGroup)
     
    protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto>
    void
    updateFulfillmentItem(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<T> itemResponse, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
     
    com.broadleafcommerce.promotion.offer.client.web.context.OfferAndOfferCodeUsageValidationResult
    validateOfferAndOfferCodeUsages(com.broadleafcommerce.cart.client.domain.Cart cart, List<String> offerCodes, List<String> offerIds, com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
    Retrieve validation information regarding the cart's usage of the provided offers and offer codes to determine if the usage is still valid.

    Methods inherited from class com.broadleafcommerce.cartoperation.service.provider.external.AbstractExternalProvider

    buildNotFoundException, executeRequest, getHeaders, getObjectMapper, getTypeFactory, getWebClient, isEntityNotFound, pageableToParams, uriVars

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • ExternalOfferProvider

      public ExternalOfferProvider(org.springframework.web.reactive.function.client.WebClient webClient, com.fasterxml.jackson.databind.ObjectMapper objectMapper, com.broadleafcommerce.common.extension.TypeFactory typeFactory, ExternalOfferProperties properties, UserTargetGenerationService userTargetGenerationService, CartTotalsCalculator cartTotalsCalculator)
  • Method Details

    • applyOffers

      public void applyOffers(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: OfferProvider
      Handles requests against the Offer Engine to retrieve and apply discounts for a Cart and its contents. This method should apply all kinds of offers applicable to the contents including all order, order item, fulfillment, and fulfillment item offers.

      To control whether order and order item offers are applied use OfferProvider.applyOffers(Cart, boolean, ContextInfo) and set `runOrderAndItemOffers` as desired. Set it to false if you only want to run fulfillment and fulfillment item offers. By default, fulfillment pricing occurs after order and order items have been priced and their offers applied since fulfillment pricing and promotions can depend on the price of the merchandise being fulfilled.

      Specified by:
      applyOffers in interface OfferProvider
      Parameters:
      cart - The Cart whose contents to send to the offer engine for evaluation
      contextInfo - Additional sandbox and tenancy info
    • applyOffers

      public void applyOffers(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, boolean runOrderAndItemOffers, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: OfferProvider
      Handles requests against the Offer Engine to retrieve and apply discounts for a Cart and its contents. Allows specifying whether order and order item offers will be applied in the calculation. Set runOrderAndItemOffers to false if you only want to run fulfillment and fulfillment item offers.

      By default, fulfillment pricing occurs after order and order items have been priced and their offers applied since fulfillment pricing and promotions can depend on the price of the merchandise being fulfilled. Thus, when fulfillment offers are processed, order and order item offers should not also be reprocessed or the results can be incorrect—this also makes the request run faster since only fulfillment will be considered.

      Specified by:
      applyOffers in interface OfferProvider
      Parameters:
      cart - The Cart whose contents to send to the offer engine for evaluation
      runOrderAndItemOffers - Whether to have the Offer Engine run order and order item level offers. Set this to false if you only want to run fulfillment and fulfillment item offers. By default, fulfillment pricing occurs after order and order items have been priced and their offers applied since fulfillment pricing and promotions can depend on the price of the merchandise being fulfilled.
      contextInfo - Additional sandbox and tenancy info
    • getCodeUsabilityType

      public String getCodeUsabilityType(@NonNull @NonNull String code, @NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: OfferProvider
      Determines the usability type of the promo code in the context of the given cart. Possible values are defined in CodeUsabilityType and include whether the code is usable, cannot be used because it has reached its max uses limit, or cannot be used because it does not match any offers (may be a campaign code or some other type in this case).
      Specified by:
      getCodeUsabilityType in interface OfferProvider
      Parameters:
      code - The promo code to apply to cart
      cart - The Cart that promo code is to be applied to
      contextInfo - Additional sandbox and tenancy info
      Returns:
      The usability type
      See Also:
      • CodeUsabilityType
    • validateOfferAndOfferCodeUsages

      public com.broadleafcommerce.promotion.offer.client.web.context.OfferAndOfferCodeUsageValidationResult validateOfferAndOfferCodeUsages(com.broadleafcommerce.cart.client.domain.Cart cart, List<String> offerCodes, List<String> offerIds, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
      Description copied from interface: OfferProvider
      Retrieve validation information regarding the cart's usage of the provided offers and offer codes to determine if the usage is still valid.
      Specified by:
      validateOfferAndOfferCodeUsages in interface OfferProvider
      Parameters:
      cart - The cart against which to validate offer and code uses.
      offerCodes - The codes to check for validity.
      offerIds - The offer ids to check for validity.
      contextInfo - Context information around sandbox and multitenant state.
      Returns:
      A validation result that holds information about which offer & offer code usages are invalid and why
    • buildOrderDto

      protected com.broadleafcommerce.promotion.offer.client.web.context.OrderDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto>> buildOrderDto(com.broadleafcommerce.cart.client.domain.Cart cart, boolean runOrderAndItemOffers, @Nullable com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
    • populateLineItems

      protected List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> populateLineItems(com.broadleafcommerce.cart.client.domain.Cart cart)
    • populateFulfillmentGroupDtos

      protected List<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto>> populateFulfillmentGroupDtos(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.Cart cart)
    • populateCodes

      @Deprecated protected com.broadleafcommerce.promotion.offer.client.web.context.Codes populateCodes(com.broadleafcommerce.cart.client.domain.Cart cart)
      Deprecated.
    • populateOfferCodes

      protected List<com.broadleafcommerce.promotion.offer.client.web.context.OfferCodeDto> populateOfferCodes(com.broadleafcommerce.cart.client.domain.Cart cart)
    • populateOfferCodeAttributes

      protected Map<String,Object> populateOfferCodeAttributes(com.broadleafcommerce.promotion.offer.client.web.context.OfferCodeDto offerCode, com.broadleafcommerce.cart.client.domain.Cart cart)
      Hook point to add additonal attributes to the offer codes before sending to the offer service.
      Parameters:
      offerCode - The offer code DTO
      cart - the current cart
      Returns:
      the list of attributes to add to the offer code
    • getProductType

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

      protected void populateDependentLineItemDto(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • populateLineItemDto

      @Deprecated protected void populateLineItemDto(List<com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItems, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Deprecated.
      in favor of populateLineItemDto(CartItem) for simpler client extension
      Populates an OrderLineItemDto from given CartItem and adds it to the given list of OrderLineItemDtos.
      Parameters:
      lineItems - the list of OrderLineItemDtos to add the populated OrderLineItemDto to
      cartItem - the CartItem to populate an OrderLineItemDto from
    • populateLineItemDto

      protected com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto populateLineItemDto(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
      Returns a populated OrderLineItemDto from given CartItem.
      Parameters:
      cartItem - the CartItem to populate an OrderLineItemDto from
      Returns:
      populated OrderLineItemDto from given CartItem
    • populateFulfillmentGroupDto

      protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentGroupDto<com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto> populateFulfillmentGroupDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentGroup fulfillmentGroup)
    • isFulfillmentItemForBundle

      protected boolean isFulfillmentItemForBundle(com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem, Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap)
    • convertAddressToDestination

      protected com.broadleafcommerce.promotion.offer.client.web.context.Destination convertAddressToDestination(@NonNull @NonNull com.broadleafcommerce.order.common.domain.Address address)
      Converts an Address to a Destination.
      Parameters:
      address - Address to be converted
      Returns:
      the Destination from the Address.
    • populateBundleFulfillmentLineItemDto

      protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto populateBundleFulfillmentLineItemDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
    • populateFulfillmentLineItemDto

      protected com.broadleafcommerce.promotion.offer.client.web.context.FulfillmentLineItemDto populateFulfillmentLineItemDto(Map<String,com.broadleafcommerce.promotion.offer.client.web.context.OrderLineItemDto> lineItemIdMap, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
    • hasStandardPrice

      protected boolean hasStandardPrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • hasSalePrice

      protected boolean hasSalePrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • getStandardPrice

      protected Optional<javax.money.MonetaryAmount> getStandardPrice(com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • updateCartAdjustments

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateCartAdjustments(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse, boolean didRunOrderAndItemOffers)
      Updates the cart, items, and fulfillment groups and items with the discount adjustments contained in the response from the offer engine. This will take into account whether order and order item adjustments were calculated or fulfillment and fulfillment item ones in order to avoid overwriting the wrong ones.

      Fulfillment offers cannot be applied until after regular fulfillment pricing occurs, which cannot be calculated until after non-fulfillment subtotals and adjustments are calculated since fulfillment pricing is usually based on merchandise totals. Therefore, which part of the flow we're in needs to be determined since not all adjustments are calculated at the same time and we do not want to overwrite the previously calculated adjustments with null or 0 values. This determination is done using the didRunOrderAndItemOffers flag.

      Type Parameters:
      T - The specific type of ProratedItemOfferAdjustmentDto being used in the OrderResponse
      Parameters:
      cart - The cart containing the fulfillment groups being discounted
      orderResponse - The response from the offer engine after processing the cart to determine applicable discounts
      didRunOrderAndItemOffers - Indicates whether fulfillment or merchandise (order/item) adjustments have just been calculated
    • updateCartForFulfillmentOffers

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateCartForFulfillmentOffers(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
      Updates fulfillment groups and items with adjustments after the offer engine has processed the order. This is separated from updateCartForOrderAndOrderItemOffers(com.broadleafcommerce.cart.client.domain.Cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T>) since fulfillment offers cannot be applied until after regular fulfillment pricing occurs, which cannot be calculated until after non-fulfillment subtotals and adjustments are calculated since fulfillment pricing is usually based on merchandise totals.
      Type Parameters:
      T - The specific type of ProratedItemOfferAdjustmentDto being used in the OrderResponse
      Parameters:
      cart - The cart containing the fulfillment groups being discounted
      orderResponse - The response from the offer engine after processing the cart to determine applicable discounts
    • updateCartForOrderAndOrderItemOffers

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateCartForOrderAndOrderItemOffers(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
      Updates order and order items with adjustments after the offer engine has processed the order. This is separated from updateCartForFulfillmentOffers(com.broadleafcommerce.cart.client.domain.Cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T>) since fulfillment offers cannot be applied until after regular fulfillment pricing occurs, which cannot be calculated until after non-fulfillment subtotals and adjustments are calculated since fulfillment pricing is usually based on merchandise totals.
      Type Parameters:
      T - The specific type of ProratedItemOfferAdjustmentDto being used in the OrderResponse
      Parameters:
      cart - The cart and its items being discounted
      orderResponse - The response from the offer engine after processing the cart to determine applicable discounts
    • processFreeGiftOffers

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void processFreeGiftOffers(@NonNull @NonNull com.broadleafcommerce.cart.client.domain.Cart cart, @NonNull @NonNull com.broadleafcommerce.promotion.offer.client.web.context.discounts.OrderResponse<T> orderResponse)
    • updateFulfillmentGroup

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateFulfillmentGroup(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.FulfillmentGroupResponse<T> fgResponse, com.broadleafcommerce.cart.client.domain.FulfillmentGroup fulfillmentGroup)
    • getAdjustments

      protected List<com.broadleafcommerce.order.common.domain.Adjustment> getAdjustments(List<com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment> adjustments)
    • getVouchers

      protected List<com.broadleafcommerce.order.common.domain.Voucher> getVouchers(List<com.broadleafcommerce.promotion.offer.client.web.context.info.Voucher> vouchers)
    • buildVoucher

      protected com.broadleafcommerce.order.common.domain.Voucher buildVoucher(com.broadleafcommerce.promotion.offer.client.web.context.info.Voucher voucher)
      Builds a Voucher from the given Voucher.
      Parameters:
      voucher - the Voucher to build the Voucher from
      Returns:
      a Voucher from the given Voucher
    • updateFulfillmentItem

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateFulfillmentItem(com.broadleafcommerce.cart.client.domain.Cart cart, com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<T> itemResponse, com.broadleafcommerce.cart.client.domain.FulfillmentItem fulfillmentItem)
    • updateCartItem

      protected <T extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> void updateCartItem(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<T> orderItemResponse, com.broadleafcommerce.cart.client.domain.CartItem cartItem)
    • getCartItemAdjustmentsToAdd

      protected List<com.broadleafcommerce.order.common.domain.Adjustment> getCartItemAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponseDetail<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> itemResponseDetail)
      Gets a list of Adjustments for a CartItem based on the given ItemResponseDetail.
      Parameters:
      itemResponseDetail - the ItemResponseDetail to build the Adjustments from
      Returns:
      a list of Adjustments for a CartItem based on the given ItemResponseDetail
    • getFulfillmentItemAdjustmentsToAdd

      protected List<com.broadleafcommerce.order.common.domain.Adjustment> getFulfillmentItemAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponseDetail<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> itemResponseDetail)
      Gets a list of Adjustments for a FulfillmentItem based on the given ItemResponseDetail.
      Parameters:
      itemResponseDetail - the ItemResponseDetail to build the Adjustments from
      Returns:
      a list of Adjustments for a FulfillmentItem based on the given ItemResponseDetail
    • buildOfferRef

      protected com.broadleafcommerce.order.common.domain.OfferRef buildOfferRef(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferRef clientOfferRef)
    • buildAdjustment

      protected com.broadleafcommerce.order.common.domain.Adjustment buildAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferRef myItemOffer, com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment offerAdjustment)
    • buildItemAdjustment

      protected com.broadleafcommerce.order.common.domain.Adjustment buildItemAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.Adjustment offerAdjustment, boolean isForFulfillment)
      Builds an Adjustment based on the given parameters for a CartItem or FulfillmentItem.
      Parameters:
      offerAdjustment - the Adjustment to build it from
      isForFulfillment - whether the adjustment is for fulfillment item
      Returns:
      an Adjustment based on the given parameters for a CartItem or FulfillmentItem
    • buildOfferItemDetails

      protected com.broadleafcommerce.order.common.domain.OfferItemDetail buildOfferItemDetails(com.broadleafcommerce.promotion.offer.client.web.context.info.OfferItemDetail offerItemDetail)
      Builds an OfferItemDetail from the given OfferItemDetail.
      Parameters:
      offerItemDetail - the OfferItemDetail to build the OfferItemDetail from
      Returns:
      an OfferItemDetail from the given OfferItemDetail
    • getProratedOrderAdjustmentsToAdd

      protected List<com.broadleafcommerce.order.common.domain.ProratedOfferAdjustment> getProratedOrderAdjustmentsToAdd(com.broadleafcommerce.promotion.offer.client.web.context.discounts.ItemResponse<? extends com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedItemOfferAdjustmentDto> orderItemResponse)
      Gets a list of ProratedOfferAdjustments for a CartItem based on the given ItemResponse.
      Parameters:
      orderItemResponse - the ItemResponse to build the ProratedOfferAdjustments from
      Returns:
      a list of ProratedOfferAdjustments for a CartItem based on the given ItemResponse
    • buildProratedOrderAdjustment

      protected com.broadleafcommerce.order.common.domain.ProratedOfferAdjustment buildProratedOrderAdjustment(com.broadleafcommerce.promotion.offer.client.web.context.info.ProratedOfferAdjustment clientAdjustment)
      Builds an ProratedOfferAdjustment based on the given ProratedOfferAdjustment.
      Parameters:
      clientAdjustment - the ProratedOfferAdjustment to build it from
      Returns:
      an ProratedOfferAdjustment based on the given ProratedOfferAdjustment
    • buildItemProrationDetail

      protected com.broadleafcommerce.order.common.domain.ItemProrationDetail buildItemProrationDetail(com.broadleafcommerce.promotion.offer.client.web.context.info.ItemProrationDetail clientDetail)
      Builds an ItemProrationDetail based on the given ItemProrationDetail.
      Parameters:
      clientDetail - the ItemProrationDetail to build it from
      Returns:
      an ItemProrationDetail based on the given ItemProrationDetail
    • createCustomerContext

      protected com.broadleafcommerce.promotion.offer.client.web.context.CustomerContext createCustomerContext()
      Create a CustomerContext and add customer and customer segments. Uses the current authentication token to determine principal and details.
      Returns:
      The created CustomerContext
    • getCodeUsabilityInfoMap

      protected org.springframework.core.ParameterizedTypeReference<Map<String,com.broadleafcommerce.promotion.offer.client.web.context.CodeUsabilityInfo>> getCodeUsabilityInfoMap()
    • getServiceClient

      protected String getServiceClient()
    • getUserTargetGenerationService

      protected UserTargetGenerationService getUserTargetGenerationService()
    • getCartTotalsCalculator

      protected CartTotalsCalculator getCartTotalsCalculator()
    • getCartOpsServiceOfferUtils

      protected CartOperationServiceOfferUtils getCartOpsServiceOfferUtils()
    • setCartOpsServiceOfferUtils

      @Autowired public void setCartOpsServiceOfferUtils(CartOperationServiceOfferUtils cartOpsServiceOfferUtils)
    • getCartOpProperties

      protected CartOperationServiceProperties getCartOpProperties()
    • setCartOpProperties

      @Autowired public void setCartOpProperties(CartOperationServiceProperties cartOpProperties)