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 })); }
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); }
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); }
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) }); }
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) }); }
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 })); }
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)); }
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); }