public void Can_calculate_discount_amount_fixed() { var discount = new Discount() { UsePercentage = false, DiscountAmount = 10 }; discount.GetDiscountAmount(100).ShouldEqual(10); discount.DiscountAmount = 20; discount.GetDiscountAmount(200).ShouldEqual(20); }
public void Can_calculate_discount_amount_percentage() { var discount = new Discount() { UsePercentage = true, DiscountPercentage = 30 }; discount.GetDiscountAmount(100).ShouldEqual(30); discount.DiscountPercentage = 60; discount.GetDiscountAmount(200).ShouldEqual(120); }
public virtual decimal GetDiscountAmount( Product product, Customer customer, decimal additionalCharge, int quantity, out Discount appliedDiscount, ProductBundleItemData bundleItem = null, PriceCalculationContext context = null) { appliedDiscount = null; decimal appliedDiscountAmount = decimal.Zero; decimal finalPriceWithoutDiscount = decimal.Zero; if (bundleItem.IsValid()) { if (bundleItem.Item.Discount.HasValue && bundleItem.Item.BundleProduct.BundlePerItemPricing) { appliedDiscount = new Discount { UsePercentage = bundleItem.Item.DiscountPercentage, DiscountPercentage = bundleItem.Item.Discount.Value, DiscountAmount = bundleItem.Item.Discount.Value }; finalPriceWithoutDiscount = GetFinalPrice(product, customer, additionalCharge, false, quantity, bundleItem, context); appliedDiscountAmount = appliedDiscount.GetDiscountAmount(finalPriceWithoutDiscount); } } else { // dont't apply when customer entered price or discounts should be ignored completely if (product.CustomerEntersPrice || _catalogSettings.IgnoreDiscounts) { return appliedDiscountAmount; } var allowedDiscounts = GetAllowedDiscounts(product, customer, context); if (allowedDiscounts.Count == 0) { return appliedDiscountAmount; } finalPriceWithoutDiscount = GetFinalPrice(product, customer, additionalCharge, false, quantity, bundleItem, context); appliedDiscount = allowedDiscounts.GetPreferredDiscount(finalPriceWithoutDiscount); if (appliedDiscount != null) { appliedDiscountAmount = appliedDiscount.GetDiscountAmount(finalPriceWithoutDiscount); } } return appliedDiscountAmount; }
/// <summary> /// Gets a shipping discount /// </summary> /// <param name="customer">Customer</param> /// <param name="shippingTotal">Shipping total</param> /// <param name="appliedDiscount">Applied discount</param> /// <returns>Shipping discount</returns> public virtual decimal GetShippingDiscount(Customer customer, decimal shippingTotal, out Discount appliedDiscount) { appliedDiscount = null; decimal shippingDiscountAmount = decimal.Zero; if (_catalogSettings.IgnoreDiscounts) return shippingDiscountAmount; var allDiscounts = _discountService.GetAllDiscounts(DiscountType.AssignedToShipping); var allowedDiscounts = new List<Discount>(); if (allDiscounts != null) { foreach (var discount in allDiscounts) { if (discount.DiscountType == DiscountType.AssignedToShipping && !allowedDiscounts.Any(x => x.Id == discount.Id) && _discountService.IsDiscountValid(discount, customer)) { allowedDiscounts.Add(discount); } } } appliedDiscount = allowedDiscounts.GetPreferredDiscount(shippingTotal); if (appliedDiscount != null) { shippingDiscountAmount = appliedDiscount.GetDiscountAmount(shippingTotal); } if (shippingDiscountAmount < decimal.Zero) shippingDiscountAmount = decimal.Zero; if (_shoppingCartSettings.RoundPricesDuringCalculation) shippingDiscountAmount = Math.Round(shippingDiscountAmount, 2); return shippingDiscountAmount; }
/// <summary> /// Gets an order discount (applied to order subtotal) /// </summary> /// <param name="customer">Customer</param> /// <param name="orderSubTotal">Order subtotal</param> /// <param name="appliedDiscount">Applied discount</param> /// <returns>Order discount</returns> public virtual decimal GetOrderSubtotalDiscount(Customer customer, decimal orderSubTotal, out Discount appliedDiscount) { appliedDiscount = null; decimal discountAmount = decimal.Zero; if (_catalogSettings.IgnoreDiscounts) return discountAmount; var allDiscounts = _discountService.GetAllDiscounts(DiscountType.AssignedToOrderSubTotal); var allowedDiscounts = new List<Discount>(); if (allDiscounts != null) { foreach (var discount in allDiscounts) { if (discount.DiscountType == DiscountType.AssignedToOrderSubTotal && !allowedDiscounts.Any(x => x.Id == discount.Id) && _discountService.IsDiscountValid(discount, customer)) { allowedDiscounts.Add(discount); } } } appliedDiscount = allowedDiscounts.GetPreferredDiscount(orderSubTotal); if (appliedDiscount != null) discountAmount = appliedDiscount.GetDiscountAmount(orderSubTotal); if (discountAmount < decimal.Zero) discountAmount = decimal.Zero; return discountAmount; }
/// <summary> /// Gets an order discount (applied to order total) /// </summary> /// <param name="customer">Customer</param> /// <param name="orderTotal">Order total</param> /// <param name="appliedDiscount">Applied discount</param> /// <returns>Order discount</returns> public virtual decimal GetOrderTotalDiscount(Customer customer, decimal orderTotal, out Discount appliedDiscount) { appliedDiscount = null; decimal discountAmount = decimal.Zero; if (_catalogSettings.IgnoreDiscounts) return discountAmount; var allDiscounts = _discountService.GetAllDiscounts(DiscountType.AssignedToOrderTotal); var allowedDiscounts = new List<Discount>(); if (allDiscounts != null) { foreach (var discount in allDiscounts) { if (_discountService.IsDiscountValid(discount, customer) && discount.DiscountType == DiscountType.AssignedToOrderTotal && !allowedDiscounts.ContainsDiscount(discount)) { allowedDiscounts.Add(discount); } } } appliedDiscount = allowedDiscounts.GetPreferredDiscount(orderTotal); if (appliedDiscount != null) discountAmount = appliedDiscount.GetDiscountAmount(orderTotal); if (discountAmount < decimal.Zero) discountAmount = decimal.Zero; if (_shoppingCartSettings.RoundPricesDuringCalculation) discountAmount = Math.Round(discountAmount, 2); return discountAmount; }