- Added possibility to specify delivery date in "week of year" or "month of year" format, through introduction of new IZUGFeRDDate interface. Keeping backward compatibility by providing both methods in IZUGFeRDExportableTransaction

- Added possibility to specify "LineTwo" in Recipient Address
- Limited pdfbox version to maximum 2.0.17 because otherwise 3.0.0-SNAPSHOT was pulled in which was broken because of missing ByteArrayDataSource
This commit is contained in:
Christian Schwerdtfeger
2019-10-14 17:31:32 +02:00
parent 191debf7e4
commit 3015de02a5
11 changed files with 254 additions and 19 deletions

View File

@@ -0,0 +1,13 @@
package org.mustangproject.ZUGFeRD;
import java.util.Date;
public interface IZUGFeRDDate {
Date getDate();
default ZUGFeRDDateFormat getFormat() {
return ZUGFeRDDateFormat.DATE;
}
}

View File

@@ -124,4 +124,13 @@ public interface IZUGFeRDExportableContact {
return null;
}
/**
* returns additional address information which is display in xml tag "LineTwo"
*
* @return additional address information
*/
default String getAdditionalAddress() {
return null;
}
}

View File

@@ -131,6 +131,7 @@ public interface IZUGFeRDExportableTransaction {
* @deprecated use getTradeSettlement
* @return an array of IZUGFeRDTradeSettlementPayment
*/
@Deprecated
default IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() {
return null;
}
@@ -231,6 +232,16 @@ public interface IZUGFeRDExportableTransaction {
*/
Date getDeliveryDate();
/**
* get delivery date in more specific form. If this and getDeliveryDate() are
* specified, this value will be taken
*
* @return instance holding date and format
*/
default IZUGFeRDDate getZFDeliveryDate() {
return null;
}
/**
* get main invoice currency used on the invoice

View File

@@ -24,6 +24,7 @@ import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -78,6 +79,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
private ZUGFeRDConformanceLevel level;
private String paymentTermsDescription;
@Override
public void setProfile(ZUGFeRDConformanceLevel level) {
this.level = level;
}
@@ -85,6 +87,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
/**
* enables the flag to indicate a test invoice in the XML structure
*/
@Override
public void setTest() {
}
@@ -203,6 +206,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
return hm;
}
@Override
public String getProfile() {
// return "urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_1.2";
return "urn:cen.eu:en16931:2017";
@@ -390,8 +394,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
// + " </DefinedTradeContact>\n"
+ " <ram:PostalTradeAddress>\n" //$NON-NLS-1$
+ " <ram:PostcodeCode>" + XMLTools.encodeXML(trans.getRecipient().getZIP()) + "</ram:PostcodeCode>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:LineOne>" + XMLTools.encodeXML(trans.getRecipient().getStreet()) + "</ram:LineOne>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:CityName>" + XMLTools.encodeXML(trans.getRecipient().getLocation()) + "</ram:CityName>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:LineOne>" + XMLTools.encodeXML(trans.getRecipient().getStreet()) + "</ram:LineOne>\n"; //$NON-NLS-1$ //$NON-NLS-2$
if (trans.getRecipient().getAdditionalAddress() != null) {
xml += " <ram:LineTwo>" + XMLTools.encodeXML(trans.getRecipient().getAdditionalAddress()) + "</ram:LineTwo>\n"; //$NON-NLS-1$ //$NON-NLS-2$
}
xml += " <ram:CityName>" + XMLTools.encodeXML(trans.getRecipient().getLocation()) + "</ram:CityName>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:CountryID>" + XMLTools.encodeXML(trans.getRecipient().getCountry()) + "</ram:CountryID>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " </ram:PostalTradeAddress>\n"; //$NON-NLS-1$
if (trans.getRecipient().getVATID() != null) {
@@ -406,8 +413,20 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
// + " </BuyerOrderReferencedDocument>\n"
+ " </ram:ApplicableHeaderTradeAgreement>\n" //$NON-NLS-1$
+ " <ram:ApplicableHeaderTradeDelivery>\n" + " <ram:ActualDeliverySupplyChainEvent>\n"
+ " <ram:OccurrenceDateTime><udt:DateTimeString format=\"102\">"
+ zugferdDateFormat.format(trans.getDeliveryDate()) + "</udt:DateTimeString></ram:OccurrenceDateTime>\n"
+ " <ram:OccurrenceDateTime>";
if (trans.getZFDeliveryDate() != null) {
ZUGFeRDDateFormat dateFormat = trans.getZFDeliveryDate().getFormat();
Date date = trans.getZFDeliveryDate().getDate();
xml += "<udt:DateTimeString format=\"" + dateFormat.getDateTimeType() + "\">"
+ dateFormat.getFormatter().format(date) + "</udt:DateTimeString>";
} else if (trans.getDeliveryDate() != null) {
xml += "<udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(trans.getDeliveryDate())
+ "</udt:DateTimeString>";
} else {
throw new IllegalStateException("No delivery date provided");
}
xml += "</ram:OccurrenceDateTime>\n"
+ " </ram:ActualDeliverySupplyChainEvent>\n"
/*
* + " <DeliveryNoteReferencedDocument>\n" +

View File

@@ -0,0 +1,28 @@
package org.mustangproject.ZUGFeRD;
import java.text.SimpleDateFormat;
import org.mustangproject.ZUGFeRD.model.DateTimeTypeConstants;
public enum ZUGFeRDDateFormat {
MONTH_OF_YEAR(DateTimeTypeConstants.MONTH, new SimpleDateFormat("yyyyMM")),
WEEK_OF_YEAR(DateTimeTypeConstants.WEEK, new SimpleDateFormat("yyyyww")),
DATE(DateTimeTypeConstants.DATE, new SimpleDateFormat("yyyyMMdd"));
private String dateTimeType;
private SimpleDateFormat formatter;
private ZUGFeRDDateFormat(String dateTimeType, SimpleDateFormat formatter) {
this.dateTimeType = dateTimeType;
this.formatter = formatter;
}
public String getDateTimeType() {
return dateTimeType;
}
public SimpleDateFormat getFormatter() {
return formatter;
}
}

View File

@@ -248,6 +248,12 @@ class ZUGFeRDTransactionModelConverter {
buyerAddress.setValue(trans.getRecipient().getStreet());
buyerAddressType.setLineOne(buyerAddress);
if (trans.getRecipient().getAdditionalAddress() != null) {
TextType buyerAdditionalAddress = xmlFactory.createTextType();
buyerAdditionalAddress.setValue(trans.getRecipient().getAdditionalAddress());
buyerAddressType.setLineTwo(buyerAdditionalAddress);
}
CodeType buyerPostcode = xmlFactory.createCodeType();
buyerPostcode.setValue(trans.getRecipient().getZIP());
buyerAddressType.getPostcodeCode().add(buyerPostcode);
@@ -385,9 +391,18 @@ class ZUGFeRDTransactionModelConverter {
DateTimeType deliveryDate = xmlFactory.createDateTimeType();
DateTimeType.DateTimeString deliveryDateString = xmlFactory
.createDateTimeTypeDateTimeString();
deliveryDateString.setFormat(DateTimeTypeConstants.DATE);
deliveryDateString.setValue(zugferdDateFormat.format(trans
.getDeliveryDate()));
IZUGFeRDDate zfDeliveryDate = trans.getZFDeliveryDate();
if (zfDeliveryDate != null) {
ZUGFeRDDateFormat deliveryDateFormat = zfDeliveryDate.getFormat();
deliveryDateString.setFormat(deliveryDateFormat.getDateTimeType());
deliveryDateString.setValue(
deliveryDateFormat.getFormatter().format(zfDeliveryDate.getDate()));
} else if (trans.getDeliveryDate() != null) {
deliveryDateString.setFormat(DateTimeTypeConstants.DATE);
deliveryDateString.setValue(zugferdDateFormat.format(trans.getDeliveryDate()));
} else {
throw new IllegalStateException("No delivery date provided");
}
deliveryDate.setDateTimeString(deliveryDateString);
deliveryEvent.getOccurrenceDateTime().add(deliveryDate);
tradeDelivery.getActualDeliverySupplyChainEvent().add(deliveryEvent);