fixed KSeF Upload

This commit is contained in:
Ralph Soika 2025-11-26 23:31:45 +01:00
parent 082f0f609d
commit 9024ee2e38
10 changed files with 482 additions and 115 deletions

View file

@ -173,6 +173,8 @@ The implementation uses `PluginException` for error handling with two error type
- [Facture Details](https://github.com/CIRFMF/ksef-docs/blob/main/sesja-interaktywna.md#2-wys%C5%82anie-faktury)
- [XML Invoice Example](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/weryfikacja-faktury.md)
- [Github Discussions](https://github.com/CIRFMF/ksef-docs/issues/351#issuecomment-3538013805)
# Validate XML
To validate XML results use xmllint. To install run:
@ -242,14 +244,6 @@ Invoice that corrects a previously issued invoice (VAT, ZAL, or ROZ).
<P_15>-628.00</P_15> <!-- Difference in Total -->
```
⚠️ **Important:**
- KOR uses different P_13/P_14 fields than VAT
- `P_13_1`, `P_14_1` → Used in VAT invoices
- `P_13_6_1`, `P_13_7`, etc. → Used in KOR invoices (for 0% rate, exempt, etc.)
---
## DaneFaKorygowanej Element
**Required in KOR invoices** - Must appear AFTER `<RodzajFaktury>KOR</RodzajFaktury>`
@ -296,3 +290,12 @@ Invoice that corrects a previously issued invoice (VAT, ZAL, or ROZ).
```
---
# Testdaten
Um Testdaten in die lokale Dev Umgebung zu importieren:
1. aus dem Produktiv Archiv System das XML eines Rechnungs-Snapshots unter /docker/transfer speichern
2. per api Call importieren:
http://localhost:8080/api/cargosoft/import?file=/opt/jboss/wildfly/transfer/f28bf914-04de-4843-9809-54c724bdc9bf-1764111735524.xml

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -70,7 +70,7 @@ public class KSeFAPIService {
public void uploadInvoice(ItemCollection workitem, String fileName) throws PluginException {
// First open an interactive session (reuses existing if valid)
kseFAuthManager.openSession();
kseFAuthManager.openSession(workitem);
logger.info("├── 📤 Upload Invoice...");
@ -190,20 +190,32 @@ public class KSeFAPIService {
// Status abfragen
// Now we need to wait until auth/{AuthRef} will return 200
int code = -1;
long start = System.currentTimeMillis();
long timeout = 20_000; // 20 Sekunden
boolean timeoutStatus = true;
while (System.currentTimeMillis() - start < timeout) {
int code = kseFAuthManager.checkSessionStatus();
code = kseFAuthManager.checkSessionStatus(workitem);
if (code >= 200) {
break; // ok or borken
timeoutStatus = false;
break; // ok or broken
}
// kleine Pause, um CPU zu schonen
kseFAuthManager.waitSomeTime(500);
}
if (timeoutStatus) {
logger.severe("├── ⚠️ Status timeout");
}
// In case we have an error we print out the reason...
if (code > 200) {
kseFAuthManager.checkSessionStatusInvoices();
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"Failed to process invoice: " + response.statusCode());
}
} catch (Exception e) {
logger.severe("├── ⚠️ Invoice upload failed: " + e.getMessage());
@ -217,96 +229,6 @@ public class KSeFAPIService {
}
}
/**
* Poll Invoice Status
*
* https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Status-wysylki-i-UPO/paths/~1api~1v2~1sessions~1%7BreferenceNumber%7D/get
*
* @param workitem
* @return
* @throws PluginException
*/
private int xxxgetInvoiceStatus(ItemCollection workitem) throws PluginException {
logger.info("├── 🔎 Get Invoice Status...");
// Validate session
if (kseFAuthManager.getAccessToken() == null) {
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"API Error - missing AccessToken!");
}
if (kseFAuthManager.getSessionRefNumber() == null) {
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"API Error - missing SessionRefNumber!");
}
if (kseFAuthManager.getSessionEncryption() == null) {
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"API Error - missing Session Encryption!");
}
try {
String referenceNumber = workitem.getItemValueString("ksef.referenceNumber");
if (referenceNumber.isBlank()) {
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"API Error - missing invoice referenceNumber!");
}
// Calculate hashes
// Send upload request
String uri = kseFAuthManager.getBaseURI() + "/sessions/" + kseFAuthManager.getSessionRefNumber();
logger.info("│ ├── GET: " + uri);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(uri))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + kseFAuthManager.getAccessToken())
.GET()
.build();
HttpResponse<String> response = kseFAuthManager.getHttpClient().send(
request, HttpResponse.BodyHandlers.ofString());
logger.info("│ ├── HTTP Response: " + response.statusCode());
logger.info("│ ├── Response Body: " + response.body());
int statusCode = -1;
String statusDescription = "";
try (Jsonb jsonb = JsonbBuilder.create()) {
JsonObject jsonObject = jsonb.fromJson(response.body(), JsonObject.class);
// Status Code aus dem status-Objekt extrahieren
if (jsonObject.containsKey("status")) {
JsonObject statusObject = jsonObject.getJsonObject("status");
if (statusObject.containsKey("code")) {
statusCode = statusObject.getInt("code");
statusDescription = statusObject.getString("description");
logger.info("│ ├── Status Code: " + statusCode);
logger.info("│ ├── Status Description: " + statusDescription);
}
}
} catch (Exception e) {
logger.severe("├── ⚠️ Error parsing JSON response: " + e.getMessage());
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"Error parsing JSON response: " + e.getMessage());
}
workitem.setItemValue("ksef.status.code", statusCode);
workitem.setItemValue("ksef.status.description", statusDescription);
return statusCode;
} catch (Exception e) {
logger.severe("├── ⚠️ Get Invoice status failed: " + e.getMessage());
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"Invoice upload failed: " + e.getMessage());
}
}
/**
* Encrypt invoice XML with the session encryption keys
*

View file

@ -28,6 +28,7 @@ import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.exceptions.InvalidAccessException;
import org.imixs.workflow.exceptions.PluginException;
@ -182,7 +183,7 @@ public class KSeFAuthManager {
*
* @throws PluginException
*/
public void openSession() throws PluginException {
public void openSession(ItemCollection workitem) throws PluginException {
logger.info("├── open Session...");
if (!hasValidSession()) {
@ -203,7 +204,7 @@ public class KSeFAuthManager {
this.openInteractiveSession();
this.waitForSessionStatus();
this.waitForSessionStatus(workitem);
} else {
logger.warning("│ ├── ! Session already exists - reuse existing KSeF Session...");
@ -497,7 +498,7 @@ public class KSeFAuthManager {
*
* @throws PluginException
*/
public void waitForSessionStatus() throws PluginException {
public void waitForSessionStatus(ItemCollection workitem) throws PluginException {
logger.info("├── 🔜 Waiting for Session status 200...");
// Now we need to wait until auth/{AuthRef} will return 200
@ -505,7 +506,7 @@ public class KSeFAuthManager {
long timeout = 120_000; // 120 Sekunden
while (System.currentTimeMillis() - start < timeout) {
int status = this.checkSessionStatus();
int status = this.checkSessionStatus(workitem);
// Status 100 = Session opened and ready for uploads!
if (status == 100 || status == 200) {
@ -638,7 +639,7 @@ public class KSeFAuthManager {
String jsonPayload = String.format(
"{" +
"\"formCode\": {" +
" \"systemCode\": \"FA (2)\"," +
" \"systemCode\": \"FA (3)\"," +
" \"schemaVersion\": \"1-0E\"," +
" \"value\": \"FA\"" +
"}," +
@ -862,8 +863,8 @@ public class KSeFAuthManager {
* @return Session Status Code
* @throws PluginException
*/
public int checkSessionStatus() throws PluginException {
logger.info("├── ↩️ KSeF API check session status...");
public int checkSessionStatus(ItemCollection workitem) throws PluginException {
logger.info("├── ↩️ KSeF API check session status...");
String uri = baseURI + "/sessions/" + this.sessionRefNumber;
int httpResponse = -1;
int statusCode = -1;
@ -898,6 +899,8 @@ public class KSeFAuthManager {
statusCode = statusObject.getInt("code");
logger.info("│ ├── Status Code: " + statusCode);
logger.info("│ ├── Status Description: " + statusObject.getString("description"));
workitem.setItemValue("ksef.status.code", statusCode);
workitem.setItemValue("ksef.status.description", statusObject.getString("description"));
}
}
@ -910,6 +913,44 @@ public class KSeFAuthManager {
return statusCode;
}
/**
* This method verifies the actual status of the status of all invoices
*
* The method returns the aut status code (not the HTTP Response code!)
*
* https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Status-wysylki-i-UPO/paths/~1api~1v2~1sessions~1%7BreferenceNumber%7D/get
*
* @return Session Status Code
* @throws PluginException
*/
public void checkSessionStatusInvoices() throws PluginException {
logger.info("├── ↩️ KSeF API check session status invoices...");
String uri = baseURI + "/sessions/" + this.sessionRefNumber + "/invoices";
int httpResponse = -1;
int statusCode = -1;
logger.info("│ ├── GET: " + uri);
HttpResponse<String> response = null;
try {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(uri))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + this.accessToken)
.GET()
.build();
response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
throw new PluginException(KSeFAuthManager.class.getSimpleName(), ERROR_API,
"API Error: Unable to request auth status: " + e.getMessage());
}
httpResponse = response.statusCode();
logger.info("│ ├── HTTP Response: " + httpResponse);
logger.info("│ ├── " + response.body());
}
/**
* This method returns all active auth sessions
*

View file

@ -16,6 +16,7 @@ import java.util.logging.Logger;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.imixs.workflow.ItemCollection;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
@ -90,7 +91,7 @@ public class KSeFAuthManagerTest {
manager.openInteractiveSession();
manager.waitForSessionStatus();
manager.waitForSessionStatus(new ItemCollection());
assertNotNull(manager.getAccessToken(), "AccessToken fehlt");
// assertNotNull(manager.getRefNumber(), "ReferenceNumber fehlt");

View file

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<Faktura xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/"
xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Naglowek>
<KodFormularza kodSystemowy="FA (3)" wersjaSchemy="1-0E">FA</KodFormularza>
<WariantFormularza>3</WariantFormularza>
<DataWytworzeniaFa>2025-11-26T20:54:14.666080555Z</DataWytworzeniaFa>
<SystemInfo>Imixs eInvoice</SystemInfo>
</Naglowek>
<!-- Seller (Your Polish Company - Pre-filled) -->
<Podmiot1>
<DaneIdentyfikacyjne>
<NIP>9552521552</NIP>
<Nazwa>Alexander Global Logistics</Nazwa>
</DaneIdentyfikacyjne>
<Adres>
<KodKraju>PL</KodKraju>
<AdresL1>Gdanska 36</AdresL1>
<AdresL2>70-660 Szczecin</AdresL2>
</Adres>
<DaneKontaktowe>
<Email>MBudas@alexander-logistics.com</Email>
</DaneKontaktowe>
</Podmiot1>
<!-- Buyer (Customer - Empty, to be filled) -->
<Podmiot2>
<DaneIdentyfikacyjne>
<!-- NIP falls eine PL Ust Vorliegt
ansonsten NrID - geht immer -->
<!-- <Nazwa>#Customer Name#</Nazwa> -->
<NrID>TR3830419015</NrID>
<Nazwa>Evolog Nakliyat ve Lojistik Hizmetleri</Nazwa>
</DaneIdentyfikacyjne>
<Adres>
<KodKraju>TR</KodKraju>
<AdresL1>Caddesi,No. 56 Halkali, Kucukcekmece,</AdresL1>
<AdresL2>34303 Istanbul</AdresL2>
</Adres>
<!---
Contact information from buyer can be left
<DaneKontaktowe>
<Email></Email>
<Telefon></Telefon>
</DaneKontaktowe>
-->
<NrKlienta>D21578</NrKlienta>
<JST>2</JST>
<!-- fixed -->
<GV>2</GV>
<!-- fixed -->
</Podmiot2>
<!-- Invoice Data -->
<Fa>
<KodWaluty>EUR</KodWaluty>
<P_1>2025-10-27</P_1>
<!-- Invoice Date -->
<P_2>6210</P_2>
<!-- Invoice Number -->
<P_6>2025-11-26</P_6>
<!-- Due Date -->
<!-- Totals -->
<P_13_1>150.00</P_13_1>
<!-- Total Net -->
<P_14_1>0.00</P_14_1>
<!-- Total VAT -->
<P_15>150.00</P_15>
<!-- Total Gross -->
<Adnotacje>
<!-- 1 yes - 2 no -->
<P_16>2</P_16>
<!-- Keine Selbstfakturierung -->
<P_17>2</P_17>
<!-- Kein Reverse Charge -->
<P_18>2</P_18>
<!-- Kein Split Payment (Rechnung unter 15.000 PLN/EUR) -->
<P_18A>2</P_18A>
<!-- Keine Steuerbefreiung -->
<Zwolnienie>
<P_19N>1</P_19N>
</Zwolnienie>
<!-- Keine neuen Verkehrsmittel -->
<NoweSrodkiTransportu>
<P_22N>1</P_22N>
</NoweSrodkiTransportu>
<!-- Kein vereinfachtes Verfahren nach Art. 135 -->
<P_23>2</P_23>
<!-- Keine Margenregelung -->
<PMarzy>
<P_PMarzyN>1</P_PMarzyN>
</PMarzy>
</Adnotacje>
<!-- Invoice Type (VAT) -->
<RodzajFaktury>VAT</RodzajFaktury>
<!-- Invoice Positions: FaWiersz -->
<FaWiersz>
<NrWierszaFa>1</NrWierszaFa>
<UU_ID>d8c66c5e-dc09-45be-b986-a2cc298f4195</UU_ID>
<P_7>EX-GDY-2509-010</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>100.00</P_9A>
<P_11>100.00</P_11>
<P_12>0 KR</P_12> <!-- 0% explizit angegeben -->
</FaWiersz>
<FaWiersz>
<NrWierszaFa>2</NrWierszaFa>
<UU_ID>e8f02172-9b2a-4dcb-84b5-632e5c2a52b6</UU_ID>
<P_7>EX-GDY-2509-010</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>50.00</P_9A>
<P_11>50.00</P_11>
<P_12>0 KR</P_12> <!-- 0% explizit angegeben -->
</FaWiersz>
</Fa>
</Faktura>

View file

@ -0,0 +1,17 @@
{
"invoices": [
{
"ordinalNumber": 1,
"referenceNumber": "20251126-EE-481F863000-7F510C2298-8A",
"invoiceHash": "tR5z/LEg2accg3AKWoibxJF9Xoht15Pf8T1lT6S3WLc=",
"invoicingDate": "2025-11-26T21:00:26.5956823+00:00",
"status": {
"code": 450,
"description": "Błąd weryfikacji semantyki dokumentu faktury",
"details": [
"Could not find schema information for the element 'http://crd.gov.pl/wzor/2025/06/25/13775/:Faktura'."
]
}
}
]
}

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Faktura
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
<Faktura xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/"
xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/"
xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/">
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Naglowek>
<KodFormularza kodSystemowy="FA (3)" wersjaSchemy="1-0E">FA</KodFormularza>
<WariantFormularza>3</WariantFormularza>

View file

@ -128,6 +128,8 @@ th { font-weight: bold;}
<bpmn2:flowNodeRef>gateway_H0SvJw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_awoe6g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_UOQyTg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_uWaQ1A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_wYot0Q</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="Lane_6" name="Buchhaltung">
<bpmn2:documentation id="documentation_N3gEbw"/>
@ -168,6 +170,7 @@ th { font-weight: bold;}
<bpmn2:flowNodeRef>ExclusiveGateway_3</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_V0KVQg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_w96sOg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_hOBFVQ</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_5000-20" imixs:activityid="50" name="[Due date]">
@ -494,6 +497,7 @@ Bei Fragen wenden Sie sich bitte an info@imixs.com
<bpmn2:outgoing>SequenceFlow_34</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_zhcE7Q</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_I5jpvQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_4Wq8Vw</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:endEvent id="EndEvent_1" name="Ende">
<bpmn2:incoming>SequenceFlow_61</bpmn2:incoming>
@ -1413,7 +1417,9 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<bpmn2:incoming>sequenceFlow_sO35Dg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_jpNRMg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ui7tJg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_1T6Vew</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_2BSFNw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_hN7cDg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_sGMk3g" imixs:activityid="200" name="[create E-Invoice]">
<bpmn2:extensionElements>
@ -2194,6 +2200,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway default="sequenceFlow_Tp8LKg" gatewayDirection="Diverging" id="gateway_S4b22A" name="">
<bpmn2:documentation id="documentation_k0Mbug"/>
<bpmn2:incoming>sequenceFlow_AdA0GA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_DCA0Tw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_2th1MQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_Tp8LKg</bpmn2:outgoing>
@ -2388,6 +2395,167 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<bpmn2:sequenceFlow id="sequenceFlow_ui7tJg" sourceRef="gateway_k00hrA" targetRef="task_nKKaIg">
<bpmn2:documentation id="documentation_guvIKA"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateThrowEvent id="event_hOBFVQ" name="KSEF">
<bpmn2:incoming>sequenceFlow_4Wq8Vw</bpmn2:incoming>
<bpmn2:linkEventDefinition id="linkEventDefinition_FX1s0Q" name="Link Event Definition 5"/>
<bpmn2:documentation id="documentation_90gY9Q"/>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_4Wq8Vw" sourceRef="Task_1" targetRef="event_hOBFVQ">
<bpmn2:documentation id="documentation_JBOF3w"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_uWaQ1A" imixs:activityid="10" name="Save">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[$creator]]></imixs:value>
<imixs:value><![CDATA[$editor]]></imixs:value>
<imixs:value><![CDATA[process.manager]]></imixs:value>
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[$editor]]></imixs:value>
<imixs:value><![CDATA[$creator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="comment" ignore="true"/>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_fjA9Bg"><![CDATA[Zwischenspeichern]]></bpmn2:documentation>
<bpmn2:outgoing>sequenceFlow_1T6Vew</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_1T6Vew" sourceRef="event_uWaQ1A" targetRef="task_nKKaIg">
<bpmn2:documentation id="documentation_961bZA"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_wYot0Q" imixs:activityid="207" name="[Export KSeF]">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[$creator]]></imixs:value>
<imixs:value><![CDATA[$editor]]></imixs:value>
<imixs:value><![CDATA[process.manager]]></imixs:value>
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[$editor]]></imixs:value>
<imixs:value><![CDATA[$creator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<ksef name="EXPORT">
<debug>true</debug>
</ksef> ]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_QA74Ag"/>
<bpmn2:incoming>sequenceFlow_hN7cDg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_AdA0GA</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_O7abkQ" signalRef="signal_11"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_hN7cDg" sourceRef="task_nKKaIg" targetRef="event_wYot0Q">
<bpmn2:documentation id="documentation_MXhwpg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_AdA0GA" sourceRef="event_wYot0Q" targetRef="gateway_S4b22A">
<bpmn2:documentation id="documentation_bun7fw"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:process id="process_2" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_J67Rkw"/>
@ -2759,6 +2927,24 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<dc:Bounds height="20.0" width="100.0" x="2325.0" y="396.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_hOBFVQ" id="BPMNShape_lp0cJw">
<dc:Bounds height="36.0" width="36.0" x="1300.0" y="1260.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_Nfu0Cw">
<dc:Bounds height="20.0" width="100.0" x="1268.0" y="1299.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_uWaQ1A" id="BPMNShape_SQwkDA">
<dc:Bounds height="36.0" width="36.0" x="977.0" y="557.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_M5uthw">
<dc:Bounds height="20.0" width="100.0" x="945.0" y="596.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_wYot0Q" id="BPMNShape_c1U2mw">
<dc:Bounds height="36.0" width="36.0" x="1297.0" y="387.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_x2CXZA">
<dc:Bounds height="20.0" width="100.0" x="1265.0" y="426.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_33" id="BPMNEdge_SequenceFlow_34" sourceElement="BPMNShape_ExclusiveGateway_1">
<di:waypoint x="910.0" y="835.0"/>
<di:waypoint x="1130.0" y="835.0"/>
@ -3101,6 +3287,29 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<di:waypoint x="921.0" y="527.0"/>
<di:waypoint x="921.0" y="490.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_4Wq8Vw" id="BPMNEdge_YLr5gA" sourceElement="BPMNShape_Task_3" targetElement="BPMNShape_lp0cJw">
<di:waypoint x="1240.0" y="1375.0"/>
<di:waypoint x="1270.0" y="1375.0"/>
<di:waypoint x="1270.0" y="1278.0"/>
<di:waypoint x="1300.0" y="1278.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_1T6Vew" id="BPMNEdge_NI9PQQ" sourceElement="BPMNShape_SQwkDA" targetElement="BPMNShape_ksu2zQ">
<di:waypoint x="977.0" y="575.0"/>
<di:waypoint x="964.0" y="575.0"/>
<di:waypoint x="964.0" y="465.0"/>
<di:waypoint x="950.0" y="465.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_hN7cDg" id="BPMNEdge_d0uNUg" sourceElement="BPMNShape_ksu2zQ" targetElement="BPMNShape_c1U2mw">
<di:waypoint x="894.0" y="440.0"/>
<di:waypoint x="894.0" y="409.0"/>
<di:waypoint x="1297.0" y="409.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_AdA0GA" id="BPMNEdge_ZdEobw" sourceElement="BPMNShape_c1U2mw" targetElement="BPMNShape_whGktg">
<di:waypoint x="1333.0" y="409.0"/>
<di:waypoint x="1420.0" y="409.0"/>
<di:waypoint x="1420.0" y="465.0"/>
<di:waypoint x="1500.0" y="465.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>