diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/einvoice/KSeFAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/einvoice/KSeFAdapter.java
index 66badbc..09e903b 100644
--- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/einvoice/KSeFAdapter.java
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/einvoice/KSeFAdapter.java
@@ -146,7 +146,7 @@ public class KSeFAdapter implements SignalAdapter {
* @param workitem
* @throws PluginException
*/
- private void updateEInvoice(FileData fileDataXMLTemplate, ItemCollection workitem) throws PluginException {
+ public void updateEInvoice(FileData fileDataXMLTemplate, ItemCollection workitem) throws PluginException {
try {
EInvoiceModel model = EInvoiceModelFactory.read(new ByteArrayInputStream(fileDataXMLTemplate.getContent()));
diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ksef/api/KSeFAPIService.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ksef/api/KSeFAPIService.java
index 7a20008..c10f8cd 100644
--- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ksef/api/KSeFAPIService.java
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ksef/api/KSeFAPIService.java
@@ -426,8 +426,11 @@ public class KSeFAPIService {
// Base64URL ohne Padding
String base64Url = Base64.getUrlEncoder().withoutPadding().encodeToString(decoded);
- // https://ksef-test.mf.gov.pl/api/v2 -> https://ksef-test.mf.gov.pl/client-app/
- baseURL = baseURL.replace("/api/v2", "/client-app/invoice");
+ // Die Client App URL muss angepasst werden. Das /v2/ element aus der Basis URL
+ // muss mit 'client-app/invoice' ausgetauscht werden.
+ // Es entsteht dann https://api-test.ksef.mf.gov.pl/client-app/invoice/
+
+ baseURL = baseURL.replace("/v2", "/client-app/invoice");
// Build verification URL
workitem.setItemValue("ksef.VerificationUrl",
baseURL + "/" + kseFAuthManager.getKsefNip() + "/" + invoiceDate + "/"
diff --git a/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/ksef/api/KSeFAdapterTest.java b/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/ksef/api/KSeFAdapterTest.java
new file mode 100644
index 0000000..ac004ca
--- /dev/null
+++ b/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/ksef/api/KSeFAdapterTest.java
@@ -0,0 +1,170 @@
+package com.alexanderlogistics.ksef.api;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.imixs.workflow.FileData;
+import org.imixs.workflow.ItemCollection;
+import org.imixs.workflow.engine.DocumentService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import com.alexanderlogistics.BusinessPartnerService;
+import com.alexanderlogistics.InvoiceService;
+import com.alexanderlogistics.TestLoggerConfig;
+import com.alexanderlogistics.einvoice.KSeFAdapter;
+
+/**
+ * Der KSeFAdapterTest prüft die Umwandlung einer Rechnung in die KSeF XML
+ * Struktur.
+ *
+ * Der Test simuliert eine Invoice und ruft dann den KSeFAdapter an um ein
+ * Output File zu erzeugen.
+ *
+ * Zum validieren kann man dann den validate_xml.sh Script hernehmen
+ *
+ */
+
+@ExtendWith(MockitoExtension.class)
+public class KSeFAdapterTest {
+
+ private static Logger logger = Logger.getLogger(KSeFAdapterTest.class.getName());
+
+ private static final String TEMPLATE_FILE = "ksef/ksef.xml";
+ private static final String OUTPUT_FILE = "ksef-output.xml";
+
+ ItemCollection workitem;
+ ItemCollection businessPartner;
+
+ @Mock
+ private BusinessPartnerService businessPartnerService;
+
+ @Mock
+ private DocumentService documentService;
+
+ @Mock
+ private InvoiceService invoiceService;
+
+ @InjectMocks
+ private KSeFAdapter adapter;
+
+ @BeforeEach
+ void setup() throws Exception {
+
+ TestLoggerConfig.setupTestLogger();
+ // Prepare a workitem with typical invoice data
+ workitem = new ItemCollection();
+ workitem.setItemValue("invoice.number", "FV/2025/001");
+ workitem.setItemValue("invoice.date", LocalDate.of(2025, 2, 10));
+ workitem.setItemValue("invoice.duedate", LocalDate.of(2025, 3, 10));
+ workitem.setItemValue("invoice.currency", "PLN");
+ workitem.setItemValue("invoice.total.net", 10000.00);
+ workitem.setItemValue("invoice.total.tax", 23.0);
+ workitem.setItemValue("invoice.total", 12300.00);
+ workitem.setItemValue("invoice.correction", "false");
+ workitem.setItemValue("invoice.CorrectionInvoiceNumber", "");
+ workitem.setItemValue("partner.id", "BP-001");
+ workitem.setItemValue("partner.vat", "PL1234567890");
+
+ // Prepare child items (invoice line items)
+ List