From 34ee9b6267945fe0b40faf82374675f5cece94da Mon Sep 17 00:00:00 2001 From: jstaerk Date: Sat, 4 Dec 2021 15:25:00 +0100 Subject: [PATCH 1/2] corrected profile for order-x --- .../java/org/mustangproject/EStandard.java | 6 ++++ .../ZUGFeRD/OXPullProvider.java | 36 +++++++++++-------- .../org/mustangproject/ZUGFeRD/Profiles.java | 35 +++++++++++++++--- .../org/mustangproject/ZUGFeRD/OXTest.java | 6 +--- 4 files changed, 58 insertions(+), 25 deletions(-) create mode 100644 library/src/main/java/org/mustangproject/EStandard.java diff --git a/library/src/main/java/org/mustangproject/EStandard.java b/library/src/main/java/org/mustangproject/EStandard.java new file mode 100644 index 00000000..69c43648 --- /dev/null +++ b/library/src/main/java/org/mustangproject/EStandard.java @@ -0,0 +1,6 @@ +package org.mustangproject; + +public enum EStandard { + facturx, orderx, zugferd, cii, ubl + +} diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index efb6f26b..cf3effdc 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -25,6 +25,7 @@ import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; +import org.mustangproject.EStandard; import org.mustangproject.FileAttachment; import org.mustangproject.XMLTools; @@ -48,10 +49,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider protected IExportableTransaction trans; protected TransactionCalculator calc; private String paymentTermsDescription; - protected Profile profile = Profiles.getByName("EN16931"); - - - + protected Profile profile = Profiles.getByName(EStandard.orderx,"basic", 1); @Override @@ -108,7 +106,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider } String xml = "\n" - +""+testBooleanStr+"\n" // + + "\n" + + "A1\n" + + "\n" + " \n" + " " + getProfile().getID() + "\n" + " \n" @@ -318,9 +319,9 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider if (trans.getSpecifiedProcuringProjectID() != null) { xml = xml + " \n" - + " " - + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "\n"; - if(trans.getSpecifiedProcuringProjectName()!= null) { + + " " + + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "\n"; + if (trans.getSpecifiedProcuringProjectName() != null) { xml += " " + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectName()) + "\n"; } xml += " \n"; @@ -337,7 +338,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " "; if (trans.getDeliveryDate() != null) { - xml += DATE.udtFormat(trans.getDeliveryDate()); + xml += DATE.udtFormat(trans.getDeliveryDate()); } else { throw new IllegalStateException("No delivery date provided"); } @@ -499,10 +500,10 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider xml = xml + " \n" + " " + XMLTools.encodeXML(trans.getInvoiceReferencedDocumentID()) + "\n"; - if(trans.getInvoiceReferencedIssueDate()!= null){ - xml += "" - + DATE.qdtFormat(trans.getInvoiceReferencedIssueDate()) - + "\n"; + if (trans.getInvoiceReferencedIssueDate() != null) { + xml += "" + + DATE.qdtFormat(trans.getInvoiceReferencedIssueDate()) + + "\n"; } xml += " \n"; } @@ -536,6 +537,11 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider profile = p; } + @Override + public Profile getProfile() { + return profile; + } + private String buildPaymentTermsXml() { final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); @@ -553,7 +559,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider paymentTermsXml += "" + paymentTerms.getDescription() + ""; if (dueDate != null) { paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(dueDate) ; + paymentTermsXml += DATE.udtFormat(dueDate); paymentTermsXml += ""; } @@ -568,7 +574,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider if (discountTerms.getBaseDate() != null) { final Date baseDate = discountTerms.getBaseDate(); paymentTermsXml += ""; - paymentTermsXml += DATE.udtFormat(baseDate); + paymentTermsXml += DATE.udtFormat(baseDate); paymentTermsXml += ""; paymentTermsXml += "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java b/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java index dc0d6e4f..992306c7 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/Profiles.java @@ -20,6 +20,8 @@ */ package org.mustangproject.ZUGFeRD; +import org.mustangproject.EStandard; + import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,18 +43,41 @@ public class Profiles { }).collect(Collectors.toMap(data -> (String) data[0], data -> (Profile) data[1])); + static Map ox1Map = Stream.of(new Object[][]{ + {"BASIC", new Profile("BASIC", "urn:order-x.eu:1p0:basic")}, + {"COMFORT", new Profile("COMFORT", "urn:order-x.eu:1p0:comfort")}, + {"EXTENDED", new Profile("EXTENDED", "urn:order-x.eu:1p0:extended")}, + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Profile) data[1])); + + + public static Profile getByName(EStandard standard, String name, int version) { + if (standard != EStandard.orderx) { + return getByName(name, version); + } else { + Profile result = null; + result = ox1Map.get(name.toUpperCase()); + if (result == null) { + throw new RuntimeException("Profile not found"); + } + return result; + } + } + public static Profile getByName(String name, int version) { - Profile result=null; - if (version==1) { - result=zf1Map.get(name.toUpperCase()); + Profile result = null; + if (version == 1) { + result = zf1Map.get(name.toUpperCase()); } else { - result=zf2Map.get(name.toUpperCase()); + result = zf2Map.get(name.toUpperCase()); + } + if (result == null) { + throw new RuntimeException("Profile not found"); } - if (result==null) { throw new RuntimeException("Profile not found"); } return result; } + public static Profile getByName(String name) { return getByName(name, ZUGFeRDExporterFromA3.DefaultZUGFeRDVersion); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java index f0cd421e..40851918 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java @@ -288,11 +288,7 @@ public class OXTest extends MustangReaderTestCase implements IExportableTransact assertEquals("496.00", zi.getAmount()); assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getForeignReference(), getNumber()); - try { - assertEquals(zi.getVersion(), 2); - } catch (Exception e) { - e.printStackTrace(); - } + } From 6eb513cb5caca24f2f6d5e6b4c7cf0b5ec304e2f Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 21 Dec 2021 07:31:16 +0100 Subject: [PATCH 2/2] schema validity --- .../ZUGFeRD/OXPullProvider.java | 47 ++++++++++--------- .../org/mustangproject/ZUGFeRD/OXTest.java | 4 ++ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index cf3effdc..95035e8c 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -93,10 +93,10 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + "\n"; } - String typecode = "380"; - if (trans.getDocumentCode() != null) { + String typecode = "220"; + /*if (trans.getDocumentCode() != null) { typecode = trans.getDocumentCode(); - } + }*/ String notes = ""; if (trans.getNotes() != null) { for (final String currentNote : trans.getNotes()) { @@ -115,9 +115,6 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider // + " // xsi:schemaLocation=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100 // ../Schema/ZUGFeRD1p0.xsd\"" - + " xmlns:ram=\"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100\"" - + " xmlns:udt=\"urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100\"" - + " xmlns:qdt=\"urn:un:unece:uncefact:data:standard:QualifiedDataType:100\">\n" + " \n" // + " // "+testBooleanStr+"\n" @@ -147,7 +144,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider for (final IZUGFeRDExportableItem currentItem : trans.getZFItems()) { lineID++; if (currentItem.getProduct().getTaxExemptionReason() != null) { - exemptionReason = "" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + ""; + // exemptionReason = "" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + ""; } notes = ""; if (currentItem.getNotes() != null) { @@ -193,7 +190,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " \n" + " \n"; - if (currentItem.getReferencedDocuments() != null) { + /* if (currentItem.getReferencedDocuments() != null) { for (IReferencedDocument currentReferencedDocument : currentItem.getReferencedDocuments()) { xml = xml + "\n" + "" + XMLTools.encodeXML(currentReferencedDocument.getIssuerAssignedID()) + "\n" + @@ -204,7 +201,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider } - } + }*/ if (currentItem.getBuyerOrderReferencedDocumentLineID() != null) { xml = xml + " \n" + " " + XMLTools.encodeXML(currentItem.getBuyerOrderReferencedDocumentLineID()) + "\n" @@ -232,8 +229,8 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " \n" + " \n" - + " " - + quantityFormat(currentItem.getQuantity()) + "\n" + + " " + + quantityFormat(currentItem.getQuantity()) + "\n" + " \n" + " \n" + " \n" @@ -260,10 +257,10 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " " + currencyFormat(lc.getItemTotalNetAmount()) + "\n" // currencyID=\"EUR\" + " \n"; - if (currentItem.getAdditionalReferencedDocumentID() != null) { + /* if (currentItem.getAdditionalReferencedDocumentID() != null) { xml = xml + " " + currentItem.getAdditionalReferencedDocumentID() + "130\n"; - } + }*/ xml = xml + " \n" + " \n"; @@ -333,7 +330,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider getTradePartyAsXML(this.trans.getDeliveryAddress(), false, true) + ""; } - +/* xml += " \n" + " "; @@ -344,21 +341,23 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider } xml += "\n"; xml += " \n" + + */ /* * + " \n" + * " 20130603\n" + * " 2013-51112\n" + * " \n" */ - + " \n" + " \n" - + " " + XMLTools.encodeXML(trans.getNumber()) + "\n" - + " " + trans.getCurrency() + "\n"; + xml+= " \n" + " \n" + // + " " + XMLTools.encodeXML(trans.getNumber()) + "\n" + + " " + trans.getCurrency() + "\n"; if (trans.getTradeSettlementPayment() != null) { for (final IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) { if (payment != null) { hasDueDate = true; - xml += payment.getSettlementXML(); + // xml += payment.getSettlementXML(); } } } @@ -368,7 +367,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider if (payment instanceof IZUGFeRDTradeSettlementPayment) { hasDueDate = true; } - xml += payment.getSettlementXML(); + // xml += payment.getSettlementXML(); } } } @@ -382,7 +381,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider if (amount != null) { final String amountCategoryCode = amount.getCategoryCode(); final boolean displayExemptionReason = CATEGORY_CODES_WITH_EXEMPTION_REASON.contains(amountCategoryCode); - xml += " \n" + /* xml += " \n" + " " + currencyFormat(amount.getCalculated()) + "\n" //currencyID=\"EUR\" + " VAT\n" @@ -391,6 +390,8 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " " + amountCategoryCode + "\n" + " " + vatFormat(currentTaxPercent) + "\n" + " \n"; + + */ } } if ((trans.getDetailedDeliveryPeriodFrom() != null) || (trans.getDetailedDeliveryPeriodTo() != null)) { @@ -460,7 +461,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider if (trans.getTradeSettlement() != null) { for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) { if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) { - xml += payment.getPaymentXML(); + // xml += payment.getPaymentXML(); } } } @@ -493,8 +494,8 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider + " " + currencyFormat(calc.getGrandTotal()) + "\n" // // // currencyID=\"EUR\" - + " " + currencyFormat(calc.getTotalPrepaid()) + "\n" - + " " + currencyFormat(calc.getGrandTotal().subtract(calc.getTotalPrepaid())) + "\n" + //+ " " + currencyFormat(calc.getTotalPrepaid()) + "\n" + //+ " " + currencyFormat(calc.getGrandTotal().subtract(calc.getTotalPrepaid())) + "\n" + " \n"; if (trans.getInvoiceReferencedDocumentID() != null) { xml = xml + " \n" diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java index 40851918..a1ff5aee 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java @@ -29,6 +29,8 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; @@ -37,6 +39,7 @@ import java.util.GregorianCalendar; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class OXTest extends MustangReaderTestCase implements IExportableTransaction { final String TARGET_PDF = "./target/testout-OX.pdf"; + final String TARGET_XML = "./target/testout-OX.xml"; protected class EdgeProduct implements IZUGFeRDExportableProduct { private String description, name, unit; @@ -268,6 +271,7 @@ public class OXTest extends MustangReaderTestCase implements IExportableTransact oe.setTransaction(this); String theXML = new String(oe.getProvider().getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains("