From 17bc5c483f83b83e8ecf18f2109bf4e3fdc4881c Mon Sep 17 00:00:00 2001 From: jstaerk Date: Mon, 14 Apr 2025 11:10:43 +0200 Subject: [PATCH] =?UTF-8?q?Correcting=20calculation=20for=20extended=5Ffre?= =?UTF-8?q?mdwaehrung=20(issue=20#764),=20now=20the=20following=20errors?= =?UTF-8?q?=20arise:=20[ERROR]=20=20=20CalculationTest.testTotalCalculator?= =?UTF-8?q?GrandTotalRounding:223=20expected:<101.86>=20but=20was:<104.04>?= =?UTF-8?q?=20[ERROR]=20=20=20DeSerializationTest.testItemAllowances:398?= =?UTF-8?q?=20expected:<19.52>=20but=20was:<18.33>=20[ERROR]=20=20=20ZF2Pu?= =?UTF-8?q?shTest.testAllowancesExport:648=20expected:<[4046].00>=20but=20?= =?UTF-8?q?was:<[10829].00>=20[ERROR]=20=20=20ZF2PushTest.testItemChargesA?= =?UTF-8?q?llowancesExport:286=20expected:<1[9.52]>=20but=20was:<1[8.33]>?= =?UTF-8?q?=20[ERROR]=20=20=20ZF2PushTest.testPushEdge:609=20ParseExceptio?= =?UTF-8?q?n=20should=20not=20be=20raised=20[ERROR]=20=20=20ZF2ZInvoiceImp?= =?UTF-8?q?orterTest.testEdgeInvoiceImport:179=20[ERROR]=20=20=20ZF2ZInvoi?= =?UTF-8?q?ceImporterTest.testItemAllowancesChargesImport:265=20[ERROR]=20?= =?UTF-8?q?=20=20CalculationTest.testLineCalculatorInclusiveAllowance:55?= =?UTF-8?q?=20=C2=BB=20Arithmetic=20Non-terminating=20decimal=20expansion;?= =?UTF-8?q?=20no=20exact=20representable=20decimal=20result.=20[ERROR]=20?= =?UTF-8?q?=20=20CalculationTest.testLineCalculatorInclusiveAllowanceAndCh?= =?UTF-8?q?arge:75=20=C2=BB=20Arithmetic=20Non-terminating=20decimal=20exp?= =?UTF-8?q?ansion;=20no=20exact=20representable=20decimal=20result.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/src/main/java/org/mustangproject/Charge.java | 6 +++--- .../org/mustangproject/ZUGFeRD/LineCalculator.java | 11 +++++++---- .../org/mustangproject/ZUGFeRD/CalculationTest.java | 7 +++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/org/mustangproject/Charge.java b/library/src/main/java/org/mustangproject/Charge.java index 1b3320bf..aaa14ba2 100644 --- a/library/src/main/java/org/mustangproject/Charge.java +++ b/library/src/main/java/org/mustangproject/Charge.java @@ -121,10 +121,10 @@ public class Charge implements IZUGFeRDAllowanceCharge { @Override public BigDecimal getTotalAmount(IAbsoluteValueProvider currentItem) { - if (percent!=null) { - return currentItem.getValue().multiply(getPercent().divide(new BigDecimal(100))); - } else if(totalAmount != null) { + if(totalAmount != null) { return totalAmount; + } else if (percent!=null) { + return currentItem.getValue().multiply(getPercent().divide(new BigDecimal(100))); } else { throw new RuntimeException("percent must be set"); } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java index d17ccfec..67d4ab35 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -42,21 +42,24 @@ public class LineCalculator { vatPercent = BigDecimal.ZERO; } 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; if ((currentItem!=null)&&(currentItem.getQuantity()!=null)) { 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. // Used the setScale only because that's also done in getBasisQuantity BigDecimal basisQuantity = currentItem.getBasisQuantity().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE.setScale(4) : currentItem.getBasisQuantity(); - itemTotalNetAmount = quantity.multiply(price).divide(basisQuantity, 18, RoundingMode.HALF_UP) - .subtract(allowanceItemTotal).setScale(2, RoundingMode.HALF_UP); + itemTotalNetAmount = quantity.multiply(currentItem.getPrice()).divide(basisQuantity, 18, RoundingMode.HALF_UP) + .subtract(allowanceItemTotal).subtract(allowance).add(charge).setScale(2, RoundingMode.HALF_UP); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java index 9f3f3ea2..73499123 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java @@ -82,9 +82,8 @@ public class CalculationTest extends ResourceCase { @Test public void testLineCalculatorForeignCurrencyExample() { -/* + File inputCII = getResourceAsFile("Extended_fremdwaehrung.xml"); -inputCII=new File("C:\\Users\\jstaerk\\workspace\\XMLExamples\\zfdiverses\\20250407\\fremdwaehrung.xml"); ZUGFeRDInvoiceImporter zii=new ZUGFeRDInvoiceImporter(); Invoice invoice=null; zii.doIgnoreCalculationErrors(); @@ -104,9 +103,9 @@ inputCII=new File("C:\\Users\\jstaerk\\workspace\\XMLExamples\\zfdiverses\\20250 final TransactionCalculator calculator = new TransactionCalculator(invoice); - assertEquals(valueOf(521.91).stripTrailingZeros(), calculator.getGrandTotal().stripTrailingZeros()); + assertEquals(valueOf(521.91).stripTrailingZeros(), calculator.getDuePayable().stripTrailingZeros()); + - */ }