Skip to content

Commit 43bc89f

Browse files
Merge pull request #703 from Dirksche/AvoidEmpty_GrossPriceProductTradePrice_WithVersion20_166
With `ZUGFeRDVersion.Version20`, there's no empty `<ram:GrossPriceProductTradePrice/>` section anymore
2 parents a1ad3e4 + d1aaedd commit 43bc89f

File tree

1 file changed

+44
-27
lines changed

1 file changed

+44
-27
lines changed

ZUGFeRD/InvoiceDescriptor20Writer.cs

+44-27
Original file line numberDiff line numberDiff line change
@@ -264,40 +264,57 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
264264
}
265265

266266
Writer.WriteEndElement(); // !ram:AdditionalReferencedDocument
267-
} // !foreach(document)
268-
269-
Writer.WriteStartElement("ram", "GrossPriceProductTradePrice");
270-
_writeOptionalAdaptiveAmount(Writer, "ram", "ChargeAmount", tradeLineItem.GrossUnitPrice, 2, 4);
271-
if (tradeLineItem.UnitQuantity.HasValue)
272-
{
273-
_writeElementWithAttribute(Writer, "ram", "BasisQuantity", "unitCode", tradeLineItem.UnitCode.EnumToString(), _formatDecimal(tradeLineItem.UnitQuantity.Value, 4));
274-
}
267+
} // !foreach(document)
268+
269+
bool needToWriteGrossUnitPrice = false;
270+
271+
// the PEPPOL business rule for XRechnung is very specific
272+
// PEPPOL-EN16931-R046
273+
if ((descriptor.Profile == Profile.XRechnung) && tradeLineItem.GrossUnitPrice.HasValue && (tradeLineItem.GetTradeAllowanceCharges().Count > 0))
274+
{
275+
needToWriteGrossUnitPrice = true;
276+
}
277+
else if ((descriptor.Profile != Profile.XRechnung) && ((tradeLineItem.GrossUnitPrice.HasValue || (tradeLineItem.GetTradeAllowanceCharges().Count > 0))))
278+
{
279+
needToWriteGrossUnitPrice = true;
280+
}
281+
282+
283+
if (needToWriteGrossUnitPrice)
284+
{
285+
Writer.WriteStartElement("ram", "GrossPriceProductTradePrice");
286+
_writeOptionalAdaptiveAmount(Writer, "ram", "ChargeAmount", tradeLineItem.GrossUnitPrice, 2, 4);
287+
if (tradeLineItem.UnitQuantity.HasValue)
288+
{
289+
_writeElementWithAttribute(Writer, "ram", "BasisQuantity", "unitCode", tradeLineItem.UnitCode.EnumToString(), _formatDecimal(tradeLineItem.UnitQuantity.Value, 4));
290+
}
275291

276-
foreach (TradeAllowanceCharge tradeAllowanceCharge in tradeLineItem.GetTradeAllowanceCharges())
277-
{
278-
Writer.WriteStartElement("ram", "AppliedTradeAllowanceCharge");
292+
foreach (TradeAllowanceCharge tradeAllowanceCharge in tradeLineItem.GetTradeAllowanceCharges())
293+
{
294+
Writer.WriteStartElement("ram", "AppliedTradeAllowanceCharge");
279295

280-
Writer.WriteStartElement("ram", "ChargeIndicator");
281-
Writer.WriteElementString("udt", "Indicator", tradeAllowanceCharge.ChargeIndicator ? "true" : "false");
282-
Writer.WriteEndElement(); // !ram:ChargeIndicator
296+
Writer.WriteStartElement("ram", "ChargeIndicator");
297+
Writer.WriteElementString("udt", "Indicator", tradeAllowanceCharge.ChargeIndicator ? "true" : "false");
298+
Writer.WriteEndElement(); // !ram:ChargeIndicator
283299

284-
if (tradeAllowanceCharge.BasisAmount.HasValue)
285-
{
286-
Writer.WriteStartElement("ram", "BasisAmount");
287-
Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.BasisAmount.Value, 4));
300+
if (tradeAllowanceCharge.BasisAmount.HasValue)
301+
{
302+
Writer.WriteStartElement("ram", "BasisAmount");
303+
Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.BasisAmount.Value, 4));
304+
Writer.WriteEndElement();
305+
}
306+
Writer.WriteStartElement("ram", "ActualAmount");
307+
Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.ActualAmount, 4));
288308
Writer.WriteEndElement();
289-
}
290-
Writer.WriteStartElement("ram", "ActualAmount");
291-
Writer.WriteValue(_formatDecimal(tradeAllowanceCharge.ActualAmount, 4));
292-
Writer.WriteEndElement();
293309

294-
Writer.WriteOptionalElementString("ram", "Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended);
295-
// "ReasonCode" nicht im 2.0 Standard!
310+
Writer.WriteOptionalElementString("ram", "Reason", tradeAllowanceCharge.Reason, Profile.Comfort | Profile.Extended);
311+
// "ReasonCode" nicht im 2.0 Standard!
296312

297-
Writer.WriteEndElement(); // !AppliedTradeAllowanceCharge
298-
}
313+
Writer.WriteEndElement(); // !AppliedTradeAllowanceCharge
314+
}
299315

300-
Writer.WriteEndElement(); // ram:GrossPriceProductTradePrice
316+
Writer.WriteEndElement(); // ram:GrossPriceProductTradePrice
317+
}
301318

302319
Writer.WriteStartElement("ram", "NetPriceProductTradePrice");
303320
_writeOptionalAdaptiveAmount(Writer, "ram", "ChargeAmount", tradeLineItem.NetUnitPrice, 2, 4);

0 commit comments

Comments
 (0)