From d1b16f6b4d581931dcf4a9c9cc88f25d99a3c95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20Sta=CC=88rk?= Date: Thu, 24 Sep 2020 21:59:03 +0200 Subject: [PATCH] switch to new profiles (the old ones did not work) --- History.md | 3 +- .../org/mustangproject/commandline/Main.java | 22 +++---- .../main/java/org/mustangproject/Invoice.java | 3 + .../ZUGFeRD/CustomXMLProvider.java | 13 ++-- .../ZUGFeRD/IExportableTransaction.java | 2 + .../ZUGFeRD/IProfileProvider.java | 27 -------- .../mustangproject/ZUGFeRD/IXMLProvider.java | 5 ++ .../ZUGFeRD/IZUGFeRDExporter.java | 2 +- .../org/mustangproject/ZUGFeRD/Profile.java | 28 +++++++++ .../org/mustangproject/ZUGFeRD/Profiles.java | 56 ++++++++++++++--- .../ZUGFeRD/XMPSchemaZugferd.java | 9 +-- .../ZUGFeRD/ZUGFeRD1PullProvider.java | 26 ++++---- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 20 +++--- .../ZUGFeRD/ZUGFeRDExporterFromA1.java | 11 +++- .../ZUGFeRD/ZUGFeRDExporterFromA3.java | 62 ++++++++++++------- .../ZUGFeRD/BackwardCompatibilityTest.java | 6 +- .../ZUGFeRD/IExportableTransactionImpl.java | 2 +- .../MustangReaderWriterCustomXMLTest.java | 6 +- .../ZUGFeRD/MustangReaderWriterEdgeTest.java | 1 + .../ZUGFeRD/MustangReaderWriterTest.java | 6 +- .../mustangproject/ZUGFeRD/ZF2PushTest.java | 2 +- .../org/mustangproject/ZUGFeRD/ZF2Test.java | 2 +- 22 files changed, 192 insertions(+), 122 deletions(-) delete mode 100644 library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java create mode 100644 library/src/main/java/org/mustangproject/ZUGFeRD/Profile.java diff --git a/History.md b/History.md index 223c107a..4250424e 100644 --- a/History.md +++ b/History.md @@ -25,13 +25,14 @@ - removal of izugferddate/IZUGFeRDPaymentTerms,IZUGFeRDPaymentDiscountTerms switch - change from ZUGFeRDExporter to IZUGFeRDExporter +- switch recipient, shipping address from contact to tradeparty +- switch from profiles to profile - javadoc export - have visualizer - validate as library doc - unify loggers - release notes - new tradeparty class, Contact getOwnContact superseded by TradeParty getSender -- switch recipient, shipping address from contact to tradeparty - new invoicecorrection class - order-x read support - automated tests zuv/verapdf validate created library test files diff --git a/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java b/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java index 9074c509..d1cf0a2f 100755 --- a/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java +++ b/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java @@ -424,7 +424,7 @@ public class Main { */ try { int zfIntVersion = ZUGFeRDExporterFromA3.DefaultZUGFeRDVersion; - Profiles zfConformanceLevelProfile = Profiles.EXTENDED; + Profile zfConformanceLevelProfile = Profiles.getByName("EXTENDED"); if (pdfName == null) { pdfName = getFilenameFromUser("Source PDF", "invoice.pdf", "pdf", true, false); @@ -493,29 +493,29 @@ public class Main { if ((format.equals("zf")) && (zfIntVersion == 1)) { if (zfProfile.equals("b")) { - zfConformanceLevelProfile = Profiles.BASIC; + zfConformanceLevelProfile = Profiles.getByName("BASIC", zfIntVersion); } else if (zfProfile.equals("c")) { - zfConformanceLevelProfile = Profiles.COMFORT; + zfConformanceLevelProfile = Profiles.getByName("COMFORT", zfIntVersion); } else if (zfProfile.equals("e")) { - zfConformanceLevelProfile = Profiles.EXTENDED; + zfConformanceLevelProfile = Profiles.getByName("EXTENDED", zfIntVersion); } else { throw new Exception(String.format("Unknown ZUGFeRD profile '%s'", zfProfile)); } } else if (((format.equals("zf")) && (zfIntVersion == 2)) || (format.equals("fx"))) { if (zfProfile.equals("m")) { - zfConformanceLevelProfile = Profiles.MINIMUM; + zfConformanceLevelProfile = Profiles.getByName("MINIMUM", zfIntVersion); } else if (zfProfile.equals("w")) { - zfConformanceLevelProfile = Profiles.BASICWL; + zfConformanceLevelProfile = Profiles.getByName("BASICWL", zfIntVersion); } else if (zfProfile.equals("b")) { - zfConformanceLevelProfile = Profiles.BASIC; + zfConformanceLevelProfile = Profiles.getByName("BASIC", zfIntVersion); } else if (zfProfile.equals("c")) { - zfConformanceLevelProfile = Profiles.CIUS; + zfConformanceLevelProfile = Profiles.getByName("CIUS", zfIntVersion); } else if (zfProfile.equals("e")) { - zfConformanceLevelProfile = Profiles.EN16931; + zfConformanceLevelProfile = Profiles.getByName("EN16931", zfIntVersion); } else if (zfProfile.equals("t")) { - zfConformanceLevelProfile = Profiles.EXTENDED; + zfConformanceLevelProfile = Profiles.getByName("EXTENDED", zfIntVersion); } else if (zfProfile.equals("x")) { - zfConformanceLevelProfile = Profiles.XRECHNUNG; + zfConformanceLevelProfile = Profiles.getByName("XRECHNUNG", zfIntVersion); } else { throw new Exception(String.format("Unknown ZUGFeRD profile '%s'", zfProfile)); } diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index ddbaa76f..f5d39da9 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -43,6 +43,7 @@ public class Invoice implements IExportableTransaction { Charges = new ArrayList(), LogisticsServiceCharges = new ArrayList(); protected IZUGFeRDTradeSettlement[] getTradeSettlement = null; protected IZUGFeRDPaymentTerms paymentTerms = null; + private Profile profile; public Invoice() { @@ -72,6 +73,7 @@ public class Invoice implements IExportableTransaction { return this; } + @Override public String getNumber() { return number; @@ -482,4 +484,5 @@ public class Invoice implements IExportableTransaction { return null; } } + } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java index 98a90698..679a091d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/CustomXMLProvider.java @@ -18,9 +18,10 @@ *********************************************************************** */ package org.mustangproject.ZUGFeRD; -public class CustomXMLProvider implements IXMLProvider, IProfileProvider { +public class CustomXMLProvider implements IXMLProvider { protected byte[] zugferdData; + protected Profile profile=Profiles.getByName("EN16931"); @Override public byte[] getXML() { @@ -49,13 +50,11 @@ public class CustomXMLProvider implements IXMLProvider, IProfileProvider { } @Override - public String getProfile() { - // TODO Auto-generated method stub - return null; + public Profile getProfile() { + return profile; } - @Override - public void setProfile(Profiles level) { - // TODO Auto-generated method stub + public void setProfile(Profile level) { + profile=level; } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java index 66653bcc..df8473ef 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IExportableTransaction.java @@ -435,4 +435,6 @@ public interface IExportableTransaction { default Date getOccurrencePeriodTo() { return null; } + + } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java deleted file mode 100644 index de4e5a21..00000000 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IProfileProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/** ********************************************************************** - * - * Copyright 2018 Jochen Staerk - * - * Use is subject to license terms. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *********************************************************************** */ -package org.mustangproject.ZUGFeRD; - -public interface IProfileProvider { - - public String getProfile(); - - public void setProfile(Profiles level); - -} diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java index ab30ec89..b6136f37 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IXMLProvider.java @@ -26,4 +26,9 @@ public interface IXMLProvider { public void generateXML(IExportableTransaction trans); + public void setProfile(Profile p); + + public Profile getProfile(); + + } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java index e93a60ab..0ac41a97 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java @@ -59,7 +59,7 @@ public interface IZUGFeRDExporter extends Closeable, IExporter { public boolean ensurePDFIsValid(final DataSource dataSource) throws IOException; public IZUGFeRDExporter setXML(byte[] zugferdData) throws IOException; public IZUGFeRDExporter disableFacturX(); - public IZUGFeRDExporter setProfile(Profiles zugferdConformanceLevel); +// public IZUGFeRDExporter setProfile(Profile zugferdConformanceLevel); public String getNamespaceForVersion(int ver); public String getPrefixForVersion(int ver) ; public IZUGFeRDExporter disableAutoClose(boolean disableAutoClose); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/Profile.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Profile.java new file mode 100644 index 00000000..60b7115d --- /dev/null +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/Profile.java @@ -0,0 +1,28 @@ +package org.mustangproject.ZUGFeRD; + +public class Profile { + protected String name, id; + + public Profile(String name, String ID) { + this.name = name; + this.id = ID; + } + + public String getName() { + return name; + } + + public String getID() { + return id; + } + + public String getXMPName() { + if (name.equals("BASICWL")) { + return "BASIC WL"; + } else if (name.equals("EN16931")) { + return "EN 16931"; + } else { + return name; + } + } +} diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java index a14a2cb8..28ac59e2 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java @@ -1,23 +1,59 @@ -/** ********************************************************************** - * +/** + * ********************************************************************* + *

* Copyright 2018 Jochen Staerk - * + *

* Use is subject to license terms. - * + *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0. - * + *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * + *

* See the License for the specific language governing permissions and * limitations under the License. - * - *********************************************************************** */ + *

+ * ********************************************************************** + */ package org.mustangproject.ZUGFeRD; -public enum Profiles { - BASIC, COMFORT, EXTENDED, EN16931/*=Comfort*/, MINIMUM, BASICWL /*basic without lines, less than basic*/, CIUS, XRECHNUNG +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Profiles { + static Map zf2Map = Stream.of(new Object[][]{ + {"MINIMUM", new Profile("MINIMUM", "urn:factur-x.eu:1p0:minimum")}, + {"BASICWL", new Profile("BASICWL", "urn:factur-x.eu:1p0:basicwl")}, + {"BASIC", new Profile("BASIC", "urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:basic")}, + {"EN16931", new Profile("EN16931", "urn:cen.eu:en16931:2017")}, + {"EXTENDED", new Profile("EXTENDED", "urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended")}, + {"XRECHNUNG", new Profile("XRECHNUNG", "XRECHNUNG")} + + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Profile) data[1])); + static Map zf1Map = Stream.of(new Object[][]{ + {"BASIC", new Profile("BASIC", "urn:ferd:CrossIndustryDocument:invoice:1p0:basic")}, + {"COMFORT", new Profile("COMFORT", "urn:ferd:CrossIndustryDocument:invoice:1p0:comfort")}, + {"EXTENDED", new Profile("EXTENDED", "urn:ferd:CrossIndustryDocument:invoice:1p0:extended")}, + + + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Profile) data[1])); + + + public static Profile getByName(String name, int version) { + if (version==1) { + return zf1Map.get(name); + } else { + return zf2Map.get(name); + } + } + public static Profile getByName(String name) { + return getByName(name, ZUGFeRDExporterFromA3.DefaultZUGFeRDVersion); + } + } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java b/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java index 598f15c6..bb3e3a75 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java @@ -41,17 +41,12 @@ public class XMPSchemaZugferd extends XMPSchema { * @param prefix the xml namespace prefix for the XMP, zf for ZUGFeRD, fx for Factur-X * @param filename the filename of the invoice */ - public XMPSchemaZugferd(XMPMetadata metadata, int zfVersion, boolean isFacturX, Profiles conformanceLevel, String URN, String prefix, String filename) { + public XMPSchemaZugferd(XMPMetadata metadata, int zfVersion, boolean isFacturX, Profile conformanceLevel, String URN, String prefix, String filename) { super(metadata, URN, prefix, "ZUGFeRD Schema"); setAboutAsSimple(""); - String conformanceLevelValue = conformanceLevel.name(); - if (conformanceLevelValue.equals("BASICWL")) { - conformanceLevelValue = "BASIC WL"; - } else if (conformanceLevelValue.equals("EN16931")) { - conformanceLevelValue = "EN 16931"; - } + String conformanceLevelValue = conformanceLevel.getXMPName(); setTextPropertyValue("ConformanceLevel", conformanceLevelValue); setTextPropertyValue("DocumentType", "INVOICE"); setTextPropertyValue("DocumentFileName", filename); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index c46195f1..0635ecc0 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -35,21 +35,17 @@ import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; -public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { +public class ZUGFeRD1PullProvider implements IXMLProvider { //// MAIN CLASS protected byte[] zugferdData; private IExportableTransaction trans; - private Profiles level; private String paymentTermsDescription; SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); + protected Profile profile=Profiles.getByName("COMFORT",1); - @Override - public void setProfile(Profiles level) { - this.level = level; - } /** * enables the flag to indicate a test invoice in the XML structure @@ -73,6 +69,12 @@ public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { return XMLTools.nDigitFormat(value, 4); } + + @Override + public Profile getProfile() { + return profile; + } + @Override public byte[] getXML() { @@ -152,11 +154,6 @@ public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { return hm; } - @Override - public String getProfile() { - return "urn:ferd:CrossIndustryDocument:invoice:1p0:comfort"; - } - protected String getTradePartyAsXML(IZUGFeRDExportableTradeParty contact) { String xml = " " + XMLTools.encodeXML(contact.getName()) + "\n" //$NON-NLS-2$ // + " \n" @@ -242,7 +239,7 @@ public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { // "+testBooleanStr+"\n" // + " \n" - + " " + getProfile() + "\n" + + " " + getProfile().getID() + "\n" + " \n" + " \n" + " \n" @@ -541,6 +538,11 @@ public class ZUGFeRD1PullProvider implements IXMLProvider, IProfileProvider { } // $NON-NLS-1$ } + @Override + public void setProfile(Profile p) { + profile=p; + } + private String buildPaymentTermsXml() { String paymentTermsXml = ""; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 135dd1ef..3cf0aca5 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -38,19 +38,15 @@ import org.dom4j.io.XMLWriter; import org.mustangproject.Invoice; import org.mustangproject.XMLTools; -public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { +public class ZUGFeRD2PullProvider implements IXMLProvider { //// MAIN CLASS protected SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); protected byte[] zugferdData; private IExportableTransaction trans; - private Profiles level; private String paymentTermsDescription; + protected Profile profile=Profiles.getByName("EN16931"); - @Override - public void setProfile(Profiles level) { - this.level = level; - } /** * enables the flag to indicate a test invoice in the XML structure @@ -155,9 +151,8 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { } @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"; + public Profile getProfile() { + return profile; } protected String getTradePartyAsXML(IZUGFeRDExportableTradeParty party) { @@ -272,7 +267,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { // "+testBooleanStr+"\n" // + " \n" - + " " + getProfile() + "\n" + + " " + getProfile().getID() + "\n" + " \n" + " \n" + " \n" @@ -539,6 +534,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { } // $NON-NLS-1$ } + @Override + public void setProfile(Profile p) { + profile=p; + } + private String buildPaymentTermsXml() { String paymentTermsXml = ""; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1.java index b3c01beb..e45dae0c 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1.java @@ -68,6 +68,14 @@ public class ZUGFeRDExporterFromA1 extends ZUGFeRDExporterFromA3 implements IZUG } } + + public ZUGFeRDExporterFromA1 setProfile(Profile p) { + return (ZUGFeRDExporterFromA1)super.setProfile(p); + } + public ZUGFeRDExporterFromA1 setProfile(String profileName) { + return (ZUGFeRDExporterFromA1)super.setProfile(profileName); + } + public boolean ensurePDFIsValid(final DataSource dataSource) throws IOException { if (!ignorePDFAErrors && !isValidA1(dataSource)) { throw new IOException("File is not a valid PDF/A input file"); @@ -106,9 +114,6 @@ public class ZUGFeRDExporterFromA1 extends ZUGFeRDExporterFromA3 implements IZUG return (ZUGFeRDExporterFromA1) super.setXML(zugferdData); } - public ZUGFeRDExporterFromA1 setProfile(Profiles zugferdConformanceLevel){ - return (ZUGFeRDExporterFromA1) super.setProfile(zugferdConformanceLevel); - } public ZUGFeRDExporterFromA1 disableAutoClose(boolean disableAutoClose){ return (ZUGFeRDExporterFromA1) super.disableAutoClose(disableAutoClose); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java index aacdcdec..2398ac67 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java @@ -53,7 +53,6 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte public static final int DefaultZUGFeRDVersion = 2; - protected Profiles profile = Profiles.EXTENDED; protected PDFAConformanceLevel conformanceLevel = PDFAConformanceLevel.UNICODE; protected ArrayList fileAttachments = new ArrayList(); @@ -62,7 +61,7 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte private boolean disableAutoClose; private boolean fileAttached = false; - + private Profile profile = null; private boolean documentPrepared = false; /** @@ -113,6 +112,23 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte return xmlProvider; } + public ZUGFeRDExporterFromA3 setProfile(Profile p) { + this.profile=p; + if (xmlProvider!=null) { + xmlProvider.setProfile(p); + } + return this; + } + + public ZUGFeRDExporterFromA3 setProfile(String profilename) { + this.profile=Profiles.getByName(profilename); + + if (xmlProvider!=null) { + xmlProvider.setProfile(this.profile); + } + return this; + } + public ZUGFeRDExporterFromA3 addAdditionalFile(String name, byte[] content) { fileAttachments.add(new FileAttachment(name, "text/xml", "Supplement", content).setDescription("ZUGFeRD extension/additional data")); return this; @@ -154,14 +170,14 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte * @param ver the zf/fx version * @return the filename of the file to be embedded */ - public String getFilenameForVersion(int ver, Profiles profile) { + public String getFilenameForVersion(int ver, Profile profile) { if (isFacturX) { return "factur-x.xml"; } else { if (ver == 1) { return "ZUGFeRD-invoice.xml"; } else { - if (profile == Profiles.XRECHNUNG) { + if (profile.getName().equals("XRECHNUNG")) { return "xrechnung.xml"; } else { return "zugferd-invoice.xml"; @@ -190,6 +206,7 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte return this; } + /** * Makes A PDF/A3a-compliant document from a PDF-A1 compliant document (on the * metadata level, this will not e.g. convert graphics to JPG-2000) @@ -207,6 +224,9 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte ensurePDFisUpgraded = false; } + public void attachFile(FileAttachment file) { + fileAttachments.add(file); + } public void attachFile(String filename, byte[] data, String mimetype, String relation) { FileAttachment fa=new FileAttachment(filename, mimetype, relation, data); fileAttachments.add(fa); @@ -349,8 +369,8 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte public ZUGFeRDExporterFromA3 setXML(byte[] zugferdData) throws IOException { CustomXMLProvider cus = new CustomXMLProvider(); cus.setXML(zugferdData); - this.xmlProvider = cus; - setTransaction(null); + this.setXMLProvider(cus); + prepare(); return this; } @@ -375,15 +395,6 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte return buffer.toByteArray(); } - /** - * Sets the ZUGFeRD conformance level (override). - * - * @param zugferdConformanceLevel the new conformance level - */ - public ZUGFeRDExporterFromA3 setProfile(Profiles zugferdConformanceLevel) { - this.profile = zugferdConformanceLevel; - return this; - } /** * All files are PDF/A-3, setConformance refers to the level conformance. @@ -434,9 +445,9 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte protected void addXMP(XMPMetadata metadata) { if (attachZUGFeRDHeaders) { - XMPSchemaZugferd zf = new XMPSchemaZugferd(metadata, ZFVersion, isFacturX, profile, + XMPSchemaZugferd zf = new XMPSchemaZugferd(metadata, ZFVersion, isFacturX, xmlProvider.getProfile(), getNamespaceForVersion(ZFVersion), getPrefixForVersion(ZFVersion), - getFilenameForVersion(ZFVersion, profile)); + getFilenameForVersion(ZFVersion, xmlProvider.getProfile())); metadata.addSchema(zf); } @@ -513,10 +524,13 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte */ public IExporter setTransaction(IExportableTransaction trans) throws IOException { this.trans = trans; + return prepare(); + } + + public IExporter prepare() throws IOException{ prepareDocument(); - ((IProfileProvider) xmlProvider).setProfile(profile); xmlProvider.generateXML(trans); - String filename = getFilenameForVersion(ZFVersion, profile); + String filename = getFilenameForVersion(ZFVersion, xmlProvider.getProfile()); PDFAttachGenericFile(doc, filename, "Alternative", "Invoice metadata conforming to ZUGFeRD standard (http://www.ferd-net.de/front_content.php?idcat=231&lang=4)", "text/xml", xmlProvider.getXML()); @@ -563,16 +577,22 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte return this; } + protected void setXMLProvider(IXMLProvider p) { + this.xmlProvider = p; + if (profile!=null) { + xmlProvider.setProfile(profile); + } + } @Override public ZUGFeRDExporterFromA3 setZUGFeRDVersion(int version) { this.ZFVersion = version; if (version == 1) { ZUGFeRD1PullProvider z1p = new ZUGFeRD1PullProvider(); disableFacturX(); - this.xmlProvider = z1p; + setXMLProvider(z1p); } else if (version == 2) { ZUGFeRD2PullProvider z2p = new ZUGFeRD2PullProvider(); - this.xmlProvider = z2p; + setXMLProvider(z2p); } else { throw new IllegalArgumentException("Version not supported"); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java index 21b9fce2..6732c354 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/BackwardCompatibilityTest.java @@ -56,7 +56,7 @@ public class BackwardCompatibilityTest extends TestCase implements IExportableTr try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); - IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(1).setProfile(Profiles.EN16931).load(SOURCE_PDF)) { + IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(1).setProfile("EN16931").load(SOURCE_PDF)) { ze.setTransaction(this); ze.disableAutoClose(true); @@ -96,7 +96,7 @@ public class BackwardCompatibilityTest extends TestCase implements IExportableTr try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); - IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.EN16931).load(SOURCE_PDF)) { + IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile("EN16931").load(SOURCE_PDF)) { ze.setTransaction(this); ze.disableAutoClose(true); @@ -134,7 +134,7 @@ public class BackwardCompatibilityTest extends TestCase implements IExportableTr try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); - IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.EN16931).load(SOURCE_PDF)) { + IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile("EN16931").load(SOURCE_PDF)) { ze.setTransaction(this); ze.disableAutoClose(true); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java index 5a7d2de8..d2ba8e6c 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java @@ -43,6 +43,7 @@ public class IExportableTransactionImpl implements IExportableTransaction { private String currency; private String paymentTermDescription; private String referenceNumber; + private Profile profile; @Override public String getNumber() { @@ -149,7 +150,6 @@ public class IExportableTransactionImpl implements IExportableTransaction { return referenceNumber; } - public IExportableTransactionImpl setNumber(String number) { this.number = number; return this; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java index 95e06374..a12d7c14 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterCustomXMLTest.java @@ -31,13 +31,13 @@ import java.nio.charset.StandardCharsets; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MustangReaderWriterCustomXMLTest extends TestCase { - /** * Create the test case * * @param testName name of the test case */ public MustangReaderWriterCustomXMLTest(String testName) { + super(testName); } @@ -58,7 +58,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { try { InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); - IZUGFeRDExporter zea1 = new ZUGFeRDExporterFromA1().setProducer("My Application").setCreator("Test").setProfile(Profiles.EN16931) + IZUGFeRDExporter zea1 = new ZUGFeRDExporterFromA1().setProducer("My Application").setCreator("Test").setProfile(Profiles.getByName("EN16931")) .load(SOURCE_PDF); final byte[] UTF8ByteOrderMark = new byte[]{(byte) 0xef, (byte) 0xbb, (byte) 0xbf}; @@ -301,7 +301,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase { .setProducer("My Application") .setCreator("Test") .setZUGFeRDVersion(1) - .setProfile(Profiles.BASIC) + .setProfile(Profiles.getByName("BASIC",1)) .load(SOURCE_PDF); /* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. */ String ownZUGFeRDXML = "\n" diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java index bb956282..ee622a06 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java @@ -150,6 +150,7 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { return "AB321"; } + /** * Create the test case * diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 063212f9..8268d296 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -358,7 +358,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); - IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.EN16931).load(SOURCE_PDF)) { + IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.getByName("EN16931")).load(SOURCE_PDF)) { ze.setTransaction(this); ze.disableAutoClose(true); @@ -402,7 +402,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20190610_507blanko.pdf"); - IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(1).setProfile(Profiles.COMFORT).load(SOURCE_PDF)) { + IZUGFeRDExporter ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(1).setProfile(Profiles.getByName("COMFORT",1)).load(SOURCE_PDF)) { ze.setTransaction(this); ze.disableAutoClose(true); @@ -430,7 +430,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { try (InputStream SOURCE_PDF = this.getClass() .getResourceAsStream("/MustangGnuaccountingBeispielRE-20171118_506blanko.pdf"); - ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.EN16931).load(SOURCE_PDF)) { + ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setZUGFeRDVersion(2).setProfile(Profiles.getByName("EN16931")).load(SOURCE_PDF)) { ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 5891c022..b6f5021d 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -134,7 +134,7 @@ public class ZF2PushTest extends TestCase { .getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application") - .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors() + .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).setProfile("EXTENDED").ignorePDFAErrors() .load(SOURCE_PDF)) { // ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE")).setOwnTaxID("4711").setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")).setNumber(number) // .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)).addAllowance(new Allowance().setPercent(new BigDecimal(50))))); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java index 6ffc0768..2708a27a 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2Test.java @@ -168,7 +168,7 @@ public class ZF2Test extends MustangReaderTestCase { .getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf"); ZUGFeRDExporterFromA3 ze = new ZUGFeRDExporterFromA3().setProducer("My Application") - .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).setProfile(Profiles.EN16931) + .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).setProfile("EN16931") .load(SOURCE_PDF)) { ze.setTransaction(this);