Search in sources :

Example 21 with BundleOrderItem

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

the class CheckUpdateAvailabilityActivity method execute.

@Override
public ProcessContext<CartOperationRequest> execute(ProcessContext<CartOperationRequest> context) throws Exception {
    CartOperationRequest request = context.getSeedData();
    OrderItemRequestDTO orderItemRequestDTO = request.getItemRequest();
    if (orderItemRequestDTO instanceof NonDiscreteOrderItemRequestDTO) {
        return context;
    }
    Sku sku;
    Long orderItemId = request.getItemRequest().getOrderItemId();
    OrderItem orderItem = orderItemService.readOrderItemById(orderItemId);
    if (orderItem instanceof DiscreteOrderItem) {
        sku = ((DiscreteOrderItem) orderItem).getSku();
    } else if (orderItem instanceof BundleOrderItem) {
        sku = ((BundleOrderItem) orderItem).getSku();
    } else {
        LOG.warn("Could not check availability; did not recognize passed-in item " + orderItem.getClass().getName());
        return context;
    }
    Order order = context.getSeedData().getOrder();
    Integer requestedQuantity = request.getItemRequest().getQuantity();
    checkSkuAvailability(order, sku, requestedQuantity);
    Integer previousQty = orderItem.getQuantity();
    for (OrderItem child : orderItem.getChildOrderItems()) {
        Sku childSku = ((DiscreteOrderItem) child).getSku();
        Integer childQuantity = child.getQuantity();
        childQuantity = childQuantity / previousQty;
        checkSkuAvailability(order, childSku, childQuantity * requestedQuantity);
    }
    return context;
}
Also used : DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) Order(org.broadleafcommerce.core.order.domain.Order) OrderItemRequestDTO(org.broadleafcommerce.core.order.service.call.OrderItemRequestDTO) NonDiscreteOrderItemRequestDTO(org.broadleafcommerce.core.order.service.call.NonDiscreteOrderItemRequestDTO) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) NonDiscreteOrderItemRequestDTO(org.broadleafcommerce.core.order.service.call.NonDiscreteOrderItemRequestDTO) DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) OrderItem(org.broadleafcommerce.core.order.domain.OrderItem) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) Sku(org.broadleafcommerce.core.catalog.domain.Sku)

Example 22 with BundleOrderItem

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

the class InventoryServiceImpl method buildSkuInventoryMap.

@Override
public Map<Sku, Integer> buildSkuInventoryMap(Order order) {
    // map to hold skus and quantity purchased
    HashMap<Sku, Integer> skuInventoryMap = new HashMap<Sku, Integer>();
    for (OrderItem orderItem : order.getOrderItems()) {
        if (orderItem instanceof DiscreteOrderItem) {
            Sku sku = ((DiscreteOrderItem) orderItem).getSku();
            Integer quantity = skuInventoryMap.get(sku);
            if (quantity == null) {
                quantity = orderItem.getQuantity();
            } else {
                quantity += orderItem.getQuantity();
            }
            if (InventoryType.CHECK_QUANTITY.equals(sku.getInventoryType())) {
                skuInventoryMap.put(sku, quantity);
            }
        } else if (orderItem instanceof BundleOrderItem) {
            BundleOrderItem bundleItem = (BundleOrderItem) orderItem;
            if (InventoryType.CHECK_QUANTITY.equals(bundleItem.getSku().getInventoryType())) {
                // add the bundle sku of quantities to decrement
                skuInventoryMap.put(bundleItem.getSku(), bundleItem.getQuantity());
            }
            // Now add all of the discrete items within the bundl
            List<DiscreteOrderItem> discreteItems = bundleItem.getDiscreteOrderItems();
            for (DiscreteOrderItem discreteItem : discreteItems) {
                if (InventoryType.CHECK_QUANTITY.equals(discreteItem.getSku().getInventoryType())) {
                    Integer quantity = skuInventoryMap.get(discreteItem.getSku());
                    if (quantity == null) {
                        quantity = (discreteItem.getQuantity() * bundleItem.getQuantity());
                    } else {
                        quantity += (discreteItem.getQuantity() * bundleItem.getQuantity());
                    }
                    skuInventoryMap.put(discreteItem.getSku(), quantity);
                }
            }
        }
    }
    return skuInventoryMap;
}
Also used : DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) HashMap(java.util.HashMap) DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) OrderItem(org.broadleafcommerce.core.order.domain.OrderItem) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) List(java.util.List) Sku(org.broadleafcommerce.core.catalog.domain.Sku)

Example 23 with BundleOrderItem

use of org.broadleafcommerce.core.order.domain.BundleOrderItem 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 24 with BundleOrderItem

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

the class FulfillmentItemPricingActivityTest method testBundleDistributionWithoutItemSum.

public void testBundleDistributionWithoutItemSum() throws Exception {
    Order order = dataProvider.createOrderWithBundle();
    Money subTotal = new Money(order.getCurrency());
    for (OrderItem orderItem : order.getOrderItems()) {
        if (orderItem instanceof BundleOrderItem) {
            BundleOrderItem bItem = (BundleOrderItem) orderItem;
            bItem.getProductBundle().setPricingModel(ProductBundlePricingModelType.BUNDLE);
        }
        subTotal = subTotal.add(orderItem.getTotalPrice());
    }
    order.setSubTotal(subTotal);
    OrderAdjustment adjustment = new OrderAdjustmentImpl();
    adjustment.setValue(new Money(new BigDecimal("1"), order.getCurrency()));
    adjustment.setOrder(order);
    order.getOrderAdjustments().add(adjustment);
    ProcessContext<Order> context = new DefaultProcessContextImpl<Order>();
    context.setSeedData(order);
    fulfillmentItemPricingActivity.execute(context);
    assertTrue(sumProratedOfferAdjustments(order).equals(new Money(new BigDecimal("1"), order.getCurrency())));
}
Also used : Order(org.broadleafcommerce.core.order.domain.Order) Money(org.broadleafcommerce.common.money.Money) OrderAdjustmentImpl(org.broadleafcommerce.core.offer.domain.OrderAdjustmentImpl) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) OrderAdjustment(org.broadleafcommerce.core.offer.domain.OrderAdjustment) DefaultProcessContextImpl(org.broadleafcommerce.core.workflow.DefaultProcessContextImpl) OrderItem(org.broadleafcommerce.core.order.domain.OrderItem) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) BigDecimal(java.math.BigDecimal)

Example 25 with BundleOrderItem

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

the class FulfillmentGroupServiceImpl method removeOrderItemFromFullfillmentGroups.

@Override
@Transactional("blTransactionManager")
public void removeOrderItemFromFullfillmentGroups(Order order, OrderItem orderItem) {
    List<FulfillmentGroup> fulfillmentGroups = order.getFulfillmentGroups();
    for (FulfillmentGroup fulfillmentGroup : fulfillmentGroups) {
        Iterator<FulfillmentGroupItem> itr = fulfillmentGroup.getFulfillmentGroupItems().iterator();
        while (itr.hasNext()) {
            FulfillmentGroupItem fulfillmentGroupItem = itr.next();
            if (fulfillmentGroupItem.getOrderItem().equals(orderItem)) {
                itr.remove();
                fulfillmentGroupItemDao.delete(fulfillmentGroupItem);
            } else if (orderItem instanceof BundleOrderItem) {
                BundleOrderItem bundleOrderItem = (BundleOrderItem) orderItem;
                for (DiscreteOrderItem discreteOrderItem : bundleOrderItem.getDiscreteOrderItems()) {
                    if (fulfillmentGroupItem.getOrderItem().equals(discreteOrderItem)) {
                        itr.remove();
                        fulfillmentGroupItemDao.delete(fulfillmentGroupItem);
                        break;
                    }
                }
            }
        }
    }
}
Also used : DiscreteOrderItem(org.broadleafcommerce.core.order.domain.DiscreteOrderItem) BundleOrderItem(org.broadleafcommerce.core.order.domain.BundleOrderItem) FulfillmentGroupItem(org.broadleafcommerce.core.order.domain.FulfillmentGroupItem) FulfillmentGroup(org.broadleafcommerce.core.order.domain.FulfillmentGroup) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

BundleOrderItem (org.broadleafcommerce.core.order.domain.BundleOrderItem)35 DiscreteOrderItem (org.broadleafcommerce.core.order.domain.DiscreteOrderItem)30 OrderItem (org.broadleafcommerce.core.order.domain.OrderItem)23 Order (org.broadleafcommerce.core.order.domain.Order)16 ArrayList (java.util.ArrayList)13 FulfillmentGroupItem (org.broadleafcommerce.core.order.domain.FulfillmentGroupItem)10 FulfillmentGroup (org.broadleafcommerce.core.order.domain.FulfillmentGroup)9 Sku (org.broadleafcommerce.core.catalog.domain.Sku)8 HashMap (java.util.HashMap)7 ProductBundle (org.broadleafcommerce.core.catalog.domain.ProductBundle)5 GiftWrapOrderItem (org.broadleafcommerce.core.order.domain.GiftWrapOrderItem)5 Transactional (org.springframework.transaction.annotation.Transactional)5 Product (org.broadleafcommerce.core.catalog.domain.Product)4 OrderItemRequestDTO (org.broadleafcommerce.core.order.service.call.OrderItemRequestDTO)4 Test (org.testng.annotations.Test)4 List (java.util.List)3 Money (org.broadleafcommerce.common.money.Money)3 Category (org.broadleafcommerce.core.catalog.domain.Category)3 SkuBundleItem (org.broadleafcommerce.core.catalog.domain.SkuBundleItem)3 BigDecimal (java.math.BigDecimal)2