neue DATEV Importfunktion für ATC Rechnungen

This commit is contained in:
Ralph Soika 2024-04-16 15:43:17 +02:00
parent 6dc793e337
commit e66b3add86
10 changed files with 318 additions and 224 deletions

View file

@ -98,9 +98,9 @@ public class CargosoftSplitAdapter implements SignalAdapter {
List<String> buchungsPersioden = new ArrayList<String>(); List<String> buchungsPersioden = new ArrayList<String>();
// add haupt buchungsperiode // add haupt buchungsperiode
buchungsPersioden.add(workitem.getItemValueString("invoice.period")); buchungsPersioden.add(workitem.getItemValueString("invoice.period"));
List<ItemCollection> positionsTabelle = InvoicePlugin.explodeChildList(workitem); List<ItemCollection> positionsTabelle = InvoiceUtil.explodeChildList(workitem);
for (ItemCollection posItem : positionsTabelle) { for (ItemCollection posItem : positionsTabelle) {
String childPeriod = posItem.getItemValueString(InvoicePlugin.ITEM_INVOICE_PERIOD); String childPeriod = posItem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD);
if (!childPeriod.isEmpty() && !buchungsPersioden.contains(childPeriod)) { if (!childPeriod.isEmpty() && !buchungsPersioden.contains(childPeriod)) {
buchungsPersioden.add(childPeriod); buchungsPersioden.add(childPeriod);
} }
@ -128,7 +128,7 @@ public class CargosoftSplitAdapter implements SignalAdapter {
// float tax=0; // float tax=0;
while (iter.hasNext()) { while (iter.hasNext()) {
ItemCollection posItem = iter.next(); ItemCollection posItem = iter.next();
String childPeriod = posItem.getItemValueString(InvoicePlugin.ITEM_INVOICE_PERIOD); String childPeriod = posItem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD);
if (childPeriod.isEmpty() || buchungsPeriode.equals(childPeriod)) { if (childPeriod.isEmpty() || buchungsPeriode.equals(childPeriod)) {
posItem.setItemValue("numpos", row); posItem.setItemValue("numpos", row);
splitPositionen.add(posItem.getAllItems()); splitPositionen.add(posItem.getAllItems());
@ -139,7 +139,7 @@ public class CargosoftSplitAdapter implements SignalAdapter {
} }
} }
workitemSubProcess.setItemValue(InvoicePlugin.ITEM_INVOICE_PERIOD, buchungsPeriode); workitemSubProcess.setItemValue(InvoiceUtil.ITEM_INVOICE_PERIOD, buchungsPeriode);
// jetzt muessen wir die neue Rechnungssumme bilden.... // jetzt muessen wir die neue Rechnungssumme bilden....
workitemSubProcess.setItemValue("order.total", total); workitemSubProcess.setItemValue("order.total", total);
workitemSubProcess.setItemValue("order.total.tax", total - netto); workitemSubProcess.setItemValue("order.total.tax", total - netto);
@ -147,7 +147,7 @@ public class CargosoftSplitAdapter implements SignalAdapter {
logger.info("......create cargosoft split buchung - invoice.period=" + buchungsPeriode); logger.info("......create cargosoft split buchung - invoice.period=" + buchungsPeriode);
// update the child items (reduzierte Positionstabelle) // update the child items (reduzierte Positionstabelle)
workitemSubProcess.setItemValue(InvoicePlugin.CHILD_ITEM_PROPERTY, splitPositionen); workitemSubProcess.setItemValue(InvoiceUtil.CHILD_ITEM_PROPERTY, splitPositionen);
workitemSubProcess.model(model).task(taskID).event(eventID); workitemSubProcess.model(model).task(taskID).event(eventID);
workitemSubProcess.replaceItemValue(WorkflowService.UNIQUEIDREF, workitem.getUniqueID()); workitemSubProcess.replaceItemValue(WorkflowService.UNIQUEIDREF, workitem.getUniqueID());

View file

@ -27,17 +27,21 @@ public class InvoiceOutgoingPlugin extends AbstractPlugin {
**/ **/
@Override @Override
public ItemCollection run(ItemCollection workitem, ItemCollection event) throws PluginException { public ItemCollection run(ItemCollection workitem, ItemCollection event) throws PluginException {
// Update Invoice.positions
InvoiceUtil.updateInvoicePositions(workitem);
String dbtrNumber = workitem.getItemValueString("dbtr.number"); String dbtrNumber = workitem.getItemValueString("dbtr.number");
ItemCollection debitor = kreditorService.findDebitor(dbtrNumber); ItemCollection debitor = kreditorService.findDebitor(dbtrNumber);
if (debitor!=null) { if (debitor != null) {
// update mail // update mail
workitem.setItemValue("dbtr.mail", debitor.getItemValueString("cdtr.mail")); workitem.setItemValue("dbtr.mail", debitor.getItemValueString("cdtr.mail"));
} }
String img=""; String img = "";
if (workitem.getItemValueBoolean("invoice.protest")) { if (workitem.getItemValueBoolean("invoice.protest")) {
img = img + "<img title='Reklamiert' src=\"/layout/icons/icon106.png\">"; img = img + "<img title='Reklamiert' src=\"/layout/icons/icon106.png\">";
} }
workitem.setItemValue("_img", img); workitem.setItemValue("_img", img);
return workitem; return workitem;

View file

@ -1,9 +1,7 @@
package com.alexanderlogistics; package com.alexanderlogistics;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -30,6 +28,10 @@ import org.imixs.workflow.faces.util.ResourceBundleHandler;
* geprüft ob die Rechnungsnummer schon einmal vorkam. Falls ja, wird eine * geprüft ob die Rechnungsnummer schon einmal vorkam. Falls ja, wird eine
* Warnung ausgegeben. Der Benutzer kann diese dann skippen. * Warnung ausgegeben. Der Benutzer kann diese dann skippen.
* <p> * <p>
* Zusäztlich berechnet das Plugin das feld invoice.positions mit einer Value
* liste der Positionsnummern. Dieses Feld wird indiziert, so dass gezielt nach
* Positionsnummern gesucht werden kann.
* <p>
* 2.2.22 - Das Plugin erzeugt auch das Feld _img welches die Images von * 2.2.22 - Das Plugin erzeugt auch das Feld _img welches die Images von
* Sofortüberweisung, Mahnung und Ablehnung anzeigt. * Sofortüberweisung, Mahnung und Ablehnung anzeigt.
* *
@ -44,9 +46,7 @@ public class InvoicePlugin extends AbstractPlugin {
public static final int TASK_SACHPRUEFUNG = 5200; public static final int TASK_SACHPRUEFUNG = 5200;
public static final int TASK_SACHPRUEFUNG_DELEGATION = 5210; public static final int TASK_SACHPRUEFUNG_DELEGATION = 5210;
public static final int EVENT_FREIGEBEN = 20; public static final int EVENT_FREIGEBEN = 20;
public static final String ITEM_INVOICE_PERIOD = "invoice.period";
public static final String CHILD_ITEM_PROPERTY = "_ChildItems";
public static final String ERROR_MISSING_DATA = "MISSING_DATA"; public static final String ERROR_MISSING_DATA = "MISSING_DATA";
public static final String ERROR_DUPPLICATE_INVOICE_NUMBER = "DUPPLICATE_INVOICE_NUMBER"; public static final String ERROR_DUPPLICATE_INVOICE_NUMBER = "DUPPLICATE_INVOICE_NUMBER";
public static final String ERROR_NEW_IBANBIC = "NEW_IBANBIC"; public static final String ERROR_NEW_IBANBIC = "NEW_IBANBIC";
@ -73,6 +73,9 @@ public class InvoicePlugin extends AbstractPlugin {
updateImg(workitem); updateImg(workitem);
// Update Invoice.positions
InvoiceUtil.updateInvoicePositions(workitem);
// skip if validaten tag is required=false // skip if validaten tag is required=false
ItemCollection evalItemCollection = this.getWorkflowService().evalWorkflowResult(event, "validation", workitem); ItemCollection evalItemCollection = this.getWorkflowService().evalWorkflowResult(event, "validation", workitem);
if (evalItemCollection != null) { if (evalItemCollection != null) {
@ -94,9 +97,7 @@ public class InvoicePlugin extends AbstractPlugin {
// doppelte Rechnungsnummer prüfen // doppelte Rechnungsnummer prüfen
if (workitem.getTaskID() == TASK_ERFASSUNG) { if (workitem.getTaskID() == TASK_ERFASSUNG) {
validateInvoiceNumber(workitem); validateInvoiceNumber(workitem);
checkIBANNumber(workitem); checkIBANNumber(workitem);
} }
if (workitem.getTaskID() == TASK_ERFASSUNG || ((workitem.getTaskID() == TASK_SACHPRUEFUNG if (workitem.getTaskID() == TASK_ERFASSUNG || ((workitem.getTaskID() == TASK_SACHPRUEFUNG
@ -104,7 +105,7 @@ public class InvoicePlugin extends AbstractPlugin {
&& workitem.getEventID() == EVENT_FREIGEBEN)) { && workitem.getEventID() == EVENT_FREIGEBEN)) {
// Buchungsperiode auf plausi prüfen // Buchungsperiode auf plausi prüfen
if (isCargoRechnung(workitem) && "workitem".equals(workitem.getType())) { if (isCargoRechnung(workitem) && "workitem".equals(workitem.getType())) {
validateBuchungsperiode(workitem.getItemValueString(ITEM_INVOICE_PERIOD)); validateBuchungsperiode(workitem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD));
} }
// Cargosoft Kreditorennnummer prüfen // Cargosoft Kreditorennnummer prüfen
if (isCargoRechnung(workitem)) { if (isCargoRechnung(workitem)) {
@ -118,7 +119,7 @@ public class InvoicePlugin extends AbstractPlugin {
if (isCargoRechnung(workitem) if (isCargoRechnung(workitem)
&& ((workitem.getTaskID() == TASK_SACHPRUEFUNG || workitem.getTaskID() == TASK_SACHPRUEFUNG_DELEGATION) && ((workitem.getTaskID() == TASK_SACHPRUEFUNG || workitem.getTaskID() == TASK_SACHPRUEFUNG_DELEGATION)
&& workitem.getEventID() == EVENT_FREIGEBEN)) { && workitem.getEventID() == EVENT_FREIGEBEN)) {
List<ItemCollection> childs = explodeChildList(workitem); List<ItemCollection> childs = InvoiceUtil.explodeChildList(workitem);
for (ItemCollection posItem : childs) { for (ItemCollection posItem : childs) {
if (posItem.getItemValueString("name").trim().isEmpty()) { if (posItem.getItemValueString("name").trim().isEmpty()) {
// throw a plugin exception - because name is missing! // throw a plugin exception - because name is missing!
@ -159,8 +160,8 @@ public class InvoicePlugin extends AbstractPlugin {
} }
// Buchunsperiode // Buchunsperiode
if (!posItem.getItemValueString(ITEM_INVOICE_PERIOD).trim().isEmpty()) { if (!posItem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD).trim().isEmpty()) {
validateBuchungsperiode(posItem.getItemValueString(ITEM_INVOICE_PERIOD)); validateBuchungsperiode(posItem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD));
} }
} }
@ -222,16 +223,6 @@ public class InvoicePlugin extends AbstractPlugin {
} }
workitem.setItemValue("_img", img); workitem.setItemValue("_img", img);
/*
* for (String entry: eventLog) { // sofortüberweisung if (entry.contains(".96")
* && !img.contains("100.png")) {
* img=img+"<img src=\"/layout/icons/icon100.png\">"; } // mahnen if
* (entry.contains(".95") && !img.contains("074.png")) {
* img=img+"<img src=\"/layout/icons/icon074.png\">"; } // ablehnen if
* (entry.contains("5100.90") && !img.contains("031.png")) {
* img=img+"<img src=\"/layout/icons/icon031.png\">"; } }
* workitem.setItemValue("_img", img);
*/
} }
/** /**
@ -352,7 +343,7 @@ public class InvoicePlugin extends AbstractPlugin {
// wenn bereits eine Überneahme angedroht wurde dann übernehemen! // wenn bereits eine Überneahme angedroht wurde dann übernehemen!
if (!overtakeIBAN.isEmpty()) { if (!overtakeIBAN.isEmpty()) {
kreditorService.addNewIBANBIC(cdtrNumber, iban, bic); kreditorService.addNewIBANBIC(cdtrNumber, iban, bic);
workitem.setItemValue("ibanbic.overtake",""); workitem.setItemValue("ibanbic.overtake", "");
return; return;
} }
@ -383,8 +374,6 @@ public class InvoicePlugin extends AbstractPlugin {
} }
/** /**
* Hilfsmethod prüft ob die cdtr.nummer mit einer nummer aus der Cargosoft * Hilfsmethod prüft ob die cdtr.nummer mit einer nummer aus der Cargosoft
* Import Datei übereinstimmt. * Import Datei übereinstimmt.
@ -422,24 +411,6 @@ public class InvoicePlugin extends AbstractPlugin {
} }
/**
* converts the Map List of a workitem into a List of ItemCollectons
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
protected static List<ItemCollection> explodeChildList(ItemCollection workitem) {
// convert current list of childItems into ItemCollection elements
ArrayList<ItemCollection> childItems = new ArrayList<ItemCollection>();
List<Object> mapOrderItems = workitem.getItemValue(CHILD_ITEM_PROPERTY);
for (Object mapOderItem : mapOrderItems) {
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
childItems.add(itemCol);
}
}
return childItems;
}
/** /**
* This method returns true if the current workitem is a Cargosoft Invoice. * This method returns true if the current workitem is a Cargosoft Invoice.
* *

View file

@ -2,24 +2,39 @@ package com.alexanderlogistics;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.imixs.workflow.ItemCollection;
/** /**
* Rundungs Methode * Hilfsmethoden für die Berechnung und Validierung von Ein und
* Ausgangsrechnugnen
* *
* See: https://stackoverflow.com/questions/2808535/round-a-double-to-2-decimal-places * - Rundungs Methode
* - Berechnung der Positionsnummern
* - Explode Childitems
*
* See:
* https://stackoverflow.com/questions/2808535/round-a-double-to-2-decimal-places
* *
* @author rsoika * @author rsoika
* *
*/ */
public class InvoiceUtil { public class InvoiceUtil {
public static final String CHILD_ITEM_PROPERTY = "_ChildItems";
public static final String ITEM_INVOICE_PERIOD = "invoice.period";
public static final String ITEM_INVOICE_POSITIONS = "invoice.positions";
public static double round(double value) { public static double round(double value) {
BigDecimal bd = BigDecimal.valueOf(value); BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(2, RoundingMode.HALF_UP); bd = bd.setScale(2, RoundingMode.HALF_UP);
return bd.doubleValue(); return bd.doubleValue();
} }
/** /**
* Hilfsmethode zum validieren der Mailadresse * Hilfsmethode zum validieren der Mailadresse
* *
@ -27,16 +42,15 @@ public class InvoiceUtil {
* @return * @return
*/ */
public static boolean validateEmail(String emailAddress) { public static boolean validateEmail(String emailAddress) {
//String regexPattern = "^(.+)@(\\S+)$"; // String regexPattern = "^(.+)@(\\S+)$";
String regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@" String regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@"
+ "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$"; + "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";
return Pattern.compile(regexPattern) return Pattern.compile(regexPattern)
.matcher(emailAddress) .matcher(emailAddress)
.matches(); .matches();
} }
@Deprecated @Deprecated
public static double roundConservative(double value) { public static double roundConservative(double value) {
value = value * 100; value = value * 100;
@ -44,4 +58,53 @@ public class InvoiceUtil {
return (double) tmp / 100; return (double) tmp / 100;
} }
/**
* converts the Map List of a workitem into a List of ItemCollectons
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List<ItemCollection> explodeChildList(ItemCollection workitem) {
// convert current list of childItems into ItemCollection elements
ArrayList<ItemCollection> childItems = new ArrayList<ItemCollection>();
List<Object> mapOrderItems = workitem.getItemValue(CHILD_ITEM_PROPERTY);
for (Object mapOderItem : mapOrderItems) {
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
childItems.add(itemCol);
}
}
return childItems;
}
/**
* Diese Methode berechnet das feld 'invoice.positions' welches eine Valueliste
* mit allen Positionsnummern aus dem Childliste enthält.
* Es wird sowohl für Ausgangs wie Eingangsrechnungen genutzt.
* Das feld wird indiziert, so dass eine gezielte Suche nach positiosnummern
* möglich ist.
*
* @param workitem
*/
public static void updateInvoicePositions(ItemCollection workitem) {
List<String> posList = new ArrayList<String>();
List<ItemCollection> childs = InvoiceUtil.explodeChildList(workitem);
for (ItemCollection posItem : childs) {
String posName = "";
// Ausgangsrechnung - item=datev.text
// Eingangsrechnugn - item=name
if (posItem.hasItem("datev.text")) {
posName = posItem.getItemValueString("datev.text").trim();
} else {
posName = posItem.getItemValueString("name").trim();
}
if (!posName.isEmpty()) {
posList.add(posName);
}
}
// update invoice.positions
workitem.setItemValue(ITEM_INVOICE_POSITIONS, posList);
}
} }

View file

@ -94,9 +94,13 @@ import com.alexanderlogistics.KreditorDebitorService;
* - event * - event
* *
* <datev-cargosoft-import name= * <datev-cargosoft-import name=
* "model">rechnungseingang-dwc-1.0</datev-cargosoft-import> * "model-invoice">rechnungsausgang-dwc-1.0</datev-cargosoft-import>
* <datev-cargosoft-import name="task">1000</datev-cargosoft-import> * <datev-cargosoft-import name="task-invoice">1000</datev-cargosoft-import>
* <datev-cargosoft-import name="event">100</datev-cargosoft-import> * <datev-cargosoft-import name="event-invoice">100</datev-cargosoft-import>
* <datev-cargosoft-import name=
* "model-tax">rechnungsausgang-dwc-1.0</datev-cargosoft-import>
* <datev-cargosoft-import name="task-tax">1000</datev-cargosoft-import>
* <datev-cargosoft-import name="event-tax">100</datev-cargosoft-import>
* *
* @version 1.0 * @version 1.0
* @author rsoika * @author rsoika
@ -122,11 +126,12 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
@Inject @Inject
TeamService teamService; TeamService teamService;
private String INITIAL_MODEL_VERSION; private String INITIAL_MODEL_VERSION_INVOICE;
private int INITIAL_TASK_ID_INVOICE;
private int INITIAL_TASK_ID; private int INITIAL_EVENT_ID_INVOICE;
private String INITIAL_MODEL_VERSION_TAX;
private int INITIAL_EVENT_ID; private int INITIAL_TASK_ID_TAX;
private int INITIAL_EVENT_ID_TAX;
/** /**
* This method finds or create the Datev Export and adds a reference * This method finds or create the Datev Export and adds a reference
@ -140,25 +145,44 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
logger.info("...parse datev file import..."); logger.info("...parse datev file import...");
// Set default values // Set default values
INITIAL_MODEL_VERSION = "rechnungsausgang-de-1.0"; INITIAL_MODEL_VERSION_INVOICE = "rechnungsausgang-de-1.0";
INITIAL_TASK_ID = 5001; INITIAL_TASK_ID_INVOICE = 5001;
INITIAL_EVENT_ID = 980; INITIAL_EVENT_ID_INVOICE = 980;
INITIAL_MODEL_VERSION_TAX = "zollanmeldung-de-1.0";
INITIAL_TASK_ID_TAX = 1000;
INITIAL_EVENT_ID_TAX = 980;
// Try to read the optional cargosoft import options... // Try to read the optional cargosoft import options...
ItemCollection evalItemCollection = workflowService.evalWorkflowResult(event, "datev-cargosoft-import", ItemCollection evalItemCollection = workflowService.evalWorkflowResult(event, "datev-cargosoft-import",
workitem, false); workitem, false);
if (evalItemCollection != null) { if (evalItemCollection != null) {
INITIAL_MODEL_VERSION = evalItemCollection.getItemValueString("model"); // Ausgangsrechnung
if (INITIAL_MODEL_VERSION.isEmpty()) { INITIAL_MODEL_VERSION_INVOICE = evalItemCollection.getItemValueString("model-invoice");
INITIAL_MODEL_VERSION = "rechnungsausgang-de-1.0"; // set default if (INITIAL_MODEL_VERSION_INVOICE.isEmpty()) {
INITIAL_MODEL_VERSION_INVOICE = "rechnungsausgang-de-1.0"; // set default
} }
INITIAL_TASK_ID = evalItemCollection.getItemValueInteger("task"); INITIAL_TASK_ID_INVOICE = evalItemCollection.getItemValueInteger("task-invoice");
if (INITIAL_TASK_ID == 0) { if (INITIAL_TASK_ID_INVOICE == 0) {
INITIAL_TASK_ID = 5001; // set default INITIAL_TASK_ID_INVOICE = 5001; // set default
} }
INITIAL_EVENT_ID = evalItemCollection.getItemValueInteger("event"); INITIAL_EVENT_ID_INVOICE = evalItemCollection.getItemValueInteger("event-invoice");
if (INITIAL_EVENT_ID == 0) { if (INITIAL_EVENT_ID_INVOICE == 0) {
INITIAL_EVENT_ID = 980; // set default INITIAL_EVENT_ID_INVOICE = 980; // set default
}
// Zollanmeldung
INITIAL_MODEL_VERSION_TAX = evalItemCollection.getItemValueString("model-tax");
if (INITIAL_MODEL_VERSION_TAX.isEmpty()) {
INITIAL_MODEL_VERSION_TAX = "zollanmeldung-de-1.0"; // set default
}
INITIAL_TASK_ID_TAX = evalItemCollection.getItemValueInteger("task-tax");
if (INITIAL_TASK_ID_TAX == 0) {
INITIAL_TASK_ID_TAX = 1000; // set default
}
INITIAL_EVENT_ID_TAX = evalItemCollection.getItemValueInteger("event-tax");
if (INITIAL_EVENT_ID_TAX == 0) {
INITIAL_EVENT_ID_TAX = 980; // set default
} }
} }
try { try {
@ -286,7 +310,8 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
double basisumsatz = parseBetrag(DatevImportAdapter.csvVal(dataList[4])); double basisumsatz = parseBetrag(DatevImportAdapter.csvVal(dataList[4]));
// Skip Eingangsrechnungen // Skip Eingangsrechnungen
if (!gegenKonto.startsWith("1")) { // Wenn es aber eine ATC Belegnummer ist dann ist es doch interessant
if (!gegenKonto.startsWith("1") && !belegNummer.startsWith("ATC")) {
eingangsrechnungen++; eingangsrechnungen++;
// skip // skip
continue; continue;
@ -337,7 +362,7 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
logger.info("...close workitem...."); logger.info("...close workitem....");
// nein - also invoice schließen // nein - also invoice schließen
closeInvoiceWorkitem(invoiceWorkitem, splitBuchungen, spacePosMappings); closeDatevWorkitem(invoiceWorkitem, splitBuchungen, spacePosMappings);
invoiceWorkitem = null; invoiceWorkitem = null;
// neue Splitbuchungstabelle anlegen // neue Splitbuchungstabelle anlegen
splitBuchungen = new ArrayList<ItemCollection>(); splitBuchungen = new ArrayList<ItemCollection>();
@ -355,7 +380,7 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
} }
} // wile end } // wile end
closeInvoiceWorkitem(invoiceWorkitem, splitBuchungen, spacePosMappings); closeDatevWorkitem(invoiceWorkitem, splitBuchungen, spacePosMappings);
} catch (IOException | ParseException e) { } catch (IOException | ParseException e) {
throw new PluginException(DatevCargosoftImportAdapter.class.getName(), throw new PluginException(DatevCargosoftImportAdapter.class.getName(),
@ -426,7 +451,11 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
throws AdapterException { throws AdapterException {
// test if invoice was already imported before // test if invoice was already imported before
String sQuery = "((type:workitem OR type:workitemarchive) AND $modelversion:rechnungsausgang* AND invoice.number:\"" // zollanmeldung
// String sQuery = "((type:workitem OR type:workitemarchive) AND
// $modelversion:rechnungsausgang* AND invoice.number:\""
// + belegNummer + "\")";
String sQuery = "((type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang* OR $modelversion:zollanmeldung*) AND invoice.number:\""
+ belegNummer + "\")"; + belegNummer + "\")";
try { try {
// find the textblock... // find the textblock...
@ -481,10 +510,10 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
* @throws ProcessingErrorException * @throws ProcessingErrorException
* @throws AccessDeniedException * @throws AccessDeniedException
*/ */
private void closeInvoiceWorkitem(ItemCollection invoiceWorkitem, List<ItemCollection> splitBuchungen, private void closeDatevWorkitem(ItemCollection datevWorkitem, List<ItemCollection> splitBuchungen,
Map<String, List<String>> spacePosMappings) Map<String, List<String>> spacePosMappings)
throws AccessDeniedException, ProcessingErrorException, PluginException, ModelException { throws AccessDeniedException, ProcessingErrorException, PluginException, ModelException {
if (invoiceWorkitem == null) { if (datevWorkitem == null) {
return; // no op return; // no op
} }
@ -499,30 +528,30 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
} }
total = InvoiceUtil.round(total); total = InvoiceUtil.round(total);
invoiceWorkitem.setItemValue("invoice.total", total); datevWorkitem.setItemValue("invoice.total", total);
invoiceWorkitem.setItemValue("invoice.saldo", total); datevWorkitem.setItemValue("invoice.saldo", total);
// implode die Splitbuchungen // implode die Splitbuchungen
implodeChildList(invoiceWorkitem, splitBuchungen); implodeChildList(datevWorkitem, splitBuchungen);
// set dbtr.name // set dbtr.name
ItemCollection dbtrItemCol = kreditorDebitorService ItemCollection dbtrItemCol = kreditorDebitorService
.findDebitor(invoiceWorkitem.getItemValueString("dbtr.number")); .findDebitor(datevWorkitem.getItemValueString("dbtr.number"));
if (dbtrItemCol != null) { if (dbtrItemCol != null) {
invoiceWorkitem.setItemValue("dbtr.name", dbtrItemCol.getItemValueString("_VENDOR_Name")); datevWorkitem.setItemValue("dbtr.name", dbtrItemCol.getItemValueString("_VENDOR_Name"));
// Anhand der Creditoren Stammdaten errrechnen wir die Sprache für diese // Anhand der Creditoren Stammdaten errrechnen wir die Sprache für diese
// Rechnung // Rechnung
String country = dbtrItemCol.getItemValueString("_VENDOR_COUNTRY"); String country = dbtrItemCol.getItemValueString("_VENDOR_COUNTRY");
invoiceWorkitem.setItemValue("dbtr.country", country); datevWorkitem.setItemValue("dbtr.country", country);
if (country.equalsIgnoreCase("de") || country.equalsIgnoreCase("ch") || country.equalsIgnoreCase("at")) { if (country.equalsIgnoreCase("de") || country.equalsIgnoreCase("ch") || country.equalsIgnoreCase("at")) {
invoiceWorkitem.setItemValue("invoice.language", "DE"); datevWorkitem.setItemValue("invoice.language", "DE");
} else { } else {
invoiceWorkitem.setItemValue("invoice.language", "EN"); datevWorkitem.setItemValue("invoice.language", "EN");
} }
} }
// Jezt noch das Space mapping // Jezt noch das Space mapping
// dazu kucken wir in alle spaces den config wert 'pos.mapping' // dazu kucken wir in alle spaces den config wert 'pos.mapping'
String text = invoiceWorkitem.getItemValueString("invoice.text"); String text = datevWorkitem.getItemValueString("invoice.text");
if (!text.isEmpty()) { if (!text.isEmpty()) {
boolean found = false; boolean found = false;
for (Map.Entry<String, List<String>> entry : spacePosMappings.entrySet()) { for (Map.Entry<String, List<String>> entry : spacePosMappings.entrySet()) {
@ -532,7 +561,7 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
Matcher m = p.matcher(text); Matcher m = p.matcher(text);
if (m.find()) { if (m.find()) {
// we have a match // we have a match
invoiceWorkitem.setItemValue("space.ref", entry.getKey()); datevWorkitem.setItemValue("space.ref", entry.getKey());
found = true; found = true;
break; break;
} }
@ -543,8 +572,18 @@ public class DatevCargosoftImportAdapter implements SignalAdapter {
} }
} }
// Processe die Invoice // Processe die Invoice
invoiceWorkitem.model(INITIAL_MODEL_VERSION).task(INITIAL_TASK_ID).event(INITIAL_EVENT_ID); // In Abhängkeit von der Belegart 'Ausgangsrechnung' | 'Zollanmeldung' wird ein
workflowService.processWorkItem(invoiceWorkitem); // neues Workitem erzeugt.
String belegNummer = datevWorkitem.getItemValueString("invoice.number");
if (belegNummer.startsWith("ATC")) {
// Zollanmeldung
datevWorkitem.model(INITIAL_MODEL_VERSION_TAX).task(INITIAL_TASK_ID_TAX).event(INITIAL_EVENT_ID_TAX);
} else {
// Normale Ausgangsrechnung
datevWorkitem.model(INITIAL_MODEL_VERSION_INVOICE).task(INITIAL_TASK_ID_INVOICE)
.event(INITIAL_EVENT_ID_INVOICE);
}
workflowService.processWorkItem(datevWorkitem);
} }

View file

@ -2,12 +2,12 @@
# 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 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.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,$lasteventdate,payment.type 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
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 office.search.noanalyze=invoice.number,invoice.number.stripped,invoice.positions
############################## ##############################
# Marty Setup # Marty Setup

View file

@ -6,7 +6,7 @@
<CstmrCdtTrfInitn> <CstmrCdtTrfInitn>
<GrpHdr> <GrpHdr>
<MsgId>bf073e72asdf512c4d60af7740872036</MsgId> <MsgId>bf073e72asdf512c4d60af7740872036</MsgId>
<CreDtTm>2024-04-03T15:23:47</CreDtTm> <CreDtTm>2024-04-12T09:10:53</CreDtTm>
<NbOfTxs>3</NbOfTxs> <NbOfTxs>3</NbOfTxs>
<CtrlSum>655.90</CtrlSum> <CtrlSum>655.90</CtrlSum>
<InitgPty> <InitgPty>
@ -23,7 +23,7 @@
<Cd>SEPA</Cd> <Cd>SEPA</Cd>
</SvcLvl> </SvcLvl>
</PmtTpInf> </PmtTpInf>
<ReqdExctnDt>2024-04-03</ReqdExctnDt> <ReqdExctnDt>2024-04-12</ReqdExctnDt>
<Dbtr> <Dbtr>
<Nm>Targo Bank</Nm> <Nm>Targo Bank</Nm>
</Dbtr> </Dbtr>

View file

@ -6,7 +6,7 @@
<CstmrCdtTrfInitn> <CstmrCdtTrfInitn>
<GrpHdr> <GrpHdr>
<MsgId>bf073e72asdf512c4d60af7740872036</MsgId> <MsgId>bf073e72asdf512c4d60af7740872036</MsgId>
<CreDtTm>2024-04-03T15:23:47</CreDtTm> <CreDtTm>2024-04-12T09:10:53</CreDtTm>
<NbOfTxs>3</NbOfTxs> <NbOfTxs>3</NbOfTxs>
<CtrlSum>655.90</CtrlSum> <CtrlSum>655.90</CtrlSum>
<InitgPty> <InitgPty>
@ -23,7 +23,7 @@
<Cd>SEPA</Cd> <Cd>SEPA</Cd>
</SvcLvl> </SvcLvl>
</PmtTpInf> </PmtTpInf>
<ReqdExctnDt>2024-04-03</ReqdExctnDt> <ReqdExctnDt>2024-04-12</ReqdExctnDt>
<Dbtr> <Dbtr>
<Nm>Targo Bank</Nm> <Nm>Targo Bank</Nm>
</Dbtr> </Dbtr>

View file

@ -507,9 +507,13 @@ if (workitem['$file.count'][0]!=1) {
<imixs:value><![CDATA[Import Buchungstapel]]></imixs:value> <imixs:value><![CDATA[Import Buchungstapel]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtactivityresult" type="xs:string"> <imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<datev-cargosoft-import name="model">rechnungsausgang-dwc-1.0</datev-cargosoft-import> <imixs:value><![CDATA[<datev-cargosoft-import name="model-invoice">rechnungsausgang-dwc-1.0</datev-cargosoft-import>
<datev-cargosoft-import name="task">5001</datev-cargosoft-import> <datev-cargosoft-import name="task-invoice">5001</datev-cargosoft-import>
<datev-cargosoft-import name="event">980</datev-cargosoft-import>]]></imixs:value> <datev-cargosoft-import name="event-invoice">980</datev-cargosoft-import>
<datev-cargosoft-import name="model-tax">zollanmeldung-dwc-1.0</datev-cargosoft-import>
<datev-cargosoft-import name="task-tax">1000</datev-cargosoft-import>
<datev-cargosoft-import name="event-tax">980</datev-cargosoft-import>]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtmailsubject" type="xs:string"> <imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/> <imixs:value/>
@ -805,7 +809,6 @@ if (workitem['$file.count'][0]!=1) {
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_IntermediateCatchEvent_3"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_IntermediateCatchEvent_3">
<bpmndi:BPMNLabel id="BPMNLabel_40"/> <bpmndi:BPMNLabel id="BPMNLabel_40"/>
<di:waypoint x="710.0" y="343.0"/> <di:waypoint x="710.0" y="343.0"/>
<di:waypoint x="745.0" y="343.0"/>
<di:waypoint x="780.0" y="343.0"/> <di:waypoint x="780.0" y="343.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_IntermediateCatchEvent_7"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_IntermediateCatchEvent_7">
@ -817,7 +820,6 @@ if (workitem['$file.count'][0]!=1) {
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_20" id="BPMNEdge_SequenceFlow_20" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_ExclusiveGateway_3"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_20" id="BPMNEdge_SequenceFlow_20" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_ExclusiveGateway_3">
<bpmndi:BPMNLabel id="BPMNLabel_43"/> <bpmndi:BPMNLabel id="BPMNLabel_43"/>
<di:waypoint x="816.0" y="343.0"/> <di:waypoint x="816.0" y="343.0"/>
<di:waypoint x="858.0" y="343.0"/>
<di:waypoint x="900.0" y="343.0"/> <di:waypoint x="900.0" y="343.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_21" id="BPMNEdge_SequenceFlow_21" sourceElement="BPMNShape_IntermediateCatchEvent_7" targetElement="BPMNShape_ExclusiveGateway_3"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_21" id="BPMNEdge_SequenceFlow_21" sourceElement="BPMNShape_IntermediateCatchEvent_7" targetElement="BPMNShape_ExclusiveGateway_3">

View file

@ -2,7 +2,7 @@
<!-- 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"> <!-- 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> <bpmn2:extensionElements>
<imixs:item name="txtworkflowmodelversion" type="xs:string"> <imixs:item name="txtworkflowmodelversion" type="xs:string">
<imixs:value><![CDATA[zollliste-de-1.0]]></imixs:value> <imixs:value><![CDATA[zollanmeldung-de-1.0]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string"> <imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Prozess-Verantwortliche|process.manager]]></imixs:value> <imixs:value><![CDATA[Prozess-Verantwortliche|process.manager]]></imixs:value>
@ -72,15 +72,15 @@ th { font-weight: bold;}
</html>]]></bpmn2:documentation> </html>]]></bpmn2:documentation>
</bpmn2:message> </bpmn2:message>
<bpmn2:collaboration id="Collaboration_1" name="Zahlungseingang"> <bpmn2:collaboration id="Collaboration_1" name="Zahlungseingang">
<bpmn2:participant id="Participant_1" name="Zoll-Liste" processRef="Process_1"> <bpmn2:participant id="Participant_1" name="Zollanmeldung" processRef="Process_1">
<bpmn2:documentation id="documentation_9Tp5PA"/> <bpmn2:documentation id="documentation_9Tp5PA"/>
</bpmn2:participant> </bpmn2:participant>
<bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/> <bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/>
</bpmn2:collaboration> </bpmn2:collaboration>
<bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="Zoll Liste"> <bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="Zollanmeldung">
<bpmn2:documentation id="documentation_GmzFcw"/> <bpmn2:documentation id="documentation_GmzFcw"/>
</bpmn2:process> </bpmn2:process>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Zoll-Liste"> <bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="Zollanmeldung">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1"> <bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Fachbereich"> <bpmn2:lane id="Lane_1" name="Fachbereich">
<bpmn2:flowNodeRef>StartEvent_1</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>StartEvent_1</bpmn2:flowNodeRef>
@ -94,17 +94,18 @@ th { font-weight: bold;}
<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>event_6fY5IQ</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>textAnnotation_HwSKqQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_9fS4uw</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:outgoing>SequenceFlow_4</bpmn2:outgoing>
<bpmn2:documentation id="documentation_VE46fA"/> <bpmn2:documentation id="documentation_VE46fA"/>
<bpmn2:outgoing>sequenceFlow_M5IK7w</bpmn2:outgoing>
</bpmn2:startEvent> </bpmn2:startEvent>
<bpmn2:task id="Task_2" imixs:processid="1100" name="Erledigt"> <bpmn2:task id="Task_2" imixs:processid="1100" name="Erledigt">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string"> <imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>space.name</itemvalue> - <itemvalue format="dd. MMMM yyyy" locale="DE">date</itemvalue>]]></imixs:value> <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>
<imixs:item name="keyupdateacl" type="xs:boolean"> <imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value> <imixs:value>true</imixs:value>
@ -134,7 +135,6 @@ th { font-weight: bold;}
<bpmn2:incoming>SequenceFlow_1</bpmn2:incoming> <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_17</bpmn2:outgoing> <bpmn2:outgoing>SequenceFlow_17</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_l0egag</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_l0egag</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_GVz3vg</bpmn2:outgoing>
</bpmn2:task> </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>
@ -143,7 +143,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>space.name</itemvalue> - <itemvalue format="dd. MMMM yyyy" locale="DE">date</itemvalue>]]></imixs:value> <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>
<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>
@ -174,18 +174,15 @@ th { font-weight: bold;}
</imixs:item> </imixs:item>
</bpmn2:extensionElements> </bpmn2:extensionElements>
<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:incoming>SequenceFlow_4</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_4Vru0A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_EzmiPA</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_EzmiPA</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_E8t80w</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_rbVgQA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_aXX5dg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_M5IK7w</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:sequenceFlow id="SequenceFlow_4" sourceRef="StartEvent_1" targetRef="Task_1">
<bpmn2:documentation id="documentation_9fyX0g"/>
</bpmn2:sequenceFlow>
<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:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>sequencenumber</itemvalue> <itemvalue>space.name</itemvalue> - <itemvalue format="dd.MM.yyyy">$created</itemvalue>]]></imixs:value> <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>
<imixs:item name="keyupdateacl" type="xs:boolean"> <imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value> <imixs:value>true</imixs:value>
@ -194,7 +191,7 @@ th { font-weight: bold;}
<imixs:item name="keyaddwritefields" type="xs:string"/> <imixs:item name="keyaddwritefields" type="xs:string"/>
<imixs:item name="keyaddreadfields" type="xs:string"/> <imixs:item name="keyaddreadfields" type="xs:string"/>
<imixs:item name="txtimageurl" type="xs:string"> <imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-chart-bar||||typcn-tick,imixs-success]]></imixs:value> <imixs:value><![CDATA[typcn-briefcase||||typcn-tick,imixs-success]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txteditorid" type="xs:string"> <imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic_read]]></imixs:value> <imixs:value><![CDATA[form_basic_read]]></imixs:value>
@ -202,9 +199,6 @@ th { font-weight: bold;}
<imixs:item name="txttype" type="xs:string"> <imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value> <imixs:value><![CDATA[workitemarchive]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtworkflowabstract" type="CDATA">
<imixs:value/>
</imixs:item>
<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>
@ -212,6 +206,7 @@ th { font-weight: bold;}
<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:incoming>SequenceFlow_18</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_19</bpmn2:outgoing> <bpmn2:outgoing>SequenceFlow_19</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_MTbeHA</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_8" imixs:activityid="50" name="Abschließen"> <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_8" imixs:activityid="50" name="Abschließen">
<bpmn2:extensionElements> <bpmn2:extensionElements>
@ -247,7 +242,7 @@ th { font-weight: bold;}
<bpmn2:sequenceFlow id="SequenceFlow_1" sourceRef="IntermediateCatchEvent_2" targetRef="Task_2"> <bpmn2:sequenceFlow id="SequenceFlow_1" sourceRef="IntermediateCatchEvent_2" targetRef="Task_2">
<bpmn2:documentation id="documentation_ZiY0pQ"/> <bpmn2:documentation id="documentation_ZiY0pQ"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" imixs:activityid="100" name="[update]"> <bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_3" imixs:activityid="980" name="[create]">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtmailsubject" type="xs:string"> <imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/> <imixs:value/>
@ -257,107 +252,120 @@ th { font-weight: bold;}
<imixs:value/> <imixs:value/>
</imixs:item> </imixs:item>
<imixs:item name="keypublicresult" type="xs:string"> <imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value> <imixs:value><![CDATA[0]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="rtfresultlog" type="xs:string"> <imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Es wurden neue Positionen hinzugefügt]]></imixs:value> <imixs:value><![CDATA[Beleg importiert]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Mahnwesen</item>]]></imixs:value>
</imixs:item> </imixs:item>
</bpmn2:extensionElements> </bpmn2:extensionElements>
<bpmn2:messageEventDefinition id="MessageEventDefinition_1"/> <bpmn2:messageEventDefinition id="MessageEventDefinition_1"/>
<bpmn2:documentation id="documentation_pNB3fg"/> <bpmn2:documentation id="documentation_pNB3fg"/>
<bpmn2:outgoing>sequenceFlow_4Vru0A</bpmn2:outgoing> <bpmn2:incoming>sequenceFlow_aXX5dg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_MTbeHA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent> </bpmn2:intermediateCatchEvent>
<bpmn2:dataObject id="DataObject_2" name="Form"> <bpmn2:dataObject id="DataObject_2" name="Form">
<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="2"> <imixs-form-section columns="3" label="Rechnungsdaten">
<item name="" type="custom" path="alexander/spaceref" label="Fachbereich:" /> <item name="invoice.text" type="text" label="Text:" readonly="true"/>
<item name="dbtr.name" type="text" label="Debitor:" readonly="true"/>
<item name="date" type="date" label="Fälligkeit:" /> <item name="dbtr.number" type="text" required="true" label="Debitor-Nummer:" readonly="true"/>
<item name="zoll" type="currency" label="Zoll:" />
<item name="eust" type="currency" label="EUST:" />
</imixs-form-section> </imixs-form-section>
<imixs-form-section label="Offene Posten" path="alexander/section_zollliste_details" readonly="false" /> <imixs-form-section columns="3" label="">
<item name="invoice.number" type="text" label="Rechnungsnummer:" readonly="true" />
<item name="invoice.date" type="date" label="Rechnungsdatum:" readonly="true" />
<item name="invoice.duedate" type="date" label="Fälligkeit:" readonly="true"/>
</imixs-form-section>
<imixs-form-section>
<item name="" type="custom" path="alexander/spaceref" label="Bereich:" />
</imixs-form-section>
<imixs-form-section label="Positionen" path="alexander/section_datevbuchung" />
</imixs-form>]]></bpmn2:documentation> </imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_2"/> <bpmn2:dataState id="DataState_2"/>
</bpmn2:dataObject> </bpmn2:dataObject>
<bpmn2:association id="Association_3" sourceRef="DataObject_2" targetRef="Task_1"> <bpmn2:association id="Association_3" sourceRef="DataObject_2" targetRef="Task_1">
<bpmn2:documentation id="documentation_gEJUyg"/> <bpmn2:documentation id="documentation_gEJUyg"/>
</bpmn2:association> </bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_XJbC5A" imixs:activityid="10" name="Erledigt"> <bpmn2:intermediateCatchEvent id="event_XJbC5A" imixs:activityid="20" name="Erledigt">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="rtfresultlog" type="xs:string"> <imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Die offenen Zollrechnungen wurden erstellt.]]></imixs:value> <imixs:value><![CDATA[Die offenen Zollrechnungen wurden erstellt.]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</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_EzmiPA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_l0egag</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_l0egag</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent> </bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_4Vru0A" sourceRef="IntermediateCatchEvent_3" targetRef="Task_1">
<bpmn2:documentation id="documentation_tH3rjg"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_EzmiPA" sourceRef="Task_1" targetRef="event_XJbC5A"> <bpmn2:sequenceFlow id="sequenceFlow_EzmiPA" sourceRef="Task_1" targetRef="event_XJbC5A">
<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:sequenceFlow id="sequenceFlow_l0egag" sourceRef="event_XJbC5A" targetRef="Task_2">
<bpmn2:documentation id="documentation_Cv5oCQ"/> <bpmn2:documentation id="documentation_Cv5oCQ"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_6fY5IQ" imixs:activityid="100" name="[update]"> <bpmn2:textAnnotation id="textAnnotation_HwSKqQ" textFormat="">
<bpmn2:text id="text_wYoZbw"><![CDATA[Zollanmeldung / Steuerbescheid vom Zollamt
Wird täglich über die DATEV OP-Liste importiert]]></bpmn2:text>
<bpmn2:documentation id="documentation_QPl7DA"/>
</bpmn2:textAnnotation>
<bpmn2:intermediateCatchEvent id="event_9fS4uw" imixs:activityid="10" name="Speichern">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="txtmailsubject" type="xs:string"> <imixs:item name="rtfresultlog" type="CDATA">
<imixs:value/> <imixs:value><![CDATA[Aktualisiert]]></imixs:value>
</imixs:item>
<imixs:item name="keymailreceiverfields" type="xs:string"/>
<imixs:item name="rtfmailbody" type="CDATA">
<imixs:value/>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Es wurden neue Positionen hinzugefügt]]></imixs:value>
</imixs:item> </imixs:item>
</bpmn2:extensionElements> </bpmn2:extensionElements>
<bpmn2:messageEventDefinition id="messageEventDefinition_8JwBlw"/> <bpmn2:documentation id="documentation_BnRlgQ"/>
<bpmn2:documentation id="documentation_E3uPXQ"/> <bpmn2:outgoing>sequenceFlow_rbVgQA</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_GVz3vg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_E8t80w</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent> </bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_GVz3vg" sourceRef="Task_2" targetRef="event_6fY5IQ"> <bpmn2:sequenceFlow id="sequenceFlow_rbVgQA" sourceRef="event_9fS4uw" targetRef="Task_1">
<bpmn2:documentation id="documentation_15n2yQ"/> <bpmn2:documentation id="documentation_AcFalQ"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_E8t80w" sourceRef="event_6fY5IQ" targetRef="Task_1"> <bpmn2:sequenceFlow id="sequenceFlow_aXX5dg" sourceRef="Task_1" targetRef="IntermediateCatchEvent_3">
<bpmn2:documentation id="documentation_y0LxEQ"/> <bpmn2:documentation id="documentation_OFz0ng"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_MTbeHA" sourceRef="IntermediateCatchEvent_3" targetRef="Task_4">
<bpmn2:documentation id="documentation_AWXRsQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_M5IK7w" sourceRef="StartEvent_1" targetRef="Task_1">
<bpmn2:documentation id="documentation_nuyBIg"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_2r0omw" sourceRef="DataObject_2" targetRef="Task_4">
<bpmn2:documentation id="documentation_6aRYjQ"/>
</bpmn2:association>
</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">
<bpmndi:BPMNShape bpmnElement="Participant_1" id="BPMNShape_Participant_1" isHorizontal="true"> <bpmndi:BPMNShape bpmnElement="Participant_1" id="BPMNShape_Participant_1" isHorizontal="true">
<dc:Bounds height="500.0" width="1200.0" x="100.0" y="150.0"/> <dc:Bounds height="520.0" width="1370.0" x="100.0" y="150.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true"> <bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true">
<dc:Bounds height="500.0" width="1170.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="177.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="227.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="147.5" y="337.0"/> <dc:Bounds height="20.0" width="100.0" x="197.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="290.0" y="290.0"/> <dc:Bounds height="50.0" width="110.0" x="410.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="1097.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="1297.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="1068.0" y="337.0"/> <dc:Bounds height="20.0" width="100.0" x="1268.0" y="337.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_2"> <bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_2">
<dc:Bounds height="50.0" width="110.0" x="600.0" y="290.0"/> <dc:Bounds height="50.0" width="110.0" x="800.0" y="290.0"/>
</bpmndi:BPMNShape> </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"/>
@ -372,99 +380,106 @@ th { font-weight: bold;}
</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="920.0" y="290.0"/> <dc:Bounds height="50.0" width="110.0" x="1120.0" y="290.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_8" id="BPMNShape_IntermediateCatchEvent_8"> <bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_8" id="BPMNShape_IntermediateCatchEvent_8">
<dc:Bounds height="36.0" width="36.0" x="787.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="987.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_31" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_31" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="754.0" y="337.0"/> <dc:Bounds height="20.0" width="100.0" x="954.0" y="337.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_2" id="BPMNShape_IntermediateCatchEvent_2"> <bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_2" id="BPMNShape_IntermediateCatchEvent_2">
<dc:Bounds height="36.0" width="36.0" x="637.0" y="377.0"/> <dc:Bounds height="36.0" width="36.0" x="837.0" y="377.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_6" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_6" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="605.0" y="416.0"/> <dc:Bounds height="20.0" width="100.0" x="805.0" y="416.0"/>
</bpmndi:BPMNLabel> </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="247.0" y="397.0"/> <dc:Bounds height="36.0" width="36.0" x="447.0" y="217.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="221.5" y="440.0"/> <dc:Bounds height="20.0" width="100.0" x="421.5" y="260.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="230.0" y="230.0"/> <dc:Bounds height="50.0" width="35.0" x="740.0" y="500.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_12"> <bpmndi:BPMNLabel id="BPMNLabel_12">
<dc:Bounds height="20.0" width="100.0" x="198.0" y="280.0"/> <dc:Bounds height="20.0" width="100.0" x="708.0" y="550.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_4" id="BPMNEdge_SequenceFlow_4" sourceElement="BPMNShape_1" targetElement="BPMNShape_Task_1">
<bpmndi:BPMNLabel id="BPMNLabel_11"/>
<di:waypoint x="213.0" y="315.0"/>
<di:waypoint x="290.0" y="315.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_17" id="BPMNEdge_SequenceFlow_17" sourceElement="BPMNShape_Task_2" targetElement="BPMNShape_IntermediateCatchEvent_8"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_17" id="BPMNEdge_SequenceFlow_17" sourceElement="BPMNShape_Task_2" targetElement="BPMNShape_IntermediateCatchEvent_8">
<bpmndi:BPMNLabel id="BPMNLabel_36"/> <bpmndi:BPMNLabel id="BPMNLabel_36"/>
<di:waypoint x="710.0" y="315.0"/> <di:waypoint x="910.0" y="315.0"/>
<di:waypoint x="787.0" y="315.0"/> <di:waypoint x="987.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_IntermediateCatchEvent_8" targetElement="BPMNShape_Task_4"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_18" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_IntermediateCatchEvent_8" targetElement="BPMNShape_Task_4">
<bpmndi:BPMNLabel id="BPMNLabel_38"/> <bpmndi:BPMNLabel id="BPMNLabel_38"/>
<di:waypoint x="823.0" y="315.0"/> <di:waypoint x="1023.0" y="315.0"/>
<di:waypoint x="920.0" y="315.0"/> <di:waypoint x="1120.0" y="315.0"/>
</bpmndi:BPMNEdge> </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="1030.0" y="315.0"/> <di:waypoint x="1230.0" y="315.0"/>
<di:waypoint x="1097.0" y="315.0"/> <di:waypoint x="1297.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_1" id="BPMNEdge_SequenceFlow_1" sourceElement="BPMNShape_IntermediateCatchEvent_2" targetElement="BPMNShape_Task_2"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_1" id="BPMNEdge_SequenceFlow_1" sourceElement="BPMNShape_IntermediateCatchEvent_2" targetElement="BPMNShape_Task_2">
<bpmndi:BPMNLabel id="BPMNLabel_7"/> <bpmndi:BPMNLabel id="BPMNLabel_7"/>
<di:waypoint x="655.0" y="377.0"/> <di:waypoint x="855.0" y="377.0"/>
<di:waypoint x="655.0" y="340.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="265.0" y="255.0"/> <di:waypoint x="740.0" y="525.0"/>
<di:waypoint x="277.5" y="255.0"/> <di:waypoint x="630.0" y="525.0"/>
<di:waypoint x="277.5" y="315.0"/> <di:waypoint x="630.0" y="315.0"/>
<di:waypoint x="290.0" y="315.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="487.0" y="297.0"/> <dc:Bounds height="36.0" width="36.0" x="687.0" y="297.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_fzXPOA"> <bpmndi:BPMNLabel id="BPMNLabel_fzXPOA">
<dc:Bounds height="20.0" width="100.0" x="455.0" y="336.0"/> <dc:Bounds height="20.0" width="100.0" x="655.0" y="336.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_4Vru0A" id="BPMNEdge_20EpXg" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_1">
<di:waypoint x="271.0" y="398.02943725152284"/>
<di:waypoint x="271.0" y="376.0"/>
<di:waypoint x="315.0" y="376.0"/>
<di:waypoint x="315.0" y="340.0"/>
</bpmndi:BPMNEdge>
<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_3fLqIw">
<di:waypoint x="400.0" y="315.0"/> <di:waypoint x="520.0" y="315.0"/>
<di:waypoint x="487.0" y="315.0"/> <di:waypoint x="687.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_l0egag" id="BPMNEdge_WIvxbQ" sourceElement="BPMNShape_3fLqIw" targetElement="BPMNShape_Task_2"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_l0egag" id="BPMNEdge_WIvxbQ" sourceElement="BPMNShape_3fLqIw" targetElement="BPMNShape_Task_2">
<di:waypoint x="523.0" y="315.0"/> <di:waypoint x="723.0" y="315.0"/>
<di:waypoint x="600.0" y="315.0"/> <di:waypoint x="800.0" y="315.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_6fY5IQ" id="BPMNShape_bW9fRA"> <bpmndi:BPMNShape bpmnElement="textAnnotation_HwSKqQ" id="BPMNShape_6f4UmA">
<dc:Bounds height="36.0" width="36.0" x="487.0" y="217.0"/> <dc:Bounds height="80.0" width="193.0" x="180.0" y="490.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_xcOZTQ"> </bpmndi:BPMNShape>
<dc:Bounds height="20.0" width="100.0" x="461.5" y="260.0"/> <bpmndi:BPMNShape bpmnElement="event_9fS4uw" id="BPMNShape_JSwhvQ">
<dc:Bounds height="36.0" width="36.0" x="447.0" y="377.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_jZmJsw">
<dc:Bounds height="20.0" width="100.0" x="415.0" y="416.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_GVz3vg" id="BPMNEdge_pPQ5Ig" sourceElement="BPMNShape_Task_2" targetElement="BPMNShape_bW9fRA"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_rbVgQA" id="BPMNEdge_6PdUYA" sourceElement="BPMNShape_JSwhvQ" targetElement="BPMNShape_Task_1">
<di:waypoint x="655.0" y="290.0"/> <di:waypoint x="465.0" y="377.0"/>
<di:waypoint x="655.0" y="235.0"/> <di:waypoint x="465.0" y="357.0"/>
<di:waypoint x="523.0" y="235.0"/> <di:waypoint x="465.0" y="340.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_E8t80w" id="BPMNEdge_p3x7Iw" sourceElement="BPMNShape_bW9fRA" targetElement="BPMNShape_Task_1"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_aXX5dg" id="BPMNEdge_Wkee0Q" sourceElement="BPMNShape_Task_1" targetElement="BPMNShape_IntermediateCatchEvent_3">
<di:waypoint x="487.0" y="235.0"/> <di:waypoint x="465.0" y="290.0"/>
<di:waypoint x="340.0" y="235.0"/> <di:waypoint x="465.0" y="271.5"/>
<di:waypoint x="340.0" y="290.0"/> <di:waypoint x="470.0" y="271.5"/>
<di:waypoint x="470.0" y="252.29161646579058"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_MTbeHA" id="BPMNEdge_RhmZbw" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_4">
<di:waypoint x="482.54992877478423" y="231.0"/>
<di:waypoint x="1175.0" y="231.0"/>
<di:waypoint x="1175.0" y="290.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_M5IK7w" id="BPMNEdge_gTIgKQ" sourceElement="BPMNShape_1" targetElement="BPMNShape_Task_1">
<di:waypoint x="263.0" y="315.0"/>
<di:waypoint x="410.0" y="315.0"/>
</bpmndi:BPMNEdge>
<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="1162.0" y="525.0"/>
<di:waypoint x="1162.0" y="340.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1"> <bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">