diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java index 909a619a..f6e9e510 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java @@ -33,23 +33,38 @@ public class TransactionCalculator implements IAbsoluteValueProvider { return res; } - protected BigDecimal getCharges() { + /*** + * returns total of charges for this tax rate + * @param percent a specific rate, or null for any rate + * @return the total amount + */ + protected BigDecimal getChargesForPercent(BigDecimal percent) { BigDecimal res = new BigDecimal(0); IZUGFeRDAllowanceCharge[] charges = trans.getZFCharges(); if ((charges != null) && (charges.length > 0)) { for (IZUGFeRDAllowanceCharge currentCharge : charges) { - res = res.add(currentCharge.getTotalAmount(this)); + if ((percent==null)||(currentCharge.getTaxPercent().equals(percent))) { + res = res.add(currentCharge.getTotalAmount(this)); + } } } return res; } - protected BigDecimal getAllowances() { + + /*** + * returns total of allowances for this tax rate + * @param percent a specific rate, or null for any rate + * @return the total amount + */ + protected BigDecimal getAllowancesForPercent(BigDecimal percent) { BigDecimal res = new BigDecimal(0); IZUGFeRDAllowanceCharge[] allowances = trans.getZFAllowances(); if ((allowances != null) && (allowances.length > 0)) { for (IZUGFeRDAllowanceCharge currentAllowance : allowances) { - res = res.add(currentAllowance.getTotalAmount(this)); + if ((percent==null)||(currentAllowance.getTaxPercent().equals(percent))) { + res = res.add(currentAllowance.getTotalAmount(this)); + } } } return res; @@ -65,7 +80,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider { } protected BigDecimal getTaxBasis() { - BigDecimal res = getTotal().add(getCharges()).subtract(getAllowances()); + BigDecimal res = getTotal().add(getChargesForPercent(null)).subtract(getAllowancesForPercent(null)); return res; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index f72964d1..4ea1e87b 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -39,7 +39,7 @@ import org.dom4j.io.XMLWriter; import org.mustangproject.FileAttachment; import org.mustangproject.XMLTools; -public class ZUGFeRD2PullProvider implements IXMLProvider { +public class ZUGFeRD2PullProvider implements IXMLProvider { //// MAIN CLASS protected SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); @@ -193,7 +193,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { @Override public void generateXML(IExportableTransaction trans) { this.trans = trans; - this.calc=new TransactionCalculator(trans); + this.calc = new TransactionCalculator(trans); boolean hasDueDate = false; String taxCategoryCode = ""; @@ -236,10 +236,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { if (trans.getDocumentCode() != null) { typecode = trans.getDocumentCode(); } - String notes=""; - if (trans.getNotes()!=null) { - for (String currentNote:trans.getNotes()) { - notes=notes+"" + XMLTools.encodeXML(currentNote) + ""; + String notes = ""; + if (trans.getNotes() != null) { + for (String currentNote : trans.getNotes()) { + notes = notes + "" + XMLTools.encodeXML(currentNote) + ""; } } @@ -280,10 +280,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { if (currentItem.getProduct().getTaxExemptionReason() != null) { exemptionReason = "" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + ""; } - notes=""; - if (currentItem.getNotes()!=null) { - for (String currentNote:currentItem.getNotes()) { - notes=notes+"" + XMLTools.encodeXML(currentNote) + ""; + notes = ""; + if (currentItem.getNotes() != null) { + for (String currentNote : currentItem.getNotes()) { + notes = notes + "" + XMLTools.encodeXML(currentNote) + ""; } } @@ -294,7 +294,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + notes + " \n" - + " \n"; + + " \n"; // + " 4012345001235\n" if (currentItem.getProduct().getSellerAssignedID() != null) { xml = xml + " " @@ -490,36 +490,46 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } if ((trans.getZFCharges() != null) && (trans.getZFCharges().length > 0)) { - xml = xml + " \n" + - " \n" + - " true\n" + - " \n" + - " " + currencyFormat(calc.getCharges()) + "\n" + - " Charge\n" + - " \n" + - " VAT\n" + - " S\n" + - " 19.00\n" + - " \n" + - " \n"; + for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { + if (!calc.getChargesForPercent(currentTaxPercent).equals(new BigDecimal(0))) { + + + xml = xml + " \n" + + " \n" + + " true\n" + + " \n" + + " " + currencyFormat(calc.getChargesForPercent(currentTaxPercent)) + "\n" + + " Charge\n" + + " \n" + + " VAT\n" + + " S\n" + + " " + vatFormat(currentTaxPercent) + "\n" + + " \n" + + " \n"; + + } + } } if ((trans.getZFAllowances() != null) && (trans.getZFAllowances().length > 0)) { - xml = xml + " \n" + - " \n" + - " false\n" + - " \n" + - " " + currencyFormat(calc.getAllowances()) + "\n" + - " Allowance\n" + - " \n" + - " VAT\n" + - " S\n" + - " 19.00\n" + - " \n" + - " \n"; - + for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { + if (!calc.getAllowancesForPercent(currentTaxPercent).equals(new BigDecimal(0))) { + xml = xml + " \n" + + " \n" + + " false\n" + + " \n" + + " " + currencyFormat(calc.getAllowancesForPercent(currentTaxPercent)) + "\n" + + " Allowance\n" + + " \n" + + " VAT\n" + + " S\n" + + " " + vatFormat(currentTaxPercent) + "\n" + + " \n" + + " \n"; + } + } } @@ -547,9 +557,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } - String allowanceTotalLine = "" + currencyFormat(calc.getAllowances()) + ""; + String allowanceTotalLine = "" + currencyFormat(calc.getAllowancesForPercent(null)) + ""; - String chargesTotalLine = "" + currencyFormat(calc.getCharges()) + ""; + String chargesTotalLine = "" + currencyFormat(calc.getChargesForPercent(null)) + ""; xml = xml + " \n" + " " + currencyFormat(calc.getTotal()) + "\n" //$NON-NLS-2$ diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 5062f4ff..5e887618 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -256,9 +256,11 @@ public class ZF2PushTest extends TestCase { .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors() .load(SOURCE_PDF)) { - ze.setTransaction(new Invoice().addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID)).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, new BigDecimal(1.0)).addNote("item level 1/1")) - + ze.setTransaction(new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID)).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(16)), price, new BigDecimal(1.0)).addNote("item level 1/1")) + .addCharge(new Charge(new BigDecimal(0.5)).setTaxPercent(new BigDecimal(16))) + .addAllowance(new Allowance(new BigDecimal(0.2)).setTaxPercent(new BigDecimal(16))) ); + String theXML = new String(ze.getProvider().getXML()); assertTrue(theXML.contains("