diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index c1ebc382..e3123b7a 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -56,7 +56,7 @@ public class Invoice implements IExportableTransaction { protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(), LogisticsServiceCharges = new ArrayList<>(); - protected IZUGFeRDPaymentTerms paymentTerms = null; + protected ArrayList paymentTerms = new ArrayList<>(); protected String invoiceReferencedDocumentID = null; protected Date invoiceReferencedIssueDate; @@ -646,15 +646,43 @@ public class Invoice implements IExportableTransaction { @Override public IZUGFeRDPaymentTerms getPaymentTerms() { - return paymentTerms; + if (!paymentTerms.isEmpty()) { + return paymentTerms.get(0); + } + return null; } - public Invoice setPaymentTerms(IZUGFeRDPaymentTerms paymentTerms) { - this.paymentTerms = paymentTerms; + public Invoice setPaymentTerms(IZUGFeRDPaymentTerms paymentTerm) { + if (paymentTerms.isEmpty()) { + paymentTerms.add(paymentTerm); + } + else { + paymentTerms.set(0, paymentTerm); + } return this; } @Override + public IZUGFeRDPaymentTerms[] getExtendedPaymentTerms() { + return paymentTerms.toArray(new IZUGFeRDPaymentTerms[0]); + } + + public Invoice setExtendedPaymentTerms(IZUGFeRDPaymentTerms[] paymentTerms) { + this.paymentTerms.clear(); + this.paymentTerms.addAll(Arrays.asList(paymentTerms)); + return this; + } + + /** + * Set multiple payment terms when using the EXTENDED profile. + * @return + */ + public Invoice addPaymentTerms(IZUGFeRDPaymentTerms paymentTerm) { + paymentTerms.add(paymentTerm); + return this; + } + + public String getPaymentReference() { return paymentReference; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index 686afd44..9ce55ef1 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -305,8 +305,7 @@ public interface IExportableTransaction { } /** - * get payment terms. if set, getPaymentTermDescription() and getDueDate() are - * ignored + * get payment terms. if set, getPaymentTermDescription() and getDueDate() are ignored * * @return the IZUGFeRDPaymentTerms of the invoice */ @@ -318,6 +317,14 @@ public interface IExportableTransaction { return null; } + /** + * Get payment terms for the EXTENDED profile (multiple terms are allowed) + * @return + */ + default IZUGFeRDPaymentTerms[] getExtendedPaymentTerms() { + return new IZUGFeRDPaymentTerms[0]; + } + /** * returns if a rebate agreements exists * diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index eb3ff49c..f6329d52 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -506,36 +506,44 @@ public class OXPullProvider extends ZUGFeRD2PullProvider { private String buildPaymentTermsXml() { - final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); - if (paymentTerms == null) { + final IZUGFeRDPaymentTerms[] paymentTerms = trans.getExtendedPaymentTerms(); + + 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..87e6f479 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.getExtendedPaymentTerms(); - 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 cbf52cf2..c0674e61 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -969,56 +969,70 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } private String buildPaymentTermsXml() { - final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); - if (paymentTerms == null) { + final IZUGFeRDPaymentTerms[] paymentTerms = trans.getExtendedPaymentTerms(); + + 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..f095372b 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -240,13 +240,11 @@ 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 PaymentTerms( + "14 Tage 2% Skonto, 30 Tage rein netto", + due,// fälligkeitsdatum + paymentDiscountTerms //PaymentDiscountTerms + ); } @Override