From ecc667c597d5c156cd04b3f7b656144ed2f12d2c Mon Sep 17 00:00:00 2001 From: jstaerk Date: Wed, 15 Oct 2025 11:15:56 +0200 Subject: [PATCH 01/22] temporary testfile --- BT17.xml | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 BT17.xml diff --git a/BT17.xml b/BT17.xml new file mode 100644 index 00000000..34f518ff --- /dev/null +++ b/BT17.xml @@ -0,0 +1,201 @@ + + + + + + + + urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended + + + + RE-20170509/505 + RECHNUNG + 380 + + 20170509 + + + + + + 1 + + + Künstlerische Gestaltung (Stunde): Einer Beispielrechnung + + + + 160.0000 + 100.0000 + + + + 1.0000 + + + + VAT + Intra-community supply + K + 0.00 + + + 1.60 + + + 1825 + 130 + + + + + + 2 + + + Bestellerweiterung für E&F Umbau + + + + 0.7900 + 1.0000 + + + + 400.0000 + + + + VAT + Intra-community supply + K + 0.00 + + + 316.00 + + + + + + 3 + + + Heiße Luft pro Liter + + + + 0.1000 + 1.0000 + + + + 200.0000 + + + + VAT + Intra-community supply + K + 0.00 + + + 20.00 + + + + + AB321 + + Bei Spiel GmbH + + 12345 + Ecke 12 + Stadthausen + DE + + + DE0815 + + + 0815 + + + + Theodor Est + + 88802 + Bahnstr. 42 + Hinterhaus + Zweiter Stock + Spielkreis + DE + + + DE999999999 + + + + + + Theodor Est + + 88802 + Bahnstr. 42 + Hinterhaus + Zweiter Stock + Spielkreis + DE + + + + + 20170507 + + + + 123 + + + + USD + + 54 + Credit Card + + DE540815 + + + + 0.00 + VAT + Intra-community supply + 337.60 + K + 0.00 + + + 14 Tage 2% Skonto, 30 Tage rein netto + + 20220228 + + DE99XX12345 + + 337.60 + 2 + + + + 337.60 + 0.00 + 0.00 + 337.60 + 0.00 + 337.60 + 0.00 + 337.60 + + + + From 882d50958059bb2a3ba5e1885e0d0ff76dbd4192 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Wed, 15 Oct 2025 12:41:24 +0200 Subject: [PATCH 02/22] If the interface is implemented correctly, ZF2EdgeTest now already writes a BT-17 incl Date --- .../ZUGFeRD/IDatedReference.java | 10 ++++++++++ .../ZUGFeRD/IExportableTransaction.java | 9 +++++++++ .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java new file mode 100644 index 00000000..af1adf38 --- /dev/null +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java @@ -0,0 +1,10 @@ +package org.mustangproject.ZUGFeRD; + +import java.util.Date; + +public interface IDatedReference { + public String getID(); + default Date getDate() { + return null; + } +} diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index c7a6d903..72b61d83 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -214,6 +214,15 @@ public interface IExportableTransaction { return null; } + /** + * BT-17 tender or lot reference + * + * @return mandatory ID, optional Date + */ + default IDatedReference getTenderReference() { + return null; + } + /** * own name * diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index f095372b..3178c321 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -144,6 +144,25 @@ public class ZF2EdgeTest extends MustangReaderTestCase { return "DE"; } + @Override + public IDatedReference getTenderReference() { + return new IDatedReference() { + @Override + public String getID() { + return "983-jk-787 (obsolete)"; + } + @Override + public Date getDate() { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + try { + return sdf.parse("2025-10-12"); + } catch (ParseException e) { + // wont happen, I promise :-) + } + } + }; + } + @Override public String getOwnLocation() { return "Stadthausen"; From 8404c97d29e38fe39205336b95feb22dcd4b8be5 Mon Sep 17 00:00:00 2001 From: Bharti Date: Wed, 15 Oct 2025 20:09:19 +0200 Subject: [PATCH 03/22] adding bt-17 --- BT17.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BT17.xml b/BT17.xml index 34f518ff..b8d67ca7 100644 --- a/BT17.xml +++ b/BT17.xml @@ -136,6 +136,10 @@ DE999999999 + + Testing1 + 50 + From ec1ccbc75eeeb2e462bd7fcd3da65a79108d3633 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Thu, 16 Oct 2025 10:21:00 +0200 Subject: [PATCH 04/22] switch to getTenderReferencedDocument analogue to getContractReferencedDocument, added DatedReference class and setters/getters for Invoice --- .../org/mustangproject/DatedReference.java | 46 +++++++++++++++++++ .../main/java/org/mustangproject/Invoice.java | 29 ++++++++++++ .../ZUGFeRD/IExportableTransaction.java | 2 +- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 3 +- .../mustangproject/ZUGFeRD/ZF2PushTest.java | 2 + 5 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 library/src/main/java/org/mustangproject/DatedReference.java diff --git a/library/src/main/java/org/mustangproject/DatedReference.java b/library/src/main/java/org/mustangproject/DatedReference.java new file mode 100644 index 00000000..5d5ca70f --- /dev/null +++ b/library/src/main/java/org/mustangproject/DatedReference.java @@ -0,0 +1,46 @@ +package org.mustangproject; + +import org.mustangproject.ZUGFeRD.IDatedReference; + +import java.beans.BeanProperty; +import java.util.Date; + +public class DatedReference implements IDatedReference { + + protected String ID; + protected Date opDate; + + public DatedReference setDate(Date opDate) { + this.opDate = opDate; + return this; + } + + public DatedReference setID(String ID) { + this.ID = ID; + return this; + } + + public DatedReference() { + + } + + public DatedReference(String ID) { + setID(ID); + } + + public DatedReference(String ID, Date theDate) { + setID(ID); + setDate(theDate); + } + + + @Override + public String getID() { + return ID; + } + + @Override + public Date getDate() { + return opDate; + } +} diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index d1a31537..a625ec6d 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -54,6 +54,7 @@ public class Invoice implements IExportableTransaction { protected BigDecimal totalPrepaidAmount = null; protected Date detailedDeliveryDateStart = null; protected Date detailedDeliveryPeriodEnd = null; + protected IDatedReference tenderReference = null; protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(), LogisticsServiceCharges = new ArrayList<>(); @@ -144,6 +145,34 @@ public class Invoice implements IExportableTransaction { return number; } + + + @Override + /*** + * BT-17 + */ + public IDatedReference getTenderReferencedDocument() { + return tenderReference; + } + + + /*** + * BT-17 + * @param dr + * @return + */ + public Invoice setTenderReferencedDocument(DatedReference dr) { + tenderReference=dr; + return this; + } + + public Invoice setTenderReferencedDocument(String ID) { + DatedReference dr=new DatedReference(ID); + setTenderReferencedDocument(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 72b61d83..8d317b1a 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -219,7 +219,7 @@ public interface IExportableTransaction { * * @return mandatory ID, optional Date */ - default IDatedReference getTenderReference() { + default IDatedReference getTenderReferencedDocument() { return null; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 3178c321..e122bfc0 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -145,7 +145,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase { } @Override - public IDatedReference getTenderReference() { + public IDatedReference getTenderReferencedDocument() { return new IDatedReference() { @Override public String getID() { @@ -159,6 +159,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase { } catch (ParseException e) { // wont happen, I promise :-) } + return null; // wont happen either } }; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 1defb4b3..041f4a25 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -596,6 +596,7 @@ public class ZF2PushTest extends TestCase { try { SchemedID gtin = new SchemedID("0160", "2001015001325"); SchemedID gln = new SchemedID("0088", "4304171000002"); + DatedReference dr=new DatedReference("90-kl-98798-C", sdf.parse("2025-10-12")); ze.setTransaction(new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setPaymentReference("Verwendungszweck").setDocumentName("Rechnung") .setSellerOrderReferencedDocumentID("9384").setBuyerOrderReferencedDocumentID("28934") .setDetailedDeliveryPeriod(new SimpleDateFormat("yyyyMMdd").parse(occurrenceFrom), new SimpleDateFormat("yyyyMMdd").parse(occurrenceTo)) @@ -608,6 +609,7 @@ public class ZF2PushTest extends TestCase { .addCharge(new Charge(new BigDecimal(0.5)).setReason("quick delivery charge").setTaxPercent(new BigDecimal(16))) .addAllowance(new Allowance(new BigDecimal(0.2)).setReason("discount").setTaxPercent(new BigDecimal(16))) .addCashDiscount(new CashDiscount(new BigDecimal(2), 14)) + .setTenderReferencedDocument(dr) .setDeliveryDate(sdf.parse("2020-11-02")).setNumber(number).setVATDueDateTypeCode(EventTimeCodeTypeConstants.PAYMENT_DATE) .setInvoiceReferencedDocumentID("abc123").addInvoiceReferencedDocument(new ReferencedDocument("abcd1234")) ); From 180d136c7cc2a08c549e2673ee17835f30e4f113 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Thu, 16 Oct 2025 10:25:13 +0200 Subject: [PATCH 05/22] added cii read test --- .../src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java | 2 +- .../org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index e122bfc0..740412ae 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -149,7 +149,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase { return new IDatedReference() { @Override public String getID() { - return "983-jk-787 (obsolete)"; + return "983-jk-787"; } @Override public Date getDate() { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index b99f7108..a9c6b188 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -178,9 +178,12 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { hasExceptions = true; } assertFalse(hasExceptions); + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); // Reading ZUGFeRD assertEquals("4711", invoice.getZFItems()[0].getProduct().getSellerAssignedID()); assertEquals("9384", invoice.getSellerOrderReferencedDocumentID()); + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getID()); + assertEquals("2025-10-12", sdf.format(invoice.getTenderReferencedDocument().getDate())); assertEquals("sender@test.org", invoice.getSender().getEmail()); assertEquals("recipient@test.org", invoice.getRecipient().getEmail()); assertEquals("28934", invoice.getBuyerOrderReferencedDocumentID()); From 791dbce41bd6aabe85463a0818f14a2b40e2fa93 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Thu, 16 Oct 2025 10:25:33 +0200 Subject: [PATCH 06/22] removed testfile --- BT17.xml | 201 ------------------------------------------------------- 1 file changed, 201 deletions(-) delete mode 100644 BT17.xml diff --git a/BT17.xml b/BT17.xml deleted file mode 100644 index 34f518ff..00000000 --- a/BT17.xml +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended - - - - RE-20170509/505 - RECHNUNG - 380 - - 20170509 - - - - - - 1 - - - Künstlerische Gestaltung (Stunde): Einer Beispielrechnung - - - - 160.0000 - 100.0000 - - - - 1.0000 - - - - VAT - Intra-community supply - K - 0.00 - - - 1.60 - - - 1825 - 130 - - - - - - 2 - - - Bestellerweiterung für E&F Umbau - - - - 0.7900 - 1.0000 - - - - 400.0000 - - - - VAT - Intra-community supply - K - 0.00 - - - 316.00 - - - - - - 3 - - - Heiße Luft pro Liter - - - - 0.1000 - 1.0000 - - - - 200.0000 - - - - VAT - Intra-community supply - K - 0.00 - - - 20.00 - - - - - AB321 - - Bei Spiel GmbH - - 12345 - Ecke 12 - Stadthausen - DE - - - DE0815 - - - 0815 - - - - Theodor Est - - 88802 - Bahnstr. 42 - Hinterhaus - Zweiter Stock - Spielkreis - DE - - - DE999999999 - - - - - - Theodor Est - - 88802 - Bahnstr. 42 - Hinterhaus - Zweiter Stock - Spielkreis - DE - - - - - 20170507 - - - - 123 - - - - USD - - 54 - Credit Card - - DE540815 - - - - 0.00 - VAT - Intra-community supply - 337.60 - K - 0.00 - - - 14 Tage 2% Skonto, 30 Tage rein netto - - 20220228 - - DE99XX12345 - - 337.60 - 2 - - - - 337.60 - 0.00 - 0.00 - 337.60 - 0.00 - 337.60 - 0.00 - 337.60 - - - - From 5c3d03e9ed0be77985a131c6265da08ad9401667 Mon Sep 17 00:00:00 2001 From: Bharti Date: Fri, 17 Oct 2025 00:16:28 +0200 Subject: [PATCH 07/22] adding read BT 17 (ubl only) --- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 8de6319a..f9a48240 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -671,6 +671,7 @@ public class ZUGFeRDInvoiceImporter { NodeList headerTradeAgreementNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); String buyerOrderIssuerAssignedID = null; String sellerOrderIssuerAssignedID = null; + String additionalReferencedDocument = null; for (int i = 0; i < headerTradeAgreementNodes.getLength(); i++) { // XMLTools.trimOrNull(nodes.item(i)))) { Node headerTradeAgreementNode = headerTradeAgreementNodes.item(i); @@ -696,6 +697,16 @@ public class ZUGFeRDInvoiceImporter { } } } + //Reading BT-17 + if(headerTradeAgreementChilds.item(agreementChildIndex).getLocalName().equals("AdditionalReferencedDocument")) { + NodeList additionalChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); + for (int additionalChildIndex = 0; additionalChildIndex < additionalChilds.getLength(); additionalChildIndex++){ + if((additionalChilds.item(additionalChildIndex).getLocalName() != null) + && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { + additionalReferencedDocument = XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex)); + } + } + } } } @@ -936,6 +947,9 @@ public class ZUGFeRDInvoiceImporter { zpp.setDespatchAdviceReferencedDocumentID(s); } } +// if (additionalReferencedDocument != null){ +// zpp.setAdditionalReferencedDocuments(additionalReferencedDocument); +// } String invoiceReferencedDocumentID = extractString("//*[local-name()=\"InvoiceReferencedDocument\"]/*[local-name()=\"IssuerAssignedID\"]|//*[local-name()=\"BillingReference\"]/*[local-name()=\"InvoiceDocumentReference\"]/*[local-name()=\"ID\"]"); if (!invoiceReferencedDocumentID.isEmpty()) { zpp.setInvoiceReferencedDocumentID(invoiceReferencedDocumentID); From 08be640dd001e4d0b578e1600919c54d12da8aa0 Mon Sep 17 00:00:00 2001 From: Bharti Date: Fri, 17 Oct 2025 10:29:27 +0200 Subject: [PATCH 08/22] setting BT-17 --- .../org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index ddd841d7..716f9019 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -631,6 +631,12 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } } + if(trans.getTenderReferencedDocument() != null){ + xml += "" + + "" + XMLTools.encodeXML(trans.getTenderReferencedDocument().getID()) + "" + + "" + 50 + "" + + ""; + } if (trans.getSpecifiedProcuringProjectID() != null) { xml += "" + "" + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + ""; From 8da4fe951b465608d8602edace632e80664c6400 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Fri, 17 Oct 2025 16:28:33 +0200 Subject: [PATCH 09/22] reading from cii --- .../org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index f9a48240..45ad9ad1 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -947,9 +947,9 @@ public class ZUGFeRDInvoiceImporter { zpp.setDespatchAdviceReferencedDocumentID(s); } } -// if (additionalReferencedDocument != null){ -// zpp.setAdditionalReferencedDocuments(additionalReferencedDocument); -// } + if (additionalReferencedDocument != null){ + zpp.setTenderReferencedDocument(additionalReferencedDocument); + } String invoiceReferencedDocumentID = extractString("//*[local-name()=\"InvoiceReferencedDocument\"]/*[local-name()=\"IssuerAssignedID\"]|//*[local-name()=\"BillingReference\"]/*[local-name()=\"InvoiceDocumentReference\"]/*[local-name()=\"ID\"]"); if (!invoiceReferencedDocumentID.isEmpty()) { zpp.setInvoiceReferencedDocumentID(invoiceReferencedDocumentID); From 4e3c80da5df3bb8ba1b305b68b92ee742ab9764b Mon Sep 17 00:00:00 2001 From: jstaerk Date: Fri, 17 Oct 2025 17:12:44 +0200 Subject: [PATCH 10/22] reading cii writing date added tests --- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 10 +- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 25 +- .../ZUGFeRD/ZF2ZInvoiceImporterTest.java | 32 +++ library/src/test/resources/bt17/factur-x.xml | 230 ++++++++++++++++++ .../resources/bt17/response_1760553749128.xml | 181 ++++++++++++++ 5 files changed, 474 insertions(+), 4 deletions(-) create mode 100644 library/src/test/resources/bt17/factur-x.xml create mode 100644 library/src/test/resources/bt17/response_1760553749128.xml diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 716f9019..28635a2f 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -634,8 +634,14 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { if(trans.getTenderReferencedDocument() != null){ xml += "" + "" + XMLTools.encodeXML(trans.getTenderReferencedDocument().getID()) + "" - + "" + 50 + "" - + ""; + + "" + 50 + ""; + if (trans.getTenderReferencedDocument().getDate()!=null) { + final SimpleDateFormat dateFormat102 = new SimpleDateFormat("yyyyMMdd"); + xml += ""+XMLTools.encodeXML(dateFormat102.format(trans.getTenderReferencedDocument().getDate()))+""; + } + + + xml += ""; } if (trans.getSpecifiedProcuringProjectID() != null) { xml += "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 45ad9ad1..855384b0 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -606,6 +606,11 @@ public class ZUGFeRDInvoiceImporter { if (!issueDateStr.isEmpty()) { issueDate = parseDate(issueDateStr, "yyyy-MM-dd"); } + + String tenderReference = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); + String tenderReferenceDate = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); + //if (tenderReference!=null) zpp... @todo bt-17 create a ubl with a date and set up an according xpath and if only tenderReference!=null only set that but if tenderReference!=null&&date!=null set both in zpp + String dueDt = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"DueDate\"]").trim(); if (!dueDt.isEmpty()) { dueDate = parseDate(dueDt, "yyyy-MM-dd"); @@ -672,6 +677,7 @@ public class ZUGFeRDInvoiceImporter { String buyerOrderIssuerAssignedID = null; String sellerOrderIssuerAssignedID = null; String additionalReferencedDocument = null; + Date additionalReferencedDocumentDate = null; for (int i = 0; i < headerTradeAgreementNodes.getLength(); i++) { // XMLTools.trimOrNull(nodes.item(i)))) { Node headerTradeAgreementNode = headerTradeAgreementNodes.item(i); @@ -702,9 +708,20 @@ public class ZUGFeRDInvoiceImporter { NodeList additionalChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); for (int additionalChildIndex = 0; additionalChildIndex < additionalChilds.getLength(); additionalChildIndex++){ if((additionalChilds.item(additionalChildIndex).getLocalName() != null) - && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { + && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { additionalReferencedDocument = XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex)); } + if((additionalChilds.item(additionalChildIndex).getLocalName() != null) + && (additionalChilds.item(additionalChildIndex).getLocalName().equals("FormattedIssueDateTime"))) { + NodeList FormattedIssueDateTimeChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); + for (int dateChildIndex = 0; dateChildIndex < FormattedIssueDateTimeChilds.getLength(); dateChildIndex++){ + if((FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName() != null) + && (FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName().equals("DateTimeString"))) { + additionalReferencedDocumentDate = XMLTools.tryDate(FormattedIssueDateTimeChilds.item(dateChildIndex)); + } + + } + } } } } @@ -948,7 +965,11 @@ public class ZUGFeRDInvoiceImporter { } } if (additionalReferencedDocument != null){ - zpp.setTenderReferencedDocument(additionalReferencedDocument); + if (additionalReferencedDocumentDate!=null) { + zpp.setTenderReferencedDocument(new DatedReference(additionalReferencedDocument, additionalReferencedDocumentDate)); + } else { + zpp.setTenderReferencedDocument(additionalReferencedDocument); + } } String invoiceReferencedDocumentID = extractString("//*[local-name()=\"InvoiceReferencedDocument\"]/*[local-name()=\"IssuerAssignedID\"]|//*[local-name()=\"BillingReference\"]/*[local-name()=\"InvoiceDocumentReference\"]/*[local-name()=\"ID\"]"); if (!invoiceReferencedDocumentID.isEmpty()) { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index a9c6b188..ec744ec8 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -191,6 +191,38 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { } + public void testBT17InvoiceImport() { + boolean hasExceptions = false; + Invoice invoice = null; +/* + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter("./target/testout-ZF2PushEdge.pdf"); + + try { + invoice = zii.extractInvoice(); + } catch (XPathExpressionException | ParseException e) { + hasExceptions = true; + } + assertFalse(hasExceptions); + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + // Reading ZUGFeRD + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getID()); + assertNotNull(invoice.getTenderReferencedDocument().getDate()); + assertEquals("2025", sdf.format(invoice.getTenderReferencedDocument().getDate())); +*/ + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(); + try { + zii.setInputStream(new FileInputStream(getResourceAsFile("bt17/response_1760553749128.xml"))); + invoice = zii.extractInvoice(); + } catch (XPathExpressionException | ParseException | FileNotFoundException e) { + hasExceptions = true; + } + assertFalse(hasExceptions); + // Reading ZUGFeRD + assertEquals("Testing1", invoice.getTenderReferencedDocument().getID()); + + } + + public void testZF1Import() { ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter("./target/testout-MustangGnuaccountingBeispielRE-20171118_506zf1.pdf"); diff --git a/library/src/test/resources/bt17/factur-x.xml b/library/src/test/resources/bt17/factur-x.xml new file mode 100644 index 00000000..592bff46 --- /dev/null +++ b/library/src/test/resources/bt17/factur-x.xml @@ -0,0 +1,230 @@ + + + + + + + + urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended + + + + 123 + Rechnung + 380 + + 20251017 + + + document level 1/2 + + + document level 2/2 + + + + + + a123 + + item level 1/1 + + + + 2001015001325 + 4711 + Testprodukt + + + + orderId + xxx + + + 1.0000 + 1.0000 + + + + 1.0000 + + + + VAT + S + 16.00 + + + + 20200113 + + + 20200115 + + + + + false + + 0.02 + item discount + + + 0.98 + + + + + + 0009845 + Test company + + 55232 + teststr + teststadt + DE + + + sender@test.org + + + DE0815 + + + 9990815 + + + + 4304171000002 + Franz Müller + + Franz Müller + + 01779999999 + + + ++49555123456 + + + franz@mueller.de + + + + 55232 + teststr.12 + Hinterhaus 3 + Entenhausen + DE + + + recipient@test.org + + + DE4711 + + + + 9384 + + + 28934 + + + 376zreurzu0983 + + + 90-kl-98798-C + 50 + + + + + just the other side of the street + + 55232 + teststr.12a + Entenhausen + DE + + + + + 20201102 + + + + + Verwendungszweck + CHF + + 0.20 + VAT + 1.28 + S + 72 + 16.00 + + + + 20201001 + + + 20201005 + + + + + true + + 0.50 + quick delivery charge + + VAT + S + 16.00 + + + + + false + + 0.20 + discount + + VAT + S + 16.00 + + + + Please remit until 17.10.2025 + + 20251017 + + + + Cash Discount + + 14 + 2.000 + + + + 0.98 + 0.50 + 0.20 + 1.28 + 0.20 + 1.48 + 0.00 + 1.48 + + + abc123 + + + abcd1234 + + + + diff --git a/library/src/test/resources/bt17/response_1760553749128.xml b/library/src/test/resources/bt17/response_1760553749128.xml new file mode 100644 index 00000000..a54da434 --- /dev/null +++ b/library/src/test/resources/bt17/response_1760553749128.xml @@ -0,0 +1,181 @@ + + + urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended + RE-20170509/505 + 2017-05-09 + 2022-02-28 + 380 + USD + AB321 + + 123 + + + Testing1 + + + + + Ecke 12 + Stadthausen + 12345 + + DE + + + + DE0815 + + VAT + + + + 0815 + + FC + + + + Bei Spiel GmbH + + + + + + + Bahnstr. 42 + Hinterhaus + Spielkreis + 88802 + + Zweiter Stock + + + DE + + + + DE999999999 + + VAT + + + + Theodor Est + + + + + 2017-05-07 + + + Bahnstr. 42 + Hinterhaus + Spielkreis + 88802 + + Zweiter Stock + + + DE + + + + + + Theodor Est + + + + + 54 + + + 14 Tage 2% Skonto, 30 Tage rein netto + + + 0 + + 337.6 + 0 + + K + 0 + Intra-community supply + + VAT + + + + + + 337.6 + 337.6 + 337.6 + 0 + 0 + 0 + 337.6 + + + 1 + 1 + 1.6 + + 1825 + 130 + + + Künstlerische Gestaltung (Stunde): Einer Beispielrechnung + + K + 0 + + VAT + + + + + 160 + 100 + + + + 2 + 400 + 316 + + Bestellerweiterung für E&F Umbau + + K + 0 + + VAT + + + + + 0.79 + 1 + + + + 3 + 200 + 20 + + Heiße Luft pro Liter + + K + 0 + + VAT + + + + + 0.1 + 1 + + + \ No newline at end of file From c3a5f0ef2c73a42c4151dd9159d342da6c21eecb Mon Sep 17 00:00:00 2001 From: Bharti Date: Fri, 17 Oct 2025 21:50:40 +0200 Subject: [PATCH 11/22] Reading BT17 in UBL --- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 8 + .../src/test/resources/bt17/responseDate.xml | 182 ++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 library/src/test/resources/bt17/responseDate.xml diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 855384b0..ad862724 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -610,6 +610,14 @@ public class ZUGFeRDInvoiceImporter { String tenderReference = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); String tenderReferenceDate = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); //if (tenderReference!=null) zpp... @todo bt-17 create a ubl with a date and set up an according xpath and if only tenderReference!=null only set that but if tenderReference!=null&&date!=null set both in zpp + if(tenderReference != null){ + if(tenderReferenceDate != null){ + zpp.setTenderReferencedDocument(new DatedReference(tenderReference, parseDate(tenderReferenceDate, "yyyy-MM-dd"))); + } else { + zpp.setTenderReferencedDocument(tenderReference); + } + + } String dueDt = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"DueDate\"]").trim(); if (!dueDt.isEmpty()) { diff --git a/library/src/test/resources/bt17/responseDate.xml b/library/src/test/resources/bt17/responseDate.xml new file mode 100644 index 00000000..2f7d04da --- /dev/null +++ b/library/src/test/resources/bt17/responseDate.xml @@ -0,0 +1,182 @@ + + + urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended + RE-20170509/505 + 2017-05-09 + 2022-02-28 + 380 + USD + AB321 + + 123 + + + Testing1 + 2018-10-04 + + + + + Ecke 12 + Stadthausen + 12345 + + DE + + + + DE0815 + + VAT + + + + 0815 + + FC + + + + Bei Spiel GmbH + + + + + + + Bahnstr. 42 + Hinterhaus + Spielkreis + 88802 + + Zweiter Stock + + + DE + + + + DE999999999 + + VAT + + + + Theodor Est + + + + + 2017-05-07 + + + Bahnstr. 42 + Hinterhaus + Spielkreis + 88802 + + Zweiter Stock + + + DE + + + + + + Theodor Est + + + + + 54 + + + 14 Tage 2% Skonto, 30 Tage rein netto + + + 0 + + 337.6 + 0 + + K + 0 + Intra-community supply + + VAT + + + + + + 337.6 + 337.6 + 337.6 + 0 + 0 + 0 + 337.6 + + + 1 + 1 + 1.6 + + 1825 + 130 + + + Künstlerische Gestaltung (Stunde): Einer Beispielrechnung + + K + 0 + + VAT + + + + + 160 + 100 + + + + 2 + 400 + 316 + + Bestellerweiterung für E&F Umbau + + K + 0 + + VAT + + + + + 0.79 + 1 + + + + 3 + 200 + 20 + + Heiße Luft pro Liter + + K + 0 + + VAT + + + + + 0.1 + 1 + + + \ No newline at end of file From a60ff926ca72f0332a17f6bd9365e718b01b93d8 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 20 Oct 2025 10:25:48 +0200 Subject: [PATCH 12/22] corrected reading of date --- .../org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java | 3 ++- .../org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index ad862724..9b54612f 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -721,7 +721,8 @@ public class ZUGFeRDInvoiceImporter { } if((additionalChilds.item(additionalChildIndex).getLocalName() != null) && (additionalChilds.item(additionalChildIndex).getLocalName().equals("FormattedIssueDateTime"))) { - NodeList FormattedIssueDateTimeChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); + + NodeList FormattedIssueDateTimeChilds = additionalChilds.item(additionalChildIndex).getChildNodes(); for (int dateChildIndex = 0; dateChildIndex < FormattedIssueDateTimeChilds.getLength(); dateChildIndex++){ if((FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName() != null) && (FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName().equals("DateTimeString"))) { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index ec744ec8..df10da24 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -20,6 +20,7 @@ */ package org.mustangproject.ZUGFeRD; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -178,7 +179,7 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { hasExceptions = true; } assertFalse(hasExceptions); - SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); // Reading ZUGFeRD assertEquals("4711", invoice.getZFItems()[0].getProduct().getSellerAssignedID()); assertEquals("9384", invoice.getSellerOrderReferencedDocumentID()); @@ -188,6 +189,9 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { assertEquals("recipient@test.org", invoice.getRecipient().getEmail()); assertEquals("28934", invoice.getBuyerOrderReferencedDocumentID()); + + + } From 9aa49d148374584b3a1c476f56fab74c7ee59179 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 20 Oct 2025 10:44:09 +0200 Subject: [PATCH 13/22] corrected UBL import --- .../org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 9b54612f..8971ecff 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -610,8 +610,8 @@ public class ZUGFeRDInvoiceImporter { String tenderReference = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); String tenderReferenceDate = extractString("/*[local-name()=\"Invoice\" or local-name()=\"CreditNote\"]/*[local-name()=\"OriginatorDocumentReference\"]/*[local-name()=\"ID\"]").trim(); //if (tenderReference!=null) zpp... @todo bt-17 create a ubl with a date and set up an according xpath and if only tenderReference!=null only set that but if tenderReference!=null&&date!=null set both in zpp - if(tenderReference != null){ - if(tenderReferenceDate != null){ + if((tenderReference != null)&&(!tenderReference.isEmpty())){ + if((tenderReferenceDate != null)&&(!tenderReferenceDate.isEmpty())){ zpp.setTenderReferencedDocument(new DatedReference(tenderReference, parseDate(tenderReferenceDate, "yyyy-MM-dd"))); } else { zpp.setTenderReferencedDocument(tenderReference); From 742fd1df21da6ab57bc98ef4dc1b0c01ec8dcf24 Mon Sep 17 00:00:00 2001 From: Bharti Date: Mon, 20 Oct 2025 22:49:53 +0200 Subject: [PATCH 14/22] Reading BT17 based on typecode --- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 8971ecff..623c491b 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -686,6 +686,8 @@ public class ZUGFeRDInvoiceImporter { String sellerOrderIssuerAssignedID = null; String additionalReferencedDocument = null; Date additionalReferencedDocumentDate = null; + int typeC = 0; + for (int i = 0; i < headerTradeAgreementNodes.getLength(); i++) { // XMLTools.trimOrNull(nodes.item(i)))) { Node headerTradeAgreementNode = headerTradeAgreementNodes.item(i); @@ -712,33 +714,41 @@ public class ZUGFeRDInvoiceImporter { } } //Reading BT-17 - if(headerTradeAgreementChilds.item(agreementChildIndex).getLocalName().equals("AdditionalReferencedDocument")) { + if (headerTradeAgreementChilds.item(agreementChildIndex).getLocalName().equals("AdditionalReferencedDocument")) { NodeList additionalChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); - for (int additionalChildIndex = 0; additionalChildIndex < additionalChilds.getLength(); additionalChildIndex++){ - if((additionalChilds.item(additionalChildIndex).getLocalName() != null) - && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { - additionalReferencedDocument = XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex)); + for (int additionalChildIndex = 0; additionalChildIndex < additionalChilds.getLength(); additionalChildIndex++) { + + if ((additionalChilds.item(additionalChildIndex).getLocalName() != null) + && additionalChilds.item(additionalChildIndex).getLocalName().equals("TypeCode")) { + typeC = Integer.parseInt(XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex))); } - if((additionalChilds.item(additionalChildIndex).getLocalName() != null) - && (additionalChilds.item(additionalChildIndex).getLocalName().equals("FormattedIssueDateTime"))) { + if (typeC == 50) { + if ((additionalChilds.item(additionalChildIndex).getLocalName() != null) + && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { + additionalReferencedDocument = XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex)); + } + if ((additionalChilds.item(additionalChildIndex).getLocalName() != null) + && (additionalChilds.item(additionalChildIndex).getLocalName().equals("FormattedIssueDateTime"))) { + + NodeList FormattedIssueDateTimeChilds = additionalChilds.item(additionalChildIndex).getChildNodes(); + for (int dateChildIndex = 0; dateChildIndex < FormattedIssueDateTimeChilds.getLength(); dateChildIndex++) { + if ((FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName() != null) + && (FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName().equals("DateTimeString"))) { + additionalReferencedDocumentDate = XMLTools.tryDate(FormattedIssueDateTimeChilds.item(dateChildIndex)); + } - NodeList FormattedIssueDateTimeChilds = additionalChilds.item(additionalChildIndex).getChildNodes(); - for (int dateChildIndex = 0; dateChildIndex < FormattedIssueDateTimeChilds.getLength(); dateChildIndex++){ - if((FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName() != null) - && (FormattedIssueDateTimeChilds.item(dateChildIndex).getLocalName().equals("DateTimeString"))) { - additionalReferencedDocumentDate = XMLTools.tryDate(FormattedIssueDateTimeChilds.item(dateChildIndex)); } - } } } } } } - } + + String currency = extractString("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]/*[local-name()=\"InvoiceCurrencyCode\"]|//*[local-name()=\"DocumentCurrencyCode\"]"); zpp.setCurrency(currency); @@ -973,6 +983,7 @@ public class ZUGFeRDInvoiceImporter { zpp.setDespatchAdviceReferencedDocumentID(s); } } + if (additionalReferencedDocument != null){ if (additionalReferencedDocumentDate!=null) { zpp.setTenderReferencedDocument(new DatedReference(additionalReferencedDocument, additionalReferencedDocumentDate)); From 517d210e0072a031b55e37781a1fa801e461d319 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 21 Oct 2025 09:57:10 +0200 Subject: [PATCH 15/22] only add as tender reference in cii if typecode=50 --- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 623c491b..093f6032 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -686,7 +686,6 @@ public class ZUGFeRDInvoiceImporter { String sellerOrderIssuerAssignedID = null; String additionalReferencedDocument = null; Date additionalReferencedDocumentDate = null; - int typeC = 0; for (int i = 0; i < headerTradeAgreementNodes.getLength(); i++) { // XMLTools.trimOrNull(nodes.item(i)))) { @@ -713,6 +712,9 @@ public class ZUGFeRDInvoiceImporter { } } } + int typeC = 0; + additionalReferencedDocument=null; + additionalReferencedDocumentDate=null; //Reading BT-17 if (headerTradeAgreementChilds.item(agreementChildIndex).getLocalName().equals("AdditionalReferencedDocument")) { NodeList additionalChilds = headerTradeAgreementChilds.item(agreementChildIndex).getChildNodes(); @@ -722,7 +724,7 @@ public class ZUGFeRDInvoiceImporter { && additionalChilds.item(additionalChildIndex).getLocalName().equals("TypeCode")) { typeC = Integer.parseInt(XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex))); } - if (typeC == 50) { + if ((additionalChilds.item(additionalChildIndex).getLocalName() != null) && (additionalChilds.item(additionalChildIndex).getLocalName().equals("IssuerAssignedID"))) { additionalReferencedDocument = XMLTools.trimOrNull(additionalChilds.item(additionalChildIndex)); @@ -739,7 +741,17 @@ public class ZUGFeRDInvoiceImporter { } } + + } + if (typeC == 50) { + if (additionalReferencedDocument != null){ + if (additionalReferencedDocumentDate!=null) { + zpp.setTenderReferencedDocument(new DatedReference(additionalReferencedDocument, additionalReferencedDocumentDate)); + } else { + zpp.setTenderReferencedDocument(additionalReferencedDocument); + } } + } } } @@ -984,13 +996,6 @@ public class ZUGFeRDInvoiceImporter { } } - if (additionalReferencedDocument != null){ - if (additionalReferencedDocumentDate!=null) { - zpp.setTenderReferencedDocument(new DatedReference(additionalReferencedDocument, additionalReferencedDocumentDate)); - } else { - zpp.setTenderReferencedDocument(additionalReferencedDocument); - } - } String invoiceReferencedDocumentID = extractString("//*[local-name()=\"InvoiceReferencedDocument\"]/*[local-name()=\"IssuerAssignedID\"]|//*[local-name()=\"BillingReference\"]/*[local-name()=\"InvoiceDocumentReference\"]/*[local-name()=\"ID\"]"); if (!invoiceReferencedDocumentID.isEmpty()) { zpp.setInvoiceReferencedDocumentID(invoiceReferencedDocumentID); From c59204289fdc9a508e7e596aed7e6b5ab121e75f Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 27 Oct 2025 14:27:20 +0100 Subject: [PATCH 16/22] using IReferencedDocument instead of IDatedReference --- .../org/mustangproject/DatedReference.java | 46 ------------------- .../main/java/org/mustangproject/Invoice.java | 8 ++-- .../main/java/org/mustangproject/Item.java | 16 +++++-- .../ZUGFeRD/IDatedReference.java | 10 ---- .../ZUGFeRD/IExportableTransaction.java | 2 +- .../ZUGFeRD/IZUGFeRDExportableItem.java | 16 +++++-- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 4 +- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 20 ++++++-- 8 files changed, 47 insertions(+), 75 deletions(-) delete mode 100644 library/src/main/java/org/mustangproject/DatedReference.java delete mode 100644 library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java diff --git a/library/src/main/java/org/mustangproject/DatedReference.java b/library/src/main/java/org/mustangproject/DatedReference.java deleted file mode 100644 index 5d5ca70f..00000000 --- a/library/src/main/java/org/mustangproject/DatedReference.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.mustangproject; - -import org.mustangproject.ZUGFeRD.IDatedReference; - -import java.beans.BeanProperty; -import java.util.Date; - -public class DatedReference implements IDatedReference { - - protected String ID; - protected Date opDate; - - public DatedReference setDate(Date opDate) { - this.opDate = opDate; - return this; - } - - public DatedReference setID(String ID) { - this.ID = ID; - return this; - } - - public DatedReference() { - - } - - public DatedReference(String ID) { - setID(ID); - } - - public DatedReference(String ID, Date theDate) { - setID(ID); - setDate(theDate); - } - - - @Override - public String getID() { - return ID; - } - - @Override - public Date getDate() { - return opDate; - } -} diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index a625ec6d..dc883f20 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -54,7 +54,7 @@ public class Invoice implements IExportableTransaction { protected BigDecimal totalPrepaidAmount = null; protected Date detailedDeliveryDateStart = null; protected Date detailedDeliveryPeriodEnd = null; - protected IDatedReference tenderReference = null; + protected IReferencedDocument tenderReference = null; protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(), LogisticsServiceCharges = new ArrayList<>(); @@ -151,7 +151,7 @@ public class Invoice implements IExportableTransaction { /*** * BT-17 */ - public IDatedReference getTenderReferencedDocument() { + public IReferencedDocument getTenderReferencedDocument() { return tenderReference; } @@ -161,13 +161,13 @@ public class Invoice implements IExportableTransaction { * @param dr * @return */ - public Invoice setTenderReferencedDocument(DatedReference dr) { + public Invoice setTenderReferencedDocument(ReferencedDocument dr) { tenderReference=dr; return this; } public Invoice setTenderReferencedDocument(String ID) { - DatedReference dr=new DatedReference(ID); + ReferencedDocument dr=new ReferencedDocument(ID); setTenderReferencedDocument(dr); return this; } diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 5a3853a0..205d144d 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -3,10 +3,7 @@ package org.mustangproject; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; -import org.mustangproject.ZUGFeRD.IReferencedDocument; -import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge; -import org.mustangproject.ZUGFeRD.IZUGFeRDExportableItem; -import org.mustangproject.ZUGFeRD.LineCalculator; +import org.mustangproject.ZUGFeRD.*; import org.mustangproject.util.NodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -38,6 +35,7 @@ public class Item implements IZUGFeRDExportableItem { protected String id; protected String buyerOrderReferencedDocumentLineID = null; protected String buyerOrderReferencedDocumentID = null; + protected IReferencedDocument tenderReferencedDocument=null; protected Product product; protected ArrayList notes = null; protected ArrayList referencedDocuments = null; @@ -622,6 +620,16 @@ public class Item implements IZUGFeRDExportableItem { return detailedDeliveryPeriodTo; } + @Override + public IReferencedDocument getTenderReferencedDocument() { + return tenderReferencedDocument; + } + + public Item getTenderReferencedDocument(IReferencedDocument idr) { + tenderReferencedDocument=idr; + return this; + } + public IZUGFeRDExportableItem addNotes(Collection notes) { if (notes == null) { return this; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java deleted file mode 100644 index af1adf38..00000000 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IDatedReference.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.mustangproject.ZUGFeRD; - -import java.util.Date; - -public interface IDatedReference { - public String getID(); - default Date getDate() { - return null; - } -} diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index 8d317b1a..c191ca78 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -219,7 +219,7 @@ public interface IExportableTransaction { * * @return mandatory ID, optional Date */ - default IDatedReference getTenderReferencedDocument() { + default IReferencedDocument getTenderReferencedDocument() { return null; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 05d86170..54873510 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -156,12 +156,20 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ } - /*** - * specifies the item level delivery period (there is also one on document level), - * this will be included in a BillingSpecifiedPeriod element - * @return the beginning of the delivery period + * tender reference on line level BT-128 + * @return BT-17 on line level */ + default IReferencedDocument getTenderReferencedDocument() { + return null; + } + + + /*** + * specifies the item level delivery period (there is also one on document level), + * this will be included in a BillingSpecifiedPeriod element + * @return the beginning of the delivery period + */ default Date getDetailedDeliveryPeriodFrom() { return null; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 093f6032..44698f62 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -612,7 +612,7 @@ public class ZUGFeRDInvoiceImporter { //if (tenderReference!=null) zpp... @todo bt-17 create a ubl with a date and set up an according xpath and if only tenderReference!=null only set that but if tenderReference!=null&&date!=null set both in zpp if((tenderReference != null)&&(!tenderReference.isEmpty())){ if((tenderReferenceDate != null)&&(!tenderReferenceDate.isEmpty())){ - zpp.setTenderReferencedDocument(new DatedReference(tenderReference, parseDate(tenderReferenceDate, "yyyy-MM-dd"))); + zpp.setTenderReferencedDocument(new ReferencedDocument(tenderReference, parseDate(tenderReferenceDate, "yyyy-MM-dd"))); } else { zpp.setTenderReferencedDocument(tenderReference); } @@ -746,7 +746,7 @@ public class ZUGFeRDInvoiceImporter { if (typeC == 50) { if (additionalReferencedDocument != null){ if (additionalReferencedDocumentDate!=null) { - zpp.setTenderReferencedDocument(new DatedReference(additionalReferencedDocument, additionalReferencedDocumentDate)); + zpp.setTenderReferencedDocument(new ReferencedDocument(additionalReferencedDocument, additionalReferencedDocumentDate)); } else { zpp.setTenderReferencedDocument(additionalReferencedDocument); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 740412ae..a82b160d 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -145,14 +145,25 @@ public class ZF2EdgeTest extends MustangReaderTestCase { } @Override - public IDatedReference getTenderReferencedDocument() { - return new IDatedReference() { + public IReferencedDocument getTenderReferencedDocument() { + return new IReferencedDocument() { @Override - public String getID() { + public String getIssuerAssignedID() { return "983-jk-787"; } + @Override - public Date getDate() { + public String getTypeCode() { + return "50"; + } + + @Override + public String getReferenceTypeCode() { + return ""; + } + + @Override + public Date getFormattedIssueDateTime() { SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); try { return sdf.parse("2025-10-12"); @@ -161,6 +172,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase { } return null; // wont happen either } + }; } From a30780b411ef669c6014f65c88646b408003a5d5 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 27 Oct 2025 14:37:56 +0100 Subject: [PATCH 17/22] adding tenderreferenceddocument on line level --- library/src/main/java/org/mustangproject/Item.java | 8 +++++++- .../main/java/org/mustangproject/ReferencedDocument.java | 4 ++++ .../org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java | 6 +++--- .../test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java | 8 +++++--- .../mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java | 6 +++--- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 205d144d..2273c9da 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -625,11 +625,17 @@ public class Item implements IZUGFeRDExportableItem { return tenderReferencedDocument; } - public Item getTenderReferencedDocument(IReferencedDocument idr) { + public Item setTenderReferencedDocument(IReferencedDocument idr) { tenderReferencedDocument=idr; return this; } + public Item setTenderReferencedDocument(String id) { + ReferencedDocument rd=new ReferencedDocument(id); + setTenderReferencedDocument(rd); + return this; + } + public IZUGFeRDExportableItem addNotes(Collection notes) { if (notes == null) { return this; diff --git a/library/src/main/java/org/mustangproject/ReferencedDocument.java b/library/src/main/java/org/mustangproject/ReferencedDocument.java index 7a1c04a0..01a975a2 100644 --- a/library/src/main/java/org/mustangproject/ReferencedDocument.java +++ b/library/src/main/java/org/mustangproject/ReferencedDocument.java @@ -17,6 +17,10 @@ public class ReferencedDocument implements IReferencedDocument { String referenceTypeCode; Date formattedIssueDateTime; + public ReferencedDocument() { + //bean + } + public ReferencedDocument(String issuerAssignedID, String typeCode, String referenceTypeCode) { this(issuerAssignedID); this.typeCode = typeCode; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 28635a2f..51da4a63 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -633,11 +633,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { if(trans.getTenderReferencedDocument() != null){ xml += "" - + "" + XMLTools.encodeXML(trans.getTenderReferencedDocument().getID()) + "" + + "" + XMLTools.encodeXML(trans.getTenderReferencedDocument().getIssuerAssignedID()) + "" + "" + 50 + ""; - if (trans.getTenderReferencedDocument().getDate()!=null) { + if (trans.getTenderReferencedDocument().getFormattedIssueDateTime()!=null) { final SimpleDateFormat dateFormat102 = new SimpleDateFormat("yyyyMMdd"); - xml += ""+XMLTools.encodeXML(dateFormat102.format(trans.getTenderReferencedDocument().getDate()))+""; + xml += ""+XMLTools.encodeXML(dateFormat102.format(trans.getTenderReferencedDocument().getFormattedIssueDateTime()))+""; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 041f4a25..218136b9 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -596,7 +596,9 @@ public class ZF2PushTest extends TestCase { try { SchemedID gtin = new SchemedID("0160", "2001015001325"); SchemedID gln = new SchemedID("0088", "4304171000002"); - DatedReference dr=new DatedReference("90-kl-98798-C", sdf.parse("2025-10-12")); + ReferencedDocument dr1=new ReferencedDocument("90-kl-98798-C", sdf.parse("2025-10-12")); + ReferencedDocument dr2=new ReferencedDocument("90-kl-98798-C1", sdf.parse("2025-10-13")); + dr2.setReferenceTypeCode("AAG"); ze.setTransaction(new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setPaymentReference("Verwendungszweck").setDocumentName("Rechnung") .setSellerOrderReferencedDocumentID("9384").setBuyerOrderReferencedDocumentID("28934") .setDetailedDeliveryPeriod(new SimpleDateFormat("yyyyMMdd").parse(occurrenceFrom), new SimpleDateFormat("yyyyMMdd").parse(occurrenceTo)) @@ -605,11 +607,11 @@ public class ZF2PushTest extends TestCase { .setContractReferencedDocument(contractID) .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addGlobalID(gln).setEmail("recipient@test.org").addVATID("DE4711") .setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE").setFax("++49555123456")).setAdditionalAddress("Hinterhaus 3")) - .addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).setId("a123").addBuyerOrderReferencedDocumentID("orderId").addBuyerOrderReferencedDocumentLineID("xxx").addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) + .addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).setId("a123").setTenderReferencedDocument(dr2).addBuyerOrderReferencedDocumentID("orderId").addBuyerOrderReferencedDocumentLineID("xxx").addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) .addCharge(new Charge(new BigDecimal(0.5)).setReason("quick delivery charge").setTaxPercent(new BigDecimal(16))) .addAllowance(new Allowance(new BigDecimal(0.2)).setReason("discount").setTaxPercent(new BigDecimal(16))) .addCashDiscount(new CashDiscount(new BigDecimal(2), 14)) - .setTenderReferencedDocument(dr) + .setTenderReferencedDocument(dr1) .setDeliveryDate(sdf.parse("2020-11-02")).setNumber(number).setVATDueDateTypeCode(EventTimeCodeTypeConstants.PAYMENT_DATE) .setInvoiceReferencedDocumentID("abc123").addInvoiceReferencedDocument(new ReferencedDocument("abcd1234")) ); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index df10da24..99314cd9 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -183,8 +183,8 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { // Reading ZUGFeRD assertEquals("4711", invoice.getZFItems()[0].getProduct().getSellerAssignedID()); assertEquals("9384", invoice.getSellerOrderReferencedDocumentID()); - assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getID()); - assertEquals("2025-10-12", sdf.format(invoice.getTenderReferencedDocument().getDate())); + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); + assertEquals("2025-10-12", sdf.format(invoice.getTenderReferencedDocument().getFormattedIssueDateTime())); assertEquals("sender@test.org", invoice.getSender().getEmail()); assertEquals("recipient@test.org", invoice.getRecipient().getEmail()); assertEquals("28934", invoice.getBuyerOrderReferencedDocumentID()); @@ -222,7 +222,7 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { } assertFalse(hasExceptions); // Reading ZUGFeRD - assertEquals("Testing1", invoice.getTenderReferencedDocument().getID()); + assertEquals("Testing1", invoice.getTenderReferencedDocument().getIssuerAssignedID()); } From e7927c8b13fd2a6635848d6b8fa6fa264f02f130 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 27 Oct 2025 15:23:44 +0100 Subject: [PATCH 18/22] added a test --- library/src/main/java/org/mustangproject/Item.java | 6 +++--- .../mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 2273c9da..719caf83 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -35,7 +35,7 @@ public class Item implements IZUGFeRDExportableItem { protected String id; protected String buyerOrderReferencedDocumentLineID = null; protected String buyerOrderReferencedDocumentID = null; - protected IReferencedDocument tenderReferencedDocument=null; + protected ReferencedDocument tenderReferencedDocument=null; protected Product product; protected ArrayList notes = null; protected ArrayList referencedDocuments = null; @@ -621,11 +621,11 @@ public class Item implements IZUGFeRDExportableItem { } @Override - public IReferencedDocument getTenderReferencedDocument() { + public ReferencedDocument getTenderReferencedDocument() { return tenderReferencedDocument; } - public Item setTenderReferencedDocument(IReferencedDocument idr) { + public Item setTenderReferencedDocument(ReferencedDocument idr) { tenderReferencedDocument=idr; return this; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index 99314cd9..cf16512c 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -183,6 +183,15 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { // Reading ZUGFeRD assertEquals("4711", invoice.getZFItems()[0].getProduct().getSellerAssignedID()); assertEquals("9384", invoice.getSellerOrderReferencedDocumentID()); + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); + + IReferencedDocument rd=invoice.getZFItems()[0].getTenderReferencedDocument(); + assertEquals("90-kl-98798-C1", rd.getIssuerAssignedID()); + assertEquals("AAG", rd.getReferenceTypeCode()); + assertEquals("2025-10-13", sdf.format(rd.getFormattedIssueDateTime())); + + + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); assertEquals("2025-10-12", sdf.format(invoice.getTenderReferencedDocument().getFormattedIssueDateTime())); assertEquals("sender@test.org", invoice.getSender().getEmail()); From 7b7a0f54f22d71cc3f0f94f7d30f92422c3fc763 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 28 Oct 2025 10:57:58 +0100 Subject: [PATCH 19/22] star ubl testing 128 --- .../main/java/org/mustangproject/Item.java | 12 + .../ZUGFeRD/ZF2ZInvoiceImporterTest.java | 31 +- library/src/test/resources/bt17/factur-x.xml | 230 ----------- .../src/test/resources/bt17/responseDate.xml | 182 --------- .../bt17-response_1760553749128.cii.xml} | 0 library/src/test/resources/ubl/BT-128.ubl.xml | 365 ++++++++++++++++++ 6 files changed, 401 insertions(+), 419 deletions(-) delete mode 100644 library/src/test/resources/bt17/factur-x.xml delete mode 100644 library/src/test/resources/bt17/responseDate.xml rename library/src/test/resources/{bt17/response_1760553749128.xml => cii/bt17-response_1760553749128.cii.xml} (100%) create mode 100644 library/src/test/resources/ubl/BT-128.ubl.xml diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 719caf83..54dfa708 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -88,6 +88,9 @@ public class Item implements IZUGFeRDExportableItem { icnm.getAsNodeMap("ClassifiedTaxCategory") .flatMap(m -> m.getAsBigDecimal("Percent")) .ifPresent(product::setVATPercent); + + + }); itemMap.getAsNodeMap("AssociatedDocumentLineDocument") .flatMap(icnm -> icnm.getAsString("LineID")) @@ -129,6 +132,15 @@ public class Item implements IZUGFeRDExportableItem { product = new Product(); } } + itemMap.getAsNodeMap("DocumentReference").ifPresent(drnm -> { + // BT-128 + ReferencedDocument rd=getTenderReferencedDocument(); + if (rd==null) { + rd=new ReferencedDocument(); + } + drnm.getAsString("ID").ifPresent(rd::setIssuerAssignedID); + drnm.getAsString("DocumentTypeCode").ifPresent(rd::setTypeCode); + }); itemMap.getAsNodeMap("SpecifiedLineTradeAgreement", "SpecifiedSupplyChainTradeAgreement").ifPresent(icnm -> { icnm.getAsNodeMap("BuyerOrderReferencedDocument") diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index cf16512c..e946dbf1 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -207,7 +207,7 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { public void testBT17InvoiceImport() { boolean hasExceptions = false; Invoice invoice = null; -/* + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter("./target/testout-ZF2PushEdge.pdf"); try { @@ -218,13 +218,11 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { assertFalse(hasExceptions); SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); // Reading ZUGFeRD - assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getID()); - assertNotNull(invoice.getTenderReferencedDocument().getDate()); - assertEquals("2025", sdf.format(invoice.getTenderReferencedDocument().getDate())); -*/ - ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(); + assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); + assertNotNull(invoice.getTenderReferencedDocument().getFormattedIssueDateTime()); + assertEquals("2025", sdf.format(invoice.getTenderReferencedDocument().getFormattedIssueDateTime())); try { - zii.setInputStream(new FileInputStream(getResourceAsFile("bt17/response_1760553749128.xml"))); + zii.setInputStream(new FileInputStream(getResourceAsFile("cii/bt17-response_1760553749128.cii"))); invoice = zii.extractInvoice(); } catch (XPathExpressionException | ParseException | FileNotFoundException e) { hasExceptions = true; @@ -235,6 +233,25 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { } + public void testBT128InvoiceImport() { + boolean hasExceptions = false; + Invoice invoice = null; + + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(); + try { + zii.setInputStream(new FileInputStream(getResourceAsFile("ubl/BT-128.ubl.xml"))); + + invoice = zii.extractInvoice(); + } catch (XPathExpressionException | ParseException | FileNotFoundException e) { + hasExceptions = true; + } + assertFalse(hasExceptions); + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + // Reading ZUGFeRD + assertEquals("90-kl-98798-C1", invoice.getZFItems()[0].getTenderReferencedDocument().getIssuerAssignedID()); + assertEquals("AAG", invoice.getZFItems()[0].getTenderReferencedDocument().getReferenceTypeCode()); + + } public void testZF1Import() { diff --git a/library/src/test/resources/bt17/factur-x.xml b/library/src/test/resources/bt17/factur-x.xml deleted file mode 100644 index 592bff46..00000000 --- a/library/src/test/resources/bt17/factur-x.xml +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended - - - - 123 - Rechnung - 380 - - 20251017 - - - document level 1/2 - - - document level 2/2 - - - - - - a123 - - item level 1/1 - - - - 2001015001325 - 4711 - Testprodukt - - - - orderId - xxx - - - 1.0000 - 1.0000 - - - - 1.0000 - - - - VAT - S - 16.00 - - - - 20200113 - - - 20200115 - - - - - false - - 0.02 - item discount - - - 0.98 - - - - - - 0009845 - Test company - - 55232 - teststr - teststadt - DE - - - sender@test.org - - - DE0815 - - - 9990815 - - - - 4304171000002 - Franz Müller - - Franz Müller - - 01779999999 - - - ++49555123456 - - - franz@mueller.de - - - - 55232 - teststr.12 - Hinterhaus 3 - Entenhausen - DE - - - recipient@test.org - - - DE4711 - - - - 9384 - - - 28934 - - - 376zreurzu0983 - - - 90-kl-98798-C - 50 - - - - - just the other side of the street - - 55232 - teststr.12a - Entenhausen - DE - - - - - 20201102 - - - - - Verwendungszweck - CHF - - 0.20 - VAT - 1.28 - S - 72 - 16.00 - - - - 20201001 - - - 20201005 - - - - - true - - 0.50 - quick delivery charge - - VAT - S - 16.00 - - - - - false - - 0.20 - discount - - VAT - S - 16.00 - - - - Please remit until 17.10.2025 - - 20251017 - - - - Cash Discount - - 14 - 2.000 - - - - 0.98 - 0.50 - 0.20 - 1.28 - 0.20 - 1.48 - 0.00 - 1.48 - - - abc123 - - - abcd1234 - - - - diff --git a/library/src/test/resources/bt17/responseDate.xml b/library/src/test/resources/bt17/responseDate.xml deleted file mode 100644 index 2f7d04da..00000000 --- a/library/src/test/resources/bt17/responseDate.xml +++ /dev/null @@ -1,182 +0,0 @@ - - - urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended - RE-20170509/505 - 2017-05-09 - 2022-02-28 - 380 - USD - AB321 - - 123 - - - Testing1 - 2018-10-04 - - - - - Ecke 12 - Stadthausen - 12345 - - DE - - - - DE0815 - - VAT - - - - 0815 - - FC - - - - Bei Spiel GmbH - - - - - - - Bahnstr. 42 - Hinterhaus - Spielkreis - 88802 - - Zweiter Stock - - - DE - - - - DE999999999 - - VAT - - - - Theodor Est - - - - - 2017-05-07 - - - Bahnstr. 42 - Hinterhaus - Spielkreis - 88802 - - Zweiter Stock - - - DE - - - - - - Theodor Est - - - - - 54 - - - 14 Tage 2% Skonto, 30 Tage rein netto - - - 0 - - 337.6 - 0 - - K - 0 - Intra-community supply - - VAT - - - - - - 337.6 - 337.6 - 337.6 - 0 - 0 - 0 - 337.6 - - - 1 - 1 - 1.6 - - 1825 - 130 - - - Künstlerische Gestaltung (Stunde): Einer Beispielrechnung - - K - 0 - - VAT - - - - - 160 - 100 - - - - 2 - 400 - 316 - - Bestellerweiterung für E&F Umbau - - K - 0 - - VAT - - - - - 0.79 - 1 - - - - 3 - 200 - 20 - - Heiße Luft pro Liter - - K - 0 - - VAT - - - - - 0.1 - 1 - - - \ No newline at end of file diff --git a/library/src/test/resources/bt17/response_1760553749128.xml b/library/src/test/resources/cii/bt17-response_1760553749128.cii.xml similarity index 100% rename from library/src/test/resources/bt17/response_1760553749128.xml rename to library/src/test/resources/cii/bt17-response_1760553749128.cii.xml diff --git a/library/src/test/resources/ubl/BT-128.ubl.xml b/library/src/test/resources/ubl/BT-128.ubl.xml new file mode 100644 index 00000000..30ab45f4 --- /dev/null +++ b/library/src/test/resources/ubl/BT-128.ubl.xml @@ -0,0 +1,365 @@ + + + urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0 + urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 + Test_EeISI_100 + 2018-11-12 + 2018-11-30 + 380 + #AAA#invoice note text + #AAA#invoice note text 2 + EUR + NOK + uvz + 123 + + 2018-11-12 + 2018-11-30 + + + abc + def + + + + abc123 + 2018-10-04 + + + + lmn + + + ghi + + + 789 + + + Supporting document ref + Supporting document descr + + ZGVmYXVsdA== + + External document location + + + + + rst + 130 + + + 456 + + + + Seller electronic address + + Seller identifier 1 + + + Seller identifier 2 + + + Seller trading name + + + Seller address line 1 + Seller address line 2 + Seller city + 12345 + Seller country subdivision + + Seller address line 3 + + + DE + + + + DE12345677 + + VAT + + + + DE49294093 + + FC + + + + Seller name + Seller additional legal information + + + Seller contact point + +41 345 654455 + seller@contact.de + + + + + + Buyer electronic address + + Buyer identifier + + + Buyer trading name + + + Buyer address line 1 + Buyer address line 2 + Buyer city + 34562 + Buyer country subdivision + + Buyer address line 3 + + + IE + + + + IE394838894 + + VAT + + + + Buyer name + Buyer legal registration identifier + + + Buyer contact point + +353 2948584 + buyer@contact.ie + + + + + + Payee identifier + + + Payee name + + + + + Tax representative name + + + Tax representative address line 1 + Tax representative address line 2 + Tax representative city + 23455 + Tax representative country subdivision + + Tax representative address line 3 + + + DE + + + + DE3949053 + + VAT + + + + + 2018-12-04 + + deliver location identifier + + Deliver to address line 1 + Deliver to address line 2 + Deliver to city + 98765 + Deliver to country subdivision + + Deliver to address line 3 + + + IE + + + + + + Deliver to party name + + + + + total amount + + + false + 95 + Doc allowance reason text + 1.00 + 10 + 1000 + + S + 5 + + VAT + + + + + true + AAA + Doc charge reason text + 1.00 + 10 + 1000 + + S + 5 + + VAT + + + + + 50 + + 1000 + 50 + + S + 5 + + VAT + + + + + 1000 + 0 + + E + 0 + VATEX-EU-O + Exemtion reason text + + VAT + + + + + + 46 + + + 200 + 200 + 205 + 10 + 10 + 0 + 205 + + + 1a + Invoice line note + 10 + 1000 + 6789 + + 2018-11-12 + 2018-11-30 + + + 12345 + + + Line object identifier + 130 + + + false + 95 + Invoice line allowance reason + 1.00 + 10 + 1000 + + + true + AAA + Invoice line charge reason + 1.00 + 10 + 1000 + + + Item description + Item name + + Item buyer's identifier + + + Item seller's identifier + + + Item standar identifier + + + IT + + + Item classification identifier0 + + + S + 5 + + VAT + + + + Color + Red + + + Size + L + + + + 10 + 1 + + false + 1 + 11 + + + + + 1b + 10 + 1000 + + Item name 2 + + E + 0 + + VAT + + + + + 10 + + + From 1cedd281b919e4814f4e0939b68462ba31424565 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 28 Oct 2025 13:46:10 +0100 Subject: [PATCH 20/22] make ubl reading possible --- .../src/main/java/org/mustangproject/Item.java | 15 ++++++++++++++- library/src/test/resources/ubl/BT-128.ubl.xml | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 54dfa708..3249419d 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -138,8 +138,21 @@ public class Item implements IZUGFeRDExportableItem { if (rd==null) { rd=new ReferencedDocument(); } - drnm.getAsString("ID").ifPresent(rd::setIssuerAssignedID); + Node idNode=drnm.getNode("ID").get(); + if (idNode!=null) { + rd.setIssuerAssignedID(idNode.getTextContent()); + Node schemeIDAttr; + + schemeIDAttr=idNode.getAttributes().getNamedItem("schemeID"); + if (schemeIDAttr!=null) { + rd.setReferenceTypeCode(schemeIDAttr.getNodeValue()); + } + } + drnm.getAsString("DocumentTypeCode").ifPresent(rd::setTypeCode); + if (rd!=null) { + setTenderReferencedDocument(rd); + } }); itemMap.getAsNodeMap("SpecifiedLineTradeAgreement", "SpecifiedSupplyChainTradeAgreement").ifPresent(icnm -> { diff --git a/library/src/test/resources/ubl/BT-128.ubl.xml b/library/src/test/resources/ubl/BT-128.ubl.xml index 30ab45f4..fa9b13b5 100644 --- a/library/src/test/resources/ubl/BT-128.ubl.xml +++ b/library/src/test/resources/ubl/BT-128.ubl.xml @@ -281,7 +281,7 @@ 12345 - Line object identifier + 90-kl-98798-C1 130 From 775448f45a235882c1b54b4b14e148d3160ac325 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Wed, 29 Oct 2025 08:43:03 +0100 Subject: [PATCH 21/22] reverting redundant BT-128 changes --- .../main/java/org/mustangproject/Item.java | 37 ------------------- .../mustangproject/ReferencedDocument.java | 21 +++++++++-- .../ZUGFeRD/IZUGFeRDExportableItem.java | 8 ---- .../mustangproject/ZUGFeRD/ZF2PushTest.java | 3 +- .../ZUGFeRD/ZF2ZInvoiceImporterTest.java | 11 +++--- 5 files changed, 24 insertions(+), 56 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 3249419d..eff70131 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -35,7 +35,6 @@ public class Item implements IZUGFeRDExportableItem { protected String id; protected String buyerOrderReferencedDocumentLineID = null; protected String buyerOrderReferencedDocumentID = null; - protected ReferencedDocument tenderReferencedDocument=null; protected Product product; protected ArrayList notes = null; protected ArrayList referencedDocuments = null; @@ -132,28 +131,7 @@ public class Item implements IZUGFeRDExportableItem { product = new Product(); } } - itemMap.getAsNodeMap("DocumentReference").ifPresent(drnm -> { - // BT-128 - ReferencedDocument rd=getTenderReferencedDocument(); - if (rd==null) { - rd=new ReferencedDocument(); - } - Node idNode=drnm.getNode("ID").get(); - if (idNode!=null) { - rd.setIssuerAssignedID(idNode.getTextContent()); - Node schemeIDAttr; - schemeIDAttr=idNode.getAttributes().getNamedItem("schemeID"); - if (schemeIDAttr!=null) { - rd.setReferenceTypeCode(schemeIDAttr.getNodeValue()); - } - } - - drnm.getAsString("DocumentTypeCode").ifPresent(rd::setTypeCode); - if (rd!=null) { - setTenderReferencedDocument(rd); - } - }); itemMap.getAsNodeMap("SpecifiedLineTradeAgreement", "SpecifiedSupplyChainTradeAgreement").ifPresent(icnm -> { icnm.getAsNodeMap("BuyerOrderReferencedDocument") @@ -645,21 +623,6 @@ public class Item implements IZUGFeRDExportableItem { return detailedDeliveryPeriodTo; } - @Override - public ReferencedDocument getTenderReferencedDocument() { - return tenderReferencedDocument; - } - - public Item setTenderReferencedDocument(ReferencedDocument idr) { - tenderReferencedDocument=idr; - return this; - } - - public Item setTenderReferencedDocument(String id) { - ReferencedDocument rd=new ReferencedDocument(id); - setTenderReferencedDocument(rd); - return this; - } public IZUGFeRDExportableItem addNotes(Collection notes) { if (notes == null) { diff --git a/library/src/main/java/org/mustangproject/ReferencedDocument.java b/library/src/main/java/org/mustangproject/ReferencedDocument.java index 01a975a2..b5eb239a 100644 --- a/library/src/main/java/org/mustangproject/ReferencedDocument.java +++ b/library/src/main/java/org/mustangproject/ReferencedDocument.java @@ -2,6 +2,7 @@ package org.mustangproject; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.Date; import org.mustangproject.ZUGFeRD.IReferencedDocument; @@ -40,7 +41,7 @@ public class ReferencedDocument implements IReferencedDocument { this(issuerAssingedID); this.formattedIssueDateTime = formattedIssueDateTime; } - + public ReferencedDocument(String issuerAssignedID) { this.issuerAssignedID = issuerAssignedID; } @@ -55,6 +56,7 @@ public class ReferencedDocument implements IReferencedDocument { /** * which type is the document? e.g. "916" for additional invoice related + * * @param typeCode as String, e.g. 916 */ public void setTypeCode(String typeCode) { @@ -63,6 +65,7 @@ public class ReferencedDocument implements IReferencedDocument { /** * type of the reference of this line, a UNTDID 1153 code + * * @param referenceTypeCode three uppercase character reference type code as string */ public void setReferenceTypeCode(String referenceTypeCode) { @@ -94,8 +97,7 @@ public class ReferencedDocument implements IReferencedDocument { } @Override - public Date getFormattedIssueDateTime() - { + public Date getFormattedIssueDateTime() { return formattedIssueDateTime; } @@ -104,9 +106,20 @@ public class ReferencedDocument implements IReferencedDocument { return null; } NodeMap nodes = new NodeMap(node); - return new ReferencedDocument(nodes.getAsStringOrNull("IssuerAssignedID", "ID"), + ReferencedDocument rd = new ReferencedDocument(nodes.getAsStringOrNull("IssuerAssignedID", "ID"), nodes.getAsStringOrNull("TypeCode", "DocumentTypeCode"), nodes.getAsStringOrNull("ReferenceTypeCode"), XMLTools.tryDate(nodes.getAsStringOrNull("FormattedIssueDateTime"))); + if (nodes.getAsStringOrNull("ID") != null) { + //sure sign for UBL: here ReferenceTypeCode is no element but a "schemeID" attribute to ID + Node idNode = nodes.getNode("ID").get(); + if (idNode != null) { + Node schemeIDAttr = idNode.getAttributes().getNamedItem("schemeID"); + if (schemeIDAttr != null) { + rd.setReferenceTypeCode(schemeIDAttr.getNodeValue()); + } + } + } + return rd; } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 54873510..05f4d437 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -156,14 +156,6 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ } - /*** - * tender reference on line level BT-128 - * @return BT-17 on line level - */ - default IReferencedDocument getTenderReferencedDocument() { - return null; - } - /*** * specifies the item level delivery period (there is also one on document level), diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 218136b9..c8a4c3bd 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -607,7 +607,8 @@ public class ZF2PushTest extends TestCase { .setContractReferencedDocument(contractID) .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addGlobalID(gln).setEmail("recipient@test.org").addVATID("DE4711") .setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE").setFax("++49555123456")).setAdditionalAddress("Hinterhaus 3")) - .addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).setId("a123").setTenderReferencedDocument(dr2).addBuyerOrderReferencedDocumentID("orderId").addBuyerOrderReferencedDocumentLineID("xxx").addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) + .addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).setId("a123"). + addAdditionalReference(dr2).addBuyerOrderReferencedDocumentID("orderId").addBuyerOrderReferencedDocumentLineID("xxx").addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) .addCharge(new Charge(new BigDecimal(0.5)).setReason("quick delivery charge").setTaxPercent(new BigDecimal(16))) .addAllowance(new Allowance(new BigDecimal(0.2)).setReason("discount").setTaxPercent(new BigDecimal(16))) .addCashDiscount(new CashDiscount(new BigDecimal(2), 14)) diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index e946dbf1..24c9cac1 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -185,10 +185,9 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { assertEquals("9384", invoice.getSellerOrderReferencedDocumentID()); assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); - IReferencedDocument rd=invoice.getZFItems()[0].getTenderReferencedDocument(); - assertEquals("90-kl-98798-C1", rd.getIssuerAssignedID()); - assertEquals("AAG", rd.getReferenceTypeCode()); - assertEquals("2025-10-13", sdf.format(rd.getFormattedIssueDateTime())); + IReferencedDocument[] rd=invoice.getZFItems()[0].getAdditionalReferences(); + assertEquals("90-kl-98798-C1", rd[0].getIssuerAssignedID()); + assertEquals("AAG", rd[0].getReferenceTypeCode()); @@ -248,8 +247,8 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { assertFalse(hasExceptions); SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); // Reading ZUGFeRD - assertEquals("90-kl-98798-C1", invoice.getZFItems()[0].getTenderReferencedDocument().getIssuerAssignedID()); - assertEquals("AAG", invoice.getZFItems()[0].getTenderReferencedDocument().getReferenceTypeCode()); + assertEquals("90-kl-98798-C1", invoice.getZFItems()[0].getAdditionalReferences()[0].getIssuerAssignedID()); + assertEquals("AAG", invoice.getZFItems()[0].getAdditionalReferences()[0].getReferenceTypeCode()); } From a4cb76ac0459516acc750028fc24eeffd3601ee0 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Wed, 29 Oct 2025 08:54:47 +0100 Subject: [PATCH 22/22] corrected test --- .../org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index 24c9cac1..e9c65968 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -215,13 +215,13 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { hasExceptions = true; } assertFalse(hasExceptions); - SimpleDateFormat sdf=new SimpleDateFormat("YYYY-mm-dd"); + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); // Reading ZUGFeRD assertEquals("90-kl-98798-C", invoice.getTenderReferencedDocument().getIssuerAssignedID()); assertNotNull(invoice.getTenderReferencedDocument().getFormattedIssueDateTime()); - assertEquals("2025", sdf.format(invoice.getTenderReferencedDocument().getFormattedIssueDateTime())); + assertEquals("2025-10-12", sdf.format(invoice.getTenderReferencedDocument().getFormattedIssueDateTime())); try { - zii.setInputStream(new FileInputStream(getResourceAsFile("cii/bt17-response_1760553749128.cii"))); + zii.setInputStream(new FileInputStream(getResourceAsFile("cii/bt17-response_1760553749128.cii.xml"))); invoice = zii.extractInvoice(); } catch (XPathExpressionException | ParseException | FileNotFoundException e) { hasExceptions = true;