From 48dc209f944f7a3f7552563cb39269c8a00c3bc5 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 17 Nov 2020 11:49:20 +0100 Subject: [PATCH] closes #172, fixes zero rated products, added some lines to the test of the XRechnung, have the XRechnung test actually wriote to file and have the XR test file validated automatically --- History.md | 5 +++- .../org/mustangproject/commandline/Main.java | 1 - .../ZUGFeRD/IZUGFeRDExportableItem.java | 6 ----- .../ZUGFeRD/IZUGFeRDExportableProduct.java | 7 +++--- .../ZUGFeRD/TransactionCalculator.java | 2 +- .../org/mustangproject/ZUGFeRD/XRTest.java | 25 ++++++++++++++----- .../mustangproject/validator/LibraryTest.java | 24 ++++++++++++++++++ 7 files changed, 52 insertions(+), 18 deletions(-) diff --git a/History.md b/History.md index 1decda5a..d1269a22 100644 --- a/History.md +++ b/History.md @@ -1,12 +1,15 @@ ### 2.0.1 todo +- confirm that VAT category code switches from S to Z on 0%VAT +- 2.1 support kleinunternehmer, reverse charge? - dont show empty tax number field - fail when no bankverbindung? - fail when xr attrs missing? - build xr skonto??? - *validator not to XR error on ZF files (only notices) - xmp errors may not show correctly in log - +- XR test now includes guideline ID #172 +- support zero-rated goods 2.0.0 ===== 2020-11-12 diff --git a/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java b/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java index 46a24899..5221d9a8 100755 --- a/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java +++ b/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java @@ -48,7 +48,6 @@ public class Main { private static String getUsage() { return "Usage: --action metrics|combine|extract|a3only|validate|visualize [-d,--directory] [-l,--listfromstdin] [-i,--ignore fileextension, PDF/A errors] | [-h,--help] \r\n" + " --action=metrics\n" - + + " -d, --directory count ZUGFeRD files in directory to be scanned\n" + " If it is a directory, it will recurse.\n" + " -l, --listfromstdin count ZUGFeRD files from a list of linefeed separated files on runtime.\n" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 0522b2c7..8f542274 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -26,8 +26,6 @@ package org.mustangproject.ZUGFeRD; * @author jstaerk * */ -import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants; - import java.math.BigDecimal; public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ @@ -74,10 +72,6 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ return BigDecimal.ONE.setScale(4); } - default String getCategoryCode() { - return TaxCategoryCodeTypeConstants.STANDARDRATE; - } - /*** * the ID of an additionally referenced document for this item * @return the id as string diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java index 197bbac9..ae5d6bbd 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java @@ -106,11 +106,12 @@ public interface IZUGFeRDExportableProduct { } default String getTaxCategoryCode() { - if (isIntraCommunitySupply()) { + if (getVATPercent().equals(new BigDecimal(0))) { + return "Z"; // zero rated goods + } else if (isIntraCommunitySupply()) { return "K"; } else { - return "S"; - + return "S"; // one of the "standard" rates (not neccessarily a default rate, even a deducted VAT is standard calculation) } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java index 084b0156..af5b5807 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java @@ -147,7 +147,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider { BigDecimal percent = currentItem.getProduct().getVATPercent(); LineCalculator lc = new LineCalculator(currentItem); VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), - currentItem.getCategoryCode()); + currentItem.getProduct().getTaxCategoryCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java index a6c4990e..4f05c23e 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java @@ -25,9 +25,11 @@ import junit.framework.TestCase; import org.mustangproject.*; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; -import org.mustangproject.ZUGFeRD.ZUGFeRD2PullProvider; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; import java.math.BigDecimal; import java.util.Date; @@ -36,8 +38,8 @@ import static org.xmlunit.assertj.XmlAssert.assertThat; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class XRTest extends TestCase { - - public void testPushExport() { + final String TARGET_XML = "./target/testout-XR.xml"; + public void testXRExport() { // the writing part @@ -45,10 +47,15 @@ public class XRTest extends TestCase { String number = "123"; String amountStr = "1.00"; BigDecimal amount = new BigDecimal(amountStr); - - Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname,"teststr","55232","teststadt","DE")).setOwnTaxID("4711").setOwnVATID("0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(0)), amount, new BigDecimal(1.0))); + Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()) + .setSender(new TradeParty(orgname,"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 + // not using any VAT, this is also a test of zero-rated goods: + .setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(0)), amount, new BigDecimal(1.0))); ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider(); + zf2p.setProfile(Profiles.getByName("XRechnung")); zf2p.generateXML(i); String theXML = new String(zf2p.getXML()); assertTrue(theXML.contains("