public void Can_parse_required_productvariant_ids() { var productVariant = new ProductVariant { RequiredProductVariantIds = "1, 4,7 ,a," }; var ids = productVariant.ParseRequiredProductVariantIds(); ids.Length.ShouldEqual(3); ids[0].ShouldEqual(1); ids[1].ShouldEqual(4); ids[2].ShouldEqual(7); }
/// <summary> /// Validates required product variants (product variants which require other variant to be added to the cart) /// </summary> /// <param name="customer">Customer</param> /// <param name="shoppingCartType">Shopping cart type</param> /// <param name="productVariant">Product variant</param> /// <param name="automaticallyAddRequiredProductVariantsIfEnabled">Automatically add required product variants if enabled</param> /// <returns>Warnings</returns> public virtual IList<string> GetRequiredProductVariantWarnings(Customer customer, ShoppingCartType shoppingCartType, ProductVariant productVariant, bool automaticallyAddRequiredProductVariantsIfEnabled) { if (customer == null) throw new ArgumentNullException("customer"); if (productVariant == null) throw new ArgumentNullException("productVariant"); var cart = customer.ShoppingCartItems.Where(sci => sci.ShoppingCartType == shoppingCartType).ToList(); var warnings = new List<string>(); if (productVariant.RequireOtherProducts) { var requiredProductVariants = new List<ProductVariant>(); foreach (var id in productVariant.ParseRequiredProductVariantIds()) { var rpv = _productService.GetProductVariantById(id); if (rpv != null) requiredProductVariants.Add(rpv); } foreach (var rpv in requiredProductVariants) { //ensure that product is in the cart bool alreadyInTheCart = false; foreach (var sci in cart) { if (sci.ProductVariantId == rpv.Id) { alreadyInTheCart = true; break; } } //not in the cart if (!alreadyInTheCart) { string fullProductName = ""; if (!String.IsNullOrEmpty(rpv.GetLocalized(x => x.Name))) fullProductName = string.Format("{0} ({1})", rpv.Product.GetLocalized(x => x.Name), rpv.GetLocalized(x => x.Name)); else fullProductName = rpv.Product.GetLocalized(x => x.Name); if (productVariant.AutomaticallyAddRequiredProductVariants) { //add to cart (if possible) if (automaticallyAddRequiredProductVariantsIfEnabled) { //pass 'false' for 'automaticallyAddRequiredProductVariantsIfEnabled' to prevent circular references var addToCartWarnings = AddToCart(customer, rpv, shoppingCartType, "", decimal.Zero, 1, false); if (addToCartWarnings.Count > 0) { //a product wasn't atomatically added for some reasons //don't display specific errors from 'addToCartWarnings' variable //display only generic error warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.RequiredProductWarning"), fullProductName)); } } else { warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.RequiredProductWarning"), fullProductName)); } } else { warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.RequiredProductWarning"), fullProductName)); } } } } return warnings; }
/// <summary> /// Get a list of required product variants /// </summary> /// <param name="productVariant">Product variant</param> /// <returns>Required product variants</returns> protected virtual IList<ProductVariant> GetRequiredProductVariants(ProductVariant productVariant) { if (productVariant == null) throw new ArgumentNullException("productVariant"); var requiredProductVariants = new List<ProductVariant>(); var ids = productVariant.ParseRequiredProductVariantIds(); foreach (var id in ids) { var pv = _productService.GetProductVariantById(id); var nowUtc = DateTime.UtcNow; //ensure that product and product variant are published, not deleted, etc if (pv != null && !pv.Deleted && pv.Published && !pv.Product.Deleted && pv.Product.Published && (!pv.AvailableStartDateTimeUtc.HasValue || pv.AvailableStartDateTimeUtc.Value < nowUtc) && (!pv.AvailableEndDateTimeUtc.HasValue || pv.AvailableEndDateTimeUtc.Value > nowUtc)) { requiredProductVariants.Add(pv); } } return requiredProductVariants; }