diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 321b4723..d4d417c6 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -26,6 +26,7 @@ public class Item implements IZUGFeRDExportableItem { protected Product product; protected ArrayList notes = null; protected ArrayList referencedDocuments = null; + protected ArrayList additionalReference = null; protected ArrayList Allowances = new ArrayList<>(), Charges = new ArrayList<>(); @@ -63,6 +64,7 @@ public class Item implements IZUGFeRDExportableItem { String referencedLineID = null; ArrayList rdocs = null; + ArrayList addRefs = null; // nodes.item(i).getTextContent())) { @@ -248,6 +250,35 @@ public class Item implements IZUGFeRDExportableItem { } } } + + if (tradeSettlementName.equals("AdditionalReferencedDocument")) { + String IssuerAssignedID = ""; + String TypeCode = ""; + String ReferenceTypeCode = ""; + + NodeList refDocChilds = tradeSettlementChilds.item(tradeSettlementChildIndex).getChildNodes(); + for (int refDocIndex = 0; refDocIndex < refDocChilds.getLength(); refDocIndex++) { + String localName = refDocChilds.item(refDocIndex).getLocalName(); + if ((localName != null) && (localName.equals("IssuerAssignedID"))) { + IssuerAssignedID = refDocChilds.item(refDocIndex).getTextContent(); + } + if ((localName != null) && (localName.equals("TypeCode"))) { + TypeCode = refDocChilds.item(refDocIndex).getTextContent(); + } + if ((localName != null) && (localName.equals("ReferenceTypeCode"))) { + ReferenceTypeCode = refDocChilds.item(refDocIndex).getTextContent(); + } + } + + ReferencedDocument rd = new ReferencedDocument(IssuerAssignedID, TypeCode, + ReferenceTypeCode); + if (addRefs == null) { + addRefs = new ArrayList<>(); + } + addRefs.add(rd); + + } + } } } @@ -274,6 +305,11 @@ public class Item implements IZUGFeRDExportableItem { addReferencedDocument(rdoc); } } + if (addRefs != null) { + for (ReferencedDocument rdoc : addRefs) { + addAdditionalReference(rdoc); + } + } addReferencedLineID( referencedLineID ); } @@ -465,6 +501,29 @@ public class Item implements IZUGFeRDExportableItem { return referencedDocuments.toArray(new IReferencedDocument[0]); } + + /*** + * adds item level references along with their typecodes and issuerassignedIDs (contract ID, cost centre, ...) + * @param doc the ReferencedDocument to add + * @return fluent setter + */ + public Item addAdditionalReference(ReferencedDocument doc) { + if (additionalReference == null) { + additionalReference = new ArrayList<>(); + } + additionalReference.add(doc); + return this; + } + + @Override + public IReferencedDocument[] getAdditionalReferences() { + if (additionalReference == null) { + return null; + } + return additionalReference.toArray(new IReferencedDocument[0]); + } + + /*** * specify a item level delivery period * (apart from the document level delivery period, and the document level diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index f6e03242..e5e25cae 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -92,12 +92,22 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ /*** * the ID of an additionally referenced document for this item + * @deprecated use {@link #getAdditionalReferences()} instead. * @return the id as string */ + @Deprecated default String getAdditionalReferencedDocumentID() { return null; } + /*** + * allows to specify multiple references (billing information) + * @return the referenced documents + */ + default IReferencedDocument[] getAdditionalReferences() { + return null; + } + /*** * allows to specify multiple(!) referenced documents along with e.g. their typecodes diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index ba43dd94..b98abebc 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -387,9 +387,10 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider { + "" + currencyFormat(lc.getItemTotalNetAmount()) + "" + ""; - if (currentItem.getAdditionalReferencedDocumentID() != null) { + if (currentItem.getAdditionalReferences() != null) { + xml += "" + currentItem.getAdditionalReferences()[0].getIssuerAssignedID() + "130"; + } else if (currentItem.getAdditionalReferencedDocumentID() != null) { xml += "" + currentItem.getAdditionalReferencedDocumentID() + "130"; - } xml += "" + ""; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 64bfb738..eaefecaa 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -503,9 +503,16 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + "" + currencyFormat(lc.getItemTotalNetAmount()) + "" // currencyID=\"EUR\" + ""; - if (currentItem.getAdditionalReferencedDocumentID() != null) { + if (currentItem.getAdditionalReferences() != null) { + for (final IReferencedDocument currentReference : currentItem.getAdditionalReferences()) { + xml += "" + + "" + XMLTools.encodeXML(currentReference.getIssuerAssignedID()) + "" + + "130" + + "" + XMLTools.encodeXML(currentReference.getReferenceTypeCode()) + "" + + ""; + } + } else if (currentItem.getAdditionalReferencedDocumentID() != null) { xml += "" + currentItem.getAdditionalReferencedDocumentID() + "130"; - } xml += "" + "";