diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoAppendAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoAppendAdapter.java
new file mode 100644
index 0000000..4d7b463
--- /dev/null
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoAppendAdapter.java
@@ -0,0 +1,124 @@
+package com.alexanderlogistics.mahnlauf;
+
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import org.imixs.workflow.ItemCollection;
+import org.imixs.workflow.SignalAdapter;
+import org.imixs.workflow.engine.WorkflowService;
+import org.imixs.workflow.exceptions.AccessDeniedException;
+import org.imixs.workflow.exceptions.AdapterException;
+import org.imixs.workflow.exceptions.ModelException;
+import org.imixs.workflow.exceptions.PluginException;
+import org.imixs.workflow.exceptions.ProcessingErrorException;
+import org.imixs.workflow.exceptions.QueryException;
+
+/**
+ * Der InkassoAppendAdapter verknüpft eine Rechnung mit einem Inkasso Workflow zum
+ * aktuellen Debitor. Existiert aktuell kein Inkasso für diesen
+ * Debitor erzeugt der Adapter automatisch eine neue Prozessinstanz.
+ *
+ * Wurde die Rechnugn bereits einem Inkasso zugeordnet passiert nichts.
+ *
+ *
+ *
+ * @version 1.0
+ * @author rsoika
+ */
+public class InkassoAppendAdapter implements SignalAdapter {
+
+ private static Logger logger = Logger.getLogger(InkassoAppendAdapter.class.getName());
+
+ public static final String ERROR_MISSING_DATA = "MISSING_DATA";
+ public static final String ERROR_CONFIG = "CONFIG_ERROR";
+
+ public static final String ITEM_DBTR_NUMBER = "dbtr.number";
+ public static final String ITEM_DBTR_NAME = "dbtr.name";
+
+ @Inject
+ WorkflowService workflowService;
+
+ /**
+ * This method finds or create the Inkasso and adds a reference
+ * ($workitemref) to the current invoice.
+ *
+ * @throws PluginException
+ */
+ @Override
+ public ItemCollection execute(ItemCollection document, ItemCollection event)
+ throws AdapterException, PluginException {
+
+ appendInvoice(document);
+
+ return document;
+ }
+
+ /**
+ * Diese method hängt eine referenz der aktuellen Rechnung an den Inkasso
+ *
+ * @param document
+ * @throws PluginException
+ */
+ private void appendInvoice(ItemCollection document) throws PluginException {
+ String dbtrNumber = document.getItemValueString(ITEM_DBTR_NUMBER);
+ String currency = document.getItemValueString("invoice.currency");
+
+ if (dbtrNumber == null || dbtrNumber.isEmpty()) {
+ throw new PluginException(PluginException.class.getName(), ERROR_MISSING_DATA,
+ "Inkasso kann nicht erzeugt werden. Bitte wählen Sie zuerst einen Debitor aus.");
+ }
+
+
+ logger.info("......Search Inkasso '" + dbtrNumber + "'...");
+ ItemCollection inkasso;
+ try {
+ inkasso = findInkasso(dbtrNumber,currency);
+ if (inkasso == null) {
+ // create a new one
+ inkasso = new ItemCollection().workflowGroup("Inkasso").task(1000).event(100);
+ // add cdtr.name
+ inkasso.setItemValue(ITEM_DBTR_NAME, document.getItemValue(ITEM_DBTR_NAME));
+ inkasso.setItemValue(ITEM_DBTR_NUMBER, document.getItemValue(ITEM_DBTR_NUMBER));
+ inkasso.setItemValue("invoice.currency", currency);
+ } else {
+ // Inkasso speichern
+ inkasso.event(100);
+ }
+ // Invoice mit Inkasso verknüpften (falls noch nicht verknüpft)
+ inkasso.appendItemValueUnique("$workitemref", document.getUniqueID());
+ workflowService.processWorkItem(inkasso);
+
+ } catch (QueryException | AccessDeniedException | ProcessingErrorException | ModelException e1) {
+ throw new PluginException(PluginException.class.getName(), ERROR_MISSING_DATA,
+ "Es konnte kein Inkasso zugewiesen werden: " + e1.getMessage());
+
+ }
+ }
+
+ /**
+ * Prüft alle offenen Inkasso Workflows und gibt den neuesten zur angegebenen
+ * dbtrNumber zurück, oder null falls es keinen Offenen gibt.
+ *
+ * @param dbtrNumber
+ * @return
+ * @throws QueryException
+ */
+ private ItemCollection findInkasso(String dbtrNumber,String currency) throws QueryException {
+ String query = "(type:workitem) AND ($modelversion:inkasso*) ";
+ List resultList = workflowService.getDocumentService().find(query, 999, 0, "$modified", true);
+
+ for (ItemCollection inkasso : resultList) {
+ if (dbtrNumber.equals(inkasso.getItemValueString(ITEM_DBTR_NUMBER))
+ && currency.equals(inkasso.getItemValueString("invoice.currency"))
+ ) {
+ return inkasso;
+ }
+ }
+
+ // no Inkasso found
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoController.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoController.java
new file mode 100644
index 0000000..d40766f
--- /dev/null
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoController.java
@@ -0,0 +1,77 @@
+package com.alexanderlogistics.mahnlauf;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.enterprise.context.ConversationScoped;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.imixs.workflow.ItemCollection;
+import org.imixs.workflow.engine.DocumentService;
+import org.imixs.workflow.faces.data.WorkflowController;
+
+/**
+ * Der InkassoController dient dazu eine bereits zugewiesene Rechnung
+ * wieder aus dem Inkasso zu entfernen.
+ *
+ * Zusätzlich bietet er die Summenberechnung an, bei der die Gutschriften
+ * abgezogen werden.
+ *
+ * @author rsoika
+ *
+ */
+@Named
+@ConversationScoped
+public class InkassoController implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private static Logger logger = Logger.getLogger(InkassoController.class.getName());
+
+ @Inject
+ protected WorkflowController workflowController;
+
+ @Inject
+ protected DocumentService documentService;
+
+ /**
+ * This method computes the sum for a given item in a list of workitems. The
+ * result is rounded to 2 digits.
+ *
+ * Gutschriften werden abgezogen
+ *
+ * @param refids - list of workitem uniqueIds
+ * @param item - name of the item to summarize
+ * @return sum rounded to 2 digits
+ */
+ public double calculateSum(List refids, String item) {
+ double result = 0;
+ for (String id : refids) {
+ ItemCollection doc = documentService.load(id);
+ if (doc != null) {
+ result = result + doc.getItemValueDouble(item);
+
+ } else {
+ logger.warning("invalid read access to calculate sum");
+ }
+ }
+ // rond with 2 digits
+ return Math.round(result * 100.0) / 100.0;
+
+ }
+
+ /**
+ * This method removes an uniqueid form the item $workitemref
+ */
+ @SuppressWarnings("unchecked")
+ public void removeInvoice(String id) {
+
+ List refList = workflowController.getWorkitem().getItemValue("$workitemref");
+
+ refList.remove(id);
+ workflowController.getWorkitem().setItemValue("$workitemref", refList);
+ }
+
+}
diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoExportAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoExportAdapter.java
new file mode 100644
index 0000000..8f7d867
--- /dev/null
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/mahnlauf/InkassoExportAdapter.java
@@ -0,0 +1,247 @@
+package com.alexanderlogistics.mahnlauf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.inject.Inject;
+
+import org.apache.poi.ss.usermodel.CellCopyPolicy;
+import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.imixs.archive.core.SnapshotService;
+import org.imixs.workflow.FileData;
+import org.imixs.workflow.ItemCollection;
+import org.imixs.workflow.engine.DocumentService;
+import org.imixs.workflow.engine.WorkflowService;
+import org.imixs.workflow.exceptions.AdapterException;
+import org.imixs.workflow.exceptions.PluginException;
+import org.imixs.workflow.exceptions.QueryException;
+
+import org.imixs.workflow.poi.POIFindReplaceAdapter;
+
+/**
+ * Der ZahlungsavisAdapter importiert eine Excel Datei aus einem Textblock
+ *
+ *
+ * {@code
+ textblock-ref
+ filename
+ filename
+ }
+ *
+ *
+ * Der Adapter erweitert den POIAdapter somit können felder aktualisiert werden
+ * (siehe POIFineReplaceAdapter).
+ *
+ *
+ * Der Adapter kopiert die Rechnungsdaten in neue Zeilen, welche ab Zeilnenummer
+ * 16 eingefügt werden.
+ *
+ * Dabei werden Gutschriften in spalte E und Rechnungen in Spalte F eingetrgen.
+ *
+ * Abschliessend wird die Zelle 'TOTAL' noch aktualisiert.
+ *
+ * @version 1.0
+ * @author rsoika
+ */
+public class InkassoExportAdapter extends POIFindReplaceAdapter {
+
+ private static Logger logger = Logger.getLogger(InkassoExportAdapter.class.getName());
+
+ public static final String ERROR_CONFIG = "CONFIG_ERROR";
+ final String TYPE_TEXTBLOCK = "textblock";
+
+ @Inject
+ WorkflowService workflowService;
+
+ @Inject
+ DocumentService documentService;
+
+ @Inject
+ SnapshotService snapshotService;
+
+ /**
+ * This method finds or create the Zahlungsavis and adds a reference
+ * ($workitemref) to the current invoice.
+ *
+ * @throws PluginException
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public ItemCollection execute(ItemCollection document, ItemCollection event)
+ throws AdapterException, PluginException {
+
+ // read the zahlungsavis options
+ ItemCollection evalItemCollection = workflowService.evalWorkflowResult(event, "inkasso", document, false);
+ if (evalItemCollection == null) {
+ throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
+ "missing inkasso configuration in model event - please check model configuration");
+ }
+ String textblock = evalItemCollection.getItemValueString("textblock");
+ String template = evalItemCollection.getItemValueString("template");
+ String targetName = evalItemCollection.getItemValueString("target-name");
+ // adapt text....
+ targetName = workflowService.adaptText(targetName, document);
+
+ appendExcelTemplate(document, textblock, template, targetName);
+
+ // Process POI instructions
+ // read the config
+ ItemCollection poiConfig = workflowService.evalWorkflowResult(event, "poi-update", document, false);
+ if (poiConfig == null || !poiConfig.hasItem("findreplace")) {
+ throw new PluginException(POIFindReplaceAdapter.class.getSimpleName(), CONFIG_ERROR,
+ "missing poi configuration");
+ }
+ List replaceDevList = poiConfig.getItemValue("findreplace");
+ String eval = poiConfig.getItemValueString("eval");
+ try {
+ this.updateFileData(document.getFileData(targetName), document, replaceDevList, eval);
+ } catch (PluginException | IOException e) {
+ throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
+ "failed to update zahlungsavis - wrong POI configuraiton: " + e.getMessage());
+ }
+
+ // now we add separate lines for each invoice....
+ insertInvoiceRows(document, targetName);
+
+ return document;
+ }
+
+ /**
+ * This helper method inserts a row for each invoice of the current Zahlunsavis
+ * at row 16 into the excel template file
+ *
+ * The method copies the Row A16 as a reference row
+ *
+ * The named cell 'TOTAL' should contain the summary formula. It will be
+ * evaluated at the end.
+ *
+ * @throws PluginException
+ */
+ @SuppressWarnings("unchecked")
+ private void insertInvoiceRows(ItemCollection document, String fileName) throws PluginException {
+ List invoiceIDs = document.getItemValue("$workitemref");
+ FileData fileData = document.getFileData(fileName);
+
+ // load XSSFWorkbook
+ try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) {
+ XSSFWorkbook doc = new XSSFWorkbook(imputStream);
+ // NOTE: we only take the first sheet !
+ XSSFSheet sheet = doc.getSheetAt(0);
+ CellReference cr = new CellReference("A16");
+ XSSFRow referenceRow = sheet.getRow(cr.getRow());
+ int referenceRowPos = 16;
+ int rowPos = 16;
+ //int lastRow = sheet.getLastRowNum();
+ int lastRow = 999;
+ logger.finest("Last rownum="+lastRow);
+ sheet.shiftRows(rowPos, lastRow, invoiceIDs.size(), true, true);
+
+ for (String invoiceID : invoiceIDs) {
+ logger.finest("......copy row...");
+ ItemCollection invoice = documentService.load(invoiceID);
+ // now create a new line..
+ XSSFRow row = sheet.createRow(rowPos);
+ row.copyRowFrom(referenceRow, new CellCopyPolicy());
+ // insert values
+ row.getCell(0).setCellValue(invoice.getItemValueString("invoice.number"));
+ row.getCell(1).setCellValue(invoice.getItemValueDate("invoice.date"));
+ row.getCell(2).setCellValue(invoice.getItemValueDate("invoice.duedate"));
+ // Rechnung
+ row.getCell(4).setCellValue(invoice.getItemValueDouble("invoice.total"));
+
+ rowPos++;
+ }
+ // delete reference row 16
+ sheet.shiftRows(referenceRowPos, lastRow + invoiceIDs.size(), -1, true, true);
+
+ // finally update the total formula...
+ evalXSSFSheet(doc, sheet, "TOTAL");
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ // write back the file
+
+ doc.write(byteArrayOutputStream);
+ doc.close();
+ byte[] newContent = byteArrayOutputStream.toByteArray();
+ FileData fileDataNew = new FileData(fileData.getName(), newContent, fileData.getContentType(), null);
+ // update the fileData
+ document.addFileData(fileDataNew);
+ logger.finest("......new document added");
+
+ } catch (IOException e) {
+ throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
+ "failed to update inkasso: " + e.getMessage());
+ }
+ }
+
+ /**
+ * This method loads a text-block for a specified ref and appends the named
+ * fileData object of this document.
+ *
+ * @param document
+ * @throws PluginException
+ */
+ private void appendExcelTemplate(ItemCollection document, String textblockRef, String template, String targetName)
+ throws PluginException {
+
+ if ((template == null || template.isEmpty()) || (textblockRef == null || textblockRef.isEmpty())) {
+ throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
+ "invalid inkasso configuration in model event - textblock/template reference not defined!");
+ }
+
+ // load the text block
+ FileData fileData = loadTextBlockFileData(textblockRef, template);
+
+ // do we found the document?
+ if (fileData == null) {
+ throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
+ "invalid inkasso configuration in model event - template=" + template + " not found!");
+ }
+ fileData.setName(targetName);
+ // append document
+ logger.info("...append new inkasso Template: " + targetName);
+
+ document.addFileData(fileData);
+
+ }
+
+ /**
+ * This method returns a text-block ItemCollection for a specified name.
+ *
+ * @param name in attribute txtname
+ *
+ *
+ */
+ public FileData loadTextBlockFileData(String name, String fileName) {
+ ItemCollection textBlockItemCollection = null;
+
+ // load text-block by name....
+ String sQuery = "(type:\"" + TYPE_TEXTBLOCK + "\" AND txtname:\"" + name + "\")";
+ Collection col;
+ try {
+ // find the textblock...
+ col = documentService.find(sQuery, 1, 0);
+ if (col.size() > 0) {
+ textBlockItemCollection = col.iterator().next();
+ // fetch the fileData...
+ return snapshotService.getWorkItemFile(textBlockItemCollection.getUniqueID(), fileName);
+
+ } else {
+ logger.warning("Missing text-block : '" + name + "'");
+ }
+ } catch (QueryException e) {
+ logger.warning("getTextBlock - invalid query: " + e.getMessage());
+ }
+
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/inkasso.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/inkasso.xhtml
new file mode 100644
index 0000000..4907a8e
--- /dev/null
+++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/inkasso.xhtml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+ Invoices
+
+
+
+ | #{message['form.invoicenumber']} |
+ #{message['form.date']} |
+ #{message['form.deadline']} |
+ #{message['form.amount']} |
+ |
+ |
+
+
+
+
+
+ |
+ #{invoice.item['$workflowsummary']}
+
+
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+ |
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+ |
+ Summary |
+
+
+ |
+ #{invoice.item['invoice.currency']} |
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/inkasso_template.xlsx b/templates/inkasso_template.xlsx
new file mode 100644
index 0000000..3e41a73
Binary files /dev/null and b/templates/inkasso_template.xlsx differ
diff --git a/workflow/inkasso-1.0.0.bpmn b/workflow/inkasso-1.0.0.bpmn
new file mode 100644
index 0000000..2dce343
--- /dev/null
+++ b/workflow/inkasso-1.0.0.bpmn
@@ -0,0 +1,840 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ application.urlindex.jsf?workitem=$uniqueid
+
+]]>
+
+
+ application.urlindex.jsf?workitem=$uniqueid
+
+]]>
+
+
+
+
+
+
+
+ The linked invoice workitem will be processed by a configurable event.
+
+
+
+
+
+
+ StartEvent_1
+ EventBasedGateway_1
+ Task_1
+ IntermediateCatchEvent_1
+ IntermediateCatchEvent_18
+ IntermediateCatchEvent_3
+ IntermediateCatchEvent_5
+ Task_6
+ Task_2
+ IntermediateCatchEvent_6
+ EndEvent_3
+ IntermediateCatchEvent_2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ home]]>
+
+
+
+
+
+ $editor.]]>
+
+
+ false
+
+
+
+
+
+ $editor]]>
+ SequenceFlow_13
+ SequenceFlow_18
+
+
+ SequenceFlow_5
+
+
+
+
+
+
+ cdtr.name.cargosoft $modified (cdtr.number)]]>
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $workflowgroup - $workflowstatus]]>
+ SequenceFlow_2
+ SequenceFlow_6
+ SequenceFlow_3
+ SequenceFlow_10
+
+
+
+ SequenceFlow_1
+ SequenceFlow_13
+ SequenceFlow_8
+
+
+ SequenceFlow_10
+ SequenceFlow_17
+
+
+
+
+ dbtr.name $modified (dbtr.number)]]>
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $workflowgroup - $workflowstatus]]>
+ SequenceFlow_7
+ SequenceFlow_14
+ SequenceFlow_1
+
+
+
+
+
+ cdtr.name.cargosoft $modified (cdtr.number)]]>
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $workflowgroup - $workflowstatus]]>
+ SequenceFlow_18
+ SequenceFlow_17
+
+
+
+
+
+
+
+
+
+
+
+
+ Mahnwesen
+]]>
+
+
+
+
+
+ SequenceFlow_5
+ SequenceFlow_7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Inkasso Template
+ inkasso_template.xlsx
+inkasso_numsequencenumber.xlsx
+
+
+ D2
+ Person in Charge: $editor
+ text
+
+
+ D5
+ $editor
+ text
+
+
+ C10
+ numsequencenumber
+ text
+
+
+ A12
+ dbtr.number
+ text
+
+
+ B12
+ dbtr.name
+ text
+
+
+ E14
+ invoice.currency
+ text
+
+
+ E10
+ $modified
+ date
+ ]]>
+
+
+
+
+
+ $editor.]]>
+
+
+ false
+
+
+
+ SequenceFlow_8
+ SequenceFlow_2
+
+
+ DataOutput_3
+
+
+ DataOutput_3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+ SequenceFlow_6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+ SequenceFlow_14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Inkasso Template
+ inkasso_template.xlsx
+inkasso_numsequencenumber.xlsx
+
+
+ D2
+ Person in Charge: $editor
+ text
+
+
+ D5
+ $editor
+ text
+
+
+ C10
+ numsequencenumber
+ text
+
+
+ A12
+ dbtr.number
+ text
+
+
+ B12
+ dbtr.name
+ text
+
+
+ E14
+ invoice.currency
+ text
+
+
+ E10
+ $modified
+ date
+ ]]>
+
+
+
+
+
+
+
+
+ false
+
+
+
+ SequenceFlow_3
+
+
+ DataOutput_2
+
+
+ DataOutput_2
+
+
+
+
+
+ Der Inkasso Workflow enthält eine Liste von zugeordneten Rechnungen (item '$workitemref')
+
+Eine Rechnung wird über die Adapter Klasse 'InkassoAdapter' eingefügt.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/rechnungsausgang-de-1.0.2.bpmn b/workflow/rechnungsausgang-de-1.0.2.bpmn
new file mode 100644
index 0000000..040c25f
--- /dev/null
+++ b/workflow/rechnungsausgang-de-1.0.2.bpmn
@@ -0,0 +1,3104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$workflowstatus
+
+]]>
+
+
+ In case you have already made the payment, please disregard this notice. If you require any information regarding your account, please do not hesitate to contact us.
+Thank you for your cooperation.
+
+Kind regards
Alexander Global Logistics GmbH
+
+