Skip to content

Commit 0c6acce

Browse files
Merge pull request #251 from WhereTheTimeWent/master
Adding read support for XRechnung UBL
2 parents 7401404 + 988e924 commit 0c6acce

File tree

4 files changed

+856
-8
lines changed

4 files changed

+856
-8
lines changed

ZUGFeRD-Test/ZUGFeRD21Tests.cs

+87-6
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public void TestReferenceEReportingFacturXInvoice()
5252
Assert.AreEqual(desc.TradeLineItems.Count, 0);
5353
Assert.AreEqual(desc.LineTotalAmount, 0.0m); // not present in file
5454
Assert.AreEqual(desc.TaxBasisAmount, 198.0m);
55-
}
56-
55+
}
56+
5757
[TestMethod]
5858
public void TestReferenceBasicFacturXInvoice()
5959
{
@@ -71,7 +71,7 @@ public void TestReferenceBasicFacturXInvoice()
7171
Assert.AreEqual(desc.LineTotalAmount, 198.0m);
7272
} // !TestReferenceBasicFacturXInvoice()
7373

74-
74+
7575
[TestMethod]
7676
public void TestStoringReferenceBasicFacturXInvoice()
7777
{
@@ -1665,7 +1665,7 @@ public void TestAltteilSteuer()
16651665
unitCode: QuantityCodes.C62,
16661666
unitQuantity: 1,
16671667
billedQuantity: 1,
1668-
netUnitPrice: 1000,
1668+
netUnitPrice: 1000,
16691669
taxType: TaxTypes.VAT,
16701670
categoryCode: TaxCategoryCodes.S,
16711671
taxPercent: 19);
@@ -1691,7 +1691,7 @@ public void TestAltteilSteuer()
16911691
desc.AddApplicableTradeTax(basisAmount: 1000,
16921692
percent: 19,
16931693
TaxTypes.VAT,
1694-
TaxCategoryCodes.S);
1694+
TaxCategoryCodes.S);
16951695

16961696
desc.SetTotals(lineTotalAmount: 1500m,
16971697
taxBasisAmount: 1500m,
@@ -1704,7 +1704,7 @@ public void TestAltteilSteuer()
17041704

17051705
desc.Save(ms, ZUGFeRDVersion.Version21, Profile.XRechnung);
17061706
ms.Seek(0, SeekOrigin.Begin);
1707-
1707+
17081708
InvoiceDescriptor loadedInvoice = InvoiceDescriptor.Load(ms);
17091709
Assert.AreEqual(loadedInvoice.Invoicee, null);
17101710
} // !TestAltteilSteuer()
@@ -1780,5 +1780,86 @@ public void TestBasisQuantityMultiple()
17801780
XmlNode node = doc.SelectSingleNode("//ram:SpecifiedTradeSettlementLineMonetarySummation//ram:LineTotalAmount", nsmgr);
17811781
Assert.AreEqual("27.50", node.InnerText);
17821782
} // !TestBasisQuantityMultiple()
1783+
1784+
[TestMethod]
1785+
public void TestReferenceXRechnung21UBL()
1786+
{
1787+
string path = @"..\..\..\..\demodata\xRechnung\xRechnung UBL.xml";
1788+
path = _makeSurePathIsCrossPlatformCompatible(path);
1789+
1790+
InvoiceDescriptor desc = InvoiceDescriptor.Load(path);
1791+
1792+
Assert.AreEqual(desc.Profile, Profile.XRechnung);
1793+
Assert.AreEqual(desc.Type, InvoiceType.Invoice);
1794+
1795+
Assert.AreEqual(desc.InvoiceNo, "0815-99-1-a");
1796+
Assert.AreEqual(desc.InvoiceDate, new DateTime(2020, 6, 21));
1797+
Assert.AreEqual(desc.PaymentReference, "0815-99-1-a");
1798+
Assert.AreEqual(desc.OrderNo, "0815-99-1");
1799+
Assert.AreEqual(desc.Currency, CurrencyCodes.EUR);
1800+
1801+
Assert.AreEqual(desc.Buyer.Name, "Rechnungs Roulette GmbH & Co KG");
1802+
Assert.AreEqual(desc.Buyer.City, "Klein Schlappstadt a.d. Lusche");
1803+
Assert.AreEqual(desc.Buyer.Postcode, "12345");
1804+
Assert.AreEqual(desc.Buyer.Country, (CountryCodes)276);
1805+
Assert.AreEqual(desc.Buyer.Street, "Beispielgasse 17b");
1806+
Assert.AreEqual(desc.Buyer.SpecifiedLegalOrganization.TradingBusinessName, "Rechnungs Roulette GmbH & Co KG");
1807+
1808+
Assert.AreEqual(desc.BuyerContact.Name, "Manfred Mustermann");
1809+
Assert.AreEqual(desc.BuyerContact.EmailAddress, "[email protected]");
1810+
Assert.AreEqual(desc.BuyerContact.PhoneNo, "012345 98 765 - 44");
1811+
1812+
Assert.AreEqual(desc.Seller.Name, "Harry Hirsch Holz- und Trockenbau");
1813+
Assert.AreEqual(desc.Seller.City, "Klein Schlappstadt a.d. Lusche");
1814+
Assert.AreEqual(desc.Seller.Postcode, "12345");
1815+
Assert.AreEqual(desc.Seller.Country, (CountryCodes)276);
1816+
Assert.AreEqual(desc.Seller.Street, "Beispielgasse 17a");
1817+
Assert.AreEqual(desc.Seller.SpecifiedLegalOrganization.TradingBusinessName, "Harry Hirsch Holz- und Trockenbau");
1818+
1819+
Assert.AreEqual(desc.SellerContact.Name, "Harry Hirsch");
1820+
Assert.AreEqual(desc.SellerContact.EmailAddress, "[email protected]");
1821+
Assert.AreEqual(desc.SellerContact.PhoneNo, "012345 78 657 - 8");
1822+
1823+
Assert.AreEqual(desc.TradeLineItems.Count, 2);
1824+
1825+
Assert.AreEqual(desc.TradeLineItems[0].SellerAssignedID, "0815");
1826+
Assert.AreEqual(desc.TradeLineItems[0].Name, "Leimbinder");
1827+
Assert.AreEqual(desc.TradeLineItems[0].Description, "Leimbinder 2x18m; Birke");
1828+
Assert.AreEqual(desc.TradeLineItems[0].BilledQuantity, 1);
1829+
Assert.AreEqual(desc.TradeLineItems[0].LineTotalAmount, 1245.98m);
1830+
Assert.AreEqual(desc.TradeLineItems[0].TaxPercent, 19);
1831+
1832+
Assert.AreEqual(desc.TradeLineItems[1].SellerAssignedID, "MON");
1833+
Assert.AreEqual(desc.TradeLineItems[1].Name, "Montage");
1834+
Assert.AreEqual(desc.TradeLineItems[1].Description, "Montage durch Fachpersonal");
1835+
Assert.AreEqual(desc.TradeLineItems[1].BilledQuantity, 1);
1836+
Assert.AreEqual(desc.TradeLineItems[1].LineTotalAmount, 200.00m);
1837+
Assert.AreEqual(desc.TradeLineItems[1].TaxPercent, 7);
1838+
1839+
Assert.AreEqual(desc.LineTotalAmount, 1445.98m);
1840+
Assert.AreEqual(desc.TaxTotalAmount, 250.74m);
1841+
Assert.AreEqual(desc.GrandTotalAmount, 1696.72m);
1842+
Assert.AreEqual(desc.DuePayableAmount, 1696.72m);
1843+
1844+
Assert.AreEqual(desc.Taxes[0].TaxAmount, 236.7362m);
1845+
Assert.AreEqual(desc.Taxes[0].BasisAmount, 1245.98m);
1846+
Assert.AreEqual(desc.Taxes[0].Percent, 19);
1847+
Assert.AreEqual(desc.Taxes[0].TypeCode, (TaxTypes)53);
1848+
Assert.AreEqual(desc.Taxes[0].CategoryCode, (TaxCategoryCodes)19);
1849+
1850+
Assert.AreEqual(desc.Taxes[1].TaxAmount, 14.0000m);
1851+
Assert.AreEqual(desc.Taxes[1].BasisAmount, 200.00m);
1852+
Assert.AreEqual(desc.Taxes[1].Percent, 7);
1853+
Assert.AreEqual(desc.Taxes[1].TypeCode, (TaxTypes)53);
1854+
Assert.AreEqual(desc.Taxes[1].CategoryCode, (TaxCategoryCodes)19);
1855+
1856+
Assert.AreEqual(desc.PaymentTerms.DueDate, new DateTime(2020, 6, 21));
1857+
1858+
Assert.AreEqual(desc.CreditorBankAccounts[0].IBAN, "DE12500105170648489890");
1859+
Assert.AreEqual(desc.CreditorBankAccounts[0].BIC, "INGDDEFFXXX");
1860+
Assert.AreEqual(desc.CreditorBankAccounts[0].Name, "Harry Hirsch");
1861+
1862+
Assert.AreEqual(desc.PaymentMeans.TypeCode, (PaymentMeansTypeCodes)30);
1863+
} // !TestReferenceXRechnung21UBL()
17831864
}
17841865
}

ZUGFeRD/InvoiceDescriptor.cs

+24
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,12 @@ public static ZUGFeRDVersion GetVersion(string filename)
329329
return ZUGFeRDVersion.Version1;
330330
}
331331

332+
reader = new InvoiceDescriptor21UblReader();
333+
if (reader.IsReadableByThisReaderVersion(filename))
334+
{
335+
return ZUGFeRDVersion.Version21;
336+
}
337+
332338
reader = new InvoiceDescriptor21Reader();
333339
if (reader.IsReadableByThisReaderVersion(filename))
334340
{
@@ -362,6 +368,12 @@ public static ZUGFeRDVersion GetVersion(Stream stream)
362368
return ZUGFeRDVersion.Version1;
363369
}
364370

371+
reader = new InvoiceDescriptor21UblReader();
372+
if (reader.IsReadableByThisReaderVersion(stream))
373+
{
374+
return ZUGFeRDVersion.Version21;
375+
}
376+
365377
reader = new InvoiceDescriptor21Reader();
366378
if (reader.IsReadableByThisReaderVersion(stream))
367379
{
@@ -396,6 +408,12 @@ public static InvoiceDescriptor Load(Stream stream)
396408
return reader.Load(stream);
397409
}
398410

411+
reader = new InvoiceDescriptor21UblReader();
412+
if (reader.IsReadableByThisReaderVersion(stream))
413+
{
414+
return reader.Load(stream);
415+
}
416+
399417
reader = new InvoiceDescriptor21Reader();
400418
if (reader.IsReadableByThisReaderVersion(stream))
401419
{
@@ -429,6 +447,12 @@ public static InvoiceDescriptor Load(string filename)
429447
return reader.Load(filename);
430448
}
431449

450+
reader = new InvoiceDescriptor21UblReader();
451+
if (reader.IsReadableByThisReaderVersion(filename))
452+
{
453+
return reader.Load(filename);
454+
}
455+
432456
reader = new InvoiceDescriptor21Reader();
433457
if (reader.IsReadableByThisReaderVersion(filename))
434458
{

0 commit comments

Comments
 (0)