Search in sources :

Example 1 with OfferRule

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

the class PromotionMessageDTOServiceImpl method getCustomerRule.

protected String getCustomerRule(Offer offer) {
    if (offer != null) {
        Map<String, OfferOfferRuleXref> offerMatchRuleXrefs = offer.getOfferMatchRulesXref();
        OfferOfferRuleXref customerRuleXref = offerMatchRuleXrefs.get(RuleIdentifier.CUSTOMER_FIELD_KEY);
        if (customerRuleXref != null && customerRuleXref.getOfferRule() != null) {
            OfferRule customerOfferRule = customerRuleXref.getOfferRule();
            return customerOfferRule.getMatchRule();
        }
    }
    return null;
}
Also used : OfferRule(org.broadleafcommerce.core.offer.domain.OfferRule) OfferOfferRuleXref(org.broadleafcommerce.core.offer.domain.OfferOfferRuleXref)

Example 2 with OfferRule

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

the class FulfillmentGroupOfferProcessorImpl method couldOfferApplyToFulfillmentGroup.

protected boolean couldOfferApplyToFulfillmentGroup(Offer offer, PromotableFulfillmentGroup fulfillmentGroup) {
    boolean appliesToItem = false;
    OfferRule rule = null;
    OfferOfferRuleXref ruleXref = offer.getOfferMatchRulesXref().get(OfferRuleType.FULFILLMENT_GROUP.getType());
    if (ruleXref != null && ruleXref.getOfferRule() != null) {
        rule = ruleXref.getOfferRule();
    }
    if (rule != null && rule.getMatchRule() != null) {
        HashMap<String, Object> vars = new HashMap<String, Object>();
        fulfillmentGroup.updateRuleVariables(vars);
        Boolean expressionOutcome = executeExpression(rule.getMatchRule(), vars);
        if (expressionOutcome != null && expressionOutcome) {
            appliesToItem = true;
        }
    } else {
        appliesToItem = true;
    }
    return appliesToItem;
}
Also used : OfferRule(org.broadleafcommerce.core.offer.domain.OfferRule) HashMap(java.util.HashMap) OfferOfferRuleXref(org.broadleafcommerce.core.offer.domain.OfferOfferRuleXref)

Example 3 with OfferRule

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

the class OfferDataItemProvider method createOffer.

public Offer createOffer(String appliesToCustomerRules, String appliesToFulfillmentGroupRules, String appliesToRules, boolean applyToSalePrice, boolean combinableWithOtherOffers, boolean automaticallyAdded, OfferDiscountType type, Date endDate, int maxUses, OfferItemRestrictionRuleType qualifierType, OfferItemRestrictionRuleType targetType, int priority, Set<OfferQualifyingCriteriaXref> qualifyingItemCriteriaXref, boolean stackable, Date startDate, Set<OfferTargetCriteriaXref> targetItemCriteriaXref, boolean totalitarianOffer, OfferType offerType, BigDecimal value) {
    Offer offer = new OfferImpl();
    OfferRule customerRule = new OfferRuleImpl();
    customerRule.setMatchRule(appliesToCustomerRules);
    offer.getOfferMatchRulesXref().put(OfferRuleType.CUSTOMER.getType(), createXref(customerRule, offer, OfferRuleType.CUSTOMER.getType()));
    OfferRule fgRule = new OfferRuleImpl();
    fgRule.setMatchRule(appliesToFulfillmentGroupRules);
    offer.getOfferMatchRulesXref().put(OfferRuleType.FULFILLMENT_GROUP.getType(), createXref(fgRule, offer, OfferRuleType.FULFILLMENT_GROUP.getType()));
    OfferRule orderRule = new OfferRuleImpl();
    orderRule.setMatchRule(appliesToRules);
    offer.getOfferMatchRulesXref().put(OfferRuleType.ORDER.getType(), createXref(orderRule, offer, OfferRuleType.ORDER.getType()));
    offer.setApplyDiscountToSalePrice(applyToSalePrice);
    offer.setCombinableWithOtherOffers(combinableWithOtherOffers);
    offer.setAutomaticallyAdded(automaticallyAdded);
    offer.setDiscountType(type);
    offer.setEndDate(endDate);
    offer.setMaxUsesPerOrder(maxUses);
    offer.setOfferItemQualifierRuleType(qualifierType);
    offer.setOfferItemTargetRuleType(targetType);
    offer.setPriority(priority);
    offer.setQualifyingItemCriteriaXref(qualifyingItemCriteriaXref);
    offer.setStartDate(startDate);
    offer.setTargetItemCriteriaXref(targetItemCriteriaXref);
    offer.setTotalitarianOffer(totalitarianOffer);
    offer.setType(offerType);
    offer.setValue(value);
    offer.setId(getOfferId());
    return offer;
}
Also used : OfferRule(org.broadleafcommerce.core.offer.domain.OfferRule) Offer(org.broadleafcommerce.core.offer.domain.Offer) OfferImpl(org.broadleafcommerce.core.offer.domain.OfferImpl) OfferRuleImpl(org.broadleafcommerce.core.offer.domain.OfferRuleImpl)

Example 4 with OfferRule

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

the class OfferServiceTest method testApplyOffersToOrder_Order.

public void testApplyOffersToOrder_Order() throws Exception {
    final ThreadLocal<Order> myOrder = new ThreadLocal<>();
    EasyMock.expect(offerDaoMock.createOrderItemPriceDetailAdjustment()).andAnswer(OfferDataItemProvider.getCreateOrderItemPriceDetailAdjustmentAnswer()).anyTimes();
    CandidateOrderOfferAnswer candidateOrderOfferAnswer = new CandidateOrderOfferAnswer();
    OrderAdjustmentAnswer orderAdjustmentAnswer = new OrderAdjustmentAnswer();
    EasyMock.expect(offerDaoMock.createOrderAdjustment()).andAnswer(orderAdjustmentAnswer).atLeastOnce();
    OrderItemPriceDetailAnswer orderItemPriceDetailAnswer = new OrderItemPriceDetailAnswer();
    EasyMock.expect(orderItemDaoMock.createOrderItemPriceDetail()).andAnswer(orderItemPriceDetailAnswer).atLeastOnce();
    OrderItemQualifierAnswer orderItemQualifierAnswer = new OrderItemQualifierAnswer();
    EasyMock.expect(orderItemDaoMock.createOrderItemQualifier()).andAnswer(orderItemQualifierAnswer).atLeastOnce();
    CandidateItemOfferAnswer candidateItemOfferAnswer = new CandidateItemOfferAnswer();
    OrderItemAdjustmentAnswer orderItemAdjustmentAnswer = new OrderItemAdjustmentAnswer();
    EasyMock.expect(fgServiceMock.addItemToFulfillmentGroup(EasyMock.isA(FulfillmentGroupItemRequest.class), EasyMock.eq(false))).andAnswer(OfferDataItemProvider.getAddItemToFulfillmentGroupAnswer()).anyTimes();
    EasyMock.expect(orderServiceMock.removeItem(EasyMock.isA(Long.class), EasyMock.isA(Long.class), EasyMock.eq(false))).andAnswer(OfferDataItemProvider.getRemoveItemFromOrderAnswer()).anyTimes();
    EasyMock.expect(orderServiceMock.save(EasyMock.isA(Order.class), EasyMock.isA(Boolean.class))).andAnswer(OfferDataItemProvider.getSaveOrderAnswer()).anyTimes();
    EasyMock.expect(orderServiceMock.findOrderById(EasyMock.isA(Long.class))).andAnswer(new IAnswer<Order>() {

        @Override
        public Order answer() throws Throwable {
            return myOrder.get();
        }
    }).anyTimes();
    EasyMock.expect(orderServiceMock.getAutomaticallyMergeLikeItems()).andReturn(true).anyTimes();
    EasyMock.expect(orderItemServiceMock.saveOrderItem(EasyMock.isA(OrderItem.class))).andAnswer(OfferDataItemProvider.getSaveOrderItemAnswer()).anyTimes();
    EasyMock.expect(fgItemDaoMock.save(EasyMock.isA(FulfillmentGroupItem.class))).andAnswer(OfferDataItemProvider.getSaveFulfillmentGroupItemAnswer()).anyTimes();
    EasyMock.expect(multishipOptionServiceMock.findOrderMultishipOptions(EasyMock.isA(Long.class))).andAnswer(new IAnswer<List<OrderMultishipOption>>() {

        @Override
        public List<OrderMultishipOption> answer() throws Throwable {
            return new ArrayList<>();
        }
    }).anyTimes();
    multishipOptionServiceMock.deleteAllOrderMultishipOptions(EasyMock.isA(Order.class));
    EasyMock.expectLastCall().anyTimes();
    EasyMock.expect(fgServiceMock.collapseToOneShippableFulfillmentGroup(EasyMock.isA(Order.class), EasyMock.eq(false))).andAnswer(OfferDataItemProvider.getSameOrderAnswer()).anyTimes();
    EasyMock.expect(fgItemDaoMock.create()).andAnswer(OfferDataItemProvider.getCreateFulfillmentGroupItemAnswer()).anyTimes();
    fgItemDaoMock.delete(EasyMock.isA(FulfillmentGroupItem.class));
    EasyMock.expectLastCall().anyTimes();
    EasyMock.expect(offerTimeZoneProcessorMock.getTimeZone(EasyMock.isA(OfferImpl.class))).andReturn(TimeZone.getTimeZone("CST")).anyTimes();
    replay();
    Order order = dataProvider.createBasicOrder();
    myOrder.set(order);
    List<Offer> offers = dataProvider.createOrderBasedOffer("order.subTotal.getAmount()>126", OfferDiscountType.PERCENT_OFF);
    offerService.applyAndSaveOffersToOrder(offers, order);
    int adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 1);
    assertTrue(order.getSubTotal().subtract(order.getOrderAdjustmentsValue()).equals(new Money(116.95D)));
    order = dataProvider.createBasicOrder();
    myOrder.set(order);
    offers = dataProvider.createOrderBasedOffer("order.subTotal.getAmount()>126", OfferDiscountType.PERCENT_OFF);
    List<Offer> offers2 = 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))");
    offers.addAll(offers2);
    offerService.applyAndSaveOffersToOrder(offers, order);
    // with the item offers in play, the subtotal restriction for the order offer is no longer valid
    adjustmentCount = countItemAdjustments(order);
    int qualifierCount = countItemQualifiers(order);
    assertTrue(adjustmentCount == 2);
    assertTrue(qualifierCount == 2);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 0);
    // assertTrue(order.getSubTotal().equals(new Money(124.95D)));
    order = dataProvider.createBasicOrder();
    myOrder.set(order);
    OfferRule orderRule = new OfferRuleImpl();
    // orderRule.setMatchRule("order.subTotal.getAmount()>124");
    orderRule.setMatchRule("order.subTotal.getAmount()>100");
    Offer offer = offers.get(0);
    OfferOfferRuleXref ruleXref = new OfferOfferRuleXrefImpl(offer, orderRule, OfferRuleType.ORDER.getType());
    offer.getOfferMatchRulesXref().put(OfferRuleType.ORDER.getType(), ruleXref);
    offerService.applyAndSaveOffersToOrder(offers, order);
    // now that the order restriction has been lessened, even with the item level discounts applied,
    // the order offer still qualifies
    adjustmentCount = countItemAdjustments(order);
    qualifierCount = countItemQualifiers(order);
    assertTrue(adjustmentCount == 2);
    assertTrue(qualifierCount == 2);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 1);
    assertTrue(order.getSubTotal().subtract(order.getOrderAdjustmentsValue()).equals(new Money(112.45D)));
    assertTrue(order.getSubTotal().equals(new Money(124.95D)));
    order = dataProvider.createBasicPromotableOrder().getOrder();
    myOrder.set(order);
    // offers.get(0).setCombinableWithOtherOffers(false);
    List<Offer> offers3 = dataProvider.createOrderBasedOffer("order.subTotal.getAmount()>20", OfferDiscountType.AMOUNT_OFF);
    offers.addAll(offers3);
    offerService.applyAndSaveOffersToOrder(offers, order);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 2);
    order = dataProvider.createBasicPromotableOrder().getOrder();
    myOrder.set(order);
    offers.get(0).setCombinableWithOtherOffers(false);
    offerService.applyAndSaveOffersToOrder(offers, order);
    // there is a non combinable order offer now
    adjustmentCount = countItemAdjustments(order);
    qualifierCount = countItemQualifiers(order);
    assertTrue(adjustmentCount == 2);
    assertTrue(qualifierCount == 2);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 1);
    assertTrue(order.getSubTotal().subtract(order.getOrderAdjustmentsValue()).equals(new Money(112.45D)));
    assertTrue(order.getSubTotal().equals(new Money(124.95D)));
    order = dataProvider.createBasicPromotableOrder().getOrder();
    myOrder.set(order);
    offers.get(0).setTotalitarianOffer(true);
    offerService.applyAndSaveOffersToOrder(offers, order);
    // there is a totalitarian order offer now - it is better than the item offers - the item offers are removed
    adjustmentCount = countItemAdjustments(order);
    qualifierCount = countItemQualifiers(order);
    assertTrue(adjustmentCount == 0);
    assertTrue(qualifierCount == 0);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 1);
    assertTrue(order.getSubTotal().subtract(order.getOrderAdjustmentsValue()).equals(new Money(116.95D)));
    assertTrue(order.getSubTotal().equals(new Money(129.95D)));
    order = dataProvider.createBasicPromotableOrder().getOrder();
    myOrder.set(order);
    offers.get(0).setValue(new BigDecimal(".05"));
    offers.get(2).setValue(new BigDecimal(".01"));
    offers.get(2).setDiscountType(OfferDiscountType.PERCENT_OFF);
    offerService.applyAndSaveOffersToOrder(offers, order);
    // even though the first order offer is totalitarian, it is worth less than the order item offer, so it is removed.
    // the other order offer is still valid, however, and is included.
    adjustmentCount = countItemAdjustments(order);
    assertTrue(adjustmentCount == 2);
    adjustmentCount = order.getOrderAdjustments().size();
    assertTrue(adjustmentCount == 1);
    assertTrue(order.getSubTotal().subtract(order.getOrderAdjustmentsValue()).equals(new Money(124.94D)));
    assertTrue(order.getSubTotal().equals(new Money(124.95D)));
    verify();
}
Also used : Order(org.broadleafcommerce.core.order.domain.Order) OfferRule(org.broadleafcommerce.core.offer.domain.OfferRule) ArrayList(java.util.ArrayList) BigDecimal(java.math.BigDecimal) IAnswer(org.easymock.IAnswer) Money(org.broadleafcommerce.common.money.Money) CandidateItemOffer(org.broadleafcommerce.core.offer.domain.CandidateItemOffer) Offer(org.broadleafcommerce.core.offer.domain.Offer) CandidateOrderOffer(org.broadleafcommerce.core.offer.domain.CandidateOrderOffer) CustomerOffer(org.broadleafcommerce.core.offer.domain.CustomerOffer) FulfillmentGroupItem(org.broadleafcommerce.core.order.domain.FulfillmentGroupItem) OfferOfferRuleXrefImpl(org.broadleafcommerce.core.offer.domain.OfferOfferRuleXrefImpl) OfferRuleImpl(org.broadleafcommerce.core.offer.domain.OfferRuleImpl) OrderMultishipOption(org.broadleafcommerce.core.order.domain.OrderMultishipOption) OfferOfferRuleXref(org.broadleafcommerce.core.offer.domain.OfferOfferRuleXref)

Aggregations

OfferRule (org.broadleafcommerce.core.offer.domain.OfferRule)4 OfferOfferRuleXref (org.broadleafcommerce.core.offer.domain.OfferOfferRuleXref)3 Offer (org.broadleafcommerce.core.offer.domain.Offer)2 OfferRuleImpl (org.broadleafcommerce.core.offer.domain.OfferRuleImpl)2 BigDecimal (java.math.BigDecimal)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Money (org.broadleafcommerce.common.money.Money)1 CandidateItemOffer (org.broadleafcommerce.core.offer.domain.CandidateItemOffer)1 CandidateOrderOffer (org.broadleafcommerce.core.offer.domain.CandidateOrderOffer)1 CustomerOffer (org.broadleafcommerce.core.offer.domain.CustomerOffer)1 OfferImpl (org.broadleafcommerce.core.offer.domain.OfferImpl)1 OfferOfferRuleXrefImpl (org.broadleafcommerce.core.offer.domain.OfferOfferRuleXrefImpl)1 FulfillmentGroupItem (org.broadleafcommerce.core.order.domain.FulfillmentGroupItem)1 Order (org.broadleafcommerce.core.order.domain.Order)1 OrderMultishipOption (org.broadleafcommerce.core.order.domain.OrderMultishipOption)1 IAnswer (org.easymock.IAnswer)1