Merge branch 'inmemory-metric'

This commit is contained in:
Ralph Soika 2025-03-03 11:38:40 +01:00
commit f8df34586c
33 changed files with 13188 additions and 2003 deletions

View file

@ -1,4 +1,5 @@
FROM imixs/imixs-office-workflow:5.0.3-SNAPSHOT
FROM imixs/imixs-office-workflow:5.1.1-SNAPSHOT
#FROM imixs/imixs-office-workflow:5.0.3-SNAPSHOT
# Setup debug configuration

49
doc/BUSINESSPARTNER.md Normal file
View file

@ -0,0 +1,49 @@
# BusinessPartner
Wir haben einen Workflow für die Verwaltung von BusinessPartner.
Ein BusinessPartner wird über die bestehende Cargosoft Schnittstelle aus den Debitoren/Kreditoren automatisch importiert und synchronisiert.
In Imixs ist es dann aber möglich zusätzliche Attribute zu einem Businesspartner zu speichern. Beispielsweise:
- Zahlungsziel
- Bankverbindungen
- Emailadressen für Mahnwesen
Die Businessparnter werden zentral nur in dem Hauptsystem in Bremen importiert und verwaltet. Damit ein AGL System auf die BusinessPartner zugreifen kann wird eine Rest API Schnittstelle verwendet. Diese kann über Environmentvariablen aktiviert werden:
# Rest Service BusinessPartner API
WORKFLOW_SERVICE_ENDPOINT: "http://app:8080/api"
WORKFLOW_SERVICE_USER: "admin"
WORKFLOW_SERVICE_PASSWORD: "xxxxxxxx"
## BusinessPartner Suche
Es gibt einen Controller und ein widget um nach Business Partnern zu suchen.
<img src="images/businesspartner-widget.png" />
Z.b. kann das als Custom Part in eine Form eingebunden werden:
```xml
<item name="bpid" type="custom" path="alexander/businesspartner_search" required="true" label="Businesspartner:" />
```
Das widget legt dann automatisch die felder `bpid` und `bpidname` an.
Alternativ kann im Backend über die EJB BusinessPartnerService nach bpid gesucht werden:
```java
List<ItemCollection> resultList = businessPartnerService.search(phrase);
// oder
ItemCollection bp= businessPartnerService.getBusinessPartnerByID("BP0001");
```
# Daten Migration
\_vendor_zip_code
\_vendor_fax
(type:cargosoftkreditor) AND ($modified:[20010101 TO 20250215])
Wir müssen gundsätzlich erstmal über all $nosnapshot = true eintragen!

47
doc/METRICS.md Normal file
View file

@ -0,0 +1,47 @@
# Metrics
**Konzept Verworfen!**
## Background:
https://blog.imixs.org/2025/02/02/business-intelligence-built-on-metrics-part-ii/
**Die Implementierung war Teil von Version 1.3.1!**
## Testing
Curl
$ curl -s http://localhost:9990/metrics
$ curl -s http://localhost:9990/metrics | grep BP4218
```
application_dbtr_balance{country="", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 60911.28
application_dbtr_balance{country="US",currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 257955.41
application_dbtr_sales{country="", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 60911.28
application_dbtr_sales{country="US", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 279028.91
```
Rayonier Advanced Materials
Debitor 74218
293.535,19 EUR
Metric saldo: 318866.69
# Jetzt berechnen wir neu...
https://alexander-logistics.office-workflow.de/api/metrics/dbtr/rebuild
application_dbtr_balance{country="", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 60911.28
application_dbtr_balance{country="US",currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 364457.85
application_dbtr_sales{country="", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 60911.28
application_dbtr_sales{country="US", currency="EUR",department="Import Zellulose/Holz",id="BP4218",name="Rayonier Advanced Materials",type="dbtr"} 364457.85

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View file

@ -36,10 +36,15 @@ services:
#OCR_PDF_MODE: "OCR_ONLY | TEXT_ONLY | TEXT_AND_OCR (default)"
OCR_PDF_MODE: "OCR_ONLY"
# Rest Service BusinessPartner API
WORKFLOW_SERVICE_ENDPOINT: "http://app:8080/api"
WORKFLOW_SERVICE_USER: "admin"
WORKFLOW_SERVICE_PASSWORD: "adminadmin"
LLM_SERVICE_ENDPOINT_USER: "admin"
LLM_SERVICE_ENDPOINT_PASSWORD: "imixs4.null"
METRICS_ENABLED: "true"
METRICS_ENABLED: "false"
ports:
- "8080:8080"
@ -100,18 +105,18 @@ services:
EXIM_PASSWORD: "www149.your-server.de:webmaster@imixs.com:$MAILPASSWORD"
EXIM_ALLOWED_SENDERS: "10.0.0.0/8:172.18.0.0/12:192.168.0.0/16"
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheusdata:/prometheus/
# prometheus:
# image: prom/prometheus:latest
# ports:
# - "9090:9090"
# volumes:
# - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
# - prometheusdata:/prometheus/
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
# grafana:
# image: grafana/grafana:latest
# ports:
# - "3000:3000"
volumes:
dbdata:

View file

@ -6,7 +6,7 @@
<parent>
<artifactId>office-alexander-logistics</artifactId>
<groupId>com.alexander-logistics</groupId>
<version>1.3.1</version>
<version>1.3.2</version>
</parent>
<artifactId>office-alexander-logistics-app</artifactId>
<packaging>war</packaging>

View file

@ -84,11 +84,17 @@ public class AGLAnalyticControllerDebitor implements Serializable {
String chartData = "";
public void onEvent(@Observes AnalyticEvent event) {
if (!"workitem".equals(event.getWorkitem().getType())
|| !event.getWorkitem().getModelVersion().startsWith("analyse-debitor")) {
if (!"workitem".equals(event.getWorkitem().getType())) {
// no op
return;
}
if (!event.getWorkitem().getModelVersion().startsWith("businesspartner")
&& !event.getWorkitem().getModelVersion().startsWith("analyse-debitor")) {
// no op
return;
}
String dbtrNumber = event.getWorkitem().getItemValueString("dbtr.number");
String dbtrNumberLast = event.getWorkitem().getItemValueString("dbtr.number.last");

View file

@ -23,49 +23,149 @@
*******************************************************************************/
package com.alexanderlogistics;
import java.io.IOException;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.faces.data.WorkflowEvent;
import jakarta.ejb.EJB;
import jakarta.enterprise.context.ConversationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.faces.view.ViewScoped;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.json.Json;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
/**
* Der BusinessPartnerController stellt methoden für die BusinessPartner Forms
* bereit.
* Der BusinessPartnerController stellt Methoden für die BusinessPartner Forms
* sowie für die das Suche-Widget 'businesspartner_search' bereit.
*
*
* @author rsoika
* @version 1.0
*/
@Named
@ViewScoped
@ConversationScoped
public class BusinessPartnerController implements Serializable {
private static final long serialVersionUID = 1L;
protected List<ItemCollection> ibanList = null;
protected List<ItemCollection> invoicesOut = null;
protected List<ItemCollection> invoicesIn = null;
protected List<ItemCollection> dunnings = null;
@EJB
@Inject
DocumentService documentService;
@Inject
BusinessPartnerService businessPartnerService;
private List<BusinessPartnerSearchEntry> searchResult = null;
private static Logger logger = Logger.getLogger(BusinessPartnerController.class.getName());
public List<ItemCollection> getInvoicesOut() {
if (invoicesOut == null) {
invoicesOut = new ArrayList<>();
}
return invoicesOut;
}
public List<ItemCollection> getInvoicesIn() {
if (invoicesIn == null) {
invoicesIn = new ArrayList<>();
}
return invoicesIn;
}
public List<ItemCollection> getDunnings() {
if (dunnings == null) {
dunnings = new ArrayList<>();
}
return dunnings;
}
/**
* This method searches a text phrase within the list of DATEV kreditoren
* <p>
* JSF Integration:
*
* {@code
<h:commandScript name="datevSearch" action=
* "#{datevSearchController.searchCdtr()}"
* render="autocomplete-resultlist-datev" onevent="autocompleteShowResult" />
* }
*/
public void search(String regexPattern) {
List<ItemCollection> resultList = null;
searchResult = new ArrayList<BusinessPartnerSearchEntry>();
// get the param from faces context....
FacesContext fc = FacesContext.getCurrentInstance();
String phrase = fc.getExternalContext().getRequestParameterMap().get("phrase");
if (phrase == null) {
return;
}
logger.fine("search prase '" + phrase + "'");
if (phrase == null || phrase.length() < 2) {
return;
}
logger.fine("search for=" + phrase);
resultList = businessPartnerService.search(phrase);
// Compile the regex pattern
logger.fine("regex=" + regexPattern);
Pattern pattern = null;
if (regexPattern != null && !regexPattern.isEmpty()) {
pattern = Pattern.compile(regexPattern);
}
// Filter by Regex and convert ItemCollection into a BusinessPartnerSearchEntry
for (ItemCollection businessPartner : resultList) {
String name = businessPartner.getItemValueString("name");
// Prüfen, ob der name der Regex entspricht
if (pattern != null) {
Matcher matcher = pattern.matcher(name);
if (!matcher.matches()) {
// Kein passendes Konto
continue;
}
}
String display = businessPartner.getItemValueString("$workflowsummary");
display = display.replace("\"", "");
display = display.replace("'", "");
searchResult.add(new BusinessPartnerSearchEntry(name, display, buildJsonData(businessPartner)));
}
}
/**
* Die Resultliste wird als eine Liste einen Arrays zurückgegeben. Der Erste
* Eintrag
*
* @return
*/
public List<BusinessPartnerSearchEntry> getSearchResult() {
return searchResult;
}
/**
* WorkflowEvent listener to convert the IBAN child list embeded HashMaps into
* ItemCollections and
* reconvert them before processing
* ItemCollections and reconvert them before processing
*
* @param workflowEvent
* @throws AccessDeniedException
@ -74,24 +174,64 @@ public class BusinessPartnerController implements Serializable {
int eventType = workflowEvent.getEventType();
ItemCollection workitem = workflowEvent.getWorkitem();
if (workitem == null) {
if (workitem == null || !workitem.getModelVersion().startsWith("businesspartner-")) {
return;
}
// reset orderItems if workItem has changed
if (WorkflowEvent.WORKITEM_CHANGED == eventType || WorkflowEvent.WORKITEM_CREATED == eventType) {
// reset state
explodeIBANList(workitem);
ibanList = BusinessPartnerService.explodeBanks(workitem);
loadStats(workitem);
}
// before the workitem is saved we update the field txtOrderItems
if (WorkflowEvent.WORKITEM_BEFORE_PROCESS == eventType) {
implodeIBANList(workitem);
BusinessPartnerService.implodeBanks(workitem, ibanList);
}
if (WorkflowEvent.WORKITEM_AFTER_PROCESS == eventType) {
// reset state
explodeIBANList(workitem);
ibanList = BusinessPartnerService.explodeBanks(workitem);
}
}
/**
* Hilfsmethode die die offenen Rechnungen läd. Wird von WorktiemChanged Event
* aufgerufen.
*
* @param workitem
*/
private void loadStats(ItemCollection workitem) {
try {
// Ausgangsrechnungen
String dbtrNumber = workitem.getItemValueString("dbtr.number");
if (!dbtrNumber.isEmpty()) {
if (dbtrNumber.startsWith("D")) {
dbtrNumber = dbtrNumber.substring(1);
}
String query = "(type:workitem) AND ($modelversion:rechnungsausgang-*) "
+ " AND (dbtr.number:" + dbtrNumber + ")";
invoicesOut = documentService.findStubs(query, 999, 0, "invoice.number", false);
// Mahnungen
query = "(type:workitem) AND ($modelversion:mahnlauf-*) "
+ " AND (dbtr.number:" + dbtrNumber + ")";
dunnings = documentService.findStubs(query, 999, 0, "invoice.number", false);
}
// Eingangsrechnungen
String cdtrNumber = workitem.getItemValueString("cdtr.number");
if (!cdtrNumber.isEmpty()) {
String query = "(type:workitem) AND ($modelversion:rechnungseingang-*) "
+ " AND (cdtr.number:" + cdtrNumber + ")";
invoicesIn = documentService.findStubs(query, 999, 0, "invoice.number", false);
}
} catch (QueryException e) {
logger.severe("failed to load stats: " + e.getMessage());
}
}
@ -113,10 +253,10 @@ public class BusinessPartnerController implements Serializable {
*
* @param name - name of dbtr
*/
public void removeIBAN(String name) {
if (name != null && ibanList != null) {
public void removeIBAN(String id) {
if (id != null && ibanList != null) {
for (ItemCollection cdtr : ibanList) {
if (name.equals(cdtr.getItemValueString("name"))) {
if (id.equals(cdtr.getItemValueString("id"))) {
ibanList.remove(cdtr);
break;
}
@ -124,36 +264,50 @@ public class BusinessPartnerController implements Serializable {
}
}
protected void implodeIBANList(ItemCollection workitem) {
List<Map> mapOrderItems = new ArrayList();
if (this.ibanList != null) {
logger.fine("Convert child items into Map...");
Iterator<?> var3 = this.ibanList.iterator();
/**
* Hilfsmethode die eine JSON Struktur mit allen relevanten Daten für einen
* BusinessPartner erzeugt.
*
* @return
*/
private String buildJsonData(ItemCollection businessPartner) {
JsonObjectBuilder objectBuilder = Json.createObjectBuilder(). //
add("name", jsonVal(businessPartner.getItemValueString("name"))). //
add("cdtr.number", jsonVal(businessPartner.getItemValueString("cdtr.number"))). //
add("dbtr.number", jsonVal(businessPartner.getItemValueString("dbtr.number"))). //
add("partner.name", jsonVal(businessPartner.getItemValueString("partner.name")));
while (var3.hasNext()) {
ItemCollection orderItem = (ItemCollection) var3.next();
mapOrderItems.add(orderItem.getAllItems());
}
workitem.replaceItemValue("partner.iban.list", mapOrderItems);
// get iban list
// {iban=[Dxxxxxx1], name=[Bank 1], id=[bank1], bic=[CITIDEFF]}
ibanList = BusinessPartnerService.getBanks(businessPartner);
int i = 1;
for (ItemCollection iban : ibanList) {
objectBuilder.add("iban" + 1, jsonVal(iban.getItemValueString("iban"))). //
add("bic" + 1, jsonVal(iban.getItemValueString("bic")));//
}
JsonObject jsonObject = objectBuilder.build();
String jsonString = "{}";
try (Writer writer = new StringWriter()) {
Json.createWriter(writer).write(jsonObject);
jsonString = writer.toString();
} catch (IOException e) {
logger.warning("Unable to build json structure");
}
return jsonString;
}
protected void explodeIBANList(ItemCollection workitem) {
this.ibanList = new ArrayList();
List<Object> mapOrderItems = workitem.getItemValue("partner.iban.list");
Iterator<?> var4 = mapOrderItems.iterator();
while (var4.hasNext()) {
Object mapOderItem = var4.next();
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
this.ibanList.add(itemCol);
}
}
/**
* Helper method to remove " and ' characters - causing problems
*
* @param val
* @return
*/
public static String jsonVal(String val) {
val = val.replace("\"", "");
val = val.replace("'", "");
return val;
}
}

View file

@ -0,0 +1,48 @@
package com.alexanderlogistics;
/**
* Diese Kleine Hilfsklasse dient als DTO für die Übertragugn eines
* Sucheregenisses nach kreditoren an das Frontend. Die Klasse besteht aus einem
* Key, einer DisplayZeile für die Darstellung und einen JSON String der
* beliebige Daten enthalten kann.
*
* @author rsoika
*
*/
public class BusinessPartnerSearchEntry {
private String key;
private String display;
private String data;
public BusinessPartnerSearchEntry(String key, String display, String data) {
super();
this.key = key;
this.display = display;
this.data = data;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}

View file

@ -0,0 +1,224 @@
/*******************************************************************************
* Imixs Workflow
* Copyright (C) 2001, 2011 Imixs Software Solutions GmbH,
* http://www.imixs.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You can receive a copy of the GNU General Public
* License at http://www.gnu.org/licenses/gpl.html
*
* Project:
* http://www.imixs.org
* http://java.net/projects/imixs-workflow
*
* Contributors:
* Imixs Software Solutions GmbH - initial API and implementation
* Ralph Soika - Software Developer
*******************************************************************************/
package com.alexanderlogistics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Logger;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.ItemCollectionComparator;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.index.SchemaService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.Singleton;
import jakarta.inject.Inject;
/**
* Der BusinessPartnerService stellt Methoden für den Zugriff auf Business
* Partner bereit.
*
* @author rsoika
*
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RolesAllowed({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@Singleton
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
public class BusinessPartnerService {
public static final int MAX_SEARCH_RESULT = 100;
public static final String ITEM_IBAN_LIST = "partner.bank.list";
public static final String WORKFLOW_SERVICE_ENDPOINT = "workflow.service.endpoint";
public static final String WORKFLOW_SERVICE_USER = "workflow.service.user";
public static final String WORKFLOW_SERVICE_PASSWORD = "workflow.service.password";
private static Logger logger = Logger.getLogger(BusinessPartnerService.class.getName());
@Inject
@ConfigProperty(name = WORKFLOW_SERVICE_ENDPOINT)
Optional<String> workflowServiceEndpoint;
@Inject
@ConfigProperty(name = WORKFLOW_SERVICE_USER)
Optional<String> workflowServiceUser;
@Inject
@ConfigProperty(name = WORKFLOW_SERVICE_PASSWORD)
Optional<String> workflowServicePassword;
@Inject
DocumentService documentService;
@Inject
SchemaService schemaService;
/**
* Initialize the rest clients
*/
@PostConstruct
public void init() {
}
/**
* Diese Methode sucht einen Business Partner anhand seiner BPID
*
* @param bpid
* - business partner id phrase
* @return - matching business partner
*/
public ItemCollection getBusinessPartnerByID(String bpid) {
if (bpid == null || bpid.isEmpty()) {
return null;
}
List<ItemCollection> result;
try {
String sQuery = "(type:\"workitem\" OR type:\"workitemarchive\" ) AND ($modelversion:businesspartner-*)";
sQuery += " AND (name:" + bpid.trim() + ")";
logger.finest("SearchQuery= " + sQuery);
result = documentService.find(sQuery, 1, 0);
if (result.size() > 0) {
return result.get(0);
}
} catch (Exception e) {
logger.warning(" lucene error - " + e.getMessage());
}
return null;
}
/**
* Diese Methode sucht Business Partner anhand einer Suchphrase
*
* @param phrase
* - search phrase
* @return - list of matching business partners
*/
public List<ItemCollection> search(String phrase) {
List<ItemCollection> searchResult = new ArrayList<ItemCollection>();
if (phrase == null || phrase.isEmpty()) {
return searchResult;
}
try {
phrase = phrase.trim();
// phrase = LuceneSearchService.escapeSearchTerm(phrase);
phrase = schemaService.normalizeSearchTerm(phrase);
String sQuery = "(type:\"workitem\" OR type:\"workitemarchive\") AND ($modelversion:businesspartner-*)";
sQuery += " AND (" + phrase + "*)";
logger.finest("SearchQuery= " + sQuery);
searchResult = documentService.find(sQuery, MAX_SEARCH_RESULT, 0);
} catch (Exception e) {
logger.warning(" lucene error - " + e.getMessage());
}
// sort by txtname..
Collections.sort(searchResult, new ItemCollectionComparator("$workflowsummary", true));
return searchResult;
}
/**
* Packt die Liste der Bank Details (ItemCollections) in ein Workitem
*
* @param workitem
*/
public static void implodeBanks(ItemCollection workitem, List<ItemCollection> ibanList) {
List<Map> mapOrderItems = new ArrayList();
if (ibanList != null) {
logger.fine("Convert child items into Map...");
Iterator<?> var3 = ibanList.iterator();
while (var3.hasNext()) {
ItemCollection orderItem = (ItemCollection) var3.next();
mapOrderItems.add(orderItem.getAllItems());
}
workitem.replaceItemValue(BusinessPartnerService.ITEM_IBAN_LIST, mapOrderItems);
}
}
/**
* Enpackt die iban Map Liste von eiem Worktiem in eine Liste von ItemCollection
*
* @param workitem
*/
public static List<ItemCollection> explodeBanks(ItemCollection workitem) {
List<ItemCollection> ibanList = new ArrayList();
List<Object> mapOrderItems = workitem.getItemValue(BusinessPartnerService.ITEM_IBAN_LIST);
Iterator<?> var4 = mapOrderItems.iterator();
while (var4.hasNext()) {
Object mapOderItem = var4.next();
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
ibanList.add(itemCol);
}
}
return ibanList;
}
/**
* Liefert die ChildItems mit den IBAN daten
*
* @param workitem
* @return
*/
public static List<ItemCollection> getBanks(ItemCollection workitem) {
List<ItemCollection> result = new ArrayList<>();
List<Object> mapOrderItems = workitem.getItemValue(BusinessPartnerService.ITEM_IBAN_LIST);
Iterator<?> var4 = mapOrderItems.iterator();
while (var4.hasNext()) {
Object mapOderItem = var4.next();
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
result.add(itemCol);
}
}
return result;
}
}

View file

@ -8,9 +8,6 @@ import java.util.Map;
import java.util.regex.Pattern;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.exceptions.PluginException;
import com.alexanderlogistics.metrics.MetricDataService;
/**
* Hilfsmethoden für die Berechnung und Validierung von Ein und
@ -185,30 +182,6 @@ public class InvoiceUtil {
}
/**
* Diese Hilfsmethode berechnet die BusinessPartnerID aus einer Invoice
*
* @param Invoice
* @return
* @throws PluginException
*/
public static String getBPId(ItemCollection invoice) throws PluginException {
String key = "";
if (isCreditorInvoice(invoice)) {
// key ist cdtr.number
key = invoice.getItemValueString("cdtr.number");
} else {
// key ist dbtr.number
key = invoice.getItemValueString("dbtr.number");
}
if (key.isEmpty()) {
throw new PluginException(MetricDataService.class.getName(), ERROR_INVALID_INVOICEDATA,
"Failed to create metrics - missing dbtr/cdtr number!");
}
return InvoiceUtil.buildBPID(key);
}
/**
* Diese Hilfmethode berechnet die BusinessPartner Namen aus einer Invoice
*

View file

@ -63,11 +63,15 @@ import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.alexanderlogistics.BusinessPartnerService;
import com.alexanderlogistics.InvoiceUtil;
import com.alexanderlogistics.KreditorDebitorService;
import com.alexanderlogistics.mahnlauf.MahnlaufService;
import com.alexanderlogistics.xml.CargosoftXMLInvoiceImportService;
import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
@ -112,6 +116,9 @@ public class CargosoftMigrationRestService implements Serializable {
@Inject
TeamService teamService;
@Inject
BusinessPartnerService businessPartnerService;
private static Logger logger = Logger.getLogger(CargosoftMigrationRestService.class.getName());
public CargosoftMigrationRestService() {
@ -641,6 +648,98 @@ public class CargosoftMigrationRestService implements Serializable {
}
}
/**
* Dieser agent prüft ob es für Cargosoft Krediotren/Debitoren Daten schon ein
* passendes Businesspartner Workitem gibt.
* Wenn nicht speichert der Service einmal das cargosft entity was dann zur
* automatischen Neuanlage des businesspartner workflows führt.
*
* @return
* @throws QueryException
* @throws AccessDeniedException
* @throws ProcessingErrorException
* @throws PluginException
* @throws ModelException
*/
@GET
@Path("/bp-import")
@Produces({ MediaType.TEXT_PLAIN })
public String importBusinessPartner()
throws QueryException, AccessDeniedException, ProcessingErrorException, PluginException, ModelException {
StringBuffer messageBuffer = new StringBuffer();
int MAX_COUNT = 1000;
String query = "(type:" + KreditorDebitorService.TYPE_CARGOSOFTKREDITOR + ")";
int updates = 0;
long l = System.currentTimeMillis();
int batchSize = 500;
int totalObjects = 0;
log("├── Migrate " + KreditorDebitorService.TYPE_CARGOSOFTKREDITOR, messageBuffer);
// Gesamtanzahl ermitteln
int totalCount = documentService.count(query);
log("│   ├── found " + totalCount + " " + KreditorDebitorService.TYPE_CARGOSOFTKREDITOR + " entities ",
messageBuffer);
// Berechne Anzahl der benötigten Pages
int totalPages = (int) Math.ceil((double) totalCount / batchSize);
// Verarbeite Page für Page
for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) {
List<ItemCollection> cargosoftDataList = documentService.find(query, batchSize, pageIndex);
for (ItemCollection cargosoftItemCol : cargosoftDataList) {
totalObjects++;
if (verifyBusinessPartner(cargosoftItemCol, messageBuffer)) {
updates++;
}
if (updates >= MAX_COUNT)
break;
}
// Fortschritt loggen
log("│ ├── Processed page " + (pageIndex + 1) + " of " + totalPages +
" (" + updates + " total updates)", messageBuffer);
// Optional: Kurze Pause nach jedem 5. Batch
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (updates >= MAX_COUNT)
break;
}
long duration = System.currentTimeMillis() - l;
double objectsPerSecond = totalObjects / (duration / 1000.0);
log("├── Successfully imported " + updates + " business partner objects in " +
duration + "ms (" + String.format("%.1f", objectsPerSecond) + " objects/sec)", messageBuffer);
return messageBuffer.toString();
}
/**
* Hilfsmethode speichert eine cargoosft kreditor object...
*
* @param bpID
* @param messageBuffer
* @return
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public boolean verifyBusinessPartner(ItemCollection cargosoftItemCol, StringBuffer messageBuffer) {
String vendorNummer = cargosoftItemCol.getItemValueString("_vendor_num");
String bpID = InvoiceUtil.buildBPID(vendorNummer);
ItemCollection businessPartner = businessPartnerService.getBusinessPartnerByID(bpID);
if (businessPartner == null) {
documentService.save(cargosoftItemCol);
logger.finest("│   │   ├── import " + bpID);
return true;
}
return false;
}
/**
* Erzeugt einen XML Baum aus dem XML Raw Daten
*
@ -721,4 +820,10 @@ public class CargosoftMigrationRestService implements Serializable {
}
}
private void log(String message, StringBuffer messageLog) {
logger.info(message);
messageLog.append(message + "\n");
}
}

View file

@ -1,206 +0,0 @@
package com.alexanderlogistics.metrics;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.ejb.Stateless;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
@Path("metrics/cdtr")
@Stateless
public class MetricCreditorRestService {
private static Logger logger = Logger.getLogger(MetricCreditorRestService.class.getName());
@Inject
DocumentService documentService;
@Inject
MetricCreditorService metricCreditorService;
@Inject
MetricDataService metricDataService;
@GET
@Path("/ping")
@Produces({ MediaType.TEXT_PLAIN })
public String ping() {
logger.info("GET ping");
return "ping: " + System.currentTimeMillis();
}
/**
* This method initializes the metrics for all creditors with open invoices.
*
* The method deletes all existing metrics and creates new metric entires for
* each creditor.
*
* @return
*/
@GET
@Path("/rebuild")
@Produces({ MediaType.TEXT_PLAIN })
public Response rebuildMetrics() {
StringBuffer messageBuffer = new StringBuffer();
long l = System.currentTimeMillis();
log("├── init cdtr metrics...", messageBuffer);
try {
// first clear the metric cache
metricCreditorService.reset();
log("│   ├── reset metric cache", messageBuffer);
// run in new transaction!
metricDataService.deleteAllMetrics(MetricCreditorService.TYPE_METRIC_CREDITOR);
log("│   ├── delete metrics", messageBuffer);
computeMetrics();
log("│   ├── computing metrics finished in " + (System.currentTimeMillis() - l) + "ms", messageBuffer);
logger.info("│   ├── save and init metrics...");
// run in new transaction!
metricCreditorService.refreshGauges();
String message = "├── rebuild cdtr metrics completed in "
+ (System.currentTimeMillis() - l)
+ "ms";
log(message, messageBuffer);
return Response.ok().entity(messageBuffer.toString()).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError()
.entity("Failed to initialize metrics: " + e.getMessage())
.build();
}
}
/**
* This method initializes the metrics for all creditors with open invoices.
*
* The method deletes all existing metrics and creates new metric entires for
* each creditor.
*
* @return
*/
@GET
@Path("/rebuild/{cdtrnumber}")
@Produces({ MediaType.TEXT_PLAIN })
public Response rebuildMetricsForCreditor(@PathParam("cdtrnumber") String cdtrnumber) {
StringBuffer messageBuffer = new StringBuffer();
long l = System.currentTimeMillis();
log("├── init cdtr metrics for " + cdtrnumber + "...", messageBuffer);
try {
logger.info("│   │   ├── group invoices by creditor " + cdtrnumber + "...");
int count = 0;
// First we need to remove all metrics for this creditor
String bpID = InvoiceUtil.buildBPID(cdtrnumber);
logger.info("│   │   ├── delete metrics for " + bpID + "...");
List<String> oldMetricKeys = metricDataService
.deleteAllMetricsByBPID(MetricCreditorService.TYPE_METRIC_CREDITOR, bpID);
logger.info("│   │   ├── found " + oldMetricKeys.size() + " metrics for " + bpID + "...");
metricCreditorService.reset(oldMetricKeys);
// next rebuild gauges and metrics for this creditor
List<ItemCollection> invoices = documentService.find(
"($modelversion:rechnungseingang-* OR $modelversion:gutschriftabgleich-*) " +
" AND type:workitem AND cdtr.number:" + cdtrnumber,
9999, 0, "invoice.number", false);
logger.info("│   │   ├──found " + invoices.size() + " open invoices");
List<String> newMetricKeys = new ArrayList<>();
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricCreditorService.getMetricByInvoice(invoice);
newMetricKeys.add(metricData.getItemValueString("name"));
// Jetzt Rechnung addieren
metricCreditorService.addInvoice(metricData, invoice);
logger.info("│   │   │   ├──update metric " + InvoiceUtil.getBPId(invoice) + " Invoice: "
+ invoice.getItemValueString("invoice.number") + " Saldo: "
+ invoice.getItemValueDouble(MetricCreditorService.ITEM_TOTAL));
metricCreditorService.putMetric(metricData);
count++;
} catch (PluginException e) {
// invalid invoice - e.g. no cdtr. number
}
}
logger.info("│   │   ├── updated metric for " + count + " invoices.");
log("│   ├── computing metrics finished in " + (System.currentTimeMillis() - l) + "ms", messageBuffer);
logger.info("│   ├── save and init metrics...");
// run in new transaction!
metricCreditorService.refreshGauges(newMetricKeys);
String message = "├── rebuild cdtr metrics completed in "
+ (System.currentTimeMillis() - l)
+ "ms";
log(message, messageBuffer);
return Response.ok().entity(messageBuffer.toString()).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError()
.entity("Failed to initialize metrics: " + e.getMessage())
.build();
}
}
/**
* Diese Methode berechnet alle Metriken auf basis der existierenden Rechnungen
* neu
*
*/
public void computeMetrics() {
logger.info("│   │   ├── group invoices by creditor...");
try {
int count = 0;
List<ItemCollection> invoices = documentService.find(
"($modelversion:rechnungseingang-* OR $modelversion:gutschriftabgleich-*) " +
" AND type:workitem",
9999, 0,
"invoice.number", false);
logger.info("│   │   ├──found " + invoices.size() + " open invoices");
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricCreditorService.getMetricByInvoice(invoice);
// Jetzt Rechnung addieren
metricCreditorService.addInvoice(metricData, invoice);
logger.info("│   │   │   ├──update metric " + InvoiceUtil.getBPId(invoice));
metricCreditorService.putMetric(metricData);
count++;
} catch (PluginException e) {
// invalid invoice - e.g. no cdtr. number
}
}
logger.info("│   │   ├── updated metric for " + count + " invoices.");
} catch (QueryException e) {
e.printStackTrace();
}
}
private void log(String message, StringBuffer messageLog) {
logger.info(message);
messageLog.append(message + "\n");
}
}

View file

@ -1,369 +0,0 @@
package com.alexanderlogistics.metrics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.Tag;
import org.eclipse.microprofile.metrics.annotation.RegistryScope;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ProcessingEvent;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import com.alexanderlogistics.KreditorDebitorService;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
/**
* Dieser Service reagiert auch ProcessingEvents und speichert/aktualisiert die
* zugehörige Creditor Metric Entity (type=metric.creditor).
* <p>
* Beim Rechnungseingang gilt eine Rechnung als Bezahlt wenn diese einen finalen
* Status erreicht hat (>=5800)
* <p>
* Der Service liest in einem AFTER_PROCESS Event den alten invoice.saldo aus.
* Hierzu wird die Rechnung in einer neuen Transaktion geladen was einem
* 'Dirty-Read' entspricht. Dadurch kennt die Methode den letzten saldo der
* Rechnung. Hat sich nun der aktuelle Saldo geändert, aktualisiert der Serivce
* die entsprechende Metric.
*
*
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RolesAllowed({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@ApplicationScoped
public class MetricCreditorService {
private static Logger logger = Logger.getLogger(MetricCreditorService.class.getName());
private final ConcurrentHashMap<String, ItemCollection> metricCache = new ConcurrentHashMap<>();
private final Set<String> registeredGauges = ConcurrentHashMap.newKeySet();
public static final String TYPE_METRIC_CREDITOR = "metric.creditor";
public static final String ITEM_TOTAL = "invoice.total";
public static final String ITEM_SALDO = "invoice.saldo";
@Inject
@RegistryScope(scope = MetricRegistry.APPLICATION_SCOPE)
MetricRegistry metricRegistry;
@Inject
DocumentService documentService;
@Inject
KreditorDebitorService kreditorDebitorService;
@Inject
MetricDataService metricDataService;
@Inject
@ConfigProperty(name = "metrics.enabled", defaultValue = "false")
private boolean metricsEnabled;
/**
* Reset the internal metricCache and clears all registered Gauges.
*/
public void reset() {
metricCache.clear();
registeredGauges.clear();
}
/**
* Reset the internal metricCache and clears all registered Gauges for a list of
* metric keys.
*/
public void reset(List<String> metricKeys) {
for (String metricKey : metricKeys) {
metricCache.remove(metricKey);
metricRegistry.remove(metricKey);
}
}
/**
* Process Metric only if some data has changed....
*
* @param processingEvent
* @throws PluginException
*/
public void onProcessingEvent(@Observes ProcessingEvent processingEvent) {
long l = System.currentTimeMillis();
if (!metricsEnabled) {
return;
}
ItemCollection invoice = processingEvent.getDocument();
if (!InvoiceUtil.isCreditorInvoice(invoice)) {
// skip event
return;
}
// update metric and the metric cache
if (processingEvent.getEventType() == ProcessingEvent.AFTER_PROCESS) {
// load the last invoice metric and reduce the saldo...
ItemCollection lastInvoice = metricDataService.readDirtyWorkitem(invoice.getUniqueID());
if (lastInvoice != null) {
try {
ItemCollection lastMetricData = getMetricByInvoice(lastInvoice);
subtractInvoice(lastMetricData, lastInvoice);
putMetric(lastMetricData);
metricDataService.saveMetric(lastMetricData);
} catch (PluginException e) {
// invalid invoice - e.g. no cdtr. number
}
}
try {
// load the invoice metric and add the saldo...
ItemCollection metricData = getMetricByInvoice(invoice);
// Saldo-Berechnung
addInvoice(metricData, invoice);
putMetric(metricData);
metricDataService.saveMetric(metricData);
// Update the Gauge
updateGauge(metricData);
logger.info("Metric cdtr update took " + (System.currentTimeMillis() - l) + "ms");
} catch (PluginException e) {
// invalid invoice - e.g. no cdtr. number
}
}
}
/**
* Returns the corresponding metric data object for an invoice. The method uses
* an internal cache. If the metric was not yet cached the method loads the
* metric from the database. If not metric exists in the database the method
* automatically creates a new metric data object.
*
* The method throws a PluginException if no metric can be build from this
* invoice (e.g. missing cdtr.number).
*
* @param invoice
* @return
* @throws PluginException
*/
public ItemCollection getMetricByInvoice(ItemCollection invoice) throws PluginException {
if (invoice == null) {
return null;
}
String metricKey = MetricDataService.buildKeyByInvoice(invoice);
ItemCollection metricData = metricCache.get(metricKey);
if (metricData == null) {
metricData = loadMetric(invoice);
}
// if metric still null we create a new metric data object.
if (metricData == null) {
metricData = createMetaData(invoice);
}
return metricData;
}
/**
* Returns a metric data object by key
*
* @param key
* @return
*/
public ItemCollection getMetric(String key) {
return metricCache.get(key);
}
/**
* Puts a metric data object into the cache.
*
* @param metricData
*/
public void putMetric(ItemCollection metricData) {
metricCache.put(metricData.getItemValueString("name"), metricData);
}
/**
* Returns a list with all cached metric keys.
* The method returns an unmodifiable list to prevent modifications.
*
* @return
*/
public List<String> getMetricKeys() {
return Collections.unmodifiableList(new ArrayList<>(metricCache.keySet()));
}
/**
* This method loads a metric entity for a given invoice workitem. If no metric
* entity exits, the method
* creates a new metric entity.
*
* @param invoice
* @return
* @throws PluginException
*/
private ItemCollection loadMetric(ItemCollection invoice) throws PluginException {
ItemCollection creditorMetric = null;
if (invoice == null) {
return null;
}
try {
String metricKey = MetricDataService.buildKeyByInvoice(invoice);
String query = "(type:" + TYPE_METRIC_CREDITOR + ") AND (name:" + metricKey + ")";
List<ItemCollection> result = documentService.find(query, 1, 0, "$modified", true);
if (result.size() > 0) {
creditorMetric = result.get(0);
}
} catch (IllegalArgumentException | QueryException e) {
throw new PluginException(PluginException.class.getName(),
"Failed to load metric object for invoice " + invoice.getUniqueID() + ": ", e.getMessage(), e);
}
return creditorMetric;
}
/**
* Creates an empty Creditor Meta Data Object (ItemCollection)
* <p>
* The ItemCollection stores the name and number and also all saldos for all
* currencies
*
* @param invoice - invoice ItemCollection
* @return
* @throws PluginException
*/
private ItemCollection createMetaData(ItemCollection invoice) throws PluginException {
if (invoice == null) {
return null;
}
String key = MetricDataService.buildKeyByInvoice(invoice);
ItemCollection metricData = new ItemCollection();
metricData.setType(TYPE_METRIC_CREDITOR);
metricData.setItemValue("name", key);
metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice));
metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice));
metricData.setItemValue("country", invoice.getItemValueString("invoice.country"));
metricData.setItemValue("currency", invoice.getItemValueString("invoice.currency"));
metricData.setItemValue("department", invoice.getItemValueString("space.name"));
return metricData;
}
/**
* Helper method to register a gauge for a creditor
*
* @param cdtrNumber - the creditor number
* @param cdtrName - the creditor name
*/
public void updateGauge(ItemCollection metricData) {
String metricKey = metricData.getItemValueString("name");
String bpName = metricData.getItemValueString("bp.name");
String bpId = metricData.getItemValueString("bp.id");
String country = metricData.getItemValueString("country");
String department = metricData.getItemValueString("department");
String currency = metricData.getItemValueString("currency");
// Prüfen ob Gauge bereits registriert ist
if (registeredGauges.add(metricKey)) { // returns true newly added
List<Tag> tags = new ArrayList<>();
tags.add(new Tag("type", "cdtr"));
tags.add(new Tag("id", bpId));
tags.add(new Tag("name", bpName));
tags.add(new Tag("country", country));
tags.add(new Tag("currency", currency));
tags.add(new Tag("department", department));
logger.fine("register new metric for department: " + department +
", " + metricData.getItemValueString(ITEM_SALDO) +
" " + currency);
Metadata metadata = Metadata.builder()
.withName("cdtr.balance")
.withDescription("Creditor Balance")
.build();
metricCache.get(metricKey);
metricRegistry.gauge(metadata,
() -> metricCache.get(metricKey).getItemValueDouble(ITEM_SALDO),
tags.toArray(new Tag[0]));
} else {
logger.fine("Cdtr Gauge already registered for department: " + department);
}
}
/**
* Addiert den saldo einer Invoice zu einem metricData object
*
* @param metricData
* @param invoice
*/
public void addInvoice(ItemCollection metricData, ItemCollection invoice) {
double invoiceTotal = invoice.getItemValueDouble(ITEM_TOTAL);
if (!"workitem".equals(invoice.getType()) || invoice.getTaskID() >= 5800) {
// vorgang ist archiviert oder gelöscht worden => saldo = 0!
invoiceTotal = 0.0;
}
// is the metric new?
if (!metricData.hasItem(ITEM_SALDO)) {
// init metric with the total value!
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(invoiceTotal));
} else {
double lastSaldo = metricData.getItemValueDouble(ITEM_SALDO);
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(lastSaldo + invoiceTotal));
}
}
public void subtractInvoice(ItemCollection metricData, ItemCollection invoice) {
if (metricData == null || invoice == null) {
return;
}
double invoiceTotal = invoice.getItemValueDouble(ITEM_TOTAL);
if (!"workitem".equals(invoice.getType()) || invoice.getTaskID() >= 5800) {
// vorgang ist archiviert oder gelöscht worden => saldo = 0!
invoiceTotal = 0.0;
}
// subtract only if metric saldo exists
if (metricData.hasItem(ITEM_SALDO)) {
double lastSaldo = metricData.getItemValueDouble(ITEM_SALDO);
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(lastSaldo - invoiceTotal));
}
}
/**
* Helper Method that refreshes all gauges. The method is called by the
* RestService during a rebuild.
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void refreshGauges() {
List<String> keys = getMetricKeys();
refreshGauges(keys);
}
/**
* Helper Method that refreshes all gauges. The method is called by the
* RestService during a rebuild.
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void refreshGauges(List<String> keys) {
for (String hashKey : keys) {
ItemCollection metricData = getMetric(hashKey);
documentService.save(metricData);
updateGauge(metricData);
}
}
}

View file

@ -1,140 +0,0 @@
package com.alexanderlogistics.metrics;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.index.SearchService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.inject.Inject;
/**
* The MetricDataService provides methods to lookup and update metric data
* objects.
* The service runs with manager access.
*
*
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Stateless
public class MetricDataService {
@Inject
DocumentService documentService;
/**
* Runs with Manager access
*
* @param metricData
*/
public void saveMetric(ItemCollection metricData) {
documentService.save(metricData);
}
/**
* This helper method reads a 'dirty' workitem in a new transaction. This is
* used for calculating the new metric values
*
* @param uniqueId
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public ItemCollection readDirtyWorkitem(String uniqueId) {
ItemCollection dirtyInvoice = documentService.load(uniqueId);
return dirtyInvoice;
}
/**
* This method deletes all metrics
*
* @throws PluginException
*
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void deleteAllMetrics(String metricType) throws PluginException {
try {
String query = "(type:" + metricType + ")";
List<ItemCollection> result = documentService.find(query, SearchService.DEFAULT_MAX_SEARCH_RESULT, 0);
for (ItemCollection metric : result) {
documentService.remove(metric);
}
} catch (IllegalArgumentException | QueryException e) {
throw new PluginException(MetricDataService.class.getName(),
"Failed to delete metrics", e.getMessage(), e);
}
}
/**
* This method deletes all metrics for a given BP ID
*
* @throws PluginException
*
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public List<String> deleteAllMetricsByBPID(String metricType, String bpID) throws PluginException {
List<String> result = new ArrayList<>();
try {
String query = "(type:" + metricType + ")";
List<ItemCollection> metricList = documentService.find(query, SearchService.DEFAULT_MAX_SEARCH_RESULT, 0);
for (ItemCollection metric : metricList) {
if (metric.getItemValueString("bp.id").equals(bpID)) {
result.add(metric.getItemValueString("name"));
documentService.remove(metric);
}
}
} catch (IllegalArgumentException | QueryException e) {
throw new PluginException(MetricDataService.class.getName(),
"Failed to delete metrics", e.getMessage(), e);
}
return result;
}
/**
* Builds the metric hash key by the invoice attributes. The returned key can be
* used for caching the metric.
*
* The metric key does not include the dbtr/cdtr name as this name is not
* relevant for building a hashkey.
*
* @param invoice - The invoice ItemCollection containing the necessary
* attributes
* @return A unique hash string based on the invoice attributes
* @throws PluginException
* @throws IllegalArgumentException if the invoice is null
*/
public static String buildKeyByInvoice(ItemCollection invoice) throws PluginException {
// Validate input
Objects.requireNonNull(invoice, "Invoice must not be null");
String bpNumber = InvoiceUtil.getBPId(invoice);
String country = invoice.getItemValueString("invoice.country");
String currency = invoice.getItemValueString("invoice.currency");
String department = invoice.getItemValueString("space.name");
// Concatenate the values and create a hash
String combinedValue = String.format("%s::%s::%s::%s",
bpNumber,
country,
currency,
department);
String hash = String.valueOf(combinedValue.hashCode());
// a hash can start with '-' which we need to avoid and create a alphanumeric
// key instead!
return "HASH" + hash;
}
}

View file

@ -1,221 +0,0 @@
package com.alexanderlogistics.metrics;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.ejb.Stateless;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
@Path("metrics/dbtr")
@Stateless
public class MetricDebitorRestService {
private static Logger logger = Logger.getLogger(MetricDebitorRestService.class.getName());
@Inject
DocumentService documentService;
@Inject
MetricDebitorService metricDebitorService;
@Inject
MetricDataService metricDataService;
@GET
@Path("/ping")
@Produces({ MediaType.TEXT_PLAIN })
public String ping() {
logger.info("GET ping");
return "ping: " + System.currentTimeMillis();
}
/**
* This method initializes the metrics for all debitors with open invoices.
*
* The method first deletes all existing metrics and than creates or updates the
* metric entires for each debitor.
*
* @return
*/
@GET
@Path("/rebuild")
@Produces({ MediaType.TEXT_PLAIN })
public Response rebuildMetrics() {
// Map<String, ItemCollection> metricCache = new HashMap<String,
// ItemCollection>();
long l = System.currentTimeMillis();
logger.info("├── init dbtr metrics...");
try {
// first clear the metric cache
metricDebitorService.reset();
logger.info("│   ├── reset metric cache");
// run in new transaction!
metricDataService.deleteAllMetrics(MetricDebitorService.TYPE_METRIC_DEBITOR);
logger.info("│   ├── delete metrics");
computeMetrics();
logger.info("│   ├── computing metrics finished in " + (System.currentTimeMillis() - l) + "ms");
logger.info("│   ├── save and init metrics ...");
// run in new transaction!
metricDebitorService.refreshGauges();
String message = "├── rebuild dbtr metrics completed in "
+ (System.currentTimeMillis() - l)
+ "ms";
logger.info(message);
return Response.ok().entity(message).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError()
.entity("Failed to initialize metrics: " + e.getMessage())
.build();
}
}
/**
* This method initializes the metrics for all creditors with open invoices.
*
* The method deletes all existing metrics and creates new metric entires for
* each creditor.
*
* @return
*/
@GET
@Path("/rebuild/{dbtrnumber}")
@Produces({ MediaType.TEXT_PLAIN })
public Response rebuildMetricsForDebitor(@PathParam("dbtrnumber") String dbtrnumber) {
StringBuffer messageBuffer = new StringBuffer();
long l = System.currentTimeMillis();
log("├── init dbtr metrics for " + dbtrnumber + "...", messageBuffer);
try {
logger.info("│   │   ├── group invoices by creditor " + dbtrnumber + "...");
int count = 0;
// First we need to remove all metrics for this creditor
String bpID = InvoiceUtil.buildBPID(dbtrnumber);
logger.info("│   │   ├── delete metrics for " + bpID + "...");
List<String> oldMetricKeys = metricDataService
.deleteAllMetricsByBPID(MetricDebitorService.TYPE_METRIC_DEBITOR, bpID);
logger.info("│   │   ├── found " + oldMetricKeys.size() + " metrics for " + bpID + "...");
metricDebitorService.reset(oldMetricKeys);
// next rebuild gauges and metrics for this creditor
String queryDbtrNumber = dbtrnumber;
if (queryDbtrNumber.startsWith("D")) {
queryDbtrNumber = queryDbtrNumber.substring(1); // DAS IST DER CARGOSOFT IRRSINN
}
String query = "$modelversion:rechnungsausgang-* AND type:workitem " +
" AND type:workitem AND dbtr.number:" + queryDbtrNumber;
logger.fine("Query = " + query);
List<ItemCollection> invoices = documentService.find(
query,
9999, 0, "invoice.number", false);
logger.info("│   │   ├──found " + invoices.size() + " open invoices");
List<String> newMetricKeys = new ArrayList<>();
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricDebitorService.getMetricByInvoice(invoice);
String metricKey = metricData.getItemValueString("name");
newMetricKeys.add(metricKey);
// Jetzt Rechnung addieren
logger.info("│   │   │   ├──update metric (" + metricKey + ")" + InvoiceUtil.getBPId(invoice)
+ " Invoice: "
+ invoice.getItemValueString("invoice.number") + " Saldo: "
+ invoice.getItemValueDouble(MetricDebitorService.ITEM_SALDO));
logger.info("│   │   │   │   ├── last metric saldo: "
+ metricData.getItemValueDouble(MetricDebitorService.ITEM_SALDO));
metricDebitorService.addInvoice(metricData, invoice);
logger.info("│   │   │   │   ├── new metric saldo: "
+ metricData.getItemValueDouble(MetricDebitorService.ITEM_SALDO));
metricDebitorService.putMetric(metricData);
count++;
} catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number
}
}
logger.info("│   │   ├── updated metric for " + count + " invoices.");
log("│   ├── computing metrics finished in " + (System.currentTimeMillis() - l) + "ms", messageBuffer);
logger.info("│   ├── save and init metrics...");
// run in new transaction!
metricDebitorService.refreshGauges(newMetricKeys);
String message = "├── rebuild dbtr metrics completed in "
+ (System.currentTimeMillis() - l)
+ "ms";
log(message, messageBuffer);
return Response.ok().entity(messageBuffer.toString()).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError()
.entity("Failed to initialize metrics: " + e.getMessage())
.build();
}
}
/**
* Diese Methode berechnet alle Metriken auf basis der existierenden Rechnungen
* neu
*
*/
public void computeMetrics() {
logger.info("│   │   ├── group invoices by debitor...");
try {
int count = 0;
List<ItemCollection> invoices = documentService.find(
"$modelversion:rechnungsausgang-* AND type:workitem",
9999, 0,
"invoice.number", false);
logger.info("│   │   ├── found " + invoices.size() + " open invoices");
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricDebitorService.getMetricByInvoice(invoice);
// Jetzt Rechnung addieren
metricDebitorService.addInvoice(metricData, invoice);
logger.info("│   │   │   ├──update metric " + InvoiceUtil.getBPId(invoice));
metricDebitorService.putMetric(metricData);
count++;
} catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number
}
}
logger.info("│   │   ├── updated metric for " + count + " invoices.");
} catch (QueryException e) {
e.printStackTrace();
}
}
private void log(String message, StringBuffer messageLog) {
logger.info(message);
messageLog.append(message + "\n");
}
}

View file

@ -1,367 +0,0 @@
package com.alexanderlogistics.metrics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.Tag;
import org.eclipse.microprofile.metrics.annotation.RegistryScope;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ProcessingEvent;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
/**
* Dieser Service reagiert auch ProcessingEvents und speichert/aktualisiert die
* zugehörige Debitoren Metric Entity (type=metric.debitor).
* <p>
* Der Service liest in einem AFTER_PROCESS Event den alten invoice.saldo aus.
* Hierzu wird die Rechnung in einer neuen Transaktion geladen was einem
* 'Dirty-Read' entspricht. Dadurch kennt die Methode den letzten saldo der
* Rechnung. Hat sich nun der aktuelle Saldo geändert, aktualisiert der Serivce
* die entsprechende Metric.
*
*
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RolesAllowed({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@ApplicationScoped
public class MetricDebitorService {
private static Logger logger = Logger.getLogger(MetricDebitorService.class.getName());
private final ConcurrentHashMap<String, ItemCollection> metricCache = new ConcurrentHashMap<>();
private final Set<String> registeredGauges = ConcurrentHashMap.newKeySet();
public static final String TYPE_METRIC_DEBITOR = "metric.debitor";
public static final String ITEM_SALDO = "invoice.saldo";
@Inject
@RegistryScope(scope = MetricRegistry.APPLICATION_SCOPE)
MetricRegistry metricRegistry;
@Inject
DocumentService documentService;
@Inject
MetricDataService metricDataService;
@Inject
@ConfigProperty(name = "metrics.enabled", defaultValue = "false")
private boolean metricsEnabled;
/**
* Reset internal metricCache and clear registered Gauges.
*/
public void reset() {
metricCache.clear();
registeredGauges.clear();
}
/**
* Reset the internal metricCache and clears all registered Gauges for a list of
* metric keys.
*/
public void reset(List<String> metricKeys) {
for (String metricKey : metricKeys) {
metricCache.remove(metricKey);
metricRegistry.remove(metricKey);
}
}
/**
* Process Metric only if some data has changed....
*
* @param processingEvent
* @throws PluginException
*/
public void onProcessingEvent(@Observes ProcessingEvent processingEvent) {
long l = System.currentTimeMillis();
if (!metricsEnabled) {
return;
}
ItemCollection invoice = processingEvent.getDocument();
if (!invoice.getModelVersion().startsWith("rechnungsausgang-")) {
// skip event
return;
}
// update metric and the metric cache
if (processingEvent.getEventType() == ProcessingEvent.AFTER_PROCESS) {
// load the last invoice metric and reduce the saldo...
ItemCollection lastInvoice = metricDataService.readDirtyWorkitem(invoice.getUniqueID());
if (lastInvoice != null) {
try {
ItemCollection lastMetricData = getMetricByInvoice(lastInvoice);
subtractInvoice(lastMetricData, lastInvoice);
putMetric(lastMetricData);
metricDataService.saveMetric(lastMetricData);
} catch (PluginException e) {
// invalid invoice - e.g. no cdtr. number
}
}
try {
// load the invoice metric and add the saldo...
ItemCollection metricData = getMetricByInvoice(invoice);
// Saldo-Berechnung
addInvoice(metricData, invoice);
putMetric(metricData);
metricDataService.saveMetric(metricData);
// Update the Gauge
updateGauge(metricData);
logger.info("Metric dbtr update took " + (System.currentTimeMillis() - l) + "ms");
} catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number
}
}
}
/**
* Returns the corresponding metric data object for an invoice. The method uses
* an internal cache. If the metric was not yet cached the method loads the
* metric from the database. If not metric exists in the database the method
* automatically creates a new metric data object.
*
* The method throws a PluginException if no metric can be build from this
* invoice (e.g. missing dbtr.number).
*
* @param invoice
* @return
* @throws PluginException
*/
public ItemCollection getMetricByInvoice(ItemCollection invoice) throws PluginException {
if (invoice == null) {
return null;
}
String metricKey = MetricDataService.buildKeyByInvoice(invoice);
ItemCollection metricData = metricCache.get(metricKey);
if (metricData == null) {
metricData = loadMetric(invoice);
}
// if metric still null we create a new metric data object.
if (metricData == null) {
metricData = createMetaData(invoice);
}
return metricData;
}
/**
* Returns a metric data object by key
*
* @param key
* @return
*/
public ItemCollection getMetric(String key) {
return metricCache.get(key);
}
/**
* Puts a metric data object into the cache.
*
* @param metricData
*/
public void putMetric(ItemCollection metricData) {
metricCache.put(metricData.getItemValueString("name"), metricData);
}
/**
* Returns a list with all cached metric keys.
* The method returns an unmodifiable list to prevent modifications.
*
* @return
*/
public List<String> getMetricKeys() {
return Collections.unmodifiableList(new ArrayList<>(metricCache.keySet()));
}
/**
* This method loads a metric entity for a given invoice workitem. If no metric
* entity exits, the method
* creates a new metric entity.
*
* @param invoice
* @return
* @throws PluginException
*/
private ItemCollection loadMetric(ItemCollection invoice) throws PluginException {
ItemCollection debitorMetric = null;
if (invoice == null) {
return null;
}
try {
String metricKey = MetricDataService.buildKeyByInvoice(invoice);
String query = "(type:" + TYPE_METRIC_DEBITOR + ") AND (name:" + metricKey + ")";
List<ItemCollection> result = documentService.find(query, 1, 0, "$modified", true);
if (result.size() > 0) {
debitorMetric = result.get(0);
}
} catch (IllegalArgumentException | QueryException e) {
throw new PluginException(PluginException.class.getName(),
"Failed to load metric object for invoice " + invoice.getUniqueID() + ": ", e.getMessage(), e);
}
return debitorMetric;
}
/**
* Creates an empty Debitor Meta Data Object (ItemCollection)
* <p>
* The ItemCollection stores the name and number and also all saldos for all
* currencies
*
* @param invoice - invoice ItemCollection
* @return
* @throws PluginException
*/
private ItemCollection createMetaData(ItemCollection invoice) throws PluginException {
if (invoice == null) {
return null;
}
String key = MetricDataService.buildKeyByInvoice(invoice);
ItemCollection metricData = new ItemCollection();
metricData.setType(TYPE_METRIC_DEBITOR);
metricData.setItemValue("name", key);
metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice));
metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice));
metricData.setItemValue("country", invoice.getItemValueString("invoice.country"));
metricData.setItemValue("currency", invoice.getItemValueString("invoice.currency"));
metricData.setItemValue("department", invoice.getItemValueString("space.name"));
return metricData;
}
/**
* Helper method to register a gauge for a debitor
*
* @param metricData - the metricData ItemCollection
*/
public void updateGauge(ItemCollection metricData) {
String metricKey = metricData.getItemValueString("name");
String bpName = metricData.getItemValueString("bp.name");
String bpId = metricData.getItemValueString("bp.id");
String country = metricData.getItemValueString("country");
String department = metricData.getItemValueString("department");
String currency = metricData.getItemValueString("currency");
// Prüfen ob Gauge bereits registriert ist
if (registeredGauges.add(metricKey)) { // returns true newly added
List<Tag> tags = new ArrayList<>();
tags.add(new Tag("type", "dbtr"));
tags.add(new Tag("id", bpId));
tags.add(new Tag("name", bpName));
tags.add(new Tag("country", country));
tags.add(new Tag("currency", currency));
tags.add(new Tag("department", department));
logger.fine("register new metric for department: " + department +
", " + metricData.getItemValueString(ITEM_SALDO) +
" " + currency);
Metadata metadata = Metadata.builder()
.withName("dbtr.balance")
.withDescription("Debitor Balance")
.build();
metricCache.get(metricKey);
metricRegistry.gauge(metadata,
() -> metricCache.get(metricKey).getItemValueDouble(ITEM_SALDO),
tags.toArray(new Tag[0]));
} else {
logger.fine("Gauge already registered for department: " + department);
}
}
/**
* Addiert den saldo einer Invoice zu einem metricData object
*
* @param metricData
* @param invoice
*/
public void addInvoice(ItemCollection metricData, ItemCollection invoice) {
double invoiceTotal = invoice.getItemValueDouble(ITEM_SALDO);
if (!"workitem".equals(invoice.getType()) || invoice.getTaskID() >= 5800) {
// vorgang ist archiviert oder gelöscht worden => saldo = 0!
invoiceTotal = 0.0;
}
logger.fine("│   │   │   │   ├── Invoice: " + invoice.getItemValueString("invoice.number") + " Saldo="
+ invoiceTotal);
// is the metric new?
if (!metricData.hasItem(ITEM_SALDO)) {
// init metric with the total value!
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(invoiceTotal));
} else {
double lastSaldo = metricData.getItemValueDouble(ITEM_SALDO);
logger.fine("│   │   │   │   ├──letzter Metric Saldo=" + lastSaldo);
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(lastSaldo + invoiceTotal));
}
}
public void subtractInvoice(ItemCollection metricData, ItemCollection invoice) {
if (metricData == null || invoice == null) {
return;
}
double invoiceTotal = invoice.getItemValueDouble(ITEM_SALDO);
logger.fine("│   │   │   │   ├──Invoice: " + invoice.getItemValueString("invoice.number") + " Saldo="
+ invoiceTotal);
if (!"workitem".equals(invoice.getType()) || invoice.getTaskID() >= 5800) {
// vorgang ist archiviert oder gelöscht worden => saldo = 0!
invoiceTotal = 0.0;
}
// subtract only if metric saldo exists
if (metricData.hasItem(ITEM_SALDO)) {
double lastSaldo = metricData.getItemValueDouble(ITEM_SALDO);
logger.fine("│   │   │   │   ├──letzter Metric Saldo=" + lastSaldo);
metricData.setItemValue(ITEM_SALDO, InvoiceUtil.round(lastSaldo - invoiceTotal));
}
}
/**
* Helper Method that refreshes all gauges. The method is called by the
* RestService during a rebuild.
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void refreshGauges() {
List<String> keys = getMetricKeys();
refreshGauges(keys);
}
/**
* Helper Method that refreshes all gauges. The method is called by the
* RestService during a rebuild.
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void refreshGauges(List<String> keys) {
for (String hashKey : keys) {
ItemCollection metricData = getMetric(hashKey);
documentService.save(metricData);
updateGauge(metricData);
}
}
}

View file

@ -28,10 +28,15 @@
package com.alexanderlogistics.xml;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.WorkflowKernel;
import org.imixs.workflow.engine.DocumentEvent;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ModelService;
@ -42,8 +47,13 @@ import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.ProcessingErrorException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.BusinessPartnerService;
import com.alexanderlogistics.InvoiceUtil;
import com.alexanderlogistics.KreditorDebitorService;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.EJB;
import jakarta.ejb.Stateless;
import jakarta.enterprise.event.Observes;
@ -56,10 +66,22 @@ import jakarta.enterprise.event.Observes;
* ein und prüft ob der Workflow schon existiert oder ggf. aktualisiert werden
* muss.
*
* Der Service migriert auch die alten zusätzlichen IBAN/BIC felder wenn der
* Business partner erstmals neu angelegt wird.
*
* The service set also the flag NOSNAPSHOT=true for the crgosoftcreditor
* document type.
*
* @author rsoika
*
*/
@DeclareRoles({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RolesAllowed({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Stateless
public class BusinessPartnerImportService {
@ -92,8 +114,16 @@ public class BusinessPartnerImportService {
if (event.getEventType() == DocumentEvent.ON_DOCUMENT_SAVE) {
// check type!
if ("cargosoftkreditor".equals(event.getDocument().getType())) {
logger.info("Verify business partner object....");
// set NOSNAPSHOT=true
event.getDocument().setItemValue(SnapshotService.NOSNAPSHOT, true);
// run only if we have the model 'businesspartner-*';
if (modelService.findVersionsByRegEx("(businesspartner*)").size() == 0) {
// no business partner workflow found
return;
}
logger.fine("Verify business partner object....");
ItemCollection importDoc = event.getDocument();
String name = event.getDocument().getItemValueString("name");
@ -103,7 +133,7 @@ public class BusinessPartnerImportService {
// Prüfen ob es diesen partner schon gibt?
ItemCollection businesspartner = lookupBusinessPartner(partnerID);
if (businesspartner == null) {
businesspartner = createBusinessPartner();
businesspartner = createBusinessPartner(partnerID);
}
ItemCollection oldBussinessPartnerItemColl = (ItemCollection) businesspartner.clone();
@ -130,7 +160,33 @@ public class BusinessPartnerImportService {
// hat sich das Objekt verändert?
if (!businesspartner.equals(oldBussinessPartnerItemColl)) {
businesspartner.event(201); // update/create
// Prüfe IBAN auf plausibilität
List<ItemCollection> bankList = BusinessPartnerService.getBanks(businesspartner);
boolean ibanDublette = false;
List<String> dublettenIban = new ArrayList<>();
for (ItemCollection bank : bankList) {
String iban = bank.getItemValueString("iban");
// erkenne fehlerhaften kontonummern
if (dublettenIban.contains(iban)) {
// ACHTUNG - uneindeutige Bankverbindung
ibanDublette = true;
} else {
dublettenIban.add(iban);
}
}
int eventID = 200; // default
// event errechnen
if (!businesspartner.hasItem(WorkflowKernel.LASTEVENT)) {
// create new!
if (ibanDublette) {
eventID = 300; // Exception
} else {
eventID = 100; // update/create
}
}
businesspartner.setEventID(eventID);
try {
workflowService.processWorkItemByNewTransaction(businesspartner);
} catch (AccessDeniedException | ProcessingErrorException | PluginException | ModelException e) {
@ -147,15 +203,122 @@ public class BusinessPartnerImportService {
*
* @return
*/
private ItemCollection createBusinessPartner() {
private ItemCollection createBusinessPartner(String partnerID) {
ItemCollection businessPartner = new ItemCollection();
businessPartner.setType("workitem");
businessPartner.setWorkflowGroup("Business Partner");
businessPartner.task(1000);
// Hier migrieren wir jetzt auch die alten IBAN/BIC Daten
try {
String cargoShortID = partnerID.substring(2);
String query = "(type:" + KreditorDebitorService.TYPE_CARGOSOFTKREDITOR + ")";
query = query + " AND ( name:K7" + cargoShortID + " OR name:D1" + cargoShortID + " )";
List<ItemCollection> oldList = documentService.find(query, 2, 0);
// es können 2 Datensätze ankommen
// Items:
// cdtr.mail (Liste)
// cdtr.creditperiod
// cdtr.iban , cdtr.iban2 - 4
// cdtr.bic , cdtr.bic2 - 4
List<String> ibanList = new ArrayList<>();
List<String> bicList = new ArrayList<>();
for (ItemCollection oldData : oldList) {
if (!oldData.getItemValueString("cdtr.mail").isEmpty()) {
businessPartner.setItemValue("cdtr.mail", oldData.getItemValue("cdtr.mail"));
}
if (!oldData.getItemValueString("cdtr.creditperiod").isEmpty()) {
businessPartner.setItemValue("cdtr.creditperiod", oldData.getItemValue("cdtr.creditperiod"));
}
if (!oldData.getItemValueString("cdtr.iban").isEmpty()) {
ibanList.add(oldData.getItemValueString("cdtr.iban"));
}
if (!oldData.getItemValueString("cdtr.bic").isEmpty()) {
bicList.add(oldData.getItemValueString("cdtr.bic"));
}
if (!oldData.getItemValueString("cdtr.iban2").isEmpty()) {
ibanList.add(oldData.getItemValueString("cdtr.iban2"));
}
if (!oldData.getItemValueString("cdtr.bic2").isEmpty()) {
bicList.add(oldData.getItemValueString("cdtr.bic2"));
}
if (!oldData.getItemValueString("cdtr.iban3").isEmpty()) {
ibanList.add(oldData.getItemValueString("cdtr.iban3"));
}
if (!oldData.getItemValueString("cdtr.bic3").isEmpty()) {
bicList.add(oldData.getItemValueString("cdtr.bic3"));
}
if (!oldData.getItemValueString("cdtr.iban4").isEmpty()) {
ibanList.add(oldData.getItemValueString("cdtr.iban4"));
}
if (!oldData.getItemValueString("cdtr.bic4").isEmpty()) {
bicList.add(oldData.getItemValueString("cdtr.bic4"));
}
}
// build partner.iban.list - dublettenprüfung und Trim
List<String> dubletten = new ArrayList<>();
List<String> dublettenIban = new ArrayList<>();
if (ibanList.size() > 0) {
List<ItemCollection> bankList = new ArrayList<>();
for (int i = 0; i < ibanList.size(); i++) {
String iban = ibanList.get(i);
String bic = "";
if (bicList.size() > i) {
bic = bicList.get(i);
}
iban = superTrim(iban);
bic = superTrim(bic);
if (dubletten.contains(iban + "/" + bic)) {
// voll dublette
continue;
} else {
dubletten.add(iban + "/" + bic);
}
ItemCollection bank = new ItemCollection();
// {cdtr.iban=[A], name=[cdtr1], cdtr.name=[a], cdtr.bic=[a]}
bank.setItemValue("id", "bank" + (i + 1));
bank.setItemValue("name", "Bank " + (i + 1));
bank.setItemValue("iban", iban);
bank.setItemValue("bic", bic);
bankList.add(bank);
}
Iterator<?> var3 = bankList.iterator();
List<Map> mapOrderItems = new ArrayList();
while (var3.hasNext()) {
ItemCollection orderItem = (ItemCollection) var3.next();
mapOrderItems.add(orderItem.getAllItems());
}
businessPartner.setItemValue(BusinessPartnerService.ITEM_IBAN_LIST, mapOrderItems);
}
} catch (QueryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return businessPartner;
}
/**
* entfernt alle leerzeichen
*/
public String superTrim(String data) {
String result = data.trim();
result = result.replace(" ", "");
return result;
}
/**
* Sucht nach einem Business partner
*

View file

@ -7,4 +7,30 @@
!important;
background-position: 4px 6px, center !important;
padding-left: 22px !important;
}
.tooltip-link {
position: relative;
display: inline-block;
}
.tooltip-text {
visibility: hidden;
width: 300px;
background-color: black;
color: #fff;
text-align: center;
border-radius: 5px;
padding: 5px;
position: absolute;
z-index: 1;
bottom: 125%; /* Position above the link */
left: 50%;
margin-left: -150px; /* Center the tooltip */
opacity: 0;
transition: opacity 0.3s;
}
.tooltip-link:hover .tooltip-text {
visibility: visible;
opacity: 1;
}

View file

@ -0,0 +1,49 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Zeit alle verknüften Zahlungen an -->
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="dunnings">
<table class="imixsdatatable ">
<tr>
<th style="width: 600px;">Mahnung</th>
<th style="width: 200px;">Status</th>
<th style="">#{message.modified}</th>
</tr>
<ui:param name="dunnings"
value="#{businessPartnerController.getDunnings()}"></ui:param>
<ui:repeat var="dunning" value="#{dunnings}">
<tr>
<td><h:link outcome="/pages/workitems/workitem">
#{dunning.item['$workflowsummary']}
<f:param name="id" value="#{dunning.item['$uniqueid']}" />
</h:link></td>
<td>#{dunning.item['$workflowstatus']}</td>
<td><h:outputText value="#{dunning.item['$lastEventDate']}">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:outputText> #{message.by} #{userController.getUserName(dunning.item['$editor'])}</td>
</tr>
</ui:repeat>
</table>
</h:panelGroup>
</ui:composition>

View file

@ -0,0 +1,49 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Zeit alle verknüften Zahlungen an -->
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="invoices">
<table class="imixsdatatable ">
<tr>
<th style="width: 600px;">Rechnung</th>
<th style="width: 200px;">Status</th>
<th style="">#{message.modified}</th>
</tr>
<ui:param name="invoices"
value="#{businessPartnerController.getInvoicesIn()}"></ui:param>
<ui:repeat var="invoice" value="#{invoices}">
<tr>
<td><h:link outcome="/pages/workitems/workitem">
#{invoice.item['$workflowsummary']}
<f:param name="id" value="#{invoice.item['$uniqueid']}" />
</h:link></td>
<td>#{invoice.item['$workflowstatus']}</td>
<td><h:outputText value="#{invoice.item['$lastEventDate']}">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:outputText> #{message.by} #{userController.getUserName(invoice.item['$editor'])}</td>
</tr>
</ui:repeat>
</table>
</h:panelGroup>
</ui:composition>

View file

@ -0,0 +1,51 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<!-- Zeit alle verknüften Zahlungen an -->
<h:panelGroup layout="block" styleClass="imixs-form-section"
id="invoices">
<table class="imixsdatatable ">
<tr>
<th style="width: 600px;">Rechnung</th>
<th style="width: 200px;">Status</th>
<th style="">#{message.modified}</th>
</tr>
<ui:param name="invoices"
value="#{businessPartnerController.getInvoicesOut()}"></ui:param>
<ui:repeat var="invoice" value="#{invoices}">
<tr>
<td><h:link outcome="/pages/workitems/workitem" styleClass="tooltip-link">
#{invoice.item['$workflowsummary']}
<f:param name="id" value="#{invoice.item['$uniqueid']}" />
<span class="tooltip-text">
<h:outputText value="#{invoice.item['$workflowabstract']}" escape="false" />
</span>
</h:link>
</td>
<td>#{invoice.item['$workflowstatus']}</td>
<td><h:outputText value="#{invoice.item['$lastEventDate']}">
<f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" />
</h:outputText> #{message.by} #{userController.getUserName(invoice.item['$editor'])}</td>
</tr>
</ui:repeat>
</table>
</h:panelGroup>
</ui:composition>

View file

@ -10,35 +10,35 @@
<f:ajax render="#{ibanListContainer.clientId}" onevent="updateSepaList">
<table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 140px">Name</th>
<th style="">Bank<span class="imixs-required">
*</span></th>
<th style="width: 140px">ID<span class="imixs-required">
*</span></th>
<th style="">Bank</th>
<th style="width: 250px;">IBAN</th>
<th style="width: 150px;">BIC</th>
<th style="width: 50px">
</th>
</tr>
<ui:repeat var="cdtr" value="#{businessPartnerController.ibanList}">
<ui:repeat var="bank" value="#{businessPartnerController.ibanList}">
<tr>
<td>
<h:inputText value="#{cdtr.item['name']}" style="width:100%;" />
<h:inputText value="#{bank.item['id']}" required="true" style="width:100%;" />
</td>
<td>
<h:inputText value="#{cdtr.item['cdtr.name']}"
<h:inputText value="#{bank.item['name']}"
style="width:100%;" />
</td>
<td>
<h:inputText value="#{cdtr.item['cdtr.iban']}"
<h:inputText value="#{bank.item['iban']}"
onkeyup="imixsOfficeWorkitem.formatIBAN(this);"
style="width:100%;" />
</td>
<td>
<h:inputText value="#{cdtr.item['cdtr.bic']}" style="width:100%;text-transform:uppercase;" />
<h:inputText value="#{bank.item['bic']}" style="width:100%;text-transform:uppercase;" />
</td>
<td>
<h:commandLink
actionListener="#{businessPartnerController.removeIBAN(cdtr.item['name'])}">
actionListener="#{businessPartnerController.removeIBAN(bank.item['id'])}">
<span class="typcn typcn-trash imixs-state-info"></span>
<f:ajax render="#{ibanListContainer.clientId}"
onevent="updateSepaList" />

View file

@ -0,0 +1,79 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
xmlns:marty="http://xmlns.jcp.org/jsf/composite/marty" xmlns:i="http://xmlns.jcp.org/jsf/composite/imixs">
<!-- businsspartner Search integration
This subform is a custom form part.
The subform provides a jsf commandScript which calls the businessPartnerController.search method in the backend.
The script below inits a autocompletion feature for the input field.
See imixs-office.autocompletion.js
See also:
https://stackoverflow.com/questions/16588327/how-to-invoke-a-jsf-managed-bean-on-a-html-dom-event-using-native-javascript
https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call
https://www.w3schools.com/howto/howto_js_autocomplete.asp
-->
<ui:param name="item_konto_name" value="#{item.name}.name"></ui:param>
<ui:fragment rendered="#{!readonly}">
<h:inputText value="#{workitem.item[item.name]}" pt:data-item="#{item.name}" />
<h:inputHidden value="#{workitem.item[item_konto_name]}" pt:data-item="#{item_konto_name}" />
<br />
<span id='businsspartner-konto-id' class='small'>#{workitem.item[item_konto_name]}</span>
<h:commandScript name="businsspartnerSearch" action="#{businessPartnerController.search(options)}"
render="autocomplete-resultlist-businsspartner" onevent="autocompleteShowResult" />
<script type="text/javascript">
/*<![CDATA[*/
// init input fields...
$(document).ready(function () {
// add autocomplete feature ..
var creditorField = $("input[data-item='#{item.name}']");
$(creditorField).each(function () {
$(this).addClass("imixs-ml");
autocompleteInitInput(this, businsspartnerSearch, 'autocomplete-resultlist-businsspartner', selectDebitorCreditorCallback);
});
});
// Hier bekommen wir die JSON Struktur mit allen daten.
// diese Daten werden auf die einzelnen Felder verteilt.
function selectDebitorCreditorCallback(selection) {
const kontoData = JSON.parse(selection);
// fill data into the fields....
var inputElementKonto = $("input[data-item='#{item.name}']");
var inputElementKreditor = $("input[data-item='#{item_konto_name}']");
inputElementKonto.val(kontoData.name);
inputElementKreditor.val(kontoData['partner.name']);
// remove old konto name
$('#businsspartner-konto-id').remove();
// append span with konto name....
inputElementKonto.after("<span id='businsspartner-konto-id' class='small'>" + kontoData['partner.name'] + "</span>");
}
/*]]>*/
</script>
<!-- businsspartner suggest list -->
<h:panelGroup id="autocomplete-resultlist-businsspartner" layout="block" class="autocomplete-resultlist">
<ui:repeat var="suggest" value="#{businessPartnerController.searchResult}">
<div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest.data}')">
<a href="#">
<h:outputText value="#{suggest.display}" escape="false" />
</a>
</div>
</ui:repeat>
</h:panelGroup>
</ui:fragment>
<!-- Read only -->
<ui:fragment rendered="#{readonly}">
<h:outputText value="#{workitem.item[item.name]} #{workitem.item[item_konto_name]}"/>
</ui:fragment>
</ui:composition>

14
pom.xml
View file

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.alexander-logistics</groupId>
<artifactId>office-alexander-logistics</artifactId>
<version>1.3.1</version>
<version>1.3.2</version>
<packaging>pom</packaging>
<name>Imixs Office Workflow - Custom Build</name>
@ -25,17 +25,19 @@
<!-- Dependency Versions -->
<jakarta.version>10.0.0</jakarta.version>
<org.imixs.office.version>5.0.4-SNAPSHOT</org.imixs.office.version>
<org.imixs.workflow.version>6.0.9-SNAPSHOT</org.imixs.workflow.version>
<org.imixs.office.version>5.0.4</org.imixs.office.version>
<org.imixs.workflow.version>6.0.9</org.imixs.workflow.version>
<org.imixs.marty.version>5.0.0</org.imixs.marty.version>
<org.imixs.archive.version>3.0.2</org.imixs.archive.version>
<org.imixs.adapters.version>3.0.3-SNAPSHOT</org.imixs.adapters.version>
<!-- 3.0.2 -->
<org.imixs.archive.version>3.1.1-SNAPSHOT</org.imixs.archive.version>
<org.imixs.adapters.version>3.0.3</org.imixs.adapters.version>
<org.imixs.melman.version>2.0.2</org.imixs.melman.version>
<microprofile.version>6.0</microprofile.version>
<net.sf.saxon.version>9.9.1-4</net.sf.saxon.version>
<apache.pdfbox.version>2.0.26</apache.pdfbox.version>
<!-- -->
<org.imixs.ai.version>1.1.1-SNAPSHOT</org.imixs.ai.version>
<org.imixs.ai.version>1.1.1</org.imixs.ai.version>
<custom.webResources>src/main/webapp</custom.webResources>
<!-- Environment Settings -->

View file

@ -4,6 +4,7 @@
<bpmn2:participant id="participant_d6UFsQ" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_oxb3dg" name="Business Partner" processRef="process_Hw9Ryg">
<bpmn2:documentation id="documentation_Jerngw"/>
<bpmn2:outgoing>association_83sZPw</bpmn2:outgoing>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:extensionElements>
@ -25,9 +26,12 @@
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value>
<imixs:value><![CDATA[Owner|$owner]]></imixs:value>
<imixs:value><![CDATA[Editor|$editor]]></imixs:value>
<imixs:value><![CDATA[Ersteller | $creator]]></imixs:value>
<imixs:value><![CDATA[Aktueller Bearbeiter | $editor]]></imixs:value>
<imixs:value><![CDATA[Eigentümer | $owner]]></imixs:value>
<imixs:value><![CDATA[Prozess-Verantwortliche| process.manager]]></imixs:value>
<imixs:value><![CDATA[Prozess-Team | process.team]]></imixs:value>
<imixs:value><![CDATA[Prozess-Assistenz | process.assist]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
@ -49,10 +53,37 @@
<bpmn2:flowNodeRef>textAnnotation_LyGTCw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_TuyuwQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_h0Kk5g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_delO7Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_1OVorA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_baWU4w</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_ofjVfg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_i7yQVw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_uK0c6g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_6250fg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_VM0fEQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_s0J53g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_NohgrQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_AMs05g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_feLZFQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_GTXFMw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_u8OBFg</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:task id="task_ToMZaQ" imixs:processid="1000" name="Neuanlage">
<bpmn2:extensionElements/>
<bpmn2:extensionElements>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_a83GTA"/>
<bpmn2:incoming>sequenceFlow_25otUg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_S9LVXg</bpmn2:outgoing>
@ -63,7 +94,6 @@
</bpmn2:startEvent>
<bpmn2:endEvent id="event_1clvlg" name="Ende">
<bpmn2:documentation id="documentation_obvnAg"/>
<bpmn2:incoming>sequenceFlow_NNbMhg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_rwdWxw</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_25otUg" sourceRef="event_WmkBvw" targetRef="task_ToMZaQ">
@ -77,13 +107,42 @@
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_M7b42w"/>
<bpmn2:incoming>sequenceFlow_knUYpQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_2uNvPw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_NNbMhg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_9atLFA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_T5L9aQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_b4BcVA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_8O1EtQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ShuXXA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_03b60w</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:task id="task_B8Pi7A" imixs:processid="1800" name="Gesperrt">
<bpmn2:extensionElements>
@ -93,94 +152,139 @@
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-times,imixs-error]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_0B9wKQ"/>
<bpmn2:incoming>sequenceFlow_1mXO8A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_rwdWxw</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_gC0I9w</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_kS2fMA</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_aSdkwg" imixs:activityid="201" name="[import]">
<bpmn2:intermediateCatchEvent id="event_aSdkwg" imixs:activityid="100" name="[import]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft Importiert]]></imixs:value>
<imixs:value><![CDATA[Business Partner aus Cargosoft importiert]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_5409Kg"/>
<bpmn2:incoming>sequenceFlow_S9LVXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_knUYpQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_jAU3VA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_8O1EtQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_S9LVXg" sourceRef="task_ToMZaQ" targetRef="event_aSdkwg">
<bpmn2:sequenceFlow id="sequenceFlow_S9LVXg" sourceRef="task_ToMZaQ" targetRef="gateway_uK0c6g">
<bpmn2:documentation id="documentation_Idvd0Q"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_knUYpQ" sourceRef="event_aSdkwg" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_DSg1Eg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_Tr0aug" imixs:activityid="30" name="Sperren">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="action">home</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_2XhDKQ"/>
<bpmn2:incoming>sequenceFlow_2uNvPw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_1mXO8A</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_b0Bj3Q</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_neSsFQ</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_2uNvPw" sourceRef="task_Q80A1Q" targetRef="event_Tr0aug">
<bpmn2:documentation id="documentation_G0afxQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_1mXO8A" sourceRef="event_Tr0aug" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_JL48mA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_NNbMhg" sourceRef="task_Q80A1Q" targetRef="event_1clvlg">
<bpmn2:documentation id="documentation_I0Y0pQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_rwdWxw" sourceRef="task_B8Pi7A" targetRef="event_1clvlg">
<bpmn2:documentation id="documentation_8xdVSA"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_UQIXAQ" name="Form">
<bpmn2:documentation id="documentation_e1in1w"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="1" label="">
<item name="partner.name" type="text" span="8" readonly="false" label="Name:"/>
<item name="partner.id" type="text" span="4" readonly="true" label="Partner ID:"/>
</imixs-form-section>
<bpmn2:documentation id="documentation_e1in1w"><![CDATA[<imixs-form>
<imixs-form-section columns="1" label="Adresse" readonly="true">
<item name="partner.address" type="text" span="8" required="false" label="Adresse:" />
<item name="partner.address.sub1" type="text" span="4" required="false" label="Zusatz" />
<item name="partner.country" type="custom" path="country" span="4" readonly="false" label="Land:" />
<item name="partner.zip" type="text" span="1" required="false" label="PLZ:" />
<item name="partner.city" type="text" span="7" required="false" label="Stadt:" />
<item name="partner.language" type="text" readonly="false" span="4" label="Sprache:" />
<item name="partner.phone" type="text" readonly="false" span="4" label="Tel.:" />
</imixs-form-section>
<imixs-subform label="Überblick">
<imixs-form-section columns="4" label="Ausgangsrechnungen">
<item name="analytic.invoices.count.all" type="custom" path="alexander/analyze_plain" label="Alle Rechnungen:" />
<item name="analytic.invoices.count.open" type="custom" path="alexander/analyze_plain" label="Offene Rechnungen:" />
<item name="analytic.invoices.count.due" type="custom" path="alexander/analyze_plain" label="Fällige Rechnungen:" />
<item name="analytic.invoices.count.dunning" type="custom" path="alexander/analyze_plain" label="Rechnungen in Mahnung:" />
</imixs-form-section>
<imixs-form-section label="" path="alexander/section_bp_invoices_out" readonly="true" />
<imixs-form-section columns="2" label="Zahlungsmoral">
<item name="analytic.payment.avg.due" type="custom" path="alexander/analyze_plain" label="Average term of credit:" />
<item name="analytic.payment.avg.days" type="custom" path="alexander/analyze_plain" label="Average payment duration:" />
</imixs-form-section>
<imixs-form-section columns="1" label="">
<item name="analytic.invoices.trend" type="custom" path="alexander/analyze_chart"
label="Trend der letzten 6 Monate:" />
</imixs-form-section>
<imixs-form-section label="Eingangsrechnungen" path="alexander/section_bp_invoices_in" readonly="true" />
<imixs-form-section columns="1" label="Rechnungseingang ">
<item name="cdtr.number" type="text" span="2" readonly="true" label="Kreditoren Nr.:" />
<item name="cdtr.email" type="text" span="4" readonly="false" label="E-Mail:" />
<item name="cdtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" />
</imixs-form-section>
</imixs-subform>
<imixs-form-section columns="1" label="Rechnungsausgang ">
<item name="dbtr.number" type="text" span="2" readonly="true" label="Debitoren Nr.:" />
<item name="dbtr.email" type="text" span="4" readonly="false" label="E-Mail SOA/Mahnungen:" />
<item name="dbtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" />
</imixs-form-section>
<imixs-subform label="Stammdaten">
<imixs-form-section columns="1" label="">
<item name="partner.name" type="text" span="6" readonly="true" label="Name:"/>
<item name="partner.id" type="text" span="6" readonly="true" label="Partner ID:"/>
</imixs-form-section>
<imixs-form-section label="Banken" path="alexander/sub_businesspartner_ibanlist" />
<imixs-form-section columns="1" label="" readonly="true">
<item name="partner.address" type="text" span="6" required="false" label="Adresse:" />
<item name="partner.address.sub1" type="text" span="6" required="false" label="Zusatz" />
<item name="partner.zip" type="text" span="1" required="false" label="PLZ:" />
<item name="partner.city" type="text" span="5" required="false" label="Stadt:" />
<item name="partner.phone" type="text" readonly="false" span="6" label="Tel.:" />
<item name="partner.country" type="custom" path="country" span="6" readonly="false" label="Land:" />
<item name="partner.language" type="text" readonly="false" span="6" label="Sprache:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Rechnungseingang ">
<item name="cdtr.number" type="text" span="2" readonly="true" label="Kreditoren Nr.:" />
<item name="cdtr.creditperiod" type="text" span="4" readonly="false" label="Zahlungsziel (Tage):" />
<item name="cdtr.email" type="textlist" span="6" readonly="false" label="E-Mail:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Rechnungsausgang ">
<item name="dbtr.number" type="text" span="2" readonly="true" label="Debitoren Nr.:" />
<item name="dbtr.creditperiod" type="text" span="4" readonly="false" label="Zahlungsziel (Tage):" />
<item name="dbtr.email" type="textlist" span="6" readonly="false" label="E-Mail SOA/Mahnungen:" />
</imixs-form-section>
<imixs-form-section label="Banken" path="alexander/section_businesspartner_banklist" />
</imixs-subform>
</imixs-form>]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_pG70zw" sourceRef="task_ToMZaQ" targetRef="dataObject_UQIXAQ">
<bpmn2:documentation id="documentation_ukKpew"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_vwH0cA" imixs:activityid="10" name="Speichern">
<bpmn2:documentation id="documentation_WOUVTQ"/>
<bpmn2:outgoing>sequenceFlow_avahXg</bpmn2:outgoing>
@ -196,10 +300,10 @@
<bpmn2:text id="text_M05BXg"><![CDATA[Neuanalge erfolgt über den Cargosoft CSV Import im BusinessPartnerImportService]]></bpmn2:text>
<bpmn2:documentation id="documentation_wdTBKA"/>
</bpmn2:textAnnotation>
<bpmn2:association id="association_83sZPw" sourceRef="event_aSdkwg" targetRef="textAnnotation_LyGTCw">
<bpmn2:association id="association_83sZPw" sourceRef="participant_oxb3dg" targetRef="textAnnotation_LyGTCw">
<bpmn2:documentation id="documentation_FKcIcg"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_TuyuwQ" imixs:activityid="201" name="[update]">
<bpmn2:intermediateCatchEvent id="event_TuyuwQ" imixs:activityid="200" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
@ -207,6 +311,9 @@
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[Business Partner aktualisiert aus Cargosoft ]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft aktualisiert]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_wy3OSA"/>
<bpmn2:outgoing>sequenceFlow_9atLFA</bpmn2:outgoing>
@ -229,139 +336,547 @@
<bpmn2:sequenceFlow id="sequenceFlow_gC0I9w" sourceRef="event_h0Kk5g" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_gfdNnQ"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_delO7Q" imixs:processid="1300" name="Plausibilitätsprüfung">
<bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_1TuLXg"/>
<bpmn2:outgoing>sequenceFlow_NNbMhg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_pvIENQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_BWOtzA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ofWWuw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_b0Bj3Q</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_BHsRkQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_1OVorA" imixs:activityid="300" name="[iban/bic error]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[IBAN/BIC Plausibilität prüfen]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_J8iRLQ"/>
<bpmn2:outgoing>sequenceFlow_BHsRkQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_5pT4Tw</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateCatchEvent id="event_baWU4w" imixs:activityid="20" name="Korrigiert">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Daten korrigiert]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="action">home</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_q730KA"/>
<bpmn2:incoming>sequenceFlow_pvIENQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_b4BcVA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_pvIENQ" sourceRef="task_delO7Q" targetRef="event_baWU4w">
<bpmn2:documentation id="documentation_BYJ08A"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_b4BcVA" sourceRef="event_baWU4w" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_5wWdHA"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_ofjVfg" imixs:activityid="200" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft aktualisiert]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_A42bcQ"/>
<bpmn2:outgoing>sequenceFlow_BWOtzA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_BWOtzA" sourceRef="event_ofjVfg" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_QW3slw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_i7yQVw" imixs:activityid="10" name="Speichern">
<bpmn2:extensionElements>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></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_Il4Shw"/>
<bpmn2:outgoing>sequenceFlow_ofWWuw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_ofWWuw" sourceRef="event_i7yQVw" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_fXWIBw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_b0Bj3Q" sourceRef="task_delO7Q" targetRef="event_Tr0aug">
<bpmn2:documentation id="documentation_pVJeTQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_T5L9aQ" sourceRef="task_Q80A1Q" targetRef="event_VM0fEQ">
<bpmn2:documentation id="documentation_0GJKgQ"/>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_uK0c6g" name="">
<bpmn2:documentation id="documentation_V9jDYA"/>
<bpmn2:incoming>sequenceFlow_S9LVXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_jAU3VA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_8BTEtw</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_jAU3VA" sourceRef="gateway_uK0c6g" targetRef="event_aSdkwg">
<bpmn2:documentation id="documentation_ZNk0Bw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_BHsRkQ" sourceRef="event_1OVorA" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_SvoFWw"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_WgLbbg" sourceRef="dataObject_UQIXAQ" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_YhKaqg"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_8O1EtQ" sourceRef="event_aSdkwg" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_VTvROw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_6250fg" imixs:activityid="10" name="Speichern">
<bpmn2:documentation id="documentation_fcuXRg"/>
<bpmn2:outgoing>sequenceFlow_kS2fMA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_kS2fMA" sourceRef="event_6250fg" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_t0kr1g"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_VM0fEQ" imixs:activityid="900" name="[Stats]">
<bpmn2:extensionElements>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_ZmJD9A"/>
<bpmn2:incoming>sequenceFlow_T5L9aQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_MPlPww</bpmn2:outgoing>
<bpmn2:timerEventDefinition id="timerEventDefinition_faqzJg"/>
<bpmn2:incoming>sequenceFlow_rNZ3tw</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:exclusiveGateway default="sequenceFlow_aH0vCQ" gatewayDirection="Diverging" id="gateway_s0J53g" name="">
<bpmn2:documentation id="documentation_2Qn8Ng"/>
<bpmn2:incoming>sequenceFlow_MPlPww</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_aH0vCQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_ShuXXA</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="task_NohgrQ" imixs:processid="1700" name="Inaktiv">
<bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_RI2Ing"/>
<bpmn2:incoming>sequenceFlow_9atLFA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_8O1EtQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_aH0vCQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_neSsFQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_zd6RWA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_rNZ3tw</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sequenceFlow id="sequenceFlow_MPlPww" sourceRef="event_VM0fEQ" targetRef="gateway_s0J53g">
<bpmn2:documentation id="documentation_saZUSw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_aH0vCQ" sourceRef="gateway_s0J53g" targetRef="task_NohgrQ">
<bpmn2:documentation id="documentation_0fUXrw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_ShuXXA" sourceRef="gateway_s0J53g" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_mhSkeg"/>
<bpmn2:conditionExpression id="formalExpression_oEZj1g" xsi:type="bpmn2:tFormalExpression"><![CDATA[true;]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_neSsFQ" sourceRef="task_NohgrQ" targetRef="event_Tr0aug">
<bpmn2:documentation id="documentation_X3IiUg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_AMs05g" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_CKfjew"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_QoDe7w"/>
<bpmn2:outgoing>sequenceFlow_5pT4Tw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateThrowEvent id="event_feLZFQ" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_ns8CKQ"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_ici5wA"/>
<bpmn2:incoming>sequenceFlow_8BTEtw</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_5pT4Tw" sourceRef="event_AMs05g" targetRef="event_1OVorA">
<bpmn2:documentation id="documentation_mQfndA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_8BTEtw" sourceRef="gateway_uK0c6g" targetRef="event_feLZFQ">
<bpmn2:documentation id="documentation_aB5qHw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateThrowEvent id="event_GTXFMw" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_a8NiKA"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_YUfA0A"/>
<bpmn2:incoming>sequenceFlow_03b60w</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_03b60w" sourceRef="task_Q80A1Q" targetRef="event_GTXFMw">
<bpmn2:documentation id="documentation_i02Wsw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateThrowEvent id="event_u8OBFg" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_0rGDzg"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_8g6AoA"/>
<bpmn2:incoming>sequenceFlow_zd6RWA</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_zd6RWA" sourceRef="task_NohgrQ" targetRef="event_u8OBFg">
<bpmn2:documentation id="documentation_ez15rg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_rNZ3tw" sourceRef="task_NohgrQ" targetRef="event_VM0fEQ">
<bpmn2:documentation id="documentation_AHyEzA"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_1">
<bpmndi:BPMNShape bpmnElement="event_WmkBvw" id="BPMNShape_heefeQ">
<dc:Bounds height="36.0" width="36.0" x="77.0" y="167.0"/>
<dc:Bounds height="36.0" width="36.0" x="57.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_6qfN6w">
<dc:Bounds height="20.0" width="100.0" x="45.0" y="206.0"/>
<dc:Bounds height="20.0" width="100.0" x="25.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_1clvlg" id="BPMNShape_85k4rg">
<dc:Bounds height="36.0" width="36.0" x="787.0" y="167.0"/>
<dc:Bounds height="36.0" width="36.0" x="1657.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_F7t2Ng">
<dc:Bounds height="20.0" width="100.0" x="755.0" y="149.0"/>
<dc:Bounds height="20.0" width="100.0" x="1625.0" y="259.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_ToMZaQ" id="BPMNShape_CUpR6w">
<dc:Bounds height="50.0" width="110.0" x="200.0" y="160.0"/>
<dc:Bounds height="50.0" width="110.0" x="170.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="participant_oxb3dg" id="BPMNShape_mqlDUA">
<dc:Bounds height="550.0" width="1420.0" x="-30.0" y="40.0"/>
<dc:Bounds height="820.0" width="1820.0" x="-30.0" y="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_Zxa2TA" id="BPMNShape_Lane_1cDN5A">
<dc:Bounds height="550.0" width="1390.0" x="0.0" y="40.0"/>
<dc:Bounds height="820.0" width="1790.0" x="0.0" y="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_25otUg" id="BPMNEdge_NHnc3g" sourceElement="BPMNShape_heefeQ" targetElement="BPMNShape_CUpR6w">
<di:waypoint x="113.0" y="185.0"/>
<di:waypoint x="200.0" y="185.0"/>
<di:waypoint x="93.0" y="295.0"/>
<di:waypoint x="170.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_Q80A1Q" id="BPMNShape_7JA0nw">
<dc:Bounds height="50.0" width="110.0" x="490.0" y="160.0"/>
<dc:Bounds height="50.0" width="110.0" x="660.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_B8Pi7A" id="BPMNShape_ghujeA">
<dc:Bounds height="50.0" width="110.0" x="490.0" y="320.0"/>
<dc:Bounds height="50.0" width="110.0" x="1360.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_aSdkwg" id="BPMNShape_uesqgg">
<dc:Bounds height="36.0" width="36.0" x="377.0" y="167.0"/>
<dc:Bounds height="36.0" width="36.0" x="437.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_AxKRKQ">
<dc:Bounds height="20.0" width="100.0" x="345.0" y="206.0"/>
<dc:Bounds height="20.0" width="100.0" x="405.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_S9LVXg" id="BPMNEdge_xoCSiA" sourceElement="BPMNShape_CUpR6w" targetElement="BPMNShape_uesqgg">
<di:waypoint x="310.0" y="185.0"/>
<di:waypoint x="377.0" y="185.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_knUYpQ" id="BPMNEdge_0yPtdQ" sourceElement="BPMNShape_uesqgg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="413.0" y="185.0"/>
<di:waypoint x="490.0" y="185.0"/>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_S9LVXg" id="BPMNEdge_xoCSiA" sourceElement="BPMNShape_CUpR6w" targetElement="BPMNShape_6IZk7Q">
<di:waypoint x="280.0" y="295.0"/>
<di:waypoint x="340.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_Tr0aug" id="BPMNShape_NEaJjA">
<dc:Bounds height="36.0" width="36.0" x="527.0" y="237.0"/>
<dc:Bounds height="36.0" width="36.0" x="1227.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_GkrCTA">
<dc:Bounds height="20.0" width="100.0" x="495.0" y="276.0"/>
<dc:Bounds height="20.0" width="100.0" x="1195.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_2uNvPw" id="BPMNEdge_Q4F2dQ" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_NEaJjA">
<di:waypoint x="545.0" y="210.0"/>
<di:waypoint x="545.0" y="237.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_1mXO8A" id="BPMNEdge_7CorJA" sourceElement="BPMNShape_NEaJjA" targetElement="BPMNShape_ghujeA">
<di:waypoint x="545.0" y="273.0"/>
<di:waypoint x="545.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_NNbMhg" id="BPMNEdge_HdVWPQ" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_85k4rg">
<di:waypoint x="600.0" y="185.0"/>
<di:waypoint x="787.0" y="185.0"/>
<di:waypoint x="1263.0" y="295.0"/>
<di:waypoint x="1360.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rwdWxw" id="BPMNEdge_t88dUw" sourceElement="BPMNShape_ghujeA" targetElement="BPMNShape_85k4rg">
<di:waypoint x="600.0" y="345.0"/>
<di:waypoint x="810.0" y="345.0"/>
<di:waypoint x="810.0" y="202.0"/>
<di:waypoint x="1470.0" y="295.0"/>
<di:waypoint x="1657.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_UQIXAQ" id="BPMNShape_Mnop9Q">
<dc:Bounds height="50.0" width="35.0" x="380.0" y="60.0"/>
<dc:Bounds height="50.0" width="35.0" x="560.0" y="380.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_h0UuFw">
<dc:Bounds height="20.0" width="100.0" x="347.5" y="115.0"/>
<dc:Bounds height="20.0" width="100.0" x="527.5" y="435.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_pG70zw" id="BPMNEdge_YKSHpA" sourceElement="BPMNShape_CUpR6w" targetElement="BPMNShape_Mnop9Q">
<di:waypoint x="260.0" y="160.0"/>
<di:waypoint x="260.0" y="80.0"/>
<di:waypoint x="380.0" y="80.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_vwH0cA" id="BPMNShape_OXGg8Q">
<dc:Bounds height="36.0" width="36.0" x="657.0" y="67.0"/>
<dc:Bounds height="36.0" width="36.0" x="747.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_KaHfJQ">
<dc:Bounds height="20.0" width="100.0" x="625.0" y="106.0"/>
<dc:Bounds height="20.0" width="100.0" x="715.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_avahXg" id="BPMNEdge_odMtvQ" sourceElement="BPMNShape_OXGg8Q" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="665.0" y="100.0"/>
<di:waypoint x="575.0" y="100.0"/>
<di:waypoint x="575.0" y="160.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_uvV8uA" id="BPMNEdge_3Mtxfw" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="525.0" y="220.0"/>
<di:waypoint x="545.0" y="135.0"/>
<di:waypoint x="747.0" y="196.0"/>
<di:waypoint x="725.0" y="196.0"/>
<di:waypoint x="725.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_uvV8uA" id="BPMNEdge_3Mtxfw" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_7JA0nw"/>
<bpmndi:BPMNEdge bpmnElement="association_mpLQEQ" id="BPMNEdge_qkEiPA" sourceElement="BPMNShape_Mnop9Q" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="415.0" y="80.0"/>
<di:waypoint x="550.0" y="80.0"/>
<di:waypoint x="550.0" y="160.0"/>
<di:waypoint x="588.0" y="380.0"/>
<di:waypoint x="588.0" y="357.0"/>
<di:waypoint x="680.0" y="357.0"/>
<di:waypoint x="680.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="textAnnotation_LyGTCw" id="BPMNShape_SbxnGw">
<dc:Bounds height="85.0" width="228.0" x="60.0" y="300.0"/>
<dc:Bounds height="85.0" width="228.0" x="80.0" y="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_83sZPw" id="BPMNEdge_p0XWxg" sourceElement="BPMNShape_uesqgg" targetElement="BPMNShape_SbxnGw">
<di:waypoint x="395.0" y="203.0"/>
<di:waypoint x="395.0" y="345.0"/>
<di:waypoint x="288.0" y="345.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_83sZPw" id="BPMNEdge_p0XWxg" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_SbxnGw"/>
<bpmndi:BPMNShape bpmnElement="event_TuyuwQ" id="BPMNShape_fTy7mg">
<dc:Bounds height="36.0" width="36.0" x="447.0" y="237.0"/>
<dc:Bounds height="36.0" width="36.0" x="617.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_033n1A">
<dc:Bounds height="20.0" width="100.0" x="415.0" y="276.0"/>
<dc:Bounds height="20.0" width="100.0" x="585.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9atLFA" id="BPMNEdge_BC4pwQ" sourceElement="BPMNShape_fTy7mg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="465.0" y="237.0"/>
<di:waypoint x="465.0" y="225.0"/>
<di:waypoint x="520.0" y="225.0"/>
<di:waypoint x="520.0" y="210.0"/>
<di:waypoint x="653.0" y="196.0"/>
<di:waypoint x="700.0" y="196.0"/>
<di:waypoint x="700.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_h0Kk5g" id="BPMNShape_T4k09g">
<dc:Bounds height="36.0" width="36.0" x="497.0" y="427.0"/>
<dc:Bounds height="36.0" width="36.0" x="1327.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_lX0KlA">
<dc:Bounds height="20.0" width="100.0" x="465.0" y="466.0"/>
<dc:Bounds height="20.0" width="100.0" x="1295.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_gC0I9w" id="BPMNEdge_0nCVvg" sourceElement="BPMNShape_T4k09g" targetElement="BPMNShape_ghujeA">
<di:waypoint x="515.0" y="427.0"/>
<di:waypoint x="515.0" y="400.0"/>
<di:waypoint x="545.0" y="400.0"/>
<di:waypoint x="545.0" y="370.0"/>
<di:waypoint x="1360.0" y="185.0"/>
<di:waypoint x="1390.0" y="185.0"/>
<di:waypoint x="1390.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_delO7Q" id="BPMNShape_rEOMWA">
<dc:Bounds height="50.0" width="110.0" x="660.0" y="510.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_1OVorA" id="BPMNShape_mG4csA">
<dc:Bounds height="36.0" width="36.0" x="557.0" y="517.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_djIb8w">
<dc:Bounds height="20.0" width="100.0" x="528.0" y="559.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_baWU4w" id="BPMNShape_755HGg">
<dc:Bounds height="36.0" width="36.0" x="697.0" y="407.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_oN6XKQ">
<dc:Bounds height="20.0" width="100.0" x="665.0" y="446.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_pvIENQ" id="BPMNEdge_wXz5yA" sourceElement="BPMNShape_rEOMWA" targetElement="BPMNShape_755HGg">
<di:waypoint x="715.0" y="510.0"/>
<di:waypoint x="715.0" y="443.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_b4BcVA" id="BPMNEdge_1gQ5Nw" sourceElement="BPMNShape_755HGg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="715.0" y="407.0"/>
<di:waypoint x="715.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_ofjVfg" id="BPMNShape_hDVKtg">
<dc:Bounds height="36.0" width="36.0" x="617.0" y="607.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_HpXNFQ">
<dc:Bounds height="20.0" width="100.0" x="585.0" y="646.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_BWOtzA" id="BPMNEdge_KW5PhQ" sourceElement="BPMNShape_hDVKtg" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="651.0" y="616.0"/>
<di:waypoint x="685.0" y="616.0"/>
<di:waypoint x="685.0" y="560.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_i7yQVw" id="BPMNShape_KxnRjA">
<dc:Bounds height="36.0" width="36.0" x="747.0" y="607.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_sJqwmA">
<dc:Bounds height="20.0" width="100.0" x="715.0" y="646.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ofWWuw" id="BPMNEdge_zlNOzQ" sourceElement="BPMNShape_KxnRjA" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="749.0" y="616.0"/>
<di:waypoint x="735.0" y="616.0"/>
<di:waypoint x="735.0" y="560.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_b0Bj3Q" id="BPMNEdge_CDn41A" sourceElement="BPMNShape_rEOMWA" targetElement="BPMNShape_NEaJjA">
<di:waypoint x="770.0" y="540.0"/>
<di:waypoint x="1240.0" y="540.0"/>
<di:waypoint x="1240.0" y="312.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_T5L9aQ" id="BPMNEdge_dAQH1Q" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_FKXJtw">
<di:waypoint x="770.0" y="295.0"/>
<di:waypoint x="837.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_uK0c6g" id="BPMNShape_6IZk7Q">
<dc:Bounds height="50.0" width="50.0" x="340.0" y="270.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_JvBA0w">
<dc:Bounds height="20.0" width="100.0" x="315.0" y="323.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_jAU3VA" id="BPMNEdge_2qLI2g" sourceElement="BPMNShape_6IZk7Q" targetElement="BPMNShape_uesqgg">
<di:waypoint x="390.0" y="295.0"/>
<di:waypoint x="437.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_BHsRkQ" id="BPMNEdge_1LX47g" sourceElement="BPMNShape_mG4csA" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="593.0" y="535.0"/>
<di:waypoint x="660.0" y="535.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_WgLbbg" id="BPMNEdge_Btz9CA" sourceElement="BPMNShape_Mnop9Q" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="575.0" y="430.0"/>
<di:waypoint x="575.0" y="471.0"/>
<di:waypoint x="675.0" y="471.0"/>
<di:waypoint x="675.0" y="510.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8O1EtQ" id="BPMNEdge_JxSLfA" sourceElement="BPMNShape_uesqgg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="473.0" y="295.0"/>
<di:waypoint x="660.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_6250fg" id="BPMNShape_v5Xzvg">
<dc:Bounds height="36.0" width="36.0" x="1457.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_IBnUDA">
<dc:Bounds height="20.0" width="100.0" x="1425.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_kS2fMA" id="BPMNEdge_i80XvQ" sourceElement="BPMNShape_v5Xzvg" targetElement="BPMNShape_ghujeA">
<di:waypoint x="1458.0" y="190.0"/>
<di:waypoint x="1435.0" y="190.0"/>
<di:waypoint x="1435.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_VM0fEQ" id="BPMNShape_FKXJtw">
<dc:Bounds height="36.0" width="36.0" x="837.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_CAiT2Q">
<dc:Bounds height="20.0" width="100.0" x="805.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_s0J53g" id="BPMNShape_gklxXQ">
<dc:Bounds height="50.0" width="50.0" x="930.0" y="270.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_I4jC0g">
<dc:Bounds height="20.0" width="100.0" x="905.0" y="323.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_NohgrQ" id="BPMNShape_VljsIw">
<dc:Bounds height="50.0" width="110.0" x="1060.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_MPlPww" id="BPMNEdge_rt2H3g" sourceElement="BPMNShape_FKXJtw" targetElement="BPMNShape_gklxXQ">
<di:waypoint x="873.0" y="295.0"/>
<di:waypoint x="930.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_aH0vCQ" id="BPMNEdge_YMnxQQ" sourceElement="BPMNShape_gklxXQ" targetElement="BPMNShape_VljsIw">
<di:waypoint x="980.0" y="295.0"/>
<di:waypoint x="1060.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ShuXXA" id="BPMNEdge_DY4O8Q" sourceElement="BPMNShape_gklxXQ" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="956.0" y="319.0"/>
<di:waypoint x="956.0" y="364.0"/>
<di:waypoint x="746.0" y="364.0"/>
<di:waypoint x="746.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_neSsFQ" id="BPMNEdge_b7C0wQ" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_NEaJjA">
<di:waypoint x="1170.0" y="295.0"/>
<di:waypoint x="1227.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_AMs05g" id="BPMNShape_rS0hsw">
<dc:Bounds height="36.0" width="36.0" x="477.0" y="517.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_XcN2Og">
<dc:Bounds height="20.0" width="100.0" x="445.0" y="556.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_feLZFQ" id="BPMNShape_uklBfA">
<dc:Bounds height="36.0" width="36.0" x="347.0" y="367.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_OengAQ">
<dc:Bounds height="20.0" width="100.0" x="315.0" y="406.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_5pT4Tw" id="BPMNEdge_LZMXxg" sourceElement="BPMNShape_rS0hsw" targetElement="BPMNShape_mG4csA">
<di:waypoint x="513.0" y="535.0"/>
<di:waypoint x="557.0" y="535.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8BTEtw" id="BPMNEdge_Os7FVw" sourceElement="BPMNShape_6IZk7Q" targetElement="BPMNShape_uklBfA">
<di:waypoint x="365.0" y="320.0"/>
<di:waypoint x="365.0" y="367.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_GTXFMw" id="BPMNShape_5I6iNA">
<dc:Bounds height="36.0" width="36.0" x="847.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_80daBg">
<dc:Bounds height="20.0" width="100.0" x="815.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_03b60w" id="BPMNEdge_ehQBOQ" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_5I6iNA">
<di:waypoint x="770.0" y="294.0"/>
<di:waypoint x="809.0" y="294.0"/>
<di:waypoint x="809.0" y="195.0"/>
<di:waypoint x="847.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_u8OBFg" id="BPMNShape_Kp730Q">
<dc:Bounds height="36.0" width="36.0" x="1137.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_iUQ02A">
<dc:Bounds height="20.0" width="100.0" x="1105.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_zd6RWA" id="BPMNEdge_6qKC4A" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_Kp730Q">
<di:waypoint x="1114.0" y="270.0"/>
<di:waypoint x="1114.0" y="195.0"/>
<di:waypoint x="1137.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rNZ3tw" id="BPMNEdge_zrajzA" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_FKXJtw">
<di:waypoint x="1080.0" y="270.0"/>
<di:waypoint x="1080.0" y="237.0"/>
<di:waypoint x="855.0" y="237.0"/>
<di:waypoint x="855.0" y="277.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>

View file

@ -0,0 +1,883 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:BPMN2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:imixs="http://www.imixs.org/bpmn2" xmlns:open-bpmn="http://open-bpmn.org/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.openbpmn" exporterVersion="1.0.0" targetNamespace="http://open-bpmn.org">
<bpmn2:collaboration id="collaboration_1" name="Default Collaboration">
<bpmn2:participant id="participant_d6UFsQ" name="Default Process" processRef="process_1"/>
<bpmn2:participant id="participant_oxb3dg" name="Business Partner" processRef="process_Hw9Ryg">
<bpmn2:documentation id="documentation_Jerngw"/>
<bpmn2:outgoing>association_83sZPw</bpmn2:outgoing>
</bpmn2:participant>
</bpmn2:collaboration>
<bpmn2:extensionElements>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[businesspartner-en-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.SplitAndJoinPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApproverPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.team.TeamPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Ersteller|$creator]]></imixs:value>
<imixs:value><![CDATA[Aktueller Bearbeiter|$editor]]></imixs:value>
<imixs:value><![CDATA[Eigentümer|$owner]]></imixs:value>
<imixs:value><![CDATA[Prozess-Verantwortliche|process.manager]]></imixs:value>
<imixs:value><![CDATA[Prozess-Team|process.team]]></imixs:value>
<imixs:value><![CDATA[Prozess-Assistenz|process.assist]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_1" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_bowXyw"/>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="collaboration_1" id="process_Hw9Ryg" isExecutable="true" name="Business Partner" processType="Private">
<bpmn2:laneSet id="laneset_nKajSg" name="Lane Set">
<bpmn2:lane id="lane_Zxa2TA" name="Buchhaltung">
<bpmn2:documentation id="documentation_jEAKkQ"/>
<bpmn2:flowNodeRef>task_ToMZaQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_WmkBvw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_1clvlg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_Q80A1Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_B8Pi7A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_aSdkwg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_Tr0aug</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_UQIXAQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_vwH0cA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>textAnnotation_LyGTCw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_TuyuwQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_h0Kk5g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_delO7Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_1OVorA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_baWU4w</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_ofjVfg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_i7yQVw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_uK0c6g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_6250fg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_VM0fEQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_s0J53g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_NohgrQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_AMs05g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_feLZFQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_GTXFMw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_u8OBFg</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:task id="task_ToMZaQ" imixs:processid="1000" name="Neuanlage">
<bpmn2:extensionElements>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_a83GTA"/>
<bpmn2:incoming>sequenceFlow_25otUg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_S9LVXg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:startEvent id="event_WmkBvw" name="Start">
<bpmn2:documentation id="documentation_QXQddg"/>
<bpmn2:outgoing>sequenceFlow_25otUg</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:endEvent id="event_1clvlg" name="Ende">
<bpmn2:documentation id="documentation_obvnAg"/>
<bpmn2:incoming>sequenceFlow_rwdWxw</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="sequenceFlow_25otUg" sourceRef="event_WmkBvw" targetRef="task_ToMZaQ">
<bpmn2:documentation id="documentation_Tzm1bw"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_Q80A1Q" imixs:processid="1100" name="Activ">
<bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_M7b42w"/>
<bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_9atLFA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_T5L9aQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_b4BcVA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_8O1EtQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ShuXXA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_03b60w</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:task id="task_B8Pi7A" imixs:processid="1800" name="Locked">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-times,imixs-error]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_0B9wKQ"/>
<bpmn2:incoming>sequenceFlow_1mXO8A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_rwdWxw</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_gC0I9w</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_kS2fMA</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_aSdkwg" imixs:activityid="100" name="[import]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft importiert]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_5409Kg"/>
<bpmn2:incoming>sequenceFlow_jAU3VA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_8O1EtQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_S9LVXg" sourceRef="task_ToMZaQ" targetRef="gateway_uK0c6g">
<bpmn2:documentation id="documentation_Idvd0Q"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_Tr0aug" imixs:activityid="30" name="Lock">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="action">home</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_2XhDKQ"/>
<bpmn2:outgoing>sequenceFlow_1mXO8A</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_b0Bj3Q</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_neSsFQ</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_1mXO8A" sourceRef="event_Tr0aug" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_JL48mA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_rwdWxw" sourceRef="task_B8Pi7A" targetRef="event_1clvlg">
<bpmn2:documentation id="documentation_8xdVSA"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="dataObject_UQIXAQ" name="Form">
<bpmn2:documentation id="documentation_e1in1w"><![CDATA[<imixs-form>
<imixs-subform label="Überblick">
<imixs-form-section columns="4" label="Ausgangsrechnungen">
<item name="analytic.invoices.count.all" type="custom" path="alexander/analyze_plain" label="Alle Rechnungen:" />
<item name="analytic.invoices.count.open" type="custom" path="alexander/analyze_plain" label="Offene Rechnungen:" />
<item name="analytic.invoices.count.due" type="custom" path="alexander/analyze_plain" label="Fällige Rechnungen:" />
<item name="analytic.invoices.count.dunning" type="custom" path="alexander/analyze_plain" label="Rechnungen in Mahnung:" />
</imixs-form-section>
<imixs-form-section label="" path="alexander/section_bp_invoices_out" readonly="true" />
<imixs-form-section columns="2" label="Zahlungsmoral">
<item name="analytic.payment.avg.due" type="custom" path="alexander/analyze_plain" label="Average term of credit:" />
<item name="analytic.payment.avg.days" type="custom" path="alexander/analyze_plain" label="Average payment duration:" />
</imixs-form-section>
<imixs-form-section columns="1" label="">
<item name="analytic.invoices.trend" type="custom" path="alexander/analyze_chart"
label="Trend der letzten 6 Monate:" />
</imixs-form-section>
<imixs-form-section label="Eingangsrechnungen" path="alexander/section_bp_invoices_in" readonly="true" />
</imixs-subform>
<imixs-subform label="Stammdaten">
<imixs-form-section columns="1" label="">
<item name="partner.name" type="text" span="6" readonly="true" label="Name:"/>
<item name="partner.id" type="text" span="6" readonly="true" label="Partner ID:"/>
</imixs-form-section>
<imixs-form-section columns="1" label="" readonly="true">
<item name="partner.address" type="text" span="6" required="false" label="Adresse:" />
<item name="partner.address.sub1" type="text" span="6" required="false" label="Zusatz" />
<item name="partner.zip" type="text" span="1" required="false" label="PLZ:" />
<item name="partner.city" type="text" span="5" required="false" label="Stadt:" />
<item name="partner.phone" type="text" readonly="false" span="6" label="Tel.:" />
<item name="partner.country" type="custom" path="country" span="6" readonly="false" label="Land:" />
<item name="partner.language" type="text" readonly="false" span="6" label="Sprache:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Rechnungseingang ">
<item name="cdtr.number" type="text" span="2" readonly="true" label="Kreditoren Nr.:" />
<item name="cdtr.creditperiod" type="text" span="4" readonly="false" label="Zahlungsziel (Tage):" />
<item name="cdtr.email" type="textlist" span="6" readonly="false" label="E-Mail:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Rechnungsausgang ">
<item name="dbtr.number" type="text" span="2" readonly="true" label="Debitoren Nr.:" />
<item name="dbtr.creditperiod" type="text" span="4" readonly="false" label="Zahlungsziel (Tage):" />
<item name="dbtr.email" type="textlist" span="6" readonly="false" label="E-Mail SOA/Mahnungen:" />
</imixs-form-section>
<imixs-form-section label="Banken" path="alexander/section_businesspartner_banklist" />
</imixs-subform>
</imixs-form>]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:intermediateCatchEvent id="event_vwH0cA" imixs:activityid="10" name="Save">
<bpmn2:documentation id="documentation_WOUVTQ"/>
<bpmn2:outgoing>sequenceFlow_avahXg</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_avahXg" sourceRef="event_vwH0cA" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_lhR6Lw"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_uvV8uA" sourceRef="participant_oxb3dg" targetRef="task_Q80A1Q"/>
<bpmn2:association id="association_mpLQEQ" sourceRef="dataObject_UQIXAQ" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_oVnaJw"/>
</bpmn2:association>
<bpmn2:textAnnotation id="textAnnotation_LyGTCw" textFormat="">
<bpmn2:text id="text_M05BXg"><![CDATA[Neuanalge erfolgt über den Cargosoft CSV Import im BusinessPartnerImportService]]></bpmn2:text>
<bpmn2:documentation id="documentation_wdTBKA"/>
</bpmn2:textAnnotation>
<bpmn2:association id="association_83sZPw" sourceRef="participant_oxb3dg" targetRef="textAnnotation_LyGTCw">
<bpmn2:documentation id="documentation_FKcIcg"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_TuyuwQ" imixs:activityid="200" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[Business Partner aktualisiert aus Cargosoft ]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft aktualisiert]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_wy3OSA"/>
<bpmn2:outgoing>sequenceFlow_9atLFA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_9atLFA" sourceRef="event_TuyuwQ" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_LHM8vg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_h0Kk5g" imixs:activityid="201" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[Business Partner aktualisiert aus Cargosoft ]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_AnqGdA"/>
<bpmn2:outgoing>sequenceFlow_gC0I9w</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_gC0I9w" sourceRef="event_h0Kk5g" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_gfdNnQ"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_delO7Q" imixs:processid="1300" name="Fraud Detection">
<bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_1TuLXg"/>
<bpmn2:outgoing>sequenceFlow_NNbMhg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_pvIENQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_BWOtzA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ofWWuw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_b0Bj3Q</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_BHsRkQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_1OVorA" imixs:activityid="300" name="[iban/bic error]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[IBAN/BIC fraud detection]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_J8iRLQ"/>
<bpmn2:outgoing>sequenceFlow_BHsRkQ</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_5pT4Tw</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateCatchEvent id="event_baWU4w" imixs:activityid="20" name="Update">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Data updated]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="action">home</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_q730KA"/>
<bpmn2:incoming>sequenceFlow_pvIENQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_b4BcVA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_pvIENQ" sourceRef="task_delO7Q" targetRef="event_baWU4w">
<bpmn2:documentation id="documentation_BYJ08A"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_b4BcVA" sourceRef="event_baWU4w" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_5wWdHA"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_ofjVfg" imixs:activityid="200" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft aktualisiert]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_A42bcQ"/>
<bpmn2:outgoing>sequenceFlow_BWOtzA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_BWOtzA" sourceRef="event_ofjVfg" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_QW3slw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_i7yQVw" imixs:activityid="10" name="Save">
<bpmn2:extensionElements>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></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_Il4Shw"/>
<bpmn2:outgoing>sequenceFlow_ofWWuw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_ofWWuw" sourceRef="event_i7yQVw" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_fXWIBw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_b0Bj3Q" sourceRef="task_delO7Q" targetRef="event_Tr0aug">
<bpmn2:documentation id="documentation_pVJeTQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_T5L9aQ" sourceRef="task_Q80A1Q" targetRef="event_VM0fEQ">
<bpmn2:documentation id="documentation_0GJKgQ"/>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_uK0c6g" name="">
<bpmn2:documentation id="documentation_V9jDYA"/>
<bpmn2:incoming>sequenceFlow_S9LVXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_jAU3VA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_8BTEtw</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_jAU3VA" sourceRef="gateway_uK0c6g" targetRef="event_aSdkwg">
<bpmn2:documentation id="documentation_ZNk0Bw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_BHsRkQ" sourceRef="event_1OVorA" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_SvoFWw"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_WgLbbg" sourceRef="dataObject_UQIXAQ" targetRef="task_delO7Q">
<bpmn2:documentation id="documentation_YhKaqg"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_8O1EtQ" sourceRef="event_aSdkwg" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_VTvROw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_6250fg" imixs:activityid="10" name="Save">
<bpmn2:documentation id="documentation_fcuXRg"/>
<bpmn2:outgoing>sequenceFlow_kS2fMA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_kS2fMA" sourceRef="event_6250fg" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_t0kr1g"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_VM0fEQ" imixs:activityid="900" name="[Stats]">
<bpmn2:extensionElements>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_ZmJD9A"/>
<bpmn2:incoming>sequenceFlow_T5L9aQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_MPlPww</bpmn2:outgoing>
<bpmn2:timerEventDefinition id="timerEventDefinition_faqzJg"/>
<bpmn2:incoming>sequenceFlow_rNZ3tw</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:exclusiveGateway default="sequenceFlow_aH0vCQ" gatewayDirection="Diverging" id="gateway_s0J53g" name="">
<bpmn2:documentation id="documentation_2Qn8Ng"/>
<bpmn2:incoming>sequenceFlow_MPlPww</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_aH0vCQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_ShuXXA</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:task id="task_NohgrQ" imixs:processid="1700" name="Inactiv">
<bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Adresse:</strong><br />
<itemvalue>partner.name</itemvalue><br />
<itemvalue>partner.address</itemvalue><br />
<itemvalue>partner.zip</itemvalue> <itemvalue>partner.city</itemvalue><br />
<br />
<strong>BPID:</strong> <itemvalue>partner.id</itemvalue><br />
<strong>Kreditoren-Nr.:</strong> <itemvalue>cdtr.number</itemvalue><br />
<strong>Debitoren-Nr.:</strong> <itemvalue>dbtr.number</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:string">
<imixs:value><![CDATA[true]]></imixs:value>
</imixs:item>
<imixs:item name="namownershipnames" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[process.team]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_RI2Ing"/>
<bpmn2:incoming>sequenceFlow_9atLFA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_8O1EtQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_aH0vCQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_neSsFQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_zd6RWA</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_rNZ3tw</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sequenceFlow id="sequenceFlow_MPlPww" sourceRef="event_VM0fEQ" targetRef="gateway_s0J53g">
<bpmn2:documentation id="documentation_saZUSw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_aH0vCQ" sourceRef="gateway_s0J53g" targetRef="task_NohgrQ">
<bpmn2:documentation id="documentation_0fUXrw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_ShuXXA" sourceRef="gateway_s0J53g" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_mhSkeg"/>
<bpmn2:conditionExpression id="formalExpression_oEZj1g" xsi:type="bpmn2:tFormalExpression"><![CDATA[true;]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_neSsFQ" sourceRef="task_NohgrQ" targetRef="event_Tr0aug">
<bpmn2:documentation id="documentation_X3IiUg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_AMs05g" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_CKfjew"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_QoDe7w"/>
<bpmn2:outgoing>sequenceFlow_5pT4Tw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:intermediateThrowEvent id="event_feLZFQ" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_ns8CKQ"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_ici5wA"/>
<bpmn2:incoming>sequenceFlow_8BTEtw</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_5pT4Tw" sourceRef="event_AMs05g" targetRef="event_1OVorA">
<bpmn2:documentation id="documentation_mQfndA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_8BTEtw" sourceRef="gateway_uK0c6g" targetRef="event_feLZFQ">
<bpmn2:documentation id="documentation_aB5qHw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateThrowEvent id="event_GTXFMw" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_a8NiKA"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_YUfA0A"/>
<bpmn2:incoming>sequenceFlow_03b60w</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_03b60w" sourceRef="task_Q80A1Q" targetRef="event_GTXFMw">
<bpmn2:documentation id="documentation_i02Wsw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateThrowEvent id="event_u8OBFg" name="[IBAN-ERROR]">
<bpmn2:documentation id="documentation_0rGDzg"/>
<bpmn2:linkEventDefinition id="linkEventDefinition_8g6AoA"/>
<bpmn2:incoming>sequenceFlow_zd6RWA</bpmn2:incoming>
</bpmn2:intermediateThrowEvent>
<bpmn2:sequenceFlow id="sequenceFlow_zd6RWA" sourceRef="task_NohgrQ" targetRef="event_u8OBFg">
<bpmn2:documentation id="documentation_ez15rg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_rNZ3tw" sourceRef="task_NohgrQ" targetRef="event_VM0fEQ">
<bpmn2:documentation id="documentation_AHyEzA"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_1">
<bpmndi:BPMNShape bpmnElement="event_WmkBvw" id="BPMNShape_heefeQ">
<dc:Bounds height="36.0" width="36.0" x="57.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_6qfN6w">
<dc:Bounds height="20.0" width="100.0" x="25.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_1clvlg" id="BPMNShape_85k4rg">
<dc:Bounds height="36.0" width="36.0" x="1657.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_F7t2Ng">
<dc:Bounds height="20.0" width="100.0" x="1625.0" y="259.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_ToMZaQ" id="BPMNShape_CUpR6w">
<dc:Bounds height="50.0" width="110.0" x="170.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="participant_oxb3dg" id="BPMNShape_mqlDUA">
<dc:Bounds height="820.0" width="1820.0" x="-30.0" y="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_Zxa2TA" id="BPMNShape_Lane_1cDN5A">
<dc:Bounds height="820.0" width="1790.0" x="0.0" y="40.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_25otUg" id="BPMNEdge_NHnc3g" sourceElement="BPMNShape_heefeQ" targetElement="BPMNShape_CUpR6w">
<di:waypoint x="93.0" y="295.0"/>
<di:waypoint x="170.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_Q80A1Q" id="BPMNShape_7JA0nw">
<dc:Bounds height="50.0" width="110.0" x="660.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_B8Pi7A" id="BPMNShape_ghujeA">
<dc:Bounds height="50.0" width="110.0" x="1360.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_aSdkwg" id="BPMNShape_uesqgg">
<dc:Bounds height="36.0" width="36.0" x="437.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_AxKRKQ">
<dc:Bounds height="20.0" width="100.0" x="405.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_S9LVXg" id="BPMNEdge_xoCSiA" sourceElement="BPMNShape_CUpR6w" targetElement="BPMNShape_6IZk7Q">
<di:waypoint x="280.0" y="295.0"/>
<di:waypoint x="340.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_Tr0aug" id="BPMNShape_NEaJjA">
<dc:Bounds height="36.0" width="36.0" x="1227.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_GkrCTA">
<dc:Bounds height="20.0" width="100.0" x="1195.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_1mXO8A" id="BPMNEdge_7CorJA" sourceElement="BPMNShape_NEaJjA" targetElement="BPMNShape_ghujeA">
<di:waypoint x="1263.0" y="295.0"/>
<di:waypoint x="1360.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rwdWxw" id="BPMNEdge_t88dUw" sourceElement="BPMNShape_ghujeA" targetElement="BPMNShape_85k4rg">
<di:waypoint x="1470.0" y="295.0"/>
<di:waypoint x="1657.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_UQIXAQ" id="BPMNShape_Mnop9Q">
<dc:Bounds height="50.0" width="35.0" x="560.0" y="380.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_h0UuFw">
<dc:Bounds height="20.0" width="100.0" x="527.5" y="435.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_vwH0cA" id="BPMNShape_OXGg8Q">
<dc:Bounds height="36.0" width="36.0" x="747.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_KaHfJQ">
<dc:Bounds height="20.0" width="100.0" x="715.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_avahXg" id="BPMNEdge_odMtvQ" sourceElement="BPMNShape_OXGg8Q" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="747.0" y="196.0"/>
<di:waypoint x="725.0" y="196.0"/>
<di:waypoint x="725.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_uvV8uA" id="BPMNEdge_3Mtxfw" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_7JA0nw"/>
<bpmndi:BPMNEdge bpmnElement="association_mpLQEQ" id="BPMNEdge_qkEiPA" sourceElement="BPMNShape_Mnop9Q" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="588.0" y="380.0"/>
<di:waypoint x="588.0" y="357.0"/>
<di:waypoint x="680.0" y="357.0"/>
<di:waypoint x="680.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="textAnnotation_LyGTCw" id="BPMNShape_SbxnGw">
<dc:Bounds height="85.0" width="228.0" x="80.0" y="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_83sZPw" id="BPMNEdge_p0XWxg" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_SbxnGw"/>
<bpmndi:BPMNShape bpmnElement="event_TuyuwQ" id="BPMNShape_fTy7mg">
<dc:Bounds height="36.0" width="36.0" x="617.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_033n1A">
<dc:Bounds height="20.0" width="100.0" x="585.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9atLFA" id="BPMNEdge_BC4pwQ" sourceElement="BPMNShape_fTy7mg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="653.0" y="196.0"/>
<di:waypoint x="700.0" y="196.0"/>
<di:waypoint x="700.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_h0Kk5g" id="BPMNShape_T4k09g">
<dc:Bounds height="36.0" width="36.0" x="1327.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_lX0KlA">
<dc:Bounds height="20.0" width="100.0" x="1295.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_gC0I9w" id="BPMNEdge_0nCVvg" sourceElement="BPMNShape_T4k09g" targetElement="BPMNShape_ghujeA">
<di:waypoint x="1360.0" y="185.0"/>
<di:waypoint x="1390.0" y="185.0"/>
<di:waypoint x="1390.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_delO7Q" id="BPMNShape_rEOMWA">
<dc:Bounds height="50.0" width="110.0" x="660.0" y="510.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_1OVorA" id="BPMNShape_mG4csA">
<dc:Bounds height="36.0" width="36.0" x="557.0" y="517.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_djIb8w">
<dc:Bounds height="20.0" width="100.0" x="528.0" y="559.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_baWU4w" id="BPMNShape_755HGg">
<dc:Bounds height="36.0" width="36.0" x="697.0" y="407.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_oN6XKQ">
<dc:Bounds height="20.0" width="100.0" x="665.0" y="446.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_pvIENQ" id="BPMNEdge_wXz5yA" sourceElement="BPMNShape_rEOMWA" targetElement="BPMNShape_755HGg">
<di:waypoint x="715.0" y="510.0"/>
<di:waypoint x="715.0" y="443.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_b4BcVA" id="BPMNEdge_1gQ5Nw" sourceElement="BPMNShape_755HGg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="715.0" y="407.0"/>
<di:waypoint x="715.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_ofjVfg" id="BPMNShape_hDVKtg">
<dc:Bounds height="36.0" width="36.0" x="617.0" y="607.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_HpXNFQ">
<dc:Bounds height="20.0" width="100.0" x="585.0" y="646.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_BWOtzA" id="BPMNEdge_KW5PhQ" sourceElement="BPMNShape_hDVKtg" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="651.0" y="616.0"/>
<di:waypoint x="685.0" y="616.0"/>
<di:waypoint x="685.0" y="560.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_i7yQVw" id="BPMNShape_KxnRjA">
<dc:Bounds height="36.0" width="36.0" x="747.0" y="607.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_sJqwmA">
<dc:Bounds height="20.0" width="100.0" x="715.0" y="646.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ofWWuw" id="BPMNEdge_zlNOzQ" sourceElement="BPMNShape_KxnRjA" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="749.0" y="616.0"/>
<di:waypoint x="735.0" y="616.0"/>
<di:waypoint x="735.0" y="560.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_b0Bj3Q" id="BPMNEdge_CDn41A" sourceElement="BPMNShape_rEOMWA" targetElement="BPMNShape_NEaJjA">
<di:waypoint x="770.0" y="540.0"/>
<di:waypoint x="1240.0" y="540.0"/>
<di:waypoint x="1240.0" y="312.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_T5L9aQ" id="BPMNEdge_dAQH1Q" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_FKXJtw">
<di:waypoint x="770.0" y="295.0"/>
<di:waypoint x="837.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_uK0c6g" id="BPMNShape_6IZk7Q">
<dc:Bounds height="50.0" width="50.0" x="340.0" y="270.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_JvBA0w">
<dc:Bounds height="20.0" width="100.0" x="315.0" y="323.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_jAU3VA" id="BPMNEdge_2qLI2g" sourceElement="BPMNShape_6IZk7Q" targetElement="BPMNShape_uesqgg">
<di:waypoint x="390.0" y="295.0"/>
<di:waypoint x="437.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_BHsRkQ" id="BPMNEdge_1LX47g" sourceElement="BPMNShape_mG4csA" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="593.0" y="535.0"/>
<di:waypoint x="660.0" y="535.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_WgLbbg" id="BPMNEdge_Btz9CA" sourceElement="BPMNShape_Mnop9Q" targetElement="BPMNShape_rEOMWA">
<di:waypoint x="575.0" y="430.0"/>
<di:waypoint x="575.0" y="471.0"/>
<di:waypoint x="675.0" y="471.0"/>
<di:waypoint x="675.0" y="510.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8O1EtQ" id="BPMNEdge_JxSLfA" sourceElement="BPMNShape_uesqgg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="473.0" y="295.0"/>
<di:waypoint x="660.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_6250fg" id="BPMNShape_v5Xzvg">
<dc:Bounds height="36.0" width="36.0" x="1457.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_IBnUDA">
<dc:Bounds height="20.0" width="100.0" x="1425.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_kS2fMA" id="BPMNEdge_i80XvQ" sourceElement="BPMNShape_v5Xzvg" targetElement="BPMNShape_ghujeA">
<di:waypoint x="1458.0" y="190.0"/>
<di:waypoint x="1435.0" y="190.0"/>
<di:waypoint x="1435.0" y="270.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_VM0fEQ" id="BPMNShape_FKXJtw">
<dc:Bounds height="36.0" width="36.0" x="837.0" y="277.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_CAiT2Q">
<dc:Bounds height="20.0" width="100.0" x="805.0" y="316.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_s0J53g" id="BPMNShape_gklxXQ">
<dc:Bounds height="50.0" width="50.0" x="930.0" y="270.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_I4jC0g">
<dc:Bounds height="20.0" width="100.0" x="905.0" y="323.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="task_NohgrQ" id="BPMNShape_VljsIw">
<dc:Bounds height="50.0" width="110.0" x="1060.0" y="270.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_MPlPww" id="BPMNEdge_rt2H3g" sourceElement="BPMNShape_FKXJtw" targetElement="BPMNShape_gklxXQ">
<di:waypoint x="873.0" y="295.0"/>
<di:waypoint x="930.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_aH0vCQ" id="BPMNEdge_YMnxQQ" sourceElement="BPMNShape_gklxXQ" targetElement="BPMNShape_VljsIw">
<di:waypoint x="980.0" y="295.0"/>
<di:waypoint x="1060.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ShuXXA" id="BPMNEdge_DY4O8Q" sourceElement="BPMNShape_gklxXQ" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="956.0" y="319.0"/>
<di:waypoint x="956.0" y="364.0"/>
<di:waypoint x="746.0" y="364.0"/>
<di:waypoint x="746.0" y="320.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_neSsFQ" id="BPMNEdge_b7C0wQ" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_NEaJjA">
<di:waypoint x="1170.0" y="295.0"/>
<di:waypoint x="1227.0" y="295.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_AMs05g" id="BPMNShape_rS0hsw">
<dc:Bounds height="36.0" width="36.0" x="477.0" y="517.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_XcN2Og">
<dc:Bounds height="20.0" width="100.0" x="445.0" y="556.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_feLZFQ" id="BPMNShape_uklBfA">
<dc:Bounds height="36.0" width="36.0" x="347.0" y="367.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_OengAQ">
<dc:Bounds height="20.0" width="100.0" x="315.0" y="406.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_5pT4Tw" id="BPMNEdge_LZMXxg" sourceElement="BPMNShape_rS0hsw" targetElement="BPMNShape_mG4csA">
<di:waypoint x="513.0" y="535.0"/>
<di:waypoint x="557.0" y="535.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8BTEtw" id="BPMNEdge_Os7FVw" sourceElement="BPMNShape_6IZk7Q" targetElement="BPMNShape_uklBfA">
<di:waypoint x="365.0" y="320.0"/>
<di:waypoint x="365.0" y="367.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_GTXFMw" id="BPMNShape_5I6iNA">
<dc:Bounds height="36.0" width="36.0" x="847.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_80daBg">
<dc:Bounds height="20.0" width="100.0" x="815.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_03b60w" id="BPMNEdge_ehQBOQ" sourceElement="BPMNShape_7JA0nw" targetElement="BPMNShape_5I6iNA">
<di:waypoint x="770.0" y="294.0"/>
<di:waypoint x="809.0" y="294.0"/>
<di:waypoint x="809.0" y="195.0"/>
<di:waypoint x="847.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_u8OBFg" id="BPMNShape_Kp730Q">
<dc:Bounds height="36.0" width="36.0" x="1137.0" y="177.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_iUQ02A">
<dc:Bounds height="20.0" width="100.0" x="1105.0" y="216.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_zd6RWA" id="BPMNEdge_6qKC4A" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_Kp730Q">
<di:waypoint x="1114.0" y="270.0"/>
<di:waypoint x="1114.0" y="195.0"/>
<di:waypoint x="1137.0" y="195.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rNZ3tw" id="BPMNEdge_zrajzA" sourceElement="BPMNShape_VljsIw" targetElement="BPMNShape_FKXJtw">
<di:waypoint x="1080.0" y="270.0"/>
<di:waypoint x="1080.0" y="237.0"/>
<di:waypoint x="855.0" y="237.0"/>
<di:waypoint x="855.0" y="277.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

View file

@ -1291,7 +1291,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
@ -1404,7 +1404,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -96,7 +96,7 @@ th { font-weight: bold;}
</bpmn2:participant>
<bpmn2:participant id="participant_LQyVcg" name="Default Process" processRef="process_2"/>
</bpmn2:collaboration>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Rechnungsausgang">
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Rechnungsausgang" processType="Private">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Buchhaltung">
<bpmn2:flowNodeRef>Task_2</bpmn2:flowNodeRef>
@ -3638,8 +3638,8 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_59" id="BPMNEdge_SequenceFlow_60" sourceElement="BPMNShape_IntermediateCatchEvent_30" targetElement="BPMNShape_Task_4">
<bpmndi:BPMNLabel id="BPMNLabel_133"/>
<di:waypoint x="1295.0" y="1117.0"/>
<di:waypoint x="1295.0" y="1093.5"/>
<di:waypoint x="1265.0" y="1093.5"/>
<di:waypoint x="1295.0" y="1094.0"/>
<di:waypoint x="1265.0" y="1094.0"/>
<di:waypoint x="1265.0" y="1070.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_3" id="BPMNEdge_SequenceFlow_4" sourceElement="BPMNShape_IntermediateCatchEvent_9" targetElement="BPMNShape_Task_6">
@ -3652,8 +3652,8 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_27" id="BPMNEdge_SequenceFlow_28" sourceElement="BPMNShape_IntermediateCatchEvent_2" targetElement="BPMNShape_Task_3">
<bpmndi:BPMNLabel id="BPMNLabel_42"/>
<di:waypoint x="325.0" y="513.0"/>
<di:waypoint x="325.0" y="616.5"/>
<di:waypoint x="355.0" y="616.5"/>
<di:waypoint x="325.0" y="617.0"/>
<di:waypoint x="355.0" y="617.0"/>
<di:waypoint x="355.0" y="720.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_Task_3" targetElement="BPMNShape_ExclusiveGateway_3">
@ -3691,13 +3691,13 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNLabel id="BPMNLabel_89"/>
<di:waypoint x="493.0" y="1068.0"/>
<di:waypoint x="493.0" y="1124.0"/>
<di:waypoint x="557.0277992443886" y="1124.0"/>
<di:waypoint x="557.0" y="1124.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_7" id="BPMNEdge_SequenceFlow_8" sourceElement="BPMNShape_EventBasedGateway_4" targetElement="BPMNShape_IntermediateThrowEvent_4">
<bpmndi:BPMNLabel id="BPMNLabel_12"/>
<di:waypoint x="913.0" y="1022.0"/>
<di:waypoint x="913.0" y="956.0"/>
<di:waypoint x="987.0277992443886" y="956.0"/>
<di:waypoint x="987.0" y="956.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_8" id="BPMNEdge_SequenceFlow_9" sourceElement="BPMNShape_IntermediateCatchEvent_21" targetElement="BPMNShape_ExclusiveGateway_5">
<bpmndi:BPMNLabel id="BPMNLabel_15"/>
@ -3727,7 +3727,7 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_14" id="BPMNEdge_SequenceFlow_15" sourceElement="BPMNShape_IntermediateCatchEvent_5" targetElement="BPMNShape_Task_5">
<bpmndi:BPMNLabel id="BPMNLabel_29"/>
<di:waypoint x="1449.0" y="197.45007122521577"/>
<di:waypoint x="1449.0" y="197.0"/>
<di:waypoint x="1449.0" y="167.0"/>
<di:waypoint x="361.0" y="167.0"/>
<di:waypoint x="361.0" y="280.0"/>
@ -3736,13 +3736,13 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNLabel id="BPMNLabel_37"/>
<di:waypoint x="1199.0" y="295.0"/>
<di:waypoint x="1269.0" y="295.0"/>
<di:waypoint x="1269.0" y="232.54992877478423"/>
<di:waypoint x="1269.0" y="233.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_16" id="BPMNEdge_SequenceFlow_17" sourceElement="BPMNShape_EventBasedGateway_5" targetElement="BPMNShape_IntermediateThrowEvent_7">
<bpmndi:BPMNLabel id="BPMNLabel_40"/>
<di:waypoint x="1403.0" y="1068.0"/>
<di:waypoint x="1403.0" y="1124.0"/>
<di:waypoint x="1477.0277992443885" y="1124.0"/>
<di:waypoint x="1477.0" y="1124.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_17" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_EventBasedGateway_1" targetElement="BPMNShape_IntermediateThrowEvent_8">
<bpmndi:BPMNLabel id="BPMNLabel_45"/>
@ -3761,14 +3761,14 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNLabel id="BPMNLabel_52"/>
<di:waypoint x="496.0" y="769.0"/>
<di:waypoint x="496.0" y="813.0"/>
<di:waypoint x="557.1114561800017" y="813.0"/>
<di:waypoint x="557.0" y="813.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_34" id="BPMNEdge_SequenceFlow_35" sourceElement="BPMNShape_Task_3" targetElement="BPMNShape_IntermediateCatchEvent_3">
<bpmndi:BPMNLabel id="BPMNLabel_79"/>
<di:waypoint x="380.0" y="720.0"/>
<di:waypoint x="380.0" y="561.0"/>
<di:waypoint x="411.0" y="561.0"/>
<di:waypoint x="411.0" y="512.5499287747842"/>
<di:waypoint x="411.0" y="513.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_4" id="BPMNEdge_SequenceFlow_5" sourceElement="BPMNShape_IntermediateCatchEvent_1" targetElement="BPMNShape_Task_3">
<bpmndi:BPMNLabel id="BPMNLabel_19"/>
@ -3782,7 +3782,7 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_36" id="BPMNEdge_SequenceFlow_37" sourceElement="BPMNShape_IntermediateCatchEvent_8" targetElement="BPMNShape_Task_2">
<bpmndi:BPMNLabel id="BPMNLabel_99"/>
<di:waypoint x="357.0" y="922.8885438199983"/>
<di:waypoint x="357.0" y="923.0"/>
<di:waypoint x="357.0" y="973.0"/>
<di:waypoint x="338.0" y="973.0"/>
<di:waypoint x="338.0" y="1020.0"/>
@ -3792,7 +3792,7 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<di:waypoint x="310.0" y="316.0"/>
<di:waypoint x="290.0" y="316.0"/>
<di:waypoint x="290.0" y="906.0"/>
<di:waypoint x="337.0277992443886" y="906.0"/>
<di:waypoint x="337.0" y="906.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_41" id="BPMNEdge_SequenceFlow_42" sourceElement="BPMNShape_IntermediateCatchEvent_10" targetElement="BPMNShape_jIp3FQ">
<bpmndi:BPMNLabel id="BPMNLabel_102"/>
@ -3807,8 +3807,8 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_44" id="BPMNEdge_SequenceFlow_45" sourceElement="BPMNShape_IntermediateCatchEvent_24" targetElement="BPMNShape_Task_4">
<bpmndi:BPMNLabel id="BPMNLabel_119"/>
<di:waypoint x="1235.0" y="1117.0"/>
<di:waypoint x="1235.0" y="1093.5"/>
<di:waypoint x="1265.0" y="1093.5"/>
<di:waypoint x="1235.0" y="1094.0"/>
<di:waypoint x="1265.0" y="1094.0"/>
<di:waypoint x="1265.0" y="1070.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_49" id="BPMNEdge_SequenceFlow_50" sourceElement="BPMNShape_IntermediateCatchEvent_25" targetElement="BPMNShape_Task_7">
@ -3865,13 +3865,13 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<bpmndi:BPMNLabel id="BPMNLabel_144"/>
<di:waypoint x="913.0" y="1068.0"/>
<di:waypoint x="913.0" y="1143.0"/>
<di:waypoint x="987.1114561800017" y="1143.0"/>
<di:waypoint x="987.0" y="1143.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_63" id="BPMNEdge_SequenceFlow_64" sourceElement="BPMNShape_EventBasedGateway_3" targetElement="BPMNShape_IntermediateThrowEvent_6">
<bpmndi:BPMNLabel id="BPMNLabel_146"/>
<di:waypoint x="493.0" y="1022.0"/>
<di:waypoint x="493.0" y="956.0"/>
<di:waypoint x="557.0277992443886" y="956.0"/>
<di:waypoint x="557.0" y="956.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_64" id="BPMNEdge_SequenceFlow_65" sourceElement="BPMNShape_ExclusiveGateway_3" targetElement="BPMNShape_IntermediateThrowEvent_10">
<bpmndi:BPMNLabel id="BPMNLabel_148"/>
@ -3942,7 +3942,7 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
<di:waypoint x="315.0" y="1107.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_U0JMVg" id="BPMNEdge_oElXIg" sourceElement="BPMNShape_IntermediateCatchEvent_20" targetElement="BPMNShape_jIp3FQ">
<di:waypoint x="320.0" y="1142.2916164657906"/>
<di:waypoint x="320.0" y="1142.0"/>
<di:waypoint x="320.0" y="1162.0"/>
<di:waypoint x="357.0" y="1162.0"/>
<di:waypoint x="357.0" y="1180.0"/>
@ -3968,20 +3968,20 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_1KoKlw" id="BPMNEdge_JCvINA" sourceElement="BPMNShape_Task_6" targetElement="BPMNShape_IntermediateCatchEvent_22">
<di:waypoint x="755.0" y="1070.0"/>
<di:waypoint x="755.0" y="1088.5"/>
<di:waypoint x="725.0" y="1088.5"/>
<di:waypoint x="755.0" y="1089.0"/>
<di:waypoint x="725.0" y="1089.0"/>
<di:waypoint x="725.0" y="1107.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_KaO3rw" id="BPMNEdge_A0N2qQ" sourceElement="BPMNShape_IntermediateCatchEvent_22" targetElement="BPMNShape_6vBldQ">
<di:waypoint x="725.0" y="1143.0"/>
<di:waypoint x="725.0" y="1161.5"/>
<di:waypoint x="775.0" y="1161.5"/>
<di:waypoint x="725.0" y="1162.0"/>
<di:waypoint x="775.0" y="1162.0"/>
<di:waypoint x="775.0" y="1180.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_i1zqtw" id="BPMNEdge_L0wc5A" sourceElement="BPMNShape_6vBldQ" targetElement="BPMNShape_EventBasedGateway_4">
<di:waypoint x="830.0" y="1208.0"/>
<di:waypoint x="858.5" y="1208.0"/>
<di:waypoint x="858.5" y="1056.0"/>
<di:waypoint x="859.0" y="1208.0"/>
<di:waypoint x="859.0" y="1056.0"/>
<di:waypoint x="901.0" y="1056.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_OzrjzA" id="BPMNShape_61TxRg">
@ -4105,8 +4105,8 @@ if (workitem.getItemValueString('txtcomment') == '' ) {
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_KEAm0Q" id="BPMNEdge_vzAhLw" sourceElement="BPMNShape_DuKxMA" targetElement="BPMNShape_Task_3">
<di:waypoint x="405.0" y="807.0"/>
<di:waypoint x="405.0" y="788.5"/>
<di:waypoint x="355.0" y="788.5"/>
<di:waypoint x="405.0" y="789.0"/>
<di:waypoint x="355.0" y="789.0"/>
<di:waypoint x="355.0" y="770.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>

File diff suppressed because it is too large Load diff

View file

@ -54,10 +54,10 @@
</bpmn2:participant>
<bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/>
</bpmn2:collaboration>
<bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="SEPA-Export">
<bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="SEPA-Export" processType="Public">
<bpmn2:documentation id="documentation_FFzgqw"/>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="SEPA-Export">
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="SEPA-Export" processType="Private">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Buchhaltung">
<bpmn2:flowNodeRef>IntermediateCatchEvent_6</bpmn2:flowNodeRef>
@ -800,7 +800,7 @@ result.isValid=true;
<bpmn2:sequenceFlow id="sequenceFlow_nyv4vw" sourceRef="gateway_WuKeqQ" targetRef="IntermediateCatchEvent_7">
<bpmn2:documentation id="documentation_RRr33A"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_y4hmYg" imixs:activityid="90" name="[automatic 15min]">
<bpmn2:intermediateCatchEvent id="event_y4hmYg" imixs:activityid="90" name="[automatic 1min]">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
@ -859,7 +859,7 @@ result.isValid=true;
<imixs:value><![CDATA[3]]></imixs:value>
</imixs:item>
<imixs:item name="numactivitydelay" type="xs:string">
<imixs:value><![CDATA[15]]></imixs:value>
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keyactivitydelayunit" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
@ -1012,7 +1012,7 @@ result.isValid=true;
<bpmndi:BPMNShape bpmnElement="ExclusiveGateway_1" id="BPMNShape_ExclusiveGateway_1" isMarkerVisible="true">
<dc:Bounds height="50.0" width="50.0" x="720.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_34" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="690.0" y="450.0"/>
<dc:Bounds height="20.0" width="100.0" x="695.0" y="463.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="TextAnnotation_2" id="BPMNShape_TextAnnotation_2">
@ -1073,7 +1073,7 @@ result.isValid=true;
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_7" id="BPMNEdge_SequenceFlow_7" sourceElement="BPMNShape_IntermediateCatchEvent_1" targetElement="BPMNShape_Task_7">
<bpmndi:BPMNLabel id="BPMNLabel_18"/>
<di:waypoint x="572.0" y="498.416876048223"/>
<di:waypoint x="572.0" y="498.0"/>
<di:waypoint x="572.0" y="479.0"/>
<di:waypoint x="617.0" y="479.0"/>
<di:waypoint x="617.0" y="460.0"/>
@ -1106,7 +1106,7 @@ result.isValid=true;
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_8" id="BPMNEdge_SequenceFlow_8" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_7">
<bpmndi:BPMNLabel id="BPMNLabel_22"/>
<di:waypoint x="670.0" y="497.7083835342094"/>
<di:waypoint x="670.0" y="498.0"/>
<di:waypoint x="670.0" y="479.0"/>
<di:waypoint x="617.0" y="479.0"/>
<di:waypoint x="617.0" y="460.0"/>
@ -1140,9 +1140,9 @@ result.isValid=true;
<bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_TextAnnotation_3" targetElement="BPMNShape_IntermediateCatchEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_11"/>
<di:waypoint x="932.0" y="304.0"/>
<di:waypoint x="932.0" y="363.5"/>
<di:waypoint x="845.0" y="363.5"/>
<di:waypoint x="845.0" y="417.25176065070116"/>
<di:waypoint x="932.0" y="364.0"/>
<di:waypoint x="845.0" y="364.0"/>
<di:waypoint x="845.0" y="417.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_11" id="BPMNEdge_SequenceFlow_11" sourceElement="BPMNShape_IntermediateCatchEvent_4" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_17"/>
@ -1158,21 +1158,21 @@ result.isValid=true;
<dc:Bounds height="50.0" width="175.0" x="1200.0" y="250.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_bYlYaQ" id="BPMNEdge_yt4O0Q" sourceElement="BPMNShape_60CxWw" targetElement="BPMNShape_IntermediateCatchEvent_18">
<di:waypoint x="1287.5" y="300.0"/>
<di:waypoint x="1287.5" y="358.5"/>
<di:waypoint x="1235.0" y="358.5"/>
<di:waypoint x="1288.0" y="300.0"/>
<di:waypoint x="1288.0" y="359.0"/>
<di:waypoint x="1235.0" y="359.0"/>
<di:waypoint x="1235.0" y="417.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_WuKeqQ" id="BPMNShape_AIK9sA">
<dc:Bounds height="50.0" width="50.0" x="1080.0" y="540.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_sirngw">
<dc:Bounds height="20.0" width="100.0" x="1052.0" y="590.0"/>
<dc:Bounds height="20.0" width="100.0" x="1055.0" y="593.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_6FAj9g" id="BPMNShape_Lgiawg">
<dc:Bounds height="50.0" width="50.0" x="1080.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_he95hQ">
<dc:Bounds height="20.0" width="100.0" x="1050.0" y="464.0"/>
<dc:Bounds height="20.0" width="100.0" x="1055.0" y="463.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rhKXDQ" id="BPMNEdge_14t8lw" sourceElement="BPMNShape_Lgiawg" targetElement="BPMNShape_IntermediateCatchEvent_18">
@ -1188,19 +1188,19 @@ result.isValid=true;
<di:waypoint x="1217.0" y="565.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_y4hmYg" id="BPMNShape_BtOh7A">
<dc:Bounds height="36.0" width="36.0" x="727.0" y="327.0"/>
<dc:Bounds height="36.0" width="36.0" x="727.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_a0n0xA">
<dc:Bounds height="20.0" width="100.0" x="697.0" y="364.0"/>
<dc:Bounds height="20.0" width="100.0" x="698.0" y="287.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0QFTlw" id="BPMNEdge_iWGl5g" sourceElement="BPMNShape_ExclusiveGateway_1" targetElement="BPMNShape_BtOh7A">
<di:waypoint x="745.0" y="410.0"/>
<di:waypoint x="745.0" y="363.0"/>
<di:waypoint x="745.0" y="353.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ePZrvQ" id="BPMNEdge_hQ0KPA" sourceElement="BPMNShape_BtOh7A" targetElement="BPMNShape_IntermediateCatchEvent_2">
<di:waypoint x="763.0" y="345.0"/>
<di:waypoint x="836.0" y="345.0"/>
<di:waypoint x="836.0" y="421.58359213500125"/>
<di:waypoint x="760.0" y="345.0"/>
<di:waypoint x="835.0" y="345.0"/>
<di:waypoint x="835.0" y="423.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_MJWNtQ" id="BPMNEdge_0VTopA" sourceElement="BPMNShape_TextAnnotation_1" targetElement="BPMNShape_IntermediateCatchEvent_1">
<di:waypoint x="505.0" y="525.0"/>