示例#1
0
        public ActionResult AjaxGetKitData(KitAddToCartPostModel model)
        {
            var product = new Product(model.ProductId);

            if (model.VariantId == 0)
            {
                model.VariantId = AppLogic.GetDefaultProductVariant(model.ProductId);
            }

            var variant = new ProductVariant(model.VariantId);

            var customer = HttpContext.GetCustomer();
            var cartType = model.IsWishlist
                                ? CartTypeEnum.WishCart
                                : CartTypeEnum.ShoppingCart;

            if (!product.IsAKit)
            {
                return(Content(string.Empty));
            }

            KitProductData kitData = KitProductData.Find(
                productId: product.ProductID,
                cartRecId: model.CartRecordId.HasValue
                                        ? model.CartRecordId.Value
                                        : 0,
                thisCustomer: customer);

            // Manipulate the default selections to reflect the selections made so far
            var selectedItems = model.GetSelectedItems(kitData);

            foreach (var item in kitData.Groups.SelectMany(g => g.Items))
            {
                if (selectedItems.Contains(item))
                {
                    item.IsSelected = true;
                }
                else
                {
                    item.IsSelected = false;
                }
            }

            var quantity = Math.Max(model.Quantity, 1);

            var kitAddToCartViewModel = BuildDefaultKitAddToCartViewModel(kitData, product, variant, quantity, customer, model.CartRecordId);

            var itemDisplayNames = kitAddToCartViewModel.KitGroups
                                   .SelectMany(group => group.Items)
                                   .ToDictionary(item => item.Id.ToString(), item => item.NameDisplay);

            return(Json(
                       new AjaxKitDataViewModel
            {
                SummaryHtml = ControllerContext.GetHtmlHelper().Partial(
                    partialViewName: ViewNames.KitSummaryPartial,
                    model: kitAddToCartViewModel).ToString(),
                ItemDisplayNames = itemDisplayNames
            }));
        }
示例#2
0
        static KitComposition BuildCompositionFromModel(KitAddToCartPostModel model, KitProductData kitData, int customerId)
        {
            // Build up the kit selections from the model
            var selectedItems = model.GetSelectedItems(kitData);

            // Now build the composition
            var composition = new KitComposition(0);

            foreach (var selectedItem in selectedItems)
            {
                KitCartItem kcItem = new KitCartItem();
                kcItem.ProductID  = model.ProductId;
                kcItem.VariantID  = model.VariantId;
                kcItem.KitGroupID = selectedItem.Group.Id;
                kcItem.KitItemID  = selectedItem.Id;
                kcItem.CustomerID = customerId;
                kcItem.TextOption = selectedItem.TextOption;
                int qty = 1;
                if (selectedItem.HasMappedVariant &&
                    selectedItem.InventoryQuantityDelta > 1)
                {
                    qty = selectedItem.InventoryQuantityDelta;
                }

                kcItem.Quantity = qty;

                composition.Compositions.Add(kcItem);
            }

            return(composition);
        }
示例#3
0
        static KitComposition BuildCompositionFromModel(KitAddToCartPostModel model, KitProductData kitData, int customerId)
        {
            // Build up the kit selections from the model
            var selectedItems = model.GetSelectedItems(kitData);

            // Validate Kit options
            if (kitData.HasRequiredGroups)
            {
                foreach (var requiredGroup in kitData.Groups.Where(g => g.IsRequired))
                {
                    var requirementIsMet = requiredGroup
                                           .Items
                                           .Intersect(selectedItems)
                                           .Any();

                    if (!requirementIsMet)
                    {
                        return(null);
                    }
                }
            }

            // Now build the composition
            var composition = new KitComposition(0);

            foreach (var selectedItem in selectedItems)
            {
                KitCartItem kcItem = new KitCartItem();
                kcItem.ProductID  = model.ProductId;
                kcItem.VariantID  = model.VariantId;
                kcItem.KitGroupID = selectedItem.Group.Id;
                kcItem.KitItemID  = selectedItem.Id;
                kcItem.CustomerID = customerId;
                kcItem.TextOption = selectedItem.TextOption;
                int qty = 1;
                if (selectedItem.HasMappedVariant &&
                    selectedItem.InventoryQuantityDelta > 1)
                {
                    qty = selectedItem.InventoryQuantityDelta;
                }

                kcItem.Quantity = qty;

                composition.Compositions.Add(kcItem);
            }

            return(composition);
        }
示例#4
0
        public static AddToCartContext ConvertToAddToCartContext(this KitAddToCartPostModel kitAddToCartPostModel, Customer customer, CartTypeEnum cartType)
        {
            // Start with default kit data with no customer selections
            var kitData = KitProductData.Find(
                productId: kitAddToCartPostModel.ProductId,
                cartRecId: kitAddToCartPostModel.CartRecordId ?? 0,
                thisCustomer: customer);

            // Move uploaded files to their permanent location.
            kitData.TempFileStub = kitAddToCartPostModel.TemporaryImageNameStub;
            if (kitData.HasFileUploadGroup)
            {
                kitData.MoveAllTempImagesToOrdered();                 // This also updates the text option field for file uploads.
            }
            return(new AddToCartContext()
            {
                Customer = customer,
                CartType = cartType,

                ShoppingCartRecId = kitAddToCartPostModel.CartRecordId,
                Quantity = kitAddToCartPostModel.Quantity,

                ProductId = kitAddToCartPostModel.ProductId,
                VariantId = kitAddToCartPostModel.VariantId,
                UpsellProducts = kitAddToCartPostModel.UpsellProducts,
                IsWishlist = kitAddToCartPostModel.IsWishlist,

                CustomerEnteredPrice = 0,
                Color = string.Empty,
                Size = string.Empty,
                TextOption = string.Empty,

                TemporaryImageNameStub = kitAddToCartPostModel.TemporaryImageNameStub,
                KitData = kitData,
                Composition =
                    BuildCompositionFromModel(
                        model: kitAddToCartPostModel,
                        kitData: kitData,
                        customerId: customer.CustomerID)
            });
        }
示例#5
0
        public static AddToCartContext ConvertToAddToCartContext(this KitAddToCartPostModel kitAddToCartPostModel, Customer customer, CartTypeEnum cartType)
        {
            // Start with default kit data with no customer selections
            var kitData = KitProductData.Find(
                productId: kitAddToCartPostModel.ProductId,
                cartRecId: kitAddToCartPostModel.CartRecordId ?? 0,
                thisCustomer: customer);

            // Add the temp file stup to the kit data for use later.
            kitData.TempFileStub = kitAddToCartPostModel.TemporaryImageNameStub;

            return(new AddToCartContext()
            {
                Customer = customer,
                CartType = cartType,

                ShoppingCartRecId = kitAddToCartPostModel.CartRecordId,
                Quantity = kitAddToCartPostModel.Quantity,

                ProductId = kitAddToCartPostModel.ProductId,
                VariantId = kitAddToCartPostModel.VariantId,
                UpsellProducts = kitAddToCartPostModel.UpsellProducts,
                IsWishlist = kitAddToCartPostModel.IsWishlist,

                CustomerEnteredPrice = 0,
                Color = string.Empty,
                Size = string.Empty,
                TextOption = string.Empty,

                TemporaryImageNameStub = kitAddToCartPostModel.TemporaryImageNameStub,
                KitData = kitData,
                Composition =
                    BuildCompositionFromModel(
                        model: kitAddToCartPostModel,
                        kitData: kitData,
                        customerId: customer.CustomerID)
            });
        }
示例#6
0
        public ActionResult KitAddToCart(KitAddToCartPostModel model)
        {
            if (!ModelState.IsValid)
            {
                return(RedirectToAction(ActionNames.Index, ControllerNames.Minicart));
            }

            var customer = HttpContext.GetCustomer();
            var notices  = new List <Notice>();

            var cartType = model.IsWishlist
                                ? CartTypeEnum.WishCart
                                : CartTypeEnum.ShoppingCart;

            // Use the provided return URL if there is one, otherwise try to use the referrer
            string unverifiedReturnUrl;

            if (!string.IsNullOrWhiteSpace(model.ReturnUrl))
            {
                unverifiedReturnUrl = model.ReturnUrl;
            }
            else if (Request.UrlReferrer != null)
            {
                unverifiedReturnUrl = Request.UrlReferrer.ToString();
            }
            else
            {
                unverifiedReturnUrl = null;
            }

            // Ensure we have a safe return URL
            var returnUrl = UrlHelper.MakeSafeReturnUrl(
                returnUrl: unverifiedReturnUrl,
                defaultUrl: cartType == CartTypeEnum.WishCart
                                        ? Url.Action(ActionNames.Index, ControllerNames.Wishlist)
                                        : Url.Action(ActionNames.Index, ControllerNames.Checkout));

            // Make request, check status
            var response = CartActionProvider.AddItemToCart(
                model.ConvertToAddToCartContext(
                    customer,
                    cartType));

            switch (response.Status)
            {
            case CartActionStatus.Forbidden:
                throw new HttpException(403, "Forbidden");

            case CartActionStatus.RequiresLogin:
            case CartActionStatus.SessionTimeout:
            {
                foreach (var message in response.Messages)
                {
                    NoticeProvider.PushNotice(message.ConvertToNotice());
                }
                return(RedirectToAction(ActionNames.SignIn, ControllerNames.Account));
            }

            case CartActionStatus.ValidationErrors:
            {
                foreach (var message in response.Messages)
                {
                    NoticeProvider.PushNotice(message.ConvertToNotice());
                }
                return(Redirect(returnUrl));
            }

            default:
                break;
            }

            // Add any returned notices
            if (response.Messages.Any())
            {
                foreach (var message in response.Messages)
                {
                    NoticeProvider.PushNotice(message.ConvertToNotice());
                }
            }
            else
            {
                NoticeProvider.PushNotice("Item successfully added to cart.", NoticeType.Success);
            }

            // Redirect accordingly
            if (AppLogic.AppConfig("AddToCartAction").Equals("STAY", StringComparison.OrdinalIgnoreCase))
            {
                return(Redirect(returnUrl));
            }

            return(RedirectToAction(
                       ActionNames.Index,
                       ControllerNames.Checkout,
                       new { returnUrl }));
        }
示例#7
0
        public ActionResult AjaxAddKitToCart(KitAddToCartPostModel model)
        {
            if (!ModelState.IsValid)
            {
                return(RedirectToAction(ActionNames.Index, ControllerNames.Minicart));
            }

            var customer = HttpContext.GetCustomer();
            var cartType = model.IsWishlist
                                ? CartTypeEnum.WishCart
                                : CartTypeEnum.ShoppingCart;
            var notices = new List <AjaxNotice>();

            // Make request, check status
            var response = CartActionProvider.AddItemToCart(
                model.ConvertToAddToCartContext(
                    customer,
                    cartType));

            switch (response.Status)
            {
            case CartActionStatus.Forbidden:
            case CartActionStatus.RequiresLogin:
            case CartActionStatus.SessionTimeout:
                if (response.Messages.Any())
                {
                    foreach (var message in response.Messages)
                    {
                        NoticeProvider.PushNotice(message.ConvertToNotice());
                    }
                }
                return(Json(
                           data: new AjaxAddToCartData(
                               status: response.Status.ToString(),
                               messages: notices.AsEnumerable(),
                               minicartData: GetMinicartData(customer, response.UpdatedCart, notices)),
                           behavior: JsonRequestBehavior.AllowGet));

            default:
                break;
            }

            // Add any returned notices
            if (response.Messages.Any())
            {
                notices.AddRange(
                    response.Messages.Select(
                        n => n.ConvertToAjaxNotice()));
            }

            // Pull cart now (to reflect any possible changes)
            var cart = response.UpdatedCart;

            // Handle non-ajax calls
            if (!Request.IsAjaxRequest())
            {
                foreach (var message in response.Messages)
                {
                    NoticeProvider.PushNotice(message.ConvertToNotice());
                }
                return(RedirectToAction(ActionNames.Index, ControllerNames.Checkout));
            }

            // The view should reflect the real cart not the posted values in the modelstate.
            ModelState.Clear();
            return(Json(
                       data: new AjaxAddToCartData(
                           status: response.Status.ToString(),
                           messages: notices.AsEnumerable(),
                           minicartData: GetMinicartData(customer, cart, notices)),
                       behavior: JsonRequestBehavior.AllowGet));
        }
示例#8
0
        public static IEnumerable <KitItemData> GetSelectedItems(this KitAddToCartPostModel model, KitProductData kitData)
        {
            var selectedItems = new List <KitItemData>();

            foreach (var group in kitData.Groups)
            {
                // If the group is readonly add it to the list regardless of selections
                if (group.IsReadOnly)
                {
                    selectedItems.AddRange(group.Items);
                    continue;
                }

                var groupSelection = model.KitGroups
                                     .Where(g => g.Id == group.Id)
                                     .FirstOrDefault();

                // If this group was not selected move to the next
                if (groupSelection == null)
                {
                    continue;
                }

                // For single select items use the SelectedItemId property from the model.
                if ((group.SelectionControl == KitGroupData.SINGLE_SELECT_DROPDOWN_LIST || group.SelectionControl == KitGroupData.SINGLE_SELECT_RADIO_LIST) &&
                    groupSelection.SelectedItemId > 0)
                {
                    var selectedItem = group.Items
                                       .Where(i => i.Id == groupSelection.SelectedItemId)
                                       .FirstOrDefault();

                    if (selectedItem != null)
                    {
                        selectedItems.Add(selectedItem);
                    }
                    continue;
                }

                if (groupSelection.Items == null)
                {
                    continue;
                }

                // Otherwise we'll loop through the items to get the individual selections
                foreach (var item in group.Items)
                {
                    var itemSelection = groupSelection.Items
                                        .Where(i => i.Id == item.Id)
                                        .FirstOrDefault();

                    // If this item was not selected move to the next
                    if (itemSelection == null)
                    {
                        continue;
                    }

                    // If it's a text option and there's content in the text option field add it to the selected items.
                    if ((group.SelectionControl == KitGroupData.TEXT_OPTION || group.SelectionControl == KitGroupData.TEXT_AREA || group.SelectionControl == KitGroupData.FILE_OPTION) &&
                        !string.IsNullOrWhiteSpace(itemSelection.TextOption))
                    {
                        item.TextOption = itemSelection.TextOption;
                        selectedItems.Add(item);
                        continue;
                    }
                    else if (group.SelectionControl == KitGroupData.MULTI_SELECT_CHECKBOX_LIST &&
                             itemSelection.IsSelected)
                    {
                        selectedItems.Add(item);
                        continue;
                    }
                }
            }

            return(selectedItems);
        }