/// <summary> /// Formats the price /// </summary> /// <param name="price">Price</param> /// <param name="showCurrency">A value indicating whether to show a currency</param> /// <param name="targetCurrency">Target currency</param> /// <param name="language">Language</param> /// <param name="priceIncludesTax">A value indicating whether price includes tax</param> /// <param name="showTax">A value indicating whether to show tax suffix</param> /// <returns>Price</returns> public virtual string FormatPrice(decimal price, bool showCurrency, Currency targetCurrency, Language language, bool priceIncludesTax, bool showTax) { //we should round it no matter of "ShoppingCartSettings.RoundPricesDuringCalculation" setting price = RoundingHelper.RoundPrice(price); string currencyString = GetCurrencyString(price, showCurrency, targetCurrency); if (showTax) { //show tax suffix string formatStr; if (priceIncludesTax) { formatStr = _localizationService.GetResource("Products.InclTaxSuffix", language.Id, false); if (String.IsNullOrEmpty(formatStr)) { formatStr = "{0} incl tax"; } } else { formatStr = _localizationService.GetResource("Products.ExclTaxSuffix", language.Id, false); if (String.IsNullOrEmpty(formatStr)) { formatStr = "{0} excl tax"; } } return(string.Format(formatStr, currencyString)); } return(currencyString); }
/// <summary> /// Gets the shopping cart unit price (one item) /// </summary> /// <param name="product">Product</param> /// <param name="customer">Customer</param> /// <param name="shoppingCartType">Shopping cart type</param> /// <param name="quantity">Quantity</param> /// <param name="attributesXml">Product atrributes (XML format)</param> /// <param name="customerEnteredPrice">Customer entered price (if specified)</param> /// <param name="rentalStartDate">Rental start date (null for not rental products)</param> /// <param name="rentalEndDate">Rental end date (null for not rental products)</param> /// <param name="includeDiscounts">A value indicating whether include discounts or not for price computation</param> /// <param name="discountAmount">Applied discount amount</param> /// <param name="appliedDiscounts">Applied discounts</param> /// <returns>Shopping cart unit price (one item)</returns> public virtual decimal GetUnitPrice(Product product, Customer customer, ShoppingCartType shoppingCartType, int quantity, string attributesXml, decimal customerEnteredPrice, DateTime?rentalStartDate, DateTime?rentalEndDate, bool includeDiscounts, out decimal discountAmount, out List <DiscountForCaching> appliedDiscounts) { if (product == null) { throw new ArgumentNullException("product"); } if (customer == null) { throw new ArgumentNullException("customer"); } discountAmount = decimal.Zero; appliedDiscounts = new List <DiscountForCaching>(); decimal finalPrice; var combination = _productAttributeParser.FindProductAttributeCombination(product, attributesXml); if (combination != null && combination.OverriddenPrice.HasValue) { finalPrice = GetFinalPrice(product, customer, combination.OverriddenPrice.Value, decimal.Zero, includeDiscounts, quantity, product.IsRental ? rentalStartDate : null, product.IsRental ? rentalEndDate : null, out discountAmount, out appliedDiscounts); } else { //summarize price of all attributes decimal attributesTotalPrice = decimal.Zero; var attributeValues = _productAttributeParser.ParseProductAttributeValues(attributesXml); if (attributeValues != null) { foreach (var attributeValue in attributeValues) { attributesTotalPrice += GetProductAttributeValuePriceAdjustment(attributeValue); } } //get price of a product (with previously calculated price of all attributes) if (product.CustomerEntersPrice) { finalPrice = customerEnteredPrice; } else { int qty; if (_shoppingCartSettings.GroupTierPricesForDistinctShoppingCartItems) { //the same products with distinct product attributes could be stored as distinct "ShoppingCartItem" records //so let's find how many of the current products are in the cart qty = customer.ShoppingCartItems .Where(x => x.ProductId == product.Id) .Where(x => x.ShoppingCartType == shoppingCartType) .Sum(x => x.Quantity); if (qty == 0) { qty = quantity; } } else { qty = quantity; } finalPrice = GetFinalPrice(product, customer, attributesTotalPrice, includeDiscounts, qty, product.IsRental ? rentalStartDate : null, product.IsRental ? rentalEndDate : null, out discountAmount, out appliedDiscounts); } } //rounding if (_shoppingCartSettings.RoundPricesDuringCalculation) { finalPrice = RoundingHelper.RoundPrice(finalPrice); } return(finalPrice); }