@Override
  @Transactional("blTransactionManager")
  public Order addItemFromNamedOrder(
      Order namedOrder, OrderItem item, int quantity, boolean priceOrder)
      throws RemoveFromCartException, AddToCartException, UpdateCartException {
    // Validate that the quantity requested makes sense
    if (quantity < 1 || quantity > item.getQuantity()) {
      throw new IllegalArgumentException("Cannot move 0 or less quantity");
    } else if (quantity == item.getQuantity()) {
      return addItemFromNamedOrder(namedOrder, item, priceOrder);
    }

    Order cartOrder = orderDao.readCartForCustomer(namedOrder.getCustomer());
    if (cartOrder == null) {
      cartOrder = createNewCartForCustomer(namedOrder.getCustomer());
    }

    if (moveNamedOrderItems) {
      // Update the old item to its new quantity only if we're moving items
      OrderItemRequestDTO orderItemRequestDTO = new OrderItemRequestDTO();
      orderItemRequestDTO.setOrderItemId(item.getId());
      orderItemRequestDTO.setQuantity(item.getQuantity() - quantity);
      updateItemQuantity(namedOrder.getId(), orderItemRequestDTO, false);
    }

    OrderItemRequestDTO orderItemRequest =
        orderItemService.buildOrderItemRequestDTOFromOrderItem(item);
    orderItemRequest.setQuantity(quantity);
    cartOrder = addItem(cartOrder.getId(), orderItemRequest, priceOrder);

    return cartOrder;
  }
 @Override
 @Transactional(
     value = "blTransactionManager",
     rollbackFor = {AddToCartException.class})
 public Order addItemWithPriceOverrides(
     Long orderId, OrderItemRequestDTO orderItemRequestDTO, boolean priceOrder)
     throws AddToCartException {
   Order order = findOrderById(orderId);
   if (automaticallyMergeLikeItems) {
     OrderItem item = findMatchingItem(order, orderItemRequestDTO);
     if (item != null) {
       orderItemRequestDTO.setQuantity(item.getQuantity() + orderItemRequestDTO.getQuantity());
       orderItemRequestDTO.setOrderItemId(item.getId());
       try {
         return updateItemQuantity(orderId, orderItemRequestDTO, priceOrder);
       } catch (RemoveFromCartException e) {
         throw new AddToCartException(
             "Unexpected error - system tried to remove item while adding to cart", e);
       } catch (UpdateCartException e) {
         throw new AddToCartException("Could not update quantity for matched item", e);
       }
     }
   }
   try {
     CartOperationRequest cartOpRequest =
         new CartOperationRequest(findOrderById(orderId), orderItemRequestDTO, priceOrder);
     CartOperationContext context =
         (CartOperationContext) addItemWorkflow.doActivities(cartOpRequest);
     return context.getSeedData().getOrder();
   } catch (WorkflowException e) {
     throw new AddToCartException("Could not add to cart", getCartOperationExceptionRootCause(e));
   }
 }
 public Money calculateOrderItemsPriceWithoutAdjustments() {
   Money calculatedSubTotal = new Money();
   for (OrderItem orderItem : delegate.getOrderItems()) {
     Money price = orderItem.getPriceBeforeAdjustments(true);
     calculatedSubTotal = calculatedSubTotal.add(price.multiply(orderItem.getQuantity()));
   }
   return calculatedSubTotal;
 }
  @RequestMapping(value = "/viewCart.htm", method = RequestMethod.GET)
  public String viewCart(ModelMap model, HttpServletRequest request) throws PricingException {
    Order cart = retrieveCartOrder(request, model);
    CartSummary cartSummary = new CartSummary();

    if (cart.getOrderItems() != null) {
      for (OrderItem orderItem : cart.getOrderItems()) {
        if (orderItem instanceof DiscreteOrderItem) {
          Sku sku = catalogService.findSkuById(((DiscreteOrderItem) orderItem).getSku().getId());
          if (!(sku.getSalePrice().equals(((DiscreteOrderItem) orderItem).getSalePrice()))) {
            orderItem.setSalePrice(sku.getSalePrice());
          }
          if (!(sku.getRetailPrice().equals(((DiscreteOrderItem) orderItem).getRetailPrice()))) {
            orderItem.setRetailPrice(sku.getRetailPrice());
          }

          if (orderItem.getSalePrice() != orderItem.getRetailPrice()) {
            orderItem.setPrice(orderItem.getSalePrice());
          } else {
            orderItem.setPrice(orderItem.getRetailPrice());
          }

          orderItem.getPrice();
        }
      }
    }

    if (cart.getOrderItems() != null) {
      for (OrderItem orderItem : cart.getOrderItems()) {
        CartOrderItem cartOrderItem = new CartOrderItem();
        cartOrderItem.setOrderItem(orderItem);
        cartOrderItem.setQuantity(orderItem.getQuantity());
        cartSummary.getRows().add(cartOrderItem);
      }
    }

    if ((cart.getFulfillmentGroups() != null) && (cart.getFulfillmentGroups().isEmpty() == false)) {
      String cartShippingMethod = cart.getFulfillmentGroups().get(0).getMethod();
      String cartShippingService = cart.getFulfillmentGroups().get(0).getService();

      if (cartShippingMethod != null) {
        if (cartShippingMethod.equals("standard")) {
          cartSummary = createFulfillmentGroup(cartSummary, "standard", cartShippingService, cart);
        } else if (cartShippingMethod.equals("expedited")) {
          cartSummary = createFulfillmentGroup(cartSummary, "expedited", cartShippingService, cart);
        }
      }
    }

    updateFulfillmentGroups(cartSummary, cart);
    cartSummary.setOrderDiscounts(cart.getTotalAdjustmentsValue().getAmount());
    model.addAttribute("cartSummary", cartSummary);
    return cartViewRedirect ? "redirect:" + cartView : cartView;
  }
  @Override
  public void printOrder(Order order, Log log) {
    if (!log.isDebugEnabled()) {
      return;
    }

    TableCreator tc =
        new TableCreator(
            new TableCreator.Col[] {
              new TableCreator.Col("Order Item", 30),
              new TableCreator.Col("Qty"),
              new TableCreator.Col("Unit Price"),
              new TableCreator.Col("Avg Adj"),
              new TableCreator.Col("Total Adj"),
              new TableCreator.Col("Total Price")
            });

    for (OrderItem oi : order.getOrderItems()) {
      tc.addRow(
          new String[] {
            oi.getName(),
            String.valueOf(oi.getQuantity()),
            String.valueOf(oi.getPriceBeforeAdjustments(true)),
            String.valueOf(oi.getAverageAdjustmentValue()),
            String.valueOf(oi.getTotalAdjustmentValue()),
            String.valueOf(oi.getTotalPrice())
          });
    }

    tc.addSeparator()
        .withGlobalRowHeaderWidth(15)
        .addRow("Subtotal", order.getSubTotal())
        .addRow("Order Adj.", order.getOrderAdjustmentsValue())
        .addRow("Tax", order.getTotalTax())
        .addRow("Shipping", order.getTotalShipping())
        .addRow("Total", order.getTotal())
        .addSeparator();

    log.debug(tc.toString());
  }