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 @@ + + + +

+
+
Debitor
+
+ +
+
+ + +
+
Debitor Nummer
+
+ +
+ +
+
+ + + +

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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<itemvalue>$workflowstatus</itemvalue> + +]]> + + + 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

+ +]]>
+
+ + + + + + + + Task_2 + ExclusiveGateway_1 + StartEvent_1 + IntermediateCatchEvent_6 + Task_5 + IntermediateCatchEvent_12 + IntermediateCatchEvent_23 + ExclusiveGateway_2 + IntermediateCatchEvent_17 + IntermediateCatchEvent_2 + IntermediateCatchEvent_3 + ExclusiveGateway_5 + EventBasedGateway_1 + IntermediateThrowEvent_8 + IntermediateCatchEvent_13 + EventBasedGateway_2 + IntermediateCatchEvent_5000-20 + IntermediateCatchEvent_1 + IntermediateCatchEvent_18 + IntermediateThrowEvent_2 + IntermediateCatchEvent_7 + IntermediateCatchEvent_5 + Task_6 + EndEvent_3 + EndEvent_2 + + + ExclusiveGateway_3 + IntermediateThrowEvent_9 + Task_1 + IntermediateThrowEvent_1 + IntermediateCatchEvent_5005-10 + Task_5005 + Task_3 + IntermediateThrowEvent_7 + IntermediateCatchEvent_4 + IntermediateCatchEvent_15 + Task_4 + IntermediateThrowEvent_4 + IntermediateCatchEvent_14 + IntermediateCatchEvent_8 + IntermediateCatchEvent_9 + IntermediateCatchEvent_16 + IntermediateCatchEvent_25 + IntermediateCatchEvent_19 + IntermediateCatchEvent_20 + IntermediateCatchEvent_21 + IntermediateCatchEvent_22 + IntermediateThrowEvent_3 + Task_7 + EndEvent_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + SequenceFlow_32 + SequenceFlow_27 + + + + SequenceFlow_0 + SequenceFlow_21 + SequenceFlow_20 + SequenceFlow_33 + + + + SequenceFlow_0 + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_38 + SequenceFlow_36 + SequenceFlow_41 + SequenceFlow_2 + SequenceFlow_24 + SequenceFlow_50 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + SequenceFlow_38 + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_33 + SequenceFlow_14 + SequenceFlow_15 + SequenceFlow_39 + SequenceFlow_46 + SequenceFlow_37 + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + + SequenceFlow_20 + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_52 + SequenceFlow_13 + SequenceFlow_11 + SequenceFlow_47 + + + SequenceFlow_47 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mahnwesen]]> + + + + + + + + + + + + false + + + + SequenceFlow_21 + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_27 + SequenceFlow_4 + SequenceFlow_18 + SequenceFlow_34 + SequenceFlow_35 + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_59 + SequenceFlow_31 + SequenceFlow_1 + SequenceFlow_44 + SequenceFlow_16 + SequenceFlow_48 + + + SequenceFlow_51 + + + SequenceFlow_39 + SequenceFlow_19 + SequenceFlow_17 + SequenceFlow_9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + SequenceFlow_52 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + SequenceFlow_59 + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_3 + SequenceFlow_29 + SequenceFlow_43 + SequenceFlow_6 + SequenceFlow_30 + SequenceFlow_7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + SequenceFlow_3 + + + + + + + + + + + + _subject]]> + + + + + + + + + _amount (Brutto € _amount_brutto) +_description]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + + + SequenceFlow_19 + SequenceFlow_5 + SequenceFlow_23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mahnlauf-de-1.0 +1000 +100 +/pages/workitems/workitem.jsf?id=dunning.ref +]]> + + + + + + + + + + + + false + + + + + + + + + + + + SequenceFlow_4 + + + DataOutput_1 + + + DataOutput_1 + + + + + + SequenceFlow_23 + SequenceFlow_13 + + + SequenceFlow_18 + SequenceFlow_5 + SequenceFlow_25 + SequenceFlow_45 + + + + + + + + + + cdtr.name invoice.number]]> + + + + + + + + + cdtr.name +Rechnungsnummer: invoice.number +Betrag: invoice.total invoice.currency + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 +2. Dunning +]]> + + + + + + + + + + + + false + + + + + + + + SequenceFlow_24 + SequenceFlow_29 + + + + + + + + + + + + cdtr.name invoice.number]]> + + + + + + + + + cdtr.name +Rechnungsnummer: invoice.number +Betrag: invoice.total invoice.currency + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 +Last Dunning]]> + + + + + + + + + + + + false + + + + + + + + SequenceFlow_30 + SequenceFlow_31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + + + + SequenceFlow_42 + SequenceFlow_8 + + + + + SequenceFlow_42 + + + + SequenceFlow_50 + + + + + SequenceFlow_7 + + + + + SequenceFlow_8 + SequenceFlow_10 + SequenceFlow_12 + + + + + + invoice.saldo]]> + + + + + + SequenceFlow_10 + SequenceFlow_11 + + + (parseFloat(workitem['invoice.saldo'][0]) == parseFloat('0.0')) + + + + + + invoice.saldo]]> + + + + + + SequenceFlow_12 + SequenceFlow_14 + + + + + SequenceFlow_16 + + + + + SequenceFlow_17 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + SequenceFlow_34 + SequenceFlow_15 + + + + SequenceFlow_25 + + + + + SequenceFlow_46 + SequenceFlow_32 + + + + + + + + + + + cdtr.name invoice.number]]> + + + + + + + + + cdtr.name +Rechnungsnummer: invoice.number +Betrag: invoice.total invoice.currency + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 +1. Dunning + +]]> + + + + + + + + + + + + false + + + + + + + + SequenceFlow_35 + SequenceFlow_37 + SequenceFlow_36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mahnlauf-de-1.0 +1000 +100 +/pages/workitems/workitem.jsf?id=dunning.ref +]]> + + + + + + + + + + + + false + + + + + + + + + + + + SequenceFlow_41 + + + DataOutput_3 + + + DataOutput_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mahnlauf-de-1.0 +1000 +100 +/pages/workitems/workitem.jsf?id=dunning.ref +]]> + + + + + + + + + + + + false + + + + + + + + + + + + SequenceFlow_43 + + + DataOutput_4 + + + DataOutput_4 + + + + + + + + + + + cdtr.name invoice.number]]> + + + + + + + + + cdtr.name +Rechnungsnummer: invoice.number +Betrag: invoice.total invoice.currency + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5]]> + + + + + + + + + + + + false + + + + + + + + SequenceFlow_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home + + invoice.reminder + @daily +]]> + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + SequenceFlow_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home + + invoice.reminder + @daily +]]> + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + SequenceFlow_6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home + + invoice.reminder + @daily +]]> + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + SequenceFlow_44 + + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_26 + SequenceFlow_28 + + + SequenceFlow_9 + + + + + SequenceFlow_22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + + + + SequenceFlow_22 + SequenceFlow_26 + + + + + SequenceFlow_28 + + + + SequenceFlow_45 + + + + + + + + + + txtlastcomment]]> + + + + + + + + + invoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_49 + SequenceFlow_51 + + + + + + + + + + + SequenceFlow_48 + SequenceFlow_49 + + + DataOutput_5 + + + DataOutput_5 + + + + + + + + + Trigger über ZahlungseingangsSaldoAdapter + + + + + Triggered by MahnlaufExecuteAdapter + +Wiedervorlage wird um 7 bzw. 5 Tage erhöht + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file