Skip to content

Commit

Permalink
Merge branch 'stephanstapel:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
PeterSawatzki-MGGM authored Jan 26, 2025
2 parents ee920cf + b44542b commit 937fc26
Show file tree
Hide file tree
Showing 13 changed files with 133 additions and 25 deletions.
6 changes: 4 additions & 2 deletions ZUGFeRD.Test/ZUGFeRD20Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,8 @@ public void TestWriteAndReadExtended()
lineItem.Description = "This is line item TB100A4";
lineItem.BuyerAssignedID = "0815";
lineItem.SetOrderReferencedDocument("12345", timestamp, "1");
lineItem.SetDeliveryNoteReferencedDocument("12345", timestamp);
lineItem.SetContractReferencedDocument("12345", timestamp);
lineItem.SetDeliveryNoteReferencedDocument("12345", timestamp, "1");
lineItem.SetContractReferencedDocument("12345", timestamp, "1");

lineItem.AddAdditionalReferencedDocument("xyz", AdditionalReferencedDocumentTypeCode.ReferenceDocument, ReferenceTypeCodes.AAB, timestamp);

Expand Down Expand Up @@ -787,8 +787,10 @@ public void TestWriteAndReadExtended()
Assert.AreEqual("1", loadedLineItem.BuyerOrderReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.BuyerOrderReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.BuyerOrderReferencedDocument.IssueDateTime);
Assert.AreEqual("1", loadedLineItem.DeliveryNoteReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.DeliveryNoteReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.DeliveryNoteReferencedDocument.IssueDateTime);
Assert.AreEqual("1", loadedLineItem.ContractReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.ContractReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.ContractReferencedDocument.IssueDateTime);

Expand Down
6 changes: 4 additions & 2 deletions ZUGFeRD.Test/ZUGFeRD22Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1847,8 +1847,8 @@ public void TestWriteAndReadExtended()
lineItem.Description = "This is line item TB100A4";
lineItem.BuyerAssignedID = "0815";
lineItem.SetOrderReferencedDocument("12345", timestamp, "1");
lineItem.SetDeliveryNoteReferencedDocument("12345", timestamp);
lineItem.SetContractReferencedDocument("12345", timestamp);
lineItem.SetDeliveryNoteReferencedDocument("12345", timestamp, "1");
lineItem.SetContractReferencedDocument("12345", timestamp, "1");

lineItem.AddAdditionalReferencedDocument("xyz", AdditionalReferencedDocumentTypeCode.ReferenceDocument, ReferenceTypeCodes.AAB, timestamp);
lineItem.AddAdditionalReferencedDocument("abc", AdditionalReferencedDocumentTypeCode.InvoiceDataSheet, ReferenceTypeCodes.PP, timestamp);
Expand Down Expand Up @@ -2059,8 +2059,10 @@ public void TestWriteAndReadExtended()
Assert.AreEqual("1", loadedLineItem.BuyerOrderReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.BuyerOrderReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.BuyerOrderReferencedDocument.IssueDateTime);
Assert.AreEqual("1", loadedLineItem.DeliveryNoteReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.DeliveryNoteReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.DeliveryNoteReferencedDocument.IssueDateTime);
Assert.AreEqual("1", loadedLineItem.ContractReferencedDocument.LineID);
Assert.AreEqual("12345", loadedLineItem.ContractReferencedDocument.ID);
Assert.AreEqual(timestamp, loadedLineItem.ContractReferencedDocument.IssueDateTime);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
Expand All @@ -17,15 +17,16 @@
* under the License.
*/
using Microsoft.VisualStudio.TestTools.UnitTesting;
using s2industries.ZUGFeRD;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace s2industries.ZUGFeRD.Test
{
[TestClass]
public class GlobalTests : TestBase
public class ZUGFeRDCrossVersionTests : TestBase
{
private InvoiceProvider _InvoiceProvider = new InvoiceProvider();

Expand Down Expand Up @@ -117,8 +118,8 @@ public void TestGetVersion()
[DataRow(ZUGFeRDVersion.Version20, Profile.Extended)]
[DataRow(ZUGFeRDVersion.Version20, Profile.XRechnung)]
[DataRow(ZUGFeRDVersion.Version20, Profile.XRechnung1)]
[DataRow(ZUGFeRDVersion.Version23, Profile.Extended)]
[DataRow(ZUGFeRDVersion.Version23, Profile.XRechnung1)]
[DataRow(ZUGFeRDVersion.Version23, Profile.Extended)]
[DataRow(ZUGFeRDVersion.Version23, Profile.XRechnung1)]
public void UBLNonAvailability(ZUGFeRDVersion version, Profile profile)
{
InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();
Expand All @@ -127,7 +128,7 @@ public void UBLNonAvailability(ZUGFeRDVersion version, Profile profile)
} // !UBLNonAvailability()


[TestMethod]
[TestMethod]
public void UBLAvailability()
{
InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();
Expand Down Expand Up @@ -184,5 +185,66 @@ public void SavingThenReadingAppliedTradeTaxes(ZUGFeRDVersion version, Profile p
Assert.AreEqual(-5m, actualTax.AllowanceChargeBasisAmount);
Assert.AreEqual(198m, actualTax.LineTotalBasisAmount);
} // !SavingThenReadingAppliedTradeTaxes()


[TestMethod]
[DataRow(ZUGFeRDVersion.Version1)]
[DataRow(ZUGFeRDVersion.Version20)]
[DataRow(ZUGFeRDVersion.Version23)]
public void TestDeliveryNoteReferencedDocumentLineIdInExtended(ZUGFeRDVersion version)
{
string deliveryNoteNumber = "DeliveryNote-0815";
DateTime deliveryNoteDate = DateTime.Today;
string deliveryNoteLineID = "0815.001";

InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();

TradeLineItem line = desc.AddTradeLineItem("DeliveryNoteReferencedDocument-Text");
line.SetDeliveryNoteReferencedDocument(deliveryNoteNumber, deliveryNoteDate, deliveryNoteLineID);

MemoryStream ms = new MemoryStream();

desc.Save(ms, version, Profile.Extended);
ms.Seek(0, SeekOrigin.Begin);

InvoiceDescriptor loadedInvoice = InvoiceDescriptor.Load(ms);
TradeLineItem? loadedLine = loadedInvoice.TradeLineItems.LastOrDefault();

Assert.IsNotNull(loadedLine);
Assert.IsNotNull(loadedLine?.DeliveryNoteReferencedDocument);
Assert.AreEqual(deliveryNoteNumber, loadedLine?.DeliveryNoteReferencedDocument?.ID);
Assert.AreEqual(deliveryNoteDate, loadedLine?.DeliveryNoteReferencedDocument?.IssueDateTime);
Assert.AreEqual(deliveryNoteLineID, loadedLine?.DeliveryNoteReferencedDocument?.LineID);
}

[TestMethod]
[DataRow(ZUGFeRDVersion.Version1)]
[DataRow(ZUGFeRDVersion.Version20)]
[DataRow(ZUGFeRDVersion.Version23)]
public void TestContractReferencedDocumentLineIdInExtended(ZUGFeRDVersion version)
{
string contractNumber = "Contract-0815";
DateTime contractDate = DateTime.Today;
string contractLineID = "0815.001";

InvoiceDescriptor desc = this._InvoiceProvider.CreateInvoice();

TradeLineItem line = desc.AddTradeLineItem("ContractReferencedDocument-Text");
line.SetContractReferencedDocument(contractNumber, contractDate, contractLineID);

MemoryStream ms = new MemoryStream();

desc.Save(ms, version, Profile.Extended);
ms.Seek(0, SeekOrigin.Begin);

InvoiceDescriptor loadedInvoice = InvoiceDescriptor.Load(ms);
TradeLineItem? loadedLine = loadedInvoice.TradeLineItems.LastOrDefault();

Assert.IsNotNull(loadedLine);
Assert.IsNotNull(loadedLine?.ContractReferencedDocument);
Assert.AreEqual(contractNumber, loadedLine?.ContractReferencedDocument?.ID);
Assert.AreEqual(contractDate, loadedLine?.ContractReferencedDocument?.IssueDateTime);
Assert.AreEqual(contractLineID, loadedLine?.ContractReferencedDocument?.LineID);
}
}
}
4 changes: 4 additions & 0 deletions ZUGFeRD/ContractReferencedDocument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,9 @@ namespace s2industries.ZUGFeRD
/// </summary>
public class ContractReferencedDocument : BaseReferencedDocument
{
/// <summary>
/// Reference to the contract position BT-X-25
/// </summary>
public string LineID { get; set; }
}
}
4 changes: 4 additions & 0 deletions ZUGFeRD/DeliveryNoteReferencedDocument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,9 @@ namespace s2industries.ZUGFeRD
/// </summary>
public class DeliveryNoteReferencedDocument : BaseReferencedDocument
{
/// <summary>
/// Reference to the delivery note item BT-X-93
/// </summary>
public string LineID { get; set; }
}
}
2 changes: 2 additions & 0 deletions ZUGFeRD/InvoiceDescriptor1Reader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
{
ID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:ID", nsmgr),
IssueDateTime = XmlUtils.NodeAsDateTime(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:IssueDateTime", nsmgr),
LineID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:LineID", nsmgr)
};
}

Expand All @@ -371,6 +372,7 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
{
ID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeAgreement/ram:ContractReferencedDocument/ram:ID", nsmgr),
IssueDateTime = XmlUtils.NodeAsDateTime(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeAgreement/ram:ContractReferencedDocument/ram:IssueDateTime", nsmgr),
LineID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedSupplyChainTradeAgreement/ram:ContractReferencedDocument/ram:LineID", nsmgr)
};
}

Expand Down
2 changes: 2 additions & 0 deletions ZUGFeRD/InvoiceDescriptor1Writer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
Writer.WriteValue(_formatDate(tradeLineItem.ContractReferencedDocument.IssueDateTime.Value, false));
Writer.WriteEndElement(); // !ram:IssueDateTime
}
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.ContractReferencedDocument.LineID);
Writer.WriteOptionalElementString("ram", "ID", tradeLineItem.ContractReferencedDocument.ID);
Writer.WriteEndElement(); // !ram:ContractReferencedDocument
}
Expand Down Expand Up @@ -581,6 +582,7 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
Writer.WriteValue(_formatDate(tradeLineItem.DeliveryNoteReferencedDocument.IssueDateTime.Value, false));
Writer.WriteEndElement(); // !ram:IssueDateTime
}
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.DeliveryNoteReferencedDocument.LineID);
Writer.WriteOptionalElementString("ram", "ID", tradeLineItem.DeliveryNoteReferencedDocument.ID);
Writer.WriteEndElement(); // !ram:DeliveryNoteReferencedDocument
}
Expand Down
2 changes: 2 additions & 0 deletions ZUGFeRD/InvoiceDescriptor20Reader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,7 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
item.DeliveryNoteReferencedDocument = new DeliveryNoteReferencedDocument()
{
ID = XmlUtils.NodeAsString(deliveryNoteReferencedDocumentNode, "ram:IssuerAssignedID", nsmgr),
LineID = XmlUtils.NodeAsString(deliveryNoteReferencedDocumentNode, "ram:LineID", nsmgr),
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(deliveryNoteReferencedDocumentNode, "ram:FormattedIssueDateTime", nsmgr),
};
}
Expand All @@ -488,6 +489,7 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
item.ContractReferencedDocument = new ContractReferencedDocument()
{
ID = XmlUtils.NodeAsString(contractReferencedDocument, "ram:IssuerAssignedID", nsmgr),
LineID = XmlUtils.NodeAsString(contractReferencedDocument, "ram:LineID", nsmgr),
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(contractReferencedDocument, "ram:FormattedIssueDateTime", nsmgr),
};
}
Expand Down
7 changes: 6 additions & 1 deletion ZUGFeRD/InvoiceDescriptor20Writer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,10 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
if (tradeLineItem.ContractReferencedDocument != null)
{
Writer.WriteStartElement("ram", "ContractReferencedDocument", Profile.Extended);

// reference to the contract position
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.ContractReferencedDocument.LineID);

if (tradeLineItem.ContractReferencedDocument.IssueDateTime.HasValue)
{
Writer.WriteStartElement("ram", "FormattedIssueDateTime");
Expand Down Expand Up @@ -324,12 +328,13 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
Writer.WriteStartElement("ram", "FormattedIssueDateTime");
Writer.WriteStartElement("qdt", "DateTimeString");
Writer.WriteAttributeString("format", "102");
Writer.WriteValue(_formatDate(this.Descriptor.OrderDate.Value));
Writer.WriteValue(_formatDate(tradeLineItem.DeliveryNoteReferencedDocument.IssueDateTime.Value));
Writer.WriteEndElement(); // !qdt:DateTimeString
Writer.WriteEndElement(); // !ram:FormattedIssueDateTime
}

Writer.WriteOptionalElementString("ram", "IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID);
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.DeliveryNoteReferencedDocument.LineID);
Writer.WriteEndElement(); // !ram:DeliveryNoteReferencedDocument
}

Expand Down
6 changes: 4 additions & 2 deletions ZUGFeRD/InvoiceDescriptor23CIIReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,8 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
item.ContractReferencedDocument = new ContractReferencedDocument()
{
ID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedLineTradeAgreement/ram:ContractReferencedDocument/ram:IssuerAssignedID", nsmgr),
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(tradeLineItem, "//ram:SpecifiedLineTradeAgreement/ram:ContractReferencedDocument/ram:FormattedIssueDateTime", nsmgr)
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(tradeLineItem, "//ram:SpecifiedLineTradeAgreement/ram:ContractReferencedDocument/ram:FormattedIssueDateTime", nsmgr),
LineID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedLineTradeAgreement/ram:ContractReferencedDocument/ram:LineID", nsmgr)
};
}

Expand Down Expand Up @@ -593,7 +594,8 @@ private static TradeLineItem _parseTradeLineItem(XmlNode tradeLineItem, XmlNames
item.DeliveryNoteReferencedDocument = new DeliveryNoteReferencedDocument()
{
ID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedLineTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:IssuerAssignedID", nsmgr),
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(tradeLineItem, ".//ram:SpecifiedLineTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:FormattedIssueDateTime", nsmgr)
IssueDateTime = DataTypeReader.ReadFormattedIssueDateTime(tradeLineItem, ".//ram:SpecifiedLineTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:FormattedIssueDateTime", nsmgr),
LineID = XmlUtils.NodeAsString(tradeLineItem, ".//ram:SpecifiedLineTradeDelivery/ram:DeliveryNoteReferencedDocument/ram:LineID", nsmgr)
};
}

Expand Down
7 changes: 7 additions & 0 deletions ZUGFeRD/InvoiceDescriptor23CIIWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,10 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
if (tradeLineItem.ContractReferencedDocument != null)
{
Writer.WriteStartElement("ram", "ContractReferencedDocument", Profile.Extended);

// reference to the contract position
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.ContractReferencedDocument.LineID);

if (tradeLineItem.ContractReferencedDocument.IssueDateTime.HasValue)
{
Writer.WriteStartElement("ram", "FormattedIssueDateTime");
Expand Down Expand Up @@ -448,6 +452,9 @@ public override void Save(InvoiceDescriptor descriptor, Stream stream, ZUGFeRDFo
Writer.WriteStartElement("ram", "DeliveryNoteReferencedDocument", Profile.Extended); // this violates CII-SR-175 for XRechnung 3
Writer.WriteOptionalElementString("ram", "IssuerAssignedID", tradeLineItem.DeliveryNoteReferencedDocument.ID);

// reference to the delivery note item
Writer.WriteOptionalElementString("ram", "LineID", tradeLineItem.DeliveryNoteReferencedDocument.LineID);

if (tradeLineItem.DeliveryNoteReferencedDocument.IssueDateTime.HasValue)
{
Writer.WriteStartElement("ram", "FormattedIssueDateTime");
Expand Down
10 changes: 9 additions & 1 deletion ZUGFeRD/QuantityCodes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,15 @@ public enum QuantityCodes
/// <remarks>
/// Services offered with no time frame specified
/// </remarks>
E48
E48,

/// <summary>
/// Metric Carat
/// </summary>
/// <remarks>
/// Einheit für die Masse von Edelsteinen. Abkürzung Kt oder ct (kein gesetzliches Einheitszeichen)
/// </remarks>
CTM
}


Expand Down
Loading

0 comments on commit 937fc26

Please sign in to comment.