From 92d9240af5464818c5d16b4b69c7bc73c9d0346e Mon Sep 17 00:00:00 2001 From: Zahi YOUSFI Date: Mon, 16 Feb 2026 12:48:21 +0100 Subject: [PATCH] Add factory method createCalculator() in ZUGFeRD2PullProvider to allow custom TransactionCalculator injection --- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 6 +- .../ZUGFeRD2PullProviderFactoryTest.java | 71 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProviderFactoryTest.java diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index d7aab6178..47088d77a 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -339,10 +339,14 @@ protected String getItemTotalAllowanceChargeStr(IZUGFeRDAllowanceCharge allowanc return itemTotalAllowanceChargeStr; } + protected TransactionCalculator createCalculator(IExportableTransaction trans) { + return new TransactionCalculator(trans); + } + @Override public void generateXML(IExportableTransaction trans) { this.trans = trans; - this.calc = new TransactionCalculator(trans); + this.calc = createCalculator(trans); boolean hasDueDate = trans.getDueDate() != null; final SimpleDateFormat germanDateFormat = new SimpleDateFormat("dd.MM.yyyy"); diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProviderFactoryTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProviderFactoryTest.java new file mode 100644 index 000000000..21fae0b49 --- /dev/null +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProviderFactoryTest.java @@ -0,0 +1,71 @@ +package org.mustangproject.ZUGFeRD; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.math.BigDecimal; +import java.util.Date; + +import org.junit.jupiter.api.Test; +import org.mustangproject.Invoice; +import org.mustangproject.Item; +import org.mustangproject.Product; +import org.mustangproject.TradeParty; + +public class ZUGFeRD2PullProviderFactoryTest { + + static class TestTransactionCalculator extends TransactionCalculator { + + private boolean called = false; + + public TestTransactionCalculator(IExportableTransaction trans) { + super(trans); + } + + @Override + public BigDecimal getGrandTotal() { + called = true; + return BigDecimal.valueOf(999.99); + } + + public boolean wasCalled() { + return called; + } + } + + static class TestPullProvider extends ZUGFeRD2PullProvider { + + private TestTransactionCalculator calculator; + + @Override + protected TransactionCalculator createCalculator(IExportableTransaction trans) { + calculator = new TestTransactionCalculator(trans); + return calculator; + } + + public TestTransactionCalculator getCalculator() { + return calculator; + } + } + + @Test + void customCalculatorIsUsed() throws Exception { + + TradeParty buyer = new TradeParty("Client X", "3 rue C", "33000", "Bordeaux", "FR"); + TradeParty seller = new TradeParty("Mairie A", "1 rue A", "75001", "Paris", "FR"); + + Invoice invoice = new Invoice().setNumber("INV-CALC-001").setIssueDate(new Date()).setDeliveryDate(new Date()) + .setDueDate(new Date()).setCurrency("EUR").setSender(buyer).setRecipient(seller); + + Product service = new Product("Prestation", "Service intercommunal", "C62", new BigDecimal("20.00")); + + invoice.addItem(new Item(service, BigDecimal.ONE, BigDecimal.TEN).setTax(BigDecimal.valueOf(20))); + + TestPullProvider provider = new TestPullProvider(); + + provider.generateXML(invoice); + + assertNotNull(provider.getCalculator()); + assertTrue(provider.getCalculator().wasCalled()); + } +}