Example #1
0
        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);
        }