import prozess

This commit is contained in:
Ralph Soika 2025-01-31 12:29:06 +01:00
parent 302e4e5b08
commit cde1b2a2eb
2 changed files with 298 additions and 17 deletions

View file

@ -0,0 +1,180 @@
/*
* Imixs-Workflow
*
* Copyright (C) 2001-2020 Imixs Software Solutions GmbH,
* http://www.imixs.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You can receive a copy of the GNU General Public
* License at http://www.gnu.org/licenses/gpl.html
*
* Project:
* https://www.imixs.org
* https://github.com/imixs/imixs-workflow
*
* Contributors:
* Imixs Software Solutions GmbH - Project Management
* Ralph Soika - Software Developer
*/
package com.alexanderlogistics.xml;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentEvent;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ModelService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.AccessDeniedException;
import org.imixs.workflow.exceptions.ModelException;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.ProcessingErrorException;
import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.ejb.EJB;
import jakarta.ejb.Stateless;
import jakarta.enterprise.event.Observes;
/**
* Der BusinessPartnerImportService hängt sich an den standard CSVImport Service
* der die Cargosoft Stammdaten aktualisiert.
* Es ist ein simples Observer Pattern das auf das Document Event
* "ON_DOCUMENT_SAVE" reagiert. Hier hängt sich der BusinessPartnerImportService
* ein und prüft ob der Workflow schon existiert oder ggf. aktualisiert werden
* muss.
*
*
* @author rsoika
*
*/
@Stateless
public class BusinessPartnerImportService {
private static Logger logger = Logger.getLogger(BusinessPartnerImportService.class.getName());
public static final String OPTION_MANDANT_ID = "mandant.id";
public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
public static final String REGEX_IMPORTTEXTPATTERN = "^R[1-8] .*$";
@EJB
WorkflowService workflowService;
@EJB
DocumentService documentService;
@EJB
ModelService modelService;
/**
* Die Methode reagiert auf das CDI DocumentEvent beim Import von cargosoft
* cargosoftkreditor documenten.
*
*
*/
public void onEvent(@Observes DocumentEvent event) {
if (event == null || event.getDocument() == null) {
return;
}
// check if source is already completed
if (event.getEventType() == DocumentEvent.ON_DOCUMENT_SAVE) {
// check type!
if ("cargosoftkreditor".equals(event.getDocument().getType())) {
logger.info("Verify business partner object....");
ItemCollection importDoc = event.getDocument();
String name = event.getDocument().getItemValueString("name");
boolean isCreditor = name.toUpperCase().startsWith("K");
String partnerID = InvoiceUtil.buildBPID(name);
// Prüfen ob es diesen partner schon gibt?
ItemCollection businesspartner = lookupBusinessPartner(partnerID);
if (businesspartner == null) {
businesspartner = createBusinessPartner();
}
ItemCollection oldBussinessPartnerItemColl = (ItemCollection) businesspartner.clone();
// Update Fields...
businesspartner.setItemValue("name", partnerID);
businesspartner.setItemValue("partner.id", partnerID);
if (isCreditor) {
businesspartner.setItemValue("cdtr.number", name);
if (businesspartner.isItemEmpty("cdtr.email")) {
businesspartner.setItemValue("cdtr.email", importDoc.getItemValueString("_vendor_email"));
}
} else {
businesspartner.setItemValue("dbtr.number", name);
if (businesspartner.isItemEmpty("dbtr.email")) {
businesspartner.setItemValue("dbtr.email", importDoc.getItemValueString("_vendor_email"));
}
}
businesspartner.setItemValue("partner.country", importDoc.getItemValueString("_vendor_country"));
businesspartner.setItemValue("partner.name", importDoc.getItemValueString("_vendor_name"));
businesspartner.setItemValue("partner.phone", importDoc.getItemValueString("_vendor_phone"));
businesspartner.setItemValue("partner.address", importDoc.getItemValueString("_vendor_str"));
businesspartner.setItemValue("partner.zip", importDoc.getItemValueString("_vendor_zip_code"));
businesspartner.setItemValue("partner.city", importDoc.getItemValueString("_vendor_city"));
// hat sich das Objekt verändert?
if (!businesspartner.equals(oldBussinessPartnerItemColl)) {
businesspartner.event(201); // update/create
try {
workflowService.processWorkItemByNewTransaction(businesspartner);
} catch (AccessDeniedException | ProcessingErrorException | PluginException | ModelException e) {
logger.warning("Failed to update Business Partner Object " + name + " - " + e.getMessage());
}
}
}
}
}
/**
* Erstellt ein neues leeres Business Partner Object
*
* @return
*/
private ItemCollection createBusinessPartner() {
ItemCollection businessPartner = new ItemCollection();
businessPartner.setType("workitem");
businessPartner.setWorkflowGroup("Business Partner");
businessPartner.task(1000);
return businessPartner;
}
/**
* Sucht nach einem Business partner
*
* @param id
* @return
*/
private ItemCollection lookupBusinessPartner(String id) {
String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:businesspartner*) AND (name:" + id
+ ")";
try {
List<ItemCollection> result = documentService.find(query, 1, 0, null, false);
if (result.size() > 0) {
return result.get(0);
}
} catch (QueryException e) {
logger.warning("Failed to query businesspartner: " + query + " - Error: " + e.getMessage());
}
return null;
}
}

View file

@ -21,6 +21,8 @@
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value> <imixs:value><![CDATA[org.imixs.workflow.engine.plugins.IntervalPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value> <imixs:value><![CDATA[org.imixs.workflow.engine.plugins.MailPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value> <imixs:value><![CDATA[org.imixs.workflow.engine.plugins.ResultPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.team.TeamPlugin]]></imixs:value>
<imixs:value><![CDATA[org.imixs.marty.plugins.SequenceNumberPlugin]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txtfieldmapping" type="xs:string"> <imixs:item name="txtfieldmapping" type="xs:string">
<imixs:value><![CDATA[Creator|$creator]]></imixs:value> <imixs:value><![CDATA[Creator|$creator]]></imixs:value>
@ -44,6 +46,9 @@
<bpmn2:flowNodeRef>event_Tr0aug</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>event_Tr0aug</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_UQIXAQ</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>dataObject_UQIXAQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_vwH0cA</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>event_vwH0cA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>textAnnotation_LyGTCw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_TuyuwQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_h0Kk5g</bpmn2:flowNodeRef>
</bpmn2:lane> </bpmn2:lane>
</bpmn2:laneSet> </bpmn2:laneSet>
<bpmn2:task id="task_ToMZaQ" imixs:processid="1000" name="Neuanlage"> <bpmn2:task id="task_ToMZaQ" imixs:processid="1000" name="Neuanlage">
@ -65,20 +70,47 @@
<bpmn2:documentation id="documentation_Tzm1bw"/> <bpmn2:documentation id="documentation_Tzm1bw"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:task id="task_Q80A1Q" imixs:processid="1100" name="Aktiv"> <bpmn2:task id="task_Q80A1Q" imixs:processid="1100" name="Aktiv">
<bpmn2:extensionElements/> <bpmn2:extensionElements>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-tick,imixs-success]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_M7b42w"/> <bpmn2:documentation id="documentation_M7b42w"/>
<bpmn2:incoming>sequenceFlow_knUYpQ</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_knUYpQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_2uNvPw</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_2uNvPw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_NNbMhg</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_NNbMhg</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_avahXg</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_9atLFA</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:task id="task_B8Pi7A" imixs:processid="1800" name="Gesperrt"> <bpmn2:task id="task_B8Pi7A" imixs:processid="1800" name="Gesperrt">
<bpmn2:extensionElements/> <bpmn2:extensionElements>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>partner.name</itemvalue> (<itemvalue>partner.id</itemvalue>)]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-user|typcn-times,imixs-error]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_0B9wKQ"/> <bpmn2:documentation id="documentation_0B9wKQ"/>
<bpmn2:incoming>sequenceFlow_1mXO8A</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_1mXO8A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_rwdWxw</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_rwdWxw</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_gC0I9w</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_aSdkwg" imixs:activityid="10" name="Aktivieren"> <bpmn2:intermediateCatchEvent id="event_aSdkwg" imixs:activityid="201" name="[import]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Business Partner aus Cargosoft Importiert]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Partnermanagement</item>]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_5409Kg"/> <bpmn2:documentation id="documentation_5409Kg"/>
<bpmn2:incoming>sequenceFlow_S9LVXg</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_S9LVXg</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_knUYpQ</bpmn2:outgoing> <bpmn2:outgoing>sequenceFlow_knUYpQ</bpmn2:outgoing>
@ -119,25 +151,26 @@
<item name="partner.id" type="text" span="4" readonly="true" label="Partner ID:"/> <item name="partner.id" type="text" span="4" readonly="true" label="Partner ID:"/>
</imixs-form-section> </imixs-form-section>
<imixs-form-section columns="1" label="Adresse"> <imixs-form-section columns="1" label="Adresse" readonly="true">
<item name="partner.address" type="text" span="8" required="false" label="Adresse:" /> <item name="partner.address" type="text" span="8" required="false" label="Adresse:" />
<item name="partner.address.sub1" type="text" span="4" required="false" label="Zusatz" /> <item name="partner.address.sub1" type="text" span="4" required="false" label="Zusatz" />
<item name="partner.country" type="custom" path="country" span="4" readonly="false" label="Land:" /> <item name="partner.country" type="custom" path="country" span="4" readonly="false" label="Land:" />
<item name="partner.zip" type="text" span="1" required="false" label="PLZ:" /> <item name="partner.zip" type="text" span="1" required="false" label="PLZ:" />
<item name="partner.city" type="text" span="7" required="false" label="Stadt:" /> <item name="partner.city" type="text" span="7" required="false" label="Stadt:" />
<item name="partner.language" type="text" readonly="false" span="4" label="Sprache:" /> <item name="partner.language" type="text" readonly="false" span="4" label="Sprache:" />
<item name="partner.phone" type="text" readonly="false" span="4" label="Tel.:" />
</imixs-form-section> </imixs-form-section>
<imixs-form-section columns="1" label="Rechnungseingang "> <imixs-form-section columns="1" label="Rechnungseingang ">
<item name="cdtr.number" type="text" span="2" readonly="true" label="Kreditoren Nr.:" /> <item name="cdtr.number" type="text" span="2" readonly="true" label="Kreditoren Nr.:" />
<item name="cdtr.mail" type="text" span="4" readonly="false" label="E-Mail:" /> <item name="cdtr.email" type="text" span="4" readonly="false" label="E-Mail:" />
<item name="cdtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" /> <item name="cdtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" />
</imixs-form-section> </imixs-form-section>
<imixs-form-section columns="1" label="Rechnungsausgang "> <imixs-form-section columns="1" label="Rechnungsausgang ">
<item name="dbtr.number" type="text" span="2" readonly="true" label="Debitoren Nr.:" /> <item name="dbtr.number" type="text" span="2" readonly="true" label="Debitoren Nr.:" />
<item name="dbtr.mail" type="text" span="4" readonly="false" label="E-Mail SOA/Mahnungen:" /> <item name="dbtr.email" type="text" span="4" readonly="false" label="E-Mail SOA/Mahnungen:" />
<item name="dbtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" /> <item name="dbtr.creditperiod" type="text" span="2" readonly="false" label="Zahlungsziel (Tage):" />
</imixs-form-section> </imixs-form-section>
@ -159,13 +192,50 @@
<bpmn2:association id="association_mpLQEQ" sourceRef="dataObject_UQIXAQ" targetRef="task_Q80A1Q"> <bpmn2:association id="association_mpLQEQ" sourceRef="dataObject_UQIXAQ" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_oVnaJw"/> <bpmn2:documentation id="documentation_oVnaJw"/>
</bpmn2:association> </bpmn2:association>
<bpmn2:textAnnotation id="textAnnotation_LyGTCw" textFormat="">
<bpmn2:text id="text_M05BXg"><![CDATA[Neuanalge erfolgt über den Cargosoft CSV Import im BusinessPartnerImportService]]></bpmn2:text>
<bpmn2:documentation id="documentation_wdTBKA"/>
</bpmn2:textAnnotation>
<bpmn2:association id="association_83sZPw" sourceRef="event_aSdkwg" targetRef="textAnnotation_LyGTCw">
<bpmn2:documentation id="documentation_FKcIcg"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_TuyuwQ" imixs:activityid="201" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[Business Partner aktualisiert aus Cargosoft ]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_wy3OSA"/>
<bpmn2:outgoing>sequenceFlow_9atLFA</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_9atLFA" sourceRef="event_TuyuwQ" targetRef="task_Q80A1Q">
<bpmn2:documentation id="documentation_LHM8vg"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_h0Kk5g" imixs:activityid="201" name="[update]">
<bpmn2:extensionElements>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[Business Partner aktualisiert aus Cargosoft ]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_AnqGdA"/>
<bpmn2:outgoing>sequenceFlow_gC0I9w</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_gC0I9w" sourceRef="event_h0Kk5g" targetRef="task_B8Pi7A">
<bpmn2:documentation id="documentation_gfdNnQ"/>
</bpmn2:sequenceFlow>
</bpmn2:process> </bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram"> <bpmndi:BPMNDiagram id="BPMNDiagram_1" name="OpenBPMN Diagram">
<bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_1"> <bpmndi:BPMNPlane bpmnElement="collaboration_1" id="BPMNPlane_1">
<bpmndi:BPMNShape bpmnElement="event_WmkBvw" id="BPMNShape_heefeQ"> <bpmndi:BPMNShape bpmnElement="event_WmkBvw" id="BPMNShape_heefeQ">
<dc:Bounds height="36.0" width="36.0" x="57.0" y="167.0"/> <dc:Bounds height="36.0" width="36.0" x="77.0" y="167.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_6qfN6w"> <bpmndi:BPMNLabel id="BPMNLabel_6qfN6w">
<dc:Bounds height="20.0" width="100.0" x="25.0" y="206.0"/> <dc:Bounds height="20.0" width="100.0" x="45.0" y="206.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_1clvlg" id="BPMNShape_85k4rg"> <bpmndi:BPMNShape bpmnElement="event_1clvlg" id="BPMNShape_85k4rg">
@ -178,13 +248,13 @@
<dc:Bounds height="50.0" width="110.0" x="200.0" y="160.0"/> <dc:Bounds height="50.0" width="110.0" x="200.0" y="160.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="participant_oxb3dg" id="BPMNShape_mqlDUA"> <bpmndi:BPMNShape bpmnElement="participant_oxb3dg" id="BPMNShape_mqlDUA">
<dc:Bounds height="360.0" width="1110.0" x="-30.0" y="40.0"/> <dc:Bounds height="550.0" width="1420.0" x="-30.0" y="40.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="lane_Zxa2TA" id="BPMNShape_Lane_1cDN5A"> <bpmndi:BPMNShape bpmnElement="lane_Zxa2TA" id="BPMNShape_Lane_1cDN5A">
<dc:Bounds height="360.0" width="1080.0" x="0.0" y="40.0"/> <dc:Bounds height="550.0" width="1390.0" x="0.0" y="40.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_25otUg" id="BPMNEdge_NHnc3g" sourceElement="BPMNShape_heefeQ" targetElement="BPMNShape_CUpR6w"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_25otUg" id="BPMNEdge_NHnc3g" sourceElement="BPMNShape_heefeQ" targetElement="BPMNShape_CUpR6w">
<di:waypoint x="93.0" y="185.0"/> <di:waypoint x="113.0" y="185.0"/>
<di:waypoint x="200.0" y="185.0"/> <di:waypoint x="200.0" y="185.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_Q80A1Q" id="BPMNShape_7JA0nw"> <bpmndi:BPMNShape bpmnElement="task_Q80A1Q" id="BPMNShape_7JA0nw">
@ -242,16 +312,15 @@
<di:waypoint x="380.0" y="80.0"/> <di:waypoint x="380.0" y="80.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_vwH0cA" id="BPMNShape_OXGg8Q"> <bpmndi:BPMNShape bpmnElement="event_vwH0cA" id="BPMNShape_OXGg8Q">
<dc:Bounds height="36.0" width="36.0" x="427.0" y="237.0"/> <dc:Bounds height="36.0" width="36.0" x="657.0" y="67.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_KaHfJQ"> <bpmndi:BPMNLabel id="BPMNLabel_KaHfJQ">
<dc:Bounds height="20.0" width="100.0" x="395.0" y="276.0"/> <dc:Bounds height="20.0" width="100.0" x="625.0" y="106.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_avahXg" id="BPMNEdge_odMtvQ" sourceElement="BPMNShape_OXGg8Q" targetElement="BPMNShape_7JA0nw"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_avahXg" id="BPMNEdge_odMtvQ" sourceElement="BPMNShape_OXGg8Q" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="462.0" y="260.0"/> <di:waypoint x="665.0" y="100.0"/>
<di:waypoint x="480.0" y="260.0"/> <di:waypoint x="575.0" y="100.0"/>
<di:waypoint x="480.0" y="185.0"/> <di:waypoint x="575.0" y="160.0"/>
<di:waypoint x="490.0" y="185.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_uvV8uA" id="BPMNEdge_3Mtxfw" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_7JA0nw"> <bpmndi:BPMNEdge bpmnElement="association_uvV8uA" id="BPMNEdge_3Mtxfw" sourceElement="BPMNShape_mqlDUA" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="525.0" y="220.0"/> <di:waypoint x="525.0" y="220.0"/>
@ -262,6 +331,38 @@
<di:waypoint x="550.0" y="80.0"/> <di:waypoint x="550.0" y="80.0"/>
<di:waypoint x="550.0" y="160.0"/> <di:waypoint x="550.0" y="160.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="textAnnotation_LyGTCw" id="BPMNShape_SbxnGw">
<dc:Bounds height="85.0" width="228.0" x="60.0" y="300.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_83sZPw" id="BPMNEdge_p0XWxg" sourceElement="BPMNShape_uesqgg" targetElement="BPMNShape_SbxnGw">
<di:waypoint x="395.0" y="203.0"/>
<di:waypoint x="395.0" y="345.0"/>
<di:waypoint x="288.0" y="345.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_TuyuwQ" id="BPMNShape_fTy7mg">
<dc:Bounds height="36.0" width="36.0" x="447.0" y="237.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_033n1A">
<dc:Bounds height="20.0" width="100.0" x="415.0" y="276.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9atLFA" id="BPMNEdge_BC4pwQ" sourceElement="BPMNShape_fTy7mg" targetElement="BPMNShape_7JA0nw">
<di:waypoint x="465.0" y="237.0"/>
<di:waypoint x="465.0" y="225.0"/>
<di:waypoint x="520.0" y="225.0"/>
<di:waypoint x="520.0" y="210.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_h0Kk5g" id="BPMNShape_T4k09g">
<dc:Bounds height="36.0" width="36.0" x="497.0" y="427.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_lX0KlA">
<dc:Bounds height="20.0" width="100.0" x="465.0" y="466.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_gC0I9w" id="BPMNEdge_0nCVvg" sourceElement="BPMNShape_T4k09g" targetElement="BPMNShape_ghujeA">
<di:waypoint x="515.0" y="427.0"/>
<di:waypoint x="515.0" y="400.0"/>
<di:waypoint x="545.0" y="400.0"/>
<di:waypoint x="545.0" y="370.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram> </bpmndi:BPMNDiagram>
</bpmn2:definitions> </bpmn2:definitions>