/// <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(StorefrontConstants.SystemMessages.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)
            {
                var anonymousCartHasPromocodes = (anonymousVisitorCart is CommerceCart) &&
                                                 ((CommerceCart)anonymousVisitorCart).OrderForms.Any(of => of.PromoCodes.Any());

                if (anonymousVisitorCart != null && (anonymousVisitorCart.Lines.Any() || anonymousCartHasPromocodes))
                {
                    if ((currentCart.ShopName == anonymousVisitorCart.ShopName) || (currentCart.ExternalId != anonymousVisitorCart.ExternalId))
                    {
                        var mergeCartRequest = new MergeCartRequest(anonymousVisitorCart, currentCart);
                        result = this.CartServiceProvider.MergeCart(mergeCartRequest);
                    }
                }
            }

            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));
        }
示例#2
0
        public ManagerResponse <CartResult, CommerceCart> MergeCarts(string newUserId, string previousUserId, Cart anonymousVisitorCart)
        {
            Assert.ArgumentNotNullOrEmpty(previousUserId, nameof(previousUserId));
            Assert.ArgumentNotNullOrEmpty(newUserId, nameof(newUserId));

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

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

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

            if (newUserId != previousUserId)
            {
                var anonymousCartHasPromocodes = anonymousVisitorCart is CommerceCart &&
                                                 ((CommerceCart)anonymousVisitorCart).OrderForms.Any(of => of.PromoCodes.Any());

                if (anonymousVisitorCart != null && (anonymousVisitorCart.Lines.Any() || anonymousCartHasPromocodes))
                {
                    if (currentCart.ShopName == anonymousVisitorCart.ShopName || currentCart.ExternalId != anonymousVisitorCart.ExternalId)
                    {
                        var mergeCartRequest = new MergeCartRequest(anonymousVisitorCart, currentCart);
                        result = CartServiceProvider.MergeCart(mergeCartRequest);
                    }
                }
            }

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

            return(new ManagerResponse <CartResult, CommerceCart>(result, result.Cart as CommerceCart));
        }
        /// <summary>
        /// Merges the carts.
        /// </summary>
        /// <param name="userCart">The user cart.</param>
        /// <param name="anonymousCart">The anonymous cart.</param>
        /// <returns>
        /// The merged cart.
        /// </returns>
        public Cart MergeCarts([NotNull] Cart userCart, [NotNull] Cart anonymousCart)
        {
            Assert.ArgumentNotNull(userCart, "userCart");
            Assert.ArgumentNotNull(anonymousCart, "anonymousCart");

            userCart = this.EnsureCorrectCartUserId(userCart);

            if ((userCart.ShopName == anonymousCart.ShopName) && (userCart.ExternalId != anonymousCart.ExternalId))
            {
                var mergeCartRequest = new MergeCartRequest(anonymousCart, userCart);
                var result           = this._cartServiceProvider.MergeCart(mergeCartRequest);

                this._cartServiceProvider.DeleteCart(new DeleteCartRequest(anonymousCart));

                return(result.Cart);
            }

            return(userCart);
        }
        /// <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);
        }