This commit is contained in:
Ralph Soika 2025-02-06 15:44:33 +01:00
parent 017ef6a752
commit 90166229bd
8 changed files with 160 additions and 66 deletions

View file

@ -64,8 +64,7 @@ public class BusinessPartnerController implements Serializable {
/** /**
* WorkflowEvent listener to convert the IBAN child list embeded HashMaps into * WorkflowEvent listener to convert the IBAN child list embeded HashMaps into
* ItemCollections and * ItemCollections and reconvert them before processing
* reconvert them before processing
* *
* @param workflowEvent * @param workflowEvent
* @throws AccessDeniedException * @throws AccessDeniedException

View file

@ -11,6 +11,8 @@ import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil; import com.alexanderlogistics.InvoiceUtil;
import jakarta.ejb.Stateless; import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path; import jakarta.ws.rs.Path;
@ -86,9 +88,11 @@ public class MetricCreditorRestService {
* *
* @throws QueryException * @throws QueryException
* @throws InterruptedException * @throws InterruptedException
* @throws PluginException
* *
*/ */
public void computeMetrics(StringBuffer messageBuffer) throws QueryException, InterruptedException { public void computeMetrics(StringBuffer messageBuffer)
throws QueryException, InterruptedException, PluginException {
long l = System.currentTimeMillis(); long l = System.currentTimeMillis();
int batchSize = 500; int batchSize = 500;
int totalInvoices = 0; int totalInvoices = 0;
@ -105,20 +109,24 @@ public class MetricCreditorRestService {
// Verarbeite Page für Page // Verarbeite Page für Page
for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) {
List<ItemCollection> invoices = documentService.find(query, batchSize, pageIndex);
for (ItemCollection invoice : invoices) { totalInvoices = totalInvoices + computeInvoiceMetrics(query, batchSize, pageIndex);
try { // List<ItemCollection> invoices = documentService.find(query, batchSize,
ItemCollection metricData = metricCreditorService.getMetricByInvoice(invoice); // pageIndex);
// Jetzt Rechnung addieren
metricCreditorService.addInvoice(metricData, invoice); // for (ItemCollection invoice : invoices) {
logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice)); // try {
metricCreditorService.updateMetric(metricData, true); // ItemCollection metricData =
totalInvoices++; // metricCreditorService.getMetricByInvoice(invoice);
} catch (PluginException e) { // // Jetzt Rechnung addieren
// invalid invoice - e.g. no dbtr. number // metricCreditorService.addInvoice(metricData, invoice);
} // logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice));
} // metricCreditorService.updateMetric(metricData, true);
// totalInvoices++;
// } catch (PluginException e) {
// // invalid invoice - e.g. no dbtr. number
// }
// }
// Fortschritt loggen // Fortschritt loggen
log("│   │ ├── Processed page " + (pageIndex + 1) + " of " + totalPages + log("│   │ ├── Processed page " + (pageIndex + 1) + " of " + totalPages +
@ -135,6 +143,37 @@ public class MetricCreditorRestService {
} }
/**
* Helper method runs in new transaction
*
* @param query
* @param batchSize
* @param pageIndex
* @throws PluginException
* @throws QueryException
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public int computeInvoiceMetrics(String query, int batchSize, int pageIndex)
throws PluginException, QueryException {
int updates = 0;
List<ItemCollection> invoices = documentService.find(query, batchSize, pageIndex);
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricCreditorService.getMetricByInvoice(invoice);
// Jetzt Rechnung addieren
metricCreditorService.addInvoice(metricData, invoice);
logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice));
metricCreditorService.updateMetric(metricData, true);
updates++;
} catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number
}
}
return updates;
}
private void log(String message, StringBuffer messageLog) { private void log(String message, StringBuffer messageLog) {
logger.info(message); logger.info(message);
messageLog.append(message + "\n"); messageLog.append(message + "\n");

View file

@ -12,6 +12,7 @@ import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry; import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.Tag; import org.eclipse.microprofile.metrics.Tag;
import org.eclipse.microprofile.metrics.annotation.RegistryScope; import org.eclipse.microprofile.metrics.annotation.RegistryScope;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ProcessingEvent; import org.imixs.workflow.engine.ProcessingEvent;
@ -24,6 +25,7 @@ import com.alexanderlogistics.KreditorDebitorService;
import jakarta.annotation.security.DeclareRoles; import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed; import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs; import jakarta.annotation.security.RunAs;
import jakarta.ejb.Singleton;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes; import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -50,6 +52,7 @@ import jakarta.inject.Inject;
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS", "org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" }) "org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS") @RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Singleton
@ApplicationScoped @ApplicationScoped
public class MetricCreditorService { public class MetricCreditorService {
@ -265,6 +268,7 @@ public class MetricCreditorService {
ItemCollection metricData = new ItemCollection(); ItemCollection metricData = new ItemCollection();
metricData.setType(TYPE_METRIC_CREDITOR); metricData.setType(TYPE_METRIC_CREDITOR);
metricData.setItemValue("name", key); metricData.setItemValue("name", key);
metricData.setItemValue(SnapshotService.NOSNAPSHOT, true);
metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice)); metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice));
metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice)); metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice));
metricData.setItemValue("country", invoice.getItemValueString("invoice.country")); metricData.setItemValue("country", invoice.getItemValueString("invoice.country"));
@ -289,6 +293,7 @@ public class MetricCreditorService {
// In Datenbank persistieren // In Datenbank persistieren
if (persist) { if (persist) {
metricData.setItemValue(SnapshotService.NOSNAPSHOT, true);
documentService.save(metricData); documentService.save(metricData);
} }

View file

@ -11,6 +11,8 @@ import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil; import com.alexanderlogistics.InvoiceUtil;
import jakarta.ejb.Stateless; import jakarta.ejb.Stateless;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path; import jakarta.ws.rs.Path;
@ -87,9 +89,11 @@ public class MetricDebitorRestService {
* *
* @throws QueryException * @throws QueryException
* @throws InterruptedException * @throws InterruptedException
* @throws PluginException
* *
*/ */
public void computeMetrics(StringBuffer messageBuffer) throws QueryException, InterruptedException { public void computeMetrics(StringBuffer messageBuffer)
throws QueryException, InterruptedException, PluginException {
long l = System.currentTimeMillis(); long l = System.currentTimeMillis();
int batchSize = 500; int batchSize = 500;
int totalInvoices = 0; int totalInvoices = 0;
@ -105,20 +109,22 @@ public class MetricDebitorRestService {
// Verarbeite Page für Page // Verarbeite Page für Page
for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) {
List<ItemCollection> invoices = documentService.find(query, batchSize, pageIndex); totalInvoices = totalInvoices + computeInvoiceMetrics(query, batchSize, pageIndex);
// List<ItemCollection> invoices = documentService.find(query, batchSize,
// pageIndex);
for (ItemCollection invoice : invoices) { // for (ItemCollection invoice : invoices) {
try { // try {
ItemCollection metricData = metricDebitorService.getMetricByInvoice(invoice); // ItemCollection metricData = metricDebitorService.getMetricByInvoice(invoice);
// Jetzt Rechnung addieren // // Jetzt Rechnung addieren
metricDebitorService.addInvoice(metricData, invoice); // metricDebitorService.addInvoice(metricData, invoice);
logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice)); // logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice));
metricDebitorService.updateMetric(metricData, true); // metricDebitorService.updateMetric(metricData, true);
totalInvoices++; // totalInvoices++;
} catch (PluginException e) { // } catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number // // invalid invoice - e.g. no dbtr. number
} // }
} // }
// Fortschritt loggen // Fortschritt loggen
log("│   │ ├── Processed page " + (pageIndex + 1) + " of " + totalPages + log("│   │ ├── Processed page " + (pageIndex + 1) + " of " + totalPages +
@ -135,6 +141,37 @@ public class MetricDebitorRestService {
} }
/**
* Helper method runs in new transaction
*
* @param query
* @param batchSize
* @param pageIndex
* @throws PluginException
* @throws QueryException
*/
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public int computeInvoiceMetrics(String query, int batchSize, int pageIndex)
throws PluginException, QueryException {
int updates = 0;
List<ItemCollection> invoices = documentService.find(query, batchSize, pageIndex);
for (ItemCollection invoice : invoices) {
try {
ItemCollection metricData = metricDebitorService.getMetricByInvoice(invoice);
// Jetzt Rechnung addieren
metricDebitorService.addInvoice(metricData, invoice);
logger.fine("│   │   │   ├── update metric " + InvoiceUtil.getBPId(invoice));
metricDebitorService.updateMetric(metricData, true);
updates++;
} catch (PluginException e) {
// invalid invoice - e.g. no dbtr. number
}
}
return updates;
}
private void log(String message, StringBuffer messageLog) { private void log(String message, StringBuffer messageLog) {
logger.info(message); logger.info(message);
messageLog.append(message + "\n"); messageLog.append(message + "\n");

View file

@ -12,6 +12,7 @@ import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry; import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.Tag; import org.eclipse.microprofile.metrics.Tag;
import org.eclipse.microprofile.metrics.annotation.RegistryScope; import org.eclipse.microprofile.metrics.annotation.RegistryScope;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.ProcessingEvent; import org.imixs.workflow.engine.ProcessingEvent;
@ -23,6 +24,7 @@ import com.alexanderlogistics.InvoiceUtil;
import jakarta.annotation.security.DeclareRoles; import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed; import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs; import jakarta.annotation.security.RunAs;
import jakarta.ejb.Singleton;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes; import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -46,6 +48,7 @@ import jakarta.inject.Inject;
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS", "org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" }) "org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS") @RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Singleton
@ApplicationScoped @ApplicationScoped
public class MetricDebitorService { public class MetricDebitorService {
@ -257,6 +260,7 @@ public class MetricDebitorService {
ItemCollection metricData = new ItemCollection(); ItemCollection metricData = new ItemCollection();
metricData.setType(TYPE_METRIC_DEBITOR); metricData.setType(TYPE_METRIC_DEBITOR);
metricData.setItemValue("name", key); metricData.setItemValue("name", key);
metricData.setItemValue(SnapshotService.NOSNAPSHOT, true);
metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice)); metricData.setItemValue("bp.id", InvoiceUtil.getBPId(invoice));
metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice)); metricData.setItemValue("bp.name", InvoiceUtil.getBPName(invoice));
metricData.setItemValue("country", invoice.getItemValueString("invoice.country")); metricData.setItemValue("country", invoice.getItemValueString("invoice.country"));
@ -281,6 +285,7 @@ public class MetricDebitorService {
// In Datenbank persistieren // In Datenbank persistieren
if (persist) { if (persist) {
metricData.setItemValue(SnapshotService.NOSNAPSHOT, true);
documentService.save(metricData); documentService.save(metricData);
} }
@ -374,16 +379,4 @@ public class MetricDebitorService {
} }
/**
* Helper Method that refreshes all gauges. The method is called by the
* RestService during a rebuild.
*/
// public void refreshGauges() {
// List<String> keys = getMetricKeys();
// for (String hashKey : keys) {
// ItemCollection metricData = getMetric(hashKey);
// updateMetric(metricData, false);
// }
// }
} }

View file

@ -31,6 +31,7 @@ package com.alexanderlogistics.xml;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentEvent; import org.imixs.workflow.engine.DocumentEvent;
import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.engine.DocumentService;
@ -44,6 +45,9 @@ import org.imixs.workflow.exceptions.QueryException;
import com.alexanderlogistics.InvoiceUtil; import com.alexanderlogistics.InvoiceUtil;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.annotation.security.RunAs;
import jakarta.ejb.EJB; import jakarta.ejb.EJB;
import jakarta.ejb.Stateless; import jakarta.ejb.Stateless;
import jakarta.enterprise.event.Observes; import jakarta.enterprise.event.Observes;
@ -56,10 +60,19 @@ import jakarta.enterprise.event.Observes;
* ein und prüft ob der Workflow schon existiert oder ggf. aktualisiert werden * ein und prüft ob der Workflow schon existiert oder ggf. aktualisiert werden
* muss. * muss.
* *
* The service set also the flag NOSNAPSHOT=true for the crgosoftcreditor
* document type.
* *
* @author rsoika * @author rsoika
* *
*/ */
@DeclareRoles({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RolesAllowed({ "org.imixs.ACCESSLEVEL.NOACCESS", "org.imixs.ACCESSLEVEL.READERACCESS",
"org.imixs.ACCESSLEVEL.AUTHORACCESS", "org.imixs.ACCESSLEVEL.EDITORACCESS",
"org.imixs.ACCESSLEVEL.MANAGERACCESS" })
@RunAs("org.imixs.ACCESSLEVEL.MANAGERACCESS")
@Stateless @Stateless
public class BusinessPartnerImportService { public class BusinessPartnerImportService {
@ -92,8 +105,16 @@ public class BusinessPartnerImportService {
if (event.getEventType() == DocumentEvent.ON_DOCUMENT_SAVE) { if (event.getEventType() == DocumentEvent.ON_DOCUMENT_SAVE) {
// check type! // check type!
if ("cargosoftkreditor".equals(event.getDocument().getType())) { if ("cargosoftkreditor".equals(event.getDocument().getType())) {
logger.info("Verify business partner object...."); // set NOSNAPSHOT=true
event.getDocument().setItemValue(SnapshotService.NOSNAPSHOT, true);
// run only if we have the model 'businesspartner-*';
if (modelService.findVersionsByRegEx("(businesspartner*)").size() == 0) {
// no business partner workflow found
return;
}
logger.info("Verify business partner object....");
ItemCollection importDoc = event.getDocument(); ItemCollection importDoc = event.getDocument();
String name = event.getDocument().getItemValueString("name"); String name = event.getDocument().getItemValueString("name");

View file

@ -1291,7 +1291,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<imixs:value><![CDATA[2]]></imixs:value> <imixs:value><![CDATA[2]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keypublicresult" type="xs:string"> <imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value> <imixs:value><![CDATA[0]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keylogdateformat" type="xs:string"> <imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value> <imixs:value><![CDATA[2]]></imixs:value>
@ -1404,7 +1404,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht</bpmn2:text>
<imixs:value><![CDATA[2]]></imixs:value> <imixs:value><![CDATA[2]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keypublicresult" type="xs:string"> <imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value> <imixs:value><![CDATA[0]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keylogdateformat" type="xs:string"> <imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value> <imixs:value><![CDATA[2]]></imixs:value>

View file

@ -54,10 +54,10 @@
</bpmn2:participant> </bpmn2:participant>
<bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/> <bpmn2:participant id="Participant_2" name="SEPA-Export Pool" processRef="eingangsrechnung-de"/>
</bpmn2:collaboration> </bpmn2:collaboration>
<bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="SEPA-Export"> <bpmn2:process id="eingangsrechnung-de" isExecutable="false" name="SEPA-Export" processType="Public">
<bpmn2:documentation id="documentation_FFzgqw"/> <bpmn2:documentation id="documentation_FFzgqw"/>
</bpmn2:process> </bpmn2:process>
<bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="SEPA-Export"> <bpmn2:process definitionalCollaborationRef="Collaboration_1" id="Process_1" isExecutable="false" name="SEPA-Export" processType="Private">
<bpmn2:laneSet id="LaneSet_1" name="Lane Set 1"> <bpmn2:laneSet id="LaneSet_1" name="Lane Set 1">
<bpmn2:lane id="Lane_1" name="Buchhaltung"> <bpmn2:lane id="Lane_1" name="Buchhaltung">
<bpmn2:flowNodeRef>IntermediateCatchEvent_6</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>IntermediateCatchEvent_6</bpmn2:flowNodeRef>
@ -800,7 +800,7 @@ result.isValid=true;
<bpmn2:sequenceFlow id="sequenceFlow_nyv4vw" sourceRef="gateway_WuKeqQ" targetRef="IntermediateCatchEvent_7"> <bpmn2:sequenceFlow id="sequenceFlow_nyv4vw" sourceRef="gateway_WuKeqQ" targetRef="IntermediateCatchEvent_7">
<bpmn2:documentation id="documentation_RRr33A"/> <bpmn2:documentation id="documentation_RRr33A"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_y4hmYg" imixs:activityid="90" name="[automatic 15min]"> <bpmn2:intermediateCatchEvent id="event_y4hmYg" imixs:activityid="90" name="[automatic 1min]">
<bpmn2:extensionElements> <bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string"> <imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value> <imixs:value><![CDATA[2]]></imixs:value>
@ -859,7 +859,7 @@ result.isValid=true;
<imixs:value><![CDATA[3]]></imixs:value> <imixs:value><![CDATA[3]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="numactivitydelay" type="xs:string"> <imixs:item name="numactivitydelay" type="xs:string">
<imixs:value><![CDATA[15]]></imixs:value> <imixs:value><![CDATA[1]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="keyactivitydelayunit" type="xs:string"> <imixs:item name="keyactivitydelayunit" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value> <imixs:value><![CDATA[1]]></imixs:value>
@ -1012,7 +1012,7 @@ result.isValid=true;
<bpmndi:BPMNShape bpmnElement="ExclusiveGateway_1" id="BPMNShape_ExclusiveGateway_1" isMarkerVisible="true"> <bpmndi:BPMNShape bpmnElement="ExclusiveGateway_1" id="BPMNShape_ExclusiveGateway_1" isMarkerVisible="true">
<dc:Bounds height="50.0" width="50.0" x="720.0" y="410.0"/> <dc:Bounds height="50.0" width="50.0" x="720.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_34" labelStyle="BPMNLabelStyle_1"> <bpmndi:BPMNLabel id="BPMNLabel_34" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="690.0" y="450.0"/> <dc:Bounds height="20.0" width="100.0" x="695.0" y="463.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="TextAnnotation_2" id="BPMNShape_TextAnnotation_2"> <bpmndi:BPMNShape bpmnElement="TextAnnotation_2" id="BPMNShape_TextAnnotation_2">
@ -1073,7 +1073,7 @@ result.isValid=true;
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_7" id="BPMNEdge_SequenceFlow_7" sourceElement="BPMNShape_IntermediateCatchEvent_1" targetElement="BPMNShape_Task_7"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_7" id="BPMNEdge_SequenceFlow_7" sourceElement="BPMNShape_IntermediateCatchEvent_1" targetElement="BPMNShape_Task_7">
<bpmndi:BPMNLabel id="BPMNLabel_18"/> <bpmndi:BPMNLabel id="BPMNLabel_18"/>
<di:waypoint x="572.0" y="498.416876048223"/> <di:waypoint x="572.0" y="498.0"/>
<di:waypoint x="572.0" y="479.0"/> <di:waypoint x="572.0" y="479.0"/>
<di:waypoint x="617.0" y="479.0"/> <di:waypoint x="617.0" y="479.0"/>
<di:waypoint x="617.0" y="460.0"/> <di:waypoint x="617.0" y="460.0"/>
@ -1106,7 +1106,7 @@ result.isValid=true;
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_8" id="BPMNEdge_SequenceFlow_8" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_7"> <bpmndi:BPMNEdge bpmnElement="SequenceFlow_8" id="BPMNEdge_SequenceFlow_8" sourceElement="BPMNShape_IntermediateCatchEvent_3" targetElement="BPMNShape_Task_7">
<bpmndi:BPMNLabel id="BPMNLabel_22"/> <bpmndi:BPMNLabel id="BPMNLabel_22"/>
<di:waypoint x="670.0" y="497.7083835342094"/> <di:waypoint x="670.0" y="498.0"/>
<di:waypoint x="670.0" y="479.0"/> <di:waypoint x="670.0" y="479.0"/>
<di:waypoint x="617.0" y="479.0"/> <di:waypoint x="617.0" y="479.0"/>
<di:waypoint x="617.0" y="460.0"/> <di:waypoint x="617.0" y="460.0"/>
@ -1140,9 +1140,9 @@ result.isValid=true;
<bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_TextAnnotation_3" targetElement="BPMNShape_IntermediateCatchEvent_2"> <bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_TextAnnotation_3" targetElement="BPMNShape_IntermediateCatchEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_11"/> <bpmndi:BPMNLabel id="BPMNLabel_11"/>
<di:waypoint x="932.0" y="304.0"/> <di:waypoint x="932.0" y="304.0"/>
<di:waypoint x="932.0" y="363.5"/> <di:waypoint x="932.0" y="364.0"/>
<di:waypoint x="845.0" y="363.5"/> <di:waypoint x="845.0" y="364.0"/>
<di:waypoint x="845.0" y="417.25176065070116"/> <di:waypoint x="845.0" y="417.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"/>
@ -1158,21 +1158,21 @@ result.isValid=true;
<dc:Bounds height="50.0" width="175.0" x="1200.0" y="250.0"/> <dc:Bounds height="50.0" width="175.0" x="1200.0" y="250.0"/>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_bYlYaQ" id="BPMNEdge_yt4O0Q" sourceElement="BPMNShape_60CxWw" targetElement="BPMNShape_IntermediateCatchEvent_18"> <bpmndi:BPMNEdge bpmnElement="association_bYlYaQ" id="BPMNEdge_yt4O0Q" sourceElement="BPMNShape_60CxWw" targetElement="BPMNShape_IntermediateCatchEvent_18">
<di:waypoint x="1287.5" y="300.0"/> <di:waypoint x="1288.0" y="300.0"/>
<di:waypoint x="1287.5" y="358.5"/> <di:waypoint x="1288.0" y="359.0"/>
<di:waypoint x="1235.0" y="358.5"/> <di:waypoint x="1235.0" y="359.0"/>
<di:waypoint x="1235.0" y="417.0"/> <di:waypoint x="1235.0" y="417.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="gateway_WuKeqQ" id="BPMNShape_AIK9sA"> <bpmndi:BPMNShape bpmnElement="gateway_WuKeqQ" id="BPMNShape_AIK9sA">
<dc:Bounds height="50.0" width="50.0" x="1080.0" y="540.0"/> <dc:Bounds height="50.0" width="50.0" x="1080.0" y="540.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_sirngw"> <bpmndi:BPMNLabel id="BPMNLabel_sirngw">
<dc:Bounds height="20.0" width="100.0" x="1052.0" y="590.0"/> <dc:Bounds height="20.0" width="100.0" x="1055.0" y="593.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway_6FAj9g" id="BPMNShape_Lgiawg"> <bpmndi:BPMNShape bpmnElement="gateway_6FAj9g" id="BPMNShape_Lgiawg">
<dc:Bounds height="50.0" width="50.0" x="1080.0" y="410.0"/> <dc:Bounds height="50.0" width="50.0" x="1080.0" y="410.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_he95hQ"> <bpmndi:BPMNLabel id="BPMNLabel_he95hQ">
<dc:Bounds height="20.0" width="100.0" x="1050.0" y="464.0"/> <dc:Bounds height="20.0" width="100.0" x="1055.0" y="463.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_rhKXDQ" id="BPMNEdge_14t8lw" sourceElement="BPMNShape_Lgiawg" targetElement="BPMNShape_IntermediateCatchEvent_18"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_rhKXDQ" id="BPMNEdge_14t8lw" sourceElement="BPMNShape_Lgiawg" targetElement="BPMNShape_IntermediateCatchEvent_18">
@ -1188,19 +1188,19 @@ result.isValid=true;
<di:waypoint x="1217.0" y="565.0"/> <di:waypoint x="1217.0" y="565.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_y4hmYg" id="BPMNShape_BtOh7A"> <bpmndi:BPMNShape bpmnElement="event_y4hmYg" id="BPMNShape_BtOh7A">
<dc:Bounds height="36.0" width="36.0" x="727.0" y="327.0"/> <dc:Bounds height="36.0" width="36.0" x="727.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_a0n0xA"> <bpmndi:BPMNLabel id="BPMNLabel_a0n0xA">
<dc:Bounds height="20.0" width="100.0" x="697.0" y="364.0"/> <dc:Bounds height="20.0" width="100.0" x="698.0" y="287.0"/>
</bpmndi:BPMNLabel> </bpmndi:BPMNLabel>
</bpmndi:BPMNShape> </bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0QFTlw" id="BPMNEdge_iWGl5g" sourceElement="BPMNShape_ExclusiveGateway_1" targetElement="BPMNShape_BtOh7A"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_0QFTlw" id="BPMNEdge_iWGl5g" sourceElement="BPMNShape_ExclusiveGateway_1" targetElement="BPMNShape_BtOh7A">
<di:waypoint x="745.0" y="410.0"/> <di:waypoint x="745.0" y="410.0"/>
<di:waypoint x="745.0" y="363.0"/> <di:waypoint x="745.0" y="353.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ePZrvQ" id="BPMNEdge_hQ0KPA" sourceElement="BPMNShape_BtOh7A" targetElement="BPMNShape_IntermediateCatchEvent_2"> <bpmndi:BPMNEdge bpmnElement="sequenceFlow_ePZrvQ" id="BPMNEdge_hQ0KPA" sourceElement="BPMNShape_BtOh7A" targetElement="BPMNShape_IntermediateCatchEvent_2">
<di:waypoint x="763.0" y="345.0"/> <di:waypoint x="760.0" y="345.0"/>
<di:waypoint x="836.0" y="345.0"/> <di:waypoint x="835.0" y="345.0"/>
<di:waypoint x="836.0" y="421.58359213500125"/> <di:waypoint x="835.0" y="423.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_MJWNtQ" id="BPMNEdge_0VTopA" sourceElement="BPMNShape_TextAnnotation_1" targetElement="BPMNShape_IntermediateCatchEvent_1"> <bpmndi:BPMNEdge bpmnElement="association_MJWNtQ" id="BPMNEdge_0VTopA" sourceElement="BPMNShape_TextAnnotation_1" targetElement="BPMNShape_IntermediateCatchEvent_1">
<di:waypoint x="505.0" y="525.0"/> <di:waypoint x="505.0" y="525.0"/>