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