diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
index 33a35e8c..920ab7d2 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
@@ -262,6 +262,16 @@ public interface IZUGFeRDExportableTransaction {
return null;
}
+ /**
+ * get payment terms. if set, getPaymentTermDescription() and getDueDate() are
+ * ignored
+ *
+ * @return
+ */
+ default IZUGFeRDPaymentTerms getPaymentTerms() {
+ return null;
+ }
+
/**
* get reference document number typically used for Invoice Corrections Will be added as IncludedNote in comfort profile
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java
new file mode 100644
index 00000000..ebb6bee0
--- /dev/null
+++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentDiscountTerms.java
@@ -0,0 +1,15 @@
+package org.mustangproject.ZUGFeRD;
+
+import java.math.BigDecimal;
+
+public interface IZUGFeRDPaymentDiscountTerms {
+
+ BigDecimal getCalculationPercentage();
+
+ IZUGFeRDDate getBaseDate();
+
+ int getBasePeriodMeasure();
+
+ String getBasePeriodUnitCode();
+
+}
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java
new file mode 100644
index 00000000..f49215bc
--- /dev/null
+++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDPaymentTerms.java
@@ -0,0 +1,10 @@
+package org.mustangproject.ZUGFeRD;
+
+public interface IZUGFeRDPaymentTerms {
+
+ String getDescription();
+
+ IZUGFeRDDate getDueDate();
+
+ IZUGFeRDPaymentDiscountTerms getDiscountTerms();
+}
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java
index 5b143d5e..8724edf8 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java
@@ -499,29 +499,30 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
}
}
- xml = xml + " \n" //$NON-NLS-1$
- + " "+
- paymentTermsDescription
- + "\n";
-
- if (trans.getTradeSettlement()!=null) {
- for (IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
- if(payment!=null) {
- xml+=payment.getPaymentXML();
+ if (trans.getPaymentTerms() == null) {
+ xml = xml + " \n" //$NON-NLS-1$
+ + " " + paymentTermsDescription + "\n";
+
+ if (trans.getTradeSettlement() != null) {
+ for (IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
+ if (payment != null) {
+ xml += payment.getPaymentXML();
+ }
}
}
+
+ if (hasDueDate) {
+ xml = xml + " " // $NON-NLS-2$
+ + zugferdDateFormat.format(trans.getDueDate())
+ + "\n";// 20130704 //$NON-NLS-1$
+
+ }
+ xml = xml + " \n"; //$NON-NLS-1$
+ } else {
+ xml = xml + buildPaymentTermsXml();
}
- if(hasDueDate) {
- xml=xml+" " //$NON-NLS-2$
- + zugferdDateFormat.format(trans.getDueDate()) + "\n";// 20130704 //$NON-NLS-1$
-
- }
-
-
-
- xml = xml + " \n" //$NON-NLS-1$
- + " \n" //$NON-NLS-1$
+ xml = xml + " \n" //$NON-NLS-1$
+ " " + currencyFormat(getTotal()) + "\n" //$NON-NLS-1$ //$NON-NLS-2$
// currencyID=\"EUR\"
+ " 0.00\n" //$NON-NLS-1$ currencyID=\"EUR\"
@@ -571,4 +572,48 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
} // $NON-NLS-1$
}
+ private String buildPaymentTermsXml() {
+ String paymentTermsXml = "";
+
+ IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms();
+ IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms();
+ IZUGFeRDDate 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() + "";
+ if (dueDate != null) {
+ paymentTermsXml += "";
+ paymentTermsXml += ""
+ + dueDate.getFormat().getFormatter().format(dueDate.getDate()) + "";
+ paymentTermsXml += "";
+ }
+
+ if (discountTerms != null) {
+ paymentTermsXml += "";
+ String currency = trans.getCurrency();
+ String basisAmount = currencyFormat(getTotalGross());
+ paymentTermsXml += "" + basisAmount + "";
+ paymentTermsXml += "" + discountTerms.getCalculationPercentage().toString()
+ + "";
+
+ if (discountTerms.getBaseDate() != null) {
+ Date baseDate = discountTerms.getBaseDate().getDate();
+ ZUGFeRDDateFormat baseDateFormat = discountTerms.getBaseDate().getFormat();
+ paymentTermsXml += "";
+ paymentTermsXml += "" + baseDateFormat.getFormatter().format(baseDate) + "";
+ paymentTermsXml += "";
+
+ paymentTermsXml += ""
+ + discountTerms.getBasePeriodMeasure() + "";
+ }
+
+ paymentTermsXml += "";
+ }
+
+ paymentTermsXml += "";
+ return paymentTermsXml;
+ }
+
}
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
index e7fca721..b89f17de 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
@@ -44,6 +44,7 @@ import org.mustangproject.ZUGFeRD.model.ExchangedDocumentType;
import org.mustangproject.ZUGFeRD.model.IDType;
import org.mustangproject.ZUGFeRD.model.IndicatorType;
import org.mustangproject.ZUGFeRD.model.LogisticsServiceChargeType;
+import org.mustangproject.ZUGFeRD.model.MeasureType;
import org.mustangproject.ZUGFeRD.model.NoteType;
import org.mustangproject.ZUGFeRD.model.NoteTypeConstants;
import org.mustangproject.ZUGFeRD.model.ObjectFactory;
@@ -67,6 +68,7 @@ import org.mustangproject.ZUGFeRD.model.TextType;
import org.mustangproject.ZUGFeRD.model.TradeAddressType;
import org.mustangproject.ZUGFeRD.model.TradeAllowanceChargeType;
import org.mustangproject.ZUGFeRD.model.TradePartyType;
+import org.mustangproject.ZUGFeRD.model.TradePaymentDiscountTermsType;
import org.mustangproject.ZUGFeRD.model.TradePaymentTermsType;
import org.mustangproject.ZUGFeRD.model.TradePriceType;
import org.mustangproject.ZUGFeRD.model.TradeProductType;
@@ -675,6 +677,9 @@ class ZUGFeRDTransactionModelConverter {
private Collection getPaymentTerms() {
+ if (trans.getPaymentTerms() != null) {
+ return handlePaymentTermsObject(trans.getPaymentTerms());
+ }
List paymentTerms = new ArrayList<>();
TradePaymentTermsType paymentTerm = xmlFactory
@@ -701,6 +706,69 @@ class ZUGFeRDTransactionModelConverter {
return paymentTerms;
}
+ private Collection handlePaymentTermsObject(IZUGFeRDPaymentTerms paymentTerms) {
+ List xmlPaymentTerms = new ArrayList<>();
+
+ TradePaymentTermsType paymentTerm = xmlFactory.createTradePaymentTermsType();
+
+ TextType paymentTermDescr = xmlFactory.createTextType();
+
+ String paymentTermDescription = paymentTerms.getDescription();
+ if (paymentTermDescription == null) {
+ paymentTermDescription = "";
+ }
+ paymentTermDescr.setValue(paymentTermDescription);
+ paymentTerm.getDescription().add(paymentTermDescr);
+
+ IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms();
+ if (paymentTerms.getDueDate() != null && discountTerms != null && discountTerms.getBaseDate() != null) {
+ throw new IllegalStateException(
+ "if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified");
+ }
+
+ if (paymentTerms.getDueDate() != null) {
+ DateTimeType dueDate = xmlFactory.createDateTimeType();
+ DateTimeType.DateTimeString dueDateString = xmlFactory.createDateTimeTypeDateTimeString();
+ dueDateString.setFormat(paymentTerms.getDueDate().getFormat().getDateTimeType());
+ dueDateString.setValue(
+ paymentTerms.getDueDate().getFormat().getFormatter().format(paymentTerms.getDueDate().getDate()));
+ dueDate.setDateTimeString(dueDateString);
+ paymentTerm.setDueDateDateTime(dueDate);
+ }
+
+ if (discountTerms != null) {
+ TradePaymentDiscountTermsType tradePaymentDiscountTerms = xmlFactory.createTradePaymentDiscountTermsType();
+
+ PercentType calculationPercent = xmlFactory.createPercentType();
+ calculationPercent.setValue(discountTerms.getCalculationPercentage());
+ tradePaymentDiscountTerms.setCalculationPercent(calculationPercent);
+
+ AmountType basisAmount = xmlFactory.createAmountType();
+ basisAmount.setCurrencyID(currency);
+ basisAmount.setValue(currencyFormat(totals.totalGrossAmount));
+ tradePaymentDiscountTerms.getBasisAmount().add(basisAmount);
+
+ if (discountTerms.getBaseDate() != null) {
+ DateTimeType baseDate = xmlFactory.createDateTimeType();
+ DateTimeType.DateTimeString baseDateString = xmlFactory.createDateTimeTypeDateTimeString();
+ baseDateString.setFormat(discountTerms.getBaseDate().getFormat().getDateTimeType());
+ baseDateString.setValue(discountTerms.getBaseDate().getFormat().getFormatter()
+ .format(discountTerms.getBaseDate().getDate()));
+ baseDate.setDateTimeString(baseDateString);
+ tradePaymentDiscountTerms.setBasisDateTime(baseDate);
+
+ MeasureType basisPeriodMeasure = xmlFactory.createMeasureType();
+ basisPeriodMeasure.setUnitCode(discountTerms.getBasePeriodUnitCode());
+ basisPeriodMeasure.setValue(new BigDecimal(discountTerms.getBasePeriodMeasure()));
+ tradePaymentDiscountTerms.setBasisPeriodMeasure(basisPeriodMeasure);
+ }
+ paymentTerm.getApplicableTradePaymentDiscountTerms().add(tradePaymentDiscountTerms);
+ }
+ xmlPaymentTerms.add(paymentTerm);
+
+ return xmlPaymentTerms;
+ }
+
private TradeSettlementMonetarySummationType getMonetarySummation() {
TradeSettlementMonetarySummationType monetarySummation = xmlFactory