@@ -264,40 +264,57 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
264
264
}
265
265
266
266
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
+ }
275
291
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" ) ;
279
295
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
283
299
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 ) ) ;
288
308
Writer . WriteEndElement ( ) ;
289
- }
290
- Writer . WriteStartElement ( "ram" , "ActualAmount" ) ;
291
- Writer . WriteValue ( _formatDecimal ( tradeAllowanceCharge . ActualAmount , 4 ) ) ;
292
- Writer . WriteEndElement ( ) ;
293
309
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!
296
312
297
- Writer . WriteEndElement ( ) ; // !AppliedTradeAllowanceCharge
298
- }
313
+ Writer . WriteEndElement ( ) ; // !AppliedTradeAllowanceCharge
314
+ }
299
315
300
- Writer . WriteEndElement ( ) ; // ram:GrossPriceProductTradePrice
316
+ Writer . WriteEndElement ( ) ; // ram:GrossPriceProductTradePrice
317
+ }
301
318
302
319
Writer . WriteStartElement ( "ram" , "NetPriceProductTradePrice" ) ;
303
320
_writeOptionalAdaptiveAmount ( Writer , "ram" , "ChargeAmount" , tradeLineItem . NetUnitPrice , 2 , 4 ) ;
0 commit comments