示例#1
0
        private void ArrangeGetShippingInfo(bool isGetShippingMethodsFailed = false)
        {
            this.cartResult         = this.fixture.Create <CartResult>();
            this.cartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(this.cartResult);

            var shippingMethodsResult = this.fixture.Create <GetShippingMethodsResult>();

            this.shippingManager.GetShippingMethods(Arg.Any <Cart>(), Arg.Any <ShippingOptionType>())
            .Returns(shippingMethodsResult);

            var mappedShippingMethods = this.fixture.Create <List <ShippingMethod> >();

            this.fixture.Customizations.Add(
                new TypeRelay(
                    typeof(IReadOnlyCollection <Sitecore.Commerce.Entities.Shipping.ShippingMethod>),
                    typeof(List <ShippingMethod>)));
            this.shippingMapper
            .Map <IReadOnlyCollection <Sitecore.Commerce.Entities.Shipping.ShippingMethod>, List <ShippingMethod> >(
                shippingMethodsResult.ShippingMethods)
            .Returns(mappedShippingMethods);

            if (isGetShippingMethodsFailed)
            {
                shippingMethodsResult.Success = false;
                shippingMethodsResult.SystemMessages.Add(new SystemMessage("Test message"));
            }
        }
        public void GetBillingInfo_IfGetPaymentOptionsFailed_ShouldReturnsError(
            CartResult cartResult,
            GetPaymentOptionsResult optionsResult,
            SystemMessage systemMessage)
        {
            //arrange
            cartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(cartResult);

            optionsResult.Success = false;
            optionsResult.SystemMessages.Add(systemMessage);
            this.paymentManager.GetPaymentOptions(Arg.Any <string>(), Arg.Any <Cart>()).Returns(optionsResult);

            //act
            Result <BillingInfo> result;

            using (new SiteContextSwitcher(this.siteContext))
            {
                result = this.billingService.GetBillingInfo();
            }

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SaveCartTest"/> class.
        /// </summary>
        public SaveCartTest()
        {
            this.cart = new Cart {
                Lines = new ReadOnlyCollection <CartLine>(new List <CartLine> {
                    new CartLine {
                        Product = new CartProduct {
                            ProductId = "Audi S4"
                        }, Quantity = 5
                    },
                })
            };
            this.request = new SaveCartRequest(this.cart);
            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 SaveCart {
                ClientFactory = clientFactory
            };
        }
        public ManagerResponse <CartResult, Cart> UpdateCart(string shopName, Cart currentCart, CartBase cartUpdate)
        {
            var        request = new UpdateCartRequest(currentCart, cartUpdate);
            CartResult serviceProviderResult = this.cartServiceProvider.UpdateCart(request);

            return(new ManagerResponse <CartResult, Cart>(serviceProviderResult, serviceProviderResult.Cart));
        }
        public void SetPaymentInfo_IfAddPaymentInfoFailed_ShouldReturnsError(
            CartResult loadCartResult,
            CartResult updateCartResult,
            CartResult removeCartResult,
            AddPaymentInfoResult addCartResult,
            Address address,
            Party party,
            Models.Entities.Payment.FederatedPaymentInfo federatedPaymentInfo,
            SystemMessage systemMessage)
        {
            //arrange
            loadCartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(loadCartResult);

            updateCartResult.Success = true;
            this.cartManager.UpdateCart(Arg.Any <Cart>(), Arg.Any <CartBase>()).Returns(updateCartResult);

            removeCartResult.Success = true;
            this.cartManager.RemovePaymentInfo(Arg.Any <Cart>()).Returns(removeCartResult);

            addCartResult.Success = false;
            addCartResult.SystemMessages.Add(systemMessage);
            this.cartManager.AddPaymentInfo(Arg.Any <Cart>(), Arg.Any <Party>(), Arg.Any <FederatedPaymentInfo>()).Returns(addCartResult);

            this.paymentMapper.Map <Address, Party>(address).Returns(party);

            //act
            var result = this.billingService.SetPaymentInfo(address, federatedPaymentInfo);

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }
        public ManagerResponse <CartResult, Cart> MergeCarts(string shopName, string customerId, string anonymousVisitorId, Cart anonymousVisitorCart)
        {
            Assert.ArgumentNotNullOrEmpty(anonymousVisitorId, "anonymousVisitorId");
            var request    = new LoadCartByNameRequest(shopName, Constants.DefaultCartName, customerId);
            var cartResult = this.cartServiceProvider.LoadCart(request);

            if (!cartResult.Success || cartResult.Cart == null)
            {
                Log.Warn("Cart Not Found Error", this.GetType());
                return(new ManagerResponse <CartResult, Cart>(cartResult, cartResult.Cart));
            }
            var commerceCart  = (CommerceCart)cartResult.Cart;
            var newCartResult = new CartResult
            {
                Cart    = commerceCart,
                Success = true
            };

            if (customerId != anonymousVisitorId)
            {
                bool flag = anonymousVisitorCart is CommerceCart && ((CommerceCart)anonymousVisitorCart).OrderForms.Any((of => of.PromoCodes.Any()));
                if (anonymousVisitorCart != null && anonymousVisitorCart.Lines.Any() | flag && (commerceCart.ShopName == anonymousVisitorCart.ShopName || commerceCart.ExternalId != anonymousVisitorCart.ExternalId))
                {
                    newCartResult = this.cartServiceProvider.MergeCart(new MergeCartRequest(anonymousVisitorCart, commerceCart));
                }
            }

            return(new ManagerResponse <CartResult, Cart>(newCartResult, newCartResult.Cart));
        }
        public CartServiceTests()
        {
            this.cartBuilder      = Substitute.For <ICartBuilder <Connect.Cart> >();
            this.cartManager      = Substitute.For <ICartManager>();
            this.inventoryManager = Substitute.For <IInventoryManager>();
            var catalogContext = Substitute.For <ICatalogContext>();

            this.catalogService = Substitute.For <ICatalogService>();
            var storefrontContext = Substitute.For <IStorefrontContext>();

            this.visitorContext = Substitute.For <IVisitorContext>();

            this.cartService = new CartService(
                this.cartBuilder,
                this.cartManager,
                this.inventoryManager,
                catalogContext,
                catalogService,
                storefrontContext,
                this.visitorContext);

            this.fixture = new Fixture().Customize(new OmitOnRecursionCustomization());

            this.cartResult      = this.fixture.Create <CartResult>();
            this.commerceCart    = this.fixture.Create <CommerceCart>();
            this.cartResult.Cart = this.commerceCart;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(this.cartResult);
        }
示例#8
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RemoveLinesFromCartTest"/> class.
        /// </summary>
        public RemoveLinesFromCartTest()
        {
            this.visitorId = Guid.NewGuid();

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

            this.request = new RemoveCartLinesRequest(this.cart, new[] { this.lineToRemove });
            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 RemoveLinesFromCart {
                ClientFactory = clientFactory
            };
        }
        public void GetBillingInfo_IfGetPaymentMethodsFailed_ShouldReturnsError(
            CartResult cartResult,
            GetPaymentOptionsResult optionsResult,
            GetPaymentMethodsResult methodsResult,
            SystemMessage systemMessage,
            List <Models.Entities.Payment.PaymentOption> mappedPaymentOptions)
        {
            //arrange
            cartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(cartResult);

            optionsResult.Success = true;
            this.paymentManager.GetPaymentOptions(Arg.Any <string>(), Arg.Any <Cart>()).Returns(optionsResult);

            methodsResult.Success = false;
            methodsResult.SystemMessages.Add(systemMessage);
            this.paymentManager.GetPaymentMethods(Arg.Any <Cart>(), Arg.Any <PaymentOption>()).Returns(methodsResult);

            this.paymentMapper.Map <IReadOnlyCollection <PaymentOption>, List <Models.Entities.Payment.PaymentOption> >(optionsResult.PaymentOptions)
            .Returns(mappedPaymentOptions);

            //act
            Result <BillingInfo> result;

            using (new SiteContextSwitcher(this.siteContext))
            {
                result = this.billingService.GetBillingInfo();
            }

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }
示例#10
0
        // TODO separate getting product thumbnail, varation options from here
        public async Task <CartResult> GetActiveCartDetails(int customerId, int createdById)
        {
            var cart = await GetActiveCart(customerId, createdById).FirstOrDefaultAsync();

            if (cart == null)
            {
                return(new CartResult());
            }

            var cartVm = new CartResult()
            {
                Id             = cart.Id,
                CouponCode     = cart.CouponCode,
                ShippingAmount = cart.ShippingAmount,
                OrderNote      = cart.OrderNote
            };

            cartVm.Items = _cartItemRepository.Query()
                           .Include(x => x.Product).ThenInclude(p => p.ThumbnailImage)
                           .Include(x => x.Product).ThenInclude(p => p.OptionCombinations).ThenInclude(o => o.Option)
                           .Where(x => x.CartId == cart.Id)
                           .Select(x => new CartItemResult
            {
                Id               = x.Id,
                ProductId        = x.ProductId,
                ProductName      = x.Product.Name,
                ProductPrice     = x.Product.Price,
                IsChecked        = x.IsChecked,
                Quantity         = x.Quantity,
                ProductImage     = x.Product.ThumbnailImage.Url,
                VariationOptions = x.Product.OptionCombinations.Select(c => new ProductVariationOption
                {
                    OptionName = c.Option.Name,
                    Value      = c.Value
                })
            }).ToList();

            //if (!string.IsNullOrWhiteSpace(cartVm.CouponCode))
            //{
            //    var cartInfoForCoupon = new CartInfoForCoupon
            //    {
            //        Items = cartVm.Items.Select(x => new CartItemForCoupon { ProductId = x.ProductId, Quantity = x.Quantity }).ToList()
            //    };
            //    var couponValidationResult = await _couponService.Validate(customerId, cartVm.CouponCode, cartInfoForCoupon);
            //    if (couponValidationResult.Succeeded)
            //    {
            //        cartVm.Discount = couponValidationResult.DiscountAmount;
            //    }
            //    else
            //    {
            //        cartVm.CouponValidationErrorMessage = couponValidationResult.ErrorMessage;
            //    }
            //}

            return(cartVm);
        }
        public async Task <Result> List()
        {
            var user = await _workContext.GetCurrentUserOrNullAsync();

            var cart = new CartResult();

            if (user != null)
            {
                cart = await _cartService.GetActiveCartDetails(user.Id);
            }
            return(Result.Ok(cart));
        }
示例#12
0
        public IHttpActionResult GetCart() //Returns all images registered in the database as a json array object
        {
            var items      = _cartService.GetCartItems();
            var cartResult = new CartResult
            {
                Items       = items,
                ItemsInCart = items.Count,
                TotalPrice  = items.Sum(item => item.Price)
            };

            return(Json(cartResult));
        }
        /// <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));
        }
        /// <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));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="LoadCartTest"/> class.
        /// </summary>
        public LoadCartTest()
        {
            this.visitorId = Guid.NewGuid();
            this.request   = new LoadCartRequest("NopShop", this.visitorId.ToString());
            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 LoadCart {
                ClientFactory = clientFactory
            };
        }
        public void GetBillingInfo_IfCartIsEmpty_ShouldReturnsEmptyBillingInfo(CartResult cartResult)
        {
            //arrange
            cartResult.Cart = new Cart();
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(cartResult);

            //act
            Result <BillingInfo> result;

            using (new SiteContextSwitcher(this.siteContext))
            {
                result = this.billingService.GetBillingInfo();
            }

            //assert
            Assert.True(result.Success);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="CartsServiceTest"/> class.
        /// </summary>
        public CartsServiceTest()
        {
            this.cart = new Cart();
            this.cartFromAnonymous = new Cart();

            this.result = new CartResult {
                Cart = this.cart
            };
            this.resultFromAnonymous = new CartResult {
                Cart = this.cartFromAnonymous
            };

            this.cartServiceProvider = Substitute.For <CartServiceProvider>();
            this.cartServiceProvider.CreateOrResumeCart(Arg.Is <CreateOrResumeCartRequest>(r => r.UserId == "John Carter")).Returns(this.result);

            var pricesResult = new GetProductPricesResult();

            pricesResult.Prices.Add("List", new Price(0, "USD"));
            this.pricingService = Substitute.For <PricingServiceProvider>();
            this.pricingService.GetProductPrices(Arg.Any <GetProductPricesRequest>()).Returns(pricesResult);

            this.contactId = Guid.NewGuid();
            this.cartServiceProvider.CreateOrResumeCart(Arg.Is <CreateOrResumeCartRequest>(r => r.UserId == ID.Parse(this.contactId).ToString())).Returns(this.resultFromAnonymous);

            this.cartServiceProvider.GetCarts(Arg.Any <GetCartsRequest>()).Returns(new GetCartsResult {
                Carts = Enumerable.Empty <CartBase>()
            });
            this.contactFactory = Substitute.For <ContactFactory>();
            this.contactFactory.GetContact().Returns("John Carter");

            var inventoryResult = new GetStockInformationResult();

            inventoryResult.StockInformation.ToList().Add(new StockInformation {
                Product = new InventoryProduct {
                    ProductId = "1001"
                }, Status = StockStatus.InStock
            });
            this._inventoryService = Substitute.For <InventoryServiceProvider>();
            this._inventoryService.GetStockInformation(Arg.Any <GetStockInformationRequest>()).Returns(inventoryResult);

            this._customerService = Substitute.For <CustomerServiceProvider>();

            this._wishListServiceProvider = Substitute.For <WishListServiceProvider>();

            this.service = new CartService(this.cartServiceProvider, this._wishListServiceProvider, this.pricingService, "autohaus", this.contactFactory, this._inventoryService, this._customerService);
        }
        protected override void DoTrack(IPageContext pageContext, IPageEventDefinition eventDefinition, CommerceEventInstance eventInstance)
        {
            var request = CreateCartLinesRequest(eventInstance);
            var result  = new CartResult {
                Cart = request.Cart
            };                                                   // Connect requires result cart to be filled.
            var args = new ServicePipelineArgs(request, result);

            // Trigger Commerce Connect Analytics processor
            var trigger = new TriggerCartLinesPageEvent()
            {
                Name = eventInstance.CommerceEventId,
                Text = eventInstance.CommerceEventId //Text equals id in practice, so for simplicity reuse it
            };

            trigger.Process(args);
        }
示例#19
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));
        }
        public void SetPaymentInfo__IfLoadCartFailed_ShouldReturnsError(
            CartResult cartResult,
            Address address,
            Models.Entities.Payment.FederatedPaymentInfo federatedPaymentInfo,
            SystemMessage systemMessage)
        {
            //arrange
            cartResult.Success = false;
            cartResult.SystemMessages.Add(systemMessage);
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(cartResult);

            //act
            var result = this.billingService.SetPaymentInfo(address, federatedPaymentInfo);

            //assert
            Assert.False(result.Success);
            Assert.Equal(systemMessage.Message, result.Errors[0]);
        }
示例#21
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));
        }
示例#22
0
        public ActionResult Index()
        {
            var               user     = User.Identity.Name;
            Customer          customer = db.Customers.Where(x => x.Username == user).First();
            Shopping          cart     = db.Shoppings.Where(x => x.CustomerID == customer.CustomerID).First();
            List <CartResult> results  = new List <CartResult>();

            using (SqlConnection connection = new SqlConnection("data source=cs.cofo.edu;initial catalog=gvaught;persist security info=True;user id=gvaught;password=beargav;MultipleActiveResultSets=True;App=EntityFramework"))
            {
                SqlCommand cmd = new SqlCommand("usp_GetCart", connection);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter p1 = new SqlParameter("@cartID", SqlDbType.Int);
                SqlParameter p2 = new SqlParameter("@custID", SqlDbType.Int);
                p1.Value = cart.CartID;
                p2.Value = customer.CustomerID;
                cmd.Parameters.Add(p1);
                cmd.Parameters.Add(p2);
                connection.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    CartResult book = new CartResult();
                    book.BookID      = (int)dr["BookID"];
                    book.Title       = (string)dr["Title"];
                    book.ISBN        = (string)dr["ISBN"];
                    book.PublisherID = (int)dr["PublisherID"];
                    book.PublishYear = (int)dr["PublishYear"];
                    book.PageNum     = (int)dr["PageNum"];
                    book.Language    = (string)dr["Language"];
                    book.Edition     = (int)dr["Edition"];
                    book.CoverType   = (string)dr["CoverType"];
                    book.Amount      = (int)dr["Amount"];
                    book.Price       = (decimal)dr["Price"];
                    book.TotalPrice  = (decimal)dr["TotalPrice"];
                    book.CustomerID  = (int)dr["CustomerID"];
                    results.Add(book);
                }
                connection.Close();
            }

            //var shoppings = db.Shoppings.Include(s => s.Customer);
            return(View(results));
        }
        public CartServiceTests()
        {
            var storefrontContext = Substitute.For <IStorefrontContext>();
            var catalogContext    = Substitute.For <ICatalogContext>();

            this.cartManager    = Substitute.For <ICartManager>();
            this.cartBuilder    = Substitute.For <ICartBuilder <Connect.Cart> >();
            this.fixture        = this.CreateOmitOnRecursionFixture();
            this.visitorContext = Substitute.For <IVisitorContext>();
            this.cartService    = new CartService(
                this.cartManager,
                storefrontContext,
                catalogContext,
                this.visitorContext,
                this.cartBuilder);

            this.cartResult      = this.fixture.Create <CartResult>();
            this.commerceCart    = this.fixture.Create <CommerceCart>();
            this.cartResult.Cart = this.commerceCart;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(this.cartResult);
        }
        /// <summary>
        /// Returns the current user cart.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="customerId">The customer identifier.</param>
        /// <param name="refresh">if set to <c>true</c> [refresh].</param>
        /// <returns>
        /// The manager response where the modified CommerceCart is returned in the Result.
        /// </returns>
        public virtual ManagerResponse <CartResult, CommerceCart> GetCurrentCart([NotNull] CommerceStorefront storefront, [NotNull] string customerId, bool refresh = false)
        {
            var cartCache = CommerceTypeLoader.CreateInstance <CartCacheHelper>();

            if (refresh)
            {
                cartCache.InvalidateCartCache(customerId);
            }

            var cart = cartCache.GetCart(customerId);

            if (cart != null)
            {
                var result = new CartResult {
                    Cart = cart
                };
                this.AddBasketErrorsToResult(result.Cart as CommerceCart, result);
                return(new ManagerResponse <CartResult, CommerceCart>(result, cart));
            }

            CartResult cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, customerId, refresh);

            if (cartResult.Success && cartResult.Cart != null)
            {
                cart            = cartResult.Cart as CommerceCart;
                cartResult.Cart = cart;
                cartCache.AddCartToCache(cart);
            }
            else
            {
                var message = StorefrontManager.GetSystemMessage(StorefrontConstants.SystemMessages.CartNotFoundError);
                cartResult.SystemMessages.Add(new SystemMessage {
                    Message = message
                });
            }

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

            return(new ManagerResponse <CartResult, CommerceCart>(cartResult, cart));
        }
        public ManagerResponse <CartResult, CommerceCart> GetCart(string userId, bool refresh = false)
        {
            if (refresh)
            {
                CartCacheHelper.InvalidateCartCache(userId);
            }

            var cart = CartCacheHelper.GetCart(userId);

            if (cart != null)
            {
                var result = new CartResult {
                    Cart = cart
                };
                AddBasketErrorsToResult(result.Cart as CommerceCart, result);
                return(new ManagerResponse <CartResult, CommerceCart>(result, cart));
            }

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

            if (cartResult.Success && cartResult.Cart != null)
            {
                cart            = cartResult.Cart as CommerceCart;
                cartResult.Cart = cart;
                CartCacheHelper.AddCartToCache(cart);
            }
            else
            {
                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
                });
            }

            AddBasketErrorsToResult(cartResult.Cart as CommerceCart, cartResult);

            return(new ManagerResponse <CartResult, CommerceCart>(cartResult, cart));
        }
        protected virtual Result <CartModel> GetCart(CartResult serviceProviderResult, Cart cart)
        {
            var result = new Result <CartModel>();

            try
            {
                var model = this.CartModelBuilder.Initialize(cart);
                result.SetResult(model);

                // ToDo: investigate the sometimes issue where Success=false but no any errors and the action is success
                if (serviceProviderResult.SystemMessages.Any() || (cart == null))
                {
                    result.SetErrors(serviceProviderResult);
                }
            }
            catch (Exception ex)
            {
                result.SetErrors(nameof(this.GetCart), ex);
            }

            return(result);
        }
示例#27
0
        private void ArrangeSetShippingOptions()
        {
            this.cartResult         = this.fixture.Create <CartResult>();
            this.cartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(this.cartResult);

            var commerceParties    = this.fixture.Create <List <CommerceParty> >();
            var shippingOptionType = this.fixture.Create <ShippingOptionType>();

            this.shippingMapper.Map <List <Address>, List <CommerceParty> >(Arg.Any <List <Address> >())
            .Returns(commerceParties);
            this.shippingMapper.Map <string, ShippingOptionType>(Arg.Any <string>()).Returns(shippingOptionType);

            this.fixture.Customizations.Add(
                new TypeRelay(typeof(IReadOnlyCollection <ShippingInfo>), typeof(List <ShippingInfo>)));
            var addShippingInfoResult = this.fixture.Create <AddShippingInfoResult>();

            this.cartManager.AddShippingInfo(
                Arg.Any <Cart>(),
                Arg.Any <ShippingOptionType>(),
                Arg.Any <List <ShippingInfo> >())
            .Returns(addShippingInfoResult);
        }
示例#28
0
        private void ArrageGetDeliveryInfo(
            bool isGetShippingOptionsFailed = false,
            bool isGetCustomerPartiesFailed = false)
        {
            this.cartResult         = this.fixture.Create <CartResult>();
            this.cartResult.Success = true;
            this.cartManager.LoadCart(Arg.Any <string>(), Arg.Any <string>()).Returns(this.cartResult);

            var shippingOptionsResult = this.fixture.Create <GetShippingOptionsResult>();

            this.shippingManager.GetShippingOptions(Arg.Any <Cart>()).Returns(shippingOptionsResult);

            var mappedShippingOptions = this.fixture.Create <List <Models.Entities.Shipping.ShippingOption> >();

            this.shippingMapper
            .Map <IReadOnlyCollection <ShippingOption>, List <Models.Entities.Shipping.ShippingOption> >(
                shippingOptionsResult.ShippingOptions)
            .Returns(mappedShippingOptions);

            this.fixture.Customizations.Add(new TypeRelay(typeof(IReadOnlyCollection <Party>), typeof(List <Party>)));
            var partiesResult = this.fixture.Create <GetPartiesResult>();

            this.accountManager.GetCustomerParties(Arg.Any <string>()).Returns(partiesResult);

            if (isGetShippingOptionsFailed)
            {
                shippingOptionsResult.Success = false;
                shippingOptionsResult.SystemMessages.Add(new SystemMessage("Test message"));
            }

            if (isGetCustomerPartiesFailed)
            {
                partiesResult.Success = false;
                partiesResult.SystemMessages.Add(new SystemMessage("Test message"));
            }
        }
示例#29
0
        /// <summary>
        /// Returns the current user cart.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="refresh">if set to <c>true</c> [refresh].</param>
        /// <returns>
        /// The manager response where the modified CommerceCart is returned in the Result.
        /// </returns>
        public virtual ManagerResponse<CartResult, CommerceCart> GetCurrentCart([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, bool refresh = false)
        {
            var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>();
            string customerId = visitorContext.GetCustomerId();

            if (refresh)
            {
                cartCache.InvalidateCartCache(customerId);
            }

            var cart = cartCache.GetCart(customerId);
            if (cart != null)
            {
                var result = new CartResult { Cart = cart };
                this.AddBasketErrorsToResult(result.Cart as CommerceCart, result);
                return new ManagerResponse<CartResult, CommerceCart>(result, cart);
            }

            CartResult cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, visitorContext.UserId, refresh);
            if (cartResult.Success && cartResult.Cart != null)
            {
                cart = cartResult.Cart as CommerceCart;
                cartResult.Cart = cart;
                cartCache.AddCartToCache(cart);
            }
            else
            {
                var message = StorefrontManager.GetSystemMessage("CartNotFoundError");
                cartResult.SystemMessages.Add(new SystemMessage { Message = message });
            }

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

            return new ManagerResponse<CartResult, CommerceCart>(cartResult, cart);
        }
示例#30
0
        /// <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);
        }
示例#31
0
        /// <summary>
        /// Returns the current user cart.
        /// </summary>
        /// <param name="storefront">The storefront.</param>
        /// <param name="visitorContext">The visitor context.</param>
        /// <param name="refresh">if set to <c>true</c> [refresh].</param>
        /// <returns>
        /// The manager response where the modified CommerceCart is returned in the Result.
        /// </returns>
        public virtual ManagerResponse<CartResult, CommerceCart> GetCurrentCart([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, bool refresh = false)
        {
            var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>();
            string customerId = visitorContext.GetCustomerId();

            if (refresh)
            {
                cartCache.InvalidateCartCache(customerId);
            }

            var cart = cartCache.GetCart(customerId);
            if (cart != null)
            {
                var result = new CartResult { Cart = cart };
                this.AddBasketErrorsToResult(result.Cart as CommerceCart, result);
                return new ManagerResponse<CartResult, CommerceCart>(result, cart);
            }

            // With cart caching enabled (via Shared Sessions) it is now ok to refresh the cart (i.e. run the CS pipelines) without causing
            // any performance problems.  This is required to ensure we get the cart images after cart is invalidated by the update line item.
            CartResult cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, visitorContext.UserId, true);
            if (cartResult.Success && cartResult.Cart != null)
            {
                cart = cartResult.Cart as CommerceCart;
                cartResult.Cart = cart;
                cartCache.AddCartToCache(cart);
            }
            else
            {
                var message = StorefrontManager.GetSystemMessage("CartNotFoundError");
                cartResult.SystemMessages.Add(new SystemMessage { Message = message });
            }

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

            return new ManagerResponse<CartResult, CommerceCart>(cartResult, cart);
        }
示例#32
0
        /// <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);
        }
        private Result <Cart> BuildResult(CartResult cartResult)
        {
            var cart = this.cartBuilder.Build(cartResult?.Cart);

            return(new Result <Cart>(cart, cartResult?.SystemMessages.Select(_ => _.Message).ToList()));
        }