Search in sources :

Example 6 with OrderItemPriceDetail

use of org.broadleafcommerce.core.order.domain.OrderItemPriceDetail in project BroadleafCommerce by BroadleafCommerce.

the class OfferServiceImpl method verifyAdjustments.

protected boolean verifyAdjustments(Order order, boolean beforeSave) {
    boolean madeChange = false;
    if (order.getOrderItems() == null) {
        return madeChange;
    }
    for (OrderItem oi : order.getOrderItems()) {
        if (oi.getOrderItemPriceDetails() == null) {
            continue;
        }
        for (OrderItemPriceDetail pd : oi.getOrderItemPriceDetails()) {
            if (pd.getOrderItemPriceDetailAdjustments() == null) {
                continue;
            }
            Map<Long, OrderItemPriceDetailAdjustment> adjs = new HashMap<Long, OrderItemPriceDetailAdjustment>();
            List<OrderItemPriceDetailAdjustment> adjustmentsToRemove = new ArrayList<OrderItemPriceDetailAdjustment>();
            for (OrderItemPriceDetailAdjustment adj : pd.getOrderItemPriceDetailAdjustments()) {
                if (adjs.containsKey(adj.getOffer().getId())) {
                    adjustmentsToRemove.add(adj);
                    if (LOG.isDebugEnabled()) {
                        StringBuilder sb = new StringBuilder("Detected collisions ").append(beforeSave ? "before saving" : "after saving").append(" with ids ").append(adjs.get(adj.getOffer().getId()).getId()).append(" and ").append(adj.getId());
                        LOG.debug(sb.toString());
                    }
                } else {
                    adjs.put(adj.getOffer().getId(), adj);
                }
            }
            for (OrderItemPriceDetailAdjustment adj : adjustmentsToRemove) {
                pd.getOrderItemPriceDetailAdjustments().remove(adj);
                madeChange = true;
            }
        }
    }
    return madeChange;
}
Also used : HashMap(java.util.HashMap) OrderItem(org.broadleafcommerce.core.order.domain.OrderItem) ArrayList(java.util.ArrayList) OrderItemPriceDetail(org.broadleafcommerce.core.order.domain.OrderItemPriceDetail) OrderItemPriceDetailAdjustment(org.broadleafcommerce.core.offer.domain.OrderItemPriceDetailAdjustment)

Example 7 with OrderItemPriceDetail

use of org.broadleafcommerce.core.order.domain.OrderItemPriceDetail in project BroadleafCommerce by BroadleafCommerce.

the class OfferDataItemProvider method createOrderWithBundle.

/**
 * Create order with a bundle with two items.  Bundle has a quantity of 2.
 * Bundle item 1 has quantity of 2, bundle item 2 has quantity of 3
 * @return
 */
public Order createOrderWithBundle() {
    Order order = new OrderImpl();
    order.setId(getOrderId());
    Category category1 = new CategoryImpl();
    category1.setName("test1");
    category1.setId(1L);
    Product product1 = new ProductImpl();
    Sku sku1 = new SkuImpl();
    sku1.setName("test1");
    sku1.setId(1L);
    sku1.setDiscountable(true);
    sku1.setRetailPrice(new Money(10D));
    product1.setDefaultSku(sku1);
    CategoryProductXref xref1 = new CategoryProductXrefImpl();
    xref1.setProduct(product1);
    xref1.setCategory(category1);
    category1.getAllProductXrefs().add(xref1);
    Category category2 = new CategoryImpl();
    category2.setName("test2");
    category2.setId(2L);
    Product product2 = new ProductImpl();
    Sku sku2 = new SkuImpl();
    sku2.setName("test2");
    sku2.setId(2L);
    sku2.setDiscountable(true);
    sku2.setRetailPrice(new Money(10D));
    product2.setDefaultSku(sku2);
    CategoryProductXref xref2 = new CategoryProductXrefImpl();
    xref2.setProduct(product2);
    xref2.setCategory(category2);
    category2.getAllProductXrefs().add(xref2);
    ProductBundle pb = new ProductBundleImpl();
    pb.setPricingModel(ProductBundlePricingModelType.ITEM_SUM);
    BundleOrderItem bundleOrderItem = new BundleOrderItemImpl();
    bundleOrderItem.setCategory(category1);
    bundleOrderItem.setName("test1");
    bundleOrderItem.setOrder(order);
    bundleOrderItem.setOrderItemType(OrderItemType.DISCRETE);
    bundleOrderItem.setQuantity(2);
    bundleOrderItem.setId(getOrderItemId());
    bundleOrderItem.setOrder(order);
    bundleOrderItem.setRetailPrice(new Money(10D));
    bundleOrderItem.setProductBundle(pb);
    OrderItemPriceDetail priceDetail = new OrderItemPriceDetailImpl();
    priceDetail.setOrderItem(bundleOrderItem);
    priceDetail.setQuantity(2);
    bundleOrderItem.getOrderItemPriceDetails().add(priceDetail);
    order.getOrderItems().add(bundleOrderItem);
    DiscreteOrderItem orderItem1 = new DiscreteOrderItemImpl();
    orderItem1.setCategory(category1);
    orderItem1.setName("test1");
    orderItem1.setOrder(order);
    orderItem1.setOrderItemType(OrderItemType.DISCRETE);
    orderItem1.setProduct(product1);
    orderItem1.setQuantity(2);
    orderItem1.setSku(sku1);
    orderItem1.setId(getOrderItemId());
    orderItem1.setOrder(order);
    OrderItemPriceDetail priceDetail1 = new OrderItemPriceDetailImpl();
    priceDetail1.setOrderItem(orderItem1);
    priceDetail1.setQuantity(2);
    orderItem1.getOrderItemPriceDetails().add(priceDetail1);
    bundleOrderItem.getDiscreteOrderItems().add(orderItem1);
    DiscreteOrderItem orderItem2 = new DiscreteOrderItemImpl();
    orderItem2.setCategory(category2);
    orderItem2.setName("test2");
    orderItem2.setOrder(order);
    orderItem2.setOrderItemType(OrderItemType.DISCRETE);
    orderItem2.setProduct(product2);
    orderItem2.setQuantity(3);
    orderItem2.setSku(sku2);
    orderItem2.setId(getOrderItemId());
    orderItem2.setOrder(order);
    OrderItemPriceDetail priceDetail2 = new OrderItemPriceDetailImpl();
    priceDetail2.setOrderItem(orderItem2);
    priceDetail2.setQuantity(3);
    orderItem2.getOrderItemPriceDetails().add(priceDetail2);
    bundleOrderItem.getDiscreteOrderItems().add(orderItem2);
    Customer customer = new CustomerImpl();
    customer.setEmailAddress("test@test.com");
    customer.setFirstName("John");
    customer.setLastName("Tester");
    customer.setReceiveEmail(true);
    customer.setRegistered(true);
    order.setCustomer(customer);
    order.setEmailAddress("test@test.com");
    FulfillmentGroup fg1 = new FulfillmentGroupImpl();
    fg1.setId(1L);
    Address address1 = new AddressImpl();
    address1.setAddressLine1("123 Test Road");
    address1.setCity("Dallas");
    Country country = new CountryImpl();
    country.setAbbreviation("US");
    country.setName("United States");
    ISOCountry isoCountry = new ISOCountryImpl();
    isoCountry.setAlpha2("US");
    isoCountry.setName("UNITED STATES");
    address1.setCountry(country);
    address1.setIsoCountryAlpha2(isoCountry);
    address1.setDefault(true);
    address1.setFirstName("John");
    address1.setLastName("Tester");
    address1.setPostalCode("75244");
    Phone primary = new PhoneImpl();
    primary.setPhoneNumber("972-976-1234");
    address1.setPhonePrimary(primary);
    State state = new StateImpl();
    state.setAbbreviation("TX");
    state.setCountry(country);
    state.setName("Texas");
    address1.setState(state);
    address1.setIsoCountrySubdivision("US-TX");
    fg1.setAddress(address1);
    fg1.setOrder(order);
    fg1.setPrimary(true);
    fg1.setRetailShippingPrice(new Money(10D));
    fg1.setShippingPrice(new Money(10D));
    fg1.setType(FulfillmentType.PHYSICAL_SHIP);
    fg1.setOrder(order);
    FulfillmentGroupItem fgItem1 = new FulfillmentGroupItemImpl();
    fgItem1.setFulfillmentGroup(fg1);
    fgItem1.setOrderItem(orderItem1);
    fgItem1.setQuantity(2);
    // fgItem1.setRetailPrice(new Money(19.99D));
    fg1.getFulfillmentGroupItems().add(fgItem1);
    order.getFulfillmentGroups().add(fg1);
    FulfillmentGroup fg2 = new FulfillmentGroupImpl();
    fg2.setId(2L);
    Address address2 = new AddressImpl();
    address2.setAddressLine1("124 Test Road");
    address2.setCity("Dallas");
    Country country2 = new CountryImpl();
    country2.setAbbreviation("US");
    country2.setName("United States");
    ISOCountry isoCountry2 = new ISOCountryImpl();
    isoCountry2.setAlpha2("US");
    isoCountry2.setName("UNITED STATES");
    address2.setCountry(country2);
    address2.setIsoCountryAlpha2(isoCountry2);
    address2.setDefault(true);
    address2.setFirstName("John");
    address2.setLastName("Tester");
    address2.setPostalCode("75244");
    Phone primary2 = new PhoneImpl();
    primary2.setPhoneNumber("972-976-1234");
    address2.setPhonePrimary(primary2);
    State state2 = new StateImpl();
    state2.setAbbreviation("TX");
    state2.setCountry(country2);
    state2.setName("Texas");
    address2.setState(state2);
    address2.setIsoCountrySubdivision("US-TX");
    fg2.setAddress(address2);
    fg2.setOrder(order);
    fg2.setPrimary(true);
    fg2.setRetailShippingPrice(new Money(20D));
    fg2.setShippingPrice(new Money(20D));
    fg2.setType(FulfillmentType.PHYSICAL_SHIP);
    fg2.setOrder(order);
    FulfillmentGroupItem fgItem2 = new FulfillmentGroupItemImpl();
    fgItem2.setFulfillmentGroup(fg2);
    fgItem2.setOrderItem(orderItem2);
    fgItem2.setQuantity(3);
    // fgItem2.setRetailPrice(new Money(29.99D));
    fg2.getFulfillmentGroupItems().add(fgItem2);
    order.getFulfillmentGroups().add(fg2);
    order.setSubTotal(new Money((2 * 19.99D) + (3 * 29.99D)));
    orders.put(order.getId(), order);
    return order;
}
Also used : DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) Category(org.broadleafcommerce.core.catalog.domain.Category) CategoryProductXref(org.broadleafcommerce.core.catalog.domain.CategoryProductXref) BundleOrderItemImpl(org.broadleafcommerce.core.order.domain.BundleOrderItemImpl) Address(org.broadleafcommerce.profile.core.domain.Address) DiscreteOrderItemImpl(org.broadleafcommerce.core.order.domain.DiscreteOrderItemImpl) Customer(org.broadleafcommerce.profile.core.domain.Customer) OrderItemPriceDetailImpl(org.broadleafcommerce.core.order.domain.OrderItemPriceDetailImpl) Product(org.broadleafcommerce.core.catalog.domain.Product) CustomerImpl(org.broadleafcommerce.profile.core.domain.CustomerImpl) Money(org.broadleafcommerce.common.money.Money) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) ISOCountryImpl(org.broadleafcommerce.common.i18n.domain.ISOCountryImpl) CountryImpl(org.broadleafcommerce.profile.core.domain.CountryImpl) Phone(org.broadleafcommerce.profile.core.domain.Phone) FulfillmentGroupItem(org.broadleafcommerce.core.order.domain.FulfillmentGroupItem) CategoryProductXrefImpl(org.broadleafcommerce.core.catalog.domain.CategoryProductXrefImpl) ProductBundleImpl(org.broadleafcommerce.core.catalog.domain.ProductBundleImpl) AddressImpl(org.broadleafcommerce.profile.core.domain.AddressImpl) PhoneImpl(org.broadleafcommerce.profile.core.domain.PhoneImpl) FulfillmentGroup(org.broadleafcommerce.core.order.domain.FulfillmentGroup) ISOCountryImpl(org.broadleafcommerce.common.i18n.domain.ISOCountryImpl) ISOCountry(org.broadleafcommerce.common.i18n.domain.ISOCountry) FulfillmentGroupItemImpl(org.broadleafcommerce.core.order.domain.FulfillmentGroupItemImpl) PromotableOrder(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder) Order(org.broadleafcommerce.core.order.domain.Order) FulfillmentGroupImpl(org.broadleafcommerce.core.order.domain.FulfillmentGroupImpl) ProductBundle(org.broadleafcommerce.core.catalog.domain.ProductBundle) StateImpl(org.broadleafcommerce.profile.core.domain.StateImpl) CategoryImpl(org.broadleafcommerce.core.catalog.domain.CategoryImpl) SkuImpl(org.broadleafcommerce.core.catalog.domain.SkuImpl) ProductImpl(org.broadleafcommerce.core.catalog.domain.ProductImpl) State(org.broadleafcommerce.profile.core.domain.State) OrderImpl(org.broadleafcommerce.core.order.domain.OrderImpl) PromotableOrderImpl(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrderImpl) Country(org.broadleafcommerce.profile.core.domain.Country) ISOCountry(org.broadleafcommerce.common.i18n.domain.ISOCountry) OrderItemPriceDetail(org.broadleafcommerce.core.order.domain.OrderItemPriceDetail) Sku(org.broadleafcommerce.core.catalog.domain.Sku)

Example 8 with OrderItemPriceDetail

use of org.broadleafcommerce.core.order.domain.OrderItemPriceDetail in project BroadleafCommerce by BroadleafCommerce.

the class OfferDataItemProvider method createBasicOrder.

public Order createBasicOrder() {
    Order order = new OrderImpl();
    order.setId(getOrderId());
    Category category1 = new CategoryImpl();
    category1.setName("test1");
    category1.setId(1L);
    Product product1 = new ProductImpl();
    Sku sku1 = new SkuImpl();
    sku1.setName("test1");
    sku1.setId(1L);
    sku1.setDiscountable(true);
    sku1.setRetailPrice(new Money(19.99D));
    product1.setDefaultSku(sku1);
    CategoryProductXref xref1 = new CategoryProductXrefImpl();
    xref1.setProduct(product1);
    xref1.setCategory(category1);
    category1.getAllProductXrefs().add(xref1);
    Category category2 = new CategoryImpl();
    category2.setName("test2");
    category2.setId(2L);
    Product product2 = new ProductImpl();
    Sku sku2 = new SkuImpl();
    sku2.setName("test2");
    sku2.setId(2L);
    sku2.setDiscountable(true);
    sku2.setRetailPrice(new Money(29.99D));
    product2.setDefaultSku(sku2);
    CategoryProductXref xref2 = new CategoryProductXrefImpl();
    xref2.setProduct(product2);
    xref2.setCategory(category2);
    category2.getAllProductXrefs().add(xref2);
    DiscreteOrderItem orderItem1 = new DiscreteOrderItemImpl();
    orderItem1.setCategory(category1);
    orderItem1.setName("test1");
    orderItem1.setOrder(order);
    orderItem1.setOrderItemType(OrderItemType.DISCRETE);
    orderItem1.setProduct(product1);
    orderItem1.setQuantity(2);
    orderItem1.setSku(sku1);
    orderItem1.setId(getOrderItemId());
    orderItem1.setOrder(order);
    OrderItemPriceDetail priceDetail1 = new OrderItemPriceDetailImpl();
    priceDetail1.setOrderItem(orderItem1);
    priceDetail1.setQuantity(2);
    orderItem1.getOrderItemPriceDetails().add(priceDetail1);
    order.getOrderItems().add(orderItem1);
    DiscreteOrderItem orderItem2 = new DiscreteOrderItemImpl();
    orderItem2.setCategory(category2);
    orderItem2.setName("test2");
    orderItem2.setOrder(order);
    orderItem2.setOrderItemType(OrderItemType.DISCRETE);
    orderItem2.setProduct(product2);
    orderItem2.setQuantity(3);
    orderItem2.setSku(sku2);
    orderItem2.setId(getOrderItemId());
    orderItem2.setOrder(order);
    OrderItemPriceDetail priceDetail2 = new OrderItemPriceDetailImpl();
    priceDetail2.setOrderItem(orderItem2);
    priceDetail2.setQuantity(3);
    orderItem2.getOrderItemPriceDetails().add(priceDetail2);
    order.getOrderItems().add(orderItem2);
    Customer customer = new CustomerImpl();
    customer.setEmailAddress("test@test.com");
    customer.setFirstName("John");
    customer.setLastName("Tester");
    customer.setReceiveEmail(true);
    customer.setRegistered(true);
    order.setCustomer(customer);
    order.setEmailAddress("test@test.com");
    FulfillmentGroup fg1 = new FulfillmentGroupImpl();
    fg1.setId(1L);
    Address address1 = new AddressImpl();
    address1.setAddressLine1("123 Test Road");
    address1.setCity("Dallas");
    Country country = new CountryImpl();
    country.setAbbreviation("US");
    country.setName("United States");
    ISOCountry isoCountry = new ISOCountryImpl();
    isoCountry.setAlpha2("US");
    isoCountry.setName("UNITED STATES");
    address1.setCountry(country);
    address1.setIsoCountryAlpha2(isoCountry);
    address1.setDefault(true);
    address1.setFirstName("John");
    address1.setLastName("Tester");
    address1.setPostalCode("75244");
    Phone primary = new PhoneImpl();
    primary.setPhoneNumber("972-976-1234");
    address1.setPhonePrimary(primary);
    State state = new StateImpl();
    state.setAbbreviation("TX");
    state.setCountry(country);
    state.setName("Texas");
    address1.setState(state);
    address1.setIsoCountrySubdivision("US-TX");
    fg1.setAddress(address1);
    fg1.setOrder(order);
    fg1.setPrimary(true);
    fg1.setRetailShippingPrice(new Money(10D));
    fg1.setShippingPrice(new Money(10D));
    fg1.setType(FulfillmentType.PHYSICAL_SHIP);
    fg1.setOrder(order);
    FulfillmentGroupItem fgItem1 = new FulfillmentGroupItemImpl();
    fgItem1.setFulfillmentGroup(fg1);
    fgItem1.setOrderItem(orderItem1);
    fgItem1.setQuantity(2);
    // fgItem1.setRetailPrice(new Money(19.99D));
    fg1.getFulfillmentGroupItems().add(fgItem1);
    order.getFulfillmentGroups().add(fg1);
    FulfillmentGroup fg2 = new FulfillmentGroupImpl();
    fg2.setId(2L);
    Address address2 = new AddressImpl();
    address2.setAddressLine1("124 Test Road");
    address2.setCity("Dallas");
    Country country2 = new CountryImpl();
    country2.setAbbreviation("US");
    country2.setName("United States");
    ISOCountry isoCountry2 = new ISOCountryImpl();
    isoCountry2.setAlpha2("US");
    isoCountry2.setName("UNITED STATES");
    address2.setCountry(country2);
    address2.setIsoCountryAlpha2(isoCountry2);
    address2.setDefault(true);
    address2.setFirstName("John");
    address2.setLastName("Tester");
    address2.setPostalCode("75244");
    Phone primary2 = new PhoneImpl();
    primary2.setPhoneNumber("972-976-1234");
    address2.setPhonePrimary(primary2);
    State state2 = new StateImpl();
    state2.setAbbreviation("TX");
    state2.setCountry(country2);
    state2.setName("Texas");
    address2.setState(state2);
    address2.setIsoCountrySubdivision("US-TX");
    fg2.setAddress(address2);
    fg2.setOrder(order);
    fg2.setPrimary(true);
    fg2.setRetailShippingPrice(new Money(20D));
    fg2.setShippingPrice(new Money(20D));
    fg2.setType(FulfillmentType.PHYSICAL_SHIP);
    fg2.setOrder(order);
    FulfillmentGroupItem fgItem2 = new FulfillmentGroupItemImpl();
    fgItem2.setFulfillmentGroup(fg2);
    fgItem2.setOrderItem(orderItem2);
    fgItem2.setQuantity(3);
    // fgItem2.setRetailPrice(new Money(29.99D));
    fg2.getFulfillmentGroupItems().add(fgItem2);
    order.getFulfillmentGroups().add(fg2);
    order.setSubTotal(new Money((2 * 19.99D) + (3 * 29.99D)));
    orders.put(order.getId(), order);
    return order;
}
Also used : DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) Category(org.broadleafcommerce.core.catalog.domain.Category) CategoryProductXref(org.broadleafcommerce.core.catalog.domain.CategoryProductXref) Address(org.broadleafcommerce.profile.core.domain.Address) DiscreteOrderItemImpl(org.broadleafcommerce.core.order.domain.DiscreteOrderItemImpl) Customer(org.broadleafcommerce.profile.core.domain.Customer) OrderItemPriceDetailImpl(org.broadleafcommerce.core.order.domain.OrderItemPriceDetailImpl) Product(org.broadleafcommerce.core.catalog.domain.Product) CustomerImpl(org.broadleafcommerce.profile.core.domain.CustomerImpl) Money(org.broadleafcommerce.common.money.Money) ISOCountryImpl(org.broadleafcommerce.common.i18n.domain.ISOCountryImpl) CountryImpl(org.broadleafcommerce.profile.core.domain.CountryImpl) Phone(org.broadleafcommerce.profile.core.domain.Phone) FulfillmentGroupItem(org.broadleafcommerce.core.order.domain.FulfillmentGroupItem) CategoryProductXrefImpl(org.broadleafcommerce.core.catalog.domain.CategoryProductXrefImpl) AddressImpl(org.broadleafcommerce.profile.core.domain.AddressImpl) PhoneImpl(org.broadleafcommerce.profile.core.domain.PhoneImpl) FulfillmentGroup(org.broadleafcommerce.core.order.domain.FulfillmentGroup) ISOCountryImpl(org.broadleafcommerce.common.i18n.domain.ISOCountryImpl) ISOCountry(org.broadleafcommerce.common.i18n.domain.ISOCountry) FulfillmentGroupItemImpl(org.broadleafcommerce.core.order.domain.FulfillmentGroupItemImpl) PromotableOrder(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder) Order(org.broadleafcommerce.core.order.domain.Order) FulfillmentGroupImpl(org.broadleafcommerce.core.order.domain.FulfillmentGroupImpl) StateImpl(org.broadleafcommerce.profile.core.domain.StateImpl) CategoryImpl(org.broadleafcommerce.core.catalog.domain.CategoryImpl) SkuImpl(org.broadleafcommerce.core.catalog.domain.SkuImpl) ProductImpl(org.broadleafcommerce.core.catalog.domain.ProductImpl) State(org.broadleafcommerce.profile.core.domain.State) OrderImpl(org.broadleafcommerce.core.order.domain.OrderImpl) PromotableOrderImpl(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrderImpl) Country(org.broadleafcommerce.profile.core.domain.Country) ISOCountry(org.broadleafcommerce.common.i18n.domain.ISOCountry) OrderItemPriceDetail(org.broadleafcommerce.core.order.domain.OrderItemPriceDetail) Sku(org.broadleafcommerce.core.catalog.domain.Sku)

Example 9 with OrderItemPriceDetail

use of org.broadleafcommerce.core.order.domain.OrderItemPriceDetail in project BroadleafCommerce by BroadleafCommerce.

the class FulfillmentGroupOfferProcessorTest method testApplyAllFulfillmentGroupOffersWithOrderItemOffers.

public void testApplyAllFulfillmentGroupOffersWithOrderItemOffers() throws Exception {
    final ThreadLocal<Order> myOrder = new ThreadLocal<Order>();
    EasyMock.expect(orderItemDaoMock.createOrderItemPriceDetail()).andAnswer(OfferDataItemProvider.getCreateOrderItemPriceDetailAnswer()).anyTimes();
    EasyMock.expect(orderItemDaoMock.createOrderItemQualifier()).andAnswer(OfferDataItemProvider.getCreateOrderItemQualifierAnswer()).atLeastOnce();
    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(offerServiceUtilitiesMock.orderMeetsQualifyingSubtotalRequirements(EasyMock.isA(PromotableOrder.class), EasyMock.isA(Offer.class), EasyMock.isA(HashMap.class))).andReturn(true).anyTimes();
    EasyMock.expect(offerServiceUtilitiesMock.orderMeetsSubtotalRequirements(EasyMock.isA(PromotableOrder.class), EasyMock.isA(Offer.class))).andReturn(true).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(offerDaoMock.createOrderItemPriceDetailAdjustment()).andAnswer(OfferDataItemProvider.getCreateOrderItemPriceDetailAdjustmentAnswer()).anyTimes();
    EasyMock.expect(offerDaoMock.createFulfillmentGroupAdjustment()).andAnswer(OfferDataItemProvider.getCreateFulfillmentGroupAdjustmentAnswer()).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(multishipOptionServiceMock.findOrderMultishipOptions(EasyMock.isA(Long.class))).andAnswer(new IAnswer<List<OrderMultishipOption>>() {

        @Override
        public List<OrderMultishipOption> answer() throws Throwable {
            List<OrderMultishipOption> options = new ArrayList<OrderMultishipOption>();
            PromotableOrder order = dataProvider.createBasicPromotableOrder();
            for (FulfillmentGroup fg : order.getOrder().getFulfillmentGroups()) {
                Address address = fg.getAddress();
                for (FulfillmentGroupItem fgItem : fg.getFulfillmentGroupItems()) {
                    for (int j = 0; j < fgItem.getQuantity(); j++) {
                        OrderMultishipOption option = new OrderMultishipOptionImpl();
                        option.setOrder(order.getOrder());
                        option.setAddress(address);
                        option.setOrderItem(fgItem.getOrderItem());
                        options.add(option);
                    }
                }
            }
            return options;
        }
    }).anyTimes();
    multishipOptionServiceMock.deleteAllOrderMultishipOptions(EasyMock.isA(Order.class));
    EasyMock.expectLastCall().anyTimes();
    EasyMock.expect(fgServiceMock.collapseToOneShippableFulfillmentGroup(EasyMock.isA(Order.class), EasyMock.eq(false))).andAnswer(new IAnswer<Order>() {

        @Override
        public Order answer() throws Throwable {
            Order order = (Order) EasyMock.getCurrentArguments()[0];
            order.getFulfillmentGroups().get(0).getFulfillmentGroupItems().addAll(order.getFulfillmentGroups().get(1).getFulfillmentGroupItems());
            order.getFulfillmentGroups().remove(order.getFulfillmentGroups().get(1));
            return order;
        }
    }).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();
    PromotableOrder promotableOrder = dataProvider.createBasicPromotableOrder();
    Order order = promotableOrder.getOrder();
    myOrder.set(promotableOrder.getOrder());
    List<PromotableCandidateFulfillmentGroupOffer> qualifiedOffers = new ArrayList<PromotableCandidateFulfillmentGroupOffer>();
    List<Offer> offers = dataProvider.createFGBasedOffer("order.subTotal.getAmount()>20", "fulfillmentGroup.address.postalCode==75244", OfferDiscountType.PERCENT_OFF);
    offers.addAll(dataProvider.createFGBasedOfferWithItemCriteria("order.subTotal.getAmount()>20", "fulfillmentGroup.address.postalCode==75244", OfferDiscountType.PERCENT_OFF, "([MVEL.eval(\"toUpperCase()\",\"test1\")] contains MVEL.eval(\"toUpperCase()\", discreteOrderItem.category.name))"));
    offers.get(1).setName("secondOffer");
    offers.addAll(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))"));
    offerService.applyAndSaveOffersToOrder(offers, promotableOrder.getOrder());
    offers.get(0).setTotalitarianOffer(true);
    offerService.applyAndSaveFulfillmentGroupOffersToOrder(offers, promotableOrder.getOrder());
    int fgAdjustmentCount = 0;
    for (FulfillmentGroup fg : order.getFulfillmentGroups()) {
        fgAdjustmentCount += fg.getFulfillmentGroupAdjustments().size();
    }
    // The totalitarian offer that applies to both fg's is not combinable and is a worse offer than the order item offers
    // - it is therefore ignored
    // However, the second combinable fg offer is allowed to be applied.
    assertTrue(fgAdjustmentCount == 1);
    promotableOrder = dataProvider.createBasicPromotableOrder();
    myOrder.set(promotableOrder.getOrder());
    offers.get(2).setValue(new BigDecimal("1"));
    offerService.applyAndSaveOffersToOrder(offers, promotableOrder.getOrder());
    offerService.applyAndSaveFulfillmentGroupOffersToOrder(offers, promotableOrder.getOrder());
    fgAdjustmentCount = 0;
    order = promotableOrder.getOrder();
    for (FulfillmentGroup fg : order.getFulfillmentGroups()) {
        fgAdjustmentCount += fg.getFulfillmentGroupAdjustments().size();
    }
    // The totalitarian fg offer is now a better deal than the order item offers, therefore the totalitarian fg offer is applied
    // and the order item offers are removed
    assertTrue(fgAdjustmentCount == 2);
    int itemAdjustmentCount = 0;
    for (OrderItem item : order.getOrderItems()) {
        for (OrderItemPriceDetail detail : item.getOrderItemPriceDetails()) {
            itemAdjustmentCount += detail.getOrderItemPriceDetailAdjustments().size();
        }
    }
    // Confirm that the order item offers are removed
    assertTrue(itemAdjustmentCount == 0);
    verify();
}
Also used : PromotableOrder(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder) Order(org.broadleafcommerce.core.order.domain.Order) Address(org.broadleafcommerce.profile.core.domain.Address) OrderMultishipOptionImpl(org.broadleafcommerce.core.order.domain.OrderMultishipOptionImpl) ArrayList(java.util.ArrayList) PromotableOrder(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder) BigDecimal(java.math.BigDecimal) IAnswer(org.easymock.IAnswer) CandidateFulfillmentGroupOffer(org.broadleafcommerce.core.offer.domain.CandidateFulfillmentGroupOffer) PromotableCandidateFulfillmentGroupOffer(org.broadleafcommerce.core.offer.service.discount.domain.PromotableCandidateFulfillmentGroupOffer) CandidateItemOffer(org.broadleafcommerce.core.offer.domain.CandidateItemOffer) Offer(org.broadleafcommerce.core.offer.domain.Offer) FulfillmentGroupItem(org.broadleafcommerce.core.order.domain.FulfillmentGroupItem) PromotableOrderItem(org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrderItem) OrderItem(org.broadleafcommerce.core.order.domain.OrderItem) OrderMultishipOption(org.broadleafcommerce.core.order.domain.OrderMultishipOption) FulfillmentGroup(org.broadleafcommerce.core.order.domain.FulfillmentGroup) PromotableFulfillmentGroup(org.broadleafcommerce.core.offer.service.discount.domain.PromotableFulfillmentGroup) PromotableCandidateFulfillmentGroupOffer(org.broadleafcommerce.core.offer.service.discount.domain.PromotableCandidateFulfillmentGroupOffer) OrderItemPriceDetail(org.broadleafcommerce.core.order.domain.OrderItemPriceDetail)

Aggregations

OrderItemPriceDetail (org.broadleafcommerce.core.order.domain.OrderItemPriceDetail)9 PromotableOrder (org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrder)4 FulfillmentGroup (org.broadleafcommerce.core.order.domain.FulfillmentGroup)4 Order (org.broadleafcommerce.core.order.domain.Order)4 ArrayList (java.util.ArrayList)3 Money (org.broadleafcommerce.common.money.Money)3 Category (org.broadleafcommerce.core.catalog.domain.Category)3 CategoryImpl (org.broadleafcommerce.core.catalog.domain.CategoryImpl)3 CategoryProductXref (org.broadleafcommerce.core.catalog.domain.CategoryProductXref)3 CategoryProductXrefImpl (org.broadleafcommerce.core.catalog.domain.CategoryProductXrefImpl)3 Product (org.broadleafcommerce.core.catalog.domain.Product)3 ProductImpl (org.broadleafcommerce.core.catalog.domain.ProductImpl)3 Sku (org.broadleafcommerce.core.catalog.domain.Sku)3 SkuImpl (org.broadleafcommerce.core.catalog.domain.SkuImpl)3 OrderItemPriceDetailAdjustment (org.broadleafcommerce.core.offer.domain.OrderItemPriceDetailAdjustment)3 PromotableOrderImpl (org.broadleafcommerce.core.offer.service.discount.domain.PromotableOrderImpl)3 DiscreteOrderItemImpl (org.broadleafcommerce.core.order.domain.DiscreteOrderItemImpl)3 FulfillmentGroupItem (org.broadleafcommerce.core.order.domain.FulfillmentGroupItem)3 OrderImpl (org.broadleafcommerce.core.order.domain.OrderImpl)3 OrderItem (org.broadleafcommerce.core.order.domain.OrderItem)3