Example #1
0
        public ActionResult ProductDetails(ShopProductDetailsViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            AddToCart(new CartAddViewModel {
                Qty    = model.Qty,
                ItemId = model.StockId
            });

            return(RedirectToAction("ProductDetails", new { id = model.StockId, returnUrl = model.ReturnUrl }));
        }
Example #2
0
        public ActionResult ProductDetails(int?id, string returnUrl)
        {
            if (id == null)
            {
                return(View("Error"));
            }

            if (string.IsNullOrEmpty(returnUrl))
            {
                ViewBag.ReturnUrl = "#";
            }
            else
            {
                ViewBag.ReturnUrl = returnUrl;
            }

            var stock = db.Stocks
                        .Include(m => m.Store)
                        .Include(m => m.Product)
                        .Include(m => m.Product.Category)
                        .Include(m => m.Product.ProductImages)
                        .Include(m => m.Product.Specifications)
                        .Include(m => m.Product.Category.Attributes)
                        .FirstOrDefault(m => m.Id == id);

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

            var cart     = GetCart();
            var cartItms = cart.CartItems
                           .FirstOrDefault(m => m.StockId == id && m.IsEditable);
            var count = (cartItms != null) ? cartItms.Qty : 0;

            var discountIds = db.DiscountedItems
                              .Include(m => m.Discount)
                              .Where(m => m.StockId == id &&
                                     m.Discount.IsActive &&
                                     DateTime.Compare(m.Discount.StartDate, DateTime.Now) > 0 &&
                                     (!m.Discount.IsExpirable ||
                                      DateTime.Compare(m.Discount.EndDate ??
                                                       m.Discount.StartDate, DateTime.Now) < 0))
                              .Select(m => m.DiscountId)
                              .ToList();

            var discountConstraints = db.DiscountConstraints
                                      .Include(m => m.Discount)
                                      .Include(m => m.Discount.DiscountedItems)
                                      .Include(m => m.Discount.Store)
                                      .Where(m => discountIds
                                             .Contains(m.DiscountId) &&
                                             m.Discount.IsActive)
                                      .ToList();

            var discountedPrice = stock.GetPrice();

            var model = new ShopProductDetailsViewModel
            {
                Description       = stock.Product.Category.Description,
                Stock             = stock,
                StockId           = stock.Id,
                ReturnUrl         = ViewBag.ReturnUrl,
                AlreadyInCart     = count,
                BundleDiscounts   = new List <DiscountConstraint>(),
                BundleStocks      = new Dictionary <DiscountConstraint, List <Stock> >(),
                BundleOldPrices   = new Dictionary <DiscountConstraint, string>(),
                BundleNewPrices   = new Dictionary <DiscountConstraint, string>(),
                MinOrderDiscounts = new List <DiscountConstraint>(),
                MinQtyDiscounts   = new List <DiscountConstraint>(),
                CurrencySymbol    = stock.Store.DefaultCurrencyType,
                NewPrice          = (stock.Price != discountedPrice) ? discountedPrice : null as float?
            };

            foreach (var constraint in discountConstraints)
            {
                //if (constraint.Type == DiscountConstraintType.Simple)
                //{
                //    if (constraint.Discount.IsPercent)
                //    {
                //        model.NewPrice = model.Stock.Price *
                //                    ((100 - constraint.Discount.Value)/100);
                //    }
                //    else
                //    {
                //        model.NewPrice = model.Stock.Price -
                //                    constraint.Discount.Value;
                //    }
                //}
                //else
                if (constraint.Type == DiscountConstraintType.MinOrder)
                {
                    model.MinOrderDiscounts.Add(constraint);
                }
                else if (constraint.Type == DiscountConstraintType.Qty)
                {
                    model.MinQtyDiscounts.Add(constraint);
                }
                else
                {
                    model.BundleDiscounts.Add(constraint);
                    model.BundleStocks.Add(constraint,
                                           db.Stocks
                                           .Where(m => db.BundledItems
                                                  .FirstOrDefault(b => b.StockId == m.Id &&
                                                                  b.DiscountConstraintId == constraint.Id)
                                                  != null)
                                           .ToList()
                                           );

                    var total = 0.0f;
                    var curr  = "";
                    foreach (var stk in model.BundleStocks[constraint])
                    {
                        total += stk.Price;
                        curr   = stk.Store.DefaultCurrencyType;
                    }
                    model.BundleOldPrices.Add(constraint,
                                              curr + " " + total);
                    if (constraint.Discount.IsPercent)
                    {
                        model.BundleNewPrices.Add(constraint,
                                                  curr + " " + (total * ((100 - constraint.Discount.Value)
                                                                         / 100)));
                    }
                    else
                    {
                        model.BundleNewPrices.Add(constraint,
                                                  curr + " " + (total - constraint.Discount.Value));
                    }
                }
            }

            model.MinQtyDiscounts = model.MinQtyDiscounts.OrderBy(m => m.MinQty)
                                    .ToList();

            return(View(model));
        }