From 39f799c93814f9f96e6a8ab550243ea9c52dad46 Mon Sep 17 00:00:00 2001 From: "Jan N. Klug" Date: Tue, 10 Sep 2024 10:26:22 +0200 Subject: [PATCH 1/2] Add support for BuyerOrderReferencedDocument on line level Signed-off-by: Jan N. Klug --- .../main/java/org/mustangproject/Item.java | 38 +++++++++++++------ .../ZUGFeRD/IZUGFeRDExportableItem.java | 7 ++++ .../ZUGFeRD/ZUGFeRD2PullProvider.java | 15 ++++++-- .../org/mustangproject/ZUGFeRD/UBLTest.java | 2 +- .../mustangproject/ZUGFeRD/ZF2PushTest.java | 3 +- 5 files changed, 48 insertions(+), 17 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index d4d417c6..2b1520ed 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -22,7 +22,8 @@ public class Item implements IZUGFeRDExportableItem { protected BigDecimal basisQuantity = BigDecimal.ONE; protected Date detailedDeliveryPeriodFrom = null, detailedDeliveryPeriodTo = null; protected String id; - protected String referencedLineID = null; + protected String buyerOrderReferencedDocumentLineID = null; + protected String buyerOrderReferencedDocumentID = null; protected Product product; protected ArrayList notes = null; protected ArrayList referencedDocuments = null; @@ -61,7 +62,8 @@ public class Item implements IZUGFeRDExportableItem { String vatPercent = null; String lineTotal = "0"; String unitCode = "0"; - String referencedLineID = null; + String buyerOrderReferencedDocumentLineID = null; + String buyerOrderReferencedDocumentID = null; ArrayList rdocs = null; ArrayList addRefs = null; @@ -150,7 +152,9 @@ public class Item implements IZUGFeRDExportableItem { for (int docIndex = 0; docIndex < docChilds.getLength(); docIndex++) { String localName = docChilds.item(docIndex).getLocalName(); if ((localName != null) && (localName.equals("LineID"))) { - referencedLineID = docChilds.item(docIndex).getTextContent(); + buyerOrderReferencedDocumentLineID = docChilds.item(docIndex).getTextContent(); + } else if ((localName != null) && (localName.equals("IssuerAssignedID"))) { + buyerOrderReferencedDocumentID = docChilds.item(docIndex).getTextContent(); } } } @@ -310,22 +314,34 @@ public class Item implements IZUGFeRDExportableItem { addAdditionalReference(rdoc); } } - addReferencedLineID( referencedLineID ); + addBuyerOrderReferencedDocumentLineID( buyerOrderReferencedDocumentLineID ); + addBuyerOrderReferencedDocumentID( buyerOrderReferencedDocumentID ); } - public Item addReferencedLineID(String s) { - referencedLineID = s; + public Item addBuyerOrderReferencedDocumentLineID(String s) { + buyerOrderReferencedDocumentLineID = s; + return this; + } + + @Deprecated(since = "2.14.0") + public Item addReferencedLineID(String s) { + return addBuyerOrderReferencedDocumentLineID(s); + } + + @Override + public String getBuyerOrderReferencedDocumentID() { + return buyerOrderReferencedDocumentID; + } + + public Item addBuyerOrderReferencedDocumentID(String s) { + buyerOrderReferencedDocumentID = s; return this; } - /*** - * BT 132 (issue https://github.com/ZUGFeRD/mustangproject/issues/247) - * @return the line ID of the order (BT132) - */ @Override public String getBuyerOrderReferencedDocumentLineID() { - return referencedLineID; + return buyerOrderReferencedDocumentLineID; } public BigDecimal getLineTotalAmount() { diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index e5e25cae..be9b3906 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -53,6 +53,13 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ return null; } + /*** + * buyer order reference document id + * @return the document id (defaults to {@code null}) + */ + default String getBuyerOrderReferencedDocumentID() { + return null; + } /*** * BT 132 (issue https://github.com/ZUGFeRD/mustangproject/issues/247) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index f98674c4..e1feab67 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -448,10 +448,17 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { ""; } } - if (currentItem.getBuyerOrderReferencedDocumentLineID() != null) { - xml += " " - + "" + XMLTools.encodeXML(currentItem.getBuyerOrderReferencedDocumentLineID()) + "" - + ""; + if ((currentItem.getBuyerOrderReferencedDocumentLineID() != null) || (currentItem.getBuyerOrderReferencedDocumentID() != null)) { + xml += " "; + if (currentItem.getBuyerOrderReferencedDocumentID() != null) { + xml += "" + XMLTools.encodeXML(currentItem.getBuyerOrderReferencedDocumentID()) + + ""; + } + if (currentItem.getBuyerOrderReferencedDocumentLineID() != null) { + xml += "" + XMLTools.encodeXML(currentItem.getBuyerOrderReferencedDocumentLineID()) + + ""; + } + xml += ""; } if (!allowanceChargeStr.isEmpty()) { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/UBLTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/UBLTest.java index 7dba9fdf..f7cf1c7e 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/UBLTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/UBLTest.java @@ -82,7 +82,7 @@ public class UBLTest extends ResourceCase { .setSender(new TradeParty("Test company", "teststr", "55232", "teststadt", "DE").addTaxID("DE4711").addVATID("DE0815").setContact(new Contact("Hans Test", "+49123456789", "test@example.org")).addBankDetails(new BankDetails("DE12500105170648489890", "COBADEFXXX"))) .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")) .setReferenceNumber("991-01484-64")//leitweg-id - .setNumber("123").addItem(new Item(new Product("Testprodukt", "", "C62", BigDecimal.ZERO), /*price*/ new BigDecimal("1.0"), /*qty*/ new BigDecimal("1.0")).addReferencedLineID("A12")); + .setNumber("123").addItem(new Item(new Product("Testprodukt", "", "C62", BigDecimal.ZERO), /*price*/ new BigDecimal("1.0"), /*qty*/ new BigDecimal("1.0")).addBuyerOrderReferencedDocumentLineID("A12")); try { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 5156950f..dd13aae7 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -454,7 +454,7 @@ public class ZF2PushTest extends TestCase { .setContractReferencedDocument(contractID) .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addGlobalID(gln).setEmail("recipient@test.org").addVATID("DE4711") .setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE").setFax("++49555123456")).setAdditionalAddress("Hinterhaus 3")) - .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) + .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).addBuyerOrderReferencedDocumentID("orderId").addBuyerOrderReferencedDocumentLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15"))) .addCharge(new Charge(new BigDecimal(0.5)).setReason("quick delivery charge").setTaxPercent(new BigDecimal(16))) .addAllowance(new Allowance(new BigDecimal(0.2)).setReason("discount").setTaxPercent(new BigDecimal(16))) .addCashDiscount(new CashDiscount(new BigDecimal(2), 14)) @@ -483,6 +483,7 @@ public class ZF2PushTest extends TestCase { assertTrue(zi.getUTF8().contains("0088")); assertTrue(zi.getUTF8().contains(orgID)); assertTrue(zi.getUTF8().contains("ram:BuyerOrderReferencedDocument")); + assertThat(zi.getUTF8()).valueByXPath("//*[local-name()='SpecifiedLineTradeAgreement']/*[local-name()='BuyerOrderReferencedDocument']/*[local-name()='IssuerAssignedID']").asString().isEqualTo("orderId"); assertTrue(zi.getUTF8().contains(occurrenceFrom)); assertTrue(zi.getUTF8().contains(occurrenceTo)); assertTrue(zi.getUTF8().contains(contractID)); From e73de636677f45d411684e012d3994506b0a8895 Mon Sep 17 00:00:00 2001 From: rexfox147 Date: Wed, 11 Jun 2025 14:31:48 +0200 Subject: [PATCH 2/2] setting IssuerAssignedID --- library/src/main/java/org/mustangproject/Item.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 2b1d0d2c..8e0cc8c7 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -128,17 +128,9 @@ public class Item implements IZUGFeRDExportableItem { .flatMap(bordNodes -> bordNodes.getAsString("LineID")) .ifPresent(this::addReferencedLineID); - if ((tradeLineChilds.item(tradeLineChildIndex).getLocalName() != null) && tradeLineChilds.item(tradeLineChildIndex).getLocalName().equals("BuyerOrderReferencedDocument")) { - NodeList docChilds = tradeLineChilds.item(tradeLineChildIndex).getChildNodes(); - for (int docIndex = 0; docIndex < docChilds.getLength(); docIndex++) { - String localName = docChilds.item(docIndex).getLocalName(); - if ((localName != null) && (localName.equals("LineID"))) { - buyerOrderReferencedDocumentLineID = docChilds.item(docIndex).getTextContent(); - } else if ((localName != null) && (localName.equals("IssuerAssignedID"))) { - buyerOrderReferencedDocumentID = docChilds.item(docIndex).getTextContent(); - } - } - } + icnm.getAsNodeMap("BuyerOrderReferencedDocument") + .flatMap(bordNodes -> bordNodes.getAsString("IssuerAssignedID")) + .ifPresent(this::addBuyerOrderReferencedDocumentID); icnm.getAsNodeMap("NetPriceProductTradePrice").ifPresent(npptpNodes -> { npptpNodes.getAsBigDecimal("ChargeAmount").ifPresent(this::setPrice);