public static Money CalculateDefaultPriceReduction(Money originalPrice, int itemQuantity, IPromotionData data) {

			Money priceReduction = null;
			Money promotionPrice = new Money(originalPrice, 0);
			promotionPrice.Amount = data.PromotionAmount;
			promotionPrice.Multiply(itemQuantity);

			switch (data.PromotionAmountType) {
				case PromotionAmountType.PercentReduction:
					if (data.PromotionAmount <= 100 && data.PromotionAmount > 0) {
						priceReduction = new Money(originalPrice);
						priceReduction.RoundingMode = RoundingMode.AlwaysRoundUp;
						priceReduction.Multiply(data.PromotionAmount / 100);
					} else {
						priceReduction = originalPrice;
					}
					break;
				case PromotionAmountType.AbsolutePrice:
					priceReduction = new Money(originalPrice);
					priceReduction.Subtract(promotionPrice);
					break;
				case PromotionAmountType.AbsoluteReduction:
					priceReduction = promotionPrice;
					break;
				default:
					LogManager.GetLogger(typeof(GenericPromotion)).Error("Unknown PromotionAmountType");
					break;
			}

			return priceReduction;
		}
		public Money CalculatePriceReduction(IBasketLine basketLine) {
			
			/*
			 * Buy N, get one free
			 * i.e. Buy 4, pay for 3
			 */
			try {
				int quantity = basketLine.Quantity / (PromotionBase.AuxData + 1);

				//See how many multiples we have
				if (quantity * (PromotionBase.AuxData + 1) > basketLine.Quantity) {
					quantity--;
				}

				if (quantity > 0) {

					Money discount = new Money(basketLine.LinePrice);
					discount.RoundingMode = RoundingMode.AlwaysRoundUp;

					discount.Divide(basketLine.Quantity);
					discount.Multiply(quantity);

					return discount;

				} else {

					return new Money(0);

				}

			} catch (Exception e) {
				LogManager.GetLogger(GetType()).Error(e);
				return new Money(0);
			}
		}
		public void TestRoundUp() {
			Money money = new Money();

			money.RoundingMode = RoundingMode.AlwaysRoundUp;
			money.Amount = 1.111M;
			Assert.IsTrue(money.Amount == 1.12M, "Round Up failed (" + money.ToString() + " != 1.12");

			money.Amount = 2400;
			money.Multiply(.175M);
			Assert.IsTrue(money.Amount == 420M, "Round Up failed (" + money.ToString() + " != 420.00");
		}
		public void TestRoundPoint5() {
			Money money = new Money();

			money.RoundingMode = RoundingMode.RoundPoint5AndHigher;
			money.Amount = 1.115M;
			Assert.IsTrue(money.Amount == 1.12M, "Round To Point 5 failed (" + money.ToString() + " != 1.12");
			money.Amount = 1.125M;
			Assert.IsTrue(money.Amount == 1.13M, "Round To Point 5 failed (" + money.ToString() + " != 1.13");
			money.Amount = 1.13495M;
			Assert.IsTrue(money.Amount == 1.14M, "Round To Point 5 failed (" + money.ToString() + " != 1.14");

			money.Amount = 453;
			money.Add(new Money(36));
			money.Add(new Money(10));
			money.Multiply(0.175M);
		
			Assert.IsTrue(money.Amount == 87.33M, "Round To Point 5 failed (" + money.ToString() + " != 87.33");

		}
		public void TestMultiply() {

			Money money1 = new Money(1.23M);
			money1.Multiply(1.5M);

			Assert.IsTrue(money1.Amount == 1.84M, "Multiplication failed (" + money1.ToString() + " != 1.84");
		}