public ActionResult ShippingAndPayment(string returnUrl)
        {
            var userManager = HttpContext.GetOwinContext().GetUserManager <ApplicationUserManager>();
            var user        = userManager.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);

            if (user == null)
            {
                return(HttpNotFound());
            }

            if (!db.Carts.Any(c => c.CartId == user.UserName))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.NotFound));
            }

            var model = new ShippingAndPaymentViewModel()
            {
                Order = new Order()
                {
                    FirstName = user.FirstName,
                    LastName  = user.LastName,
                    Address   = user.Address,
                    City      = user.City,
                    Country   = user.Country,
                    Phone     = user.PhoneNumber,
                    Email     = user.Email,
                    State     = user.Country
                },
                CreditCard = new CreditCard()
            };

            ViewBag.ReturnUrl = returnUrl;
            return(View(model));
        }
        public ActionResult ShippingAndPayment(ShippingAndPaymentViewModel model, string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            model.Order.Username  = User.Identity.Name;
            model.Order.OrderDate = DateTime.Now;

            var userManager = HttpContext.GetOwinContext().GetUserManager <ApplicationUserManager>();
            var user        = userManager.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);

            if (user == null)
            {
                return(HttpNotFound());
            }

            user.FirstName = model.Order.FirstName;
            user.LastName  = model.Order.LastName;

            var creditCard = db.CreditCards.Find(model.CreditCard.CardNumber);

            if (creditCard == null ||
                creditCard.CardHolder != model.CreditCard.CardHolder ||
                creditCard.CVV2 != model.CreditCard.CVV2 ||
                creditCard.ExpiryDate != model.CreditCard.ExpiryDate) // credit card doesn't exist
            {
                ModelState.AddModelError("", "Credit card does not exist!");
                return(View(model));
            }

            if (creditCard.ExpiryDate < DateTime.Now) // credit card has expired
            {
                ModelState.AddModelError("", "Credit card has expired!");
                return(View(model));
            }

            var cart   = ShoppingCart.GetCard(this.HttpContext);
            int result = cart.CreateOrder(model.Order, creditCard);

            if (result != -1) // available funds on the credit card
            {
                if (user.Points != 0)
                {
                    var itemsCount = cart.GetCartItems().Sum(x => x.Count);
                    user.Points += (itemsCount * 10);
                    userManager.Update(user);
                }

                return(RedirectToAction("Complete", "Checkout", new { id = model.Order.OrderId }));
            }

            ModelState.AddModelError("", "Insufficient funds on your balance!");
            return(View(model));
        }