diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index a51afb97..9d89cc9d 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -14,6 +14,7 @@ public class Item implements IZUGFeRDExportableItem { protected BigDecimal price, quantity, tax, grossPrice, lineTotalAmount; protected Date detailedDeliveryPeriodFrom=null, detailedDeliveryPeriodTo=null; protected String id; + protected String referencedLineID=null; protected Product product; protected ArrayList notes = null; protected ArrayList Allowances = new ArrayList(), @@ -31,6 +32,21 @@ public class Item implements IZUGFeRDExportableItem { this.product = product; } + + public Item addReferencedLineID(String s) { + referencedLineID=s; + return this; + } + + /*** + * BT 132 (issue https://github.com/ZUGFeRD/mustangproject/issues/247) + * @return + */ + @Override + public String getBuyerOrderReferencedDocumentLineID() { + return referencedLineID; + } + public BigDecimal getLineTotalAmount() { return lineTotalAmount; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index a584c718..08194198 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -50,6 +50,15 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ } + /*** + * BT 132 (issue https://github.com/ZUGFeRD/mustangproject/issues/247) + * @return + */ + default String getBuyerOrderReferencedDocumentLineID() { + return null; + } + + /** * The price of one item excl. taxes * diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 2bef4cc1..254c870b 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -350,8 +350,14 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + "\n" + " \n" - + " \n" - + " \n" + + " \n"; + if (currentItem.getBuyerOrderReferencedDocumentLineID() != null) { + xml = xml + " \n" + + " "+XMLTools.encodeXML(currentItem.getBuyerOrderReferencedDocumentLineID())+"\n" + + " \n"; + + } + xml = xml + " \n" + " " + priceFormat(lc.getPriceGross()) + "\n" //currencyID=\"EUR\" + "" + currencyFormat(amount.getCalculated()) - + "\n" //currencyID=\"EUR\" - + " VAT\n" - + (displayExemptionReason ? exemptionReason : "") - + " " + currencyFormat(amount.getBasis()) + "\n" // currencyID=\"EUR\" - + " " + amountCategoryCode + "\n" - + " " - + vatFormat(currentTaxPercent) + "\n" + " \n" ; + final String amountCategoryCode = amount.getCategoryCode(); + final boolean displayExemptionReason = CATEGORY_CODES_WITH_EXEMPTION_REASON.contains(amountCategoryCode); + xml += " \n" + + " " + currencyFormat(amount.getCalculated()) + + "\n" //currencyID=\"EUR\" + + " VAT\n" + + (displayExemptionReason ? exemptionReason : "") + + " " + currencyFormat(amount.getBasis()) + "\n" // currencyID=\"EUR\" + + " " + amountCategoryCode + "\n" + + " " + + vatFormat(currentTaxPercent) + "\n" + " \n"; } } if ((trans.getDetailedDeliveryPeriodFrom() != null) || (trans.getDetailedDeliveryPeriodTo() != null)) { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index ea0daf27..121a5086 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -377,7 +377,7 @@ public class ZF2PushTest extends TestCase { .setDeliveryAddress(new TradeParty("just the other side of the street", "teststr.12a", "55232", "Entenhausen", "DE").addVATID("DE47110")) .setContractReferencedDocument(contractID) .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").setID("0008734").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)), price, new BigDecimal(1.0)).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)), 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"))) .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))) .setDeliveryDate(sdf.parse("2020-11-02")).setOwnVATID("DE0815").setNumber(number) @@ -399,6 +399,7 @@ public class ZF2PushTest extends TestCase { assertTrue(zi.getUTF8().contains("Hinterhaus")); assertTrue(zi.getUTF8().contains("0009845")); assertTrue(zi.getUTF8().contains("0008734")); + assertTrue(zi.getUTF8().contains("ram:BuyerOrderReferencedDocument")); assertTrue(zi.getUTF8().contains(occurrenceFrom)); assertTrue(zi.getUTF8().contains(occurrenceTo)); assertTrue(zi.getUTF8().contains(contractID)); diff --git a/validator/src/test/java/org/mustangproject/validator/LibraryTest.java b/validator/src/test/java/org/mustangproject/validator/LibraryTest.java index f780b390..864d155a 100644 --- a/validator/src/test/java/org/mustangproject/validator/LibraryTest.java +++ b/validator/src/test/java/org/mustangproject/validator/LibraryTest.java @@ -99,6 +99,24 @@ public class LibraryTest extends ResourceCase { } + public void testLibraryPushEdge() { + File tempFile = new File("../library/target/testout-ZF2PushEdge.pdf"); + assertTrue(tempFile.exists()); + ZUGFeRDValidator zfv = new ZUGFeRDValidator(); + + String res = zfv.validate(tempFile.getAbsolutePath()); + + + assertThat(res).valueByXPath("/validation/pdf/summary/@status") + .isEqualTo("valid"); + + assertThat(res).valueByXPath("/validation/xml/summary/@status") + .isEqualTo("valid"); + + assertThat(res).valueByXPath("/validation/summary/@status") + .isEqualTo("valid"); + + } public void testLibraryPushAllowances() { File tempFile = new File("../library/target/testout-ZF2PushChargesAllowances.pdf"); assertTrue(tempFile.exists());