From 2186ec1c61c7e01feecfb7d7c4149d9c9b9155c4 Mon Sep 17 00:00:00 2001 From: Dirksche Date: Tue, 9 Sep 2025 23:07:31 +0300 Subject: [PATCH] Fixes issue #800. When writing in UBL format and `lineTotalAmount` was omitted in `AddTradeLineItem `, it caused a validation error, because `LineExtensionAmount` was missing. We now calculate it in the same way as for the CII format. (cherry picked from commit be880674e881c6c45d14f649cff64e0b6360cc7b) --- ZUGFeRD/InvoiceDescriptor22UBLWriter.cs | 18 +++++++++++++++++- ZUGFeRD/InvoiceDescriptor23CIIWriter.cs | 10 +++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ZUGFeRD/InvoiceDescriptor22UBLWriter.cs b/ZUGFeRD/InvoiceDescriptor22UBLWriter.cs index 2aa67d03..b5c64d1c 100644 --- a/ZUGFeRD/InvoiceDescriptor22UBLWriter.cs +++ b/ZUGFeRD/InvoiceDescriptor22UBLWriter.cs @@ -648,7 +648,23 @@ private void _WriteTradeLineItem(TradeLineItem tradeLineItem, bool isInvoice = t _Writer.WriteEndElement(); // !InvoicedQuantity || CreditedQuantity _WriteComment(_Writer, options, InvoiceCommentConstants.SpecifiedTradeSettlementLineMonetarySummationComment); - _writeOptionalAmount(_Writer, "cbc", "LineExtensionAmount", tradeLineItem.LineTotalAmount, forceCurrency: true); + decimal lineTotalAmount = 0m; + if (tradeLineItem.LineTotalAmount.HasValue) + { + lineTotalAmount = tradeLineItem.LineTotalAmount.Value; + } + else + { + lineTotalAmount = tradeLineItem.NetUnitPrice * tradeLineItem.BilledQuantity; + if (tradeLineItem.NetQuantity.HasValue && (tradeLineItem.NetQuantity.Value != 0)) + { + lineTotalAmount /= tradeLineItem.NetQuantity.Value; + } + } + _Writer.WriteStartElement("cbc", "LineExtensionAmount"); + _Writer.WriteAttributeString("currencyID", this._Descriptor.Currency.EnumToString()); + _Writer.WriteValue(_formatDecimal(lineTotalAmount)); + _Writer.WriteEndElement(); // cbc:LineExtensionAmount if (tradeLineItem.AdditionalReferencedDocuments.Count > 0) { diff --git a/ZUGFeRD/InvoiceDescriptor23CIIWriter.cs b/ZUGFeRD/InvoiceDescriptor23CIIWriter.cs index 72d367e8..fc24c361 100644 --- a/ZUGFeRD/InvoiceDescriptor23CIIWriter.cs +++ b/ZUGFeRD/InvoiceDescriptor23CIIWriter.cs @@ -522,22 +522,22 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo //Detailinformationen zu Positionssummen _WriteComment(_Writer, options, InvoiceCommentConstants.SpecifiedTradeSettlementLineMonetarySummationComment); _Writer.WriteStartElement("ram", "SpecifiedTradeSettlementLineMonetarySummation"); - decimal total = 0m; + decimal lineTotalAmount = 0m; if (tradeLineItem.LineTotalAmount.HasValue) { - total = tradeLineItem.LineTotalAmount.Value; + lineTotalAmount = tradeLineItem.LineTotalAmount.Value; } else { - total = tradeLineItem.NetUnitPrice * tradeLineItem.BilledQuantity; + lineTotalAmount = tradeLineItem.NetUnitPrice * tradeLineItem.BilledQuantity; if (tradeLineItem.NetQuantity.HasValue && (tradeLineItem.NetQuantity.Value != 0)) { - total /= tradeLineItem.NetQuantity.Value; + lineTotalAmount /= tradeLineItem.NetQuantity.Value; } } _Writer.WriteStartElement("ram", "LineTotalAmount", Profile.Basic | Profile.Comfort | Profile.Extended | Profile.XRechnung1 | Profile.XRechnung); - _Writer.WriteValue(_formatDecimal(total)); + _Writer.WriteValue(_formatDecimal(lineTotalAmount)); _Writer.WriteEndElement(); // !ram:LineTotalAmount // TODO: TotalAllowanceChargeAmount