Beispiel #1
0
        public ActionResult Index(BasketRenderingViewModel model)
        {
            var cartServiceProvider = new CartServiceProvider();
            var cart = GetCart();

            foreach (var orderLine in model.OrderLines)
            {
                var newQuantity = orderLine.Quantity;

                if (model.RemoveOrderlineId == orderLine.OrderLineId)
                {
                    newQuantity = 0;
                }

                var bmw = cart.Lines.First(i => i.Product.ProductId == orderLine.Sku);

                bmw.Quantity = (uint)newQuantity;

                if (newQuantity > 0)
                {
                    var updateCartLinesRequest = new UpdateCartLinesRequest(cart, new Collection <CartLine> {
                        bmw
                    });
                    cartServiceProvider.UpdateCartLines(updateCartLinesRequest);
                }
                else
                {
                    var request = new RemoveCartLinesRequest(cart, cart.Lines.Where(l => l.Product.ProductId == bmw.Product.ProductId).ToArray());
                    cartServiceProvider.RemoveCartLines(request);
                }
            }

            return(Redirect("/Cart"));
        }
        /// <summary>
        /// Changes the visitor's cart line quantity.
        /// </summary>
        /// <param name="productId">
        /// The product id.
        /// </param>
        /// <param name="quantity">
        /// The quantity.
        /// </param>
        /// <returns>
        /// The <see cref="Cart"/>.
        /// </returns>
        public Cart ChangeLineQuantity(string productId, uint quantity)
        {
            Assert.ArgumentNotNull(productId, "productId");

            var cart = this.GetCart();

            if (string.IsNullOrWhiteSpace(cart.ShopName))
            {
                cart.ShopName = this.ShopName;
            }

            var cartLineToChange = cart.Lines.SingleOrDefault(cl => cl.Product != null && cl.Product.ProductId == productId);

            if (cartLineToChange == null)
            {
                return(cart);
            }

            cartLineToChange.Quantity = quantity;

            var updateRequest = new UpdateCartLinesRequest(cart, new[] { cartLineToChange });

            var cartResult = this._cartServiceProvider.UpdateCartLines(updateRequest);

            return(this.UpdatePrices(cartResult.Cart));
        }
        /// <summary>
        /// Adds product to the visitor's cart.
        /// </summary>
        /// <param name="productId">
        /// The product id.
        /// </param>
        /// <param name="quantity">
        /// The quantity.
        /// </param>
        /// <returns>
        /// The <see cref="Cart"/>.
        /// </returns>
        public Cart AddToCart(string productId, uint quantity)
        {
            Assert.ArgumentNotNull(productId, "productId");

            var cart = this.GetCart();

            if (string.IsNullOrWhiteSpace(cart.ShopName))
            {
                cart.ShopName = this.ShopName;
            }

            CartResult cartResult;
            var        cartLineToChange = cart.Lines.FirstOrDefault(cl => cl.Product != null && cl.Product.ProductId == productId);

            if (cartLineToChange != null)
            {
                cartLineToChange.Quantity += quantity;
                var updateRequest = new UpdateCartLinesRequest(cart, new[] { cartLineToChange });
                cartResult = this._cartServiceProvider.UpdateCartLines(updateRequest);
            }
            else
            {
                var cartLine = new CartLine {
                    Product = new CartProduct {
                        ProductId = productId
                    }, Quantity = quantity
                };
                this.UpdateStockInformation(cartLine);
                var request = new AddCartLinesRequest(cart, new[] { cartLine });
                cartResult = this._cartServiceProvider.AddCartLines(request);
            }

            return(this.UpdatePrices(cartResult.Cart));
        }
        public ManagerResponse <CartResult, Cart> UpdateLineItemsInCart(
            Cart cart,
            IEnumerable <CartLineArgument> cartLines,
            string giftCardProductId,
            string giftCardPageLink)
        {
            Assert.ArgumentNotNull(cart, nameof(cart));
            Assert.ArgumentNotNull(cartLines, nameof(cartLines));

            var cartLineList = new List <CartLine>();

            foreach (var cartLine in cartLines)
            {
                Assert.ArgumentNotNullOrEmpty(cartLine.ProductId, "inputModel.ProductId");
                Assert.ArgumentNotNullOrEmpty(cartLine.CatalogName, "inputModel.CatalogName");
                Assert.ArgumentNotNull(cartLine.Quantity, "inputModel.Quantity");
                var quantity = cartLine.Quantity;

                bool Selector(CartLine x)
                {
                    var product = (CommerceCartProduct)x.Product;

                    return((x.Product.ProductId == cartLine.ProductId) &&
                           (product.ProductVariantId == cartLine.VariantId) &&
                           (product.ProductCatalog == cartLine.CatalogName));
                }

                var commerceCartLine = cart.Lines.FirstOrDefault(Selector)
                                       ?? new CommerceCartLine(
                    cartLine.CatalogName,
                    cartLine.ProductId,
                    cartLine.VariantId == "-1" ? null : cartLine.VariantId,
                    quantity);
                commerceCartLine.Quantity = quantity;
                cartLineList.Add(commerceCartLine);
            }

            var request          = new UpdateCartLinesRequest(cart, cartLineList);
            var updateCartResult = this.cartServiceProvider.UpdateCartLines(request);

            if (!updateCartResult.Success)
            {
                updateCartResult.SystemMessages.LogSystemMessages(this);
            }

            return(new ManagerResponse <CartResult, Cart>(updateCartResult, updateCartResult.Cart));
        }
        /// <summary>
        /// Changes the line quantity.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="inputModel">The input model.</param>
        /// <returns>
        /// The manager response where the modified CommerceCart is returned in the Result.
        /// </returns>
        public virtual ManagerResponse <CartResult, CommerceCart> ChangeLineQuantity([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] UpdateCartLineInputModel inputModel)
        {
            Assert.ArgumentNotNull(inputModel, "inputModel");
            Assert.ArgumentNotNullOrEmpty(inputModel.ExternalCartLineId, "inputModel.ExternalCartLineId");

            var cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, visitorContext.UserId);

            if (!cartResult.Success || cartResult.Cart == null)
            {
                var message = StorefrontManager.GetSystemMessage(StorefrontConstants.SystemMessages.CartNotFoundError);
                cartResult.SystemMessages.Add(new SystemMessage {
                    Message = message
                });
                return(new ManagerResponse <CartResult, CommerceCart>(cartResult, cartResult.Cart as CommerceCart));
            }

            var cartCache = CommerceTypeLoader.CreateInstance <CartCacheHelper>();

            cartCache.InvalidateCartCache(visitorContext.GetCustomerId());

            var cart   = cartResult.Cart;
            var result = new CartResult {
                Cart = cart, Success = true
            };
            var cartLineToChange = cart.Lines.SingleOrDefault(cl => cl.Product != null && cl.ExternalCartLineId == inputModel.ExternalCartLineId);

            if (inputModel.Quantity == 0 && cartLineToChange != null)
            {
                result = this.RemoveCartLines(cart, new[] { cartLineToChange }, true);
            }
            else if (cartLineToChange != null)
            {
                cartLineToChange.Quantity = inputModel.Quantity;
                var request = new UpdateCartLinesRequest(cart, new[] { cartLineToChange });
                request.RefreshCart(true);
                result = this.CartServiceProvider.UpdateCartLines(request);
            }

            if (result.Success && result.Cart != null)
            {
                cartCache.AddCartToCache(result.Cart as CommerceCart);
            }

            this.AddBasketErrorsToResult(result.Cart as CommerceCart, result);

            return(new ManagerResponse <CartResult, CommerceCart>(result, result.Cart as CommerceCart));
        }
Beispiel #6
0
        public ManagerResponse <CartResult, CommerceCart> ChangeLineQuantity(string userId, UpdateCartLineInputModel inputModel)
        {
            Assert.ArgumentNotNull(inputModel, nameof(inputModel));
            Assert.ArgumentNotNullOrEmpty(inputModel.ExternalCartLineId, nameof(inputModel.ExternalCartLineId));

            var cartResult = LoadCartByName(CommerceConstants.CartSettings.DefaultCartName, userId);

            if (!cartResult.Success || cartResult.Cart == null)
            {
                var message = DictionaryPhraseRepository.Current.Get("/System Messages/Cart/Cart Not Found Error", "Could not retrieve the cart for the current user");
                cartResult.SystemMessages.Add(new SystemMessage {
                    Message = message
                });
                return(new ManagerResponse <CartResult, CommerceCart>(cartResult, cartResult.Cart as CommerceCart));
            }

            CartCacheHelper.InvalidateCartCache(userId);

            var cart   = cartResult.Cart;
            var result = new CartResult {
                Cart = cart, Success = true
            };
            var cartLineToChange = cart.Lines.SingleOrDefault(cl => cl.Product != null && cl.ExternalCartLineId == inputModel.ExternalCartLineId);

            if (inputModel.Quantity == 0 && cartLineToChange != null)
            {
                result = RemoveCartLines(cart, new[] { cartLineToChange }, true);
            }
            else if (cartLineToChange != null)
            {
                cartLineToChange.Quantity = inputModel.Quantity;
                var request = new UpdateCartLinesRequest(cart, new[] { cartLineToChange });
                RefreshCart(request, true);
                result = CartServiceProvider.UpdateCartLines(request);
            }

            if (result.Success && result.Cart != null)
            {
                CartCacheHelper.AddCartToCache(result.Cart as CommerceCart);
            }

            AddBasketErrorsToResult(result.Cart as CommerceCart, result);

            return(new ManagerResponse <CartResult, CommerceCart>(result, result.Cart as CommerceCart));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="UpdateLinesOnCartTest"/> class.
        /// </summary>
        public UpdateLinesOnCartTest()
        {
            this.visitorId = Guid.NewGuid();

            this.lineToUpdate = new CartLine
            {
                ExternalCartLineId = "LineId2",
                Product            = new CartProduct
                {
                    ProductId = "100500",
                    Price     = new Price {
                        Amount = 100
                    }
                },
                Quantity = 12
            };
            this.cart = new Cart
            {
                ExternalId = this.visitorId.ToString(),
                Lines      = new ReadOnlyCollection <CartLine>(new List <CartLine> {
                    new CartLine(), this.lineToUpdate
                })
            };

            this.request = new UpdateCartLinesRequest(this.cart, new[] { this.lineToUpdate });
            this.result  = new CartResult();
            this.args    = new ServicePipelineArgs(this.request, this.result);

            this.client = Substitute.For <ICartsServiceChannel>();

            var clientFactory = Substitute.For <ServiceClientFactory>();

            clientFactory.CreateClient <ICartsServiceChannel>(Arg.Any <string>(), Arg.Any <string>()).Returns(this.client);

            this.processor = new UpdateLinesOnCart {
                ClientFactory = clientFactory
            };
        }
        public PipelineExecutionResult Execute(IPipelineArgs <UpdateLineItemRequest, UpdateLineItemResponse> subject)
        {
            if (subject.Request.Properties.ContainsKey("FromUCommerce"))
            {
                if (!(bool)subject.Request.Properties["FromUCommerce"])
                {
                    return(PipelineExecutionResult.Success);
                }
            }

            if (subject.Request.Quantity > 0)
            {
                var cart                = MappingLibrary.MapPurchaseOrderToCart(subject.Request.OrderLine.PurchaseOrder);
                var cartLine            = MappingLibrary.MapOrderLineToCartLine(subject.Request.OrderLine);
                var cartServiceProvider = new CartServiceProvider();

                var request = new UpdateCartLinesRequest(cart, new Collection <CartLine> {
                    cartLine
                });
                request.Properties["FromUCommerce"] = true;
                cartServiceProvider.UpdateCartLines(request);
            }
            return(PipelineExecutionResult.Success);
        }
        /// <summary>
        /// Merges the carts.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="anonymousVisitorId">The anonymous visitor identifier.</param>
        /// <param name="anonymousVisitorCart">The anonymous visitor cart.</param>
        /// <returns>
        /// The manager response where the merged cart is returned in the result.
        /// </returns>
        public virtual ManagerResponse<CartResult, CommerceCart> MergeCarts([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, string anonymousVisitorId, Cart anonymousVisitorCart)
        {
            Assert.ArgumentNotNull(storefront, "storefront");
            Assert.ArgumentNotNull(visitorContext, "visitorContext");
            Assert.ArgumentNotNullOrEmpty(anonymousVisitorId, "anonymousVisitorId");

            var userId = visitorContext.UserId;
            var cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, userId, true);
            if (!cartResult.Success || cartResult.Cart == null)
            {
                var message = StorefrontManager.GetSystemMessage("CartNotFoundError");
                cartResult.SystemMessages.Add(new SystemMessage { Message = message });
                return new ManagerResponse<CartResult, CommerceCart>(cartResult, cartResult.Cart as CommerceCart);
            }

            CommerceCart currentCart = (CommerceCart)cartResult.Cart;
            var result = new CartResult { Cart = currentCart, Success = true };

            if (userId != anonymousVisitorId)
            {
                if (anonymousVisitorCart != null && anonymousVisitorCart.Lines.Any())
                {
                    if ((currentCart.ShopName == anonymousVisitorCart.ShopName) || (currentCart.ExternalId != anonymousVisitorCart.ExternalId))
                    {
                        var mergeCartRequest = new MergeCartRequest(anonymousVisitorCart, currentCart);
                        result = this.CartServiceProvider.MergeCart(mergeCartRequest);
                        if (result.Success)
                        {
                            var updateCartRequest = new UpdateCartLinesRequest(result.Cart, anonymousVisitorCart.Lines);
                            updateCartRequest.RefreshCart(true);
                            result = this.CartServiceProvider.UpdateCartLines(updateCartRequest);
                            if (result.Success)
                            {
                                this.CartServiceProvider.DeleteCart(new DeleteCartRequest(anonymousVisitorCart));
                            }
                        }
                    }
                }
            }

            if (result.Success && result.Cart != null)
            {
                var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>();
                cartCache.InvalidateCartCache(anonymousVisitorId);
                cartCache.AddCartToCache(result.Cart as CommerceCart);
            }

            return new ManagerResponse<CartResult, CommerceCart>(result, result.Cart as CommerceCart);
        }
        /// <summary>
        /// Changes the line quantity.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="inputModel">The input model.</param>
        /// <returns>
        /// The manager response where the modified CommerceCart is returned in the Result.
        /// </returns>
        public virtual ManagerResponse<CartResult, CommerceCart> ChangeLineQuantity([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] UpdateCartLineInputModel inputModel)
        {
            Assert.ArgumentNotNull(inputModel, "inputModel");
            Assert.ArgumentNotNullOrEmpty(inputModel.ExternalCartLineId, "inputModel.ExternalCartLineId");

            var cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, visitorContext.UserId);
            if (!cartResult.Success || cartResult.Cart == null)
            {
                var message = StorefrontManager.GetSystemMessage("CartNotFoundError");
                cartResult.SystemMessages.Add(new SystemMessage { Message = message });
                return new ManagerResponse<CartResult, CommerceCart>(cartResult, cartResult.Cart as CommerceCart);
            }

            var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>();
            cartCache.InvalidateCartCache(visitorContext.GetCustomerId());

            // We remove the curly brackets from the JSON for the lineitem id.  We need to add them back.
            inputModel.ExternalCartLineId = Guid.Parse(inputModel.ExternalCartLineId).ToString("B");

            var cart = cartResult.Cart;
            var result = new CartResult { Cart = cart, Success = true };
            var cartLineToChange = cart.Lines.SingleOrDefault(cl => cl.Product != null && cl.ExternalCartLineId == inputModel.ExternalCartLineId);
            if (inputModel.Quantity == 0 && cartLineToChange != null)
            {
                result = this.RemoveCartLines(cart, new[] { cartLineToChange }, true);
            }
            else if (cartLineToChange != null)
            {
                cartLineToChange.Quantity = inputModel.Quantity;
                var request = new UpdateCartLinesRequest(cart, new[] { cartLineToChange });
                request.RefreshCart(true);
                result = this.CartServiceProvider.UpdateCartLines(request);
            }

            if (result.Success && result.Cart != null)
            {
                cartCache.AddCartToCache(result.Cart as CommerceCart);
            }

            this.AddBasketErrorsToResult(result.Cart as CommerceCart, result);

            return new ManagerResponse<CartResult, CommerceCart>(result, result.Cart as CommerceCart);
        }