From 219ecb892a4a24f1da5dcbf88fe25647765a4eed Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 16 May 2022 10:37:51 +0200 Subject: [PATCH] automatic ox tests --- History.md | 2 + .../ZUGFeRD/OXPullProvider.java | 28 ++---- .../org/mustangproject/ZUGFeRD/OXTest.java | 85 ++++++++++++++++--- .../mustangproject/validator/LibraryTest.java | 58 +++++++++++++ 4 files changed, 138 insertions(+), 35 deletions(-) diff --git a/History.md b/History.md index 2b1de51e..2f619b6d 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,5 @@ +- OXPullprovider to no longer generate invsalid XML if a duedate is set + 2.5.1 ======= 2022-05-12 diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index 035231d9..495bd7c0 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -35,6 +35,7 @@ import java.util.logging.Logger; import org.mustangproject.EStandard; import org.mustangproject.FileAttachment; +import org.mustangproject.TradeParty; import org.mustangproject.XMLTools; public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider { @@ -318,11 +319,13 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider } xml += "" + ""; - if (this.trans.getDeliveryAddress() != null) { - xml += "" + - getTradePartyAsXML(this.trans.getDeliveryAddress(), false, true) + - ""; + IZUGFeRDExportableTradeParty deliveryAddress=this.trans.getDeliveryAddress(); + if (deliveryAddress == null) { + deliveryAddress = this.trans.getRecipient(); } + xml += "" + + getTradePartyAsXML(deliveryAddress, false, true) + + ""; /* xml += "" + ""; @@ -459,12 +462,6 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider } } - if (hasDueDate && (trans.getDueDate() != null)) { - xml += "" // $NON-NLS-2$ - + DATE.udtFormat(trans.getDueDate()) - + "";// 20130704 - - } xml += ""; } else { xml += buildPaymentTermsXml(); @@ -545,18 +542,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider String paymentTermsXml = ""; final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms(); - final Date 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 += DATE.udtFormat(dueDate); - paymentTermsXml += ""; - } - if (discountTerms != null) { paymentTermsXml += ""; final String currency = trans.getCurrency(); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java index ff046ae0..ddc79ac4 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/OXTest.java @@ -1,29 +1,31 @@ -/** ********************************************************************** - * +/** + * ********************************************************************* + *

* Copyright 2019 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; import junit.framework.Test; import junit.framework.TestSuite; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; -import org.mustangproject.Invoice; +import org.mustangproject.*; import javax.xml.xpath.XPathExpressionException; import java.io.ByteArrayOutputStream; @@ -42,6 +44,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_PDF_EDGE = "./target/testout-OX-edge.pdf"; final String TARGET_XML = "./target/testout-OX.xml"; protected class EdgeProduct implements IZUGFeRDExportableProduct { @@ -199,10 +202,10 @@ public class OXTest extends MustangReaderTestCase implements IExportableTransact EdgeProduct designProduct = new EdgeProduct("", "Künstlerische Gestaltung (Stunde): Einer Beispielrechnung", "HUR"); EdgeProduct balloonProduct = new EdgeProduct("", "Bestellerweiterung für E&F Umbau", "C62");// test for issue - // 103 + // 103 EdgeProduct airProduct = new EdgeProduct("", "Heiße Luft pro Liter", "LTR"); - Item design=new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct); + Item design = new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct); design.setAddReference("1825"); allItems[0] = design; allItems[1] = new Item(new BigDecimal("0.79"), new BigDecimal("400"), balloonProduct); @@ -269,8 +272,8 @@ public class OXTest extends MustangReaderTestCase implements IExportableTransact .getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); OXExporterFromA1 oe = new OXExporterFromA1().setProducer("My Application") - .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(1).ignorePDFAErrors() - .load(SOURCE_PDF)) { + .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(1).ignorePDFAErrors() + .load(SOURCE_PDF)) { oe.setTransaction(this); String theXML = new String(oe.getProvider().getXML(), StandardCharsets.UTF_8); assertTrue(theXML.contains("220")); + assertTrue(zi.getUTF8().contains("")); + assertTrue(zi.getUTF8().contains("EUR")); + + // Now also check the "invoice"Importer + assertEquals("2.00", zi.getAmount()); + assertEquals(zi.getHolder(), "Test company"); + ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(TARGET_PDF_EDGE); + try { + Invoice i = zii.extractInvoice(); + + assertEquals(new BigDecimal("1.0000"), i.getZFItems()[1].getQuantity()); + /* getting the Quantity is more difficult than usual because in OrderX it's + called requestedQuantity, not BilledQuantity + */ + + + } catch (XPathExpressionException e) { + fail("XPathExpressionException should not be raised in testEdgeExport"); + } catch (ParseException e) { + fail("ParseException should not be raised in testEdgeExport"); + /* a parseException would also be fired if the calculated grand total does not + match the read grand total */ + } + + + } + } diff --git a/validator/src/test/java/org/mustangproject/validator/LibraryTest.java b/validator/src/test/java/org/mustangproject/validator/LibraryTest.java index ec4821fe..2b0e6cdd 100644 --- a/validator/src/test/java/org/mustangproject/validator/LibraryTest.java +++ b/validator/src/test/java/org/mustangproject/validator/LibraryTest.java @@ -199,4 +199,62 @@ public class LibraryTest extends ResourceCase { .isEqualTo(0); } + + /** + * automatically test the xrechnung + */ + public void testOXValidationSimple() { + File tempFile = new File("../library/target/testout-OX.pdf"); + ZUGFeRDValidator zfv = new ZUGFeRDValidator(); + + String res = zfv.validate(tempFile.getAbsolutePath()); + + assertThat(res).valueByXPath("count(//error)") + .asInt() + .isEqualTo(0); + assertThat(res).valueByXPath("/validation/summary/@status") + .asString() + .isEqualTo("valid");// expect to be valid because XR notices are, well, only notices + assertThat(res).valueByXPath("/validation/xml/summary/@status") + .asString() + .isEqualTo("valid"); + /** end of errors due to version mismatch*/ + + + assertThat(res).valueByXPath("count(//notice)") + .asInt() + .isEqualTo(0); + + + + } + /** + * automatically test the xrechnung + */ + public void testOXValidationEdge() { + File tempFile = new File("../library/target/testout-OX-Edge.pdf"); + ZUGFeRDValidator zfv = new ZUGFeRDValidator(); + + String res = zfv.validate(tempFile.getAbsolutePath()); + + assertThat(res).valueByXPath("count(//error)") + .asInt() + .isEqualTo(0); + assertThat(res).valueByXPath("/validation/summary/@status") + .asString() + .isEqualTo("valid");// expect to be valid because XR notices are, well, only notices + assertThat(res).valueByXPath("/validation/xml/summary/@status") + .asString() + .isEqualTo("valid"); + /** end of errors due to version mismatch*/ + + + assertThat(res).valueByXPath("count(//notice)") + .asInt() + .isEqualTo(0); + + + + } + }