public void GivenInvoiceItemWithDiscountPercentageForOrderValue_WhenDeriving_ThenUseDiscountComponentsForOrderValue() { const decimal quantity1 = 3; const decimal quantity2 = 3; const decimal quantity3 = 10; const decimal percentage1 = 5; const decimal percentage2 = 10; var value1 = new OrderValueBuilder(this.DatabaseSession).WithFromAmount(50).WithThroughAmount(99).Build(); var value2 = new OrderValueBuilder(this.DatabaseSession).WithFromAmount(100).Build(); new DiscountComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("discount good for order value 1") .WithOrderValue(value1) .WithProduct(this.good) .WithPercentage(percentage1) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new DiscountComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("discount good for order value 1") .WithOrderValue(value2) .WithProduct(this.good) .WithPercentage(percentage2) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); var item1 = new SalesInvoiceItemBuilder(this.DatabaseSession).WithProduct(this.good).WithSalesInvoiceItemType(new SalesInvoiceItemTypes(this.DatabaseSession).ProductItem).WithQuantity(quantity1).Build(); this.invoice.AddSalesInvoiceItem(item1); this.DatabaseSession.Derive(true); Assert.AreEqual(this.currentGood1BasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(0, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice - this.goodPurchasePrice.Price) / item1.UnitBasePrice) * 100, 2), item1.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item1.CalculatedUnitPrice) * 100, 2), item1.MaintainedProfitMargin); var item2 = new SalesInvoiceItemBuilder(this.DatabaseSession).WithProduct(this.good).WithSalesInvoiceItemType(new SalesInvoiceItemTypes(this.DatabaseSession).ProductItem).WithQuantity(quantity2).Build(); this.invoice.AddSalesInvoiceItem(item2); this.DatabaseSession.Derive(true); var amount1 = decimal.Round((this.currentGood1BasePrice.Price * percentage1) / 100, 2); Assert.AreEqual(this.currentGood1BasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(amount1, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price - amount1, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice - this.goodPurchasePrice.Price) / item1.UnitBasePrice) * 100, 2), item1.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item1.CalculatedUnitPrice) * 100, 2), item1.MaintainedProfitMargin); Assert.AreEqual(this.currentGood1BasePrice.Price, item2.UnitBasePrice); Assert.AreEqual(amount1, item2.UnitDiscount); Assert.AreEqual(0, item2.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price - amount1, item2.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item2.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item2.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item2.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item2.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item2.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item2.UnitBasePrice - this.goodPurchasePrice.Price) / item2.UnitBasePrice) * 100, 2), item2.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item2.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item2.CalculatedUnitPrice) * 100, 2), item2.MaintainedProfitMargin); var item3 = new SalesInvoiceItemBuilder(this.DatabaseSession).WithProduct(this.good).WithSalesInvoiceItemType(new SalesInvoiceItemTypes(this.DatabaseSession).ProductItem).WithQuantity(quantity3).Build(); this.invoice.AddSalesInvoiceItem(item3); this.DatabaseSession.Derive(true); var amount2 = decimal.Round((this.currentGood1BasePrice.Price * percentage2) / 100, 2); Assert.AreEqual(this.currentGood1BasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(amount2, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price - amount2, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item1.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice - this.goodPurchasePrice.Price) / item1.UnitBasePrice) * 100, 2), item1.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item1.CalculatedUnitPrice) * 100, 2), item1.MaintainedProfitMargin); Assert.AreEqual(this.currentGood1BasePrice.Price, item2.UnitBasePrice); Assert.AreEqual(amount2, item2.UnitDiscount); Assert.AreEqual(0, item2.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price - amount2, item2.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item2.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item2.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item2.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item2.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item2.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item2.UnitBasePrice - this.goodPurchasePrice.Price) / item2.UnitBasePrice) * 100, 2), item2.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item2.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item2.CalculatedUnitPrice) * 100, 2), item2.MaintainedProfitMargin); Assert.AreEqual(this.currentGood1BasePrice.Price, item3.UnitBasePrice); Assert.AreEqual(amount2, item3.UnitDiscount); Assert.AreEqual(0, item3.UnitSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price - amount2, item3.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item3.UnitPurchasePrice); Assert.AreEqual(decimal.Round(((item3.UnitBasePrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item3.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item3.CalculatedUnitPrice / this.goodPurchasePrice.Price) - 1) * 100, 2), item3.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item3.UnitBasePrice - this.goodPurchasePrice.Price) / item3.UnitBasePrice) * 100, 2), item3.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item3.CalculatedUnitPrice - this.goodPurchasePrice.Price) / item3.CalculatedUnitPrice) * 100, 2), item3.MaintainedProfitMargin); }
public void GivenOrderItemWithSurchargePercentageForOrderValue_WhenDeriving_ThenUseSurchargeComponentsForOrderValue() { const decimal quantityOrdered1 = 3; const decimal quantityOrdered2 = 3; const decimal quantityOrdered3 = 10; const decimal percentage1 = 5; const decimal percentage2 = 10; var value1 = new OrderValueBuilder(this.DatabaseSession).WithFromAmount(50).WithThroughAmount(99).Build(); var value2 = new OrderValueBuilder(this.DatabaseSession).WithFromAmount(100).Build(); new SurchargeComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("surcharge good for order value 1") .WithOrderValue(value1) .WithProduct(this.good) .WithPercentage(percentage1) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new SurchargeComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("surcharge good for order value 1") .WithOrderValue(value2) .WithProduct(this.good) .WithPercentage(percentage2) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); var item1 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(this.good).WithQuantityOrdered(quantityOrdered1).Build(); this.order.AddSalesOrderItem(item1); this.DatabaseSession.Derive(true); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(0, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); var item2 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(this.good).WithQuantityOrdered(quantityOrdered2).Build(); this.order.AddSalesOrderItem(item2); this.DatabaseSession.Derive(true); var amount1 = decimal.Round((this.currentGoodBasePrice.Price * percentage1) / 100, 2); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(0, item1.UnitDiscount); Assert.AreEqual(amount1, item1.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price + amount1, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); Assert.AreEqual(this.currentGoodBasePrice.Price, item2.UnitBasePrice); Assert.AreEqual(0, item2.UnitDiscount); Assert.AreEqual(amount1, item2.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price + amount1, item2.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item2.UnitPurchasePrice); var item3 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(this.good).WithQuantityOrdered(quantityOrdered3).Build(); this.order.AddSalesOrderItem(item3); this.DatabaseSession.Derive(true); var amount2 = decimal.Round((this.currentGoodBasePrice.Price * percentage2) / 100, 2); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(0, item1.UnitDiscount); Assert.AreEqual(amount2, item1.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price + amount2, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); Assert.AreEqual(this.currentGoodBasePrice.Price, item2.UnitBasePrice); Assert.AreEqual(0, item2.UnitDiscount); Assert.AreEqual(amount2, item2.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price + amount2, item2.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item2.UnitPurchasePrice); Assert.AreEqual(this.currentGoodBasePrice.Price, item3.UnitBasePrice); Assert.AreEqual(0, item3.UnitDiscount); Assert.AreEqual(amount2, item3.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price + amount2, item3.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item3.UnitPurchasePrice); }