import steuerbescheide

This commit is contained in:
Ralph Soika 2024-08-20 16:50:57 +02:00
parent 8558aecdaf
commit 4e0b1b0b5f
14 changed files with 4890 additions and 514 deletions

View file

@ -0,0 +1,48 @@
package com.alexanderlogistics;
import java.io.Serializable;
import java.util.List;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.faces.data.WorkflowController;
import jakarta.enterprise.context.ConversationScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
/**
* Der SteuerListController dient dazu in einem Stuerbescheid
* die einzelnen Zeilen auszugeben.
*
* @author rsoika
*
*/
@Named("steuerListController")
@ConversationScoped
public class SteuerListController implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
DocumentService documentService;
@Inject
protected WorkflowController workflowController;
/**
* Gibt die Zeilen aus einem importierten Steuerbeleg (eAkte) zurück
*
* @return
*/
public List<ItemCollection> getRows() {
List<ItemCollection> rows = InvoiceUtil.explodeChildList(workflowController.getWorkitem());
return rows;
}
public ItemCollection loadInvoice(String id) {
return documentService.load(id);
}
}

View file

@ -0,0 +1,100 @@
package com.alexanderlogistics;
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.engine.plugins.AbstractPlugin;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import jakarta.inject.Inject;
/**
* Das SteuerbescheidPlugin prüft ob
*
* - die ATC Nummer aus dem Steuerbescheid in einer Ausgangsrechnung gefunden
* wird ($taskID<5990)
* - invoice.atc.number
* - der Betrag "invoice.total.net"
* - die Währung???
* - die Positionsnummer ???
*
*
* @author rsoika
* @version 1.0
*
*/
public class SteuerbescheidPlugin extends AbstractPlugin {
private static Logger logger = Logger.getLogger(SteuerbescheidPlugin.class.getName());
@Inject
protected DocumentService documentService;
@Inject
KreditorDebitorService kreditorService;
/**
* Prüft ob der Steuerbetrag abgerechnet ist.
*
*
**/
@Override
public ItemCollection run(ItemCollection workitem, ItemCollection event) throws PluginException {
String atcNummer = workitem.getItemValueString("invoice.atc.number");
logger.info("Verify ATC-Nr.: " + atcNummer);
double amount = workitem.getItemValueDouble("invoice.total.net");
List<ItemCollection> invoices = findInvoices(atcNummer);
// Beträge subtrahieren....
double saldo = amount;
logger.info("Found " + invoices.size() + " matching invoices...");
for (ItemCollection invoice : invoices) {
workitem.setItemValueUnique("$workitemRef", invoice.getUniqueID());
// suche die Zeile in der die ATC Nummer vorkommt.
List<ItemCollection> positionen = InvoiceUtil.explodeChildList(invoice);
for (ItemCollection pos : positionen) {
if (atcNummer.equals(pos.getItemValueString("atc.number"))) {
double umsatz = pos.getItemValueDouble("datev.umsatz");
logger.info("...Umsatz=" + umsatz);
saldo = InvoiceUtil.round(saldo - umsatz);
}
}
}
// Stimmt der Betrag?
workitem.setItemValue("invoice.saldo", InvoiceUtil.round(saldo));
if (amount == saldo) {
// match!
} else {
// no match
}
return workitem;
}
/*
* Sucht alle Ausgansrechnungen zu einer ATC Nummer
*/
protected List<ItemCollection> findInvoices(String atcNumber) {
List<ItemCollection> result = new ArrayList<ItemCollection>();
String query = "(type:workitem OR type:workitemarchive) AND ($taskid:[5000 TO 5990])"
+ " AND invoice.atc.number:\"" + atcNumber + "\" "
+ " AND $workflowgroup:\"Rechnungsausgang\" ";
try {
result = documentService.find(query, 999, 0, "$created", false);
return result;
} catch (QueryException e) {
logger.severe("Failed to get invoices: " + e.getMessage());
}
return result;
}
}

View file

@ -1,97 +0,0 @@
package com.alexanderlogistics;
import java.io.Serializable;
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.engine.WorkflowService;
import org.imixs.workflow.faces.data.WorkflowController;
import jakarta.enterprise.context.ConversationScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
/**
* Der ZollListController dient dazu in einer Zoll Liste die Rechnungen
* anzuzeigen,
* für die noch Zollabrechnungen erforderlich sind.
*
* Diese List wird aus einem Abgleich einer Cargosoft Datei erstellt.
*
* @author rsoika
*
*/
@Named("zollListController")
@ConversationScoped
public class ZollListController implements Serializable {
private static final long serialVersionUID = 1L;
public static final int TASK_ERSTELLUNG = 1000;
private static Logger logger = Logger.getLogger(ZollListController.class.getName());
private String lastDbtrNumber = null;
private String currencyFilter = "-";
private String lastCurrencyFilter = null;
private List<ItemCollection> invoiceList = null;
@Inject
protected WorkflowController workflowController;
@Inject
protected WorkflowService workflowService;
@Inject
ZahlungseingangService zahlungseingangService;
@Inject
protected DocumentService documentService;
/**
* Diese Methode ist eine Dummy Methode die nur mal 3 Rechnungen simmuliert.
*
* Später wird diese Methode irgend was anderes machen.
*
*
* @return
*/
@SuppressWarnings("unchecked")
public List<ItemCollection> getInvoices() {
invoiceList = new ArrayList<ItemCollection>();
// dummy1
invoiceList.add(new ItemCollection()
.setItemValue("invoice.text", "LA-HOL-2401-002")
.setItemValue("invoice.atc", "ATC400058750120242452")
.setItemValue("dbtr.name", "D18317 Big Belly Solar GmbH")
.setItemValue("invoice.ZOLL", 18.45)
.setItemValue("invoice.EUST", 0)
.setItemValue("invoice.number", ""));
invoiceList.add(new ItemCollection()
.setItemValue("invoice.text", "LA-HOL-2401-003")
.setItemValue("invoice.atc", "ATC400058750120242450")
.setItemValue("dbtr.name", "D18317 Big Belly Solar GmbH")
.setItemValue("invoice.ZOLL", 100.45)
.setItemValue("invoice.EUST", 0)
.setItemValue("invoice.number", ""));
invoiceList.add(new ItemCollection()
.setItemValue("invoice.text", "LA-PAP-2401-003")
.setItemValue("invoice.atc", "345345")
.setItemValue("dbtr.name", "D18006 GPI BERLIN GMBH")
.setItemValue("invoice.ZOLL", 253.4)
.setItemValue("invoice.EUST", 0)
.setItemValue("invoice.number", ""));
return invoiceList;
}
}

View file

@ -380,12 +380,23 @@ public class CargosoftXMLEAkteImportService {
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='cs_voucher_number']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='cs_voucher_number']",
workitem, "invoice.number", String.class); workitem, "invoice.number", String.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='cs_address_number']",
workitem, "cdtr.number", String.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='voucherdate']",
workitem, "invoice.date", Date.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='currency']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='currency']",
workitem, "invoice.currency", String.class); workitem, "invoice.currency", String.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='currency_rate']",
workitem, "invoice.rate", Double.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='total_net_amount']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='total_net_amount']",
workitem, "invoice.total.net", String.class); workitem, "invoice.total.net", Double.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='total_tax_amount']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='total_tax_amount']",
workitem, "invoice.total.tax", String.class); workitem, "invoice.total.tax", Double.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='reference']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='reference']",
workitem, "invoice.atc.number", String.class); workitem, "invoice.atc.number", String.class);
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='booking_period']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='booking_period']",
@ -396,41 +407,12 @@ public class CargosoftXMLEAkteImportService {
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='booking_text']", readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='booking_text']",
workitem, "invoice.booking_text", String.class); workitem, "invoice.booking_text", String.class);
// Read rows
readXMLValue(doc, "/CargoSoftEFile/EFile/References/Reference[@type='row_1_cs_filenumber']",
workitem, "invoice.text", String.class);
// verify if invoice is already imported. // verify if invoice is already imported.
if (alreadyImported(workitem.getItemValueString("invoice.number"))) { if (alreadyImported(workitem.getItemValueString("invoice.number"))) {
logger.warning("Invoice " + workitem.getItemValueString("invoice.number") + " already imported"); logger.warning("Invoice " + workitem.getItemValueString("invoice.number") + " already imported");
// return null; return null;
} }
// Rechnungssumme errechnen.....
// readXMLValue(doc,
// "/Invoices/Invoice/InvoiceHeader/InvoiceAmount/NetAmount/Amount/Value",
// workitem, "invoice.total.net", Double.class);
// readXMLValue(doc,
// "/Invoices/Invoice/InvoiceHeader/InvoiceAmount/VATInformation/VATAmount/Amount/Value",
// workitem, "invoice.total.tax", Double.class);
// if (!workitem.hasItem("invoice.total.tax")) {
// workitem.setItemValue("invoice.total.tax", 0.0);
// }
// // Total = net + tax
// double _total = workitem.getItemValueDouble("invoice.total.net");
// _total = _total + workitem.getItemValueDouble("invoice.total.tax");
// _total = Math.round(_total * 100) / 100.0;
// workitem.setItemValue("invoice.total", _total);
// workitem.setItemValue("invoice.saldo", _total);
// Bei Gutschrift und Stornorechnung Wert negieren...
// if (isGutschrift(workitem)) {
// workitem.setItemValue("invoice.saldo",
// -workitem.getItemValueDouble("invoice.total"));
// workitem.setItemValue("invoice.total",
// -workitem.getItemValueDouble("invoice.total"));
// }
String cdtrNumber = workitem.getItemValueString("cdtr.number"); String cdtrNumber = workitem.getItemValueString("cdtr.number");
if (cdtrNumber.startsWith("K") || cdtrNumber.startsWith("D")) { if (cdtrNumber.startsWith("K") || cdtrNumber.startsWith("D")) {
workitem.setItemValue("cdtr.number", cdtrNumber.substring(1)); workitem.setItemValue("cdtr.number", cdtrNumber.substring(1));
@ -457,17 +439,12 @@ public class CargosoftXMLEAkteImportService {
} }
// Row Positions lesen // Row Positions lesen
// readXMLRows(doc, workitem); readXMLRows(doc, workitem);
// Jetzt noch das Space mapping // Jetzt noch das Space mapping
workitem.setItemValue("invoice.text", workitem.getItemValueString("invoice.positions"));
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings); mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings);
// Rückstellungen ignorieren
// if (isRueckStellung(workitem)) {
// // Ignore invoice!
// return null;
// }
// Finally we attache the pdf file and the XML content to the workitem. // Finally we attache the pdf file and the XML content to the workitem.
attacheFiles(doc, workitem); attacheFiles(doc, workitem);
@ -478,19 +455,6 @@ public class CargosoftXMLEAkteImportService {
return workitem; return workitem;
} }
/**
* Prüft ob die Rechnung eine Rückstellung ist also mit R1 bis R8 beginnt
*
* ^R[1-8] .
*
* @param workitem
* @return
*/
private boolean isRueckStellung(ItemCollection workitem) {
String text = workitem.getItemValueString("invoice.text");
return text.matches(REGEX_IMPORTTEXTPATTERN);
}
/** /**
* Reads a tag value from the xml tree and set the value into the given * Reads a tag value from the xml tree and set the value into the given
* workitem. * workitem.
@ -532,11 +496,19 @@ public class CargosoftXMLEAkteImportService {
return; return;
} }
if (itemType == Double.class && value != null && !value.isEmpty()) { if (itemType == Double.class && value != null && !value.isEmpty()) {
try {
workitem.setItemValue(itemName, Double.parseDouble(value)); workitem.setItemValue(itemName, Double.parseDouble(value));
} catch (NumberFormatException e) {
// no op
}
return; return;
} }
if (itemType == Integer.class && value != null && !value.isEmpty()) { if (itemType == Integer.class && value != null && !value.isEmpty()) {
try {
workitem.setItemValue(itemName, Integer.parseInt(value)); workitem.setItemValue(itemName, Integer.parseInt(value));
} catch (NumberFormatException e) {
// no op
}
return; return;
} }
// Default String format // Default String format
@ -549,106 +521,6 @@ public class CargosoftXMLEAkteImportService {
} }
} }
/**
* Reads the positions rows
*
* InvoiceRows/InvoiceRow
*
* Each row has the following items:
* _childitems {
* datev.shzeichen=[H],
* datev.kurs=[0.0],
* datev.basisumsatz=[0.0],
* datev.text=[R LA-PAP-2405-051],
* datev.konto=[3851],
* datev.umsatz=[3307.81],
* datev.wkz=[EUR]}}
*
* @param doc - xml doc
* @param workitem
*/
private void readXMLRows(Document doc, ItemCollection workitem) {
// create XPath...
List<ItemCollection> childItems = new ArrayList<>();
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xPath = xpathFactory.newXPath();
try {
// Compile the XPath expressions
XPathExpression fileNumberExpr = xPath.compile("FileNumber/text()");
XPathExpression netAmountCurrencyExpr = xPath
.compile("InvoiceAmount/NetAmount/Amount/Currency/Codes/Code[@Type='cs']/text()");
XPathExpression netAmountValueExpr = xPath.compile("InvoiceAmount/NetAmount/Amount/Value/text()");
XPathExpression netAmountExchangeRateExpr = xPath
.compile("InvoiceAmount/NetAmount/Amount/ExchangeRate/text()");
XPathExpression netActivityTypeExpr = xPath
.compile("InvoiceAmount/ActivityType/Codes/Code[@Type='cs']/text()");
NodeList rowList = doc.getElementsByTagName("InvoiceRow");
double _kurs = 0.0;
double _baseAmount = 0.0;
for (int i = 0; i < rowList.getLength(); i++) {
ItemCollection childItemCol = new ItemCollection();
Node rowNode = rowList.item(i);
if (rowNode.getNodeType() == Node.ELEMENT_NODE) {
// Get the FileNumber value
String fileNumber = (String) fileNumberExpr.evaluate(rowNode, XPathConstants.STRING);
childItemCol.setItemValue("datev.text", fileNumber);
// speichere die Position in invoice.positions zur suche nach dem
// Positionskennzeichen
workitem.appendItemValue("invoice.positions", fileNumber);
String currency = (String) netAmountCurrencyExpr.evaluate(rowNode, XPathConstants.STRING);
childItemCol.setItemValue("datev.wkz", currency);
// Umsatz
String umsatz = (String) netAmountValueExpr.evaluate(rowNode, XPathConstants.STRING);
double dUmsatz = Double.parseDouble(umsatz);
childItemCol.setItemValue("datev.umsatz", dUmsatz);
// Kurs
String _kursByRow = (String) netAmountExchangeRateExpr.evaluate(rowNode, XPathConstants.STRING);
if (_kursByRow != null && !_kursByRow.isEmpty()) {
Double dKurs = Double.parseDouble(_kursByRow);
_kurs = dKurs;
childItemCol.setItemValue("datev.kurs", dKurs);
// Basisumsatz
if (dKurs != 0) {
double basisUmsatz = dUmsatz / dKurs;
double gerundeterBasisUmsatz = Math.round(basisUmsatz * 100) / 100.0;
_baseAmount = _baseAmount + gerundeterBasisUmsatz;
childItemCol.setItemValue("datev.basisumsatz", gerundeterBasisUmsatz);
}
}
String activityType = (String) netActivityTypeExpr.evaluate(rowNode, XPathConstants.STRING);
childItemCol.setItemValue("category", activityType);
childItemCol.setItemValue("datev.shzeichen", "H");
childItems.add(childItemCol);
}
}
// Update invoice.rate und invoice.base.amount
workitem.setItemValue("invoice.rate", _kurs);
_baseAmount = Math.round(_baseAmount * 100) / 100.0;
workitem.setItemValue("invoice.base.amount", _baseAmount);
} catch (XPathExpressionException e) {
logger.warning("Unable to read row : " + e.getMessage());
}
// Set child items
InvoiceUtil.implodeChildList(workitem, childItems);
// invoice.text ist erste position
workitem.setItemValue("invoice.text", workitem.getItemValueString("invoice.positions"));
}
/** /**
* This method attache the pdf file and the XML file to the workitem. * This method attache the pdf file and the XML file to the workitem.
* The method removes the file content first form the xml tree and attache the * The method removes the file content first form the xml tree and attache the
@ -710,7 +582,7 @@ public class CargosoftXMLEAkteImportService {
* @param belegNummer * @param belegNummer
* @return * @return
*/ */
private boolean alreadyImported(String belegNummer) { protected boolean alreadyImported(String belegNummer) {
String sQuery = "((type:workitem OR type:workitemarchive) AND $modelversion:steuerbescheid* AND invoice.number:\"" String sQuery = "((type:workitem OR type:workitemarchive) AND $modelversion:steuerbescheid* AND invoice.number:\""
+ belegNummer + "\")"; + belegNummer + "\")";
@ -725,4 +597,84 @@ public class CargosoftXMLEAkteImportService {
} }
return false; return false;
} }
/**
* This helper method reads the references starting with 'Row_' and creates a
* child Workitem for each row.
*
* The method assumes that the rows are starting with the type 'row_n_' where
* 'n' is the row number.
* We start with row 1 and read until we found more rows.
*
* Example:
*
* <pre>{@code
* ...
<Reference type="row_1_activity_type" />
<Reference type="row_1_amount">3591.340</Reference>
<Reference type="row_1_tax_code">0</Reference>
<Reference type="row_1_cs_filenumber">IM-GCA-2408-116</Reference>
* }</pre>
*
* <p>
* The last filenumber text will be transferred into the item 'invoice.text'
*
* @param xml
* @return
* @throws Exception
*/
private void readXMLRows(Document doc, ItemCollection workitem) {
int row = 1;
// Prepare XPath
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
try {
List<ItemCollection> childItems = new ArrayList<>();
while (true) {
// XPath expression to find all Reference nodes starting with "row_"
logger.info("...read row " + row + "...");
XPathExpression expr = xpath
.compile("/CargoSoftEFile/EFile/References/Reference[starts-with(@type, 'row_" + row + "_')]");
NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
if (nodeList != null && nodeList.getLength() > 0) {
logger.info("...debug1 found " + nodeList.getLength() + " matches");
ItemCollection childItemCol = new ItemCollection();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
String type = node.getAttributes().getNamedItem("type").getNodeValue();
String value = node.getTextContent();
// Identify which field to set
if (type.contains("activity_type")) {
childItemCol.setItemValue("activity.type", value);
} else if (type.contains("amount")) {
try {
childItemCol.setItemValue("amount", Double.parseDouble(value));
} catch (NumberFormatException e) {
logger.warning("Unable to parse amount: " + e.getMessage());
}
} else if (type.contains("tax_code")) {
childItemCol.setItemValue("tax.code", value);
} else if (type.contains("cs_filenumber")) {
childItemCol.setItemValue("filenumber", value);
workitem.appendItemValue("invoice.positions", value);
}
}
childItems.add(childItemCol);
// continue with next row
row++;
} else {
// no more rows found
break;
}
}
// Set child items
InvoiceUtil.implodeChildList(workitem, childItems);
} catch (XPathExpressionException e) {
logger.warning("Unable to read row : " + e.getMessage());
}
}
} }

View file

@ -2,9 +2,9 @@
# Imixs Lucene Plugin # Imixs Lucene Plugin
############################## ##############################
lucence.indexDir=${imixs-office.IndexDir} lucence.indexDir=${imixs-office.IndexDir}
index.fields=txtsearchstring,txtSubject,txtname,txtEmail,txtUserName,namCreator,txtworkflowgroup,txtworkflowstatus,txtWorkflowAbstract,txtWorkflowSummary,txtworkflowhistory,txtspacename,txtprocessname,_subject,_description,_name,_projectnumber,_projectname,_ordernumber,_contractnumber,datDueDate,txtcommentlog,htmldescription,htmldocumentation,dms,dms_names,invoice.number.stripped,_childitems,$file.names,_VENDOR_NAME,dbtr.number,cdtr.number,invoice.positions index.fields=txtsearchstring,txtSubject,txtname,txtEmail,txtUserName,namCreator,txtworkflowgroup,txtworkflowstatus,txtWorkflowAbstract,txtWorkflowSummary,txtworkflowhistory,txtspacename,txtprocessname,_subject,_description,_name,_projectnumber,_projectname,_ordernumber,_contractnumber,datDueDate,txtcommentlog,htmldescription,htmldocumentation,dms,dms_names,invoice.number.stripped,_childitems,$file.names,_VENDOR_NAME,dbtr.number,cdtr.number,invoice.positions,invoice.atc.number
index.fields.analyze=txtUsername index.fields.analyze=txtUsername
index.fields.noanalyze=type,$UniqueIDRef,$created,$modified,$ModelVersion,$participants,namCreator,$ProcessID,datDate,txtWorkflowGroup,txtemail, datdate, datfrom, datto, numsequencenumber,sequencenumber,dms_count,invoice.number,invoice.number.stripped,invoice.date,invoice.duedate,taxonomy.verteilung.stop,taxonomy.sachpruefung.stop,taxonomy.verteilung.start,taxonomy.sachpruefung.start,taxonomy.buchhaltung.start,taxonomy.buchhaltung.stop,dbtr.number,cdtr.number,payment.date,invoice.total,invoice.currency,invoice.positions,$lasteventdate,payment.type,cdtr.name,document.company index.fields.noanalyze=type,$UniqueIDRef,$created,$modified,$ModelVersion,$participants,namCreator,$ProcessID,datDate,txtWorkflowGroup,txtemail, datdate, datfrom, datto, numsequencenumber,sequencenumber,dms_count,invoice.number,invoice.number.stripped,invoice.date,invoice.duedate,taxonomy.verteilung.stop,taxonomy.sachpruefung.stop,taxonomy.verteilung.start,taxonomy.sachpruefung.start,taxonomy.buchhaltung.start,taxonomy.buchhaltung.stop,dbtr.number,cdtr.number,payment.date,invoice.total,invoice.currency,invoice.positions,$lasteventdate,payment.type,cdtr.name,document.company,invoice.atc.number
index.fields.store=process.name,txtProcessName,txtWorkflowImageURL,payment.date,invoice.number,invoice.date,invoice.duedate index.fields.store=process.name,txtProcessName,txtWorkflowImageURL,payment.date,invoice.number,invoice.date,invoice.duedate
index.fields.category=space.name,space.ref,taxonomy.verteilung.stop.by,taxonomy.sachpruefung.stop.by,taxonomy.buchhaltung.stop.by index.fields.category=space.name,space.ref,taxonomy.verteilung.stop.by,taxonomy.sachpruefung.stop.by,taxonomy.buchhaltung.stop.by
office.search.noanalyze=invoice.number,invoice.number.stripped,invoice.positions office.search.noanalyze=invoice.number,invoice.number.stripped,invoice.positions

View file

@ -0,0 +1,51 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<h:panelGroup layout="block" styleClass="imixs-form-section" id="steuerlist-table" binding="#{steuerListContainer}">
<table style="width: 100%; margin: 5px;" class="imixsdatatable ">
<tr>
<th style="">Positionsnummer</th>
<th style="">Art</th>
<th style="">Steuer</th>
<th style="">Betrag</th>
</tr>
<ui:param name="rows" value="#{steuerListController.getRows()}"></ui:param>
<ui:repeat value="#{rows}" var="row">
<tr>
<td>
#{row.item['filenumber']}
</td>
<td style="text-align: center;">
#{row.item['activity.type']}
</td>
<td>
#{row.item['tax.code']}
</td>
<td style="text-align: right;">
<h:outputText value="#{row.item['amount']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
<h:outputText value=" #{workflowController.workitem.item['invoice.currency']}" />
</td>
</tr>
</ui:repeat>
</table>
</h:panelGroup>
</ui:composition>

View file

@ -0,0 +1,50 @@
<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">
<!-- Zeigt alle verknüpften Rechnungen an -->
<h:panelGroup layout="block" styleClass="imixs-form-section" id="paymentlist">
<table class="imixsdatatable ">
<tr>
<th style="">Rechnung</th>
<th style="width: 100px;">Status</th>
<th style="">#{message.modified}</th>
</tr>
<ui:param name="invoices"
value="#{workitemLinkController.getReferences('$modelversion:rechnungsausgang*')}"></ui:param>
<ui:repeat var="invoice_stub" value="#{invoices}">
<ui:param name="invoice" value="#{steuerListController.loadInvoice(invoice_stub.getUniqueID())}">
</ui:param>
<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

@ -1,97 +0,0 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:i="http://java.sun.com/jsf/composite/imixs"
xmlns:marty="http://java.sun.com/jsf/composite/marty">
<!-- Shows the op liste fo rthe current dbtr.number -->
<h:commandScript name="calculateOpSummary" execute="invoiceRefHolder_ID" render="opcalculater_id" />
<h:panelGroup layout="block" styleClass="imixs-form-section" id="oplist-table" binding="#{opListContainer}">
<h:selectOneRadio value="#{opListController.currencyFilter}" style="float:right;">
<f:selectItem itemLabel="Alle" itemValue="-" />
<f:selectItem itemLabel="EUR" itemValue="EUR" />
<f:selectItem itemLabel="USD" itemValue="USD" />
<f:ajax render="oplist-table" />
</h:selectOneRadio>
<table style="width: 100%; margin: 5px;">
<tr>
<th style="text-align: left;">Positionsnummer</th>
<th style="text-align: left;">ATC-Nummer</th>
<th style="text-align: left;">Anmelder</th>
<th style="text-align: left;">ZOLL (ER)</th>
<th style="text-align: left;">EUST (ER)</th>
<th style="text-align: right;">Fällig wann</th>
<th style="width: 40px;">Eingangsrechnung</th>
<th style="width: 100px;">Status</th>
</tr>
<!--
.setItemValue("invoice.text", "LA-HOL-2401-002")
.setItemValue("invoice.atc", "ATC400058750120242452")
.setItemValue("dbtr.name", "D18317 Big Belly Solar GmbH")
.setItemValue("invoice.ZOLL", 18.45)
.setItemValue("invoice.EUST", 0)
.setItemValue("invoice.number", ""));
-->
<ui:param name="invoices" value="#{zollListController.getInvoices()}"></ui:param>
<ui:repeat value="#{invoices}" var="invoice">
<tr>
<td>
#{invoice.item['invoice.text']}
</td>
<td>
#{invoice.item['invoice.atc']}
</td>
<td>
#{invoice.item['dbtr.name']}
</td>
<td>
#{invoice.item['invoice.zoll']}
</td>
<td>
#{invoice.item['invoice.eust']}
</td>
<td>
#{invoice.item['invoice.number']}
</td>
</tr>
</ui:repeat>
<tr style="border-top: 1px solid #ccc;">
<td />
<td />
<td />
<td />
<td><strong>Summary</strong></td>
<!-- Invoice total -->
</tr>
</table>
</h:panelGroup>
</ui:composition>

View file

@ -0,0 +1,116 @@
package com.alexanderlogistics.xml;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.exceptions.ModelException;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.ProcessingErrorException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import com.alexanderlogistics.InvoiceUtil;
import com.alexanderlogistics.KreditorDebitorService;
import com.alexanderlogistics.mahnlauf.MahnlaufService;
/**
* Testet den Import Vorgang anhand einer Cargosoft XML Datei
*
*
*
* @author rsoika
*/
@RunWith(MockitoJUnitRunner.class)
public class EAkteImportTester {
@Spy
@InjectMocks
private CargosoftXMLEAkteImportService service;
@Mock
private DocumentService documentService;
@Mock
private KreditorDebitorService kreditorDebitorService;
@Mock
private MahnlaufService mahnlaufService;
@Before
public void setUp() {
// Mock protected Methode 'alreadyImported' -> always false
Mockito.when(service.alreadyImported(Mockito.anyString())).thenReturn(false);
}
/**
* Ein Einfacher test
*
* @throws TransformerException
* @throws XPathExpressionException
* @throws ModelException
* @throws PluginException
* @throws ProcessingErrorException
* @throws AccessDeniedException
*
* @throws Exception
*/
@Test
public void testEAkteBasic() throws Exception {
ItemCollection source = new ItemCollection();
String fileName = "Abgabenbescheid-IM-GCA-2408-116N-001-ATC400012650820242452-_20240806164256864_DEBUG.xml";
byte[] xmlContent = readTestFile("cargosoft/" + fileName);
assertNotNull(xmlContent);
// Act
ItemCollection result = service.createWorkitem(source, fileName, xmlContent, new HashMap<>());
// Assert
assertNotNull(result);
assertEquals("001", result.getItemValueString("mandant.id"));
// test Rows
List<ItemCollection> rows = InvoiceUtil.explodeChildList(result);
assertNotNull(rows);
assertEquals(2, rows.size());
ItemCollection row1 = rows.get(0);
ItemCollection row2 = rows.get(1);
assertEquals("LA-ZEL-2403-004", row1.getItemValueString("filenumber"));
assertEquals("LA-ZEL-2403-00", row2.getItemValueString("filenumber"));
assertEquals("ZOLL", row1.getItemValueString("activity.type"));
assertEquals("EUST", row2.getItemValueString("activity.type"));
}
/**
* Hilfsmethode zum einlesen einer xml test datei
*
* @return
* @throws IOException
*/
private byte[] readTestFile(String filename) throws IOException {
// Load the file from the resources folder
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(filename);
byte[] data = inputStream.readAllBytes();
inputStream.close();
return data;
}
}

View file

@ -119,6 +119,7 @@ public class InvoiceImportTester {
assertNotNull(result); assertNotNull(result);
assertEquals("001", result.getItemValueString("mandant.id")); assertEquals("001", result.getItemValueString("mandant.id"));
assertEquals("ATC400012650820242452", result.getItemValueString("invoice.atc.number")); assertEquals("ATC400012650820242452", result.getItemValueString("invoice.atc.number"));
assertEquals(3752.95, result.getItemValueDouble("invoice.total"), 0.0);
// test Rows // test Rows
List<ItemCollection> rows = InvoiceUtil.explodeChildList(result); List<ItemCollection> rows = InvoiceUtil.explodeChildList(result);
@ -129,16 +130,18 @@ public class InvoiceImportTester {
assertEquals("EUST", row1.getItemValueString("category")); assertEquals("EUST", row1.getItemValueString("category"));
assertEquals("EUST", row1.getItemValueString("BillingCode")); assertEquals("EUST", row1.getItemValueString("BillingCode"));
// test BillingText // test BillingText
List<String> billingTextList = row1.getItemValue("BillingText"); List<String> billingTextList = row1.getItemValue("BillingText");
assertEquals(2, billingTextList.size()); assertEquals(2, billingTextList.size());
// test ATC Number // test ATC Number
assertEquals("ATC400012650820242452", row1.getItemValueString("atc.number")); assertEquals("ATC400012650820242452", row1.getItemValueString("atc.number"));
// Umsatz
assertEquals(3591.34, row1.getItemValueDouble("datev.umsatz"), 0.0);
ItemCollection row2 = rows.get(1); ItemCollection row2 = rows.get(1);
assertEquals("IM-GCA-2408-116", row2.getItemValueString("datev.text")); assertEquals("IM-GCA-2408-116", row2.getItemValueString("datev.text"));
assertEquals("SONST", row2.getItemValueString("category")); assertEquals("SONST", row2.getItemValueString("category"));
// Umsatz
assertEquals(161.61, row2.getItemValueDouble("datev.umsatz"), 0.0);
} }
/** /**
@ -151,13 +154,7 @@ public class InvoiceImportTester {
// Load the file from the resources folder // Load the file from the resources folder
ClassLoader classLoader = getClass().getClassLoader(); ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(filename); InputStream inputStream = classLoader.getResourceAsStream(filename);
// Convert the InputStream to a String
// String xmlContent = new String(inputStream.readAllBytes(),
// StandardCharsets.UTF_8);
byte[] data = inputStream.readAllBytes(); byte[] data = inputStream.readAllBytes();
// Optional: Close the InputStream
inputStream.close(); inputStream.close();
return data; return data;
} }

View file

@ -0,0 +1,61 @@
<?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>20240806164256864</MessageID>
<MessageDate>
<DateTime>2024-08-06T16:42:56</DateTime>
</MessageDate>
<Provider>
<CargoSoftDatabaseVersion>2023.2g</CargoSoftDatabaseVersion>
<CargoServiceVersion>${build.version.number}</CargoServiceVersion>
</Provider>
</Message>
<EFile id="2212599">
<Description>
<DocDate>
<DateTime>2024-08-06T09:55:54</DateTime>
</DocDate>
<DocType>ATLAS</DocType>
<Title>STEUERBESCHEID NEU</Title>
</Description>
<Attachments>
<Attachment id="2274901">
<Version>1</Version>
<Filename>Abgabenbescheid-IM-GCA-2408-116N-001-ATC400012650820242452.pdf</Filename>
<MimeType>application/pdf</MimeType>
<FileDate>
<DateTime>2024-08-07T02:13:27</DateTime>
</FileDate>
<Md5>11FC8B85115554F79215A3138FDBF7C</Md5>
<FileSize>78362</FileSize>
</Attachment>
</Attachments>
<References>
<Reference type="client">001</Reference>
<Reference type="cs_voucher_number">254038</Reference>
<Reference type="cs_voucher_type">LR</Reference>
<Reference type="cs_address_number" />
<Reference type="currency">EUR</Reference>
<Reference type="voucherdate" />
<Reference type="total_net_amount">3591.34</Reference>
<Reference type="total_tax_amount">161.34</Reference>
<Reference type="currency_rate" />
<Reference type="reference">ATC400012650820242452</Reference>
<Reference type="booking_period">202408</Reference>
<Reference type="booking_date">20240806000000</Reference>
<Reference type="booking_text">ATLAS Steuerbescheid</Reference>
<Reference type="row_1_activity_type">ZOLL</Reference>
<Reference type="row_1_amount">3591.340</Reference>
<Reference type="row_1_tax_code">0</Reference>
<Reference type="row_1_cs_filenumber">LA-ZEL-2403-004</Reference>
<Reference type="row_2_activity_type">EUST</Reference>
<Reference type="row_2_amount">91.340</Reference>
<Reference type="row_2_tax_code">0</Reference>
<Reference type="row_2_cs_filenumber">LA-ZEL-2403-00</Reference>
</References>
</EFile>
</CargoSoftEFile>

File diff suppressed because it is too large Load diff

View file

@ -28,6 +28,7 @@
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ApplicationPlugin]]></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.plugins.CommentPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.profile.MailPlugin]]></imixs:value> <imixs:value><![CDATA[org.imixs.marty.profile.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[com.alexanderlogistics.SteuerbescheidPlugin]]></imixs:value>
</imixs:item> </imixs:item>
<open-bpmn:auto-align>true</open-bpmn:auto-align> <open-bpmn:auto-align>true</open-bpmn:auto-align>
</bpmn2:extensionElements> </bpmn2:extensionElements>
@ -88,54 +89,21 @@ th { font-weight: bold;}
<bpmn2:flowNodeRef>IntermediateCatchEvent_3</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>IntermediateCatchEvent_3</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_4</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>Task_4</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>EndEvent_3</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>EndEvent_3</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>Task_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>IntermediateCatchEvent_8</bpmn2:flowNodeRef>
<bpmn2:documentation id="documentation_CzcdHw"/> <bpmn2:documentation id="documentation_CzcdHw"/>
<bpmn2:flowNodeRef>DataObject_2</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>DataObject_2</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_XJbC5A</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>event_XJbC5A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>textAnnotation_HwSKqQ</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>textAnnotation_HwSKqQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_9fS4uw</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>event_9fS4uw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_mPDOzA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_u86UTw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_5riVig</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>gateway_mga6sg</bpmn2:flowNodeRef>
</bpmn2:lane> </bpmn2:lane>
</bpmn2:laneSet> </bpmn2:laneSet>
<bpmn2:startEvent id="StartEvent_1" name="Start"> <bpmn2:startEvent id="StartEvent_1" name="Start">
<bpmn2:documentation id="documentation_VE46fA"/> <bpmn2:documentation id="documentation_VE46fA"/>
<bpmn2:outgoing>sequenceFlow_M5IK7w</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_M5IK7w</bpmn2:outgoing>
</bpmn2:startEvent> </bpmn2:startEvent>
<bpmn2:task id="Task_2" imixs:processid="1100" name="Erledigt">
<bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>invoice.number</itemvalue> <itemvalue>dbtr.number</itemvalue> <itemvalue>dbtr.name</itemvalue> (<itemvalue>invoice.currency</itemvalue> <itemvalue format="#,###,##0.00" locale="de_DE">invoice.total</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:value><![CDATA[process.manager]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="keyaddreadfields" type="xs:string"/>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic_read]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
<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>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-briefcase||||typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_4"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_17</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_l0egag</bpmn2:incoming>
</bpmn2:task>
<bpmn2:endEvent id="EndEvent_3" name="End"> <bpmn2:endEvent id="EndEvent_3" name="End">
<bpmn2:incoming>SequenceFlow_19</bpmn2:incoming> <bpmn2:incoming>SequenceFlow_19</bpmn2:incoming>
<bpmn2:documentation id="documentation_1dAjDA"/> <bpmn2:documentation id="documentation_1dAjDA"/>
@ -143,7 +111,7 @@ th { font-weight: bold;}
<bpmn2:task id="Task_1" imixs:processid="1000" name="Offen"> <bpmn2:task id="Task_1" imixs:processid="1000" name="Offen">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string"> <imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>invoice.number</itemvalue> <itemvalue>dbtr.number</itemvalue> <itemvalue>dbtr.name</itemvalue> (<itemvalue>invoice.currency</itemvalue> <itemvalue format="#,###,##0.00" locale="de_DE">invoice.total</itemvalue>) ]]></imixs:value> <imixs:value><![CDATA[<itemvalue>invoice.number</itemvalue> <itemvalue>invoice.booking_text</itemvalue> <itemvalue>invoice.atc.number</itemvalue>]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txteditorid" type="xs:string"> <imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[alexander/form_basic]]></imixs:value> <imixs:value><![CDATA[alexander/form_basic]]></imixs:value>
@ -176,13 +144,10 @@ th { font-weight: bold;}
<bpmn2:documentation id="Documentation_3"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation> <bpmn2:documentation id="Documentation_3"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:outgoing>sequenceFlow_EzmiPA</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_EzmiPA</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_rbVgQA</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_rbVgQA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_GN53Kg</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_J0GjVg</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:task id="Task_4" imixs:processid="1900" name="Abgeschlossen"> <bpmn2:task id="Task_4" imixs:processid="1900" name="Abgeschlossen">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>invoice.number</itemvalue> <itemvalue>dbtr.number</itemvalue> <itemvalue>dbtr.name</itemvalue> (<itemvalue>invoice.currency</itemvalue> <itemvalue format="#,###,##0.00" locale="de_DE">invoice.total</itemvalue>) ]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean"> <imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value> <imixs:value>true</imixs:value>
</imixs:item> </imixs:item>
@ -201,45 +166,17 @@ th { font-weight: bold;}
<imixs:item name="namaddreadaccess" type="xs:string"> <imixs:item name="namaddreadaccess" type="xs:string">
<imixs:value><![CDATA[{process:?:member}]]></imixs:value> <imixs:value><![CDATA[{process:?:member}]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>invoice.number</itemvalue> <itemvalue>invoice.booking_text</itemvalue> <itemvalue>invoice.atc.number</itemvalue>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements> </bpmn2:extensionElements>
<bpmn2:documentation id="Documentation_16"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation> <bpmn2:documentation id="Documentation_16"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_18</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_19</bpmn2:outgoing> <bpmn2:outgoing>SequenceFlow_19</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_oRy3qw</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_8" imixs:activityid="50" name="Abschließen">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Zoll-Liste abgeschlossen]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="CDATA">
<imixs:value><![CDATA[<item name="action">home</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:incoming>SequenceFlow_17</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_18</bpmn2:outgoing>
<bpmn2:documentation id="documentation_yZdzqg"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_17" sourceRef="Task_2" targetRef="IntermediateCatchEvent_8">
<bpmn2:documentation id="documentation_Slk2fA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="SequenceFlow_18" sourceRef="IntermediateCatchEvent_8" targetRef="Task_4">
<bpmn2:documentation id="documentation_lonRSg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="SequenceFlow_19" sourceRef="Task_4" targetRef="EndEvent_3"> <bpmn2:sequenceFlow id="SequenceFlow_19" sourceRef="Task_4" targetRef="EndEvent_3">
<bpmn2:documentation id="documentation_nsa2IQ"/> <bpmn2:documentation id="documentation_nsa2IQ"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_2" imixs:activityid="10" name="Speichern">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="CDATA">
<imixs:value><![CDATA[Aktualisiert]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
<bpmn2:documentation id="documentation_2oZTGQ"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_1" sourceRef="IntermediateCatchEvent_2" targetRef="Task_2">
<bpmn2:documentation id="documentation_ZiY0pQ"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" imixs:activityid="900" name="[create]"> <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" imixs:activityid="900" name="[create]">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtmailsubject" type="xs:string"> <imixs:item name="txtmailsubject" type="xs:string">
@ -268,22 +205,33 @@ th { font-weight: bold;}
<bpmn2:documentation id="Documentation_5"><![CDATA[<?xml version="1.0"?> <bpmn2:documentation id="Documentation_5"><![CDATA[<?xml version="1.0"?>
<imixs-form> <imixs-form>
<imixs-form-section columns="3" label="Rechnungsdaten"> <imixs-form-section columns="3" label="Rechnungsdaten">
<item name="invoice.text" type="text" label="Text:" readonly="true"/> <item name="invoice.booking_text" type="text" label="Text:" readonly="true"/>
<item name="dbtr.name" type="text" label="Debitor:" readonly="true"/> <item name="cdtr.name" type="text" label="Kreditor:" readonly="true"/>
<item name="dbtr.number" type="text" required="true" label="Debitor-Nummer:" readonly="true"/> <item name="cdtr.number" type="text" label="Kreditor-Nummer:" readonly="true"/>
</imixs-form-section> </imixs-form-section>
<imixs-form-section columns="3" label=""> <imixs-form-section columns="3" label="">
<item name="invoice.number" type="text" label="Rechnungsnummer:" readonly="true" /> <item name="invoice.number" type="text" label="Rechnungsnummer:" readonly="true" />
<item name="invoice.date" type="date" label="Rechnungsdatum:" readonly="true" /> <item name="invoice.atc.number" type="date" label="ATC Nr.:" readonly="true" />
<item name="invoice.duedate" type="date" label="Fälligkeit:" readonly="true"/> <item name="invoice.date" type="date" label="Beleg Datum:" readonly="true"/>
<item name="invoice.booking_date" type="date" label="Buchungs Datum:" readonly="true"/>
</imixs-form-section>
<imixs-form-section columns="3" label="">
<item name="invoice.currency" type="text" label="Währung:" readonly="true" />
<item name="invoice.total.net" type="currency" label="Total Net Amount:" readonly="true" />
<item name="invoice.total.tax" type="currency" label="Total Tax Amount:" readonly="true"/>
<item name="invoice.rate" type="text" label="Kurs:" readonly="true"/>
</imixs-form-section> </imixs-form-section>
<imixs-form-section> <imixs-form-section>
<item name="" type="custom" path="alexander/spaceref" label="Bereich:" /> <item name="" type="custom" path="alexander/spaceref" label="Bereich:" />
</imixs-form-section> </imixs-form-section>
<imixs-form-section label="Positionen" path="alexander/section_datevbuchung" /> <imixs-form-section label="Positionen" path="alexander/section_steuerbescheid_details" />
<imixs-form-section label="Ausgangsrechnungen" path="alexander/section_steuerbescheid_invoices" />
</imixs-form>]]></bpmn2:documentation> </imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_2"/> <bpmn2:dataState id="DataState_2"/>
</bpmn2:dataObject> </bpmn2:dataObject>
@ -300,15 +248,13 @@ th { font-weight: bold;}
</imixs:item> </imixs:item>
</bpmn2:extensionElements> </bpmn2:extensionElements>
<bpmn2:documentation id="documentation_vQEymA"/> <bpmn2:documentation id="documentation_vQEymA"/>
<bpmn2:incoming>sequenceFlow_EzmiPA</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_DzOb8A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_l0egag</bpmn2:outgoing> <bpmn2:incoming>sequenceFlow_hLkSLA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_oRy3qw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent> </bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_EzmiPA" sourceRef="Task_1" targetRef="event_XJbC5A"> <bpmn2:sequenceFlow id="sequenceFlow_EzmiPA" sourceRef="Task_1" targetRef="gateway_5riVig">
<bpmn2:documentation id="documentation_HhV7dA"/> <bpmn2:documentation id="documentation_HhV7dA"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_l0egag" sourceRef="event_XJbC5A" targetRef="Task_2">
<bpmn2:documentation id="documentation_Cv5oCQ"/>
</bpmn2:sequenceFlow>
<bpmn2:textAnnotation id="textAnnotation_HwSKqQ" textFormat=""> <bpmn2:textAnnotation id="textAnnotation_HwSKqQ" textFormat="">
<bpmn2:text id="text_wYoZbw"><![CDATA[Zollanmeldung / Steuerbescheid vom Zollamt <bpmn2:text id="text_wYoZbw"><![CDATA[Zollanmeldung / Steuerbescheid vom Zollamt
Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text> Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text>
@ -332,9 +278,75 @@ Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text>
<bpmn2:association id="association_2r0omw" sourceRef="DataObject_2" targetRef="Task_4"> <bpmn2:association id="association_2r0omw" sourceRef="DataObject_2" targetRef="Task_4">
<bpmn2:documentation id="documentation_6aRYjQ"/> <bpmn2:documentation id="documentation_6aRYjQ"/>
</bpmn2:association> </bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_GN53Kg" sourceRef="IntermediateCatchEvent_3" targetRef="Task_1"> <bpmn2:sequenceFlow id="sequenceFlow_GN53Kg" sourceRef="IntermediateCatchEvent_3" targetRef="gateway_mga6sg">
<bpmn2:documentation id="documentation_G2kAIg"/> <bpmn2:documentation id="documentation_G2kAIg"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_mPDOzA" imixs:activityid="90" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="CDATA">
<imixs:value><![CDATA[Aktualisiert]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="numactivitydelay" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledbaseobject" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keyactivitydelayunit" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_gM58xw"/>
<bpmn2:timerEventDefinition id="timerEventDefinition_eAHUHQ"/>
<bpmn2:incoming>sequenceFlow_tpBldQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_lrR0DQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:exclusiveGateway default="sequenceFlow_KOaBSw" gatewayDirection="Diverging" id="gateway_u86UTw" name="vollständig abgerechnet?">
<bpmn2:documentation id="documentation_vbNvdg"/>
<bpmn2:incoming>sequenceFlow_lrR0DQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_KOaBSw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_hLkSLA</bpmn2:outgoing>
</bpmn2:exclusiveGateway>
<bpmn2:eventBasedGateway gatewayDirection="Diverging" id="gateway_5riVig" name="">
<bpmn2:documentation id="documentation_JdIxzw"/>
<bpmn2:incoming>sequenceFlow_EzmiPA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_tpBldQ</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_DzOb8A</bpmn2:outgoing>
</bpmn2:eventBasedGateway>
<bpmn2:sequenceFlow id="sequenceFlow_tpBldQ" sourceRef="gateway_5riVig" targetRef="event_mPDOzA">
<bpmn2:documentation id="documentation_k1OXzw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_DzOb8A" sourceRef="gateway_5riVig" targetRef="event_XJbC5A">
<bpmn2:documentation id="documentation_PIzh7A"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_lrR0DQ" sourceRef="event_mPDOzA" targetRef="gateway_u86UTw">
<bpmn2:documentation id="documentation_aEF9IQ"/>
</bpmn2:sequenceFlow>
<bpmn2:exclusiveGateway gatewayDirection="Diverging" id="gateway_mga6sg" name="">
<bpmn2:documentation id="documentation_VaP40g"/>
<bpmn2:incoming>sequenceFlow_GN53Kg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_J0GjVg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_KOaBSw</bpmn2:incoming>
</bpmn2:exclusiveGateway>
<bpmn2:sequenceFlow id="sequenceFlow_J0GjVg" sourceRef="gateway_mga6sg" targetRef="Task_1">
<bpmn2:documentation id="documentation_hBvCbw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_KOaBSw" sourceRef="gateway_u86UTw" targetRef="gateway_mga6sg">
<bpmn2:documentation id="documentation_grVRmA"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_hLkSLA" name="saldo &lt;= 0" sourceRef="gateway_u86UTw" targetRef="event_XJbC5A">
<bpmn2:documentation id="documentation_5PQFXg"/>
<bpmn2:conditionExpression id="formalExpression_0iO8Rw" xsi:type="bpmn2:tFormalExpression"><![CDATA[workitem.getItemValueDouble('invoice.saldo')<=0]]></bpmn2:conditionExpression>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_oRy3qw" sourceRef="event_XJbC5A" targetRef="Task_4">
<bpmn2:documentation id="documentation_mjwqGA"/>
</bpmn2:sequenceFlow>
</bpmn2:process> </bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="Default Process Diagram"> <bpmndi:BPMNDiagram id="BPMNDiagram_1" name="Default Process Diagram">
<bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_1"> <bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_1">
@ -345,23 +357,20 @@ Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text>
<dc:Bounds height="520.0" width="1340.0" x="130.0" y="150.0"/> <dc:Bounds height="520.0" width="1340.0" x="130.0" y="150.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_1"> <bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_1">
<dc:Bounds height="36.0" width="36.0" x="227.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="187.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="197.5" y="337.0"/> <dc:Bounds height="20.0" width="100.0" x="157.5" y="337.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_1" id="BPMNShape_Task_1"> <bpmndi:BPMNShape bpmnElement="Task_1" id="BPMNShape_Task_1">
<dc:Bounds height="50.0" width="110.0" x="410.0" y="290.0"/> <dc:Bounds height="50.0" width="110.0" x="510.0" y="290.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_3" id="BPMNShape_EndEvent_2"> <bpmndi:BPMNShape bpmnElement="EndEvent_3" id="BPMNShape_EndEvent_2">
<dc:Bounds height="36.0" width="36.0" x="1297.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="1397.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_85" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_85" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1268.0" y="337.0"/> <dc:Bounds height="20.0" width="100.0" x="1368.0" y="337.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_2">
<dc:Bounds height="50.0" width="110.0" x="800.0" y="290.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Message_2" id="BPMNShape_Message_1"> <bpmndi:BPMNShape bpmnElement="Message_2" id="BPMNShape_Message_1">
<dc:Bounds height="20.0" width="30.0" x="119.0" y="59.0"/> <dc:Bounds height="20.0" width="30.0" x="119.0" y="59.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_35"> <bpmndi:BPMNLabel id="BPMNLabel_35">
@ -375,99 +384,120 @@ Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_4" id="BPMNShape_Task_4"> <bpmndi:BPMNShape bpmnElement="Task_4" id="BPMNShape_Task_4">
<dc:Bounds height="50.0" width="110.0" x="1120.0" y="290.0"/> <dc:Bounds height="50.0" width="110.0" x="1220.0" y="290.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_8" id="BPMNShape_IntermediateCatchEvent_8">
<dc:Bounds height="36.0" width="36.0" x="987.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_31" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="954.0" y="337.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_2" id="BPMNShape_IntermediateCatchEvent_2">
<dc:Bounds height="36.0" width="36.0" x="837.0" y="377.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_6" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="805.0" y="416.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_3" id="BPMNShape_IntermediateCatchEvent_3"> <bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_3" id="BPMNShape_IntermediateCatchEvent_3">
<dc:Bounds height="36.0" width="36.0" x="297.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="277.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_8" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_8" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="271.5" y="340.0"/> <dc:Bounds height="20.0" width="100.0" x="240.5" y="339.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="DataObject_2" id="BPMNShape_DataObject_2"> <bpmndi:BPMNShape bpmnElement="DataObject_2" id="BPMNShape_DataObject_2">
<dc:Bounds height="50.0" width="35.0" x="740.0" y="500.0"/> <dc:Bounds height="50.0" width="35.0" x="860.0" y="170.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_12"> <bpmndi:BPMNLabel id="BPMNLabel_12">
<dc:Bounds height="20.0" width="100.0" x="708.0" y="550.0"/> <dc:Bounds height="20.0" width="100.0" x="828.0" y="220.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_17" id="BPMNEdge_SequenceFlow_17" sourceElement="BPMNShape_Task_2" targetElement="BPMNShape_IntermediateCatchEvent_8">
<bpmndi:BPMNLabel id="BPMNLabel_36"/>
<di:waypoint x="910.0" y="315.0"/>
<di:waypoint x="987.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_IntermediateCatchEvent_8" targetElement="BPMNShape_Task_4">
<bpmndi:BPMNLabel id="BPMNLabel_38"/>
<di:waypoint x="1023.0" y="315.0"/>
<di:waypoint x="1120.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_Task_4" targetElement="BPMNShape_EndEvent_2"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_Task_4" targetElement="BPMNShape_EndEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_39"/> <bpmndi:BPMNLabel id="BPMNLabel_39"/>
<di:waypoint x="1230.0" y="315.0"/> <di:waypoint x="1330.0" y="315.0"/>
<di:waypoint x="1297.0" y="315.0"/> <di:waypoint x="1397.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1" id="BPMNEdge_SequenceFlow_1" sourceElement="BPMNShape_IntermediateCatchEvent_2" targetElement="BPMNShape_Task_2">
<bpmndi:BPMNLabel id="BPMNLabel_7"/>
<di:waypoint x="855.0" y="377.0"/>
<di:waypoint x="855.0" y="340.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="Association_3" id="BPMNEdge_Association_3" sourceElement="BPMNShape_DataObject_2" targetElement="BPMNShape_Task_1"> <bpmndi:BPMNEdge bpmnElement="Association_3" id="BPMNEdge_Association_3" sourceElement="BPMNShape_DataObject_2" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_14"/> <bpmndi:BPMNLabel id="BPMNLabel_14"/>
<di:waypoint x="740.0" y="525.0"/> <di:waypoint x="860.0" y="197.0"/>
<di:waypoint x="630.0" y="525.0"/> <di:waypoint x="575.0" y="197.0"/>
<di:waypoint x="630.0" y="315.0"/> <di:waypoint x="575.0" y="290.0"/>
<di:waypoint x="520.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_XJbC5A" id="BPMNShape_3fLqIw"> <bpmndi:BPMNShape bpmnElement="event_XJbC5A" id="BPMNShape_3fLqIw">
<dc:Bounds height="36.0" width="36.0" x="687.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="787.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_fzXPOA"> <bpmndi:BPMNLabel id="BPMNLabel_fzXPOA">
<dc:Bounds height="20.0" width="100.0" x="655.0" y="336.0"/> <dc:Bounds height="20.0" width="100.0" x="755.0" y="336.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_EzmiPA" id="BPMNEdge_2O039Q" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_3fLqIw"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_EzmiPA" id="BPMNEdge_2O039Q" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_0nZTrw">
<di:waypoint x="520.0" y="315.0"/> <di:waypoint x="620.0" y="315.0"/>
<di:waypoint x="687.0" y="315.0"/> <di:waypoint x="680.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_l0egag" id="BPMNEdge_WIvxbQ" sourceElement="BPMNShape_3fLqIw" targetElement="BPMNShape_Task_2">
<di:waypoint x="723.0" y="315.0"/>
<di:waypoint x="800.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="textAnnotation_HwSKqQ" id="BPMNShape_6f4UmA"> <bpmndi:BPMNShape bpmnElement="textAnnotation_HwSKqQ" id="BPMNShape_6f4UmA">
<dc:Bounds height="80.0" width="193.0" x="180.0" y="490.0"/> <dc:Bounds height="80.0" width="193.0" x="180.0" y="490.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_9fS4uw" id="BPMNShape_JSwhvQ"> <bpmndi:BPMNShape bpmnElement="event_9fS4uw" id="BPMNShape_JSwhvQ">
<dc:Bounds height="36.0" width="36.0" x="447.0" y="377.0"/> <dc:Bounds height="36.0" width="36.0" x="547.0" y="377.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_jZmJsw"> <bpmndi:BPMNLabel id="BPMNLabel_jZmJsw">
<dc:Bounds height="20.0" width="100.0" x="415.0" y="416.0"/> <dc:Bounds height="20.0" width="100.0" x="515.0" y="416.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rbVgQA" id="BPMNEdge_6PdUYA" sourceElement="BPMNShape_JSwhvQ" targetElement="BPMNShape_Task_1"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_rbVgQA" id="BPMNEdge_6PdUYA" sourceElement="BPMNShape_JSwhvQ" targetElement="BPMNShape_Task_1">
<di:waypoint x="465.0" y="377.0"/> <di:waypoint x="565.0" y="377.0"/>
<di:waypoint x="465.0" y="357.0"/> <di:waypoint x="565.0" y="340.0"/>
<di:waypoint x="465.0" y="340.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M5IK7w" id="BPMNEdge_gTIgKQ" sourceElement="BPMNShape_1" targetElement="BPMNShape_IntermediateCatchEvent_3"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_M5IK7w" id="BPMNEdge_gTIgKQ" sourceElement="BPMNShape_1" targetElement="BPMNShape_IntermediateCatchEvent_3">
<di:waypoint x="263.0" y="315.0"/> <di:waypoint x="223.0" y="315.0"/>
<di:waypoint x="297.0" y="315.0"/> <di:waypoint x="277.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_2r0omw" id="BPMNEdge_pgk0IA" sourceElement="BPMNShape_DataObject_2" targetElement="BPMNShape_Task_4"> <bpmndi:BPMNEdge bpmnElement="association_2r0omw" id="BPMNEdge_pgk0IA" sourceElement="BPMNShape_DataObject_2" targetElement="BPMNShape_Task_4">
<di:waypoint x="775.0" y="525.0"/> <di:waypoint x="895.0" y="197.0"/>
<di:waypoint x="1162.0" y="525.0"/> <di:waypoint x="1271.0" y="197.0"/>
<di:waypoint x="1162.0" y="340.0"/> <di:waypoint x="1271.0" y="290.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_GN53Kg" id="BPMNEdge_RtC0kg" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_1"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_GN53Kg" id="BPMNEdge_RtC0kg" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_08Wt6Q">
<di:waypoint x="333.0" y="315.0"/> <di:waypoint x="313.0" y="315.0"/>
<di:waypoint x="410.0" y="315.0"/> <di:waypoint x="380.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_mPDOzA" id="BPMNShape_U8jhww">
<dc:Bounds height="36.0" width="36.0" x="687.0" y="377.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_yIL0YQ">
<dc:Bounds height="20.0" width="100.0" x="655.0" y="416.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_u86UTw" id="BPMNShape_wjKX5g">
<dc:Bounds height="50.0" width="50.0" x="680.0" y="480.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_b9l1Rg">
<dc:Bounds height="20.0" width="100.0" x="655.0" y="533.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_5riVig" id="BPMNShape_0nZTrw">
<dc:Bounds height="50.0" width="50.0" x="680.0" y="290.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_MWTutw">
<dc:Bounds height="20.0" width="100.0" x="655.0" y="343.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_tpBldQ" id="BPMNEdge_jBRFmA" sourceElement="BPMNShape_0nZTrw" targetElement="BPMNShape_U8jhww">
<di:waypoint x="705.0" y="340.0"/>
<di:waypoint x="705.0" y="377.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_DzOb8A" id="BPMNEdge_AZTV0g" sourceElement="BPMNShape_0nZTrw" targetElement="BPMNShape_3fLqIw">
<di:waypoint x="730.0" y="315.0"/>
<di:waypoint x="787.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_lrR0DQ" id="BPMNEdge_Idg6TA" sourceElement="BPMNShape_U8jhww" targetElement="BPMNShape_wjKX5g">
<di:waypoint x="705.0" y="413.0"/>
<di:waypoint x="705.0" y="480.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_mga6sg" id="BPMNShape_08Wt6Q">
<dc:Bounds height="50.0" width="50.0" x="380.0" y="290.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_WhuHsQ">
<dc:Bounds height="20.0" width="100.0" x="357.0" y="342.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_J0GjVg" id="BPMNEdge_UbMu5Q" sourceElement="BPMNShape_08Wt6Q" targetElement="BPMNShape_Task_1">
<di:waypoint x="430.0" y="315.0"/>
<di:waypoint x="510.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_KOaBSw" id="BPMNEdge_CxmUrw" sourceElement="BPMNShape_wjKX5g" targetElement="BPMNShape_08Wt6Q">
<di:waypoint x="680.0" y="505.0"/>
<di:waypoint x="405.0" y="505.0"/>
<di:waypoint x="405.0" y="340.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_hLkSLA" id="BPMNEdge_0mnAaw" sourceElement="BPMNShape_wjKX5g" targetElement="BPMNShape_3fLqIw">
<di:waypoint x="730.0" y="505.0"/>
<di:waypoint x="806.0" y="505.0"/>
<di:waypoint x="806.0" y="332.9722007556114"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_oRy3qw" id="BPMNEdge_5EEWMw" sourceElement="BPMNShape_3fLqIw" targetElement="BPMNShape_Task_4">
<di:waypoint x="823.0" y="315.0"/>
<di:waypoint x="1220.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1"> <bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">