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 05e58888..9074c509 100755 --- a/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java +++ b/Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java @@ -594,9 +594,9 @@ public class Main { System.out.println("ZUGFeRD XML source set to " + sourceName); } if (outName == null) { - outName = getFilenameFromUser("ZUGFeRD 2.0 HTML target", "factur-x.html", "html", false, true); + outName = getFilenameFromUser("HTML target file", "factur-x.html", "html", false, true); } else { - System.out.println("ZUGFeRD 1.0 XML source set to " + outName); + System.out.println("HTML target set to " + outName); } // Verify params diff --git a/doc/development_documentation.md b/doc/development_documentation.md index 3f673c6c..080af51f 100644 --- a/doc/development_documentation.md +++ b/doc/development_documentation.md @@ -36,7 +36,8 @@ larger) and a commandline application using the latter library. The validator component embeds VeraPDF, a open-source -PDF/A-validator, via maven dependency and uses ph-schematron +PDF/A-validator, via maven dependency and uses standard java +checks against schema and ph-schematron for checks against the schematron to validate the XML part of the invoices. ![architecture of the validator](ZUV-Architektur.svg "Graph of the architecture of the validator component") diff --git a/library/src/main/java/org/mustangproject/Allowance.java b/library/src/main/java/org/mustangproject/Allowance.java index da2cec21..14befb7d 100644 --- a/library/src/main/java/org/mustangproject/Allowance.java +++ b/library/src/main/java/org/mustangproject/Allowance.java @@ -13,4 +13,9 @@ public class Allowance extends Charge implements IZUGFeRDAllowanceCharge { super(totalAmount, taxPercent, reason, categoryCode); } + + @Override + public boolean isCharge() { + return false; + } } diff --git a/library/src/main/java/org/mustangproject/Charge.java b/library/src/main/java/org/mustangproject/Charge.java index c87d349a..e6ca1ab5 100644 --- a/library/src/main/java/org/mustangproject/Charge.java +++ b/library/src/main/java/org/mustangproject/Charge.java @@ -62,6 +62,11 @@ public class Charge implements IZUGFeRDAllowanceCharge { return taxPercent; } + @Override + public boolean isCharge() { + return true; + } + public Charge setCategoryCode(String categoryCode) { this.categoryCode = categoryCode; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java index 667a4c78..6e8ec8f6 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java @@ -34,4 +34,5 @@ public interface IZUGFeRDAllowanceCharge { return TaxCategoryCodeTypeConstants.STANDARDRATE; } + public boolean isCharge(); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalc.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalc.java index d0ad2238..cd75c7ac 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalc.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalc.java @@ -4,19 +4,34 @@ import java.math.BigDecimal; public class LineCalc { private BigDecimal totalGross; + private BigDecimal price; private BigDecimal priceGross; private BigDecimal itemTotalNetAmount; private BigDecimal itemTotalVATAmount; + private BigDecimal allowance=new BigDecimal(0); public LineCalc(IZUGFeRDExportableItem currentItem) { + + if (currentItem.getItemAllowances()!=null && currentItem.getItemAllowances().length>0) { + for (IZUGFeRDAllowanceCharge allowance:currentItem.getItemAllowances()) { + addAllowance(allowance.getTotalAmount()); + } + } BigDecimal multiplicator = currentItem.getProduct().getVATPercent().divide(new BigDecimal(100)) .add(new BigDecimal(1)); priceGross = currentItem.getPrice(); // see https://github.com/ZUGFeRD/mustangproject/issues/159 - totalGross = currentItem.getQuantity().multiply(currentItem.getPrice()).divide(currentItem.getBasisQuantity()) + price = priceGross.subtract(allowance); + totalGross = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity()) .multiply(multiplicator); - itemTotalNetAmount = currentItem.getQuantity().multiply(currentItem.getPrice()).divide(currentItem.getBasisQuantity()) + itemTotalNetAmount = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity()) .setScale(2, BigDecimal.ROUND_HALF_UP); itemTotalVATAmount = totalGross.subtract(itemTotalNetAmount); + + + } + + public BigDecimal getPrice() { + return price; } public BigDecimal getItemTotalNetAmount() { @@ -28,12 +43,16 @@ public class LineCalc { } public BigDecimal getItemTotalGrossAmount() { - return itemTotalVATAmount; + return itemTotalNetAmount; } public BigDecimal getPriceGross() { return priceGross; } + public void addAllowance(BigDecimal b) { + allowance=b; + + } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 29dcfcd3..23a7b57e 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -33,6 +33,7 @@ import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; +import org.mustangproject.Charge; import org.mustangproject.XMLTools; public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { @@ -121,7 +122,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { BigDecimal res = new BigDecimal(0); for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { LineCalc lc = new LineCalc(currentItem); - res = res.add(lc.getItemTotalNetAmount()); + res = res.add(lc.getItemTotalGrossAmount()); } return res; } @@ -286,6 +287,19 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { xml = xml + " " + XMLTools.encodeXML(currentItem.getProduct().getBuyerAssignedID()) + "\n"; } + + String allowanceStr=" " + quantityFormat(currentItem.getBasisQuantity()) +"\n"; + if (currentItem.getItemAllowances()!=null && currentItem.getItemAllowances().length>0) { + for (IZUGFeRDAllowanceCharge allowance:currentItem.getItemAllowances()) { + if (allowance.isCharge()) { + throw new RuntimeException("Item level charges are not yet implemented"); + } else { + allowanceStr= "false"+priceFormat(allowance.getTotalAmount())+""; + } + } + } + xml = xml + " " + XMLTools.encodeXML(currentItem.getProduct().getName()) + "\n" //$NON-NLS-2$ + " " + XMLTools.encodeXML(currentItem.getProduct().getDescription()) + "\n" @@ -295,8 +309,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { + " \n" + " " + priceFormat(lc.getPriceGross()) + "\n" //currencyID=\"EUR\" - + " " + quantityFormat(currentItem.getBasisQuantity()) +"\n" + + allowanceStr // + " \n" // + " false\n" // + " 0.6667\n" @@ -304,7 +317,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider { // + " \n" + " \n" + " \n" - + " " + priceFormat(currentItem.getPrice()) + + " " + priceFormat(lc.getPrice()) + "\n" // currencyID=\"EUR\" + " " + quantityFormat(currentItem.getBasisQuantity()) +"\n" diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java index fd2a107e..041cb557 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceChargeImpl.java @@ -24,6 +24,7 @@ public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge { private BigDecimal totalAmount; private String reason; private BigDecimal taxPercent; + boolean isCharge=true; @Override public BigDecimal getTotalAmount() { @@ -40,6 +41,16 @@ public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge { return taxPercent; } + @Override + public boolean isCharge() { + return isCharge; + } + + public IZUGFeRDAllowanceChargeImpl setAllowance() { + isCharge = false; + return this; + } + public IZUGFeRDAllowanceChargeImpl setTotalAmount(BigDecimal totalAmount) { this.totalAmount = totalAmount; return this; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index a4d72de2..7f959ff5 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -136,9 +136,9 @@ public class ZF2PushTest extends TestCase { .load(SOURCE_PDF)) { ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE")).setOwnTaxID("4711").setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE")).setNumber(number) - .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)).addCharge(new Charge(new BigDecimal(0.1),new BigDecimal(0), "","K"))) - .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)).addAllowance(new Allowance(new BigDecimal(0.07),new BigDecimal(0), "","K"))) - .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)).addAllowance(new Allowance(new BigDecimal(0.07),new BigDecimal(0), "","K")).addCharge(new Charge(new BigDecimal(0.1),new BigDecimal(0), "","K"))) + .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)).addAllowance(new Allowance(new BigDecimal(0.1),new BigDecimal(0), "","K"))) + .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0))) + .addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0))) ); String theXML = new String(ze.getProvider().getXML()); @@ -154,7 +154,7 @@ public class ZF2PushTest extends TestCase { assertTrue(zi.getUTF8().contains("EUR")); // Reading ZUGFeRD - assertEquals("10.71", zi.getAmount()); + assertEquals("10.59", zi.getAmount()); assertEquals(zi.getHolder(), orgname); assertEquals(zi.getForeignReference(), number); try {