From 4ba099c86d60ad7cb1e123cc0f53448f445ac7af Mon Sep 17 00:00:00 2001 From: Sebastian Sieber Date: Tue, 17 Nov 2020 18:07:16 +0100 Subject: [PATCH] Correct and simplify calculation In the test case with allowance the VAT amount was calculated 1 ct too high. --- .../ZUGFeRD/LineCalculator.java | 9 +-- .../ZUGFeRD/LineCalculatorTest.java | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java index 34f71022..5346d408 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -7,7 +7,6 @@ import java.math.BigDecimal; * @see TransactionCalculator */ public class LineCalculator { - private BigDecimal totalGross; private BigDecimal price; private BigDecimal priceGross; private BigDecimal itemTotalNetAmount; @@ -27,16 +26,12 @@ public class LineCalculator { addCharge(charge.getTotalAmount(currentItem)); } } - BigDecimal multiplicator = currentItem.getProduct().getVATPercent().divide(new BigDecimal(100)) - .add(new BigDecimal(1)); + BigDecimal multiplicator = currentItem.getProduct().getVATPercent().divide(BigDecimal.valueOf(100)); priceGross = currentItem.getPrice(); // see https://github.com/ZUGFeRD/mustangproject/issues/159 price = priceGross.subtract(allowance).add(charge); - totalGross = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity()) - .multiply(multiplicator); itemTotalNetAmount = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity()) .setScale(2, BigDecimal.ROUND_HALF_UP); - itemTotalVATAmount = totalGross.subtract(itemTotalNetAmount); - + itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java new file mode 100644 index 00000000..aca40ce4 --- /dev/null +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/LineCalculatorTest.java @@ -0,0 +1,61 @@ +package org.mustangproject.ZUGFeRD; + +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)) + .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()); + } + + @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)) + .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()); + } + + @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)) + .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()); + } +}