From 37c1b3a1af590908fb99744d96b443379f050fe2 Mon Sep 17 00:00:00 2001 From: Roland Fredenhagen Date: Mon, 7 Oct 2024 14:29:21 +0200 Subject: [PATCH 1/4] Update documentation for `IExportableTransaction.getReferenceNumber()` --- .../mustangproject/ZUGFeRD/IExportableTransaction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index f43b5f62..060216cd 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -322,10 +322,10 @@ public interface IExportableTransaction { } /** - * get reference document number typically used for Invoice Corrections Will be - * added as IncludedNote in comfort profile - * - * @return the ID of the document this document refers to + * get BuyerReference (BT-10) an identifier assigned by the buyer and used + * for internal routing. Used for the Leitweg-ID. + * + * @return the BuyerReference of this document */ default String getReferenceNumber() { return null; From f4e9528fa799d0e3054e0c0e156d38e76d67df8b Mon Sep 17 00:00:00 2001 From: Thomas Christlieb Date: Wed, 27 Nov 2024 09:26:20 +0100 Subject: [PATCH 2/4] allow setting payment means and payment means information - also allow reading them in importer, fixes #516 --- .../java/org/mustangproject/DirectDebit.java | 30 +++++++++++++++++++ .../ZUGFeRD/IZUGFeRDTradeSettlementDebit.java | 14 +++++++-- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 18 ++++++++++- .../org/mustangproject/ZUGFeRD/DXTest.java | 10 +++++++ .../org/mustangproject/ZUGFeRD/OXTest.java | 10 +++++++ .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 23 +++++++++++++- 6 files changed, 101 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/org/mustangproject/DirectDebit.java b/library/src/main/java/org/mustangproject/DirectDebit.java index 86937a0f..eaa1333f 100644 --- a/library/src/main/java/org/mustangproject/DirectDebit.java +++ b/library/src/main/java/org/mustangproject/DirectDebit.java @@ -20,6 +20,16 @@ public class DirectDebit implements IZUGFeRDTradeSettlementDebit { */ protected String mandate; + /** + * payment means code (BT-81 / UNTDID 4461) + */ + protected String paymentMeansCode = "59"; + + /** + * Payment means description (BT-82) + */ + protected String paymentMeansInformation = "SEPA direct debit"; + /** * bean constructor */ @@ -38,6 +48,16 @@ public class DirectDebit implements IZUGFeRDTradeSettlementDebit { this.mandate = mandate; } + public DirectDebit setPaymentMeansCode(String paymentMeansCode) { + this.paymentMeansCode = paymentMeansCode; + return this; + } + + public DirectDebit setPaymentMeansInformation(String paymentMeansInformation) { + this.paymentMeansInformation = paymentMeansInformation; + return this; + } + /*** * getter for the IBAN * @return IBAN @@ -57,6 +77,16 @@ public class DirectDebit implements IZUGFeRDTradeSettlementDebit { return this.mandate; } + @Override + public String getPaymentMeansCode() { + return this.paymentMeansCode; + } + + @Override + public String getPaymentMeansInformation() { + return this.paymentMeansInformation; + } + public DirectDebit setMandate(String mandate) { this.mandate = mandate; return this; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java index 7402b92c..f188bfbb 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDTradeSettlementDebit.java @@ -25,8 +25,8 @@ public interface IZUGFeRDTradeSettlementDebit extends IZUGFeRDTradeSettlement { @Override default String getSettlementXML() { String xml = "" - + "59" - + "SEPA direct debit" + + "" + XMLTools.encodeXML(getPaymentMeansCode()) + "" + + "" + XMLTools.encodeXML(getPaymentMeansInformation()) + "" + "" + "" + XMLTools.encodeXML(getIBAN()) + "" + ""; @@ -51,4 +51,14 @@ public interface IZUGFeRDTradeSettlementDebit extends IZUGFeRDTradeSettlement { */ String getMandate(); + /*** + * @return payment means code (BT-81 / UNTDID 4461) + */ + String getPaymentMeansCode(); + + /*** + * @return payment means description (BT-82) (optional) + */ + String getPaymentMeansInformation(); + } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index aa249cd6..0417990d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -659,7 +659,7 @@ public class ZUGFeRDInvoiceImporter { NodeList headerTradeSettlementNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); List bankDetails = new ArrayList<>(); String directDebitMandateID = null; - String IBAN = null, BIC = null; + String IBAN = null, BIC = null, paymentMeansCode = null, paymentMeansInformation = null; for (int i = 0; i < headerTradeSettlementNodes.getLength(); i++) { // XMLTools.trimOrNull(nodes.item(i)))) { @@ -693,8 +693,18 @@ public class ZUGFeRDInvoiceImporter { NodeList paymentMeansChilds = headerTradeSettlementChilds.item(settlementChildIndex).getChildNodes(); IBAN = null; BIC = null; + paymentMeansCode = null; + paymentMeansInformation = null; for (int paymentMeansChildIndex = 0; paymentMeansChildIndex < paymentMeansChilds.getLength(); paymentMeansChildIndex++) { + if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("TypeCode"))) { + paymentMeansCode = XMLTools.trimOrNull(paymentMeansChilds.item(paymentMeansChildIndex)); + } + + if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("Information"))) { + paymentMeansInformation = XMLTools.trimOrNull(paymentMeansChilds.item(paymentMeansChildIndex)); + } + if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayeePartyCreditorFinancialAccount") || paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayerPartyDebtorFinancialAccount"))) { NodeList accountChilds = paymentMeansChilds.item(paymentMeansChildIndex).getChildNodes(); for (int accountChildIndex = 0; accountChildIndex < accountChilds.getLength(); accountChildIndex++) { @@ -795,6 +805,12 @@ public class ZUGFeRDInvoiceImporter { if ((directDebitMandateID != null) && (IBAN != null)) { DirectDebit d = new DirectDebit(IBAN, directDebitMandateID); + if (paymentMeansCode != null) { + d.setPaymentMeansCode(paymentMeansCode); + } + if (paymentMeansInformation != null) { + d.setPaymentMeansInformation(paymentMeansInformation); + } zpp.getSender().addDebitDetails(d); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/DXTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/DXTest.java index 56839121..5e4a5316 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/DXTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/DXTest.java @@ -109,6 +109,16 @@ public class DXTest extends MustangReaderTestCase { return "DE99XX12345"; } + @Override + public String getPaymentMeansCode() { + return "54"; + } + + @Override + public String getPaymentMeansInformation() { + return "Credit Card"; + } + } @Override diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java index f5fa0ab2..28c6f6e9 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java @@ -106,6 +106,16 @@ public class OXTest extends MustangReaderTestCase { return "DE99XX12345"; } + @Override + public String getPaymentMeansCode() { + return "54"; + } + + @Override + public String getPaymentMeansInformation() { + return "Credit Card"; + } + } @Override diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index a0fd5304..baac90df 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -100,6 +100,16 @@ public class ZF2EdgeTest extends MustangReaderTestCase { return "DE99XX12345"; } + @Override + public String getPaymentMeansCode() { + return "54"; + } + + @Override + public String getPaymentMeansInformation() { + return "Credit Card"; + } + } @Override @@ -264,6 +274,16 @@ public class ZF2EdgeTest extends MustangReaderTestCase { return "123"; } + @Override + public String getPaymentMeansCode() { + return "42"; + } + + @Override + public String getPaymentMeansInformation() { + return "Überweisung"; + } + /** * Create the test case * @@ -314,7 +334,8 @@ public class ZF2EdgeTest extends MustangReaderTestCase { // now check the contents (like MustangReaderTest) ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF); String resultXML=zi.getUTF8(); - assertTrue(resultXML.contains("59")); + assertTrue(resultXML.contains("54")); + assertTrue(resultXML.contains("Credit Card")); assertTrue(resultXML.contains("")); assertTrue(resultXML.contains("DE540815")); assertTrue(resultXML.contains(" Date: Mon, 6 Jan 2025 11:34:53 +0100 Subject: [PATCH 3/4] Update README.md Fix small typo --- validator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/README.md b/validator/README.md index 95805615..360dc63b 100644 --- a/validator/README.md +++ b/validator/README.md @@ -185,7 +185,7 @@ Permissive Open Source APL2, see LICENSE | 23 | Not a PDF/A-3 | | 24 | Issues in CEN EN16931 Schematron Check | | 25 | Unsupported profile type | -| 26 | No rules matched, XML to minimal? | +| 26 | No rules matched, XML too minimal? | ## History From 9baba41d3c42061e6ab1f7c69c2ad5e3fc668fd9 Mon Sep 17 00:00:00 2001 From: Adrian-Devries Date: Mon, 6 Jan 2025 11:35:59 +0100 Subject: [PATCH 4/4] Update XMLValidator.java Fix typo --- .../main/java/org/mustangproject/validator/XMLValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java index 77061ab9..c8bd3475 100644 --- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java @@ -523,7 +523,7 @@ public class XMLValidator extends Validator { if (firedRules == 0) { - context.addResultItem(new ValidationResultItem(ESeverity.error, "No rules matched, XML to minimal?").setSection(26) + context.addResultItem(new ValidationResultItem(ESeverity.error, "No rules matched, XML too minimal?").setSection(26) .setPart(EPart.fx)); }