protected ProductModel.ProductPriceModel PrepareProductPriceModel(Product product) { if (product == null) throw new ArgumentNullException("product"); var model = new ProductModel.ProductPriceModel(); var productVariants = _productService.GetProductVariantsByProductId(product.Id); switch (productVariants.Count) { case 0: { //no variants model.OldPrice = null; model.Price = null; } break; default: { if (_permissionService.Authorize(StandardPermissionProvider.DisplayPrices)) { //calculate for the maximum quantity (in case if we have tier prices) decimal? minimalPrice = null; var productVariant = _priceCalculationService.GetProductVariantWithMinimalPrice(productVariants, _workContext.CurrentCustomer, true, int.MaxValue, out minimalPrice); if (!productVariant.CustomerEntersPrice) { if (productVariant.CallForPrice) { model.OldPrice = null; model.Price = _localizationService.GetResource("Products.CallForPrice"); } else if (minimalPrice.HasValue) { //calculate prices decimal taxRate = decimal.Zero; decimal oldPriceBase = _taxService.GetProductPrice(productVariant, productVariant.OldPrice, out taxRate); decimal finalPriceBase = _taxService.GetProductPrice(productVariant, minimalPrice.Value, out taxRate); decimal oldPrice = _currencyService.ConvertFromPrimaryStoreCurrency(oldPriceBase, _workContext.WorkingCurrency); decimal finalPrice = _currencyService.ConvertFromPrimaryStoreCurrency(finalPriceBase, _workContext.WorkingCurrency); //do we have tier prices configured? var tierPrices = productVariant.TierPrices .OrderBy(tp => tp.Quantity) .ToList() .FilterForCustomer(_workContext.CurrentCustomer) .RemoveDuplicatedQuantities(); bool displayFromMessage = //When there is just one tier (with qty 1), there are no actual savings in the list. (tierPrices.Count > 0 && !(tierPrices.Count == 1 && tierPrices[0].Quantity <= 1)) || //we have more than one variant (productVariants.Count > 1); if (displayFromMessage) { model.OldPrice = null; model.Price = String.Format(_localizationService.GetResource("Products.PriceRangeFrom"), _priceFormatter.FormatPrice(finalPrice)); } else { if (finalPriceBase != oldPriceBase && oldPriceBase != decimal.Zero) { model.OldPrice = _priceFormatter.FormatPrice(oldPrice); model.Price = _priceFormatter.FormatPrice(finalPrice); } else { model.OldPrice = null; model.Price = _priceFormatter.FormatPrice(finalPrice); } } } else { //Actually it's not possible (we presume that minimalPrice always has a value) //We never should get here Debug.WriteLine(string.Format("PrepareProductPriceModel with minPrice not set. Variant ID = {0}", productVariant.Id)); } } } else { //hide prices model.OldPrice = null; model.Price = null; } } break; } //'add to cart' button switch (productVariants.Count) { case 0: { // no variants model.DisableBuyButton = true; model.AvailableForPreOrder = false; } break; case 1: { //only one variant var productVariant = productVariants[0]; model.DisableBuyButton = productVariant.DisableBuyButton || !_permissionService.Authorize(StandardPermissionProvider.EnableShoppingCart); if (!_permissionService.Authorize(StandardPermissionProvider.DisplayPrices)) { model.DisableBuyButton = true; } model.AvailableForPreOrder = productVariant.AvailableForPreOrder; } break; default: { //multiple variants model.DisableBuyButton = true; model.AvailableForPreOrder = false; } break; } return model; }
protected ProductModel.ProductPriceModel PrepareProductPriceModel(Product product) { if (product == null) throw new ArgumentNullException("product"); var model = new ProductModel.ProductPriceModel(); var productVariants = _productService.GetProductVariantsByProductId(product.Id); switch (productVariants.Count) { case 0: { //no variants model.OldPrice = null; model.Price = null; } break; case 1: { //only one variant var productVariant = productVariants[0]; if (_permissionService.Authorize(StandardPermissionProvider.DisplayPrices)) { if (!productVariant.CustomerEntersPrice) { if (productVariant.CallForPrice) { model.OldPrice = null; model.Price = _localizationService.GetResource("Products.CallForPrice"); } else { decimal taxRate = decimal.Zero; decimal oldPriceBase = _taxService.GetProductPrice(productVariant, productVariant.OldPrice, out taxRate); decimal finalPriceBase = _taxService.GetProductPrice(productVariant, _priceCalculationService.GetFinalPrice(productVariant, true), out taxRate); decimal oldPrice = _currencyService.ConvertFromPrimaryStoreCurrency(oldPriceBase, _workContext.WorkingCurrency); decimal finalPrice = _currencyService.ConvertFromPrimaryStoreCurrency(finalPriceBase, _workContext.WorkingCurrency); if (finalPriceBase != oldPriceBase && oldPriceBase != decimal.Zero) { model.OldPrice = _priceFormatter.FormatPrice(oldPrice); model.Price = _priceFormatter.FormatPrice(finalPrice); } else { model.OldPrice = null; model.Price = _priceFormatter.FormatPrice(finalPrice); } } } } else { model.OldPrice = null; model.Price = null; } } break; default: { //multiple variants var productVariant = GetMinimalPriceProductVariant(productVariants); if (productVariant != null) { if (_permissionService.Authorize(StandardPermissionProvider.DisplayPrices)) { if (!productVariant.CustomerEntersPrice) { if (productVariant.CallForPrice) { model.OldPrice = null; model.Price = _localizationService.GetResource("Products.CallForPrice"); } else { decimal taxRate = decimal.Zero; decimal fromPriceBase = _taxService.GetProductPrice(productVariant, _priceCalculationService.GetFinalPrice(productVariant, false), out taxRate); decimal fromPrice = _currencyService.ConvertFromPrimaryStoreCurrency(fromPriceBase, _workContext.WorkingCurrency); model.OldPrice = null; model.Price = String.Format(_localizationService.GetResource("Products.PriceRangeFrom"), _priceFormatter.FormatPrice(fromPrice)); } } } else { model.OldPrice = null; model.Price = null; } } } break; } //'add to cart' button switch (productVariants.Count) { case 0: { // no variants model.DisableBuyButton = true; } break; case 1: { //only one variant var productVariant = productVariants[0]; model.DisableBuyButton = productVariant.DisableBuyButton || !_permissionService.Authorize(StandardPermissionProvider.EnableShoppingCart); if (!_permissionService.Authorize(StandardPermissionProvider.DisplayPrices)) { model.DisableBuyButton = true; } } break; default: { //multiple variants model.DisableBuyButton = true; } break; } return model; }