@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));
   }
 }
 @Override
 @Transactional(
     value = "blTransactionManager",
     rollbackFor = {AddToCartException.class})
 public Order addItem(Long orderId, OrderItemRequestDTO orderItemRequestDTO, boolean priceOrder)
     throws AddToCartException {
   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));
   }
 }
 @Override
 @Transactional(
     value = "blTransactionManager",
     rollbackFor = {RemoveFromCartException.class})
 public Order removeItem(Long orderId, Long orderItemId, boolean priceOrder)
     throws RemoveFromCartException {
   try {
     OrderItemRequestDTO orderItemRequestDTO = new OrderItemRequestDTO();
     orderItemRequestDTO.setOrderItemId(orderItemId);
     CartOperationRequest cartOpRequest =
         new CartOperationRequest(findOrderById(orderId), orderItemRequestDTO, priceOrder);
     CartOperationContext context =
         (CartOperationContext) removeItemWorkflow.doActivities(cartOpRequest);
     return context.getSeedData().getOrder();
   } catch (WorkflowException e) {
     throw new RemoveFromCartException(
         "Could not remove from cart", getCartOperationExceptionRootCause(e));
   }
 }
  @Override
  @Transactional(
      value = "blTransactionManager",
      rollbackFor = {UpdateCartException.class, RemoveFromCartException.class})
  public Order updateItemQuantity(
      Long orderId, OrderItemRequestDTO orderItemRequestDTO, boolean priceOrder)
      throws UpdateCartException, RemoveFromCartException {
    if (orderItemRequestDTO.getQuantity() == 0) {
      return removeItem(orderId, orderItemRequestDTO.getOrderItemId(), priceOrder);
    }

    try {
      CartOperationRequest cartOpRequest =
          new CartOperationRequest(findOrderById(orderId), orderItemRequestDTO, priceOrder);
      CartOperationContext context =
          (CartOperationContext) updateItemWorkflow.doActivities(cartOpRequest);
      return context.getSeedData().getOrder();
    } catch (WorkflowException e) {
      throw new UpdateCartException(
          "Could not update cart quantity", getCartOperationExceptionRootCause(e));
    }
  }