Skip to content

Commit

Permalink
Merge pull request #251 from WhereTheTimeWent/master
Browse files Browse the repository at this point in the history
Adding read support for XRechnung UBL
  • Loading branch information
stephanstapel authored May 4, 2024
2 parents 7401404 + 988e924 commit 0c6acce
Show file tree
Hide file tree
Showing 4 changed files with 856 additions and 8 deletions.
93 changes: 87 additions & 6 deletions ZUGFeRD-Test/ZUGFeRD21Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ public void TestReferenceEReportingFacturXInvoice()
Assert.AreEqual(desc.TradeLineItems.Count, 0);
Assert.AreEqual(desc.LineTotalAmount, 0.0m); // not present in file
Assert.AreEqual(desc.TaxBasisAmount, 198.0m);
}
}

[TestMethod]
public void TestReferenceBasicFacturXInvoice()
{
Expand All @@ -71,7 +71,7 @@ public void TestReferenceBasicFacturXInvoice()
Assert.AreEqual(desc.LineTotalAmount, 198.0m);
} // !TestReferenceBasicFacturXInvoice()


[TestMethod]
public void TestStoringReferenceBasicFacturXInvoice()
{
Expand Down Expand Up @@ -1665,7 +1665,7 @@ public void TestAltteilSteuer()
unitCode: QuantityCodes.C62,
unitQuantity: 1,
billedQuantity: 1,
netUnitPrice: 1000,
netUnitPrice: 1000,
taxType: TaxTypes.VAT,
categoryCode: TaxCategoryCodes.S,
taxPercent: 19);
Expand All @@ -1691,7 +1691,7 @@ public void TestAltteilSteuer()
desc.AddApplicableTradeTax(basisAmount: 1000,
percent: 19,
TaxTypes.VAT,
TaxCategoryCodes.S);
TaxCategoryCodes.S);

desc.SetTotals(lineTotalAmount: 1500m,
taxBasisAmount: 1500m,
Expand All @@ -1704,7 +1704,7 @@ public void TestAltteilSteuer()

desc.Save(ms, ZUGFeRDVersion.Version21, Profile.XRechnung);
ms.Seek(0, SeekOrigin.Begin);

InvoiceDescriptor loadedInvoice = InvoiceDescriptor.Load(ms);
Assert.AreEqual(loadedInvoice.Invoicee, null);
} // !TestAltteilSteuer()
Expand Down Expand Up @@ -1780,5 +1780,86 @@ public void TestBasisQuantityMultiple()
XmlNode node = doc.SelectSingleNode("//ram:SpecifiedTradeSettlementLineMonetarySummation//ram:LineTotalAmount", nsmgr);
Assert.AreEqual("27.50", node.InnerText);
} // !TestBasisQuantityMultiple()

[TestMethod]
public void TestReferenceXRechnung21UBL()
{
string path = @"..\..\..\..\demodata\xRechnung\xRechnung UBL.xml";
path = _makeSurePathIsCrossPlatformCompatible(path);

InvoiceDescriptor desc = InvoiceDescriptor.Load(path);

Assert.AreEqual(desc.Profile, Profile.XRechnung);
Assert.AreEqual(desc.Type, InvoiceType.Invoice);

Assert.AreEqual(desc.InvoiceNo, "0815-99-1-a");
Assert.AreEqual(desc.InvoiceDate, new DateTime(2020, 6, 21));
Assert.AreEqual(desc.PaymentReference, "0815-99-1-a");
Assert.AreEqual(desc.OrderNo, "0815-99-1");
Assert.AreEqual(desc.Currency, CurrencyCodes.EUR);

Assert.AreEqual(desc.Buyer.Name, "Rechnungs Roulette GmbH & Co KG");
Assert.AreEqual(desc.Buyer.City, "Klein Schlappstadt a.d. Lusche");
Assert.AreEqual(desc.Buyer.Postcode, "12345");
Assert.AreEqual(desc.Buyer.Country, (CountryCodes)276);
Assert.AreEqual(desc.Buyer.Street, "Beispielgasse 17b");
Assert.AreEqual(desc.Buyer.SpecifiedLegalOrganization.TradingBusinessName, "Rechnungs Roulette GmbH & Co KG");

Assert.AreEqual(desc.BuyerContact.Name, "Manfred Mustermann");
Assert.AreEqual(desc.BuyerContact.EmailAddress, "[email protected]");
Assert.AreEqual(desc.BuyerContact.PhoneNo, "012345 98 765 - 44");

Assert.AreEqual(desc.Seller.Name, "Harry Hirsch Holz- und Trockenbau");
Assert.AreEqual(desc.Seller.City, "Klein Schlappstadt a.d. Lusche");
Assert.AreEqual(desc.Seller.Postcode, "12345");
Assert.AreEqual(desc.Seller.Country, (CountryCodes)276);
Assert.AreEqual(desc.Seller.Street, "Beispielgasse 17a");
Assert.AreEqual(desc.Seller.SpecifiedLegalOrganization.TradingBusinessName, "Harry Hirsch Holz- und Trockenbau");

Assert.AreEqual(desc.SellerContact.Name, "Harry Hirsch");
Assert.AreEqual(desc.SellerContact.EmailAddress, "[email protected]");
Assert.AreEqual(desc.SellerContact.PhoneNo, "012345 78 657 - 8");

Assert.AreEqual(desc.TradeLineItems.Count, 2);

Assert.AreEqual(desc.TradeLineItems[0].SellerAssignedID, "0815");
Assert.AreEqual(desc.TradeLineItems[0].Name, "Leimbinder");
Assert.AreEqual(desc.TradeLineItems[0].Description, "Leimbinder 2x18m; Birke");
Assert.AreEqual(desc.TradeLineItems[0].BilledQuantity, 1);
Assert.AreEqual(desc.TradeLineItems[0].LineTotalAmount, 1245.98m);
Assert.AreEqual(desc.TradeLineItems[0].TaxPercent, 19);

Assert.AreEqual(desc.TradeLineItems[1].SellerAssignedID, "MON");
Assert.AreEqual(desc.TradeLineItems[1].Name, "Montage");
Assert.AreEqual(desc.TradeLineItems[1].Description, "Montage durch Fachpersonal");
Assert.AreEqual(desc.TradeLineItems[1].BilledQuantity, 1);
Assert.AreEqual(desc.TradeLineItems[1].LineTotalAmount, 200.00m);
Assert.AreEqual(desc.TradeLineItems[1].TaxPercent, 7);

Assert.AreEqual(desc.LineTotalAmount, 1445.98m);
Assert.AreEqual(desc.TaxTotalAmount, 250.74m);
Assert.AreEqual(desc.GrandTotalAmount, 1696.72m);
Assert.AreEqual(desc.DuePayableAmount, 1696.72m);

Assert.AreEqual(desc.Taxes[0].TaxAmount, 236.7362m);
Assert.AreEqual(desc.Taxes[0].BasisAmount, 1245.98m);
Assert.AreEqual(desc.Taxes[0].Percent, 19);
Assert.AreEqual(desc.Taxes[0].TypeCode, (TaxTypes)53);
Assert.AreEqual(desc.Taxes[0].CategoryCode, (TaxCategoryCodes)19);

Assert.AreEqual(desc.Taxes[1].TaxAmount, 14.0000m);
Assert.AreEqual(desc.Taxes[1].BasisAmount, 200.00m);
Assert.AreEqual(desc.Taxes[1].Percent, 7);
Assert.AreEqual(desc.Taxes[1].TypeCode, (TaxTypes)53);
Assert.AreEqual(desc.Taxes[1].CategoryCode, (TaxCategoryCodes)19);

Assert.AreEqual(desc.PaymentTerms.DueDate, new DateTime(2020, 6, 21));

Assert.AreEqual(desc.CreditorBankAccounts[0].IBAN, "DE12500105170648489890");
Assert.AreEqual(desc.CreditorBankAccounts[0].BIC, "INGDDEFFXXX");
Assert.AreEqual(desc.CreditorBankAccounts[0].Name, "Harry Hirsch");

Assert.AreEqual(desc.PaymentMeans.TypeCode, (PaymentMeansTypeCodes)30);
} // !TestReferenceXRechnung21UBL()
}
}
24 changes: 24 additions & 0 deletions ZUGFeRD/InvoiceDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,12 @@ public static ZUGFeRDVersion GetVersion(string filename)
return ZUGFeRDVersion.Version1;
}

reader = new InvoiceDescriptor21UblReader();
if (reader.IsReadableByThisReaderVersion(filename))
{
return ZUGFeRDVersion.Version21;
}

reader = new InvoiceDescriptor21Reader();
if (reader.IsReadableByThisReaderVersion(filename))
{
Expand Down Expand Up @@ -362,6 +368,12 @@ public static ZUGFeRDVersion GetVersion(Stream stream)
return ZUGFeRDVersion.Version1;
}

reader = new InvoiceDescriptor21UblReader();
if (reader.IsReadableByThisReaderVersion(stream))
{
return ZUGFeRDVersion.Version21;
}

reader = new InvoiceDescriptor21Reader();
if (reader.IsReadableByThisReaderVersion(stream))
{
Expand Down Expand Up @@ -396,6 +408,12 @@ public static InvoiceDescriptor Load(Stream stream)
return reader.Load(stream);
}

reader = new InvoiceDescriptor21UblReader();
if (reader.IsReadableByThisReaderVersion(stream))
{
return reader.Load(stream);
}

reader = new InvoiceDescriptor21Reader();
if (reader.IsReadableByThisReaderVersion(stream))
{
Expand Down Expand Up @@ -429,6 +447,12 @@ public static InvoiceDescriptor Load(string filename)
return reader.Load(filename);
}

reader = new InvoiceDescriptor21UblReader();
if (reader.IsReadableByThisReaderVersion(filename))
{
return reader.Load(filename);
}

reader = new InvoiceDescriptor21Reader();
if (reader.IsReadableByThisReaderVersion(filename))
{
Expand Down
Loading

0 comments on commit 0c6acce

Please sign in to comment.