Correcting calculation for extended_fremdwaehrung (issue #764), now the following errors arise:

[ERROR]   CalculationTest.testTotalCalculatorGrandTotalRounding:223 expected:<101.86> but was:<104.04>
[ERROR]   DeSerializationTest.testItemAllowances:398 expected:<19.52> but was:<18.33>
[ERROR]   ZF2PushTest.testAllowancesExport:648 expected:<[4046].00> but was:<[10829].00>
[ERROR]   ZF2PushTest.testItemChargesAllowancesExport:286 expected:<1[9.52]> but was:<1[8.33]>
[ERROR]   ZF2PushTest.testPushEdge:609 ParseException should not be raised
[ERROR]   ZF2ZInvoiceImporterTest.testEdgeInvoiceImport:179
[ERROR]   ZF2ZInvoiceImporterTest.testItemAllowancesChargesImport:265
[ERROR]   CalculationTest.testLineCalculatorInclusiveAllowance:55 » Arithmetic Non-terminating decimal expansion; no exact representable decimal result.
[ERROR]   CalculationTest.testLineCalculatorInclusiveAllowanceAndCharge:75 » Arithmetic Non-terminating decimal expansion; no exact representable decimal result.
This commit is contained in:
jstaerk
2025-04-14 11:10:43 +02:00
parent f635f355be
commit 17bc5c483f
3 changed files with 13 additions and 11 deletions

View File

@@ -121,10 +121,10 @@ public class Charge implements IZUGFeRDAllowanceCharge {
@Override @Override
public BigDecimal getTotalAmount(IAbsoluteValueProvider currentItem) { public BigDecimal getTotalAmount(IAbsoluteValueProvider currentItem) {
if (percent!=null) { if(totalAmount != null) {
return currentItem.getValue().multiply(getPercent().divide(new BigDecimal(100)));
} else if(totalAmount != null) {
return totalAmount; return totalAmount;
} else if (percent!=null) {
return currentItem.getValue().multiply(getPercent().divide(new BigDecimal(100)));
} else { } else {
throw new RuntimeException("percent must be set"); throw new RuntimeException("percent must be set");
} }

View File

@@ -42,21 +42,24 @@ public class LineCalculator {
vatPercent = BigDecimal.ZERO; vatPercent = BigDecimal.ZERO;
} }
BigDecimal multiplicator = vatPercent.divide(BigDecimal.valueOf(100)); BigDecimal multiplicator = vatPercent.divide(BigDecimal.valueOf(100));
priceGross = currentItem.getPrice(); // see https://github.com/ZUGFeRD/mustangproject/issues/159
price = priceGross.subtract(allowance).add(charge);
BigDecimal quantity=BigDecimal.ZERO; BigDecimal quantity=BigDecimal.ZERO;
if ((currentItem!=null)&&(currentItem.getQuantity()!=null)) { if ((currentItem!=null)&&(currentItem.getQuantity()!=null)) {
quantity=currentItem.getQuantity(); quantity=currentItem.getQuantity();
} }
price=currentItem.getPrice();
BigDecimal delta=charge.subtract(allowanceItemTotal).subtract(allowance);
delta=delta.divide(currentItem.getQuantity());
priceGross=currentItem.getPrice().add(delta);
// Division/Zero occurred here. // Division/Zero occurred here.
// Used the setScale only because that's also done in getBasisQuantity // Used the setScale only because that's also done in getBasisQuantity
BigDecimal basisQuantity = currentItem.getBasisQuantity().compareTo(BigDecimal.ZERO) == 0 BigDecimal basisQuantity = currentItem.getBasisQuantity().compareTo(BigDecimal.ZERO) == 0
? BigDecimal.ONE.setScale(4) ? BigDecimal.ONE.setScale(4)
: currentItem.getBasisQuantity(); : currentItem.getBasisQuantity();
itemTotalNetAmount = quantity.multiply(price).divide(basisQuantity, 18, RoundingMode.HALF_UP) itemTotalNetAmount = quantity.multiply(currentItem.getPrice()).divide(basisQuantity, 18, RoundingMode.HALF_UP)
.subtract(allowanceItemTotal).setScale(2, RoundingMode.HALF_UP); .subtract(allowanceItemTotal).subtract(allowance).add(charge).setScale(2, RoundingMode.HALF_UP);
itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator);
} }

View File

@@ -82,9 +82,8 @@ public class CalculationTest extends ResourceCase {
@Test @Test
public void testLineCalculatorForeignCurrencyExample() { public void testLineCalculatorForeignCurrencyExample() {
/*
File inputCII = getResourceAsFile("Extended_fremdwaehrung.xml"); File inputCII = getResourceAsFile("Extended_fremdwaehrung.xml");
inputCII=new File("C:\\Users\\jstaerk\\workspace\\XMLExamples\\zfdiverses\\20250407\\fremdwaehrung.xml");
ZUGFeRDInvoiceImporter zii=new ZUGFeRDInvoiceImporter(); ZUGFeRDInvoiceImporter zii=new ZUGFeRDInvoiceImporter();
Invoice invoice=null; Invoice invoice=null;
zii.doIgnoreCalculationErrors(); zii.doIgnoreCalculationErrors();
@@ -104,9 +103,9 @@ inputCII=new File("C:\\Users\\jstaerk\\workspace\\XMLExamples\\zfdiverses\\20250
final TransactionCalculator calculator = new TransactionCalculator(invoice); final TransactionCalculator calculator = new TransactionCalculator(invoice);
assertEquals(valueOf(521.91).stripTrailingZeros(), calculator.getGrandTotal().stripTrailingZeros()); assertEquals(valueOf(521.91).stripTrailingZeros(), calculator.getDuePayable().stripTrailingZeros());
*/
} }