diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModel.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModel.java deleted file mode 100644 index bb931a7..0000000 --- a/dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModel.java +++ /dev/null @@ -1,88 +0,0 @@ -package ai.dynamixs.api; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.fail; - -import java.io.File; -import java.util.logging.Logger; - -import org.junit.jupiter.api.Test; -import org.openbpmn.bpmn.BPMNModel; -import org.openbpmn.bpmn.BPMNTypes; -import org.openbpmn.bpmn.elements.Activity; -import org.openbpmn.bpmn.elements.BPMNProcess; -import org.openbpmn.bpmn.elements.Event; -import org.openbpmn.bpmn.elements.core.BPMNPoint; -import org.openbpmn.bpmn.exceptions.BPMNModelException; -import org.openbpmn.bpmn.util.BPMNModelFactory; - -/** - * This class loads a BPMN 2.0 template and generates a model from a textual - * process description. - * - * @author rsoika - * - */ -public class GenerateModel { - - private static Logger logger = Logger.getLogger(GenerateModel.class.getName()); - - static BPMNModel model = null; - - /** - * This test reads a bpmn file containing a DataObject - */ - @Test - public void buildModel() { - try { - String out = "src/test/resources/process-example-en-0.0.1.bpmn"; - - logger.info("...read model"); - model = BPMNModelFactory.read("/template-en-0.0.0.bpmn"); - - BPMNProcess process = model.findProcessByName("Example"); - assertNotNull(process); - assertEquals(BPMNTypes.PROCESS_TYPE_PRIVATE, process.getProcessType()); - - assertEquals(1, process.getActivities().size()); - Activity referenceTask = process.getActivities().iterator().next(); - Event referenceEvent = (Event) process.findElementById("event_vIjHLQ"); // .getEvents().iterator().next(); - - // add 2 Tasks and connect these Tasks with an event.... - // Create a Task1 - BPMNPoint position = new BPMNPoint(150, 200); - int taskID = 1000; - - Activity task1 = (Activity) process.cloneBPMNElementNode(referenceTask); - task1.setName("Task-1"); - task1.setPosition(position); - task1.setAttribute("imixs:processid", "" + taskID); - taskID = taskID + 100; - - // add a event - Event event = (Event) process.cloneBPMNElementNode(referenceEvent); - event.setName("Event-1"); - position.setX(position.getX() + 200); - event.setPosition(position); - - Activity task2 = (Activity) process.cloneBPMNElementNode(referenceTask); - task1.setName("Task-2"); - position.setX(position.getX() + 100); - task2.setPosition(position); - task2.setAttribute("imixs:processid", "" + taskID); - - process.addSequenceFlow("sequence-flow-1", task1.getId(), event.getId()); - process.addSequenceFlow("sequence-flow-2", event.getId(), task2.getId()); - - File file = new File(out); - model.save(file); - logger.info("...model created successful: " + out); - } catch (BPMNModelException e) { - e.printStackTrace(); - fail(); - } - logger.info("...model read successful: "); - } - -} diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java new file mode 100644 index 0000000..a909456 --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java @@ -0,0 +1,66 @@ +package ai.dynamixs.model.builder; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.File; +import java.util.logging.Logger; + +import org.junit.jupiter.api.Test; +import org.openbpmn.bpmn.BPMNModel; +import org.openbpmn.bpmn.BPMNTypes; +import org.openbpmn.bpmn.elements.Activity; +import org.openbpmn.bpmn.elements.BPMNProcess; +import org.openbpmn.bpmn.elements.Event; +import org.openbpmn.bpmn.exceptions.BPMNModelException; +import org.openbpmn.bpmn.util.BPMNModelFactory; + +/** + * This class loads a BPMN 2.0 template and generates a model from a textual + * process description. + */ +public class GenerateModel { + + private static Logger logger = Logger.getLogger(GenerateModel.class.getName()); + + /** + * Generates a BPMN model from a process description file. + */ + @Test + public void buildModel() { + try { + String out = "src/test/resources/supplier-compliance-process.bpmn"; + String descriptionFile = "src/test/resources/process-description.txt"; + + logger.info("...read template"); + BPMNModel model = BPMNModelFactory.read("/template-en-0.0.0.bpmn"); + + BPMNProcess process = model.findProcessByName("Example"); + assertNotNull(process); + assertEquals(BPMNTypes.PROCESS_TYPE_PRIVATE, process.getProcessType()); + assertEquals(1, process.getActivities().size()); + + Activity referenceTask = process.getActivities().iterator().next(); + Event referenceEvent = (Event) process.findElementById("event_vIjHLQ"); + + // Parse description and generate BPMN elements + ProcessDescriptionParser parser = new ProcessDescriptionParser(); + parser.getLayoutCalculator().setStartPosition(300, 300); + parser.parseAndGenerate(descriptionFile, process, referenceTask, referenceEvent); + + // Save model + File file = new File(out); + model.save(file); + + logger.info("...model created successful: " + out); + + } catch (BPMNModelException e) { + e.printStackTrace(); + fail(); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModelDemo.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModelDemo.java similarity index 94% rename from dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModelDemo.java rename to dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModelDemo.java index 20398a8..330c47a 100644 --- a/dynamixs-ai-app/src/test/java/ai/dynamixs/api/GenerateModelDemo.java +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModelDemo.java @@ -1,4 +1,4 @@ -package ai.dynamixs.api; +package ai.dynamixs.model.builder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -42,6 +42,8 @@ public class GenerateModelDemo { model = BPMNModelFactory.read("/template-en-0.0.0.bpmn"); BPMNProcess process = model.findProcessByName("Example"); + process.addLane("Accounting"); + process.addLane("Sales Team"); assertNotNull(process); assertEquals(BPMNTypes.PROCESS_TYPE_PRIVATE, process.getProcessType()); @@ -63,6 +65,7 @@ public class GenerateModelDemo { // add a event Event event = (Event) process.cloneBPMNElementNode(referenceEvent); event.setName("Event-1"); + event.setAttribute("imixs:activityid", "" + 10); position.setX(position.getX() + 200); event.setPosition(position); diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/LayoutCalculator.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/LayoutCalculator.java new file mode 100644 index 0000000..26a7320 --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/LayoutCalculator.java @@ -0,0 +1,119 @@ +package ai.dynamixs.model.builder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Calculates grid positions for BPMN elements (tasks, events, lanes). + */ +public class LayoutCalculator { + + // Element dimensions + public static final int TASK_WIDTH = 110; + public static final int TASK_HEIGHT = 50; + public static final int EVENT_SIZE = 36; + public static final int LANE_HEIGHT = 230; + + // Layout configuration + private int startX = 100; + private int startY = 100; + private int taskSpacingX = 200; + private int eventSpacingX = 50; + + // Calculated positions + private Map taskPositions = new HashMap<>(); // taskId -> [x, y] + private Map eventPositions = new HashMap<>(); // "taskId_eventId" -> [x, y] + private Map laneIndexMap = new HashMap<>(); // teamName -> laneIndex (0-based) + + /** + * Registers lanes and calculates their order. + * + * @param laneNames List of lane names in order + */ + public void calculateLanePositions(List laneNames) { + laneIndexMap.clear(); + int index = 0; + for (String laneName : laneNames) { + if (!laneIndexMap.containsKey(laneName)) { + laneIndexMap.put(laneName, index++); + } + } + } + + /** + * Returns the Y position for a lane. + */ + public double getLaneY(String laneName) { + Integer index = laneIndexMap.get(laneName); + if (index == null) + return startY; + return startY + (index * LANE_HEIGHT); + } + + /** + * Calculates positions for all tasks. + * + * @param taskIds List of task IDs in order + * @param taskLanes Map of task ID to lane name + */ + public void calculateTaskPositions(List taskIds, Map taskLanes) { + taskPositions.clear(); + double currentX = startX; + + for (Integer taskId : taskIds) { + String lane = taskLanes.get(taskId); + double y = getLaneY(lane) + (LANE_HEIGHT / 2.0) - (TASK_HEIGHT / 2.0); // Center in lane + taskPositions.put(taskId, new double[] { currentX, y }); + currentX += TASK_WIDTH + taskSpacingX; + } + } + + /** + * Calculates position for an event. + * + * @param sourceTaskId The source task ID + * @param eventId The event ID + * @param eventIndex Index of this event among all events of the source task + * (0-based) + * @param laneName The lane name where the event should be placed + */ + public void calculateEventPosition(int sourceTaskId, int eventId, int eventIndex, String laneName) { + double[] taskPos = taskPositions.get(sourceTaskId); + if (taskPos == null) + return; + + double eventX = taskPos[0] + (TASK_WIDTH / 2.0) - (EVENT_SIZE / 2.0) + (eventIndex * eventSpacingX); + double eventY = getLaneY(laneName) + (LANE_HEIGHT / 2.0) + (TASK_HEIGHT / 2.0) + 20; // Below task in same lane + + eventPositions.put(sourceTaskId + "_" + eventId, new double[] { eventX, eventY }); + } + + /** + * Returns the position of a task. + */ + public double[] getTaskPosition(int taskId) { + return taskPositions.get(taskId); + } + + /** + * Returns the position of an event. + */ + public double[] getEventPosition(int sourceTaskId, int eventId) { + return eventPositions.get(sourceTaskId + "_" + eventId); + } + + // Configuration setters + public void setStartPosition(int x, int y) { + this.startX = x; + this.startY = y; + } + + public void setTaskSpacingX(int spacing) { + this.taskSpacingX = spacing; + } + + public void setEventSpacingX(int spacing) { + this.eventSpacingX = spacing; + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java new file mode 100644 index 0000000..5720dc7 --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java @@ -0,0 +1,303 @@ +package ai.dynamixs.model.builder; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openbpmn.bpmn.elements.Activity; +import org.openbpmn.bpmn.elements.BPMNProcess; +import org.openbpmn.bpmn.elements.Event; +import org.openbpmn.bpmn.elements.core.BPMNPoint; +import org.openbpmn.bpmn.exceptions.BPMNModelException; + +/** + * Parses a process description file and generates BPMN elements. Uses + * LayoutCalculator for positioning of elements. + */ +public class ProcessDescriptionParser { + + private static final Logger logger = Logger.getLogger(ProcessDescriptionParser.class.getName()); + + // Regex patterns + private static final Pattern TASK_PATTERN = Pattern.compile( + "\\|-\\s*\\[Task:\\s*(\\d+)\\]\\s*(.+)$"); + private static final Pattern EVENT_PATTERN = Pattern.compile( + "\\|--\\s*\\[Event:\\s*(\\d+)\\]\\s*([^(]+)\\s*\\([^)]*\\)\\s*-->\\s*\\[Task:\\s*(\\d+)\\]"); + + // Layout calculator + private LayoutCalculator layoutCalculator = new LayoutCalculator(); + + // Storage for created elements + private Map tasks = new HashMap<>(); + private List events = new ArrayList<>(); + private Map taskLanes = new HashMap<>(); + private int sequenceFlowCounter = 1; + + /** + * Internal class to hold event data before creating BPMN elements. + */ + private static class EventData { + int eventId; + String name; + int sourceTaskId; + int targetTaskId; + + EventData(int eventId, String name, int sourceTaskId, int targetTaskId) { + this.eventId = eventId; + this.name = name; + this.sourceTaskId = sourceTaskId; + this.targetTaskId = targetTaskId; + } + + String getKey() { + return sourceTaskId + "_" + eventId; + } + } + + /** + * Simple data holder for tasks during parsing. + */ + private static class TaskData { + int id; + String name; + String description; + String team; + + TaskData(int id, String name) { + this.id = id; + this.name = name; + } + } + + /** + * Parses the description file and creates all BPMN elements in the process. + */ + public void parseAndGenerate(String filePath, BPMNProcess process, + Activity referenceTask, Event referenceEvent) throws IOException, BPMNModelException { + + tasks.clear(); + events.clear(); + taskLanes.clear(); + + // Parse file and collect task/event data + List taskDataList = parseFile(filePath); + + // Collect unique lanes (in order of first appearance) + List laneNames = new ArrayList<>(); + for (TaskData taskData : taskDataList) { + if (taskData.team != null && !laneNames.contains(taskData.team)) { + laneNames.add(taskData.team); + } + taskLanes.put(taskData.id, taskData.team); + } + + // Create BPMN lanes + for (String laneName : laneNames) { + process.addLane(laneName); + logger.info("Created lane: " + laneName); + } + + // Calculate layout + layoutCalculator.calculateLanePositions(laneNames); + + List taskIds = taskDataList.stream().map(t -> t.id).toList(); + layoutCalculator.calculateTaskPositions(taskIds, taskLanes); + + // Calculate layout for all events + for (EventData eventData : events) { + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + String laneName = taskLanes.get(eventData.sourceTaskId); + layoutCalculator.calculateEventPosition(eventData.sourceTaskId, eventData.eventId, eventIndex, laneName); + } + + // Create BPMN tasks + createTasks(taskDataList, process, referenceTask); + + // Create BPMN events + Map createdEvents = createEvents(process, referenceEvent); + + // Create sequence flows + createSequenceFlows(process, createdEvents); + + logger.info("Generated " + tasks.size() + " tasks, " + createdEvents.size() + " events, " + laneNames.size() + + " lanes"); + } + + /** + * Parses the file and returns task data list. Also populates events list. + */ + private List parseFile(String filePath) throws IOException { + List taskDataList = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + TaskData currentTask = null; + StringBuilder descBuilder = new StringBuilder(); + boolean readingDesc = false; + + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + + // Match task + Matcher taskMatcher = TASK_PATTERN.matcher(trimmed); + if (taskMatcher.find()) { + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + currentTask = new TaskData( + Integer.parseInt(taskMatcher.group(1)), + taskMatcher.group(2).trim()); + taskDataList.add(currentTask); + descBuilder = new StringBuilder(); + readingDesc = false; + continue; + } + + // Match team + if (trimmed.contains("Team:") && currentTask != null) { + int teamIndex = trimmed.indexOf("Team:"); + currentTask.team = trimmed.substring(teamIndex + 5).trim(); + continue; + } + + // Match event + Matcher eventMatcher = EVENT_PATTERN.matcher(trimmed); + if (eventMatcher.find() && currentTask != null) { + readingDesc = false; + events.add(new EventData( + Integer.parseInt(eventMatcher.group(1)), + eventMatcher.group(2).trim(), + currentTask.id, + Integer.parseInt(eventMatcher.group(3)))); + continue; + } + + // Description handling + if (trimmed.contains("Description:")) { + readingDesc = true; + continue; + } + + if (readingDesc && currentTask != null && !trimmed.startsWith("|--")) { + String descLine = trimmed.replaceAll("^\\|\\s*", "").trim(); + if (!descLine.isEmpty()) { + if (descBuilder.length() > 0) + descBuilder.append(" "); + descBuilder.append(descLine); + } + } + } + + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + } + + return taskDataList; + } + + /** + * Creates BPMN task elements. + */ + private void createTasks(List taskDataList, BPMNProcess process, + Activity referenceTask) throws BPMNModelException { + + for (TaskData taskData : taskDataList) { + double[] pos = layoutCalculator.getTaskPosition(taskData.id); + + Activity task = (Activity) process.cloneBPMNElementNode(referenceTask); + task.setName(taskData.name); + task.setPosition(new BPMNPoint(pos[0], pos[1])); + task.setAttribute("imixs:processid", String.valueOf(taskData.id)); + + if (taskData.description != null && !taskData.description.isEmpty()) { + task.setDocumentation(taskData.description); + } + + tasks.put(taskData.id, task); + logger.info("Created task: " + taskData.id + " - " + taskData.name); + } + } + + /** + * Creates BPMN event elements. + */ + private Map createEvents(BPMNProcess process, + Event referenceEvent) throws BPMNModelException { + + Map createdEvents = new HashMap<>(); + + for (EventData eventData : events) { + double[] pos = layoutCalculator.getEventPosition(eventData.sourceTaskId, eventData.eventId); + if (pos == null) + continue; + + Event event = (Event) process.cloneBPMNElementNode(referenceEvent); + event.setName(eventData.name); + event.setPosition(new BPMNPoint(pos[0], pos[1])); + // Calculate activity ID: first event = 10, second = 20, etc. (per task) + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + int activityId = (eventIndex + 1) * 10; + event.setAttribute("imixs:activityid", String.valueOf(activityId)); + + createdEvents.put(eventData.getKey(), event); + logger.info("Created event: " + eventData.getKey() + " - " + eventData.name); + } + + return createdEvents; + } + + /** + * Creates sequence flows between tasks and events. + */ + private void createSequenceFlows(BPMNProcess process, + Map createdEvents) throws BPMNModelException { + + for (EventData eventData : events) { + Activity sourceTask = tasks.get(eventData.sourceTaskId); + Event event = createdEvents.get(eventData.getKey()); + Activity targetTask = tasks.get(eventData.targetTaskId); + + if (sourceTask == null || event == null || targetTask == null) + continue; + + if (eventData.sourceTaskId == eventData.targetTaskId) { + // Self-loop (CatchEvent): only sequence flow from event to task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } else { + // Normal flow: task -> event -> target task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, sourceTask.getId(), event.getId()); + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } + } + } + + /** + * Returns the index of an event among all events of a source task. + */ + private int getEventIndex(int taskId, int eventId) { + int index = 0; + for (EventData e : events) { + if (e.sourceTaskId == taskId) { + if (e.eventId == eventId) + return index; + index++; + } + } + return 0; + } + + /** + * Returns the layout calculator for configuration. + */ + public LayoutCalculator getLayoutCalculator() { + return layoutCalculator; + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/process-example-en-0.0.1.bpmn b/dynamixs-ai-app/src/test/resources/process-example-en-0.0.1.bpmn index b35adf1..89de448 100644 --- a/dynamixs-ai-app/src/test/resources/process-example-en-0.0.1.bpmn +++ b/dynamixs-ai-app/src/test/resources/process-example-en-0.0.1.bpmn @@ -53,10 +53,12 @@ StartEvent_1 EndEvent_2 event_vIjHLQ - task_4bAwfw - task_2sKNSg - event_rprNxA + task_HQd8AQ + event_6HJvNQ + task_HQ9VcQ + + @@ -123,13 +125,7 @@ - - - - - - - + @@ -168,56 +164,58 @@ - + sequence-flow-1 - - - - - - - - - - - - - request.subject]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - sequence-flow-2 - - - + + sequence-flow-1 sequence-flow-2 + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sequence-flow-2 + + + @@ -234,15 +232,15 @@ - + - + - + - + @@ -252,12 +250,12 @@ - + - + - + @@ -270,42 +268,48 @@ - + - + - - + + - - + + - - + + - + + + + + + + - - - - + + + + - - + + - - - + + + - - - + + + diff --git a/dynamixs-ai-app/src/test/resources/supplier-compliance-process copy.bpmn b/dynamixs-ai-app/src/test/resources/supplier-compliance-process copy.bpmn new file mode 100644 index 0000000..9d44487 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/supplier-compliance-process copy.bpmn @@ -0,0 +1,1152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + task_4Je5VA + task_90uybA + task_jcIWOA + event_aoElXw + event_BJ01EA + event_a96S6w + EndEvent_2 + StartEvent_1 + + + + task_BNMMug + task_BD5EZg + task_a1ti9A + task_g3TwGg + task_x8iL2A + event_Kkv8EA + event_c5F0xw + event_lSbYng + event_qRFfaw + event_kPjmKA + event_BRDjYw + event_3KQ6uQ + event_4H9yaA + event_y8Hbzg + event_IAxKbw + + + + task_SdyocA + event_ukbSxg + event_JkMTfQ + event_O1CAAQ + event_r6B3vw + + + + task_OFIp6A + event_hF709Q + event_MSCGTg + + + + + sequenceFlow_8NDJxA + + + + sequenceFlow_0iUGnA + + + + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-1 + sf-3 + sequenceFlow_8NDJxA + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-2 + sf-4 + sf-6 + sf-8 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-7 + sf-10 + sf-12 + sf-14 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-5 + sf-11 + sf-16 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-13 + sf-17 + sf-18 + sf-20 + sf-21 + sf-26 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-19 + sf-23 + sf-25 + sf-27 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-24 + sf-29 + sf-31 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-30 + sf-33 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + [Task: 2900] Rejected]]> + sf-9 + sf-15 + sf-22 + sf-28 + sf-32 + sf-35 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-34 + sf-36 + sequenceFlow_0iUGnA + + + + sf-1 + sf-2 + + + + sf-3 + + + + sf-4 + sf-5 + + + + sf-6 + sf-7 + + + + sf-8 + sf-9 + + + + sf-10 + sf-11 + + + + sf-12 + sf-13 + + + + sf-14 + sf-15 + + + + sf-16 + sf-17 + + + + sf-18 + sf-19 + + + + sf-20 + + + + sf-21 + sf-22 + + + + sf-23 + sf-24 + + + + sf-25 + sf-26 + + + + sf-27 + sf-28 + + + + sf-29 + sf-30 + + + + sf-31 + sf-32 + + + + sf-33 + sf-34 + + + + sf-35 + sf-36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn b/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn new file mode 100644 index 0000000..db4e033 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + Task_2 + StartEvent_1 + EndEvent_2 + event_vIjHLQ + + + task_0Ni3dA + task_bu51Hw + task_eYFfCg + event_JdA0HA + event_LdLZqg + event_qj3K3g + + + task_UB6SdQ + task_CuooOg + task_LEajxw + task_R3enYA + task_UBaJMA + event_205BxA + event_Ufx05Q + event_CdQGKA + event_dIyqPQ + event_65MrZA + event_gYoHBQ + event_rHwjGg + event_wIadug + event_FhUrfg + event_7e0zTg + event_1S96nA + + + task_9uAd1w + event_8E1sKQ + event_Y1zrvA + event_cXTXNQ + + + task_Rc2gyQ + event_aecfcQ + event_oMYIsQ + + + + + sequenceFlow_8NDJxA + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sequenceFlow_khuDtw + sequenceFlow_Gj9mmA + + + + sequenceFlow_Gj9mmA + + + + + + + + + + sequenceFlow_8NDJxA + sequenceFlow_khuDtw + + + + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-1 + sf-3 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-2 + sf-4 + sf-6 + sf-8 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-7 + sf-10 + sf-12 + sf-14 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-5 + sf-11 + sf-16 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-13 + sf-17 + sf-18 + sf-20 + sf-21 + sf-26 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-19 + sf-23 + sf-25 + sf-27 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-24 + sf-29 + sf-31 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-30 + sf-33 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + [Task: 2900] Rejected]]> + sf-9 + sf-15 + sf-22 + sf-28 + sf-32 + sf-35 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-34 + sf-36 + + + + sf-1 + sf-2 + + + + sf-3 + + + + sf-4 + sf-5 + + + + sf-6 + sf-7 + + + + sf-8 + sf-9 + + + + sf-10 + sf-11 + + + + sf-12 + sf-13 + + + + sf-14 + sf-15 + + + + sf-16 + sf-17 + + + + sf-18 + sf-19 + + + + sf-20 + + + + sf-21 + sf-22 + + + + sf-23 + sf-24 + + + + sf-25 + sf-26 + + + + sf-27 + sf-28 + + + + sf-29 + sf-30 + + + + sf-31 + sf-32 + + + + sf-33 + sf-34 + + + + sf-35 + sf-36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynamixs-ai-app/src/test/resources/template-en-0.0.0.bpmn b/dynamixs-ai-app/src/test/resources/template-en-0.0.0.bpmn index 89ed3c9..8acf313 100644 --- a/dynamixs-ai-app/src/test/resources/template-en-0.0.0.bpmn +++ b/dynamixs-ai-app/src/test/resources/template-en-0.0.0.bpmn @@ -136,15 +136,15 @@ - + - + - + - + @@ -154,12 +154,12 @@ - + - + - + @@ -172,22 +172,22 @@ - + - + - - + + - - + + - - + +