sepa export DWC
This commit is contained in:
parent
e6a234bcb8
commit
3d4bbb03e0
3 changed files with 233 additions and 37 deletions
|
|
@ -1,14 +1,37 @@
|
||||||
package com.alexanderlogistics.dwc;
|
package com.alexanderlogistics.dwc;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
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.ai.workflow.OpenAIAPIAdapter;
|
||||||
|
import org.imixs.archive.core.SnapshotService;
|
||||||
|
import org.imixs.workflow.FileData;
|
||||||
import org.imixs.workflow.ItemCollection;
|
import org.imixs.workflow.ItemCollection;
|
||||||
import org.imixs.workflow.SignalAdapter;
|
import org.imixs.workflow.SignalAdapter;
|
||||||
|
import org.imixs.workflow.engine.DocumentService;
|
||||||
import org.imixs.workflow.engine.ReportService;
|
import org.imixs.workflow.engine.ReportService;
|
||||||
|
import org.imixs.workflow.engine.WorkflowService;
|
||||||
import org.imixs.workflow.exceptions.AdapterException;
|
import org.imixs.workflow.exceptions.AdapterException;
|
||||||
import org.imixs.workflow.exceptions.PluginException;
|
import org.imixs.workflow.exceptions.PluginException;
|
||||||
|
import org.imixs.workflow.exceptions.QueryException;
|
||||||
import org.imixs.workflow.sepa.services.SepaWorkflowService;
|
import org.imixs.workflow.sepa.services.SepaWorkflowService;
|
||||||
|
|
||||||
|
import com.alexanderlogistics.OPListExportAdapterByWeek;
|
||||||
|
|
||||||
import jakarta.ejb.EJB;
|
import jakarta.ejb.EJB;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
|
|
||||||
|
|
@ -18,6 +41,17 @@ import jakarta.inject.Inject;
|
||||||
* This adapter export the payment information in a Excel Sheet acording to the
|
* This adapter export the payment information in a Excel Sheet acording to the
|
||||||
* 'businessONLINE NBD' interface description.
|
* 'businessONLINE NBD' interface description.
|
||||||
*
|
*
|
||||||
|
* *
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {@code
|
||||||
|
<imixs-sepa name="CONFIG">
|
||||||
|
<textblock>....</textblock>
|
||||||
|
<template>....</template>
|
||||||
|
</imixs-sepa>
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @author rsoika
|
* @author rsoika
|
||||||
*/
|
*/
|
||||||
|
|
@ -28,12 +62,23 @@ public class SEPAExportAdapterNBD implements SignalAdapter {
|
||||||
public static final String ERROR_CONFIG = "CONFIG_ERROR";
|
public static final String ERROR_CONFIG = "CONFIG_ERROR";
|
||||||
public static final String ERROR_MISSING_INVOICE = "ERROR_MISSING_INVOICE";
|
public static final String ERROR_MISSING_INVOICE = "ERROR_MISSING_INVOICE";
|
||||||
|
|
||||||
|
final String TYPE_TEXTBLOCK = "textblock";
|
||||||
|
|
||||||
@EJB
|
@EJB
|
||||||
ReportService reportService;
|
ReportService reportService;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
SepaWorkflowService sepaWorkflowService;
|
SepaWorkflowService sepaWorkflowService;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
DocumentService documentService;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
WorkflowService workflowService;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
SnapshotService snapshotService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method collects a data set with all invoices and computes a NBA Excel
|
* This method collects a data set with all invoices and computes a NBA Excel
|
||||||
* File. The templated is loaded from a text block
|
* File. The templated is loaded from a text block
|
||||||
|
|
@ -45,27 +90,173 @@ public class SEPAExportAdapterNBD implements SignalAdapter {
|
||||||
public ItemCollection execute(ItemCollection sepaExport, ItemCollection event)
|
public ItemCollection execute(ItemCollection sepaExport, ItemCollection event)
|
||||||
throws AdapterException, PluginException {
|
throws AdapterException, PluginException {
|
||||||
|
|
||||||
// Textblock laden
|
|
||||||
// load the text block
|
|
||||||
// FileData fileData = loadTextBlockFileData(textblockRef, template);
|
|
||||||
|
|
||||||
// // do we found the document?
|
|
||||||
// if (fileData == null) {
|
|
||||||
// throw new PluginException(OPListExportAdapterByWeek.class.getSimpleName(),
|
|
||||||
// ERROR_CONFIG,
|
|
||||||
// "invalid op-list configuration in model event - template=" + template + " not
|
|
||||||
// found!");
|
|
||||||
// }
|
|
||||||
// fileData.setName(targetName);
|
|
||||||
// // append document
|
|
||||||
// logger.info("...append new op-list Template: " + targetName);
|
|
||||||
|
|
||||||
// document.addFileData(fileData);
|
|
||||||
|
|
||||||
/* Processing .... */
|
|
||||||
String key = sepaExport.getItemValueString("name");
|
String key = sepaExport.getItemValueString("name");
|
||||||
|
|
||||||
|
// Textblock laden
|
||||||
|
List<ItemCollection> sepaConfigList = workflowService.evalWorkflowResultXML(event, "imixs-sepa", "CONFIG",
|
||||||
|
sepaExport,
|
||||||
|
false);
|
||||||
|
if (sepaConfigList == null || sepaConfigList.size() != 1) {
|
||||||
|
// no configuration found!
|
||||||
|
throw new PluginException(OpenAIAPIAdapter.class.getSimpleName(), ERROR_CONFIG,
|
||||||
|
"Missing or invalid imixs-sepa definition in Event " + sepaExport.getTaskID() + "."
|
||||||
|
+ sepaExport.getEventID());
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemCollection sepaConf = sepaConfigList.get(0);
|
||||||
|
String template = sepaConf.getItemValueString("template");
|
||||||
|
FileData fileData = loadTextBlockFileData(sepaConf.getItemValueString("textblock"), template);
|
||||||
|
|
||||||
|
// do we found the document?
|
||||||
|
if (fileData == null) {
|
||||||
|
throw new PluginException(OPListExportAdapterByWeek.class.getSimpleName(),
|
||||||
|
ERROR_CONFIG,
|
||||||
|
"invalid sepa configuration in model event - template not found!");
|
||||||
|
}
|
||||||
|
fileData.setName(template);
|
||||||
|
// create the attachment based on the report definition
|
||||||
|
// attach a file to the current workitem
|
||||||
|
// create a harmonized debitor name for the filename.....
|
||||||
|
String sDepName = sepaExport.getItemValueString(SepaWorkflowService.ITEM_DBTR_NAME);
|
||||||
|
sDepName = sDepName.replace("&", "_");
|
||||||
|
sDepName = sDepName.replace(">", "_");
|
||||||
|
sDepName = sDepName.replace("<", "_");
|
||||||
|
sDepName = sDepName.replace(" ", "_");
|
||||||
|
// build a timestamp for the filename
|
||||||
|
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HHmm");
|
||||||
|
String sepaFileName = "sepa_" + sDepName + "_" + df.format(new Date()) + ".xlsx";
|
||||||
|
|
||||||
|
fileData.setName(sepaFileName);
|
||||||
|
|
||||||
|
// append document
|
||||||
|
logger.info("...append invoices to Template: " + template);
|
||||||
|
|
||||||
|
// get the data source based on the $workitemref ....
|
||||||
|
List<String> refList = sepaExport.getItemValue("$workitemref");
|
||||||
|
List<ItemCollection> data = new ArrayList<ItemCollection>();
|
||||||
|
logger.info("...SEPA export started - " + refList.size() + " invoices found...");
|
||||||
|
|
||||||
|
for (String ref : refList) {
|
||||||
|
// load invoice
|
||||||
|
ItemCollection invoice = sepaWorkflowService.loadInvoice(ref);
|
||||||
|
if (invoice == null) {
|
||||||
|
logger.warning("Invoice '" + ref + "' not found! SEPA Export can not be executed");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// avoid unsupported characters in sepa fields
|
||||||
|
invoice = sepaWorkflowService.harmonizeSEPAItem(invoice, SepaWorkflowService.ITEM_CDTR_NAME);
|
||||||
|
invoice = sepaWorkflowService.harmonizeSEPAItem(invoice, SepaWorkflowService.ITEM_DBTR_NAME);
|
||||||
|
data.add(invoice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// finally we add the teh invoices
|
||||||
|
try {
|
||||||
|
insertInvoiceRows(sepaExport, fileData, data);
|
||||||
|
} catch (PluginException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (QueryException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
return sepaExport;
|
return sepaExport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This helper method inserts a row for each invoice of the OPListe at row 16
|
||||||
|
* into the excel template file
|
||||||
|
* <p>
|
||||||
|
* The method copies the Row A16 as a reference row
|
||||||
|
* <p>
|
||||||
|
* The named cell 'TOTAL' should contain the summary formula. It will be
|
||||||
|
* evaluated at the end.
|
||||||
|
*
|
||||||
|
* @throws PluginException
|
||||||
|
* @throws QueryException
|
||||||
|
*/
|
||||||
|
private void insertInvoiceRows(ItemCollection workitem, FileData fileData, List<ItemCollection> invoices)
|
||||||
|
throws PluginException, QueryException {
|
||||||
|
|
||||||
|
// 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("A2");
|
||||||
|
XSSFRow referenceRow = sheet.getRow(cr.getRow());
|
||||||
|
|
||||||
|
int rowPos = 1;
|
||||||
|
|
||||||
|
// int lastRow = sheet.getLastRowNum();
|
||||||
|
int lastRow = 999;
|
||||||
|
logger.finest("Last rownum=" + lastRow);
|
||||||
|
sheet.shiftRows(rowPos, lastRow, invoices.size(), true, true);
|
||||||
|
|
||||||
|
for (ItemCollection invoice : invoices) {
|
||||||
|
logger.finest("......copy row...");
|
||||||
|
// now create a new line..
|
||||||
|
XSSFRow row = sheet.createRow(rowPos);
|
||||||
|
row.copyRowFrom(referenceRow, new CellCopyPolicy());
|
||||||
|
// insert values
|
||||||
|
row.getCell(0).setCellValue(invoice.getItemValueString("numsequencenumber"));
|
||||||
|
row.getCell(1).setCellValue(invoice.getItemValueDate("invoice.date"));
|
||||||
|
row.getCell(2).setCellValue(invoice.getItemValueString("invoice.number"));
|
||||||
|
row.getCell(3).setCellValue(invoice.getItemValueDate("invoice.duedate"));
|
||||||
|
|
||||||
|
row.getCell(4).setCellValue(invoice.getItemValueDouble("invoice.total"));
|
||||||
|
|
||||||
|
rowPos++;
|
||||||
|
}
|
||||||
|
// delete reference row A2
|
||||||
|
// sheet.shiftRows(1, 1 + invoices.size(), -1, true, true);
|
||||||
|
// sheet.shiftRows(1, lastRow + invoices.size(), -1, true, true);
|
||||||
|
|
||||||
|
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
|
||||||
|
workitem.addFileData(fileDataNew);
|
||||||
|
logger.finest("......new document added");
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new PluginException(SEPAExportAdapterNBD.class.getSimpleName(), ERROR_CONFIG,
|
||||||
|
"failed to update sepa export: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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<ItemCollection> 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BIN
templates/sepa/sepa-dwc.xlsx
Normal file
BIN
templates/sepa/sepa-dwc.xlsx
Normal file
Binary file not shown.
|
|
@ -460,15 +460,14 @@
|
||||||
<imixs:item name="keyupdateacl" type="xs:boolean">
|
<imixs:item name="keyupdateacl" type="xs:boolean">
|
||||||
<imixs:value>false</imixs:value>
|
<imixs:value>false</imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="txtbusinessrule" type="CDATA">
|
<imixs:item name="txtbusinessrule" type="xs:string">
|
||||||
<imixs:value><![CDATA[var result={};
|
<imixs:value><![CDATA[var result={};
|
||||||
var refField="txtcomment";
|
|
||||||
result.isValid=true;
|
result.isValid=true;
|
||||||
|
|
||||||
if ( ( workitem.get(refField) == null || ''==workitem.get(refField)[0]) ) {
|
if (workitem.getItemValueString('txtcomment') == '') {
|
||||||
result.isValid=false;
|
result.isValid=false;
|
||||||
result.errorMessage='Bitte geben Sie einen Kommentar ein.';
|
result.errorMessage='Bitte geben Sie einen Kommentar ein.';
|
||||||
}]]></imixs:value>
|
}]]></imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
</bpmn2:extensionElements>
|
</bpmn2:extensionElements>
|
||||||
<bpmn2:documentation id="Documentation_28"/>
|
<bpmn2:documentation id="Documentation_28"/>
|
||||||
|
|
@ -565,7 +564,10 @@ result.isValid=true;
|
||||||
<imixs:value/>
|
<imixs:value/>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="txtactivityresult" type="xs:string">
|
<imixs:item name="txtactivityresult" type="xs:string">
|
||||||
<imixs:value/>
|
<imixs:value><![CDATA[<imixs-sepa name="CONFIG">
|
||||||
|
<textblock>SEPA-DWC</textblock>
|
||||||
|
<template>sepa-dwc.xlsx</template>
|
||||||
|
</imixs-sepa>]]></imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="keyownershipmode" type="xs:string">
|
<imixs:item name="keyownershipmode" type="xs:string">
|
||||||
<imixs:value><![CDATA[0]]></imixs:value>
|
<imixs:value><![CDATA[0]]></imixs:value>
|
||||||
|
|
@ -674,7 +676,10 @@ result.isValid=true;
|
||||||
<imixs:value/>
|
<imixs:value/>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="txtactivityresult" type="xs:string">
|
<imixs:item name="txtactivityresult" type="xs:string">
|
||||||
<imixs:value/>
|
<imixs:value><![CDATA[<imixs-sepa name="CONFIG">
|
||||||
|
<textblock>SEPA-DWC</textblock>
|
||||||
|
<template>sepa-dwc.xlsx</template>
|
||||||
|
</imixs-sepa>]]></imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="keyownershipmode" type="xs:string">
|
<imixs:item name="keyownershipmode" type="xs:string">
|
||||||
<imixs:value><![CDATA[0]]></imixs:value>
|
<imixs:value><![CDATA[0]]></imixs:value>
|
||||||
|
|
@ -688,15 +693,14 @@ result.isValid=true;
|
||||||
<imixs:item name="txtreportname" type="xs:string">
|
<imixs:item name="txtreportname" type="xs:string">
|
||||||
<imixs:value><![CDATA[sepa]]></imixs:value>
|
<imixs:value><![CDATA[sepa]]></imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="txtbusinessrule" type="CDATA">
|
<imixs:item name="txtbusinessrule" type="xs:string">
|
||||||
<imixs:value><![CDATA[var result={};
|
<imixs:value><![CDATA[var result={};
|
||||||
var refField="txtcomment";
|
|
||||||
result.isValid=true;
|
result.isValid=true;
|
||||||
|
|
||||||
if ( ( workitem.get(refField) == null || ''==workitem.get(refField)[0]) ) {
|
if (workitem.getItemValueString('txtcomment') == '') {
|
||||||
result.isValid=false;
|
result.isValid=false;
|
||||||
result.errorMessage='Bitte geben Sie einen Kommentar ein.';
|
result.errorMessage='Bitte geben Sie einen Kommentar ein.';
|
||||||
}]]></imixs:value>
|
}]]></imixs:value>
|
||||||
</imixs:item>
|
</imixs:item>
|
||||||
<imixs:item name="nammailreceiver" type="xs:string">
|
<imixs:item name="nammailreceiver" type="xs:string">
|
||||||
<imixs:value/>
|
<imixs:value/>
|
||||||
|
|
@ -854,9 +858,9 @@ result.isValid=true;
|
||||||
</bpmndi:BPMNLabel>
|
</bpmndi:BPMNLabel>
|
||||||
</bpmndi:BPMNShape>
|
</bpmndi:BPMNShape>
|
||||||
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_7" id="BPMNShape_IntermediateCatchEvent_7">
|
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_7" id="BPMNShape_IntermediateCatchEvent_7">
|
||||||
<dc:Bounds height="36.0" width="36.0" x="1112.0" y="435.0"/>
|
<dc:Bounds height="36.0" width="36.0" x="1112.0" y="434.0"/>
|
||||||
<bpmndi:BPMNLabel id="BPMNLabel_39" labelStyle="BPMNLabelStyle_1">
|
<bpmndi:BPMNLabel id="BPMNLabel_39" labelStyle="BPMNLabelStyle_1">
|
||||||
<dc:Bounds height="20.0" width="100.0" x="1080.5" y="471.0"/>
|
<dc:Bounds height="20.0" width="100.0" x="1080.5" y="470.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">
|
||||||
|
|
@ -940,11 +944,12 @@ result.isValid=true;
|
||||||
<bpmndi:BPMNLabel id="BPMNLabel_40"/>
|
<bpmndi:BPMNLabel id="BPMNLabel_40"/>
|
||||||
<di:waypoint x="738.0" y="399.0"/>
|
<di:waypoint x="738.0" y="399.0"/>
|
||||||
<di:waypoint x="738.0" y="453.0"/>
|
<di:waypoint x="738.0" y="453.0"/>
|
||||||
<di:waypoint x="1112.0" y="453.0"/>
|
<di:waypoint x="1112.0277992443885" y="453.0"/>
|
||||||
</bpmndi:BPMNEdge>
|
</bpmndi:BPMNEdge>
|
||||||
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_IntermediateCatchEvent_7" targetElement="BPMNShape_Task_6">
|
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_19" sourceElement="BPMNShape_IntermediateCatchEvent_7" targetElement="BPMNShape_Task_6">
|
||||||
<bpmndi:BPMNLabel id="BPMNLabel_41"/>
|
<bpmndi:BPMNLabel id="BPMNLabel_41"/>
|
||||||
<di:waypoint x="1148.0" y="453.0"/>
|
<di:waypoint x="1148.0" y="452.0"/>
|
||||||
|
<di:waypoint x="1174.0" y="452.0"/>
|
||||||
<di:waypoint x="1174.0" y="453.0"/>
|
<di:waypoint x="1174.0" y="453.0"/>
|
||||||
<di:waypoint x="1200.0" y="453.0"/>
|
<di:waypoint x="1200.0" y="453.0"/>
|
||||||
</bpmndi:BPMNEdge>
|
</bpmndi:BPMNEdge>
|
||||||
|
|
@ -971,7 +976,7 @@ result.isValid=true;
|
||||||
<di:waypoint x="968.0" y="309.0"/>
|
<di:waypoint x="968.0" y="309.0"/>
|
||||||
<di:waypoint x="968.0" y="372.0"/>
|
<di:waypoint x="968.0" y="372.0"/>
|
||||||
<di:waypoint x="1130.0" y="372.0"/>
|
<di:waypoint x="1130.0" y="372.0"/>
|
||||||
<di:waypoint x="1130.0" y="435.0"/>
|
<di:waypoint x="1130.0" y="434.0"/>
|
||||||
</bpmndi:BPMNEdge>
|
</bpmndi:BPMNEdge>
|
||||||
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_11" id="BPMNEdge_SequenceFlow_11" sourceElement="BPMNShape_IntermediateCatchEvent_4" targetElement="BPMNShape_Task_1">
|
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_11" id="BPMNEdge_SequenceFlow_11" sourceElement="BPMNShape_IntermediateCatchEvent_4" targetElement="BPMNShape_Task_1">
|
||||||
<bpmndi:BPMNLabel id="BPMNLabel_17"/>
|
<bpmndi:BPMNLabel id="BPMNLabel_17"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue