public ShoppingCardVM GetUserFinishOrderVM(string userId, SearchProductsBM searchProductsBM)
        {
            var finishOrderVM = this.GetUserShoppingCardVM(userId, searchProductsBM);

            if (finishOrderVM == null)
            {
                return(null);
            }

            var purchasesToBuy = new List <PurchaseVM>();

            foreach (var purchase in finishOrderVM.Purchases)
            {
                if (purchase.Quantity > 0 && purchase.Product.Quantity >= purchase.Quantity)
                {
                    purchasesToBuy.Add(purchase);
                }
            }

            finishOrderVM.Purchases = purchasesToBuy;

            finishOrderVM.Total = purchasesToBuy.Sum(p => p.Value);

            if (finishOrderVM.Total == 0)
            {
                return(null);
            }

            return(finishOrderVM);
        }
        public ActionResult UpdateShoppingCart(SearchProductsBM searchProductsBM, int purchaseId, int quantity)
        {
            if (!this.service.UpdatePurchaseToUserShoppingCard(this.User.Identity.GetUserId(), purchaseId, quantity))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(this.RedirectToAction("ShoppingCart", searchProductsBM));
        }
        public ActionResult AddProductToShoppingCart(SearchProductsBM searchProductsBM, int productId)
        {
            if (!this.service.AddProductToUserShoppingCard(this.User.Identity.GetUserId(), productId))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.NotAcceptable));
            }

            return(this.RedirectToAction("ProductsList", searchProductsBM));
        }
        public ActionResult FinishOrder(SearchProductsBM searchProductsBM)
        {
            var finishOrderVM = this.service.GetUserFinishOrderVM(this.User.Identity.GetUserId(), searchProductsBM);

            if (finishOrderVM == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(this.PartialView("Partials/FinishOrder", finishOrderVM));
        }
        public ActionResult ProductsList(SearchProductsBM searchProductsBM)
        {
            var userId         = this.User.Identity.GetUserId();
            var productsListVM = this.service.GetProductsListVM(searchProductsBM, userId);

            if (productsListVM == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.NotFound));
            }

            return(this.PartialView("Partials/ProductsList", productsListVM));
        }
        public ActionResult ShoppingCart(SearchProductsBM searchProductsBM)
        {
            var shoppingCardVM = this.service.GetUserShoppingCardVM(
                this.User.Identity.GetUserId(),
                searchProductsBM);

            if (shoppingCardVM == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
            }

            return(this.PartialView("Partials/ShoppingCart", shoppingCardVM));
        }
        public ShoppingCardVM GetUserShoppingCardVM(string userId, SearchProductsBM searchProductsBM)
        {
            var shopingCard    = this.GetUserShoppingCard(userId);
            var shoppingCardVM = Mapper.Map <ShoppingCardVM>(shopingCard);

            foreach (var purchase in shoppingCardVM.Purchases)
            {
                purchase.Price = purchase.Product.Price;
                purchase.Value = purchase.Quantity * purchase.Price;
            }

            shoppingCardVM.Total                = shoppingCardVM.Purchases.Sum(p => p.Value);
            shoppingCardVM.SearchProductsBM     = searchProductsBM;
            shoppingCardVM.IsAnyPurchaseOnStock = shoppingCardVM.Purchases
                                                  .Any(pu => pu.Quantity > 0 && pu.Product.Quantity >= pu.Quantity);

            return(shoppingCardVM);
        }
        public ProductsListVM GetProductsListVM(SearchProductsBM searchBM, string userId)
        {
            const int PageSize = 4;


            var search = new SearchProductsBM
            {
                Search        = searchBM.Search ?? string.Empty,
                Page          = searchBM.Page,
                Order         = searchBM.Order ?? Constants.Order[0],
                OrderBy       = searchBM.OrderBy ?? Constants.OrderBy[0],
                SubCategoryId = searchBM.SubCategoryId,
                CategoryId    = searchBM.CategoryId,
                DepartmentId  = searchBM.DepartmentId,
                OrderList     = new SelectList(Constants.Order),
                OrderByList   = new SelectList(Constants.OrderBy)
            };

            var pageNumber = search.Page;

            if (pageNumber < 1)
            {
                pageNumber = 1;
            }

            IEnumerable <Product> products;

            search.SubCategoryId = searchBM.SubCategoryId;

            if (search.DepartmentId != 0)
            {
                products = this.Context.Products.All()
                           .Where(p => p.SubCategory.Category.Department.Id == search.DepartmentId);
                search.SubCategoryId = 0;
                search.CategoryId    = 0;
            }
            else if (search.CategoryId != 0)
            {
                products = this.Context.Products.All()
                           .Where(p => p.SubCategory.Category.Id == search.CategoryId);
                search.SubCategoryId = 0;
                search.DepartmentId  = 0;
            }
            else if (search.SubCategoryId != 0)
            {
                var subCategory = this.Context.SubCategories.Find(search.SubCategoryId);
                if (subCategory == null)
                {
                    return(null);
                }

                products            = subCategory.Products;
                search.DepartmentId = 0;
                search.CategoryId   = 0;
            }
            else
            {
                products = this.Context.Products.All();
            }

            if (!string.IsNullOrEmpty(search.Search))
            {
                products = products
                           .Where(p => p.Name.ToLower().Contains(search.Search.ToLower()));
            }

            if (search.OrderBy == Constants.OrderBy[0])
            {
                products = string.Equals(search.Order, Constants.Order[0])
                    ? products.OrderBy(p => p.Id)
                    : products.OrderByDescending(p => p.Id);
            }
            else if (search.OrderBy == Constants.OrderBy[1])
            {
                products = string.Equals(search.Order, Constants.Order[0])
                    ? products.OrderBy(p => p.Name)
                    : products.OrderByDescending(p => p.Name);
            }
            else if (search.OrderBy == Constants.OrderBy[2])
            {
                products = string.Equals(search.Order, Constants.Order[0])
                    ? products.OrderBy(p => p.Price)
                    : products.OrderByDescending(p => p.Price);
            }

            var productVms = products
                             .Skip((pageNumber - 1) * PageSize)
                             .Take(PageSize)
                             .ToList()
                             .Select(Mapper.Map <DetailsProductVM>);

            var productsCount = products.Count();
            var pageCount     = productsCount / PageSize + (productsCount % PageSize > 0 ? 1 : 0);

            search.PageCount = pageCount;
            search.Page      = pageNumber;

            var productsInUserShoppingCart = this.GetUserShoppingCard(userId)?.Purchases.Count ?? 0;
            var result = new ProductsListVM
            {
                Products                   = productVms,
                SearchProductsBM           = search,
                UserProductsInShoppingCart = productsInUserShoppingCart
            };

            return(result);
        }