From 11cb5a7a946f055bc6119448275a2b4bc4f2b4a5 Mon Sep 17 00:00:00 2001 From: pgjacobs Date: Mon, 26 Jan 2026 12:40:43 +0100 Subject: [PATCH] Add Field for "Invoiced Object Identifier" (BT-18) in Invoice.java to Align with XRechnung Requirements --- .../main/java/org/mustangproject/Invoice.java | 23 +++++++++++++ .../ZUGFeRD/IExportableTransaction.java | 9 ++++++ .../ZUGFeRD/ZUGFeRD2PullProvider.java | 19 +++++++---- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 32 +++++++++++++++++++ 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index a73889df..60de0622 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -55,6 +55,7 @@ public class Invoice implements IExportableTransaction { protected Date detailedDeliveryDateStart = null; protected Date detailedDeliveryPeriodEnd = null; protected IReferencedDocument tenderReference = null; + protected IReferencedDocument objectIdentifierReference = null; protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(), LogisticsServiceCharges = new ArrayList<>(); @@ -176,6 +177,28 @@ public class Invoice implements IExportableTransaction { } + + /** BT-18 */ + @Override + public IReferencedDocument getObjectIdentifierReferencedDocument() { + return objectIdentifierReference; + } + + + /** BT-18 */ + public Invoice setObjectIdentifierReferencedDocument(ReferencedDocument dr) { + dr.setTypeCode("130");//50 is fixed for tender documents + objectIdentifierReference=dr; + return this; + } + + public Invoice setObjectIdentifierReferencedDocument(String id) { + ReferencedDocument dr=new ReferencedDocument(id); + setObjectIdentifierReferencedDocument(dr); + return this; + } + + public Invoice setNumber(String number) { this.number = number; return this; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index cb38bbeb..85eca73a 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -224,6 +224,15 @@ public interface IExportableTransaction { return null; } + /** + * BT-18 Invoiced Object Identifier + * + * @return mandatory ID, optional Date + */ + default IReferencedDocument getObjectIdentifierReferencedDocument() { + return null; + } + /** * own name * diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 7d8cd0fd..4b3422b8 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -645,17 +645,22 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + ""; } } - - if(trans.getTenderReferencedDocument() != null){ + if (trans.getObjectIdentifierReferencedDocument() != null) { + xml += "" + + "" + XMLTools.encodeXML(trans.getObjectIdentifierReferencedDocument().getIssuerAssignedID()) + "" + + "130"; + if (trans.getObjectIdentifierReferencedDocument().getFormattedIssueDateTime()!=null) { + xml += "" + DATE.qdtFormat(trans.getObjectIdentifierReferencedDocument().getFormattedIssueDateTime()) + ""; + } + xml += ""; + } + if (trans.getTenderReferencedDocument() != null){ xml += "" + "" + XMLTools.encodeXML(trans.getTenderReferencedDocument().getIssuerAssignedID()) + "" - + "" + 50 + ""; + + "50"; if (trans.getTenderReferencedDocument().getFormattedIssueDateTime()!=null) { - final SimpleDateFormat dateFormat102 = new SimpleDateFormat("yyyyMMdd"); - xml += ""+XMLTools.encodeXML(dateFormat102.format(trans.getTenderReferencedDocument().getFormattedIssueDateTime()))+""; + xml += "" + DATE.qdtFormat(trans.getTenderReferencedDocument().getFormattedIssueDateTime()) + ""; } - - xml += ""; } if (trans.getSpecifiedProcuringProjectID() != null) { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 712256d5..139e596a 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -176,6 +176,38 @@ public class ZF2EdgeTest extends MustangReaderTestCase { }; } + + @Override + public IReferencedDocument getObjectIdentifierReferencedDocument() { + return new IReferencedDocument() { + @Override + public String getIssuerAssignedID() { + return "gPogKLtac0"; + } + + @Override + public String getTypeCode() { + return "130"; + } + + @Override + public String getReferenceTypeCode() { + return ""; + } + + @Override + public Date getFormattedIssueDateTime() { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + try { + return sdf.parse("2026-01-26"); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + }; + } + @Override public String getOwnLocation() { return "Stadthausen";