diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java index a8b98441..f293b23d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java @@ -123,7 +123,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider { BigDecimal res = BigDecimal.ZERO; for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { LineCalculator lc = new LineCalculator(currentItem); - res = res.add(lc.getItemTotalGrossAmount()); + res = res.add(lc.getItemTotalNetAmount()); } return res; } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java index aca40ce4..438470aa 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java @@ -1,61 +1,63 @@ package org.mustangproject.ZUGFeRD; +import static java.math.BigDecimal.TEN; +import static java.math.BigDecimal.valueOf; import static org.junit.Assert.assertEquals; -import java.math.BigDecimal; - import org.junit.Test; public class LineCalculatorTest { @Test - public void testLineCalculator() { - final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(BigDecimal.valueOf(16)); - final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(BigDecimal.valueOf(78.35)) - .setQuantity(BigDecimal.valueOf(11)) + public void testLineCalculator_simpleAmounts_resultInValidVATAmount() { + final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(valueOf(16)); + final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(valueOf(100)) + .setQuantity(TEN) .setProduct(product); + final LineCalculator calculator = new LineCalculator(currentItem); - assertEquals(BigDecimal.valueOf(78.35), calculator.getPrice().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(861.85), calculator.getItemTotalNetAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(861.85), calculator.getItemTotalGrossAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(137.896), calculator.getItemTotalVATAmount().stripTrailingZeros()); + assertEquals(valueOf(100).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); + assertEquals(valueOf(1000).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); + assertEquals(valueOf(160).stripTrailingZeros(), calculator.getItemTotalVATAmount().stripTrailingZeros()); } @Test public void testLineCalculatorInclusiveAllowance() { - final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(BigDecimal.valueOf(16)); - final IZUGFeRDAllowanceCharge allowance = new IZUGFeRDAllowanceChargeImpl() - .setTotalAmount(BigDecimal.valueOf(14.8730)); - final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(BigDecimal.valueOf(148.73)) - .setQuantity(BigDecimal.valueOf(12)) + //This test failed with previous implementation. By rounding the totalVATAmount to 2 decimal places the result became wrong + final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(valueOf(16)); + // 10 % discount on each item + final IZUGFeRDAllowanceCharge allowance = new IZUGFeRDAllowanceChargeImpl().setTotalAmount(valueOf(14.8730)); + + final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(valueOf(148.73)) + .setQuantity(valueOf(12)) .setItemAllowances(new IZUGFeRDAllowanceCharge[] { allowance }) .setProduct(product); + final LineCalculator calculator = new LineCalculator(currentItem); - assertEquals(BigDecimal.valueOf(133.857), calculator.getPrice().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(1606.28), calculator.getItemTotalNetAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(1606.28), calculator.getItemTotalGrossAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(257.0048), calculator.getItemTotalVATAmount().stripTrailingZeros()); + assertEquals(valueOf(133.857).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); + assertEquals(valueOf(1606.28).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); + assertEquals(valueOf(257.0048).stripTrailingZeros(), calculator.getItemTotalVATAmount().stripTrailingZeros()); } @Test public void testLineCalculatorInclusiveAllowanceAndCharge() { - final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(BigDecimal.valueOf(16)); - final IZUGFeRDAllowanceCharge allowance = new IZUGFeRDAllowanceChargeImpl() - .setTotalAmount(BigDecimal.valueOf(14.8730)); - final IZUGFeRDAllowanceCharge charge = new IZUGFeRDAllowanceChargeImpl() - .setTotalAmount(BigDecimal.valueOf(14.8730)); - final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(BigDecimal.valueOf(148.73)) - .setQuantity(BigDecimal.valueOf(12)) + final IZUGFeRDExportableProduct product = new IZUGFeRDExportableProductImpl().setVatPercent(valueOf(16)); + // 10 % discount on each item + final IZUGFeRDAllowanceCharge allowance = new IZUGFeRDAllowanceChargeImpl().setTotalAmount(valueOf(14.873)); + // 20 % charge + final IZUGFeRDAllowanceCharge charge = new IZUGFeRDAllowanceChargeImpl().setTotalAmount(valueOf(29.746)); + final IZUGFeRDExportableItem currentItem = new IZUGFeRDExportableItemImpl().setPrice(valueOf(148.73)) + .setQuantity(valueOf(12)) .setItemAllowances(new IZUGFeRDAllowanceCharge[] { allowance }) .setItemCharges(new IZUGFeRDAllowanceCharge[] { charge }) .setProduct(product); + final LineCalculator calculator = new LineCalculator(currentItem); - assertEquals(BigDecimal.valueOf(148.73), calculator.getPrice().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(1784.76), calculator.getItemTotalNetAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(1784.76), calculator.getItemTotalGrossAmount().stripTrailingZeros()); - assertEquals(BigDecimal.valueOf(285.5616), calculator.getItemTotalVATAmount().stripTrailingZeros()); + assertEquals(valueOf(163.603).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); + assertEquals(valueOf(1963.24).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); + assertEquals(valueOf(314.1184).stripTrailingZeros(), calculator.getItemTotalVATAmount().stripTrailingZeros()); } }