From 216fa91355592984329f7c8f173bea28da279ca7 Mon Sep 17 00:00:00 2001 From: Daniel Luckas Date: Thu, 17 Jul 2025 10:14:34 +0200 Subject: [PATCH 1/4] Close resources after usage --- .../org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 4cb47c4a..90baad58 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -126,8 +126,7 @@ public class ZUGFeRDInvoiceImporter { if (Arrays.equals(pad, pdfSignature)) { // we have a pdf - try { - PDDocument doc = Loader.loadPDF(IOUtils.toByteArray(pdfStream)); + try(PDDocument doc = Loader.loadPDF(IOUtils.toByteArray(pdfStream))) { // PDDocumentInformation info = doc.getDocumentInformation(); final PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog()); //start From dc15c6e493cefe61848ce728e3df1476a307f17f Mon Sep 17 00:00:00 2001 From: jstaerk Date: Thu, 17 Jul 2025 12:32:40 +0200 Subject: [PATCH 2/4] closes #893 --- History.md | 4 +++ .../java/org/mustangproject/TradeParty.java | 26 +++++++++++++++++++ .../ZUGFeRD/DeSerializationTest.java | 21 ++++++++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/History.md b/History.md index 8585c2f4..256e7c9f 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,7 @@ +2.18.1 +======= +- #893 Tradeparty globalID is not read from JSON + 2.18.0 ======= 2025-07-14 diff --git a/library/src/main/java/org/mustangproject/TradeParty.java b/library/src/main/java/org/mustangproject/TradeParty.java index 73b1ae81..f5d34c84 100644 --- a/library/src/main/java/org/mustangproject/TradeParty.java +++ b/library/src/main/java/org/mustangproject/TradeParty.java @@ -541,6 +541,32 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { return this; } + /*** + * for jackson, primarily, use addGlobalID(SchemedID) instead + * @param ID the id part without scheme + * @return fluent setter + */ + public TradeParty setGlobalID(String ID) { + if (globalId==null) { + globalId=new SchemedID(); + } + globalId.setId(ID); + return this; + } + + /*** + * for jackson, primarily, use addGlobalID(SchemedID) instead + * @param scheme the scheme part without id + * @return fluent setter + */ + public TradeParty setGlobalIDScheme(String scheme) { + if (globalId==null) { + globalId=new SchemedID(); + } + globalId.setScheme(scheme); + return this; + } + public TradeParty addGlobalID(SchemedID schemedID) { globalId = schemedID; return this; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java index e527021e..f57c9520 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java @@ -414,10 +414,12 @@ public class DeSerializationTest extends ResourceCase { String number = "123"; String priceStr = "1.00"; String taxID = "9990815"; + BigDecimal price = new BigDecimal(priceStr); Invoice newInvoiceFromJSON = null; boolean hasExceptions = false; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String json = ""; try { SchemedID gtin = new SchemedID("0160", "2001015001325"); SchemedID gln = new SchemedID("0088", "4304171000002"); @@ -435,7 +437,7 @@ public class DeSerializationTest extends ResourceCase { .addCashDiscount(new CashDiscount(new BigDecimal(2), 14)) .setDeliveryDate(sdf.parse("2020-11-02")).setNumber(number).setVATDueDateTypeCode(EventTimeCodeTypeConstants.PAYMENT_DATE); ObjectMapper mapper = new ObjectMapper(); - String json = mapper.writeValueAsString(i); + json = mapper.writeValueAsString(i); newInvoiceFromJSON = mapper.readValue(json, Invoice.class); } catch (ParseException e) { hasExceptions = true; @@ -447,6 +449,23 @@ public class DeSerializationTest extends ResourceCase { } + public void testFromJSON() throws JsonProcessingException { + String globalID = "4000001123452"; + String globalIDScheme = "0088"; + String itemDeliveryFrom="2022-01-28T23:00:00.000+00:00"; + String itemDeliveryTo="2022-01-30T23:00:00.000+00:00"; + + String json="{\"number\":\"123\",\"buyerOrderReferencedDocumentID\":\"28934\",\"currency\":\"CHF\",\"issueDate\":1752744199178,\"dueDate\":1752744199178,\"deliveryDate\":1604271600000,\"sender\":{\"name\":\"Test company\",\"zip\":\"55232\",\"street\":\"teststr\",\"location\":\"teststadt\",\"country\":\"DE\",\"taxID\":\"9990815\",\"vatID\":\"DE0815\",\"id\":\"0009845\",\"globalID\":\""+globalID+"\",\"globalIDScheme\":\""+globalIDScheme+"\",\"email\":\"sender@test.org\",\"vatid\":\"DE0815\"},\"recipient\":{\"name\":\"Franz Müller\",\"zip\":\"55232\",\"street\":\"teststr.12\",\"location\":\"Entenhausen\",\"country\":\"DE\",\"vatID\":\"DE4711\",\"additionalAddress\":\"Hinterhaus 3\",\"contact\":{\"name\":\"Franz Müller\",\"phone\":\"01779999999\",\"email\":\"franz@mueller.de\",\"zip\":\"55232\",\"street\":\"teststr. 12\",\"location\":\"Entenhausen\",\"country\":\"DE\",\"fax\":\"++49555123456\"},\"globalID\":\"4304171000002\",\"globalIDScheme\":\"0088\",\"email\":\"recipient@test.org\",\"vatid\":\"DE4711\"},\"deliveryAddress\":{\"name\":\"just the other side of the street\",\"zip\":\"55232\",\"street\":\"teststr.12a\",\"location\":\"Entenhausen\",\"country\":\"DE\",\"vatID\":\"DE47110\",\"vatid\":\"DE47110\"},\"cashDiscounts\":[{\"percent\":2,\"days\":14}],\"notes\":[\"document level 1/2\",\"document level 2/2\"],\"sellerOrderReferencedDocumentID\":\"9384\",\"contractReferencedDocument\":\"376zreurzu0983\",\"valid\":true,\"vatdueDateTypeCode\":\"72\",\"zfitems\":[{\"price\":1.00,\"quantity\":1,\"basisQuantity\":1,\"detailedDeliveryPeriodFrom\":\""+itemDeliveryFrom+"\",\"detailedDeliveryPeriodTo\":\""+itemDeliveryTo+"\",\"id\":\"a123\",\"buyerOrderReferencedDocumentLineID\":\"xxx\",\"product\":{\"unit\":\"H87\",\"name\":\"Testprodukt\",\"sellerAssignedID\":\"4711\",\"taxCategoryCode\":\"S\",\"globalID\":\"2001015001325\",\"globalIDScheme\":\"0160\",\"intraCommunitySupply\":false,\"reverseCharge\":false,\"vatpercent\":16},\"notes\":[\"item level 1/1\"],\"notesWithSubjectCode\":[{\"content\":\"item level 1/1\"}],\"itemAllowances\":[{\"totalAmount\":0.0200000000000000004163336342344337026588618755340576171875,\"taxPercent\":16,\"reason\":\"item discount\",\"categoryCode\":\"S\"}],\"value\":1.00}],\"ownVATID\":\"DE0815\",\"detailedDeliveryPeriodFrom\":1601503200000,\"detailedDeliveryPeriodTo\":1601848800000,\"ownTaxID\":\"9990815\",\"ownZIP\":\"55232\",\"ownLocation\":\"teststadt\",\"zfallowances\":[{\"totalAmount\":0.200000000000000011102230246251565404236316680908203125,\"taxPercent\":16,\"reason\":\"discount\",\"categoryCode\":\"S\"}],\"ownStreet\":\"teststr\",\"zfcharges\":[{\"totalAmount\":0.5,\"taxPercent\":16,\"reason\":\"quick delivery charge\",\"categoryCode\":\"S\"}],\"ownCountry\":\"DE\"}"; + + ObjectMapper mapper = new ObjectMapper(); + Invoice fromJSON = mapper.readValue(json, Invoice.class); + assertEquals(globalID, fromJSON.getSender().getGlobalID()); + assertEquals(globalIDScheme, fromJSON.getSender().getGlobalIDScheme()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + assertEquals("2022-01-29", sdf.format(fromJSON.getZFItems()[0].getDetailedDeliveryPeriodFrom())); + assertEquals("2022-01-31", sdf.format(fromJSON.getZFItems()[0].getDetailedDeliveryPeriodTo())); + assertEquals("sender@test.org", fromJSON.getSender().getEmail()); + } public void testDueDateRoundtrip() throws JsonProcessingException { From 0128e39353f017a2c68d87d10601f8c99dc9c87e Mon Sep 17 00:00:00 2001 From: Daniel Luckas Date: Thu, 17 Jul 2025 14:22:27 +0200 Subject: [PATCH 3/4] Close resources after usage --- .../java/org/mustangproject/validator/ResourceCase.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/validator/src/test/java/org/mustangproject/validator/ResourceCase.java b/validator/src/test/java/org/mustangproject/validator/ResourceCase.java index 621da5ef..589d72e3 100644 --- a/validator/src/test/java/org/mustangproject/validator/ResourceCase.java +++ b/validator/src/test/java/org/mustangproject/validator/ResourceCase.java @@ -17,8 +17,7 @@ public class ResourceCase extends TestCase { private static final Logger LOGGER = LoggerFactory.getLogger(ResourceCase.class.getCanonicalName()); // log output is public static File getResourceAsFile(String resourcePath) { - try { - InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); + try(InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath)) { if (in == null) { return null; } @@ -42,8 +41,7 @@ public class ResourceCase extends TestCase { } public static byte[] getResourceAsByteArray(String resourcePath) { - try { - InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); + try(InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath)) { if (in == null) { return null; } From 8a1361950181f1afbe20671e5256b4423e13daa5 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 22 Jul 2025 16:28:54 +0200 Subject: [PATCH 4/4] closes #890 --- .../java/org/mustangproject/validator/XMLValidator.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java index ccd57b3a..a86a681b 100644 --- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java @@ -226,13 +226,7 @@ public class XMLValidator extends Validator { isExtended = context.getProfile().contains("extended"); validateSchema(zfXML.getBytes(StandardCharsets.UTF_8), "OX_10/comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd", 99, EPart.ox); xsltFilename = "/xslt/OX_10/comfort/SCRDMCCBDACIOMessageStructure_100pD20B_COMFORT.xslt"; - - } else if (root.getLocalName().equalsIgnoreCase("SCRDMCCBDACIOMessageStructure")) { - context.setGeneration("1"); - isOrderX = true; - validateSchema(zfXML.getBytes(StandardCharsets.UTF_8), "OX_10/comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd", 99, EPart.ox); - xsltFilename = "/xslt/OX_10/comfort/SCRDMCCBDACIOMessageStructure_100pD20B_COMFORT.xslt"; - + } else if (root.getLocalName().equalsIgnoreCase("CrossIndustryInvoice")) { // ZUGFeRD 2.0 or Factur-X context.setGeneration("2");