diff --git a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/activities/workflow-activities/notify-workflow.md b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/activities/workflow-activities/notify-workflow.md index 6fb444d31c0..6b9dced333d 100644 --- a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/activities/workflow-activities/notify-workflow.md +++ b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/activities/workflow-activities/notify-workflow.md @@ -11,14 +11,30 @@ This activity can only be used in microflows. ## Introduction {#introduction} -The **Notify workflow** activity can be used to notify a [workflow](/refguide/workflows/) that is suspended on the [Wait for notification](/refguide/wait-for-notification/) workflow activity. +The **Notify workflow** activity is used to resume or trigger logic within a [workflow](/refguide/workflows/). It specifically targets two types of elements: -If the workflow is suspended on the specified wait for notification activity, then this activity will return `true` and the workflow execution will continue further. Otherwise, it will simply return `false`. +* A [Wait for Notification](/refguide/wait-for-notification/) workflow activity currently suspended in a flow. +* A [Notification Event Sub-process](/refguide/workflow-event-sub-processes/) defined within the workflow. + +When the **Notify workflow** action is executed, the engine checks for an active receiver. If a valid **Wait for Notification** activity or a **Notification Event Sub-process** is found and successfully triggered, the action returns `true`. If no active receiver is found, it returns `false`. {{% alert color="warning" %}} -When you try to notify a workflow which is already `Completed` or `Aborted`, it will result in a Runtime error. For information on how to handle the error, see [Error Handling in Microflows](/refguide/error-handling-in-microflows/). +Attempting to notify a workflow that is already `Completed` or `Aborted` will result in a runtime error. For information on how to handle these cases, see [Error Handling in Microflows](/refguide/error-handling-in-microflows/). {{% /alert %}} +### Execution Behavior + +The table below describes how the workflow engine responds when a **Notify workflow** action is called, depending on the state of the workflow and the type of receiver configured. + +| Workflow/Element State | Action Result | System Behavior | +|-------------------------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Aborted or Completed | Error | The action fails. An error is logged indicating the workflow is no longer in an active state and cannot be notified. | +| Paused, Failed, or Incompatible | True | The notification is accepted and "queued." The targeted activity or **Event Sub-process** will trigger automatically once the workflow is resumed or resolved. | +| **Wait for Notification** (Active) | True | The workflow resumes execution from the point of the **Wait for Notification** activity. | +| **Event Sub-process** (Inactive) | True | The **Event Sub-process** is triggered immediately and its execution path begins. | +| **Event Sub-process** (In Progress) | False | The notification is ignored because an instance of this specific sub-process is already running. No new instance is created. | +| No matching receiver | False | If the workflow is active but does not contain the specified **Wait for Notification** activity or **Event Sub-process**, the action returns `false`. | + ## Properties An example of **Notify workflow** properties is represented in the image below: diff --git a/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md b/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md new file mode 100644 index 00000000000..9fecb268c5e --- /dev/null +++ b/content/en/docs/refguide/modeling/application-logic/workflows/event-sub-processes.md @@ -0,0 +1,182 @@ +--- +title: "Event Sub-Processes" +url: /refguide/workflow-event-sub-processes/ +weight: 20 +--- + +## Introduction + +An Event Sub-process is a separate execution flow that is not part of the normal sequence flow of its workflow. It resides inside the workflow and starts executing upon receiving a specific trigger. +It is crucial to understand that an Event Sub-process is part of the same workflow instance. It is not a "separate" workflow; rather, a single workflow instance can contain multiple concurrent processes. + +Below is an example of what an Event Sub-process looks like: + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/event-sub-process-example.png" alt="Event Sub-process example" width="400" >}} + +### When to Use Event Sub-Processes + +An Event Sub-process is like a Boundary Event, with the exception that an Event Sub-process can start at any time, whereas a Boundary Event can start only while the activity it is attached to is active. +Choosing between a Boundary Event and an Event Sub-process is a common architectural crossroads. + +#### Ideal Use Cases + +- **Global Exception Handling** – Handling errors or cancellations that could occur at any point during the workflow execution. +- **Isolated Logic** – Complex steps triggered by a specific event (e.g., "Change of Address") without cluttering the main flow. +- **Inline Updates** – Updating data in a long-running process without interrupting the primary state of the workflow. + +#### When NOT to Use + +- **Sequential Logic** – If the logic must happen after a specific task, use a standard sequence flow. +- **Conditional Logic Based on Activity State** – You may want to execute a flow only if a certain condition is met while a specific activity is active. A **Boundary Event** should be used here because it is triggered only if the activity it is attached to is active. +- **Returning to a Specific Point** – If you need to abort a specific task execution and resume it later, a **Boundary Event (Interrupting)** is often more appropriate. Once the event is triggered, the **Boundary Event** can utilize a **Jump activity** to return to the original task. + +### How Event Sub-Processes Work + +#### Lifecycle + +The Event Sub-process is initialized (but not started) as soon as the main process starts and remains in a waiting state until a notification is received. + +{{% alert color="info" %}} +**What keeps a workflow In Progress?** A workflow instance remains in the **In Progress** state as long as **at least one** of the following is true: + - The Main Process path has not yet reached its End Event. + - Any Event Sub-Process that was started has not yet reached its End Event. +{{% /alert %}} + +The workflow will **not** complete until all active execution paths, both the main flow and any triggered event sub-processes, have reached their respective End Events. + +#### Triggers and Notifications + +Event Sub-processes are triggered by a **Notify Workflow** microflow action. When the trigger is received, the sub-process becomes **In Progress**. + +#### Interrupting vs. Non-Interrupting + +- **Interrupting (Solid line)** – Immediately cancels the main process flow. +- **Non-Interrupting (Dashed line)** – Runs in parallel with the main flow. + +{{% alert color="warning" %}} +Currently, Mendix only supports the Non-interrupting variant of Event Sub-processes. Support for Interrupting Event Sub-processes is planned for a future release. +{{% /alert %}} + +#### Concurrency Limitation + +Mendix Workflows currently support a **single concurrent instance** per defined Event Sub-process. If a non-interrupting Event Sub-process is already active, subsequent attempts to trigger that same sub-process via the **Notify Workflow** action will return false. No new instances will be created for that specific sub-process while one is In Progress. A new instance can only be initiated once the active sub-process has completed its execution path. + +If your workflow has multiple, distinct Event Sub-processes defined (e.g., one for "Address Change" and one for "Document Upload"), each one can have its own active instance simultaneously. One being active does not prevent a different one from being triggered. + +## Getting started + +### Adding Event Sub-Processes + +To add an Event Sub-process to a workflow, follow these steps: + +* Select an Event Sub-process from the **Sub-processes** section in the workflow **Toolbox**. + +* Drag it onto a dashed drop zone adjacent to the main workflow process. + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/drag-and-drop.png" alt="Add Event Sub-process example" width="500" >}} + +* The sub-process flow will be contained within a dashed rectangle. This dashed border around the sub-process start event indicates that it is a non-interrupting sub-process. + +* The flow can contain the same types of activities as the main process flow (e.g., **User Task**, **Call Microflow**, **Decision**). + +* It must start with a **Start Event** (triggered by a notification) and end with at least one **End Event**. + +## Execution + +To start an Event Sub-process create a **Notify Workflow** microflow action and point it to the Event Sub-process start event. + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/notify-workflow.png" alt="Notify workflow example" width="400" >}} + +### Operational Lifecycle Management + +An Event Sub-process is bound to the lifecycle of its parent workflow instance. Administrative actions and system-level events (such as errors or version conflicts) directly impact the execution state of active sub-processes. + +The following table outlines how top-level workflow operations and system states affect any Event Sub-process currently In Progress: + +| Event or Operation | Effect on Event Sub-process | System Behavior | +|---------------------------|-----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| +| Abort Workflow | Aborted | The sub-process is permanently stopped and cannot be re-notified. | +| Restart Workflow | Aborted & Reset | The active sub-process instance is aborted. It returns to a waiting state and can be notified again. | +| Pause Workflow | Execution Halted | Execution of the sub-process halts immediately. Logic resumes from the same point once the workflow is Unpaused. | +| Workflow Incompatible | Execution Halted | The sub-process is "frozen" due to a version conflict. Execution resumes from the current point once the conflict is Resolved. | +| Error Inside Sub-process | Failed | The sub-process activity enters a Failed state. After the issue is fixed and the workflow is Retried, the sub-process resumes from the failed activity. | +| Error Outside Sub-process | Execution Halted | If a failure occurs elsewhere in the workflow, the healthy sub-process stops processing. It resumes once the error is fixed and the workflow is Retried. | + +## Jump Rules + +Event Sub-processes have specific restrictions regarding [Jump activity](/refguide/jump-activity/) and [Jump to](/refguide/jump-to/): + +* **Between Processes**: It is not possible to jump into a sub-process from the main process (or vice versa), nor between different sub-processes. +* **Within a Sub-process**: Jumps within the same sub-process are permitted. + * **Jump to Start Event**: Aborts the current sub-process instance and returns it to a waiting state. + * **Jump to End Event**: Completes the sub-process instance immediately. + +## Domain Model Structure + +To provide comprehensive monitoring, management, and auditing capabilities, the Mendix Workflow engine utilizes specific system entities and associations. These ensure that every Event Sub-process instance is traceable back to its definition and correctly linked to the overall workflow lifecycle. + +### WorkflowSubProcessDefinition + +The `WorkflowSubProcessDefinition` entity represents the metadata of a Sub-process as defined in the workflow model. + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process-definition.png" class="no-border" >}} + +#### Attributes + +| Attribute | Type | Description | +|--------------|---------|-------------------------------------------------------------------------------| +| `Caption` | String | The caption of the sub-process. | +| `IsObsolete` | Boolean | Set to `true` if the sub-process has been deleted from the application model. | + +#### Associations + +| Association | Parent Entity | Description | +|-----------------------------------------------------------|--------------------------------|-------------------------------------------------------------------------| +| `WorkflowSubProcessDefinition_WorkflowDefinition` | `WorkflowSubProcessDefinition` | Link to the parent workflow definition. | +| `WorkflowUserTaskDefinition_WorkflowSubProcessDefinition` | `WorkflowUserTaskDefinition` | Links user task definitions to their containing sub-process definition. | +| `WorkflowActivityRecord_WorkflowSubProcessDefinition` | `WorkflowActivityRecord` | Links historical activity records to the sub-process definition. | + +### WorkflowSubProcess + +The `WorkflowSubProcess` entity represents a specific runtime instance of an Event Sub-process. A `WorkflowSubProcess` object is created only after an Event Sub-process is notified and started its execution. + +{{< figure src="/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process.png" class="no-border" >}} + +#### Attributes + +| Attribute | Type | Description | +|-------------|--------------------|--------------------------------------------------------------------------------------------------------------------------------| +| `Caption` | String | The caption of the sub-process instance. | +| `StartTime` | DateTime | The timestamp when execution began. This is set by the engine and is read-only. | +| `EndTime` | DateTime | The timestamp when execution ended (either through completion or failure). This is set by the engine and is read-only. | +| `State` | Enumeration | The current lifecycle state of the sub-process instance (see [WorkflowSubProcessState](#workflowsubprocessstate-enumeration)). | +| `Reason` | String (Unlimited) | A technical description providing context for the current state (e.g., error details). | + +#### Associations + +| Association | Parent Entity | Description | +|---------------------------------------------------|---------------------------|--------------------------------------------------------------------------------------------------------------------| +| `WorkflowSubProcess_WorkflowSubProcessDefinition` | `WorkflowSubProcess` | The association to the underlying definition for this instance. | +| `WorkflowSubProcess_Workflow` | `WorkflowSubProcess` | The association to the parent workflow instance. | +| `WorkflowUserTask_WorkflowSubProcess` | `WorkflowUserTask` | The association to active user tasks within this sub-process instance. | +| `WorkflowEndedUserTask_WorkflowSubProcess` | `WorkflowEndedUserTask` | The association to completed or ended user tasks within this instance. | +| `WorkflowActivityRecord_WorkflowSubProcess` | `WorkflowActivityRecord` | The association to the historical execution records for this instance. | +| `WorkflowCurrentActivity_WorkflowSubProcess` | `WorkflowCurrentActivity` | The association to the activities currently being executed in this sub-process (see [Jump to](/refguide/jump-to/). | + +### WorkflowSubProcessState (Enumeration) + +The `WorkflowSubProcessState` enumeration defines the possible lifecycle phases of a sub-process instance: + +| Caption | Name | Description | +|-------------|--------------|-----------------------------------------------------------------------------------------------------------| +| In progress | `InProgress` | The sub-process has been triggered and is currently executing. | +| Aborted | `Aborted` | Execution was terminated, either because the parent workflow was aborted or due to an interrupting event. | +| Failed | `Failed` | Execution ended unsuccessfully because an activity within the sub-process encountered an error. | +| Completed | `Completed` | The sub-process reached its end event and finished successfully. | + +## Read more + +* [Notify Workflow](/refguide/notify-workflow/) +* [Workflow Versioning and Conflict Mitigation](/refguide/workflow-versioning/) +* [Jump activity](/refguide/jump-activity/) +* [Jump to](/refguide/jump-to/) \ No newline at end of file diff --git a/content/en/docs/refguide/modeling/application-logic/workflows/workflow-versioning.md b/content/en/docs/refguide/modeling/application-logic/workflows/workflow-versioning.md index d9d731dcb15..81b65120d34 100644 --- a/content/en/docs/refguide/modeling/application-logic/workflows/workflow-versioning.md +++ b/content/en/docs/refguide/modeling/application-logic/workflows/workflow-versioning.md @@ -54,25 +54,26 @@ The Workflow Versioning Conflict Detection system detects different types of con Conflicts with the possible mitigations listed above can be summarized in the following matrix (you can see details for each conflict in the sections below): -| **Conflict Type/Mitigation** | **Abort** | **Restart** | **Mark-as-Resolved** | **Jump To Different Activities** | -| --------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| *Non-resolvable:* | | | | | -| Context Entity Replaced | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | -| Context Object Not Found | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | -| Workflow Definition Deleted | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | -| *Partially resolvable*: | | | | | -| Current Activity Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | {{< icon name="checkmark-circle-filled" color="green" >}} | -| Current Parallel Split Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | -| Current Activity Moved out of Path | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | -| Parallel Split Introduced in Executed Path | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | -| *Resolvable*: | | | | | -| Parallel Path Introduced | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | +| **Conflict Type/Mitigation** | **Abort** | **Restart** | **Mark-as-Resolved** | **Jump To Different Activities** | +|-----------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------|-----------------------------------------------------------| +| *Non-resolvable:* | | | | | +| Context Entity Replaced | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | +| Context Object Not Found | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | +| Workflow Definition Deleted | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | N/A | +| *Partially resolvable*: | | | | | +| Current Activity Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | {{< icon name="checkmark-circle-filled" color="green" >}} | +| Current Parallel Split Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | +| Current Activity Moved out of Path | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | +| Parallel Split Introduced in Executed Path | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | N/A | +| *Resolvable*: | | | | | +| Parallel Path Introduced | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | N/A | | Selected Outcome Replaced | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | -| Multi-User Task Outcome Changed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | +| Multi-User Task Outcome Changed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | | Activities Introduced in Executed Path | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | | Executed Activities Moved to Re-executable Position | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | -| Parallel Split Path Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | -| Non-Interrupting Boundary Event Path Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | +| Parallel Split Path Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | +| Non-Interrupting Boundary Event Path Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | +| Current Event Sub-Process Removed | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | {{< icon name="checkmark-circle-filled" color="green" >}} | #### Context Entity Replaced @@ -151,7 +152,9 @@ You can do one of the following: #### Current Activity Moved out of Path -When an app developer moves activities out of a **Parallel Split** path or a non-interrupting boundary event path, currently running workflow instances that are executing the moved activity cannot complete the **Parallel Split** or the non-interrupting boundary event. Similarly, if an activity is moved from the parent path into a boundary event path, the currently running workflow instances may not be able to complete properly. +A conflict occurs when an activity is moved outside of its original execution scope. This applies to activities moved between the main path, parallel split paths, boundary event paths, or sub-processes. +If a currently running workflow instance is executing an activity that is moved out of its scope, it may lose its connection to necessary synchronization points. For example, the instance may be unable to merge a Parallel Split, complete a non-interrupting boundary event, or finish a sub-process execution. +Conversely, moving an activity from a parent path into a nested scope, such as a boundary event path or a sub-process, can also prevent the workflow from progressing. In these scenarios, the workflow engine cannot guarantee the integrity of the execution flow. This can result in the workflow instance remaining stuck in the In Progress state indefinitely, preventing it from ever reaching a completed state. You can do one of the following: @@ -245,3 +248,14 @@ You can do one of the following: * The workflow can be restarted, for example, by using the **DefaultWorkflowAdmin** page in the Workflow Commons. * The Administrator can use **Mark-as-Resolved** to fix this issue (the currently running activity within the removed boundary event path will be aborted). * The app developer can revert the change (which adds the boundary event path back) and deploy it. + +#### Current Event Sub-Process Removed + +When an app developer removes an ongoing Event Sub-process and then deploys this change, the currently running workflow instances that are executing activities within that sub-process cannot be continued. + +You can do one of the following: + +* The workflow can be aborted, for example, by using the **DefaultWorkflowAdmin** page in the Workflow Commons. +* The workflow can be restarted, for example, by using the **DefaultWorkflowAdmin** page in the Workflow Commons. +* The Administrator can use **Mark-as-Resolved** to fix this issue (the currently running activity within the removed sub-process will be aborted). +* The app developer can revert the change (which adds the Event Sub-process back) and deploy it. diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process-definition.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process-definition.png new file mode 100644 index 00000000000..c579ed6b2ab Binary files /dev/null and b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process-definition.png differ diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process.png new file mode 100644 index 00000000000..0f35020f44e Binary files /dev/null and b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/domain-model/workflow-sub-process.png differ diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/drag-and-drop.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/drag-and-drop.png new file mode 100644 index 00000000000..600e5873a42 Binary files /dev/null and b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/drag-and-drop.png differ diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/event-sub-process-example.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/event-sub-process-example.png new file mode 100644 index 00000000000..3ef7ef029b3 Binary files /dev/null and b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/event-sub-process-example.png differ diff --git a/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/notify-workflow.png b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/notify-workflow.png new file mode 100644 index 00000000000..341e4e832fc Binary files /dev/null and b/static/attachments/refguide/modeling/application-logic/workflows/event-sub-processes/notify-workflow.png differ