export Steuerbescheide Excel

This commit is contained in:
Ralph Soika 2024-09-23 12:07:21 +02:00
parent a682955ab5
commit a14762f784
6 changed files with 2126 additions and 10 deletions

View file

@ -114,7 +114,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private double computeSteuerbescheideEUST() {
logger.info("compute EUST...");
logger.fine("compute EUST...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
@ -131,7 +131,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private double computeSteuerbescheideZoll() {
logger.info("compute Zoll...");
logger.fine("compute Zoll...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
@ -146,7 +146,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private double computeSteuerbescheideSaldo() {
logger.info("compute saldo...");
logger.fine("compute saldo...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
@ -162,7 +162,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private double computeSteuerbescheideTotal() {
logger.info("compute total...");
logger.fine("compute total...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
@ -177,7 +177,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private double computeSteuerbescheideSaldoDue() {
logger.info("compute EUST...");
logger.fine("compute EUST...");
List<ItemCollection> list = getSteuerbescheide();
double result = 0;
for (ItemCollection steuerItemCol : list) {
@ -243,7 +243,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private String accumulateSteuerbescheideByWeek() {
logger.info("accumulate steuer by week...");
logger.fine("accumulate steuer by week...");
List<ItemCollection> list = getSteuerbescheide();
Map<Integer, SteuerData> saldoByWeek = new HashMap<>();
@ -356,7 +356,7 @@ public class AGLAnalyticController implements Serializable {
* @return
*/
private String accumulateSteuerbescheideAbteilungByWeek() {
logger.info("accumulate steuer by Abteilung week...");
logger.fine("accumulate steuer by Abteilung week...");
String[] colors = {
"#36a2eb",
@ -389,7 +389,7 @@ public class AGLAnalyticController implements Serializable {
double total = steuerItemCol.getItemValueDouble("invoice.total.net");
Date date = steuerItemCol.getItemValueDate("invoice.date");
logger.info(".... " + steuerItemCol.getItemValueString("$workflowSummary") + " = " + total);
logger.fine(".... " + steuerItemCol.getItemValueString("$workflowSummary") + " = " + total);
// Get the week number and year from the date
calendar.setTime(date);
int weekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
@ -456,7 +456,7 @@ public class AGLAnalyticController implements Serializable {
String key = _abteilung + "~" + yearWeek;// Unique key Import Forest~202405
// Add the total for the week or 0.0 if no data
SteuerData steuerData = totalByWeek.getOrDefault(key, new SteuerData());
logger.info(" " + yearWeek + "=" + steuerData.total);
logger.fine(" " + yearWeek + "=" + steuerData.total);
dataBuilderTotals.add(steuerData.total);
// Move to the next week
startCal.add(Calendar.WEEK_OF_YEAR, 1);

View file

@ -0,0 +1,289 @@
package com.alexanderlogistics;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.apache.poi.ss.usermodel.CellCopyPolicy;
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.imixs.workflow.FileData;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService;
import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.util.XMLParser;
import jakarta.inject.Inject;
/**
* Der AGLAnalyticExcelAdapter exportiert importiert eine Excel Datei aus einem
* Textblock und fügt die offenen Steuerbescheid Daten ein
*
* Der Adapter wird im Modell wie folgt konfiguriert
*
* <pre>
* {@code
<steuerbescheide name="excel-export">
<textblock>textblock-ref</textblock>
<template>filename</template>
<targetname>filename</targetname>
</steuerbescheide>
}
* </pre>
*
* <p>
* Der Adapter erweitert den POIAdapter somit können Felder aktualisiert werden
* (siehe POIFineReplaceAdapter).
*
* <p>
* Der Adapter kopiert die Steuerbescheiddaten in neue Zeilen, welche ab
* Zeilennummer
* 16 eingefügt werden.
* <p>
*
* Abschliessend wird die Zelle 'TOTAL' noch aktualisiert.
*
*
* @version 1.0
* @author rsoika
*/
public class AGLAnalyticExcelAdapter extends POIFindReplaceAdapter {
private static Logger logger = Logger.getLogger(AGLAnalyticExcelAdapter.class.getName());
@Inject
WorkflowService workflowService;
@Inject
OPListExportService opListExportService;
@Inject
DocumentService documentService;
@Inject
ConfigService configService;
/**
* This method finds or create the Zahlungsavis and adds a reference
* ($workitemref) to the current invoice.
*
* @throws PluginException
*/
@SuppressWarnings("unchecked")
@Override
public ItemCollection execute(ItemCollection document, ItemCollection event)
throws AdapterException, PluginException {
// ermittle die Hauptwährungen
ItemCollection configItemCollection = configService.loadConfiguration("AGL_CONFIGURATION");
List<String> currencyList = configItemCollection.getItemValue("currency.out");
if (currencyList == null || currencyList.size() < 2) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), OPListExportService.ERROR_CONFIG,
"missing Currency configuration - please check parameters");
}
// read the Steuerbescheide options
ItemCollection steuerbescheideConfig = workflowService.evalWorkflowResult(event, "steuerbescheide", document,
false);
if (steuerbescheideConfig == null || !steuerbescheideConfig.hasItem("excel-export")) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), CONFIG_ERROR,
"missing Steuerbescheide configuration in model event - please check model configuration");
}
List<String> excelDefList = steuerbescheideConfig.getItemValue("excel-export");
ItemCollection excelDefCollection = XMLParser.parseItemStructure(excelDefList.get(0));
String textblock = excelDefCollection.getItemValueString("textblock");
String template = excelDefCollection.getItemValueString("template");
String targetName = excelDefCollection.getItemValueString("target-name");
// adapt text....
targetName = workflowService.adaptText(targetName, document);
try {
appendExcelTemplate(document, textblock, template, targetName);
insertInvoiceRows(document, targetName);
logger.info("... loading poi configuration..");
// Process POI instructions
// read the config
ItemCollection poiConfig = workflowService.evalWorkflowResult(event, "poi-update", document, false);
if (poiConfig == null || !poiConfig.hasItem("findreplace")) {
throw new PluginException(POIFindReplaceAdapter.class.getSimpleName(), CONFIG_ERROR,
"missing poi configuration");
}
List<String> replaceDevList = poiConfig.getItemValue("findreplace");
String eval = poiConfig.getItemValueString("eval");
logger.info("... update template with normal poi information..");
this.updateFileData(document.getFileData(targetName), document, replaceDevList, eval);
} catch (PluginException | IOException | QueryException e) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), OPListExportService.ERROR_CONFIG,
"failed to update steuerbescheide: " + e.getMessage());
}
logger.info("... completed!");
return document;
}
/**
* This helper method inserts a row for each invoice at row 16
* into the excel template file
* <p>
* The method copies the Row A16 as a reference row
* <p>
* The named cell 'TOTAL' should contain the summary formula. It will be
* evaluated at the end.
*
* @throws PluginException
* @throws QueryException
*/
private void insertInvoiceRows(ItemCollection document, String fileName)
throws PluginException, QueryException {
// load dummy rechnungen
List<ItemCollection> invoices = loadSteuerbescheide();
FileData fileData = document.getFileData(fileName);
// load XSSFWorkbook
XSSFWorkbook doc = null;
try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) {
doc = new XSSFWorkbook(imputStream);
// NOTE: we only take the first sheet !
XSSFSheet sheet = doc.getSheetAt(0);
CellReference invoiceRefCell = new CellReference("A11");
XSSFRow referenceRowInvoice = sheet.getRow(invoiceRefCell.getRow());
int referenceRowPos = 10;
int rowPos = referenceRowPos;
int lastRow = 2999;
logger.finest("Last rownum=" + lastRow);
// jetzt füge alle Rechnungen an.
int totalRowCount = invoices.size();
sheet.shiftRows(referenceRowPos, lastRow, totalRowCount, true, true);
for (ItemCollection invoice : invoices) {
logger.fine("......add invoice " + invoice.getUniqueID());
// now create a new line..
XSSFRow row = sheet.createRow(rowPos);
row.copyRowFrom(referenceRowInvoice, new CellCopyPolicy());
// insert values
row.getCell(0)
.setCellValue(invoice.getItemValueDate("$created"));
row.getCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueString("invoice.number"));
row.getCell(2, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDate("invoice.date"));
row.getCell(3, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDate("invoice.booking_date"));
row.getCell(4, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueString("space.name"));
row.getCell(5, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueString("invoice.text"));
row.getCell(6, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueString("invoice.atc.number"));
row.getCell(7, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDouble("invoice.total.net"));
row.getCell(8, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDouble("invoice.saldo"));
row.getCell(9, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDouble("steuer.eust"));
row.getCell(10, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDate("steuer.eust.due"));
row.getCell(11, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDouble("steuer.zoll"));
row.getCell(12, MissingCellPolicy.CREATE_NULL_AS_BLANK)
.setCellValue(invoice.getItemValueDate("steuer.zoll.due"));
rowPos++;
}
// Leerzeile
// categoryRow = sheet.createRow(rowPos);
rowPos++;
// write back the file
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
doc.write(byteArrayOutputStream);
byte[] newContent = byteArrayOutputStream.toByteArray();
FileData fileDataNew = new FileData(fileData.getName(), newContent, fileData.getContentType(), null);
// update the fileData
document.addFileData(fileDataNew);
logger.finest("......new document added");
} catch (IOException e) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), OPListExportService.ERROR_CONFIG,
"failed to update opliste: " + e.getMessage());
} finally {
if (doc != null) {
try {
doc.close();
} catch (IOException e) {
logger.severe("Failed to close workbook: " + e.getMessage());
e.printStackTrace();
}
}
}
}
/**
* This method loads a text-block for a specified ref and appends the named
* fileData object of this document.
*
* @param document
* @throws PluginException
*/
private void appendExcelTemplate(ItemCollection document, String textblockRef, String template, String targetName)
throws PluginException {
if ((template == null || template.isEmpty()) || (textblockRef == null || textblockRef.isEmpty())) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), OPListExportService.ERROR_CONFIG,
"invalid steuerbescheide configuration in model event - textblock/template reference not defined!");
}
// load the text block
FileData fileData = opListExportService.loadTextBlockFileData(textblockRef, template);
// do we found the document?
if (fileData == null) {
throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), OPListExportService.ERROR_CONFIG,
"invalid steuerbescheide configuration in model event - template=" + template + " not found!");
}
fileData.setName(targetName);
// append document
logger.info("...append new steuerbescheide Template: " + targetName);
document.addFileData(fileData);
}
/**
* Diese Methode läd alle offenen Steuerbescheide
*
* @return
*/
private List<ItemCollection> loadSteuerbescheide() {
List<ItemCollection> result = new ArrayList<>();
try {
result = documentService.find(
"$modelversion:steuerbescheid-* AND type:workitem", 9999, 0,
"invoice.number", false);
} catch (QueryException e) {
e.printStackTrace();
}
return result;
}
}

View file

@ -108,7 +108,7 @@ public class AnalyticController implements Serializable {
if (workflowController.getWorkitem() != null) {
// try to fetch value from cache
if (!workflowController.getWorkitem().hasItem("analytic." + key)) {
logger.info("fire analytic event for key '" + key + "'");
logger.fine("fire analytic event for key '" + key + "'");
// Fire the Analytics Event for this key
AnalyticEvent event = new AnalyticEvent(key, workflowController.getWorkitem());
if (analyticEvents != null) {

Binary file not shown.

View file

@ -0,0 +1,443 @@
<?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[analyse-steuerbescheid-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.AGLAnalyticExcelAdapter"/>
<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="Steuerbescheid - 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="Steuerbescheid - 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>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:flowNodeRef>event_HrHS9A</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="EEE. dd. MMM. yyyy">$lasteventdate</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-chart-pie||||typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item>
<imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic_read]]></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:incoming>sequenceFlow_P5vJKg</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>]]></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_4</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_17AQjg</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_nZPhew</bpmn2:outgoing>
</bpmn2:task>
<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="Offene Beträge">
<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.total" type="custom" path="alexander/analyze_plain" label="Gesamt:" />
<item name="analytic.steuer.saldo" type="custom" path="alexander/analyze_plain" label="Saldo:" />
<item name="analytic.steuer.due" type="custom" path="alexander/analyze_plain" label="Saldo überfällig:" />
</imixs-form-section>
<imixs-form-section columns="2" label="Trend nach Kalenderwoche">
<item name="analytic.steuer.trend" type="custom" path="alexander/analyze_chart" label="Zoll/Eust pro KW:" />
<item name="analytic.steuer.trend.abteilung" type="custom" path="alexander/analyze_chart" label="Gesamt pro Abteilungen:" />
</imixs-form-section>
</imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_1"/>
</bpmn2:dataObject>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_8" imixs:activityid="40" name="Archivieren">
<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[Analysedaten archivieren.]]></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:intermediateCatchEvent id="event_HrHS9A" imixs:activityid="20" name="Excel Export">
<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>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Mahnwesen</item>
<steuerbescheide name="excel-export">
<textblock>Steuerbescheide Template</textblock>
<template>steuerbescheid-liste_template.xlsx</template>
<target-name>steuerbescheide_<itemvalue format="yyyy-MM-dd">$lasteventdate</itemvalue>.xlsx</target-name>
</steuerbescheide>
<poi-update name="findreplace">
<find>K6</find>
<replace><itemvalue format="dd.MM.yyyy">$lasteventdate</itemvalue></replace>
<type>date</type>
</poi-update>
<poi-update name="eval">TOTAL1;TOTAL2;TOTAL3;TOTAL4</poi-update>
]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_pCTOtQ"><![CDATA[Excel Datei erzeugen]]></bpmn2:documentation>
<bpmn2:signalEventDefinition id="signalEventDefinition_007muw" signalRef="Signal_1"/>
<bpmn2:incoming>sequenceFlow_nZPhew</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_P5vJKg</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_nZPhew" sourceRef="Task_1" targetRef="event_HrHS9A">
<bpmn2:documentation id="documentation_IN9m7w"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_P5vJKg" sourceRef="event_HrHS9A" targetRef="Task_2">
<bpmn2:documentation id="documentation_gV4coQ"/>
</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="330.0" width="960.0" x="100.0" y="150.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true">
<dc:Bounds height="330.0" width="930.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="757.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_85" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="728.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="570.0" y="290.0"/>
</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="467.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_24">
<dc:Bounds height="20.0" width="100.0" x="434.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="680.0" y="315.0"/>
<di:waypoint x="757.0" y="315.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="467.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="503.0" y="315.0"/>
<di:waypoint x="570.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_HrHS9A" id="BPMNShape_hrK7fA">
<dc:Bounds height="36.0" width="36.0" x="327.0" y="387.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_CJ3Faw">
<dc:Bounds height="20.0" width="100.0" x="295.0" y="426.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_nZPhew" id="BPMNEdge_5PzaQQ" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_hrK7fA">
<di:waypoint x="345.0" y="340.0"/>
<di:waypoint x="345.0" y="387.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_P5vJKg" id="BPMNEdge_aN5clQ" sourceElement="BPMNShape_hrK7fA" targetElement="BPMNShape_Task_2">
<di:waypoint x="363.0" y="405.0"/>
<di:waypoint x="623.0" y="405.0"/>
<di:waypoint x="623.0" y="340.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/>
</bpmndi:BPMNLabelStyle>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>

File diff suppressed because it is too large Load diff