public virtual async Task EvaluateProductPricesAsync(IEnumerable <Product> products, WorkContext workContext) { if (products == null) { throw new ArgumentNullException(nameof(products)); } if (workContext == null) { throw new ArgumentNullException(nameof(workContext)); } //Evaluate products prices var evalContext = workContext.ToPriceEvaluationContext(products); var cacheKey = CacheKey.With(GetType(), "EvaluateProductPricesAsync", evalContext.GetCacheKey()); var pricesResponse = await _memoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) => { cacheEntry.AddExpirationToken(PricingCacheRegion.CreateChangeToken()); cacheEntry.AddExpirationToken(_apiChangesWatcher.CreateChangeToken()); return(await _pricingApi.EvaluatePricesAsync(evalContext.ToPriceEvaluationContextDto())); }); ApplyProductPrices(products, pricesResponse, workContext); //Evaluate product discounts //Fill product inventories for getting InStockQuantity data for promotion evaluation await _inventoryService.EvaluateProductInventoriesAsync(products.ToList(), workContext); var promoEvalContext = workContext.ToPromotionEvaluationContext(products); await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, products); //Evaluate product taxes var taxEvalContext = workContext.ToTaxEvaluationContext(products); await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, products); }
public async Task <Product[]> GetProductsAsync(ProductSearchCriteria criteria) { var result = await _catalogModuleSearch.SearchProductsAsync(criteria.ToApiCriteria()); var products = new List <Product>(); if (!result.Items.IsNullOrEmpty()) { var evaluationContext = new PriceEvaluationContext { ProductIds = result.Items.Select(p => p.Id).ToArray() }; var prices = await _pricingModule.EvaluatePricesAsync(evaluationContext); products.AddRange( result .Items .Select( product => product.ToProduct( prices.FirstOrDefault(p => p.ProductId == product.Id) ) ) ); } return(products.ToArray()); }