public void GivenPackageQuantityBreak_WhenDeriving_ThenRequiredRelationsMustExist() { var builder = new PackageQuantityBreakBuilder(this.DatabaseSession); var revenueQuantityBreak = builder.Build(); Assert.IsTrue(this.DatabaseSession.Derive().HasErrors); this.DatabaseSession.Rollback(); builder.WithFrom(10); revenueQuantityBreak = builder.Build(); Assert.IsFalse(this.DatabaseSession.Derive().HasErrors); builder.WithThrough(20); revenueQuantityBreak = builder.Build(); Assert.IsFalse(this.DatabaseSession.Derive().HasErrors); revenueQuantityBreak.RemoveFrom(); Assert.IsFalse(this.DatabaseSession.Derive().HasErrors); }
public void GivenOrderItemWithBasePriceForPartyPackageQuantityBreak_WhenDeriving_ThenUseBasePriceForPackageQuantityBreak() { const decimal priceIs9 = 9; const decimal priceIs8 = 8; var package1 = new PackageBuilder(this.DatabaseSession).WithName("package1").Build(); var package2 = new PackageBuilder(this.DatabaseSession).WithName("package2").Build(); var package3 = new PackageBuilder(this.DatabaseSession).WithName("package3").Build(); var break1 = new PackageQuantityBreakBuilder(this.DatabaseSession).WithFrom(2).WithThrough(2).Build(); var break2 = new PackageQuantityBreakBuilder(this.DatabaseSession).WithFrom(3).WithThrough(3).Build(); new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("baseprice good when party revenue in 2 different packages") .WithPackageQuantityBreak(break1) .WithProduct(this.good) .WithPrice(priceIs9) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new BasePriceBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("baseprice good when party revenue in 3 different packages") .WithPackageQuantityBreak(break2) .WithProduct(this.good) .WithPrice(priceIs8) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(package1) .WithRevenue(100M) .Build(); var package2RevenueHistory = new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(package2) .WithRevenue(100M) .Build(); var package3RevenueHistory = new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(package3) .WithRevenue(100M) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); package2RevenueHistory = (PartyPackageRevenueHistory)this.DatabaseSession.Instantiate(package2RevenueHistory); package3RevenueHistory = (PartyPackageRevenueHistory)this.DatabaseSession.Instantiate(package3RevenueHistory); package2RevenueHistory.Revenue = 0; package3RevenueHistory.Revenue = 0; this.order.OnDerive(); var item1 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(this.good).WithQuantityOrdered(3).Build(); this.order.AddSalesOrderItem(item1); this.DatabaseSession.Derive(true); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); package2RevenueHistory.Revenue = 100M; package3RevenueHistory.Revenue = 0; this.order.OnDerive(); this.DatabaseSession.Derive(true); Assert.AreEqual(priceIs9, item1.UnitBasePrice); package2RevenueHistory.Revenue = 100; package3RevenueHistory.Revenue = 100; this.order.OnDerive(); this.DatabaseSession.Derive(true); Assert.AreEqual(priceIs8, item1.UnitBasePrice); }
public void GivenOrderItemWithDiscountPercentageForPartyPackageQuantityBreak_WhenDeriving_ThenUseDiscountComponentsForPartyPackageQuantityBreak() { const decimal quantityOrdered1 = 3; const decimal percentage5 = 5; const decimal percentage10 = 10; var break1 = new PackageQuantityBreakBuilder(this.DatabaseSession).WithFrom(2).WithThrough(2).Build(); var break2 = new PackageQuantityBreakBuilder(this.DatabaseSession).WithFrom(3).WithThrough(3).Build(); new DiscountComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("discount good for revenue in 2 packages") .WithPackageQuantityBreak(break1) .WithProduct(this.good) .WithPercentage(percentage5) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new DiscountComponentBuilder(this.DatabaseSession) .WithSpecifiedFor(this.internalOrganisation) .WithDescription("discount good for revenue in 3 packages") .WithPackageQuantityBreak(break2) .WithProduct(this.good) .WithPercentage(percentage10) .WithFromDate(DateTime.UtcNow.AddMinutes(-1)) .WithThroughDate(DateTime.UtcNow.AddYears(1).AddDays(-1)) .Build(); new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(new PackageBuilder(this.DatabaseSession).WithName("package1").Build()) .WithRevenue(100M) .Build(); var package2RevenueHistory = new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(new PackageBuilder(this.DatabaseSession).WithName("package2").Build()) .WithRevenue(100M) .Build(); var package3RevenueHistory = new PartyPackageRevenueHistoryBuilder(this.DatabaseSession) .WithInternalOrganisation(this.internalOrganisation) .WithParty(this.billToCustomer) .WithPackage(new PackageBuilder(this.DatabaseSession).WithName("package3").Build()) .WithRevenue(100M) .Build(); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); package2RevenueHistory = (PartyPackageRevenueHistory)this.DatabaseSession.Instantiate(package2RevenueHistory); package3RevenueHistory = (PartyPackageRevenueHistory)this.DatabaseSession.Instantiate(package3RevenueHistory); package2RevenueHistory.Revenue = 0; package3RevenueHistory.Revenue = 0; this.order.OnDerive(); 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); package2RevenueHistory.Revenue = 100; package3RevenueHistory.Revenue = 0; this.order.OnDerive(); this.DatabaseSession.Derive(true); var amount1 = decimal.Round((this.currentGoodBasePrice.Price * percentage5) / 100, 2); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(amount1, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price - amount1, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); package2RevenueHistory.Revenue = 100; package3RevenueHistory.Revenue = 100; this.order.OnDerive(); this.DatabaseSession.Derive(true); var amount2 = decimal.Round((this.currentGoodBasePrice.Price * percentage10) / 100, 2); Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(amount2, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(this.currentGoodBasePrice.Price - amount2, item1.CalculatedUnitPrice); Assert.AreEqual(this.goodPurchasePrice.Price, item1.UnitPurchasePrice); }