public void GivenBillToCustomerWithDifferentCurrency_WhenDerivingPrices_ThenCalculatePricesInPreferredCurrency() { var poundSterling = new Currencies(this.DatabaseSession).FindBy(Currencies.Meta.IsoCode, "GBP"); const decimal conversionfactor = 0.8553M; var euroToPoundStirling = new UnitOfMeasureConversionBuilder(this.DatabaseSession) .WithConversionFactor(conversionfactor) .WithToUnitOfMeasure(poundSterling) .WithStartDate(DateTime.UtcNow) .Build(); var euro = new Currencies(this.DatabaseSession).FindBy(Currencies.Meta.IsoCode, "EUR"); euro.AddUnitOfMeasureConversion(euroToPoundStirling); this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); Assert.AreEqual(euro, this.invoice.CustomerCurrency); this.billToCustomer.PreferredCurrency = poundSterling; var newInvoice = new SalesInvoiceBuilder(this.DatabaseSession) .WithBillToCustomer(this.billToCustomer) .WithBilledFromInternalOrganisation(this.internalOrganisation) .WithBillToContactMechanism(this.billToContactMechanismMechelen) .Build(); const decimal quantity = 3; var item1 = new SalesInvoiceItemBuilder(this.DatabaseSession).WithProduct(this.good).WithSalesInvoiceItemType(new SalesInvoiceItemTypes(this.DatabaseSession).ProductItem).WithQuantity(quantity).Build(); newInvoice.AddSalesInvoiceItem(item1); this.DatabaseSession.Derive(true); Assert.AreEqual(poundSterling, newInvoice.CustomerCurrency); Assert.AreEqual(decimal.Round(item1.TotalBasePrice * conversionfactor, 2), item1.TotalBasePriceCustomerCurrency); Assert.AreEqual(0, item1.TotalDiscount); Assert.AreEqual(0, item1.TotalSurcharge); Assert.AreEqual(decimal.Round(item1.TotalExVat * conversionfactor, 2), item1.TotalExVatCustomerCurrency); }
public void GivenPurchasePriceInDifferenUnitOfMeasureComparedToProduct_WhenDerivingMarkupAndProfitMargin_ThenUnitOfMeasureConversionIsPerformed() { var pair = new UnitsOfMeasure(this.DatabaseSession).Pair; var piece = new UnitsOfMeasure(this.DatabaseSession).Piece; var fromPairToPiece = new UnitOfMeasureConversionBuilder(this.DatabaseSession) .WithToUnitOfMeasure(piece) .WithConversionFactor(2).Build(); var fromPieceToPair = new UnitOfMeasureConversionBuilder(this.DatabaseSession) .WithToUnitOfMeasure(pair) .WithConversionFactor(0.5M).Build(); pair.AddUnitOfMeasureConversion(fromPairToPiece); pair.AddUnitOfMeasureConversion(fromPieceToPair); this.goodPurchasePrice.UnitOfMeasure = pair; this.good.UnitOfMeasure = piece; this.DatabaseSession.Derive(true); this.DatabaseSession.Commit(); this.InstantiateObjects(this.DatabaseSession); const decimal quantity = 3; var item1 = new SalesInvoiceItemBuilder(this.DatabaseSession).WithProduct(this.good).WithSalesInvoiceItemType(new SalesInvoiceItemTypes(this.DatabaseSession).ProductItem).WithQuantity(quantity).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(decimal.Round((item1.CalculatedUnitPrice * this.vatRate21.Rate) / 100, 2), item1.UnitVat); Assert.AreEqual(this.goodPurchasePrice.Price * 0.5M, item1.UnitPurchasePrice); Assert.AreEqual(this.currentGood1BasePrice.Price * quantity, item1.TotalBasePrice); Assert.AreEqual(0, item1.TotalDiscount); Assert.AreEqual(0, item1.TotalSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price * quantity, item1.TotalExVat); Assert.AreEqual(decimal.Round((item1.CalculatedUnitPrice * this.vatRate21.Rate) / 100, 2) * quantity, item1.TotalVat); var purchasePrice = this.goodPurchasePrice.Price * 0.5M; Assert.AreEqual(decimal.Round(((item1.UnitBasePrice / purchasePrice) - 1) * 100, 2), item1.InitialMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice / purchasePrice) - 1) * 100, 2), item1.MaintainedMarkupPercentage); Assert.AreEqual(decimal.Round(((item1.UnitBasePrice - purchasePrice) / item1.UnitBasePrice) * 100, 2), item1.InitialProfitMargin); Assert.AreEqual(decimal.Round(((item1.CalculatedUnitPrice - purchasePrice) / item1.CalculatedUnitPrice) * 100, 2), item1.MaintainedProfitMargin); Assert.AreEqual(this.currentGood1BasePrice.Price * quantity, this.invoice.TotalBasePrice); Assert.AreEqual(0, this.invoice.TotalDiscount); Assert.AreEqual(0, this.invoice.TotalSurcharge); Assert.AreEqual(this.currentGood1BasePrice.Price * quantity, this.invoice.TotalExVat); Assert.AreEqual(decimal.Round((item1.CalculatedUnitPrice * this.vatRate21.Rate) / 100, 2) * quantity, this.invoice.TotalVat); Assert.AreEqual(item1.UnitPurchasePrice, this.invoice.TotalPurchasePrice); }