Search in sources :

Example 6 with OfferTargetCriteriaXref

use of org.broadleafcommerce.core.offer.domain.OfferTargetCriteriaXref in project BroadleafCommerce by BroadleafCommerce.

the class ItemOfferProcessorTest method testApplyAdjustments.

public void testApplyAdjustments() throws Exception {
    replay();
    Order order = dataProvider.createBasicOrder();
    Offer offer1 = dataProvider.createItemBasedOfferWithItemCriteria("order.subTotal.getAmount()>20", OfferDiscountType.PERCENT_OFF, "([MVEL.eval(\"toUpperCase()\",\"test1\"), MVEL.eval(\"toUpperCase()\",\"test2\")] contains MVEL.eval(\"toUpperCase()\", discreteOrderItem.category.name))", "([MVEL.eval(\"toUpperCase()\",\"test1\"), MVEL.eval(\"toUpperCase()\",\"test2\")] contains MVEL.eval(\"toUpperCase()\", discreteOrderItem.category.name))").get(0);
    offer1.setId(1L);
    OfferQualifyingCriteriaXref xref = offer1.getQualifyingItemCriteriaXref().iterator().next();
    xref.getOfferItemCriteria().setQuantity(2);
    offer1.setCombinableWithOtherOffers(false);
    Offer offer2 = dataProvider.createItemBasedOfferWithItemCriteria("order.subTotal.getAmount()>20", OfferDiscountType.PERCENT_OFF, "([MVEL.eval(\"toUpperCase()\",\"test1\"), MVEL.eval(\"toUpperCase()\",\"test2\")] contains MVEL.eval(\"toUpperCase()\", discreteOrderItem.category.name))", "([MVEL.eval(\"toUpperCase()\",\"test1\"), MVEL.eval(\"toUpperCase()\",\"test2\")] contains MVEL.eval(\"toUpperCase()\", discreteOrderItem.category.name))").get(0);
    offer2.setId(2L);
    List<Offer> offerListWithOneOffer = new ArrayList<Offer>();
    offerListWithOneOffer.add(offer1);
    List<Offer> offerListWithTwoOffers = new ArrayList<Offer>();
    offerListWithTwoOffers.add(offer1);
    offerListWithTwoOffers.add(offer2);
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithOneOffer, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 1);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 1);
    // Add the second offer.   The first was nonCombinable so it should still be 1
    order = dataProvider.createBasicOrder();
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithTwoOffers, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer2) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 0);
    // Reset offer1 to combinable.   Now both should be applied.
    offer1.setCombinableWithOtherOffers(true);
    order = dataProvider.createBasicOrder();
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithTwoOffers, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer2) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 0);
    // Offer 1 back to nonCombinable but don't allow discount to the sale price
    // and make the sale price a better overall offer
    offer1.setCombinableWithOtherOffers(false);
    offer1.setApplyDiscountToSalePrice(false);
    order = dataProvider.createBasicOrder();
    ((DiscreteOrderItem) order.getOrderItems().get(1)).getSku().setSalePrice(new Money(10D));
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithOneOffer, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 0);
    // Try again with two offers.   The second should be applied.
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithTwoOffers, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 2);
    // Trying with 2nd offer as nonCombinable.
    offer1.setCombinableWithOtherOffers(true);
    ((DiscreteOrderItem) order.getOrderItems().get(1)).getSku().setSalePrice(null);
    offer2.setCombinableWithOtherOffers(false);
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithOneOffer, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 1);
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithTwoOffers, order);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer2) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 0);
    // Set qualifying criteria quantity to 1
    // Set qualifying target criteria to 2
    order = dataProvider.createBasicOrder();
    xref = offer1.getQualifyingItemCriteriaXref().iterator().next();
    xref.getOfferItemCriteria().setQuantity(1);
    OfferTargetCriteriaXref targetXref = offer1.getTargetItemCriteriaXref().iterator().next();
    targetXref.getOfferItemCriteria().setQuantity(2);
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithOneOffer, order);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 2);
    // Reset both offers to combinable and the qualifiers as allowing duplicate QUALIFIERs
    // and Targets
    offer1.setCombinableWithOtherOffers(true);
    offer2.setCombinableWithOtherOffers(true);
    offer1.setOfferItemQualifierRuleType(OfferItemRestrictionRuleType.QUALIFIER_TARGET);
    offer1.setOfferItemTargetRuleType(OfferItemRestrictionRuleType.QUALIFIER_TARGET);
    offer2.setOfferItemQualifierRuleType(OfferItemRestrictionRuleType.QUALIFIER_TARGET);
    offer2.setOfferItemTargetRuleType(OfferItemRestrictionRuleType.QUALIFIER_TARGET);
    order = dataProvider.createBasicOrder();
    order.updatePrices();
    offerService.applyAndSaveOffersToOrder(offerListWithTwoOffers, order);
    assertTrue(checkOrderItemOfferAppliedCount(order) == 4);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer2) == 2);
    assertTrue(checkOrderItemOfferAppliedQuantity(order, offer1) == 2);
    verify();
}
Also used : PromotableOrder(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder) Order(org.broadleafcommerce.core.order.domain.Order) Money(org.broadleafcommerce.common.money.Money) PromotableCandidateItemOffer(org.broadleafcommerce.core.offer.service.discount.domain.PromotableCandidateItemOffer) CandidateItemOffer(org.broadleafcommerce.core.offer.domain.CandidateItemOffer) Offer(org.broadleafcommerce.core.offer.domain.Offer) ArrayList(java.util.ArrayList) OfferTargetCriteriaXref(org.broadleafcommerce.core.offer.domain.OfferTargetCriteriaXref) OfferQualifyingCriteriaXref(org.broadleafcommerce.core.offer.domain.OfferQualifyingCriteriaXref)

Aggregations

OfferTargetCriteriaXref (org.broadleafcommerce.core.offer.domain.OfferTargetCriteriaXref)6 Offer (org.broadleafcommerce.core.offer.domain.Offer)5 OfferItemCriteria (org.broadleafcommerce.core.offer.domain.OfferItemCriteria)3 OfferItemCriteriaImpl (org.broadleafcommerce.core.offer.domain.OfferItemCriteriaImpl)3 OfferTargetCriteriaXrefImpl (org.broadleafcommerce.core.offer.domain.OfferTargetCriteriaXrefImpl)3 ArrayList (java.util.ArrayList)2 Calendar (java.util.Calendar)2 CandidateItemOffer (org.broadleafcommerce.core.offer.domain.CandidateItemOffer)2 OfferQualifyingCriteriaXref (org.broadleafcommerce.core.offer.domain.OfferQualifyingCriteriaXref)2 PromotableCandidateItemOffer (org.broadleafcommerce.core.offer.service.discount.domain.PromotableCandidateItemOffer)2 PromotableOrder (org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder)2 Order (org.broadleafcommerce.core.order.domain.Order)2 Money (org.broadleafcommerce.common.money.Money)1 OfferImpl (org.broadleafcommerce.core.offer.domain.OfferImpl)1 OfferQualifyingCriteriaXrefImpl (org.broadleafcommerce.core.offer.domain.OfferQualifyingCriteriaXrefImpl)1