diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index 60de0622..006a5875 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -197,7 +197,18 @@ public Invoice setObjectIdentifierReferencedDocument(String id) { setObjectIdentifierReferencedDocument(dr); return this; } - + public Invoice setObjectIdentifierReferencedDocument(String id, String referenceTypeCode) { + ReferencedDocument dr = new ReferencedDocument(id); + dr.setReferenceTypeCode(referenceTypeCode); + return setObjectIdentifierReferencedDocument(dr); + } + + public Invoice setObjectIdentifierReferencedDocument(String id, String referenceTypeCode, Date issueDate) { + ReferencedDocument dr = new ReferencedDocument(id); + dr.setReferenceTypeCode(referenceTypeCode); + dr.setFormattedIssueDateTime(issueDate); + return setObjectIdentifierReferencedDocument(dr); + } public Invoice setNumber(String number) { this.number = number; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index d7aab617..04b27466 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -662,6 +662,11 @@ public void generateXML(IExportableTransaction trans) { xml += "" + "" + XMLTools.encodeXML(trans.getObjectIdentifierReferencedDocument().getIssuerAssignedID()) + "" + "130"; + // NEW: BT-18-1 scheme identifier + String rtc = trans.getObjectIdentifierReferencedDocument().getReferenceTypeCode(); + if (rtc != null && !rtc.isEmpty()) { + xml += "" + XMLTools.encodeXML(rtc) + ""; + } if (trans.getObjectIdentifierReferencedDocument().getFormattedIssueDateTime()!=null) { xml += "" + DATE.qdtFormat(trans.getObjectIdentifierReferencedDocument().getFormattedIssueDateTime()) + ""; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/BT18ReferenceTypeCodeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/BT18ReferenceTypeCodeTest.java new file mode 100644 index 00000000..2db93307 --- /dev/null +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/BT18ReferenceTypeCodeTest.java @@ -0,0 +1,64 @@ +package org.mustangproject.ZUGFeRD; + +import junit.framework.TestCase; +import org.mustangproject.Invoice; +import org.mustangproject.Item; +import org.mustangproject.Product; +import org.mustangproject.ReferencedDocument; +import org.mustangproject.TradeParty; + +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.Date; + +import static org.xmlunit.assertj.XmlAssert.assertThat; + +public class BT18ReferenceTypeCodeTest extends TestCase { + + /** + * Ensures BT-18-1 (scheme identifier) is serialized as ram:ReferenceTypeCode + * inside ram:AdditionalReferencedDocument (TypeCode=130). + */ + public void testBT18ReferenceTypeCodeIsWrittenWhenSet() { + // Minimal invoice (XRechnung profile => CII output) + Invoice i = new Invoice() + .setIssueDate(new Date()) + .setDueDate(new Date()) + .setDeliveryDate(new Date()) + .setSender(new TradeParty("Test company", "teststr", "55232", "teststadt", "DE")) + .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")) + .setNumber("INV-123") + .addItem(new Item( + new Product("Testprodukt", "", "C62", BigDecimal.ZERO), + new BigDecimal("1.00"), + BigDecimal.ONE + )); + + // BT-18: Invoiced Object Identifier (AdditionalReferencedDocument / TypeCode 130) + ReferencedDocument rd = new ReferencedDocument("ID unique"); + rd.setReferenceTypeCode("AJW"); // BT-18-1 + i.setObjectIdentifierReferencedDocument(rd); + + ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); + zf2p.setProfile(Profiles.getByName("XRechnung")); + zf2p.generateXML(i); + + String xml = new String(zf2p.getXML(), StandardCharsets.UTF_8); + + // Assert: we still have a CII invoice + assertTrue(xml.contains("