Beispiel #1
0
        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 virtual async Task<IEnumerable<ShippingMethod>> GetAvailableShippingMethodsAsync()
        {
            var workContext = _workContextAccessor.WorkContext;

            //Request available shipping rates 
            var retVal = await _cartService.GetAvailableShippingMethodsAsync(Cart);
            
            //Evaluate promotions cart and apply rewards for available shipping methods
            var promoEvalContext = Cart.ToPromotionEvaluationContext();
            await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, retVal);

            //Evaluate taxes for available shipping rates
            var taxEvalContext = Cart.ToTaxEvalContext(workContext.CurrentStore);
            taxEvalContext.Lines.Clear();
            taxEvalContext.Lines.AddRange(retVal.SelectMany(x => x.ToTaxLines()));
            await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, retVal);

            return retVal;
        }
Beispiel #3
0
        public virtual async Task <ICollection <ShippingMethod> > GetAvailableShippingMethodsAsync()
        {
            var workContext = _workContextFactory();

            //Request available shipping rates
            var shippingRates = await _cartApi.CartModule.GetAvailableShippingRatesAsync(Cart.Id);

            var retVal = shippingRates.Select(x => x.ToShippingMethod(Cart.Currency, workContext.AllCurrencies)).OrderBy(x => x.Priority).ToList();

            //Evaluate promotions cart and apply rewards for available shipping methods
            var promoEvalContext = Cart.ToPromotionEvaluationContext();
            await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, retVal);

            //Evaluate taxes for available shipping rates
            var taxEvalContext = Cart.ToTaxEvalContext();

            taxEvalContext.Lines.Clear();
            taxEvalContext.Lines.AddRange(retVal.SelectMany(x => x.ToTaxLines()));
            await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, retVal);

            return(retVal);
        }
        public virtual async Task EvaluateProductPricesAsync(ICollection <Product> products, WorkContext workContext)
        {
            //Evaluate products prices
            var evalContext = workContext.ToPriceEvaluationContextDto(products);

            var pricesResponse = await _pricingApi.PricingModule.EvaluatePricesAsync(evalContext);

            ApplyProductPricesInternal(products, pricesResponse, workContext);
            //Evaluate product discounts
            var promoEvalContext = workContext.ToPromotionEvaluationContext(products);
            await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, products);

            //Evaluate product taxes
            var taxEvalContext = workContext.ToTaxEvaluationContext(products);
            await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, products);
        }
Beispiel #5
0
        public virtual async Task EvaluateProductPricesAsync(ICollection <Product> products, WorkContext workContext)
        {
            //Evaluate products prices
            var evalContext = workContext.ToPriceEvaluationContextDto(products);

            var pricesResponse = await _pricingApi.PricingModule.EvaluatePricesAsync(evalContext);

            ApplyProductPricesInternal(products, pricesResponse, workContext);

            //Evaluate product discounts
            //Fill product inventories for getting InStockQuantity data for promotion evaluation
            await _inventoryService.EvaluateProductInventoriesAsync(products, workContext);

            var promoEvalContext = workContext.ToPromotionEvaluationContext(products);
            await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, products);

            //Evaluate product taxes
            var taxEvalContext = workContext.ToTaxEvaluationContext(products);
            await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, products);
        }