public static void GetProductStockStatusFromIndex()

in src/Foundation/CommerceServer/code/Helpers/SearchNavigation.cs [412:496]


        public static void GetProductStockStatusFromIndex(List<ProductViewModel> viewModelList)
        {
            if (viewModelList == null || viewModelList.Count == 0)
            {
                return;
            }

            var searchManager = ContextTypeLoader.CreateInstance<ICatalogSearchManager>();
            var searchIndex = searchManager.GetIndex();

            using (var context = searchIndex.CreateSearchContext())
            {
                var predicate = PredicateBuilder.Create<InventorySearchResultItem>(item => item[StorefrontConstants.KnownIndexFields.InStockLocations].Contains("Default"));
                predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.OutOfStockLocations].Contains("Default"));
                predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.OrderableLocations].Contains("Default"));
                predicate = predicate.Or(item => item[StorefrontConstants.KnownIndexFields.PreOrderable].Contains("0"));

                var searchResults = context.GetQueryable<InventorySearchResultItem>()
                    .Where(item => item.CommerceSearchItemType == CommerceSearchResultItemType.Product)
                    .Where(item => item.Language == SearchNavigation.CurrentLanguageName)
                    .Where(BuildProductIdListPredicate(viewModelList))
                    .Where(predicate)
                    .Select(x => new { x.OutOfStockLocations, x.OrderableLocations, x.PreOrderable, x.InStockLocations, x.Fields, x.Name });

                var results = searchResults.GetResults();

                if (results.TotalSearchResults == 0)
                {
                    return;
                }

                foreach (var result in results)
                {
                    var resultDocument = result.Document;

                    if (resultDocument == null)
                    {
                        continue;
                    }

                    StockStatus status;
                    var isInStock = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.InStockLocations)
                                    && resultDocument.Fields[StorefrontConstants.KnownIndexFields.InStockLocations] != null;
                    if (isInStock)
                    {
                        status = StockStatus.InStock;
                    }
                    else
                    {
                        var isPreOrderable = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.PreOrderable)
                                             && result.Document.PreOrderable != null
                                             && (result.Document.PreOrderable.Equals("1", StringComparison.OrdinalIgnoreCase)
                                                || result.Document.PreOrderable.Equals("true", StringComparison.OrdinalIgnoreCase));
                        if (isPreOrderable)
                        {
                            status = StockStatus.PreOrderable;
                        }
                        else
                        {
                            var isOutOfStock = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.OutOfStockLocations)
                                               && result.Document.OutOfStockLocations != null;
                            var isBackOrderable = resultDocument.Fields.ContainsKey(StorefrontConstants.KnownIndexFields.OrderableLocations)
                                                  && result.Document.OrderableLocations != null;

                            if (isOutOfStock && isBackOrderable)
                            {
                                status = StockStatus.BackOrderable;
                            }
                            else
                            {
                                status = isOutOfStock ? StockStatus.OutOfStock : null;
                            }
                        }
                    }

                    var foundModel = viewModelList.Find(x => x.ProductId == result.Document.Name);

                    if (foundModel != null)
                    {
                        foundModel.StockStatus = status;
                        foundModel.StockStatusName = StorefrontManager.GetProductStockStatusName(foundModel.StockStatus);
                    }
                }
            }
        }