public ActionResult UpdateDeliveryDetails(SaveCartViewModel model)
        {
            string           userId      = User.Identity.GetUserId();
            ShoppingCart     sessionCart = GetCartFromSession(userId);
            FreeMarketObject result;

            TimeSpan startTime = new TimeSpan(8, 0, 0);
            TimeSpan endTime   = new TimeSpan(17, 0, 0);

            if (model.DeliveryOptions == null || model.DeliveryOptions.SelectedDeliveryType == null)
            {
                ModelState.AddModelError("", "Please select a delivery option");
            }

            if (ModelState.IsValid)
            {
                if (!(model.prefDeliveryDateTime.Value.TimeOfDay > startTime &&
                      model.prefDeliveryDateTime.Value.TimeOfDay < endTime &&
                      model.prefDeliveryDateTime.Value > DateTime.Today &&
                      (model.prefDeliveryDateTime.Value.DayOfWeek == DayOfWeek.Monday ||
                       model.prefDeliveryDateTime.Value.DayOfWeek == DayOfWeek.Tuesday ||
                       model.prefDeliveryDateTime.Value.DayOfWeek == DayOfWeek.Wednesday ||
                       model.prefDeliveryDateTime.Value.DayOfWeek == DayOfWeek.Thursday ||
                       model.prefDeliveryDateTime.Value.DayOfWeek == DayOfWeek.Friday)))
                {
                    model.SetAddressNameOptions(userId, model.SelectedAddress);

                    return(View("CheckoutDeliveryDetails", model));
                }

                sessionCart.UpdateDeliveryDetails(model);
                result = new FreeMarketObject {
                    Result = FreeMarketResult.NoResult
                };
                if (model.AddressName != "Current")
                {
                    result = CustomerAddress.AddOrUpdateAddress(model, userId);
                }

                AuditUser.LogAudit(27, string.Format("Order Number: {0}", sessionCart.Order.OrderNumber), User.Identity.GetUserId());

                if (result.Result == FreeMarketResult.Success)
                {
                    TempData["message"] = result.Message;
                }
                else
                {
                    TempData["errorMessage"] = result.Message;
                }

                if (Request.IsAjaxRequest())
                {
                    return(JavaScript("window.location.reload();"));
                }
                else
                {
                    return(RedirectToAction("ChoosePaymentOption", "ShoppingCart"));
                }
            }

            model.SetAddressNameOptions(userId, model.SelectedAddress);

            decimal localCourierCost = sessionCart.CalculateLocalCourierFeeAdhoc(int.Parse(model.Address.AddressPostalCode));
            decimal courierCost      = sessionCart.CalculateCourierFeeAdhoc(int.Parse(model.Address.AddressPostalCode));
            decimal postOfficeCost   = sessionCart.CalculatePostalFee();

            model.SetDeliveryOptions(sessionCart.Order, /*localCourierCost,*/ courierCost, postOfficeCost);
            model.SetTextBlocks();

            if (Request.IsAjaxRequest())
            {
                return(PartialView("_SaveCartModal", model));
            }
            else
            {
                return(View("CheckoutDeliveryDetails", model));
            }
        }
        public ActionResult UpdateCart(ShoppingCart cart, string returnUrl)
        {
            // Prepare
            string                userId        = User.Identity.GetUserId();
            bool                  anonymousUser = (userId == null);
            ShoppingCart          sessionCart   = GetCartFromSession(userId);
            ShoppingCartViewModel model;

            if (cart.Order.OrderStatus == "Locked")
            {
                TempData["errorMessage"] = "Your cart is locked because you are in the process of checking out. Complete or cancel your checkout process.";
                return(JavaScript("window.location = window.location.href;"));
            }

            if (ModelState.IsValid)
            {
                // Prepare
                FreeMarketObject resultRemove   = new FreeMarketObject();
                FreeMarketObject resultQuantity = new FreeMarketObject();

                // Update Selected Property
                sessionCart.UpdateSelectedProperty(cart, false);

                // Remove selected Items
                List <OrderDetail> selectedItems = cart.Body.OrderDetails
                                                   .Where(c => c.Selected || c.Quantity <= 0)
                                                   .ToList();

                if (selectedItems.Count > 0)
                {
                    foreach (OrderDetail detail in selectedItems)
                    {
                        resultRemove = sessionCart.RemoveItem(detail.ItemNumber, detail.ProductNumber, detail.SupplierNumber, detail.SizeType, userId);
                    }
                }

                // Update Quantity
                List <OrderDetail> changedItems = cart.Body.OrderDetails
                                                  .Where(c => !c.Selected && c.Quantity > 0)
                                                  .ToList();

                if (changedItems.Count > 0)
                {
                    resultQuantity = sessionCart.UpdateQuantities(changedItems);
                }

                sessionCart.Save();
                sessionCart.UpdateSelectedProperty(cart, true);

                if (string.IsNullOrEmpty(resultQuantity.Message))
                {
                    TempData["message"] = "Cart has been updated.";
                }
                else
                {
                    TempData["errorMessage"] = resultQuantity.Message;
                }

                model = new ShoppingCartViewModel {
                    Cart = sessionCart, ReturnUrl = returnUrl
                };
                return(RedirectToAction("Cart", "ShoppingCart"));
            }

            model = new ShoppingCartViewModel {
                Cart = sessionCart, ReturnUrl = returnUrl
            };

            return(View("Cart", model));
        }