public ActionResult RateOrder(int orderNumber)
        {
            var user = UserManager.FindById(User.Identity.GetUserId());

            if (user == null)
            {
                return(View("Error"));
            }

            OrderHeader order = new OrderHeader();

            using (FreeMarketEntities db = new FreeMarketEntities())
            {
                order = db.OrderHeaders.Find(orderNumber);

                if (order == null)
                {
                    return(View("Error"));
                }
            }

            // Only allow the owner of the order to rate it.
            RateOrderViewModel model = new RateOrderViewModel();

            if (user.Id == order.CustomerNumber)
            {
                model             = new RateOrderViewModel(orderNumber);
                model.Unsubscribe = user.UnsubscribeFromRatings;
                return(View(model));
            }
            else
            {
                return(RedirectToAction("Index", "Home"));
            }
        }
        public async Task <ActionResult> UpdateReviews(RateOrderViewModel model)
        {
            bool error = false;

            foreach (Product p in model.Products.Products)
            {
                if (p.ProductRating == 0)
                {
                    ModelState.AddModelError("", string.Format("{0}'s product rating may not be empty.", p.Description));
                    error = true;
                }

                if (p.PriceRating == 0)
                {
                    ModelState.AddModelError("", string.Format("{0}'s price rating may not be empty.", p.Description));
                    error = true;
                }
            }

            if (model.CourierRatings != null)
            {
                foreach (CourierReview c in model.CourierRatings)
                {
                    if (c.StarRating == 0)
                    {
                        ModelState.AddModelError("", string.Format("{0}'s rating may not be empty.", c.CourierName));
                        error = true;
                    }
                }
            }

            if (error)
            {
                return(View("RateOrder", model));
            }

            var user = UserManager.FindById(User.Identity.GetUserId());

            if (user == null)
            {
                return(View("Error"));
            }

            user.UnsubscribeFromRatings = model.Unsubscribe;
            await UserManager.UpdateAsync(user);

            using (FreeMarketEntities db = new FreeMarketEntities())
            {
                foreach (Product p in model.Products.Products)
                {
                    if (p.ReviewId == null)
                    {
                        ProductReview review = new ProductReview
                        {
                            Author         = user.Name,
                            Date           = DateTime.Now,
                            OrderNumber    = model.Order.OrderNumber,
                            PriceRating    = p.PriceRating,
                            ProductNumber  = p.ProductNumber,
                            ReviewContent  = p.ProductReviewText,
                            StarRating     = (short)p.ProductRating,
                            SupplierNumber = p.SupplierNumber,
                            UserId         = user.Id,
                            Approved       = null
                        };

                        db.ProductReviews.Add(review);
                    }
                    else
                    {
                        ProductReview review = db.ProductReviews.Find(p.ReviewId);

                        if (review != null)
                        {
                            if (review.PriceRating != p.PriceRating ||
                                review.ReviewContent != p.ProductReviewText ||
                                review.StarRating != (short)p.ProductRating)
                            {
                                review.Date          = DateTime.Now;
                                review.PriceRating   = p.PriceRating;
                                review.ReviewContent = p.ProductReviewText;
                                review.StarRating    = (short)p.ProductRating;
                                review.Approved      = null;
                            }

                            db.Entry(review).State = System.Data.Entity.EntityState.Modified;
                        }
                    }
                }

                if (model.CourierRatings != null)
                {
                    foreach (CourierReview cReview in model.CourierRatings)
                    {
                        if (cReview.ReviewId == 0)
                        {
                            CourierReview review = new CourierReview
                            {
                                Author        = user.Name,
                                Date          = DateTime.Now,
                                OrderNumber   = model.Order.OrderNumber,
                                ReviewContent = cReview.ReviewContent,
                                StarRating    = (short)cReview.StarRating,
                                CourierNumber = cReview.CourierNumber,
                                UserId        = user.Id
                            };

                            db.CourierReviews.Add(review);
                        }
                        else
                        {
                            CourierReview review = db.CourierReviews.Find(cReview.ReviewId);

                            if (review != null)
                            {
                                review.Date          = DateTime.Now;
                                review.ReviewContent = cReview.ReviewContent;
                                review.StarRating    = (short)cReview.StarRating;

                                db.Entry(review).State = System.Data.Entity.EntityState.Modified;
                            }
                        }
                    }
                }

                db.SaveChanges();

                return(RedirectToAction("Index", "Manage"));
            }
        }