Skip to content

Commit e461b81

Browse files
committed
Code optimization and unit tests for GrossPriceProductTradePrice
1 parent ce46842 commit e461b81

File tree

4 files changed

+93
-7
lines changed

4 files changed

+93
-7
lines changed

ZUGFeRD.Test/ZUGFeRD22Tests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3364,6 +3364,6 @@ public void TestRSMInvoice()
33643364
Assert.AreEqual(desc.Profile, Profile.XRechnung1);
33653365
Assert.AreEqual(desc.InvoiceNo, "0815-99-1-a");
33663366
Assert.AreEqual(desc.InvoiceDate, new DateTime(2020, 06, 21));
3367-
} // !TestRSMInvoice()
3367+
} // !TestRSMInvoice()
33683368
}
33693369
}

ZUGFeRD.Test/ZUGFeRDCrossVersionTests.cs

+86
Original file line numberDiff line numberDiff line change
@@ -489,5 +489,91 @@ public void TestTransportModeWithComfort(ZUGFeRDVersion version)
489489
InvoiceDescriptor loadedInvoice = InvoiceDescriptor.Load(ms);
490490
Assert.IsNull(loadedInvoice.TransportMode); // not supported in comfort profile
491491
} // !TestTransportModeWithExtended()
492+
493+
494+
// Test for rule PEPPOL-EN16931-R046
495+
[TestMethod]
496+
[DataRow(ZUGFeRDVersion.Version20)]
497+
[DataRow(ZUGFeRDVersion.Version23)]
498+
public void TestGrossPriceRepresentationForXRechnungAndNotXRechnungNegativeCase(ZUGFeRDVersion version)
499+
{
500+
decimal grossPrice = 10.1m;
501+
decimal netPrice = 10.0m;
502+
decimal discountPercent = 10.0m;
503+
decimal discountAmount = 0.1m;
504+
505+
InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();
506+
desc.TradeLineItems.Clear();
507+
508+
TradeLineItem item = desc.AddTradeLineItem("Test",
509+
netPrice, // net unit price
510+
"Test",
511+
QuantityCodes.C62,
512+
1,
513+
grossPrice, // gross unit price
514+
1);
515+
516+
MemoryStream ms = new MemoryStream();
517+
desc.Save(ms, ZUGFeRDVersion.Version23, Profile.Extended);
518+
519+
InvoiceDescriptor zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge = InvoiceDescriptor.Load(ms);
520+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems().Count, 1);
521+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GrossUnitPrice, grossPrice);
522+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges().Count, 0);
523+
524+
ms = new MemoryStream();
525+
desc.Save(ms, ZUGFeRDVersion.Version23, Profile.XRechnung);
526+
527+
InvoiceDescriptor zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge = InvoiceDescriptor.Load(ms);
528+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems().Count, 1);
529+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GrossUnitPrice, null);
530+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges().Count, 0);
531+
} // !TestGrossPriceRepresentationForXRechnungAndNotXRechnungNegativeCase()
532+
533+
534+
// Test for rule PEPPOL-EN16931-R046
535+
[TestMethod]
536+
[DataRow(ZUGFeRDVersion.Version20)]
537+
[DataRow(ZUGFeRDVersion.Version23)]
538+
public void TestGrossPriceRepresentationForXRechnungAndNotXRechnungPositiveCase(ZUGFeRDVersion version)
539+
{
540+
decimal grossPrice = 10.1m;
541+
decimal netPrice = 10.0m;
542+
decimal discountPercent = 10.0m;
543+
decimal discountAmount = 0.1m;
544+
545+
InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();
546+
desc.TradeLineItems.Clear();
547+
548+
TradeLineItem item = desc.AddTradeLineItem("Test",
549+
netPrice, // net unit price
550+
"Test",
551+
QuantityCodes.C62,
552+
1,
553+
grossPrice, // gross unit price
554+
1);
555+
556+
item.AddTradeAllowanceCharge(true, CurrencyCodes.EUR, grossPrice, discountAmount, "Discount", AllowanceReasonCodes.Discount);
557+
558+
MemoryStream ms = new MemoryStream();
559+
desc.Save(ms, ZUGFeRDVersion.Version23, Profile.Extended);
560+
561+
InvoiceDescriptor zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge = InvoiceDescriptor.Load(ms);
562+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems().Count, 1);
563+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GrossUnitPrice, grossPrice);
564+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges().Count, 1);
565+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges()[0].BasisAmount, grossPrice);
566+
Assert.AreEqual(zugferd23ExtendedInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges()[0].ActualAmount, discountAmount);
567+
568+
ms = new MemoryStream();
569+
desc.Save(ms, ZUGFeRDVersion.Version23, Profile.XRechnung);
570+
571+
InvoiceDescriptor zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge = InvoiceDescriptor.Load(ms);
572+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems().Count, 1);
573+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GrossUnitPrice, grossPrice);
574+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges().Count, 1);
575+
Assert.IsNull(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges()[0].BasisAmount); // not written in XRechnung
576+
Assert.AreEqual(zugferd23XRechnungInvoiceWithGrossWithoutAllowanceCharge.GetTradeLineItems()[0].GetTradeAllowanceCharges()[0].ActualAmount, discountAmount);
577+
} // !TestGrossPriceRepresentationForXRechnungAndNotXRechnungPositiveCase()
492578
}
493579
}

ZUGFeRD/InvoiceDescriptor20Reader.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -412,12 +412,12 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
412412
Description = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:Description", nsmgr),
413413
UnitQuantity = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:BasisQuantity", nsmgr),
414414
BilledQuantity = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:BilledQuantity", nsmgr, 0).Value,
415-
LineTotalAmount = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:LineTotalAmount", nsmgr, 0),
415+
LineTotalAmount = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:LineTotalAmount", nsmgr),
416416
TaxCategoryCode = EnumExtensions.StringToEnum<TaxCategoryCodes>(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:CategoryCode", nsmgr)),
417417
TaxType = EnumExtensions.StringToEnum<TaxTypes>(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:TypeCode", nsmgr)),
418418
TaxPercent = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:ApplicableTradeTax/ram:RateApplicablePercent", nsmgr, 0).Value,
419-
NetUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:NetPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value,
420-
GrossUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:GrossPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value,
419+
NetUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:NetPriceProductTradePrice/ram:ChargeAmount", nsmgr),
420+
GrossUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:GrossPriceProductTradePrice/ram:ChargeAmount", nsmgr),
421421
UnitCode = default(QuantityCodes).FromString(XmlUtils.NodeAsString(tradeLineItem, ".//ram:BilledQuantity/@unitCode", nsmgr)),
422422
BillingPeriodStart = XmlUtils.NodeAsDateTime(tradeLineItem, ".//ram:BillingSpecifiedPeriod/ram:StartDateTime/udt:DateTimeString", nsmgr),
423423
BillingPeriodEnd = XmlUtils.NodeAsDateTime(tradeLineItem, ".//ram:BillingSpecifiedPeriod/ram:EndDateTime/udt:DateTimeString", nsmgr),

ZUGFeRD/InvoiceDescriptor23CIIReader.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -508,14 +508,14 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
508508
UltimateShipTo = _nodeAsParty(tradeLineItem, ".//ram:SpecifiedLineTradeDelivery/ram:UltimateShipToTradeParty", nsmgr),
509509
ChargeFreeQuantity = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:ChargeFreeQuantity", nsmgr),
510510
PackageQuantity = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:PackageQuantity", nsmgr),
511-
LineTotalAmount = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:LineTotalAmount", nsmgr, 0),
511+
LineTotalAmount = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:LineTotalAmount", nsmgr),
512512
TaxCategoryCode = EnumExtensions.StringToEnum<TaxCategoryCodes>(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:CategoryCode", nsmgr)),
513513
TaxType = EnumExtensions.StringToEnum<TaxTypes>(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:TypeCode", nsmgr)),
514514
TaxPercent = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:ApplicableTradeTax/ram:RateApplicablePercent", nsmgr, 0).Value,
515515
TaxExemptionReasonCode = EnumExtensions.StringToNullableEnum<TaxExemptionReasonCodes>(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:ExemptionReasonCode", nsmgr)),
516516
TaxExemptionReason = XmlUtils.NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:ExemptionReason", nsmgr),
517-
NetUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:NetPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value,
518-
GrossUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:GrossPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value,
517+
NetUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:NetPriceProductTradePrice/ram:ChargeAmount", nsmgr),
518+
GrossUnitPrice = XmlUtils.NodeAsDecimal(tradeLineItem, ".//ram:GrossPriceProductTradePrice/ram:ChargeAmount", nsmgr),
519519
UnitCode = default(QuantityCodes).FromString(XmlUtils.NodeAsString(tradeLineItem, ".//ram:BilledQuantity/@unitCode", nsmgr)),
520520
ChargeFreeUnitCode = default(QuantityCodes).FromString(XmlUtils.NodeAsString(tradeLineItem, ".//ram:ChargeFreeQuantity/@unitCode", nsmgr)),
521521
PackageUnitCode = default(QuantityCodes).FromString(XmlUtils.NodeAsString(tradeLineItem, ".//ram:PackageQuantity/@unitCode", nsmgr)),

0 commit comments

Comments
 (0)