From b3450d74386628a8a7dfca55b37e3e1bc9abaf9a Mon Sep 17 00:00:00 2001 From: Stephan Stapel Date: Sun, 18 Feb 2024 17:25:25 +0100 Subject: [PATCH] Optional writer refactoring --- ZUGFeRD/IInvoiceDescriptorWriter.cs | 11 +-- ZUGFeRD/InvoiceDescriptor1Writer.cs | 115 +++++---------------- ZUGFeRD/InvoiceDescriptor20Writer.cs | 143 +++++++-------------------- ZUGFeRD/InvoiceDescriptor21Writer.cs | 134 ++++++++----------------- ZUGFeRD/ProfileAwareXmlTextWriter.cs | 9 ++ 5 files changed, 113 insertions(+), 299 deletions(-) diff --git a/ZUGFeRD/IInvoiceDescriptorWriter.cs b/ZUGFeRD/IInvoiceDescriptorWriter.cs index 28b5a92d..5afbc666 100644 --- a/ZUGFeRD/IInvoiceDescriptorWriter.cs +++ b/ZUGFeRD/IInvoiceDescriptorWriter.cs @@ -41,16 +41,7 @@ public void Save(InvoiceDescriptor descriptor, string filename) } // !Save() - internal abstract bool Validate(InvoiceDescriptor descriptor, bool throwExceptions = true); - - - internal void _writeOptionalElementString(ProfileAwareXmlTextWriter writer, string tagName, string value, Profile profile = Profile.Unknown) - { - if (!String.IsNullOrWhiteSpace(value)) - { - writer.WriteElementString(tagName, value, profile); - } - } // !_writeOptionalElementString() + internal abstract bool Validate(InvoiceDescriptor descriptor, bool throwExceptions = true); protected string _formatDecimal(decimal value, int numDecimals = 2) diff --git a/ZUGFeRD/InvoiceDescriptor1Writer.cs b/ZUGFeRD/InvoiceDescriptor1Writer.cs index 39daac51..262776aa 100644 --- a/ZUGFeRD/InvoiceDescriptor1Writer.cs +++ b/ZUGFeRD/InvoiceDescriptor1Writer.cs @@ -208,10 +208,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) _writeOptionalParty(Writer, "ram:PayeeTradeParty", this.Descriptor.Payee); } - if (!String.IsNullOrWhiteSpace(this.Descriptor.PaymentReference)) - { - _writeOptionalElementString(Writer, "ram:PaymentReference", this.Descriptor.PaymentReference); - } + Writer.WriteOptionalElementString("ram:PaymentReference", this.Descriptor.PaymentReference); if (this.Descriptor.CreditorBankAccounts.Count == 0 && this.Descriptor.DebitorBankAccounts.Count == 0) { @@ -259,26 +256,15 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteElementString("ram:IBANID", account.IBAN); if (!String.IsNullOrWhiteSpace(account.Name)) { - Writer.WriteElementString("ram:AccountName", account.Name); - } - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); + Writer.WriteOptionalElementString("ram:AccountName", account.Name); } + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayeePartyCreditorFinancialAccount Writer.WriteStartElement("ram:PayeeSpecifiedCreditorFinancialInstitution"); Writer.WriteElementString("ram:BICID", account.BIC); - - if (!String.IsNullOrWhiteSpace(account.Bankleitzahl)) - { - Writer.WriteElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); - } - - if (!String.IsNullOrWhiteSpace(account.BankName)) - { - Writer.WriteElementString("ram:Name", account.BankName); - } + Writer.WriteOptionalElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); + Writer.WriteOptionalElementString("ram:Name", account.BankName); Writer.WriteEndElement(); // !PayeeSpecifiedCreditorFinancialInstitution Writer.WriteEndElement(); // !SpecifiedTradeSettlementPaymentMeans } @@ -303,24 +289,13 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteStartElement("ram:PayerPartyDebtorFinancialAccount"); Writer.WriteElementString("ram:IBANID", account.IBAN); - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); - } + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayerPartyDebtorFinancialAccount Writer.WriteStartElement("ram:PayerSpecifiedDebtorFinancialInstitution"); Writer.WriteElementString("ram:BICID", account.BIC); - - if (!String.IsNullOrWhiteSpace(account.Bankleitzahl)) - { - Writer.WriteElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); - } - - if (!String.IsNullOrWhiteSpace(account.BankName)) - { - Writer.WriteElementString("ram:Name", account.BankName); - } + Writer.WriteOptionalElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); + Writer.WriteOptionalElementString("ram:Name", account.BankName); Writer.WriteEndElement(); // !PayerSpecifiedDebtorFinancialInstitution Writer.WriteEndElement(); // !SpecifiedTradeSettlementPaymentMeans } @@ -348,7 +323,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended); + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended); if (tradeAllowanceCharge.Tax != null) { @@ -368,10 +343,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) foreach (ServiceCharge serviceCharge in this.Descriptor.ServiceCharges) { Writer.WriteStartElement("ram:SpecifiedLogisticsServiceCharge"); - if (!String.IsNullOrWhiteSpace(serviceCharge.Description)) - { - Writer.WriteElementString("ram:Description", serviceCharge.Description, Profile.Comfort | Profile.Extended); - } + Writer.WriteOptionalElementString("ram:Description", serviceCharge.Description, Profile.Comfort | Profile.Extended); Writer.WriteElementString("ram:AppliedAmount", _formatDecimal(serviceCharge.Amount), Profile.Comfort | Profile.Extended); if (serviceCharge.Tax != null) { @@ -389,7 +361,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.PaymentTerms != null) { Writer.WriteStartElement("ram:SpecifiedTradePaymentTerms"); - _writeOptionalElementString(Writer, "ram:Description", this.Descriptor.PaymentTerms.Description); + Writer.WriteOptionalElementString("ram:Description", this.Descriptor.PaymentTerms.Description); if (this.Descriptor.PaymentTerms.DueDate.HasValue) { Writer.WriteStartElement("ram:DueDateDateTime"); @@ -420,10 +392,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (tradeLineItem.AssociatedDocument != null) { Writer.WriteStartElement("ram:AssociatedDocumentLineDocument"); - if (!String.IsNullOrWhiteSpace(tradeLineItem.AssociatedDocument.LineID)) - { - Writer.WriteElementString("ram:LineID", tradeLineItem.AssociatedDocument.LineID); - } + Writer.WriteOptionalElementString("ram:LineID", tradeLineItem.AssociatedDocument.LineID); _writeNotes(Writer, tradeLineItem.AssociatedDocument.Notes); Writer.WriteEndElement(); // ram:AssociatedDocumentLineDocument } @@ -448,11 +417,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteValue(_formatDate(tradeLineItem.BuyerOrderReferencedDocument.IssueDateTime.Value, false)); Writer.WriteEndElement(); // !ram:IssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.BuyerOrderReferencedDocument.ID)) - { - Writer.WriteElementString("ram:ID", tradeLineItem.BuyerOrderReferencedDocument.ID); - } - + Writer.WriteOptionalElementString("ram:ID", tradeLineItem.BuyerOrderReferencedDocument.ID); Writer.WriteEndElement(); // !ram:BuyerOrderReferencedDocument } @@ -465,11 +430,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteValue(_formatDate(tradeLineItem.ContractReferencedDocument.IssueDateTime.Value, false)); Writer.WriteEndElement(); // !ram:IssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.ContractReferencedDocument.ID)) - { - Writer.WriteElementString("ram:ID", tradeLineItem.ContractReferencedDocument.ID); - } - + Writer.WriteOptionalElementString("ram:ID", tradeLineItem.ContractReferencedDocument.ID); Writer.WriteEndElement(); // !ram:ContractReferencedDocument } @@ -486,12 +447,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) } Writer.WriteElementString("ram:LineID", String.Format("{0}", tradeLineItem.AssociatedDocument?.LineID)); - - if (!String.IsNullOrWhiteSpace(document.ID)) - { - Writer.WriteElementString("ram:ID", document.ID); - } - + Writer.WriteOptionalElementString("ram:ID", document.ID); Writer.WriteElementString("ram:ReferenceTypeCode", document.ReferenceTypeCode.EnumToString()); Writer.WriteEndElement(); // !ram:AdditionalReferencedDocument @@ -522,7 +478,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.ActualAmount, 4)); Writer.WriteEndElement(); - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended); + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended); Writer.WriteEndElement(); // !AppliedTradeAllowanceCharge } @@ -555,11 +511,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteValue(_formatDate(tradeLineItem.DeliveryNoteReferencedDocument.IssueDateTime.Value, false)); Writer.WriteEndElement(); // !ram:IssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.DeliveryNoteReferencedDocument.ID)) - { - Writer.WriteElementString("ram:ID", tradeLineItem.DeliveryNoteReferencedDocument.ID); - } - + Writer.WriteOptionalElementString("ram:ID", tradeLineItem.DeliveryNoteReferencedDocument.ID); Writer.WriteEndElement(); // !ram:DeliveryNoteReferencedDocument } @@ -634,10 +586,10 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) _writeElementWithAttribute(Writer, "ram:GlobalID", "schemeID", tradeLineItem.GlobalID.SchemeID.EnumToString(), tradeLineItem.GlobalID.ID); } - _writeOptionalElementString(Writer, "ram:SellerAssignedID", tradeLineItem.SellerAssignedID); - _writeOptionalElementString(Writer, "ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID); - _writeOptionalElementString(Writer, "ram:Name", tradeLineItem.Name); - _writeOptionalElementString(Writer, "ram:Description", tradeLineItem.Description); + Writer.WriteOptionalElementString("ram:SellerAssignedID", tradeLineItem.SellerAssignedID); + Writer.WriteOptionalElementString("ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID); + Writer.WriteOptionalElementString("ram:Name", tradeLineItem.Name); + Writer.WriteOptionalElementString("ram:Description", tradeLineItem.Description); Writer.WriteEndElement(); // !ram:SpecifiedTradeProduct Writer.WriteEndElement(); // !ram:IncludedSupplyChainTradeLineItem @@ -783,21 +735,15 @@ private void _writeOptionalParty(ProfileAwareXmlTextWriter writer, string PartyT writer.WriteEndElement(); } - if (!String.IsNullOrWhiteSpace(Party.Name)) - { - writer.WriteElementString("ram:Name", Party.Name); - } - - if (Contact != null) - { - _writeOptionalContact(writer, "ram:DefinedTradeContact", Contact); - } - + Writer.WriteOptionalElementString("ram:Name", Party.Name); + _writeOptionalContact(writer, "ram:DefinedTradeContact", Contact); writer.WriteStartElement("ram:PostalTradeAddress"); writer.WriteElementString("ram:PostcodeCode", Party.Postcode); writer.WriteElementString("ram:LineOne", string.IsNullOrWhiteSpace(Party.ContactName) ? Party.Street : Party.ContactName); if (!string.IsNullOrWhiteSpace(Party.ContactName)) + { writer.WriteElementString("ram:LineTwo", Party.Street); + } writer.WriteElementString("ram:CityName", Party.City); writer.WriteElementString("ram:CountryID", Party.Country.EnumToString()); writer.WriteEndElement(); // !PostalTradeAddress @@ -828,15 +774,8 @@ private void _writeOptionalContact(ProfileAwareXmlTextWriter writer, string cont { writer.WriteStartElement(contactTag); - if (!String.IsNullOrWhiteSpace(contact.Name)) - { - writer.WriteElementString("ram:PersonName", contact.Name); - } - - if (!String.IsNullOrWhiteSpace(contact.OrgUnit)) - { - writer.WriteElementString("ram:DepartmentName", contact.OrgUnit); - } + writer.WriteOptionalElementString("ram:PersonName", contact.Name); + writer.WriteOptionalElementString("ram:DepartmentName", contact.OrgUnit); if (!String.IsNullOrWhiteSpace(contact.PhoneNo)) { diff --git a/ZUGFeRD/InvoiceDescriptor20Writer.cs b/ZUGFeRD/InvoiceDescriptor20Writer.cs index 2476490b..38063f91 100644 --- a/ZUGFeRD/InvoiceDescriptor20Writer.cs +++ b/ZUGFeRD/InvoiceDescriptor20Writer.cs @@ -119,10 +119,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (tradeLineItem.AssociatedDocument != null) { Writer.WriteStartElement("ram:AssociatedDocumentLineDocument"); - if (!String.IsNullOrWhiteSpace(tradeLineItem.AssociatedDocument.LineID)) - { - Writer.WriteElementString("ram:LineID", tradeLineItem.AssociatedDocument.LineID); - } + Writer.WriteOptionalElementString("ram:LineID", tradeLineItem.AssociatedDocument.LineID); _writeNotes(Writer, tradeLineItem.AssociatedDocument.Notes); Writer.WriteEndElement(); // ram:AssociatedDocumentLineDocument } @@ -140,18 +137,18 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) _writeElementWithAttribute(Writer, "ram:GlobalID", "schemeID", tradeLineItem.GlobalID.SchemeID.EnumToString(), tradeLineItem.GlobalID.ID); } - _writeOptionalElementString(Writer, "ram:SellerAssignedID", tradeLineItem.SellerAssignedID); - _writeOptionalElementString(Writer, "ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID); - _writeOptionalElementString(Writer, "ram:Name", tradeLineItem.Name); - _writeOptionalElementString(Writer, "ram:Description", tradeLineItem.Description); + Writer.WriteOptionalElementString("ram:SellerAssignedID", tradeLineItem.SellerAssignedID); + Writer.WriteOptionalElementString("ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID); + Writer.WriteOptionalElementString("ram:Name", tradeLineItem.Name); + Writer.WriteOptionalElementString("ram:Description", tradeLineItem.Description); if (tradeLineItem.ApplicableProductCharacteristics != null && tradeLineItem.ApplicableProductCharacteristics.Any()) { foreach (var productCharacteristic in tradeLineItem.ApplicableProductCharacteristics) { Writer.WriteStartElement("ram:ApplicableProductCharacteristic"); - _writeOptionalElementString(Writer, "ram:Description", productCharacteristic.Description); - _writeOptionalElementString(Writer, "ram:Value", productCharacteristic.Value); + Writer.WriteOptionalElementString("ram:Description", productCharacteristic.Description); + Writer.WriteOptionalElementString("ram:Value", productCharacteristic.Value); Writer.WriteEndElement(); // !ram:ApplicableProductCharacteristic } } @@ -166,10 +163,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) #region IssuerAssignedID //Bestellnummer - if (!String.IsNullOrWhiteSpace(tradeLineItem.BuyerOrderReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.BuyerOrderReferencedDocument.ID); - } + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.BuyerOrderReferencedDocument.ID); #endregion #region LineID @@ -204,10 +198,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); // !udt:DateTimeString Writer.WriteEndElement(); // !ram:IssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.ContractReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.ContractReferencedDocument.ID); - } + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.ContractReferencedDocument.ID); Writer.WriteEndElement(); // !ram:ContractReferencedDocument(Extended) } @@ -227,12 +218,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) } Writer.WriteElementString("ram:LineID", String.Format("{0}", tradeLineItem.AssociatedDocument?.LineID)); - - if (!String.IsNullOrWhiteSpace(document.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", document.ID); - } - + Writer.WriteOptionalElementString("ram:IssuerAssignedID", document.ID); Writer.WriteElementString("ram:ReferenceTypeCode", document.ReferenceTypeCode.EnumToString()); Writer.WriteEndElement(); // !ram:AdditionalReferencedDocument @@ -261,7 +247,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.ActualAmount, 4)); Writer.WriteEndElement(); - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason); + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason); Writer.WriteEndElement(); // !AppliedTradeAllowanceCharge } @@ -302,11 +288,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); // !ram:FormattedIssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.DeliveryNoteReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID); - } - + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID); Writer.WriteEndElement(); // !ram:DeliveryNoteReferencedDocument } @@ -380,11 +362,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) } // !foreach(tradeLineItem) Writer.WriteStartElement("ram:ApplicableHeaderTradeAgreement"); - if (!String.IsNullOrWhiteSpace(this.Descriptor.ReferenceOrderNo)) - { - Writer.WriteElementString("ram:BuyerReference", this.Descriptor.ReferenceOrderNo); - } - + Writer.WriteOptionalElementString("ram:BuyerReference", this.Descriptor.ReferenceOrderNo); _writeOptionalParty(Writer, "ram:SellerTradeParty", this.Descriptor.Seller, this.Descriptor.SellerContact, TaxRegistrations: this.Descriptor.SellerTaxRegistration); _writeOptionalParty(Writer, "ram:BuyerTradeParty", this.Descriptor.Buyer, this.Descriptor.BuyerContact, TaxRegistrations: this.Descriptor.BuyerTaxRegistration); @@ -514,14 +492,11 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) // 1. CreditorReferenceID (optional) if (!String.IsNullOrWhiteSpace(this.Descriptor.PaymentMeans?.SEPACreditorIdentifier)) { - _writeOptionalElementString(Writer, "ram:CreditorReferenceID", Descriptor.PaymentMeans?.SEPACreditorIdentifier, Profile.BasicWL | Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung | Profile.XRechnung1); + Writer.WriteOptionalElementString("ram:CreditorReferenceID", Descriptor.PaymentMeans?.SEPACreditorIdentifier, Profile.BasicWL | Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung | Profile.XRechnung1); } // 2. PaymentReference (optional) - if (!String.IsNullOrWhiteSpace(this.Descriptor.PaymentReference)) - { - _writeOptionalElementString(Writer, "ram:PaymentReference", this.Descriptor.PaymentReference); - } + Writer.WriteOptionalElementString("ram:PaymentReference", this.Descriptor.PaymentReference); // 4. InvoiceCurrencyCode (optional) Writer.WriteElementString("ram:InvoiceCurrencyCode", this.Descriptor.Currency.EnumToString()); @@ -583,24 +558,13 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteStartElement("ram:PayeePartyCreditorFinancialAccount"); Writer.WriteElementString("ram:IBANID", account.IBAN); - if (!String.IsNullOrWhiteSpace(account.Name)) - { - Writer.WriteElementString("ram:AccountName", account.Name); - } - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); - } + Writer.WriteOptionalElementString("ram:AccountName", account.Name); + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayeePartyCreditorFinancialAccount Writer.WriteStartElement("ram:PayeeSpecifiedCreditorFinancialInstitution"); Writer.WriteElementString("ram:BICID", account.BIC); - - if (!String.IsNullOrWhiteSpace(account.Bankleitzahl)) - { - Writer.WriteElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); - } - + Writer.WriteOptionalElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); Writer.WriteEndElement(); // !PayeeSpecifiedCreditorFinancialInstitution Writer.WriteEndElement(); // !SpecifiedTradeSettlementPaymentMeans } @@ -617,10 +581,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteStartElement("ram:PayerPartyDebtorFinancialAccount"); Writer.WriteElementString("ram:IBANID", account.IBAN); - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); - } + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayerPartyDebtorFinancialAccount if (!string.IsNullOrWhiteSpace(account.BIC) || @@ -628,22 +589,10 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) !string.IsNullOrWhiteSpace(account.BankName)) { Writer.WriteStartElement("ram:PayerSpecifiedDebtorFinancialInstitution"); - - if (!String.IsNullOrWhiteSpace(account.BIC)) - { - Writer.WriteElementString("ram:BICID", account.BIC); - } - - if (!String.IsNullOrWhiteSpace(account.Bankleitzahl)) - { - Writer.WriteElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); - } - - if (!String.IsNullOrWhiteSpace(account.BankName)) - { - Writer.WriteElementString("ram:Name", account.BankName); - } + Writer.WriteOptionalElementString("ram:BICID", account.BIC); + Writer.WriteOptionalElementString("ram:GermanBankleitzahlID", account.Bankleitzahl); + Writer.WriteOptionalElementString("ram:Name", account.BankName); Writer.WriteEndElement(); // !PayerSpecifiedDebtorFinancialInstitution } @@ -713,7 +662,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason); + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason); if (tradeAllowanceCharge.Tax != null) { @@ -756,14 +705,14 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.PaymentTerms != null || !string.IsNullOrWhiteSpace(Descriptor.PaymentMeans?.SEPAMandateReference)) { Writer.WriteStartElement("ram:SpecifiedTradePaymentTerms"); - _writeOptionalElementString(Writer, "ram:Description", this.Descriptor.PaymentTerms?.Description); + Writer.WriteOptionalElementString("ram:Description", this.Descriptor.PaymentTerms?.Description); if (this.Descriptor.PaymentTerms?.DueDate.HasValue ?? false) { Writer.WriteStartElement("ram:DueDateDateTime"); _writeElementWithAttribute(Writer, "udt:DateTimeString", "format", "102", _formatDate(this.Descriptor.PaymentTerms.DueDate.Value)); Writer.WriteEndElement(); // !ram:DueDateDateTime } - _writeOptionalElementString(Writer, "ram:DirectDebitMandateID", Descriptor.PaymentMeans?.SEPAMandateReference); + Writer.WriteOptionalElementString("ram:DirectDebitMandateID", Descriptor.PaymentMeans?.SEPAMandateReference); Writer.WriteEndElement(); } @@ -790,7 +739,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.InvoiceReferencedDocument != null) { Writer.WriteStartElement("ram:InvoiceReferencedDocument"); - _writeOptionalElementString(Writer, "ram:IssuerAssignedID", this.Descriptor.InvoiceReferencedDocument.ID); + Writer.WriteOptionalElementString("ram:IssuerAssignedID", this.Descriptor.InvoiceReferencedDocument.ID); if (this.Descriptor.InvoiceReferencedDocument.IssueDateTime.HasValue) { Writer.WriteStartElement("ram:FormattedIssueDateTime"); @@ -850,12 +799,7 @@ private void _writeOptionalTaxes(ProfileAwareXmlTextWriter writer) writer.WriteEndElement(); // !CalculatedAmount writer.WriteElementString("ram:TypeCode", tax.TypeCode.EnumToString()); - - if (!String.IsNullOrWhiteSpace(tax.ExemptionReason)) - { - writer.WriteElementString("ram:ExemptionReason", tax.ExemptionReason); - } - + Writer.WriteOptionalElementString("ram:ExemptionReason", tax.ExemptionReason); writer.WriteStartElement("ram:BasisAmount"); writer.WriteValue(_formatDecimal(tax.BasisAmount)); writer.WriteEndElement(); // !BasisAmount @@ -930,28 +874,22 @@ private void _writeOptionalParty(ProfileAwareXmlTextWriter writer, string PartyT writer.WriteValue(Party.GlobalID.ID); writer.WriteEndElement(); } - - if (!String.IsNullOrWhiteSpace(Party.Name)) - { - writer.WriteElementString("ram:Name", Party.Name); - } - - if (Contact != null) - { - _writeOptionalContact(writer, "ram:DefinedTradeContact", Contact); - } + Writer.WriteOptionalElementString("ram:Name", Party.Name); + _writeOptionalContact(writer, "ram:DefinedTradeContact", Contact); writer.WriteStartElement("ram:PostalTradeAddress"); writer.WriteElementString("ram:PostcodeCode", Party.Postcode); writer.WriteElementString("ram:LineOne", string.IsNullOrWhiteSpace(Party.ContactName) ? Party.Street : Party.ContactName); if (!string.IsNullOrWhiteSpace(Party.ContactName)) + { writer.WriteElementString("ram:LineTwo", Party.Street); - if (!string.IsNullOrWhiteSpace(Party.AddressLine3)) - writer.WriteElementString("ram:LineThree", Party.AddressLine3); // BT-163 + } + + writer.WriteOptionalElementString("ram:LineThree", Party.AddressLine3); // BT-163 + writer.WriteElementString("ram:CityName", Party.City); writer.WriteElementString("ram:CountryID", Party.Country.EnumToString()); - if (!string.IsNullOrWhiteSpace(Party.CountrySubdivisionName)) - writer.WriteElementString("ram:CountrySubDivisionName", Party.CountrySubdivisionName); // BT-79 + writer.WriteOptionalElementString("ram:CountrySubDivisionName", Party.CountrySubdivisionName); // BT-79 writer.WriteEndElement(); // !PostalTradeAddress if (TaxRegistrations != null) @@ -980,15 +918,8 @@ private void _writeOptionalContact(ProfileAwareXmlTextWriter writer, string cont { writer.WriteStartElement(contactTag); - if (!String.IsNullOrWhiteSpace(contact.Name)) - { - writer.WriteElementString("ram:PersonName", contact.Name); - } - - if (!String.IsNullOrWhiteSpace(contact.OrgUnit)) - { - writer.WriteElementString("ram:DepartmentName", contact.OrgUnit); - } + writer.WriteOptionalElementString("ram:PersonName", contact.Name); + writer.WriteOptionalElementString("ram:DepartmentName", contact.OrgUnit); if (!String.IsNullOrWhiteSpace(contact.PhoneNo)) { diff --git a/ZUGFeRD/InvoiceDescriptor21Writer.cs b/ZUGFeRD/InvoiceDescriptor21Writer.cs index 97429642..640bdfe3 100644 --- a/ZUGFeRD/InvoiceDescriptor21Writer.cs +++ b/ZUGFeRD/InvoiceDescriptor21Writer.cs @@ -150,22 +150,22 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) _writeElementWithAttribute(Writer, "ram:GlobalID", "schemeID", tradeLineItem.GlobalID.SchemeID.EnumToString(), tradeLineItem.GlobalID.ID, Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); } - _writeOptionalElementString(Writer, "ram:SellerAssignedID", tradeLineItem.SellerAssignedID, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); - _writeOptionalElementString(Writer, "ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); + Writer.WriteOptionalElementString("ram:SellerAssignedID", tradeLineItem.SellerAssignedID, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); + Writer.WriteOptionalElementString("ram:BuyerAssignedID", tradeLineItem.BuyerAssignedID, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); // BT-153 - _writeOptionalElementString(Writer, "ram:Name", tradeLineItem.Name, Profile.Basic | Profile.Comfort | Profile.Extended); - _writeOptionalElementString(Writer, "ram:Name", isCommentItem ? "TEXT" : tradeLineItem.Name, Profile.XRechnung1 | Profile.XRechnung); // XRechnung erfordert einen Item-Namen (BR-25) + Writer.WriteOptionalElementString("ram:Name", tradeLineItem.Name, Profile.Basic | Profile.Comfort | Profile.Extended); + Writer.WriteOptionalElementString("ram:Name", isCommentItem ? "TEXT" : tradeLineItem.Name, Profile.XRechnung1 | Profile.XRechnung); // XRechnung erfordert einen Item-Namen (BR-25) - _writeOptionalElementString(Writer, "ram:Description", tradeLineItem.Description, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); + Writer.WriteOptionalElementString("ram:Description", tradeLineItem.Description, Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); if (tradeLineItem.ApplicableProductCharacteristics != null && tradeLineItem.ApplicableProductCharacteristics.Any()) { foreach (var productCharacteristic in tradeLineItem.ApplicableProductCharacteristics) { Writer.WriteStartElement("ram:ApplicableProductCharacteristic"); - _writeOptionalElementString(Writer, "ram:Description", productCharacteristic.Description); - _writeOptionalElementString(Writer, "ram:Value", productCharacteristic.Value); + Writer.WriteOptionalElementString("ram:Description", productCharacteristic.Description); + Writer.WriteOptionalElementString("ram:Value", productCharacteristic.Value); Writer.WriteEndElement(); // !ram:ApplicableProductCharacteristic } } @@ -188,10 +188,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) #region IssuerAssignedID //Bestellnummer - if (!String.IsNullOrWhiteSpace(tradeLineItem.BuyerOrderReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.BuyerOrderReferencedDocument.ID); - } + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.BuyerOrderReferencedDocument.ID); #endregion #region LineID @@ -229,11 +226,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); // !udt:DateTimeString Writer.WriteEndElement(); // !ram:IssueDateTime } - if (!String.IsNullOrWhiteSpace(tradeLineItem.ContractReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.ContractReferencedDocument.ID); - } - + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.ContractReferencedDocument.ID); Writer.WriteEndElement(); // !ram:ContractReferencedDocument(Extended) } #endregion @@ -257,12 +250,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) } Writer.WriteElementString("ram:LineID", String.Format("{0}", tradeLineItem.AssociatedDocument?.LineID)); - - if (!String.IsNullOrWhiteSpace(document.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", document.ID); - } - + Writer.WriteOptionalElementString("ram:IssuerAssignedID", document.ID); Writer.WriteElementString("ram:ReferenceTypeCode", document.ReferenceTypeCode.EnumToString()); Writer.WriteEndElement(); // !ram:AdditionalReferencedDocument @@ -303,7 +291,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); #endregion - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason, Profile.Extended); // not in XRechnung according to CII-SR-128 + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason, Profile.Extended); // not in XRechnung according to CII-SR-128 Writer.WriteEndElement(); // !AppliedTradeAllowanceCharge } @@ -338,10 +326,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (tradeLineItem.DeliveryNoteReferencedDocument != null) { Writer.WriteStartElement("ram:DeliveryNoteReferencedDocument", ALL_PROFILES ^ (Profile.XRechnung1 | Profile.XRechnung)); - if (!String.IsNullOrWhiteSpace(tradeLineItem.DeliveryNoteReferencedDocument.ID)) - { - Writer.WriteElementString("ram:IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID); - } + Writer.WriteOptionalElementString("ram:IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID); if (tradeLineItem.DeliveryNoteReferencedDocument.IssueDateTime.HasValue) { @@ -376,10 +361,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) #region ApplicableTradeTax Writer.WriteStartElement("ram:ApplicableTradeTax", Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); Writer.WriteElementString("ram:TypeCode", tradeLineItem.TaxType.EnumToString()); - if (!String.IsNullOrWhiteSpace(_translateTaxCategoryCode(tradeLineItem.TaxCategoryCode))) - { - Writer.WriteElementString("ram:ExemptionReason", _translateTaxCategoryCode(tradeLineItem.TaxCategoryCode), Profile.Extended); - } + Writer.WriteOptionalElementString("ram:ExemptionReason", _translateTaxCategoryCode(tradeLineItem.TaxCategoryCode), Profile.Extended); Writer.WriteElementString("ram:CategoryCode", tradeLineItem.TaxCategoryCode.EnumToString()); // BT-151 @@ -494,10 +476,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteStartElement("ram:ApplicableHeaderTradeAgreement"); // BT-10 - if (!String.IsNullOrWhiteSpace(this.Descriptor.ReferenceOrderNo)) - { - Writer.WriteElementString("ram:BuyerReference", this.Descriptor.ReferenceOrderNo); - } + Writer.WriteOptionalElementString("ram:BuyerReference", this.Descriptor.ReferenceOrderNo); #region SellerTradeParty // BT-31: this.Descriptor.SellerTaxRegistration @@ -585,10 +564,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteElementString("ram:ReferenceTypeCode", document.ReferenceTypeCode.EnumToString()); } - if (!String.IsNullOrWhiteSpace(document.Name)) - { - Writer.WriteElementString("ram:Name", document.Name); - } + Writer.WriteOptionalElementString("ram:Name", document.Name); if (document.AttachmentBinaryObject != null) { @@ -697,14 +673,11 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) // 1. CreditorReferenceID (optional) if (!String.IsNullOrWhiteSpace(this.Descriptor.PaymentMeans?.SEPACreditorIdentifier)) { - _writeOptionalElementString(Writer, "ram:CreditorReferenceID", Descriptor.PaymentMeans?.SEPACreditorIdentifier, Profile.BasicWL | Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung | Profile.XRechnung1); + Writer.WriteOptionalElementString("ram:CreditorReferenceID", Descriptor.PaymentMeans?.SEPACreditorIdentifier, Profile.BasicWL | Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung | Profile.XRechnung1); } // 2. PaymentReference (optional) - if (!String.IsNullOrWhiteSpace(this.Descriptor.PaymentReference)) - { - _writeOptionalElementString(Writer, "ram:PaymentReference", this.Descriptor.PaymentReference); - } + Writer.WriteOptionalElementString("ram:PaymentReference", this.Descriptor.PaymentReference); // 4. InvoiceCurrencyCode (optional) Writer.WriteElementString("ram:InvoiceCurrencyCode", this.Descriptor.Currency.EnumToString()); @@ -732,8 +705,8 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.PaymentMeans.FinancialCard != null) { Writer.WriteStartElement("ram:ApplicableTradeSettlementFinancialCard", Profile.Comfort | Profile.Extended); - _writeOptionalElementString(Writer, "ram:ID", Descriptor.PaymentMeans.FinancialCard.Id); - _writeOptionalElementString(Writer, "ram:CardholderName", Descriptor.PaymentMeans.FinancialCard.CardholderName); + Writer.WriteOptionalElementString("ram:ID", Descriptor.PaymentMeans.FinancialCard.Id); + Writer.WriteOptionalElementString("ram:CardholderName", Descriptor.PaymentMeans.FinancialCard.CardholderName); Writer.WriteEndElement(); // !ram:ApplicableTradeSettlementFinancialCard } Writer.WriteEndElement(); // !SpecifiedTradeSettlementPaymentMeans @@ -754,22 +727,16 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.PaymentMeans.FinancialCard != null) { Writer.WriteStartElement("ram:ApplicableTradeSettlementFinancialCard", Profile.Comfort | Profile.Extended); - _writeOptionalElementString(Writer, "ram:ID", Descriptor.PaymentMeans.FinancialCard.Id); - _writeOptionalElementString(Writer, "ram:CardholderName", Descriptor.PaymentMeans.FinancialCard.CardholderName); + Writer.WriteOptionalElementString("ram:ID", Descriptor.PaymentMeans.FinancialCard.Id); + Writer.WriteOptionalElementString("ram:CardholderName", Descriptor.PaymentMeans.FinancialCard.CardholderName); Writer.WriteEndElement(); // !ram:ApplicableTradeSettlementFinancialCard } } Writer.WriteStartElement("ram:PayeePartyCreditorFinancialAccount"); Writer.WriteElementString("ram:IBANID", account.IBAN); - if (!String.IsNullOrWhiteSpace(account.Name)) - { - Writer.WriteElementString("ram:AccountName", account.Name); - } - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); - } + Writer.WriteOptionalElementString("ram:AccountName", account.Name); + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayeePartyCreditorFinancialAccount if (!String.IsNullOrWhiteSpace(account.BIC)) @@ -794,14 +761,8 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteStartElement("ram:PayerPartyDebtorFinancialAccount"); Writer.WriteElementString("ram:IBANID", account.IBAN); - if (!String.IsNullOrWhiteSpace(account.Name)) - { - Writer.WriteElementString("ram:AccountName", account.Name); - } - if (!String.IsNullOrWhiteSpace(account.ID)) - { - Writer.WriteElementString("ram:ProprietaryID", account.ID); - } + Writer.WriteOptionalElementString("ram:AccountName", account.Name); + Writer.WriteOptionalElementString("ram:ProprietaryID", account.ID); Writer.WriteEndElement(); // !PayerPartyDebtorFinancialAccount if (!String.IsNullOrWhiteSpace(account.BIC)) @@ -862,7 +823,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) Writer.WriteEndElement(); - _writeOptionalElementString(Writer, "ram:Reason", tradeAllowanceCharge.Reason); + Writer.WriteOptionalElementString("ram:Reason", tradeAllowanceCharge.Reason); if (tradeAllowanceCharge.Tax != null) { @@ -883,10 +844,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) foreach (ServiceCharge serviceCharge in this.Descriptor.ServiceCharges) { Writer.WriteStartElement("ram:SpecifiedLogisticsServiceCharge", ALL_PROFILES ^ (Profile.XRechnung1 | Profile.XRechnung)); - if (!String.IsNullOrWhiteSpace(serviceCharge.Description)) - { - Writer.WriteElementString("ram:Description", serviceCharge.Description); - } + Writer.WriteOptionalElementString("ram:Description", serviceCharge.Description); Writer.WriteElementString("ram:AppliedAmount", _formatDecimal(serviceCharge.Amount)); if (serviceCharge.Tax != null) { @@ -905,14 +863,14 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.PaymentTerms != null || !string.IsNullOrWhiteSpace(Descriptor.PaymentMeans?.SEPAMandateReference)) { Writer.WriteStartElement("ram:SpecifiedTradePaymentTerms"); - _writeOptionalElementString(Writer, "ram:Description", this.Descriptor.PaymentTerms?.Description); + Writer.WriteOptionalElementString("ram:Description", this.Descriptor.PaymentTerms?.Description); if (this.Descriptor.PaymentTerms?.DueDate.HasValue ?? false) { Writer.WriteStartElement("ram:DueDateDateTime"); _writeElementWithAttribute(Writer, "udt:DateTimeString", "format", "102", _formatDate(this.Descriptor.PaymentTerms.DueDate.Value)); Writer.WriteEndElement(); // !ram:DueDateDateTime } - _writeOptionalElementString(Writer, "ram:DirectDebitMandateID", Descriptor.PaymentMeans?.SEPAMandateReference); + Writer.WriteOptionalElementString("ram:DirectDebitMandateID", Descriptor.PaymentMeans?.SEPAMandateReference); Writer.WriteEndElement(); } @@ -945,7 +903,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream) if (this.Descriptor.InvoiceReferencedDocument != null) { Writer.WriteStartElement("ram:InvoiceReferencedDocument"); - _writeOptionalElementString(Writer, "ram:IssuerAssignedID", this.Descriptor.InvoiceReferencedDocument.ID); + Writer.WriteOptionalElementString("ram:IssuerAssignedID", this.Descriptor.InvoiceReferencedDocument.ID); if (this.Descriptor.InvoiceReferencedDocument.IssueDateTime.HasValue) { Writer.WriteStartElement("ram:FormattedIssueDateTime"); @@ -1107,12 +1065,7 @@ private void _writeOptionalTaxes(ProfileAwareXmlTextWriter writer) writer.WriteEndElement(); // !CalculatedAmount writer.WriteElementString("ram:TypeCode", tax.TypeCode.EnumToString()); - - if (!String.IsNullOrWhiteSpace(tax.ExemptionReason)) - { - writer.WriteElementString("ram:ExemptionReason", tax.ExemptionReason); - } - + writer.WriteOptionalElementString("ram:ExemptionReason", tax.ExemptionReason); writer.WriteStartElement("ram:BasisAmount"); writer.WriteValue(_formatDecimal(tax.BasisAmount)); writer.WriteEndElement(); // !BasisAmount @@ -1360,10 +1313,7 @@ private void _writeOptionalParty(ProfileAwareXmlTextWriter writer, PartyTypes pa writer.WriteEndElement(); } - if (!String.IsNullOrWhiteSpace(party.Name)) - { - writer.WriteElementString("ram:Name", party.Name); - } + writer.WriteOptionalElementString("ram:Name", party.Name); _writeOptionalLegalOrganization(writer, "ram:SpecifiedLegalOrganization", party.SpecifiedLegalOrganization, partyType); _writeOptionalContact(writer, "ram:DefinedTradeContact", contact, Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); @@ -1372,13 +1322,14 @@ private void _writeOptionalParty(ProfileAwareXmlTextWriter writer, PartyTypes pa writer.WriteElementString("ram:PostcodeCode", party.Postcode); // BT-53 writer.WriteElementString("ram:LineOne", string.IsNullOrWhiteSpace(party.ContactName) ? party.Street : party.ContactName); // BT-50 if (!string.IsNullOrWhiteSpace(party.ContactName)) + { writer.WriteElementString("ram:LineTwo", party.Street); // BT-51 - if (!string.IsNullOrWhiteSpace(party.AddressLine3)) - writer.WriteElementString("ram:LineThree", party.AddressLine3); // BT-163 + } + + writer.WriteOptionalElementString("ram:LineThree", party.AddressLine3); // BT-163 writer.WriteElementString("ram:CityName", party.City); // BT-52 writer.WriteElementString("ram:CountryID", party.Country.EnumToString()); // BT-55 - if (!string.IsNullOrWhiteSpace(party.CountrySubdivisionName)) - writer.WriteElementString("ram:CountrySubDivisionName", party.CountrySubdivisionName); // BT-79 + writer.WriteOptionalElementString("ram:CountrySubDivisionName", party.CountrySubdivisionName); // BT-79 writer.WriteEndElement(); // !PostalTradeAddress if (ElectronicAddress != null) @@ -1426,15 +1377,8 @@ private void _writeOptionalContact(ProfileAwareXmlTextWriter writer, string cont writer.WriteStartElement(contactTag, profile); - if (!String.IsNullOrWhiteSpace(contact.Name)) - { - writer.WriteElementString("ram:PersonName", contact.Name); - } - - if (!String.IsNullOrWhiteSpace(contact.OrgUnit)) - { - writer.WriteElementString("ram:DepartmentName", contact.OrgUnit); - } + writer.WriteOptionalElementString("ram:PersonName", contact.Name); + writer.WriteOptionalElementString("ram:DepartmentName", contact.OrgUnit); if (!String.IsNullOrWhiteSpace(contact.PhoneNo)) { diff --git a/ZUGFeRD/ProfileAwareXmlTextWriter.cs b/ZUGFeRD/ProfileAwareXmlTextWriter.cs index 3bfba537..006ca7d1 100644 --- a/ZUGFeRD/ProfileAwareXmlTextWriter.cs +++ b/ZUGFeRD/ProfileAwareXmlTextWriter.cs @@ -121,6 +121,15 @@ public void WriteEndElement() } + public void WriteOptionalElementString(string tagName, string value, Profile profile = Profile.Unknown) + { + if (!String.IsNullOrWhiteSpace(value)) + { + WriteElementString(tagName, value, profile); + } + } // !WriteOptionalElementString() + + public void WriteElementString(string prefix, string localName, string ns, string value, Profile profile = Profile.Unknown) { Profile _profile = profile;