From 68294ea9d2ef838e82ec04f56eb35506f79ef632 Mon Sep 17 00:00:00 2001 From: Jens Nober Date: Fri, 30 Aug 2024 09:15:25 +0200 Subject: [PATCH] Issue #458 Allow multiple PaymentTerms for in Invoice --- .../main/java/org/mustangproject/Invoice.java | 14 ++- .../ZUGFeRD/IExportableTransaction.java | 2 +- .../ZUGFeRD/OXPullProvider.java | 48 +++++----- .../ZUGFeRD/ZUGFeRD1PullProvider.java | 79 ++++++++++------- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 88 +++++++++++-------- .../mustangproject/ZUGFeRD/ZF2EdgeTest.java | 16 ++-- .../org/mustangproject/ZUGFeRD/ZF2Test.java | 2 +- 7 files changed, 146 insertions(+), 103 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index 639663b9..0544f0b0 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -28,6 +28,7 @@ import org.mustangproject.ZUGFeRD.*; import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; /*** @@ -56,7 +57,7 @@ public class Invoice implements IExportableTransaction { protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(), LogisticsServiceCharges = new ArrayList<>(); - protected IZUGFeRDPaymentTerms paymentTerms = null; + protected IZUGFeRDPaymentTerms[] paymentTerms = null; protected String invoiceReferencedDocumentID = null; protected Date invoiceReferencedIssueDate; @@ -641,15 +642,22 @@ public class Invoice implements IExportableTransaction { @Override - public IZUGFeRDPaymentTerms getPaymentTerms() { + public IZUGFeRDPaymentTerms[] getPaymentTerms() { return paymentTerms; } - public Invoice setPaymentTerms(IZUGFeRDPaymentTerms paymentTerms) { + @JsonProperty + public Invoice setPaymentTerms(IZUGFeRDPaymentTerms[] paymentTerms) { this.paymentTerms = paymentTerms; return this; } + public Invoice setPaymentTerms(IZUGFeRDPaymentTerms paymentTerms) { + this.paymentTerms = new IZUGFeRDPaymentTerms[] { paymentTerms }; + return this; + } + + @Override public TradeParty getDeliveryAddress() { return deliveryAddress; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index 0a013ba3..2c9e9d53 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -310,7 +310,7 @@ public interface IExportableTransaction { * * @return the IZUGFeRDPaymentTerms of the invoice */ - default IZUGFeRDPaymentTerms getPaymentTerms() { + default IZUGFeRDPaymentTerms[] getPaymentTerms() { return null; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index 7347d422..0ff721e9 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -505,36 +505,44 @@ public class OXPullProvider extends ZUGFeRD2PullProvider { private String buildPaymentTermsXml() { - final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); - if (paymentTerms == null) { + final IZUGFeRDPaymentTerms[] paymentTerms = trans.getPaymentTerms(); + + String paymentTermsXml = ""; + if (paymentTerms == null || paymentTerms.length == 0) { return ""; } - String paymentTermsXml = ""; - final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms(); - paymentTermsXml += "" + paymentTerms.getDescription() + ""; - if (discountTerms != null) { - paymentTermsXml += ""; - final String currency = trans.getCurrency(); - final String basisAmount = currencyFormat(calc.getGrandTotal()); - paymentTermsXml += "" + basisAmount + ""; - paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() + for (IZUGFeRDPaymentTerms pt : paymentTerms) + { + paymentTermsXml += ""; + + final IZUGFeRDPaymentDiscountTerms discountTerms = pt.getDiscountTerms(); + paymentTermsXml += "" + pt.getDescription() + ""; + if (discountTerms != null) + { + paymentTermsXml += ""; + final String currency = trans.getCurrency(); + final String basisAmount = currencyFormat(calc.getGrandTotal()); + paymentTermsXml += "" + basisAmount + ""; + paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() + ""; - if (discountTerms.getBaseDate() != null) { - final Date baseDate = discountTerms.getBaseDate(); - paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(baseDate); - paymentTermsXml += ""; + if (discountTerms.getBaseDate() != null) + { + final Date baseDate = discountTerms.getBaseDate(); + paymentTermsXml += ""; + paymentTermsXml += DATE.udtFormat(baseDate); + paymentTermsXml += ""; - paymentTermsXml += "" + paymentTermsXml += "" + discountTerms.getBasePeriodMeasure() + ""; + } + + paymentTermsXml += ""; } - paymentTermsXml += ""; + paymentTermsXml += ""; } - - paymentTermsXml += ""; return paymentTermsXml; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index b98abebc..6708a6a7 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -433,44 +433,57 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider { } private String buildPaymentTermsXml() { - String paymentTermsXml = ""; + final IZUGFeRDPaymentTerms[] paymentTerms = trans.getPaymentTerms(); - final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); - final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms(); - final Date dueDate = paymentTerms.getDueDate(); - if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) { - throw new IllegalStateException( + String paymentTermsXml = ""; + if (paymentTerms == null || paymentTerms.length == 0) { + return paymentTermsXml; + } + + for (IZUGFeRDPaymentTerms pt : paymentTerms) + { + paymentTermsXml += ""; + + final IZUGFeRDPaymentDiscountTerms discountTerms = pt.getDiscountTerms(); + final Date dueDate = pt.getDueDate(); + if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) + { + throw new IllegalStateException( "if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified"); - } - paymentTermsXml += "" + paymentTerms.getDescription() + ""; - if (dueDate != null) { - paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(dueDate); - paymentTermsXml += ""; - } - - if (discountTerms != null) { - paymentTermsXml += ""; - final String currency = trans.getCurrency(); - final String basisAmount = currencyFormat(calc.getGrandTotal()); - paymentTermsXml += "" + basisAmount + ""; - paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() - + ""; - - if (discountTerms.getBaseDate() != null) { - final Date baseDate = discountTerms.getBaseDate(); - paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(baseDate); - paymentTermsXml += ""; - - paymentTermsXml += "" - + discountTerms.getBasePeriodMeasure() + ""; + } + paymentTermsXml += "" + pt.getDescription() + ""; + if (dueDate != null) + { + paymentTermsXml += ""; + paymentTermsXml += DATE.udtFormat(dueDate); + paymentTermsXml += ""; } - paymentTermsXml += ""; - } + if (discountTerms != null) + { + paymentTermsXml += ""; + final String currency = trans.getCurrency(); + final String basisAmount = currencyFormat(calc.getGrandTotal()); + paymentTermsXml += "" + basisAmount + ""; + paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() + + ""; - paymentTermsXml += ""; + if (discountTerms.getBaseDate() != null) + { + final Date baseDate = discountTerms.getBaseDate(); + paymentTermsXml += ""; + paymentTermsXml += DATE.udtFormat(baseDate); + paymentTermsXml += ""; + + paymentTermsXml += "" + + discountTerms.getBasePeriodMeasure() + ""; + } + + paymentTermsXml += ""; + } + + paymentTermsXml += ""; + } return paymentTermsXml; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 192582f4..e397a4c3 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -963,56 +963,70 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } private String buildPaymentTermsXml() { - final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); - if (paymentTerms == null) { + final IZUGFeRDPaymentTerms[] paymentTerms = trans.getPaymentTerms(); + + String paymentTermsXml = ""; + if (paymentTerms == null || paymentTerms.length == 0) { return ""; } - String paymentTermsXml = ""; - final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms(); - final Date dueDate = paymentTerms.getDueDate(); - if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) { - throw new IllegalStateException( - "if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified"); - } - paymentTermsXml += "" + paymentTerms.getDescription() + ""; + for (IZUGFeRDPaymentTerms pt : paymentTerms) + { - if (dueDate != null) { - paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(dueDate); - paymentTermsXml += ""; - } + paymentTermsXml += ""; - if (trans.getTradeSettlement() != null) { - for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) { - if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) { - paymentTermsXml += payment.getPaymentXML(); + final IZUGFeRDPaymentDiscountTerms discountTerms = pt.getDiscountTerms(); + final Date dueDate = pt.getDueDate(); + if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) + { + throw new IllegalStateException( + "if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified"); + } + paymentTermsXml += "" + pt.getDescription() + ""; + + if (dueDate != null) + { + paymentTermsXml += ""; + paymentTermsXml += DATE.udtFormat(dueDate); + paymentTermsXml += ""; + } + + if (trans.getTradeSettlement() != null) + { + for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) + { + if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) + { + paymentTermsXml += payment.getPaymentXML(); + } } } - } - if (discountTerms != null) { - paymentTermsXml += ""; - final String currency = trans.getCurrency(); - final String basisAmount = currencyFormat(calc.getGrandTotal()); - paymentTermsXml += "" + basisAmount + ""; - paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() - + ""; + if (discountTerms != null) + { + paymentTermsXml += ""; + final String currency = trans.getCurrency(); + final String basisAmount = currencyFormat(calc.getGrandTotal()); + paymentTermsXml += "" + basisAmount + ""; + paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString() + + ""; - if (discountTerms.getBaseDate() != null) { - final Date baseDate = discountTerms.getBaseDate(); - paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(baseDate); - paymentTermsXml += ""; + if (discountTerms.getBaseDate() != null) + { + final Date baseDate = discountTerms.getBaseDate(); + paymentTermsXml += ""; + paymentTermsXml += DATE.udtFormat(baseDate); + paymentTermsXml += ""; - paymentTermsXml += "" - + discountTerms.getBasePeriodMeasure() + ""; + paymentTermsXml += "" + + discountTerms.getBasePeriodMeasure() + ""; + } + + paymentTermsXml += ""; } - paymentTermsXml += ""; + paymentTermsXml += ""; } - - paymentTermsXml += ""; return paymentTermsXml; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 4708b09a..84af8ca2 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -225,7 +225,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase { } @Override - public IZUGFeRDPaymentTerms getPaymentTerms() { + public IZUGFeRDPaymentTerms[] getPaymentTerms() { PaymentDiscountTerms paymentDiscountTerms = new PaymentDiscountTerms( new BigDecimal(2), // skonto prozent @@ -240,13 +240,13 @@ public class ZF2EdgeTest extends MustangReaderTestCase { e.printStackTrace(); } - return - new PaymentTerms( - "14 Tage 2% Skonto, 30 Tage rein netto", - due,// fälligkeitsdatum - paymentDiscountTerms //PaymentDiscountTerms - ); - + return new IZUGFeRDPaymentTerms[]{ + new PaymentTerms( + "14 Tage 2% Skonto, 30 Tage rein netto", + due,// fälligkeitsdatum + paymentDiscountTerms //PaymentDiscountTerms + ) + }; } @Override diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java index d945c770..8bd721e9 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java @@ -243,7 +243,7 @@ public class ZF2Test extends MustangReaderTestCase { try { assertEquals(zi.getVersion(), 2); } catch (final Exception e) { - // TODO Auto-generated catch block + // TCalODO Auto-generated catch block e.printStackTrace(); } }