Correct and simplify calculation

In the test case with allowance the VAT amount was calculated 1 ct too high.
This commit is contained in:
Sebastian Sieber
2020-11-17 18:07:16 +01:00
parent 5a5f8272b2
commit 4ba099c86d
2 changed files with 63 additions and 7 deletions

View File

@@ -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);
}

View File

@@ -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());
}
}