agl Analyse Steuerbescheide

This commit is contained in:
Ralph Soika 2024-09-14 14:01:20 +02:00
parent abfb0704e0
commit b3d0efad64
7 changed files with 1025 additions and 0 deletions

View file

@ -0,0 +1,245 @@
package com.alexanderlogistics;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.QueryException;
import jakarta.enterprise.context.RequestScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.json.Json;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonObjectBuilder;
/**
* Der AGLAnalyticController berechnet verschiedene Analyse Daten
*
* @author rsoika
*
*/
@Named
@RequestScoped
public class AGLAnalyticController implements Serializable {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(AnalyticController.class.getName());
@Inject
protected DocumentService documentService;
@Inject
protected DebitorStatistikController debitorStatistikController;
List<ItemCollection> steuerbescheide = null;
public void onEvent(@Observes AnalyticEvent event) {
if ("analytic.steuer.eust".equals(event.getKey())) {
event.setValue(computeSteuerbescheideEUST());
event.setLabel("EUR");
event.setDescription("Gesamt Einfuhrumsatzsteuer (EUSt)");
event.getWorkitem().setItemValue("eust.total", event.getValue());
}
if ("analytic.steuer.zoll".equals(event.getKey())) {
event.setValue(computeSteuerbescheideZoll());
event.setLabel("EUR");
event.setDescription("Gesamt Zölle (ZOLLEU)");
}
if ("analytic.steuer.due".equals(event.getKey())) {
event.setValue(computeSteuerbescheideUeberfaellig());
event.setLabel("EUR");
event.setDescription("Überfällige Steuerbescheide die noch nicht abgerechnet wurden.");
}
if ("analytic.steuer.trend".equals(event.getKey())) {
event.setValue(computeSteuerbescheideByWeek());
event.setLabel("Zoll & EUST");
event.setDescription("Fälligkeiten nach KW");
}
}
/**
* Berechnet die Summe aller offenen EUST Beträge
* // tax.code=[0], amount=[3885.16], activity.type=[EUST],
* // filenumber=[LA-PAP-2408-024]}
*
* @return
*/
private double computeSteuerbescheideEUST() {
logger.info("compute EUST...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
List<ItemCollection> positionsTabelle = InvoiceUtil.explodeChildList(steuerItemCol);
for (ItemCollection pos : positionsTabelle) {
if ("EUST".equalsIgnoreCase(pos.getItemValueString("activity.type"))) {
result = result + pos.getItemValueDouble("amount");
}
}
}
return InvoiceUtil.round(result);
}
/**
* Berechnet die Summe aller überfälligen steuer Beträge $taskID=1200
*
* @return
*/
private double computeSteuerbescheideUeberfaellig() {
logger.info("compute EUST...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
if (steuerItemCol.getTaskID() == 1200) {
result = result + steuerItemCol.getItemValueDouble("invoice.saldo");
}
}
return InvoiceUtil.round(result);
}
/**
* Berechnet die Summe aller offenen Zoll Beträge
*
* @return
*/
private double computeSteuerbescheideZoll() {
logger.info("compute Zoll...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
List<ItemCollection> positionsTabelle = InvoiceUtil.explodeChildList(steuerItemCol);
for (ItemCollection pos : positionsTabelle) {
if ("ZOLL".equalsIgnoreCase(pos.getItemValueString("activity.type"))) {
result = result + pos.getItemValueDouble("amount");
}
}
}
return InvoiceUtil.round(result);
}
private List<ItemCollection> getSteuerbescheide() {
if (steuerbescheide != null) {
return steuerbescheide;
}
// compute steuerbescheide....
logger.info("Load Steuerbescheide for analytics....");
String query = "(type:workitem ) AND ($workflowgroup:\"Steuerbescheid\")";
try {
steuerbescheide = documentService.find(query, 999, 0, "$created", false);
return steuerbescheide;
} catch (QueryException e) {
logger.severe("Failed to get invoices: " + e.getMessage());
}
return null;
}
/**
* Berechnet Chart daten aller Steuerbescheide bei KW
*
* <pre>
*
chartCfg = {
type: 'bar',
data: {
datasets: [{
data: [20, 10],
}],
labels: ['1', '2']
}
}
*
* </pre>
*
* @return
*/
private String computeSteuerbescheideByWeek() {
logger.info("compute steuer by kw...");
List<ItemCollection> list = getSteuerbescheide();
Map<Integer, Double> saldoByWeek = new HashMap<>();
// SimpleDateFormat weekFormat = new SimpleDateFormat("w"); // 'w' gives the
// week number
// SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); // 'yyyy' for the
// year
Calendar calendar = Calendar.getInstance();
int earliestWeek = Integer.MAX_VALUE;
int latestWeek = Integer.MIN_VALUE;
// Step 1: Group saldo by week
for (ItemCollection steuerItemCol : list) {
double saldo = steuerItemCol.getItemValueDouble("invoice.saldo");
Date date = steuerItemCol.getItemValueDate("invoice.date");
// Get the week number and year from the date
calendar.setTime(date);
int weekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
int year = calendar.get(Calendar.YEAR);
int yearWeek = year * 100 + weekNumber; // Unique key for each year + week combination
// Accumulate the saldo per week
saldoByWeek.put(yearWeek, saldoByWeek.getOrDefault(yearWeek, 0.0) + saldo);
// Track the earliest and latest weeks
earliestWeek = Math.min(earliestWeek, yearWeek);
latestWeek = Math.max(latestWeek, yearWeek);
}
// Step 2: Prepare the JSON structure and ensure we have all weeks from earliest
// to latest
JsonArrayBuilder dataBuilder = Json.createArrayBuilder();
JsonArrayBuilder labelsBuilder = Json.createArrayBuilder();
Calendar startCal = Calendar.getInstance();
startCal.set(Calendar.YEAR, earliestWeek / 100);
startCal.set(Calendar.WEEK_OF_YEAR, earliestWeek % 100);
Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.YEAR, latestWeek / 100);
endCal.set(Calendar.WEEK_OF_YEAR, latestWeek % 100);
while (!startCal.after(endCal)) {
int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR);
int year = startCal.get(Calendar.YEAR);
int yearWeek = year * 100 + weekNumber;
// Add the saldo for the week or 0.0 if no data
dataBuilder.add(saldoByWeek.getOrDefault(yearWeek, 0.0));
labelsBuilder.add(weekNumber + "/" + year); // Label as 'week/year'
// Move to the next week
startCal.add(Calendar.WEEK_OF_YEAR, 1);
}
// Step 3: Prepare the JSON structure
JsonObjectBuilder jsonBuilder = Json.createObjectBuilder()
.add("type", "bar")
.add("data", Json.createObjectBuilder()
.add("datasets", Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("data", dataBuilder)))
.add("labels", labelsBuilder));
// Step 4: Return the JSON structure as a string
JsonObject chartCfg = jsonBuilder.build();
return chartCfg.toString(); // JSON as string
}
}

View file

@ -0,0 +1,121 @@
package com.alexanderlogistics;
import java.io.Serializable;
import java.util.logging.Logger;
import org.imixs.workflow.faces.data.WorkflowController;
import jakarta.enterprise.context.ConversationScoped;
import jakarta.enterprise.event.Event;
import jakarta.inject.Inject;
import jakarta.inject.Named;
/**
* The AnalyticController is a conversationScoped controller that provides
* values for the analytic-custom parts.
* <p>
* A custom implementation can react on AnalyticEvent to compute values and
* datasets.
* <p>
* The controller implements a caching mechanism to avoid repeated calls for new
* analytic values. If the analytic value is already stored in the current
* workitem, no new value will be fired.
*
*
* @author rsoika
*
*/
@Named
@ConversationScoped
public class AnalyticController implements Serializable {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(AnalyticController.class.getName());
@Inject
protected Event<AnalyticEvent> analyticEvents;
@Inject
protected WorkflowController workflowController;
/**
* Returns a analytic value as a String for a given key.
*
* @param key
* @return
*/
public String getAsString(String key) {
computeValue(key);
return workflowController.getWorkitem().getItemValueString("analytic." + key);
}
/**
* Returns a analytic value as a Double for a given key.
*
* @param key
* @return
*/
public double getAsDouble(String key) {
computeValue(key);
return workflowController.getWorkitem().getItemValueDouble("analytic." + key);
}
/**
* Returns the analytic label for a given key
*
* @param key
* @return
*/
public String getLabel(String key) {
computeValue(key);
return workflowController.getWorkitem().getItemValueString("analytic." + key + ".label");
}
/**
* Returns the analytic description for a given key
*
* @param key
* @return
*/
public String getDescription(String key) {
computeValue(key);
return workflowController.getWorkitem().getItemValueString("analytic." + key + ".description");
}
/**
* Computes am analytic value. The method cache the value in the item
* 'analytic.KEY' to avoid feierring repeated AnalyticEvents.
*
* @param key
* @return
*/
protected void computeValue(String key) {
if (workflowController.getWorkitem() != null) {
// try to fetch value from cache
if (!workflowController.getWorkitem().hasItem("analytic." + key)) {
logger.info("fire analytic event for key '" + key + "'");
// Fire the Analytics Event for this key
AnalyticEvent event = new AnalyticEvent(key, workflowController.getWorkitem());
if (analyticEvents != null) {
analyticEvents.fire(event);
workflowController.getWorkitem().setItemValue("analytic." + key, event.getValue());
workflowController.getWorkitem().setItemValue("analytic." + key + ".label", event.getLabel());
workflowController.getWorkitem().setItemValue("analytic." + key + ".description",
event.getDescription());
}
if (event.getValue() == null) {
// set dummy value
workflowController.getWorkitem().setItemValue("analytic." + key, "");
workflowController.getWorkitem().setItemValue("analytic." + key + ".label", "- undefined -");
workflowController.getWorkitem().setItemValue("analytic." + key + ".description",
"No data available");
}
}
} else {
// analytic value is already cached!
}
}
}

View file

@ -0,0 +1,57 @@
package com.alexanderlogistics;
import org.imixs.workflow.ItemCollection;
/**
* An AnalyticEvent is send by the AnalyticController during initialization
*/
public class AnalyticEvent {
private String key;
private Object value = null;
private String label = "";
private String description = "";
private ItemCollection workitem = null;
public AnalyticEvent(String key, ItemCollection workitem) {
this.key = key;
this.workitem = workitem;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public ItemCollection getWorkitem() {
return workitem;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View file

@ -0,0 +1,69 @@
<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">
<!-- Chart Diagramm -->
<style>
.analytic-card {
display: flex;
flex-flow: column;
min-height: 200px;
padding: 20px;
background-color: #f3f3f3;
border-radius: 5px;
-webkit-box-shadow: 0 0 5px 0 rgba(43, 43, 43, .1), 0 11px 6px -7px rgba(43, 43, 43, .1);
box-shadow: 0 0 5px 0 rgba(43, 43, 43, .1), 0 11px 6px -7px rgba(43, 43, 43, .1);
border: none;
-webkit-transition: all .3s ease-in-out;
transition: all .3s ease-in-out;
font-size: 40px;
font-weight: bold;
color: #4398f3;
}
.analytic-card-header {}
.analytic-card-footer {
font-size: 12px;
font-weight: normal;
color: #333;
}
.analytic-card-content {
flex: 1;
font-size: 20px;
}
</style>
<div class="analytic-card">
<div id="container">
<canvas id="analytics_canvas" style="min-width: 600px;height:200px;"></canvas>
</div>
</div>
<script type="text/javascript"
src="#{facesContext.externalContext.requestContextPath}/js/chartjs/chart.min.js?build=#{app.application_build_timestamp}"></script>
<script type="text/javascript">
/*<![CDATA[*/
$(document).ready(
function () {
// update the diagram
var ctx = document.getElementById("analytics_canvas").getContext("2d");
var chartData = #{ analyticController.getAsString(item.name)
};
console.log(chartData);
//jsObject = JSON.parse(chartData);
window.myBar = new Chart(ctx, chartData);
});
/*]]>*/
</script>
</ui:composition>

View file

@ -0,0 +1,53 @@
<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">
<style>
.analytic-card {
display: flex;
flex-flow: column;
min-height: 200px;
padding: 20px;
background-color: #f3f3f3;
border-radius: 5px;
-webkit-box-shadow: 0 0 5px 0 rgba(43, 43, 43, .1), 0 11px 6px -7px rgba(43, 43, 43, .1);
box-shadow: 0 0 5px 0 rgba(43, 43, 43, .1), 0 11px 6px -7px rgba(43, 43, 43, .1);
border: none;
-webkit-transition: all .3s ease-in-out;
transition: all .3s ease-in-out;
font-size: 40px;
font-weight: bold;
color: #4398f3;
}
.analytic-card-header {}
.analytic-card-footer {
font-size: 12px;
font-weight: normal;
color: #333;
}
.analytic-card-content {
flex: 1;
font-size: 20px;
}
</style>
<div class="analytic-card">
<div class="analytic-card-header">
<h:outputText value="#{analyticController.getAsDouble(item.name)}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</div>
<div class="analytic-card-content">#{analyticController.getLabel(item.name)}</div>
<div class="analytic-card-footer">#{analyticController.getDescription(item.name)}
</div>
</div>
</ui:composition>

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<CargoSoftEFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://xsd.cargosoft.de/CargoSoftEFile/CargoSoftEFile-2023.2.xsd">
<Message>
<SenderID>CARGOSOFT</SenderID>
<ReceiverID>ATLSTB</ReceiverID>
<MessageID>20240912064210939</MessageID>
<MessageDate>
<DateTime>2024-09-12T06:42:10</DateTime>
</MessageDate>
<Provider>
<CargoSoftDatabaseVersion>2023.2g</CargoSoftDatabaseVersion>
<CargoServiceVersion>2023.2-1415</CargoServiceVersion>
</Provider>
</Message>
<EFile id="2244063">
<Description>
<DocDate>
<DateTime>2024-09-12T06:31:43</DateTime>
</DocDate>
<DocType>ATLAS</DocType>
<Title>STEUERBESCHEID NEU</Title>
</Description>
<Attachments>
<Attachment id="2306944">
<Version>1</Version>
<Filename>Abgabenbescheid-IM-GCA-2409-021N-005-ATC401471770920244851.pdf</Filename>
<MimeType>application/pdf</MimeType>
<FileDate>
<DateTime>2024-09-12T19:22:46</DateTime>
</FileDate>
<Md5>9D8A288A724FF91ED6FB688F66092B</Md5>
<FileSize>69533</FileSize>
</Attachment>
</Attachments>
<References>
<Reference type="client">001</Reference>
<Reference type="cs_voucher_number">254374</Reference>
<Reference type="cs_voucher_type">LR</Reference>
<Reference type="cs_address_number">70259</Reference>
<Reference type="currency">EUR</Reference>
<Reference type="voucherdate">2024-09-12T00:00:00</Reference>
<Reference type="total_net_amount">19049.41</Reference>
<Reference type="total_tax_amount">0.00</Reference>
<Reference type="currency_rate" />
<Reference type="reference">ATC401471770920244851</Reference>
<Reference type="booking_period">202409</Reference>
<Reference type="booking_date">2024-09-12T00:00:00</Reference>
<Reference type="booking_text">ATLAS Steuerbescheid</Reference>
<Reference type="row_1_activity_type">ZOLL</Reference>
<Reference type="row_1_amount">3501.76</Reference>
<Reference type="row_1_tax_code">0</Reference>
<Reference type="row_1_cs_filenumber">IM-GCA-2409-021</Reference>
<Reference type="row_2_activity_type">EUST</Reference>
<Reference type="row_2_amount">15547.65</Reference>
<Reference type="row_2_tax_code">0</Reference>
<Reference type="row_2_cs_filenumber">IM-GCA-2409-021</Reference>
</References>
</EFile>
</CargoSoftEFile>

View file

@ -0,0 +1,420 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- origin at X=0.0 Y=0.0 --><bpmn2:definitions 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:tl="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exporter="org.eclipse.bpmn2.modeler.core" exporterVersion="1.5.4.RC1-v20220528-0836-B1" id="Definitions_1" name="Definitions 1" targetNamespace="http://www.imixs.org/bpmn2">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[mahnlauf-de-1.0]]></imixs:value>
</imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Prozess-Verantwortliche| namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[Prozess-Assistenz | namprocessassist]]></imixs:value>
<imixs:value><![CDATA[Buchhaltung | namprocessteam]]></imixs:value>
<imixs:value><![CDATA[Debitor-Mail|dbtr.mail]]></imixs:value>
</imixs:item>
<imixs:item name="txttimefieldmapping" type="xs:string">
<imixs:value><![CDATA[Wiedervorlage | datDate]]></imixs:value>
<imixs:value><![CDATA[Start | datFrom]]></imixs:value>
<imixs:value><![CDATA[Ende | datTo]]></imixs:value>
</imixs:item>
<imixs:item name="txtplugins" type="xs:string">
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.RulePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.ProfilePlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.team.TeamPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.DeputyPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.OwnerPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.HistoryPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.LogPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.CommentPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.MailPlugin]]></imixs:value>
</imixs:item>
<open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements>
<bpmn2:signal id="Signal_1" name="com.alexanderlogistics.ZahlungsavisExportAdapter"/>
<bpmn2:signal id="Signal_2" name="com.alexanderlogistics.ZahlungseingangSaldoAdapter"/>
<bpmn2:signal id="Signal_3" name="com.alexanderlogistics.mahnlauf.MahnlaufExecuteAdapter"/>
<bpmn2:message id="Message_2" name="Html-Header">
<bpmn2:documentation id="Documentation_22"><![CDATA[<html>
<head>
<style type="text/css">
html, body, div, p, pre, h1, h2, h3, ul, ol, span, a, table, td, form, img,
li {
font-family: Arial;
font-style: normal;
font-variant: normal;
font-weight: normal;
font-size: 11pt;
}
body {
margin: 0;
padding: 1em;
min-width: 41em;
}
h2 {
font-size: 12pt;
font-weight: bold;
}
th {
border-bottom: 1px solid #ccc;
}
td { border:none;min-width:120px; }
th { font-weight: bold;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title><itemvalue>$workflowstatus</itemvalue></title>
</head>
<body>]]></bpmn2:documentation>
</bpmn2:message>
<bpmn2:message id="Message_7" name="Html-Footer">
<bpmn2:documentation id="Documentation_15"><![CDATA[</body>
</html>]]></bpmn2:documentation>
</bpmn2:message>
<bpmn2:collaboration id="Collaboration_1" name="Mahnlauf">
<bpmn2:participant id="Participant_1" name="Analyse" processRef="Process_1">
<bpmn2:documentation id="documentation_sqQYFQ"/>
</bpmn2:participant>
<bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/>
</bpmn2:collaboration>
<bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="Default Process">
<bpmn2:documentation id="documentation_sxNNHw"/>
</bpmn2:process>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Analyse">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Buchhaltung">
<bpmn2:flowNodeRef>StartEvent_1</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_1</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_3</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>EndEvent_3</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_8</bpmn2:flowNodeRef>
<bpmn2:documentation id="documentation_WBGJTA"/>
<bpmn2:flowNodeRef>DataObject_1</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="StartEvent_1" name="Start">
<bpmn2:outgoing>SequenceFlow_4</bpmn2:outgoing>
<bpmn2:documentation id="documentation_5CHRCQ"/>
</bpmn2:startEvent>
<bpmn2:task id="Task_2" imixs:processid="1900" name="Archiviert">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue format="dd.MM.yyyy">$lasteventdate</itemvalue> - <itemvalue>dbtr.name</itemvalue> (<itemvalue>dbtr.number</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string"/>
<imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="keyaddreadfields" type="xs:string"/>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-mail||||typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic_readonly]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_4"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:outgoing>SequenceFlow_10</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_OL83kQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:sequenceFlow id="SequenceFlow_10" sourceRef="Task_2" targetRef="EndEvent_3">
<bpmn2:documentation id="documentation_WzPj2A"/>
</bpmn2:sequenceFlow>
<bpmn2:endEvent id="EndEvent_3" name="End">
<bpmn2:incoming>SequenceFlow_10</bpmn2:incoming>
<bpmn2:documentation id="documentation_sMnhoQ"/>
</bpmn2:endEvent>
<bpmn2:task id="Task_1" imixs:processid="1000" name="Erfassung">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue format="dd.MM.yyyy">$lasteventdate</itemvalue> - <itemvalue>dbtr.name</itemvalue> (<itemvalue>dbtr.number</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[alexander/form_basic]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-chart-pie||]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddreadfields" type="xs:string"/>
<imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
<imixs:item name="namaddwriteaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_3"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_14</bpmn2:incoming>
<bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_17AQjg</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" imixs:activityid="10" name="Aktualisieren">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string"/>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Daten aktualisiert.]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
<imixs:item name="txtbusinessrule" type="xs:string">
<imixs:value/>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_12"><![CDATA[Datenaktualisierung anfordern]]></bpmn2:documentation>
<bpmn2:outgoing>SequenceFlow_14</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_14" sourceRef="IntermediateCatchEvent_3" targetRef="Task_1">
<bpmn2:documentation id="documentation_V0hcPw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="SequenceFlow_4" sourceRef="StartEvent_1" targetRef="Task_1">
<bpmn2:documentation id="documentation_p6trwA"/>
</bpmn2:sequenceFlow>
<bpmn2:dataObject id="DataObject_1" name="Form">
<bpmn2:documentation id="Documentation_17"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="3" label="Monitoring - Steuerbescheide">
<item name="analytic.steuer.zoll" type="custom" path="alexander/analyze_plain" label="Zoll:" />
<item name="analytic.steuer.eust" type="custom" path="alexander/analyze_plain" label="EUST:" />
<item name="analytic.steuer.due" type="custom" path="alexander/analyze_plain" label="Überfällig:" />
</imixs-form-section>
<imixs-form-section columns="2">
<item name="analytic.steuer.trend" type="custom" path="alexander/analyze_chart" label="Forderungen:" />
</imixs-form-section>
</imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_1"/>
</bpmn2:dataObject>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_8" imixs:activityid="20" name="Abschließen">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string"/>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Analysedaten archiviert]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_2"><![CDATA[Zwischenspeichern]]></bpmn2:documentation>
<bpmn2:incoming>sequenceFlow_17AQjg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_OL83kQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:association id="Association_2" sourceRef="DataObject_1" targetRef="Task_1">
<bpmn2:documentation id="documentation_pDK6DQ"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_17AQjg" sourceRef="Task_1" targetRef="IntermediateCatchEvent_8">
<bpmn2:documentation id="documentation_c8gvZg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_OL83kQ" sourceRef="IntermediateCatchEvent_8" targetRef="Task_2">
<bpmn2:documentation id="documentation_j2zUkw"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="Default Process Diagram">
<bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_1">
<bpmndi:BPMNShape bpmnElement="Participant_1" id="BPMNShape_Participant_1" isHorizontal="true">
<dc:Bounds height="450.0" width="1180.0" x="100.0" y="150.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true">
<dc:Bounds height="450.0" width="1150.0" x="130.0" y="150.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_1">
<dc:Bounds height="36.0" width="36.0" x="197.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="169.5" y="337.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_1" id="BPMNShape_Task_1">
<dc:Bounds height="50.0" width="110.0" x="290.0" y="290.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_3" id="BPMNShape_EndEvent_2">
<dc:Bounds height="36.0" width="36.0" x="927.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_85" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="898.0" y="337.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_2">
<dc:Bounds height="50.0" width="110.0" x="760.0" y="290.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_3" id="BPMNShape_IntermediateCatchEvent_3">
<dc:Bounds height="36.0" width="36.0" x="327.0" y="387.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_21" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="295.0" y="426.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="DataObject_1" id="BPMNShape_DataObject_1">
<dc:Bounds height="50.0" width="35.0" x="290.0" y="190.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_13">
<dc:Bounds height="20.0" width="100.0" x="258.0" y="240.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Message_2" id="BPMNShape_Message_1">
<dc:Bounds height="20.0" width="30.0" x="119.0" y="59.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_35">
<dc:Bounds height="20.0" width="100.0" x="84.0" y="79.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Message_7" id="BPMNShape_Message_4">
<dc:Bounds height="20.0" width="30.0" x="213.0" y="59.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_40">
<dc:Bounds height="20.0" width="100.0" x="178.0" y="79.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_8" id="BPMNShape_IntermediateCatchEvent_8">
<dc:Bounds height="36.0" width="36.0" x="507.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_24">
<dc:Bounds height="20.0" width="100.0" x="474.5" y="337.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_10" id="BPMNEdge_SequenceFlow_10" sourceElement="BPMNShape_Task_2" targetElement="BPMNShape_EndEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_26"/>
<di:waypoint x="870.0" y="315.0"/>
<di:waypoint x="927.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_14" id="BPMNEdge_SequenceFlow_14" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_22"/>
<di:waypoint x="345.0" y="387.0"/>
<di:waypoint x="345.0" y="344.0"/>
<di:waypoint x="345.0" y="340.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_4" id="BPMNEdge_SequenceFlow_4" sourceElement="BPMNShape_1" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_11"/>
<di:waypoint x="233.0" y="315.0"/>
<di:waypoint x="290.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_DataObject_1" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_17"/>
<di:waypoint x="325.0" y="213.0"/>
<di:waypoint x="345.0" y="213.0"/>
<di:waypoint x="345.0" y="290.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_17AQjg" id="BPMNEdge_oSvh0w" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_IntermediateCatchEvent_8">
<di:waypoint x="400.0" y="315.0"/>
<di:waypoint x="507.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_OL83kQ" id="BPMNEdge_lwO0vA" sourceElement="BPMNShape_IntermediateCatchEvent_8" targetElement="BPMNShape_Task_2">
<di:waypoint x="543.0" y="315.0"/>
<di:waypoint x="760.0" y="315.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>
</bpmndi:BPMNLabelStyle>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>