public StockStatus GetStockStatus(Product product, IList <int> productAttributeValueIds, out ProductVariant variant) { variant = null; //return if we don't need to track if (!product.HasVariants && !product.TrackInventory) { return(StockStatus.InStock); } //no variants but tracking if (!product.HasVariants && product.TrackInventory && product.Inventories.Any(x => x.AvailableQuantity > product.MinimumPurchaseQuantity)) { return(StockStatus.InStock); } //with variants if (product.HasVariants) { //get variant variant = _productVariantService.GetByAttributeValueIds(productAttributeValueIds); if (variant == null) { return(StockStatus.Unavailable); } if (!variant.TrackInventory) { return(StockStatus.InStock); } if (variant.TrackInventory && variant.IsAvailableInStock(product)) { return(StockStatus.InStock); } } return(StockStatus.OutOfStock); }