export zoho vendor credit

This commit is contained in:
Ralph Soika 2025-05-19 18:57:22 +02:00
parent 1a82da08d5
commit 73731c89ea
8 changed files with 426 additions and 29 deletions

View file

@ -32,6 +32,8 @@ import com.alexanderlogistics.zoho.dto.ZohoContactFindResponse;
import com.alexanderlogistics.zoho.dto.ZohoInvoice;
import com.alexanderlogistics.zoho.dto.ZohoInvoiceCreateResponse;
import com.alexanderlogistics.zoho.dto.ZohoInvoiceItem;
import com.alexanderlogistics.zoho.dto.ZohoVendorCredit;
import com.alexanderlogistics.zoho.dto.ZohoVendorCreditCreateResponse;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.security.DeclareRoles;
@ -262,6 +264,76 @@ public class ZohoAPIService {
}
/**
* Exports an Eingangsrechnung as a Vendor Credit
*
* @see https://www.zoho.com/books/api/v3/expenses/#create-an-expense
*
* @param invoice
* @throws PluginException
*/
public ZohoVendorCredit exportVendorCredit(ItemCollection invoice, String contactID, String accountID,
String accessToken) throws PluginException {
logger.info("├── Zoho Export VendorCredit " + invoice.getItemValueString("invoice.number") + "...");
// Konvertiere ItemCollection zu ZohoInvoiceDTO
ZohoVendorCredit zohoVendorCredit = convertToZohoVendorCredit(invoice, contactID, accountID);
try {
String requestBody = jsonb.toJson(zohoVendorCredit);
// Print JSON to console for verification
logger.fine("├── Zoho VendorCredit JSON Request...");
logger.fine("│ ├── " + requestBody);
// https://www.zohoapis.com/books/v3/expenses?organization_id=10234695'
String uri = zohoOAuthManager.getBaseURI() + "vendorcredits?organization_id="
+ zohoOAuthManager.getOrganization();
logger.fine("│ ├── uri= " + uri);
logger.fine("│ ├── accessToken=" + accessToken);
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri))
.header("Authorization", "Zoho-oauthtoken " + accessToken)
.header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// Print response details to console
logger.fine("├── Zoho Response:");
logger.fine("│ ├── Status Code: " + response.statusCode());
if (response.statusCode() >= 300) {
throw new PluginException(this.getClass().getName(), "Zoho API error",
"Failed to create expense. Status code: " + response.statusCode() + ", Response: "
+ response.body());
}
// Erfolgreiche Erstellung
String bodyContent = response.body();
logger.fine("│ ├── Response Body: " + bodyContent);
System.out.print(bodyContent);
ZohoVendorCreditCreateResponse createResponse = jsonb.fromJson(bodyContent,
ZohoVendorCreditCreateResponse.class);
if (createResponse != null) {
logger.info("│ ├── OK - customerID=" + createResponse.getVendorCredit().getVendorId());
logger.info("│ ├── OK - creditID=" + createResponse.getVendorCredit().getCreditId());
zohoVendorCredit = createResponse.getVendorCredit();
// now mark the invoice as send
logger.info("│ ├── VendorCredit Export successful.");
return zohoVendorCredit;
}
} catch (IOException | InterruptedException e) {
throw new PluginException(this.getClass().getName(), "Zoho API error",
"Failed to export vendor credit to Zoho: " + e.getMessage(), e);
}
return null;
}
public String lookupContact(String companyName, String contactType, String accessToken) throws PluginException {
// first lookup contact!
String contactID = "";
@ -442,6 +514,41 @@ public class ZohoAPIService {
return zohoBill;
}
private ZohoVendorCredit convertToZohoVendorCredit(ItemCollection invoice, String contactID, String accountID)
throws PluginException {
ZohoVendorCredit zohoVendorCredit = new ZohoVendorCredit();
// Basisinformationen
zohoVendorCredit.setInvoiceNumber(invoice.getItemValueString("invoice.number"));
zohoVendorCredit.setDate(
LocalDate.ofInstant(invoice.getItemValueDate("invoice.date").toInstant(), ZoneId.systemDefault()));
// convert total by rate
// zohoVendorCredit.setAmount(convertInvoiceTotalToAED(invoice,
// invoice.getItemValueDouble("invoice.total")));
// Kunden-ID (muss angepasst werden je nachdem wie du sie speicherst)
zohoVendorCredit.setVendorId(contactID);
// zohoBill.setPaid_through_account_id("1700");
List<ItemCollection> positionen = InvoiceUtil.explodeChildList(invoice);
// {amount=[11825.00], total=[11825.00], numpos=[1], name=[AB-DEFGHI-1234-567],
// tax=[0], category=[STORAGE], invoice.period=[]}
List<ZohoBillItem> lineItems = positionen.stream().map(item -> {
ItemCollection itemCol = (ItemCollection) item;
ZohoBillItem lineItem = new ZohoBillItem();
lineItem.setName(itemCol.getItemValueString("name"));
lineItem.setAccountId(accountID);
lineItem.setQuantity(1);
lineItem.setRate(convertInvoiceTotalToAED(invoice, itemCol.getItemValueDouble("amount")));
return lineItem;
}).collect(Collectors.toList());
zohoVendorCredit.setLineItems(lineItems);
return zohoVendorCredit;
}
/**
* This method adds an attachment to an invoice
*

View file

@ -14,6 +14,7 @@ import org.imixs.workflow.exceptions.PluginException;
import com.alexanderlogistics.zoho.dto.ZohoBill;
import com.alexanderlogistics.zoho.dto.ZohoInvoice;
import com.alexanderlogistics.zoho.dto.ZohoVendorCredit;
import jakarta.inject.Inject;
@ -124,6 +125,29 @@ public class ZohoExportAdapter implements SignalAdapter {
// accessToken);
String accountID = zohoOAuthManager.getAccountId();
// Gutschrift??
if ("credit".equalsIgnoreCase(document.getItemValueString("payment.type"))) {
// Gutschrift
logger.info("├── Vendor Credit Export");
ZohoVendorCredit zohoVendorCredit = zohoAPIService.exportVendorCredit(document, contactID, accountID,
accessToken);
// Attache Files....
List<FileData> files = null;
ItemCollection snapshot = snapshotService.findSnapshot(document);
if (snapshot != null) {
files = snapshot.getFileData();
if (files != null) {
for (FileData file : files) {
if (file.getName().toLowerCase().endsWith(".pdf")) {
zohoAPIService.attacheFileData(zohoVendorCredit.getCreditId(), file, "vendorcredits",
accessToken);
}
}
}
}
} else {
logger.info("├── Bill Export");
ZohoBill zohoBill = zohoAPIService.exportBill(document, contactID, accountID, accessToken);
// Attache Files....
@ -142,3 +166,5 @@ public class ZohoExportAdapter implements SignalAdapter {
}
}
}

View file

@ -0,0 +1,79 @@
package com.alexanderlogistics.zoho.dto;
import java.time.LocalDate;
import java.util.List;
import jakarta.json.bind.annotation.JsonbDateFormat;
import jakarta.json.bind.annotation.JsonbProperty;
public class ZohoVendorCredit {
@JsonbProperty("vendor_credit_id")
private String creditId;
@JsonbProperty("vendor_id")
private String vendorId;
@JsonbProperty("currency_id")
private String currencyId;
@JsonbDateFormat("yyyy-MM-dd")
private LocalDate date;
@JsonbProperty("vendor_credit_number")
private String invoiceNumber;
@JsonbProperty("line_items")
private List<ZohoBillItem> lineItems;
// Getter und Setter
public String getCreditId() {
return creditId;
}
public void setCreditId(String billId) {
this.creditId = billId;
}
public String getVendorId() {
return vendorId;
}
public void setVendorId(String vendorId) {
this.vendorId = vendorId;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public String getInvoiceNumber() {
return invoiceNumber;
}
public void setInvoiceNumber(String invoiceNumber) {
this.invoiceNumber = invoiceNumber;
}
public List<ZohoBillItem> getLineItems() {
return lineItems;
}
public void setLineItems(List<ZohoBillItem> lineItems) {
this.lineItems = lineItems;
}
public String getCurrencyId() {
return currencyId;
}
public void setCurrencyId(String currencyId) {
this.currencyId = currencyId;
}
}

View file

@ -0,0 +1,39 @@
package com.alexanderlogistics.zoho.dto;
import jakarta.json.bind.annotation.JsonbProperty;
public class ZohoVendorCreditCreateResponse {
@JsonbProperty("code")
private int code;
@JsonbProperty("message")
private String message;
@JsonbProperty("vendor_credit")
private ZohoVendorCredit vendorCredit;
// Getter und Setter
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public ZohoVendorCredit getVendorCredit() {
return vendorCredit;
}
public void setVendorCredit(ZohoVendorCredit credit) {
this.vendorCredit = credit;
}
}

View file

@ -125,7 +125,7 @@
<span class="typcn typcn-lightbulb"></span> Fordern Sie einen ZOHO API COde
an
<ol>
<li>Melden Sie sich auf der <a href="https://api-console.zoho.eu/"
<li>Melden Sie sich auf der <a href="https://api-console.zoho.com/"
target="_blank">ZOHO API Console</a> an</li>
<li>
Legen Sie einen API Self Client an
@ -137,7 +137,7 @@
Generieren Sie einen neuen Access Code
<br />
Scope:
<code>ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL,ZohoBooks.settings.READ</code>
<code>ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL,ZohoBooks.debitnotes.ALL,ZohoBooks.settings.READ</code>
</li>
<li>
Code über den Button "Create" anfordern und in das Feld "Access Code"

View file

@ -683,8 +683,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t
<imixs:value>false</imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[
]]></imixs:value>
<imixs:value/>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_sMhfSg"/>

View file

@ -145,6 +145,9 @@
<bpmn2:flowNodeRef>gateway_Al0gGg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_vjVWqA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_poLLDQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_RH72Rg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_g4VN8Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_VKijpQ</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:task id="Task_5000" imixs:processid="5300" name="Approval">
@ -193,6 +196,7 @@
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
<bpmn2:incoming>SequenceFlow_123</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_32</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_0YsOgQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_5000-10" imixs:activityid="10" name="Save">
<bpmn2:extensionElements>
@ -878,6 +882,7 @@ if (paymentType=="no_sepa") {
<bpmn2:incoming>SequenceFlow_90</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_47</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_9rYDHA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_0s8UKQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:endEvent id="EndEvent_2" name="Ende">
<bpmn2:incoming>SequenceFlow_47</bpmn2:incoming>
@ -1470,9 +1475,8 @@ result.isValid=true;
<bpmn2:dataObject id="DataObject_1" name="Invoice Form">
<bpmn2:documentation id="Documentation_11"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="2" label="Invoice data">
<item name="cdtr.name" type="text" readonly="true" label="Vendor:"/>
<item name="partner.id" type="custom" path="alexander/businesspartner_search" readonly="true" requred="true" label="Vendor number:"/>
<imixs-form-section columns="1" label="Invoice data">
<item name="partner.id" type="custom" path="alexander/businesspartner_search" readonly="true" requred="true" label="Vendor:"/>
</imixs-form-section>
<imixs-form-section columns="2">
@ -1941,9 +1945,8 @@ result.isValid=true;
<bpmn2:dataObject id="DataObject_3" name="Invoice Form">
<bpmn2:documentation id="Documentation_36"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="2" label="Invoice data">
<item name="cdtr.name" type="text" readonly="true" label="Vendor:"/>
<item name="cdtr.number" type="custom" path="alexander/businesspartner_search" readonly="true" label="Vendor number:" />
<imixs-form-section columns="1" label="Invoice data">
<item name="cdtr.number" type="custom" path="alexander/businesspartner_search" readonly="true" label="Vendor:" />
</imixs-form-section>
<imixs-form-section columns="2">
<item name="invoice.number" type="text" readonly="true" label="Invoice number:" />
@ -3432,6 +3435,7 @@ result.isValid=true;
<bpmn2:incoming>SequenceFlow_129</bpmn2:incoming>
<bpmn2:incoming>SequenceFlow_133</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_MxzvVQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_dFaOwQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_62" imixs:activityid="70" name="Approve">
<bpmn2:extensionElements>
@ -3935,6 +3939,57 @@ Export erfolgt über eine asynchrone Verarbeitung im Modell 'cargosoft-export']]
<bpmn2:sequenceFlow id="sequenceFlow_IZAXAQ" sourceRef="IntermediateCatchEvent_16" targetRef="Task_3">
<bpmn2:documentation id="documentation_0tNBRw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_RH72Rg" imixs:activityid="400" name="ZOHO Test">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Zoho export]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_Im3wqw"/>
<bpmn2:signalEventDefinition id="signalEventDefinition_WJdSdQ" signalRef="signal_9"/>
<bpmn2:outgoing>sequenceFlow_0s8UKQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_0s8UKQ" sourceRef="event_RH72Rg" targetRef="Task_5">
<bpmn2:documentation id="documentation_290euw"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_My0cog" sourceRef="Task_5" targetRef="DataObject_3">
<bpmn2:documentation id="documentation_oAaR3Q"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_g4VN8Q" imixs:activityid="400" name="ZOHO Test">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Zoho export]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_IYmitw"/>
<bpmn2:signalEventDefinition id="signalEventDefinition_ali0Jw" signalRef="signal_9"/>
<bpmn2:outgoing>sequenceFlow_0YsOgQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_0YsOgQ" sourceRef="event_g4VN8Q" targetRef="Task_5000">
<bpmn2:documentation id="documentation_sAeSMQ"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_VKijpQ" imixs:activityid="400" name="ZOHO Test">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Zoho export]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_JG3kOQ"/>
<bpmn2:signalEventDefinition id="signalEventDefinition_ULfdQw" signalRef="signal_9"/>
<bpmn2:outgoing>sequenceFlow_dFaOwQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_dFaOwQ" sourceRef="event_VKijpQ" targetRef="Task_19">
<bpmn2:documentation id="documentation_ZuxIlA"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:process id="process_2" name="Invoice receipt" processType="Public">
<bpmn2:documentation id="documentation_yUm3kA"/>
@ -4870,6 +4925,47 @@ Export erfolgt über eine asynchrone Verarbeitung im Modell 'cargosoft-export']]
<di:waypoint x="1003.0" y="1615.0"/>
<di:waypoint x="1280.0" y="1615.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_RH72Rg" id="BPMNShape_1LtZaw">
<dc:Bounds height="36.0" width="36.0" x="2451.424047751376" y="1716.921725857192"/>
<bpmndi:BPMNLabel id="BPMNLabel_oj1Prw">
<dc:Bounds height="20.0" width="100.0" x="2419.424072265625" y="1755.9217529296875"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0s8UKQ" id="BPMNEdge_VCj7ww" sourceElement="BPMNShape_1LtZaw" targetElement="BPMNShape_Task_11">
<di:waypoint x="2469.0" y="1717.0"/>
<di:waypoint x="2469.0" y="1678.0"/>
<di:waypoint x="2465.0" y="1678.0"/>
<di:waypoint x="2465.0" y="1640.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_My0cog" id="BPMNEdge_5dWtSw" sourceElement="BPMNShape_Task_11" targetElement="BPMNShape_DataObject_3">
<di:waypoint x="2410.0" y="1615.0"/>
<di:waypoint x="1548.0" y="1615.0"/>
<di:waypoint x="1548.0" y="1875.0"/>
<di:waypoint x="685.0" y="1875.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_g4VN8Q" id="BPMNShape_GkIGVQ">
<dc:Bounds height="36.0" width="36.0" x="622.8773912051431" y="1432.3215684466504"/>
<bpmndi:BPMNLabel id="BPMNLabel_4bsNkA">
<dc:Bounds height="20.0" width="100.0" x="590.8773803710938" y="1471.321533203125"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0YsOgQ" id="BPMNEdge_NjB8zg" sourceElement="BPMNShape_GkIGVQ" targetElement="BPMNShape_Task_1">
<di:waypoint x="641.0" y="1468.0"/>
<di:waypoint x="641.0" y="1529.0"/>
<di:waypoint x="725.0" y="1529.0"/>
<di:waypoint x="725.0" y="1590.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_VKijpQ" id="BPMNShape_U9aYgw">
<dc:Bounds height="36.0" width="36.0" x="1727.0" y="1257.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_CkbSsg">
<dc:Bounds height="20.0" width="100.0" x="1695.0" y="1296.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_dFaOwQ" id="BPMNEdge_4f0Vvw" sourceElement="BPMNShape_U9aYgw" targetElement="BPMNShape_Task_21">
<di:waypoint x="1763.0" y="1277.0"/>
<di:waypoint x="1849.0" y="1277.0"/>
<di:waypoint x="1849.0" y="1360.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>

View file

@ -72,6 +72,7 @@
<bpmn2:documentation id="documentation_iMb60w"/>
<bpmn2:flowNodeRef>DataObject_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_weGn1Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_RF3H2w</bpmn2:flowNodeRef>
</bpmn2:lane>
<bpmn2:lane id="Lane_2" name="Verantwortlicher / Bereich Team">
<bpmn2:documentation id="documentation_fufjXQ"/>
@ -2984,7 +2985,8 @@ result.isValid=true;
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_39"><![CDATA[Wrong classification - change to cargo invoice]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_83</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_7p4puA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_08r6Pw</bpmn2:outgoing>
<bpmn2:compensationEventDefinition id="compensationEventDefinition_t0kCAA"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_83" sourceRef="EventBasedGateway_1" targetRef="IntermediateCatchEvent_40">
<bpmn2:documentation id="documentation_pPAHsA"/>
@ -3240,7 +3242,7 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<bpmn2:documentation id="documentation_ZOe84w"/>
<bpmn2:incoming>sequenceFlow_7p4puA</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_7p4puA" sourceRef="IntermediateCatchEvent_40" targetRef="event_weGn1Q">
<bpmn2:sequenceFlow id="sequenceFlow_7p4puA" sourceRef="task_RF3H2w" targetRef="event_weGn1Q">
<bpmn2:documentation id="documentation_mnAIvA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_rZxKSg" sourceRef="StartEvent_1" targetRef="IntermediateCatchEvent_6">
@ -3355,6 +3357,48 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<bpmn2:sequenceFlow id="sequenceFlow_1Fhiyg" sourceRef="IntermediateCatchEvent_41" targetRef="gateway_qxWQdw">
<bpmn2:documentation id="documentation_vXvE2Q"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_RF3H2w" imixs:processid="5950" name="Cargo">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<itemvalue>txtlastcomment</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Rechnung erhalten]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-download|typcn-delete,imixs-error,icon-sub-ne]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>numsequencenumber</itemvalue>: <itemvalue>cdtr.name</itemvalue> <itemvalue>invoice.number</itemvalue> (<itemvalue>invoice.currency</itemvalue> <itemvalue>invoice.total</itemvalue>) <itemvalue>space.name</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.manager]]></imixs:value>
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_hzYK2Q"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_60</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_7p4puA</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_08r6Pw</bpmn2:incoming>
</bpmn2:task>
<bpmn2:sequenceFlow id="sequenceFlow_08r6Pw" sourceRef="IntermediateCatchEvent_40" targetRef="task_RF3H2w">
<bpmn2:documentation id="documentation_0NTD6Q"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:process id="process_2" name="Invoice" processType="Public">
<bpmn2:documentation id="documentation_Jl5Svw"/>
@ -3697,7 +3741,7 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_40" id="BPMNShape_IntermediateCatchEvent_43">
<dc:Bounds height="36.0" width="36.0" x="657.0" y="157.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_169" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="635.5" y="197.0"/>
<dc:Bounds height="20.0" width="100.0" x="623.5" y="197.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_12" id="BPMNShape_Task_13">
@ -4050,14 +4094,14 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<di:waypoint x="1900.0" y="725.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_weGn1Q" id="BPMNShape_PGBrng">
<dc:Bounds height="36.0" width="36.0" x="757.0" y="157.0"/>
<dc:Bounds height="36.0" width="36.0" x="917.0" y="157.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_oQETOg">
<dc:Bounds height="20.0" width="100.0" x="725.0" y="196.0"/>
<dc:Bounds height="20.0" width="100.0" x="885.0" y="196.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_7p4puA" id="BPMNEdge_6WpBeA" sourceElement="BPMNShape_IntermediateCatchEvent_43" targetElement="BPMNShape_PGBrng">
<di:waypoint x="693.0" y="175.0"/>
<di:waypoint x="757.0" y="175.0"/>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_7p4puA" id="BPMNEdge_6WpBeA" sourceElement="BPMNShape_GPPRbw" targetElement="BPMNShape_PGBrng">
<di:waypoint x="870.0" y="175.0"/>
<di:waypoint x="917.0" y="175.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rZxKSg" id="BPMNEdge_abtEkQ" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_IntermediateCatchEvent_11">
<di:waypoint x="223.0" y="95.0"/>
@ -4114,6 +4158,13 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<di:waypoint x="1838.0" y="605.0"/>
<di:waypoint x="1838.0" y="703.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_RF3H2w" id="BPMNShape_GPPRbw">
<dc:Bounds height="50.0" width="110.0" x="760.0" y="150.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_08r6Pw" id="BPMNEdge_g6WacA" sourceElement="BPMNShape_IntermediateCatchEvent_43" targetElement="BPMNShape_GPPRbw">
<di:waypoint x="693.0" y="175.0"/>
<di:waypoint x="760.0" y="175.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>