Skip to content

Commit 3b96a88

Browse files
committed
backport of InvoicerContact
1 parent 6687450 commit 3b96a88

File tree

4 files changed

+74
-49
lines changed

4 files changed

+74
-49
lines changed

ZUGFeRD.Test/ZUGFeRD22Tests.cs

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3622,53 +3622,6 @@ public void TestRSMInvoice()
36223622
Assert.AreEqual(desc.Profile, Profile.XRechnung1);
36233623
Assert.AreEqual(desc.InvoiceNo, "0815-99-1-a");
36243624
Assert.AreEqual(desc.InvoiceDate, new DateTime(2020, 06, 21));
3625-
} // !TestRSMInvoice()
3626-
3627-
[TestMethod]
3628-
public void TestInvoicerContactWriteAndRead()
3629-
{
3630-
var desc = InvoiceDescriptor.CreateInvoice("12345", new DateTime(2025, 06, 01), CurrencyCodes.EUR);
3631-
desc.Invoicer = new Party
3632-
{
3633-
Name = "Invoicer Name",
3634-
Street = "Straße 1",
3635-
Postcode = "01234",
3636-
City = "Musterstadt",
3637-
Country = CountryCodes.DE,
3638-
};
3639-
3640-
desc.InvoicerContact = new Contact
3641-
{
3642-
EmailAddress = "invoiceremail@example.com",
3643-
FaxNo = "+49 12345",
3644-
PhoneNo = "+49 54321"
3645-
};
3646-
3647-
using var invoiceStream = new MemoryStream();
3648-
desc.Save(invoiceStream, ZUGFeRDVersion.Version23, Profile.Extended);
3649-
3650-
var invoiceString = Encoding.UTF8.GetString(invoiceStream.ToArray());
3651-
3652-
const string expectedInvoicePart = """
3653-
<ram:DefinedTradeContact>
3654-
<ram:TelephoneUniversalCommunication>
3655-
<ram:CompleteNumber>+49 54321</ram:CompleteNumber>
3656-
</ram:TelephoneUniversalCommunication>
3657-
<ram:FaxUniversalCommunication>
3658-
<ram:CompleteNumber>+49 12345</ram:CompleteNumber>
3659-
</ram:FaxUniversalCommunication>
3660-
<ram:EmailURIUniversalCommunication>
3661-
<ram:URIID>invoiceremail@example.com</ram:URIID>
3662-
</ram:EmailURIUniversalCommunication>
3663-
</ram:DefinedTradeContact>
3664-
""";
3665-
StringAssert.Contains(invoiceString, expectedInvoicePart);
3666-
3667-
var loadedInvoice = InvoiceDescriptor.Load(invoiceStream);
3668-
3669-
Assert.AreEqual("invoiceremail@example.com", loadedInvoice.InvoicerContact.EmailAddress);
3670-
Assert.AreEqual("+49 12345", loadedInvoice.InvoicerContact.FaxNo);
3671-
Assert.AreEqual("+49 54321", loadedInvoice.InvoicerContact.PhoneNo);
3672-
}
3625+
} // !TestRSMInvoice()
36733626
}
36743627
}

ZUGFeRD.Test/ZUGFeRDCrossVersionTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,5 +1007,55 @@ public void TestNulledGlobalIDScheme(ZUGFeRDVersion version, ZUGFeRDFormats form
10071007
Assert.IsNull(item.GlobalID.SchemeID);
10081008
}
10091009
} // !TestNulledGlobalIDScheme()
1010+
1011+
1012+
[TestMethod]
1013+
[DataRow(ZUGFeRDVersion.Version20, ZUGFeRDFormats.CII, Profile.Extended)]
1014+
[DataRow(ZUGFeRDVersion.Version23, ZUGFeRDFormats.CII, Profile.Extended)]
1015+
public void TestInvoicerContactWriteAndRead(ZUGFeRDVersion version, ZUGFeRDFormats format, Profile profile)
1016+
{
1017+
var desc = new InvoiceProvider().CreateInvoice();
1018+
desc.Invoicer = new Party
1019+
{
1020+
Name = "Invoicer Name",
1021+
Street = "Straße 1",
1022+
Postcode = "01234",
1023+
City = "Musterstadt",
1024+
Country = CountryCodes.DE,
1025+
};
1026+
1027+
desc.InvoicerContact = new Contact
1028+
{
1029+
EmailAddress = "invoiceremail@example.com",
1030+
FaxNo = "+49 12345",
1031+
PhoneNo = "+49 54321"
1032+
};
1033+
1034+
using var invoiceStream = new MemoryStream();
1035+
desc.Save(invoiceStream, version, profile);
1036+
1037+
var invoiceString = Encoding.UTF8.GetString(invoiceStream.ToArray());
1038+
1039+
const string expectedInvoicePart = """
1040+
<ram:DefinedTradeContact>
1041+
<ram:TelephoneUniversalCommunication>
1042+
<ram:CompleteNumber>+49 54321</ram:CompleteNumber>
1043+
</ram:TelephoneUniversalCommunication>
1044+
<ram:FaxUniversalCommunication>
1045+
<ram:CompleteNumber>+49 12345</ram:CompleteNumber>
1046+
</ram:FaxUniversalCommunication>
1047+
<ram:EmailURIUniversalCommunication>
1048+
<ram:URIID>invoiceremail@example.com</ram:URIID>
1049+
</ram:EmailURIUniversalCommunication>
1050+
</ram:DefinedTradeContact>
1051+
""";
1052+
StringAssert.Contains(invoiceString, expectedInvoicePart);
1053+
1054+
var loadedInvoice = InvoiceDescriptor.Load(invoiceStream);
1055+
1056+
Assert.AreEqual("invoiceremail@example.com", loadedInvoice.InvoicerContact.EmailAddress);
1057+
Assert.AreEqual("+49 12345", loadedInvoice.InvoicerContact.FaxNo);
1058+
Assert.AreEqual("+49 54321", loadedInvoice.InvoicerContact.PhoneNo);
1059+
} // !TestInvoicerContactWriteAndRead()
10101060
}
10111061
}

ZUGFeRD/InvoiceDescriptor20Reader.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,28 @@ public override InvoiceDescriptor Load(Stream stream)
164164
}
165165

166166
retval.Invoicee = _nodeAsParty(doc.DocumentElement, "//ram:ApplicableHeaderTradeSettlement/ram:InvoiceeTradeParty", nsmgr);
167+
//BT-X-242-00
168+
foreach (XmlNode node in doc.SelectNodes("//ram:ApplicableHeaderTradeSettlement/ram:InvoiceeTradeParty/ram:SpecifiedTaxRegistration", nsmgr))
169+
{
170+
string id = XmlUtils.NodeAsString(node, ".//ram:ID", nsmgr);
171+
string schemeID = XmlUtils.NodeAsString(node, ".//ram:ID/@schemeID", nsmgr);
172+
173+
retval.AddInvoiceeTaxRegistration(id, EnumExtensions.StringToEnum<TaxRegistrationSchemeID>(schemeID));
174+
}
175+
176+
retval.Invoicer = _nodeAsParty(doc.DocumentElement, "//ram:ApplicableHeaderTradeSettlement/ram:InvoicerTradeParty", nsmgr);
177+
if (doc.SelectSingleNode("//ram:InvoicerTradeParty/ram:DefinedTradeContact", nsmgr) != null)
178+
{
179+
retval.InvoicerContact = new Contact()
180+
{
181+
Name = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:InvoicerTradeParty/ram:DefinedTradeContact/ram:PersonName", nsmgr),
182+
OrgUnit = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:InvoicerTradeParty/ram:DefinedTradeContact/ram:DepartmentName", nsmgr),
183+
PhoneNo = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:InvoicerTradeParty/ram:DefinedTradeContact/ram:TelephoneUniversalCommunication/ram:CompleteNumber", nsmgr),
184+
FaxNo = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:InvoicerTradeParty/ram:DefinedTradeContact/ram:FaxUniversalCommunication/ram:CompleteNumber", nsmgr),
185+
EmailAddress = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:InvoicerTradeParty/ram:DefinedTradeContact/ram:EmailURIUniversalCommunication/ram:URIID", nsmgr)
186+
};
187+
}
188+
167189
retval.Payee = _nodeAsParty(doc.DocumentElement, "//ram:ApplicableHeaderTradeSettlement/ram:PayeeTradeParty", nsmgr);
168190

169191
retval.PaymentReference = XmlUtils.NodeAsString(doc.DocumentElement, "//ram:ApplicableHeaderTradeSettlement/ram:PaymentReference", nsmgr);

ZUGFeRD/InvoiceDescriptor20Writer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
629629
_Writer.WriteOptionalElementString("ram", "InvoiceIssuerReference", this._Descriptor.SellerReferenceNo, Profile.Extended);
630630

631631
// 6. InvoicerTradeParty (optional)
632-
_writeOptionalParty(_Writer, "ram", "InvoicerTradeParty", this._Descriptor.Invoicer);
632+
_writeOptionalParty(_Writer, "ram", "InvoicerTradeParty", this._Descriptor.Invoicer, this._Descriptor.InvoicerContact);
633633

634634
// 7. InvoiceeTradeParty (optional)
635635
if (_Descriptor.Profile == Profile.Extended)

0 commit comments

Comments
 (0)