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("