diff --git a/.github/workflows/constraints.txt b/.github/workflows/constraints.txt index abe657ac3..54fbc7411 100644 --- a/.github/workflows/constraints.txt +++ b/.github/workflows/constraints.txt @@ -1,2 +1,2 @@ -pip==24.3.1 -poetry==1.8.5 +pip==25.0 +poetry==2.0.1 diff --git a/docs/.gitignore b/docs/.gitignore index 86465dfbc..cb910d8fc 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,3 +1,6 @@ _build .venv -.vscode \ No newline at end of file +.vscode + +# meh, we could commit these, but they are automatically generated by the build, so we do not need to +_tags diff --git a/docs/Building_Diagrams/learn_basics.md b/docs/Building_Diagrams/learn_basics.md deleted file mode 100644 index 584690f98..000000000 --- a/docs/Building_Diagrams/learn_basics.md +++ /dev/null @@ -1,90 +0,0 @@ -# Understanding the terminology - -## BPMN and SpiffWorkflow - -Business Process Model and Notation (BPMN) is a diagramming language for specifying business processes. -BPMN bridges the gap between business and IT, creating a shared process language for both parties. - -BPMN efficiently depicts the details of process behaviors in a diagram. -The precision of its meaning allows it to describe the technical details that control process execution in an automation engine. -SpiffWorkflow enables you to create code to execute a BPMN diagram directly. - -By using SpiffWorkflow, a client can create the BPMN diagram and have their product work without the need for you to modify the Python code, thus improving response and turnaround time. - -## Flow Objects - -Flow objects are divided into three groups: Events, Gateways, and Tasks. - -### Events - -Events, represented by circles, describe occurrences during a process. -There are three main types of events in business process modeling: start events, intermediate events, and end events. - -| **Event** | **Symbol**| **Description** | -|-----------|-----------|-----------------| -| Start Event |![Untitled](images/Start.png) | Signals the first step of a process. | -| Intermediate Event | ![Untitled](images/Intermediate.png) | Represents any event that occurs between a start and end event. | -| End Event | ![Untitled](images/End.png) | Signals the final step in a process. | - -### Gateways - -Gateways represent decision points in a process. -Based on certain conditions or rules, they determine which path the process will follow. -There are various types of gateways: - -| **Gateway** | **Symbol**| **Description** | -|---------------|-----------|-----------------| -| Exclusive Gateway |![Untitled](images/Exclusive.png) | Evaluates the state of the business process and, based on the condition, diverges the flow into one or more mutually exclusive paths. | -| Event-based Gateway | ![Untitled](images/Eventbased.png) | An event-based gateway is similar to an exclusive gateway in that both involve one path in the flow. However, with an event-based gateway, you evaluate which event has occurred, not which condition has been met. | -| Inclusive Gateway | ![Untitled](images/Inclusive.png) | An inclusive gateway diverges the process flow into one or more flows. | -| Complex Gateway | ![Untitled](images/Complex.png) | Complex gateways are used only for the most intricate flows in the business process. They use words instead of symbols and thus require more descriptive text. | - -### Tasks - -Tasks represent activities or work that needs to be done as part of a process. -They can either be manual tasks that require human intervention or automated tasks that are performed by systems or applications. - -| **Task** | **Symbol** | **Description** | -|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Service | ![Untitled](images/Service_task.png) | A task that utilizes a Web service, an automated application, or other types of service to complete the task. | -| Send |![Untitled](images/Send.png) | A task that sends a message to another pool. The task is completed once the message has been sent. | -| Receive | ![Untitled](images/Receive.png) | A Receive Task indicates that the process has to wait for a message to arrive in order to continue. The task is completed once the message has been received. | -| User | ![Untitled](images/User.png) | A User Task denotes that a human performer completes the task with the help of a software application. | -| Manual | ![Untitled](images/Manual.png) | A Manual Task is a task performed without the aid of any business process execution engine or application. | -| Business Rule |![Untitled](images/Businessrule.png)| A Business Rule Task provides a mechanism for a process to supply input to a Business Rules Engine and then obtain the output provided by the Business Rules Engine. | -| Script | ![Untitled](images/Script.png) | A Script Task defines a script that the engine can interpret. | -| Call Activity | ![Untitled](images/Callactivity.png) | A call activity allows you to call and invoke another process as part of this process. | -| Sub-Process | ![Untitled](images/SubProcess.png) | Sub-processes allow you to collapse and expand tasks to convey information quickly. | - -## Connecting Objects - -Connecting objects are lines that connect BPMN flow objects. -Three different types exist: sequence flows, message flows, and associations. - -| **Connecting Objects** | **Symbol** | **Description** | -|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Sequence Flow Symbol | ![Untitled](images/BPMN_sequence_flow-80x31.png) | Connects flow objects in the proper sequential order. | -| Message Flow Symbol |![Untitled](images/BPMN_message_flow-80x30.png) | Represents messages sent from one process participant to another. | -| Association Symbol | ![Untitled](images/BPMN_association-80x31.png) | Illustrates relationships between artifacts and flow objects. | - -## Artifacts - -Artifacts are used to provide additional information or documentation within a process. -They include data objects (which represent information or data needed for the process), annotations (which provide explanatory or descriptive text), and groups (which are used to visually group related elements). - -| **Artifact** | **Symbol** | **Description** | -|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Data Object |
![Untitled](images/Data_Object.png) | Data objects can represent data input to the process, data resulting from the process, or data that needs to be collected. | -| Data Storage |![Untitled](images/Data_Storage.png) | Data storage facilitates the storage or access of data associated with a business model. If your process produces any data, it will become necessary to store that data. | -| Group |
![Untitled](images/Group.png) | Groups organize tasks or processes that are significant in the overall process. | -| Annotation |
![Untitled](images/Annotation.png) | Annotations allow you to describe the business process and flow objects in greater detail. | - -## Swimlanes - -Swimlanes are used in a BPMN diagram to organize aspects of a process. -They visually group objects into lanes, with each aspect of the process added to a separate lane. - -These elements can be arranged either horizontally or vertically. -Not only do swimlanes organize activities into separate categories, but they also reveal delays, inefficiencies, and the individuals responsible for each step in a process. - -![Untitled](images/BPMN_swimlane-500x197.png) diff --git a/docs/appendices/glossary.md b/docs/appendices/glossary.md deleted file mode 100644 index 342792b65..000000000 --- a/docs/appendices/glossary.md +++ /dev/null @@ -1,16 +0,0 @@ -# Glossary - -## Activity - -Refers to the work carried out by an individual or an organization within a process. -Activities can be classified into three categories: Task, Subprocess, and Call Activity. -These activities can be either atomic or non-atomic. -Atomic activities are indivisible and represent single tasks, while non-atomic activities involve multiple steps or subprocesses that work together to achieve a larger objective. - -## Process Instance - -A Process Instance is a specific occurrence of a Process Model that is executed within a workflow engine. - -## Process Model - -A Process Model is a visual representation of a process that defines the sequence of activities, decisions, and interactions required to achieve a particular goal. diff --git a/docs/bin/build b/docs/bin/build index c8fa07819..a4f6e1c78 100755 --- a/docs/bin/build +++ b/docs/bin/build @@ -8,15 +8,20 @@ trap 'error_handler ${LINENO} $?' ERR set -o errtrace -o errexit -o nounset -o pipefail run_ci="false" -if grep -qE -- "--ci\>" <<<"$@" ; then +if grep -qE -- "--ci\>" <<<"$@"; then run_ci="true" fi rm -rf _build/html sphinx_command="sphinx-autobuild" + +# must ignore generated dir with sphinx-autobuild or it becomes recursive +additional_args="--ignore '**/_tags/*'" + if [[ "$run_ci" == "true" ]]; then sphinx_command="sphinx-build" + additional_args="" fi #>> sphinx-build --help 2>&1 | grep -E '^ +\-[aWn]\>' @@ -24,4 +29,4 @@ fi # -j N build in parallel with N processes where possible # -n nit-picky mode, warn about all missing references # -W turn warnings into errors -"$sphinx_command" . _build/html -W -a -n -j auto +"$sphinx_command" . _build/html -W -a -n -j auto $additional_args diff --git a/docs/conf.py b/docs/conf.py index e6e8d5161..10c646de3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,10 +18,16 @@ release = "0.1" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ["myst_parser", "sphinxcontrib.mermaid"] +extensions = ["myst_parser", "sphinxcontrib.mermaid", "sphinx_tags"] myst_fence_as_directive = ["mermaid"] myst_heading_anchors = 2 +# tags are sort of annoying and buggy, given that the individual tag show pages are broken when clicked from leaf node pages +# and they are required to be in the top-level toctree, which forces the side nav to highlight the current page twice, once +# where it belongs and once in the tags section. +# tags_create_tags = True +tags_extension = ["md"] + templates_path = ["_templates"] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".venv"] @@ -36,7 +42,6 @@ html_logo = "spiffworkflow_logo.png" html_theme_options = { "logo_only": True, - "display_version": False, "prev_next_buttons_location": "bottom", "style_external_links": False, "vcs_pageview_mode": "", @@ -48,5 +53,4 @@ html_theme_options = { "titles_only": False, } - html_css_files = ["custom.css"] diff --git a/docs/documentation/images/commit.webp b/docs/documentation/images/commit.webp deleted file mode 100644 index 203437683..000000000 Binary files a/docs/documentation/images/commit.webp and /dev/null differ diff --git a/docs/appendices/articles.md b/docs/explanation/articles.md similarity index 97% rename from docs/appendices/articles.md rename to docs/explanation/articles.md index 85acb37ed..86bd9c63d 100644 --- a/docs/appendices/articles.md +++ b/docs/explanation/articles.md @@ -1,4 +1,4 @@ -# Articles ![data_input](images/articles.png) +# Articles ![data_input](/images/articles.png) **[#1 - Build your own Low-Code Business Applications with SpiffWorkflow](https://medium.com/@danfunk/build-your-own-low-code-business-applications-with-spiffworkflow-1d0730acc1f3)** @@ -62,3 +62,6 @@ SpiffArena combines BPMN and Python to provide a powerful and configurable solut SpiffWorkflow is a Python library that simplifies complex business logic by using BPMN diagrams, allowing non-developers to make changes to application flows. It improves communication within teams, increases contributions, and adapts to changing requirements. Visual software development environments like SpiffWorkflow represent the future of solving complex problems. + +```{tags} tutorial, explanation +``` diff --git a/docs/dev/backend.md b/docs/explanation/dev/backend_api.md similarity index 98% rename from docs/dev/backend.md rename to docs/explanation/dev/backend_api.md index 1d5495ab4..99b093104 100644 --- a/docs/dev/backend.md +++ b/docs/explanation/dev/backend_api.md @@ -60,3 +60,6 @@ All exception classes should be defined in 1) one file, if there are not too man The Gunicorn web server is used to serve the application in the default Dockerfile. Many of the environment variables that can be set are documented in src/spiffworkflow_backend/config/default.py. + +```{tags} reference, dev_docs +``` diff --git a/docs/dev/connector_proxy.md b/docs/explanation/dev/connector_proxy.md similarity index 91% rename from docs/dev/connector_proxy.md rename to docs/explanation/dev/connector_proxy.md index 4825b9f07..1c91d4b29 100644 --- a/docs/dev/connector_proxy.md +++ b/docs/explanation/dev/connector_proxy.md @@ -28,4 +28,8 @@ graph TD Connector proxies are containers for connectors. Connectors are usually Python libraries that are included in connector proxy codebases, but they can also be embedded directly inside of connector proxies. Our connector-proxy-demo includes a few connectors, including [connector-aws](https://github.com/sartography/connector-aws) and [connector-http](https://github.com/sartography/connector-http). -Connector-http can be used for many API interactions, but you can also [write your own connectors](/dev/how_to_build_a_connector). +Connector-http can be used for many API interactions, but you can also [write your own connectors](how_to_build_a_connector). + +```{tags} how_to_guide, dev_docs + +``` diff --git a/docs/dev/setup.md b/docs/explanation/dev/developer_setup.md similarity index 98% rename from docs/dev/setup.md rename to docs/explanation/dev/developer_setup.md index 34a271d53..41dd94f91 100644 --- a/docs/dev/setup.md +++ b/docs/explanation/dev/developer_setup.md @@ -73,3 +73,5 @@ git repo for it. * You can now create your connectors and they will show up when you edit services tasks and select the service you want to call. +```{tags} how_to_guide, dev_docs +``` diff --git a/docs/dev/extensions.md b/docs/explanation/dev/extensions.md similarity index 93% rename from docs/dev/extensions.md rename to docs/explanation/dev/extensions.md index 5bc076b26..5361d9d0a 100644 --- a/docs/dev/extensions.md +++ b/docs/explanation/dev/extensions.md @@ -1,4 +1,5 @@ # Extensions + Extensions in SpiffArena provide a mechanism to augment the software with custom features and functionalities. By leveraging extensions, users can implement functions or features not present in the standard offering. This powerful feature ensures adaptability to various business needs, from custom reports to specific user tools. @@ -9,7 +10,7 @@ At a high level: - Configuration for an extension can be found and modified in its `extension_uischema.json` file. - Access to an extension can be set up via permissions. -![Extensions](images/Extensions_dashboard.png) +![Extensions](/images/Extensions_dashboard.png) ## Getting Started with Extensions @@ -29,11 +30,11 @@ To create your own custom extension, follow these steps: - Navigate to the process group repository where extensions are to be implemented. -![Extension Process Group](images/Extension1.png) +![Extension Process Group](/images/Extension1.png) - Create a process model in this group. You can give it whatever name you want. Then create a file inside the process model called `extension_uischema.json`. This will control how the extension will work. -![Extension](images/Extension_UI_schema.png) +![Extension](/images/Extension_UI_schema.png) As an example, we have created an extension that adds a link to the profile menu in the top right and also adds a new "Support" page to the app so that users of the application know who to talk to if they have issues. You can find the full example [on GitHub](https://github.com/sartography/sample-process-models/tree/sample-models-1/extensions/support). @@ -58,5 +59,9 @@ Here are some of the use cases already implemented by our users: - Rendering the output of these APIs using Jinja templates and markdown Extensions in SpiffArena offer a robust mechanism to tailor the software to unique business requirements. -When considering an extension, also consider whether the code would be more properly included in the core source code or as a connector inside your [connector proxy](/dev/connector_proxy.md). +When considering an extension, also consider whether the code would be more properly included in the core source code or as a connector inside your [connector proxy](connector_proxy). In cases where an extension is appropriate, by following the instructions in this guide, organizations can expand the system's functionality to meet their unique needs. + +```{tags} how_to_guide, dev_docs + +``` diff --git a/docs/dev/frontend.md b/docs/explanation/dev/frontend.md similarity index 97% rename from docs/dev/frontend.md rename to docs/explanation/dev/frontend.md index 011c13f9b..f18fa7b70 100644 --- a/docs/dev/frontend.md +++ b/docs/explanation/dev/frontend.md @@ -43,3 +43,6 @@ The route component may or may not delegate some of its work to a service. The generated Docker image uses nginx to serve static HTML/CSS/JS files that are generated by the Vite build process. These files can also be hosted on a CDN. + +```{tags} reference, dev_docs +``` diff --git a/docs/dev/how_to_build_a_connector.md b/docs/explanation/dev/how_to_build_a_connector.md similarity index 97% rename from docs/dev/how_to_build_a_connector.md rename to docs/explanation/dev/how_to_build_a_connector.md index 17d52a26b..46e3d4b49 100644 --- a/docs/dev/how_to_build_a_connector.md +++ b/docs/explanation/dev/how_to_build_a_connector.md @@ -22,3 +22,6 @@ The `run` method is where the actual work is done (send HTTP request, etc). If you end up writing a connector, please consider contributing it back to the community and please consider contributing to this documentation. Thank you! + +```{tags} how_to_guide, dev_docs +``` diff --git a/docs/explanation/dev/index.md b/docs/explanation/dev/index.md new file mode 100644 index 000000000..2872d9295 --- /dev/null +++ b/docs/explanation/dev/index.md @@ -0,0 +1,14 @@ +# Technical Docs + +```{toctree} +:caption: Technical Docs +:maxdepth: 1 +technical_overview +developer_setup +backend_api +frontend +connector_proxy +how_to_build_a_connector +extensions +process +``` diff --git a/docs/dev/process.md b/docs/explanation/dev/process.md similarity index 97% rename from docs/dev/process.md rename to docs/explanation/dev/process.md index afdafff7e..f55c8fde8 100644 --- a/docs/dev/process.md +++ b/docs/explanation/dev/process.md @@ -50,3 +50,6 @@ graph LR code[Hammer code] --> PR PR --> Profit ``` + +```{tags} how_to_guide, dev_docs +``` diff --git a/docs/dev/index.md b/docs/explanation/dev/technical_overview.md similarity index 73% rename from docs/dev/index.md rename to docs/explanation/dev/technical_overview.md index d6ac7673c..f006a4e1e 100644 --- a/docs/dev/index.md +++ b/docs/explanation/dev/technical_overview.md @@ -24,12 +24,16 @@ C[Connector Proxy] ``` SpiffArena is a system that allows users to build and execute BPMN diagrams. -It is composed of three applications, [spiffworkflow-frontend](frontend), [spiffworkflow-backend](backend), and, optionally, a [connector proxy](connector_proxy). +It is composed of three applications, [spiffworkflow-frontend](frontend), [spiffworkflow-backend](backend_api), and, optionally, a [connector proxy](connector_proxy). ## Source code layout From a source code perspective, there are three repositories that may be of interest: -* [spiff-arena](https://github.com/sartography/spiff-arena) - Includes spiffworkflow-frontend, spiffworkflow-backend, and connector-proxy-demo. -* [SpiffWorkflow](https://github.com/sartography/SpiffWorkflow) - The core SpiffWorkflow library, 10 years old, Python, awesome, [well-documented](https://spiffworkflow.readthedocs.io/). -* [bpmn-js-spiffworkflow](https://github.com/sartography/bpmn-js-spiffworkflow) - The frontend library that extends bpmn-js to work with SpiffWorkflow. +- [spiff-arena](https://github.com/sartography/spiff-arena) - Includes spiffworkflow-frontend, spiffworkflow-backend, and connector-proxy-demo. +- [SpiffWorkflow](https://github.com/sartography/SpiffWorkflow) - The core SpiffWorkflow library, 10 years old, Python, awesome, [well-documented](https://spiffworkflow.readthedocs.io/). +- [bpmn-js-spiffworkflow](https://github.com/sartography/bpmn-js-spiffworkflow) - The frontend library that extends bpmn-js to work with SpiffWorkflow. + +```{tags} reference, dev_docs + +``` diff --git a/docs/explanation/index.md b/docs/explanation/index.md new file mode 100644 index 000000000..edf53e90e --- /dev/null +++ b/docs/explanation/index.md @@ -0,0 +1,12 @@ +# Explanation + +In this section, you will find explanations of key concepts and processes in SpiffWorkflow. + +```{toctree} +:maxdepth: 1 +:titlesonly: +articles +understanding_the_terminology +dev/index +process_error_handling +``` diff --git a/docs/Debugging_Diagrams/process_error_handling.md b/docs/explanation/process_error_handling.md similarity index 95% rename from docs/Debugging_Diagrams/process_error_handling.md rename to docs/explanation/process_error_handling.md index 2e0759dcb..af7257ae7 100644 --- a/docs/Debugging_Diagrams/process_error_handling.md +++ b/docs/explanation/process_error_handling.md @@ -9,3 +9,6 @@ You can use this process model to handle the error in whatever way is most benef Process models often have ways to communicate with users--using an email connector if you use email, or a Slack connector if you use Slack, etc.--and you can use these same capabilities to inform the appropriate users when an error occurs. You can choose to ignore errors that occur in less important models, and you can escalate errors in other models to the CEO. Since you are using a process model, you have all the power you need to handle errors in a way that matches your business requirements. + +```{tags} explanation, debugging_diagrams +``` diff --git a/docs/explanation/understanding_the_terminology.md b/docs/explanation/understanding_the_terminology.md new file mode 100644 index 000000000..c5fbdb208 --- /dev/null +++ b/docs/explanation/understanding_the_terminology.md @@ -0,0 +1,93 @@ +# Understanding the terminology + +## BPMN and SpiffWorkflow + +Business Process Model and Notation (BPMN) is a diagramming language for specifying business processes. +BPMN bridges the gap between business and IT, creating a shared process language for both parties. + +BPMN efficiently depicts the details of process behaviors in a diagram. +The precision of its meaning allows it to describe the technical details that control process execution in an automation engine. +SpiffWorkflow enables you to create code to execute a BPMN diagram directly. + +By using SpiffWorkflow, a client can create the BPMN diagram and have their product work without the need for you to modify the Python code, thus improving response and turnaround time. + +## Flow Objects + +Flow objects are divided into three groups: Events, Gateways, and Tasks. + +### Events + +Events, represented by circles, describe occurrences during a process. +There are three main types of events in business process modeling: start events, intermediate events, and end events. + +| **Event** | **Symbol**| **Description** | +|-----------|-----------|-----------------| +| Start Event |![Untitled](/images/Start.png) | Signals the first step of a process. | +| Intermediate Event | ![Untitled](/images/Intermediate.png) | Represents any event that occurs between a start and end event. | +| End Event | ![Untitled](/images/End.png) | Signals the final step in a process. | + +### Gateways + +Gateways represent decision points in a process. +Based on certain conditions or rules, they determine which path the process will follow. +There are various types of gateways: + +| **Gateway** | **Symbol**| **Description** | +|---------------|-----------|-----------------| +| Exclusive Gateway |![Untitled](/images/Exclusive.png) | Evaluates the state of the business process and, based on the condition, diverges the flow into one or more mutually exclusive paths. | +| Event-based Gateway | ![Untitled](/images/Eventbased.png) | An event-based gateway is similar to an exclusive gateway in that both involve one path in the flow. However, with an event-based gateway, you evaluate which event has occurred, not which condition has been met. | +| Inclusive Gateway | ![Untitled](/images/Inclusive.png) | An inclusive gateway diverges the process flow into one or more flows. | +| Complex Gateway | ![Untitled](/images/Complex.png) | Complex gateways are used only for the most intricate flows in the business process. They use words instead of symbols and thus require more descriptive text. | + +### Tasks + +Tasks represent activities or work that needs to be done as part of a process. +They can either be manual tasks that require human intervention or automated tasks that are performed by systems or applications. + +| **Task** | **Symbol** | **Description** | +|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Service | ![Untitled](/images/Service_task.png) | A task that utilizes a Web service, an automated application, or other types of service to complete the task. | +| Send |![Untitled](/images/Send.png) | A task that sends a message to another pool. The task is completed once the message has been sent. | +| Receive | ![Untitled](/images/Receive.png) | A Receive Task indicates that the process has to wait for a message to arrive in order to continue. The task is completed once the message has been received. | +| User | ![Untitled](/images/User.png) | A User Task denotes that a human performer completes the task with the help of a software application. | +| Manual | ![Untitled](/images/Manual.png) | A Manual Task is a task performed without the aid of any business process execution engine or application. | +| Business Rule |![Untitled](/images/Businessrule.png)| A Business Rule Task provides a mechanism for a process to supply input to a Business Rules Engine and then obtain the output provided by the Business Rules Engine. | +| Script | ![Untitled](/images/Script.png) | A Script Task defines a script that the engine can interpret. | +| Call Activity | ![Untitled](/images/Callactivity.png) | A call activity allows you to call and invoke another process as part of this process. | +| Sub-Process | ![Untitled](/images/SubProcess.png) | Sub-processes allow you to collapse and expand tasks to convey information quickly. | + +## Connecting Objects + +Connecting objects are lines that connect BPMN flow objects. +Three different types exist: sequence flows, message flows, and associations. + +| **Connecting Objects** | **Symbol** | **Description** | +|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Sequence Flow Symbol | ![Untitled](/images/BPMN_sequence_flow-80x31.png) | Connects flow objects in the proper sequential order. | +| Message Flow Symbol |![Untitled](/images/BPMN_message_flow-80x30.png) | Represents messages sent from one process participant to another. | +| Association Symbol | ![Untitled](/images/BPMN_association-80x31.png) | Illustrates relationships between artifacts and flow objects. | + +## Artifacts + +Artifacts are used to provide additional information or documentation within a process. +They include data objects (which represent information or data needed for the process), annotations (which provide explanatory or descriptive text), and groups (which are used to visually group related elements). + +| **Artifact** | **Symbol** | **Description** | +|---------------|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Data Object |
![Untitled](/images/Data_Object.png) | Data objects can represent data input to the process, data resulting from the process, or data that needs to be collected. | +| Data Storage |![Untitled](/images/Data_Storage.png) | Data storage facilitates the storage or access of data associated with a business model. If your process produces any data, it will become necessary to store that data. | +| Group |
![Untitled](/images/Group.png) | Groups organize tasks or processes that are significant in the overall process. | +| Annotation |
![Untitled](/images/Annotation.png) | Annotations allow you to describe the business process and flow objects in greater detail. | + +## Swimlanes + +Swimlanes are used in a BPMN diagram to organize aspects of a process. +They visually group objects into lanes, with each aspect of the process added to a separate lane. + +These elements can be arranged either horizontally or vertically. +Not only do swimlanes organize activities into separate categories, but they also reveal delays, inefficiencies, and the individuals responsible for each step in a process. + +![Untitled](/images/BPMN_swimlane-500x197.png) + +```{tags} reference, building_diagrams +``` diff --git a/docs/fullindex.md b/docs/fullindex.md new file mode 100644 index 000000000..3aefec41f --- /dev/null +++ b/docs/fullindex.md @@ -0,0 +1,14 @@ +--- +orphan: true +--- + +# Full Index + +```{toctree} +:titlesonly: + +tutorials/index +how_to_guides/index +reference/index +explanation/index +``` diff --git a/docs/Getting_Started/quick_start.md b/docs/getting_started/quickstart_guide.md similarity index 92% rename from docs/Getting_Started/quick_start.md rename to docs/getting_started/quickstart_guide.md index 89b5e1852..9b63b4d53 100644 --- a/docs/Getting_Started/quick_start.md +++ b/docs/getting_started/quickstart_guide.md @@ -13,7 +13,7 @@ Users can interact with pre-built models, make modifications, and visualize proc ## How to Log in to SpiffArena -```{image} ./images/Login.png +```{image} /images/Login.png :alt: Login Screen :class: bg-primary mb-1 :width: 230px @@ -39,7 +39,7 @@ In this section, we will navigate through the platform and provide a general ove Once you are signed in, you can start exploring the home page. The home page has three tab sections: **In Progress**, **Completed**, and **Start New**. -![Untitled](images/Untitled_2.png) +![Untitled](/images/Untitled_2.png) - The "In Progress" section provides an overview of all ongoing process instances, including those initiated by you, those awaiting your action, or those awaiting action from a team you are a member of (Optional). - The "Completed" section allows you to view all completed process instances, including those initiated by you, those initiated by other SpiffWorkflow users with tasks completed by you, and, if applicable, those with tasks completed by a group of which you are a member. @@ -55,7 +55,7 @@ Each instance has its own set of data and state that is updated as the instance If you are a member of a team, you may also have one or more instances with tasks waiting for [team name] lists as well. -![Untitled](images/Untitled_3.png) +![Untitled](/images/Untitled_3.png) ### Step 2: Explore the Processes section @@ -65,7 +65,7 @@ The process section provides a comprehensive view of the process ecosystem by sh A **process group** is a way of grouping a bunch of **process models**, and a **process model** contains all the files necessary to execute a specific process. ``` -![Untitled](images/Untitled_4.png) +![Untitled](/images/Untitled_4.png) ### Step 3: Explore the Process Instances section @@ -73,7 +73,7 @@ The Process Instance section provides a detailed view of individual process inst This section includes essential information such as the instance ID, process name, the individual who started the process, the end date, and the current status. -![Untitled](images/Untitled_5.png) +![Untitled](/images/Untitled_5.png) When getting started with SpiffWorkflow, it's essential to take the time to explore and familiarize yourself with the platform's interface and features. Feel free to ask questions about the platform's features or how to get started. @@ -92,7 +92,7 @@ Once you're signed in, you'll see three tabs in the Home section: In progress, C If you want to start a new process, click the "Start New +" button. This will bring up the "Processes I can start" section. -![Untitled](images/Untitled_6.png) +![Untitled](/images/Untitled_6.png) ```{admonition} The Landing Page :class: info @@ -104,7 +104,7 @@ This will bring up the "Processes I can start" section. Next, you will see a list of available processes that you have permission to start. Choose the process you want to initiate and click “Start”. -![Untitled](images/Untitled_7.png) +![Untitled](/images/Untitled_7.png) You have successfully started a new process instance in SpiffWorkflow. @@ -130,11 +130,11 @@ There will be three types of instances shown: - **Waiting for me:** This section displays a list of process instances with tasks assigned to you and are currently waiting for you to respond to. - **Waiting for [team name]:** If you are a member of SpiffWorkflow, this section displays a list of process instances with tasks assigned to a group you are a member of and currently waiting for someone in that group to complete them. -![Untitled](images/Untitled_8.png) +![Untitled](/images/Untitled_8.png) In the case of new users who haven't started or been part of any process or been assigned to any team, you won't be able to see any items on the home page. -![Untitled](images/Untitled_9.png) +![Untitled](/images/Untitled_9.png) ### Step 2: Respond to the request @@ -143,7 +143,7 @@ Upon opening the process instance, you can respond to the request based on the r Depending on the task requirements, this may involve submitting additional information, reviewing the task, or any other action item. -![Untitled](images/Untitled_10.png) +![Untitled](/images/Untitled_10.png) That's it! With these simple steps, you can efficiently review tasks in SpiffWorkflow. @@ -165,11 +165,11 @@ There are two ways of finding your process instances. Option 1: Once you're signed in, navigate to the home section. Here you will find a list of all the process instances you've initiated. -![Untitled](images/Untitled_11.png) +![Untitled](/images/Untitled_11.png) Option 2: You can also view the processes you have initiated in the **"Process Instances"** section. -![Untitled](images/Untitled_12.png) +![Untitled](/images/Untitled_12.png) ### Step 2: Select the process instance you want to view @@ -179,7 +179,7 @@ Navigate to the BPMN diagram section. Here you can see the current task highlighted in **yellow**. The grey represents the path which was taken by the current process steps. -![Untitled](images/Untitled_13.png) +![Untitled](/images/Untitled_13.png) By following these steps, you can easily view the steps of the process you initiated and keep track of progress. @@ -197,7 +197,7 @@ To check the metadata of a process instance, follow these steps. Once you're signed in, navigate to the home section. Here you will find a list of all the process instances you've initiated under **“Started by me”**. -![Untitled](images/Untitled_14.png) +![Untitled](/images/Untitled_14.png) ### Step 2: View metadata for the selected process instance @@ -205,7 +205,7 @@ Click on the process instance you want to view. Upon clicking this, you will be able to view the information about the given instance. You'll find the metadata under the details option in the process instance. -![Untitled](images/Untitled_15.png) +![Untitled](/images/Untitled_15.png) By following these simple steps, you can easily view the metadata for a process instance in SpiffWorkflow. @@ -222,32 +222,32 @@ With these steps, you'll be able to access process models easily and efficiently Once you have successfully signed in, navigate to the process section. This section allows you to access all the process groups and process models you have access to. -![Untitled](images/Untitled_16.png) +![Untitled](/images/Untitled_16.png) ### Step 2: Find and click on the process You can either search for a process model using the search bar or navigate through displayed processes to find the process model. -![Untitled](images/View_Forms1.png) +![Untitled](/images/View_Forms1.png) ### Step 3: Access the process model files Once you have clicked on the process you want to view, a list of the model files that are associated with the process will appear. -![Untitled](images/View_Forms3.png) +![Untitled](/images/View_Forms3.png) By following these simple steps, you can easily view process model files in SpiffWorkflow. If you want to view or create information on specific process models, we allow you to create an about section. -![Untitled](images/View_Forms2.png) +![Untitled](/images/View_Forms2.png) If you are creating a model, you can add information in the about section. We have integrated Markdown support, enabling you to create rich, formatted descriptions for your process models directly within the platform. In order to use this feature, simply create a **README File** inside the process model called README.md and document the model, so everyone can be on the same page. Furthermore, to check the process instances you started, you can also switch to the "My process instance" tab. -![View forms](images/View_Forms4.png) +![View forms](/images/View_Forms4.png) --- @@ -263,13 +263,13 @@ Here are the steps to view and filter process instances in SpiffWorkflow. Once you are signed in, navigate to the "Process Instances" section. Within the "Process Instances" section, you'll see a list of all the instances for the processes you can access. -![Untitled](images/Untitled_19.png) +![Untitled](/images/Untitled_19.png) If you are on a home page, you can navigate to the table you wish to filter. Look for the black funnel icon in the top right-hand corner above the table and click on the icon. By clicking on the filter icon, you'll be taken to a full-screen process view. -![Filter Icon](images/Filter_icon.png) +![Filter Icon](/images/Filter_icon.png) ### Step 2: Click on Filter option @@ -278,44 +278,44 @@ This will expand the filter section where you will be able to provide details ab This allows you to enter various details, including the process model, start date, end date, and time. To refine your search, you can enter multiple filter parameters. -![Untitled](images/Untitled_20.png) +![Untitled](/images/Untitled_20.png) ### Step 3: Apply Filters Once you have entered all the relevant filter details, click on the "**Apply**" button to apply the filters. The system will then display all the process instances matching the input details. -![Untitled](images/Untitled_21.png) +![Untitled](/images/Untitled_21.png) To filter process instances by **process-defined metadata**, follow these steps: - Search for the specific **process** you want to filter and click on the column option to select metadata options. -![Untitled](images/Untitled_22.png) +![Untitled](/images/Untitled_22.png) - The metadata fields will be displayed in the dropdown. Select the field you want to display and click on "**Save**" to apply the changes. -![Untitled](images/Untitled_23.png) +![Untitled](/images/Untitled_23.png) - After saving the details, the newly created column will be displayed. Finally, click on the “**Apply**” button to reflect the changes. -![Untitled](images/Untitled_24.png) +![Untitled](/images/Untitled_24.png) ### (Optional) Step 4: Save Perspectives If you wish to save the perspectives, click on the "**Save**" button. -![Untitled](images/Untitled_25.png) +![Untitled](/images/Untitled_25.png) A prompt will appear, allowing you to provide a name for the identifier associated with the saved filter. Enter a descriptive name for the filter identifier and “**Save**” changes. Now you can search for specific processes using Process Instance Perspectives. -![Untitled](images/Untitled_26.png) +![Untitled](/images/Untitled_26.png) -![Untitled](images/Untitled_27.png) +![Untitled](/images/Untitled_27.png) ### (Optional) Step 5: Filter by ID -![Untitled](images/Untitled_28.png) +![Untitled](/images/Untitled_28.png) If you want to filter by ID, go to the "Find by Id" section of the page. Enter the ID and click "Submit". @@ -336,28 +336,28 @@ Here are the colors used in BPMN Process: - **Meaning:** The task is completed. - **Implication:** Tasks or activities associated with this process have been successfully completed, and no further action is required. -![Colors](images/Grey_color.png) +![Colors](/images/Grey_color.png) 2. **Yellow Color:** - **Meaning:** The process instance has started and is currently in progress. - **Implication:** This color signifies that the task is active and ongoing. It may require monitoring or further inputs to proceed. -![Colors](images/Yellow.png) +![Colors](/images/Yellow.png) 3. **Red/Pink Color:** - **Meaning:** Indicates errors in the task. - **Implication:** There might be issues or obstacles preventing the task from proceeding as expected. Immediate attention and troubleshooting may be required. -![Colors](images/Red.png) +![Colors](/images/Red.png) 4. **Purple Color:** - **Meaning:** The activity has been canceled. - **Implication:** This task was intentionally stopped before completion. This could be due to time constraints, external triggers, or other predefined conditions that have been set as boundary events. -![Colors](images/Purple.png) +![Colors](/images/Purple.png) --- ## How to Check Milestones and Events @@ -367,7 +367,7 @@ Here are the colors used in BPMN Process: A milestone is a specific point in a process that signifies a significant event or state. It provides a high-level overview of the progress made in the process. -![Milestones](images/Milestone_Screenshot.png) +![Milestones](/images/Milestone_Screenshot.png) In BPMN, if you draw an intermediate event and do not specify its type (like message, signal, start, or end) but give it a name, it becomes a milestone. Essentially, a milestone is an event that hasn't been set to something specific. @@ -377,7 +377,7 @@ Essentially, a milestone is an event that hasn't been set to something specific. Events provide a detailed log of everything that happens in a process. They record every task and its execution time. -![Events](images/Events_Example.png) +![Events](/images/Events_Example.png) The events tab provides a detailed log of all the tasks and their execution times. It can be noisy due to the granularity of the information, but it's essential for understanding the intricacies of the process. @@ -397,7 +397,7 @@ This communication can take various forms: To explain the concept, we are using a relatable example involving two processes: the Waiter and the Chef. **Waiter Process**: -![Waiter Process](images/waiter.png) +![Waiter Process](/images/waiter.png) 1. The waiter takes an order. 2. This order is then communicated to the chef via a message. @@ -405,7 +405,7 @@ To explain the concept, we are using a relatable example involving two processes **Chef Process**: -![Chef Process](images/chef.png) +![Chef Process](/images/chef.png) 1. The chef starts by receiving the order message from the waiter. 2. After preparing the meal, the chef sends a message back to the waiter, signaling that the order is ready. @@ -421,7 +421,7 @@ The chef's process starts by listening for the order message, preparing the meal One of the complexities in BPMN messaging is ensuring that the right processes are communicating with each other, especially when multiple instances are running. This is achieved using correlation keys and properties. -![correlation](images/Corelation.png) +![correlation](/images/Corelation.png) - **Correlation Keys**: These represent the topic of the conversation. In the given example, the correlation key is the "order". @@ -448,7 +448,7 @@ To copy the short link: - **Access the Process Instance**: Open the process instance that you wish to share. - **Find the Short Link Icon**: Look for the link icon near the process instance heading and click on the link icon to copy the short link to your clipboard automatically. Please refer to the screenshot provided. -![Short Link](images/Short_link.png) +![Short Link](/images/Short_link.png) Now, you can paste the short link into your desired communication medium to share it with others. @@ -462,12 +462,12 @@ To access and review completed user forms within a specific process model, follo 2. **Examine Completed Forms**: - **Forms You Completed**: In this section, you can view the forms that you have completed. It allows you to see the specific details and inputs you provided in each task. - ![Completed by me](images/Completed_by_me.png) + ![Completed by me](/images/Completed_by_me.png) - **Forms Completed by Others**: This part shows all the forms completed by any user. You can see who completed each form and the last time it was updated. However, for privacy and security reasons, you won't be able to view the specific input details of forms completed by others. - ![Completed by others](images/Completed_by_others.png) + ![Completed by others](/images/Completed_by_others.png) This approach ensures you can monitor and review the progress of user forms within any process model while maintaining the confidentiality of inputs made by other users. @@ -483,11 +483,11 @@ This guide provides a step-by-step approach to access and understand the task in 2. **Access the Process Instance**: After running the process, navigate to the specific process instance within the SpiffWorkflow interface. This is where you can track the progress of the tasks. -![Access process instance](images/Access_Process_Instance.png) +![Access process instance](/images/Access_Process_Instance.png) 3. **View Task Details**: Click on the executed task or event that has been completed. For instance, in this example, we clicked on "user task". -![Access task instance](images/Task_instance.png) +![Access task instance](/images/Task_instance.png) You will be presented with detailed information about each task instance, including its status and execution timestamp. @@ -495,7 +495,7 @@ For example: - `2: 04-01-2024 19:58:11 - MAYBE` - `3: 04-01-2024 19:58:10 - COMPLETED` - `4: 04-01-2024 19:58:07 - COMPLETED` -![Access task instance](images/task_instance_history.png) +![Access task instance](/images/task_instance_history.png) - **COMPLETED Status**: Tasks marked as 'COMPLETED' have finished their execution successfully and have moved the workflow forward. - **MAYBE Status**: Indicates that the task still exists within SpiffWorkflow. @@ -503,3 +503,6 @@ While these tasks could be omitted for clarity, retaining them provides a comple Viewing task instance history in SpiffWorkflow is now more streamlined and informative, thanks to recent updates. Users can effectively track each task's execution, status, and timing, gaining insights into the workflow's overall performance. + +```{tags} tutorial +``` diff --git a/docs/Debugging_Diagrams/bpmn_unit_tests.md b/docs/how_to_guides/building_diagrams/bpmn_unit_tests.md similarity index 98% rename from docs/Debugging_Diagrams/bpmn_unit_tests.md rename to docs/how_to_guides/building_diagrams/bpmn_unit_tests.md index f002f3962..36d9c58a0 100644 --- a/docs/Debugging_Diagrams/bpmn_unit_tests.md +++ b/docs/how_to_guides/building_diagrams/bpmn_unit_tests.md @@ -46,3 +46,6 @@ The test will also fail if the process never completes or if an error occurs. Go to a process model and either click “Run Unit Tests” to run all tests for the process model or click on the “play icon” next to a "test_something.json" file. Next, you will see either a green check mark or a red x. You can click on these colored icons to get more details about the passing or failing test. + +```{tags} how_to_guide, debugging_diagrams +``` diff --git a/docs/Building_Diagrams/bpmn.md b/docs/how_to_guides/building_diagrams/create_a_bpmn_diagram.md similarity index 88% rename from docs/Building_Diagrams/bpmn.md rename to docs/how_to_guides/building_diagrams/create_a_bpmn_diagram.md index 6a6e6ee34..54e812fdb 100644 --- a/docs/Building_Diagrams/bpmn.md +++ b/docs/how_to_guides/building_diagrams/create_a_bpmn_diagram.md @@ -1,4 +1,4 @@ -# How to Create a BPMN Diagram +# Create a BPMN Diagram Starting to model a business process can indeed be a challenging task, especially when multiple departments and users are involved. Here are some helpful tips to guide you through the process and create effective process models: @@ -6,7 +6,7 @@ Here are some helpful tips to guide you through the process and create effective **Understand BPMN Symbols:** Begin by thoroughly understanding the meaning and usage of each BPMN symbol. This will ensure that you use the symbols correctly to represent the various elements of your business process. -Refer to the [Learn Basics](../appendices/bpmn_terminology.md) section to learn more about each symbol. +Refer to the [Learn Basics](/explanation/understanding_the_terminology) section to learn more about each symbol. Grouping them together can create a mind map that's easy to remember. @@ -21,7 +21,7 @@ Represent your main process flow, also known as the "Happy Path," at the top in Then, depict alternative scenarios and exceptional cases leading to the bottom. This makes the process flow easier to comprehend. -![model_convention](images/model_convention.png) +![model_convention](/images/model_convention.png) **Choose Descriptive Names:** Use clear and human-readable names for activities, events, and gateways in your process. @@ -29,28 +29,28 @@ Utilize action verbs to represent activities effectively. Start the task name with an action-oriented verb that indicates what needs to be done in the task. For example, "Approve Request," "Review Documents," "Send Invoice," etc. -![naming_convention](images/naming_convention.png) +![naming_convention](/images/naming_convention.png) **Start with High-Level Overview:** Beginning with a high-level overview of the process provides a clear understanding of the overall flow and allows for the identification of major process components before delving into finer details. -By breaking the process down into smaller subprocesses or call activities with different levels of detail, the model becomes more manageable and easier to comprehend. +By breaking the process down into smaller sub-processes or call activities with different levels of detail, the model becomes more manageable and easier to comprehend. This approach enables the use of placeholders where you are unclear about what the process looks like, allowing for flexibility in filling in missing information as it becomes available. It also facilitates the focus on specific sections, preventing feeling overwhelmed by the complexity of the entire process. This systematic approach to process modeling ensures that essential aspects are adequately captured while providing room for further refinement. -![high_level](images/high_level.png) +![high_level](/images/high_level.png) **Include Exception Handling:** Model not only the primary process flow 'Happy Path' but also the exception handling and error recovery paths. This makes the process model more robust and prepares stakeholders for potential challenges. -![out_of_stock](images/out_of_stock.png) +![out_of_stock](/images/out_of_stock.png) **Use Lanes for Roles and Responsibilities:** Utilize swimlanes (pools and lanes) to clearly define the roles and responsibilities when there are different departments or individuals involved in the process. This visual representation will help demonstrate the interactions and handoffs between role players, enhancing the understanding of their involvement throughout the process. -![lanes](images/lanes_1.png) +![lanes](/images/lanes_1.png) **Embrace Iterative Approach:** Creating a perfect model on the first attempt is unlikely. @@ -60,14 +60,14 @@ Understand that your process model is not static. It will evolve over time, and there will always be room for improvement. Stay open to finding better ways to represent the process as you gain more insights. -![version](images/version.png) +![version](/images/version.png) **Make Note of Assumptions and Possible Challenges:** During the modeling process, it is essential to clearly document any assumptions made, especially when you may not have complete knowledge of user behavior or real-life process dynamics. By documenting these assumptions, you provide context and ensure transparency when sharing the model with others. Remember to verify these assumptions during real-life testing to validate their accuracy and adjust the model accordingly. -![version](images/assumptions.png) +![version](/images/assumptions.png) **Example:** Initially, we assumed that every customer going to checkout would complete their payment. @@ -86,3 +86,7 @@ Ensure that each case reaches a conclusive outcome. Implement timers to manage actions or decisions within specific time frames, enabling progress through the process despite delays or inactivity. Additionally, utilize intermediate events, such as message events, signal events, or error events, to capture specific occurrences during the process. These events guide the process towards a conclusion and allow for the cancellation of instances from within the process or through external triggers. + +```{tags} how_to_guide, building_diagrams + +``` diff --git a/docs/Building_Diagrams/Displaying_Content.md b/docs/how_to_guides/building_diagrams/display_content.md similarity index 89% rename from docs/Building_Diagrams/Displaying_Content.md rename to docs/how_to_guides/building_diagrams/display_content.md index eb59ae898..57f202123 100644 --- a/docs/Building_Diagrams/Displaying_Content.md +++ b/docs/how_to_guides/building_diagrams/display_content.md @@ -1,4 +1,4 @@ -# Displaying Content +# Display Content The SpiffArena platform offers powerful features for displaying content within your BPMN processes. Follow the steps below to effectively display content in your processes. @@ -29,20 +29,20 @@ Now, let's explore the process workflow of the content display process model and ### Display Content Process Overview -![Image](images/Display_Content.png) +![Image](/images/Display_Content.png) Here is a summary of the process: 1. **Start Event and Introduction Manual Task** -![Image](images/Introduction_manual.png) +![Image](/images/Introduction_manual.png) The process begins with a Start Event, signaling the start of the workflow. It is followed by a Manual Task called "Introduction" that displays a welcome message or instructions for the users. The content to be displayed is specified in the task's properties panel. -![Image](images/Manual_instructions_panel.png) +![Image](/images/Manual_instructions_panel.png) 2. **User Task with Form** @@ -50,7 +50,7 @@ A User Task named "simple form" is included, allowing users to complete a form. The properties panel of the User Task contains a JSON form schema, defining the structure of the form. The instructions panel of the User Task guides users to fill out the form, indicating that the entered values will be shown in the subsequent Manual Task. -![Image](images/User_instructions.png) +![Image](/images/User_instructions.png) 3. **Script Tasks** @@ -59,23 +59,26 @@ Script Task 1 introduces a delay using the code "time.sleep(3)" and generates a Script Task 2 includes a delay with the code "time.sleep(1)" and focuses on making the colors more playful. Script Task 3 includes a delay with the code "time.sleep(2)" and aims to increase the silliness level. -![Image](images/Script_instructions.png) +![Image](/images/Script_instructions.png) 4. **Manual Task to Display Content** -![Image](images/Manual_instructions.png) +![Image](/images/Manual_instructions.png) A Manual Task will display content based on the collected data and script-generated information. The instructions panel of the Manual Task provides the content to be displayed, which includes the form data entered by the user. It also offers an optional Chuck Norris joke based on user preference and a table of silly color names generated using Jinja templating. -![Image](images/Manual_instructions_side_by_side.png) +![Image](/images/Manual_instructions_side_by_side.png) 5. **End Event** -![Image](images/End1.png) +![Image](/images/End1.png) The process concludes with an End Event, indicating the end of the workflow. The instructions panel of the End Event suggests next steps, such as exploring the diagram in edit mode and completing the "Request a Playground" task. -![Image](images/end_message.png) +![Image](/images/end_message.png) + +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/how_to_guides/building_diagrams/index.md b/docs/how_to_guides/building_diagrams/index.md new file mode 100644 index 000000000..8de1ae22e --- /dev/null +++ b/docs/how_to_guides/building_diagrams/index.md @@ -0,0 +1,11 @@ +# Build Diagrams + +```{toctree} +:maxdepth: 1 +create_a_bpmn_diagram +use_user_tasks_and_forms +display_content +overview_of_builtin_examples +use_executable_and_nonexecutable_tasks +bpmn_unit_tests +``` diff --git a/docs/Building_Diagrams/Builtin_examples.md b/docs/how_to_guides/building_diagrams/overview_of_builtin_examples.md similarity index 96% rename from docs/Building_Diagrams/Builtin_examples.md rename to docs/how_to_guides/building_diagrams/overview_of_builtin_examples.md index cba475ff4..dc93a23d3 100644 --- a/docs/Building_Diagrams/Builtin_examples.md +++ b/docs/how_to_guides/building_diagrams/overview_of_builtin_examples.md @@ -1,4 +1,4 @@ -# Built-in Examples Overview +# Overview of Built-in Examples When logging into the dashboard, it is crucial to familiarize yourself with the functions it offers and how the underlying engine operates. In the demo website, we will explore two examples: the Minimal Example and the Essential Example, to provide a clear understanding of the process. @@ -170,21 +170,21 @@ Here are the four files in the process: **BPMN editor**: The BPMN editor is a primary file that runs the engine. In the Minimal Example, we learned that it allows you to visually design and represent business processes using the Business Process Model and Notation (BPMN) standard. -![image](images/BPMN_Editor.png) +![image](/images/BPMN_Editor.png) **DMN table**: A file that defines decision-making logic using the Decision Model and Notation (DMN) standard, enabling you to model complex decision rules and outcomes. -![Image](images/DMN_table.png) +![Image](/images/DMN_table.png) Here's what a DMN table looks like: -![Image](images/DMN_Properties_Table.png) +![Image](/images/DMN_Properties_Table.png) **JSON Schema**: A file that describes the structure, format, and validation rules for data in JSON format, ensuring data integrity and interoperability. -![Image](images/JSONSchema.png) +![Image](/images/JSONSchema.png) **UI Schema**: A file that defines the layout, structure, and behavior of user interfaces, facilitating the development of intuitive and interactive user experiences. -![Image](images/UI-Schema.png) +![Image](/images/UI-Schema.png) ### Process Workflow @@ -193,28 +193,28 @@ The process initiates with a start event, serving as the entry point for the wor Following the start event, a manual task named "Introduction" is incorporated, responsible for displaying a welcoming message to the user. -![](images/Manual_EM.png) +![](/images/Manual_EM.png) Next, a **User task** named "Display Questions" is added, facilitating the collection of information from real individuals through web forms. In the properties section, a JSON form is created to specify the questions for the users to respond to. -![](images/User_EM.png) +![](/images/User_EM.png) Once the user completes the form, the gathered data is passed on to a **script task** named "Modify Information", responsible for calculating the data score. The script for this calculation is embedded in the properties section. -![](images/Script_Em.png) +![](/images/Script_Em.png) As an alternative approach, the data score can also be determined using a **DMN table** named "Determine Score Message". Decision tables offer an effective means of defining business rules in an easily comprehensible format. The DMN table calculates the score based on predefined rules. -![](images/DMN_EM.png) +![](/images/DMN_EM.png) After the score calculation, an **exclusive gateway** is employed to make decisions based on the determined score. Three manual tasks are defined, each displaying a different message based on the obtained score: -![](images/Exclusive_Em.png) +![](/images/Exclusive_Em.png) a. **Worst Possible Response**: If the score indicates the worst possible response, a manual task displays a message stating that it is completely wrong. @@ -225,4 +225,7 @@ c. **Perfect Score**: If the score indicates a perfect score, a manual task disp Once the score messages are displayed, a **signal event** is included, providing users with the option to continue and conclude the process or choose to repeat the process from the beginning. Signal events enable external forces or internal errors to interact with the process, and in this scenario, a button press allows for the interruption of the diagram's normal course. -![](images/Signal_EM.png) +![](/images/Signal_EM.png) + +```{tags} tutorial, building_diagrams +``` diff --git a/docs/Debugging_Diagrams/executable_non_executable.md b/docs/how_to_guides/building_diagrams/use_executable_and_nonexecutable_tasks.md similarity index 86% rename from docs/Debugging_Diagrams/executable_non_executable.md rename to docs/how_to_guides/building_diagrams/use_executable_and_nonexecutable_tasks.md index 1c8e1e169..25b6d61c4 100644 --- a/docs/Debugging_Diagrams/executable_non_executable.md +++ b/docs/how_to_guides/building_diagrams/use_executable_and_nonexecutable_tasks.md @@ -1,4 +1,4 @@ -# Executable and Non-Executable Tasks +# Use Executable and Non-Executable Tasks In SpiffWorkflow, a process model can be either **Executable** or **Non-Executable**, and the designation impacts how the workflow behaves: - **Executable Process**: Configured for automation and execution by the workflow engine. All tasks within the process are actionable and designed to run dynamically. @@ -9,20 +9,20 @@ In SpiffWorkflow, a process model can be either **Executable** or **Non-Executab 1. Open the BPMN editor in SpiffWorkflow. Select the process canvas or diagram header. Navigate to the **Properties Panel** on the right side. 2. Under the **General** section, uncheck the **Executable** checkbox. -![non-executable task](images/non_executable.png) +![non-executable task](/images/non_executable.png) 3. Save your changes. Go to the process model page and the Start Button will not appear, indicating that the process is non-executable. -![non-executable task](images/non_executable1.png) +![non-executable task](/images/non_executable1.png) ### **Executable Processes**: 1. Follow the same steps as above, but check the **Executable** checkbox. -![executable task](images/executable.png) +![executable task](/images/executable.png) 2. Save your changes. The Start Button will now appear when the model is opened. -![executable task](images/executable1.png) +![executable task](/images/executable1.png) @@ -36,3 +36,5 @@ In SpiffWorkflow, a process model can be either **Executable** or **Non-Executab | Workflow design phase | ❌ | ✅ | | System integration | ✅ | ❌ | +```{tags} how_to_guide, debugging_diagrams +``` diff --git a/docs/Building_Diagrams/user_tasks_and_forms.md b/docs/how_to_guides/building_diagrams/use_user_tasks_and_forms.md similarity index 97% rename from docs/Building_Diagrams/user_tasks_and_forms.md rename to docs/how_to_guides/building_diagrams/use_user_tasks_and_forms.md index 151b4a7aa..144ef630e 100644 --- a/docs/Building_Diagrams/user_tasks_and_forms.md +++ b/docs/how_to_guides/building_diagrams/use_user_tasks_and_forms.md @@ -1,4 +1,4 @@ -# User Tasks and Forms +# Use User Tasks and Forms User Tasks are a key feature in BPMN (Business Process Model and Notation) workflows where human interaction is required to complete a process. In SpiffWorkflow, User Tasks are closely integrated with Forms, which are used to collect input or display information to users during process execution. Some key features of user tasks are: @@ -20,7 +20,7 @@ Some key features of user tasks are: **2. Configuring the User Task** Click on the user task in the BPMN editor to display the **Properties Panel** on the right. Below are the key sections and settings for user tasks: - ```{image} ./images/user_tasks_properties.png + ```{image} /images/user_tasks_properties.png :alt: Service Task :width: 300px :align: right @@ -70,7 +70,7 @@ To simplify the form creation process, we use the React JSON Schema Form (RJSF) It enables you to create dynamic and interactive forms with ease. The RJSF library is open source, free to use, and follows the principles of open standards. -![Image](images/Form_json.png) +![Image](/images/Form_json.png) Please note that while this guide provides a basic understanding of JSON Schema and RJSF, there is much more to explore. We encourage you to refer to the official [RJSF documentation](https://rjsf-team.github.io/react-jsonschema-form/docs/) for comprehensive details and advanced techniques. @@ -83,7 +83,7 @@ However, it's important to note that the form builder may have certain limitatio While the form builder provides convenience and simplicity, using the JSON editor offers greater flexibility and control over the form structure. -![Image](images/Form-Builder.png) +![Image](/images/Form-Builder.png) 3. **Creating Forms from BPMN Editor** @@ -94,21 +94,21 @@ Upon creating a new BPMN file, open it to access the editor. - In the editor, go to the "Web form" section. Navigate to the "Web form" and If starting from scratch, launch the editor and name your file (e.g., "demo"). After saving, it will automatically generate three essential files for us: a schema, UI settings, and some example data. -![Form Editor](images/Form_editor.png) +![Form Editor](/images/Form_editor.png) **Understanding the Three Core Files** - **JSON Schema**: This file describes the form. It allows you to define titles, property names, and more. As you make changes in this file, they will reflect in the form preview window. This schema outlines the properties or data points you aim to collect. -![Form Editor](images/Form_editor1.png) +![Form Editor](/images/Form_editor1.png) - **UI Settings**: This file offers customization options for your form. You can edit descriptions, titles, and more. Changes made here are reflected in real-time on the form. -![Form Editor](images/Form_editor2.png) +![Form Editor](/images/Form_editor2.png) - **Data View**: This section displays the data users input into the form. It provides a preview of what will be captured when the form is submitted. Both the data view and the form stay synchronized, ensuring consistency. -![Form Editor](images/Form_editor3.png) +![Form Editor](/images/Form_editor3.png) **Adding and Customizing Form Elements** @@ -116,7 +116,7 @@ You can add existing templates to add elements to your form, such as text areas, Each element can be further customized in the JSON schema and UI settings. For instance, you can set the UI widget correctly for each element, ensuring it appears as intended on the form. -![Form Editor](images/Form_editor4.png) +![Form Editor](/images/Form_editor4.png) ### SpiffArena react-jsonschema-form enhancements @@ -348,7 +348,7 @@ Here's how to use it: } ``` -![Styling_Form](images/styling_forms.png) +![Styling_Form](/images/styling_forms.png) #### Key Points: - **Layout Design**: The `ui:layout` specifies that `firstName` and `lastName` should appear side by side. Each field's size adjusts according to the screen size (small, medium, large), utilizing grid columns for responsive design. @@ -411,7 +411,7 @@ In the example above: - The help text "Pick whatever # you want!" will be displayed for the `form_num_1` field. **Output**: -![Display UI Help](images/Display_UI_Help.png) +![Display UI Help](/images/Display_UI_Help.png) By incorporating such help texts, you can enhance the user experience and ensure that users fill out the form correctly. @@ -429,7 +429,7 @@ To incorporate the markdown widget into your rjsf form, follow these steps: "ui:widget": "markdown" ``` -![rjsf markdown](images/rsjf_markdown.png) +![rjsf markdown](/images/rsjf_markdown.png) #### Numeric Range Field @@ -518,7 +518,7 @@ This structure can be represented in the form's schema as follows: **Form Preview**: -![Nested Forms](images/Nested_form_display.png) +![Nested Forms](/images/Nested_form_display.png) By using this feature, you can effectively implement new buttons for nested forms or repeating sections, improving the form's usability for collecting multiple related entries from users. @@ -573,7 +573,7 @@ To verify the functionality of the Guest User Task feature, follow these steps: Design a process model that includes a manual or user task. Ensure you check the **"allow guest"** checkbox. -![Guest user](images/guest_user1.png) +![Guest user](/images/guest_user1.png) 2. **Start the Process Model**: @@ -583,7 +583,7 @@ Initiate the process model using the same user account that created it. Navigate to the process instance show page and retrieve the GUID of the human task. -![Guest user](images/guest_user2.png) +![Guest user](/images/guest_user2.png) 4. **Construct the Access URL**: @@ -597,7 +597,9 @@ Replace `[domain]`, `[process_instance_id]`, and `[task_guid]` with appropriate 5. **Test as a Guest User**: Open an incognito or private browsing window (not logged into Spiff). Navigate to the constructed URL. Confirm that the guest user can complete the task. -![Guest user](images/guest_user3.png) +![Guest user](/images/guest_user3.png) The Guest User Task feature improves usability for non-logged-in users by allowing them to complete designated tasks seamlessly. +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/DevOps_installation_integration/configure_connector_proxy.md b/docs/how_to_guides/deployment/configure_a_connector_proxy.md similarity index 98% rename from docs/DevOps_installation_integration/configure_connector_proxy.md rename to docs/how_to_guides/deployment/configure_a_connector_proxy.md index 6fbb7ec97..c1b30ecf0 100644 --- a/docs/DevOps_installation_integration/configure_connector_proxy.md +++ b/docs/how_to_guides/deployment/configure_a_connector_proxy.md @@ -52,3 +52,6 @@ Run the process and once it's complete, you can see the response in the workflow You have successfully configured a `Connector Proxy` for use with `SpiffArena`. You made a call from a workflow to get a dog fact. Now, imagine if that call was to communicate with an external system relevant to your business processes. + +```{tags} how_to_guide, devops +``` diff --git a/docs/DevOps_installation_integration/okta_config.md b/docs/how_to_guides/deployment/configure_okta_as_an_openid_provider.md similarity index 96% rename from docs/DevOps_installation_integration/okta_config.md rename to docs/how_to_guides/deployment/configure_okta_as_an_openid_provider.md index ee8511c3b..027a15bcf 100644 --- a/docs/DevOps_installation_integration/okta_config.md +++ b/docs/how_to_guides/deployment/configure_okta_as_an_openid_provider.md @@ -1,4 +1,4 @@ -# Configuring Okta as an OpenID Provider +# Configure Okta as an OpenID Provider This guide provides steps to configure Okta as an OpenID Provider (alternative to Keycloak) for SpiffWorkflow. The setup involves creating an OpenID Connect (OIDC) application, configuring environment variables, and ensuring group information is passed through correctly. @@ -70,7 +70,7 @@ Adjust the configuration to ensure group information is included in the OpenID C For one of our users, the following setup was used to pass group information to SpiffWorkflow: -![image](images/okta_config.png) +![image](/images/okta_config.png) - Environment variables included the OpenID details and group scope. @@ -81,4 +81,7 @@ For one of our users, the following setup was used to pass group information to 🔗 **Helpful Links**: - [Okta App Integration Wizard](https://help.okta.com/en-us/content/topics/apps/apps_app_integration_wizard_oidc.htm) - [Groups Claim Documentation](https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/) -- [Active Directory Groups in Okta](https://support.okta.com/help/s/article/Can-we-retrieve-both-Active-Directory-and-Okta-groups-in-OpenID-Connect-claims?language=en_US). \ No newline at end of file +- [Active Directory Groups in Okta](https://support.okta.com/help/s/article/Can-we-retrieve-both-Active-Directory-and-Okta-groups-in-OpenID-Connect-claims?language=en_US). + +```{tags} how_to_guide, devops +``` diff --git a/docs/DevOps_installation_integration/Secrets.md b/docs/how_to_guides/deployment/configure_secrets.md similarity index 65% rename from docs/DevOps_installation_integration/Secrets.md rename to docs/how_to_guides/deployment/configure_secrets.md index 3681ba3ea..35a2bb9b0 100644 --- a/docs/DevOps_installation_integration/Secrets.md +++ b/docs/how_to_guides/deployment/configure_secrets.md @@ -1,4 +1,4 @@ -# How to Configure Secrets in SpiffArena +# Configure Secrets ## Introduction @@ -18,6 +18,7 @@ Secrets are only used in service tasks. - **SpiffArena Admin**: Can add or configure secrets. - **External Service Admin**: For example, an admin in Bamboo HR can provide the API key that a SpiffArena admin would then configure as a secret. - **Diagram Author**: Can reference secrets in service tasks but cannot see the actual secret values. + --- ## How to Configure Secrets @@ -25,26 +26,32 @@ Secrets are only used in service tasks. ### Adding a New Secret 1. **Navigate to the Configuration Section**: Go to the configuration section from the top panel and click on "Add a secret." Ensure you have admin access to SpiffArena. -![Configuration Section](images/Secrets_step_1.png) + ![Configuration Section](/images/Secrets_step_1.png) 2. **Add New Secret**: Create a new secret by entering a key and its corresponding value. Once saved, the value will be encrypted. -![Secrets Section](images/Secrets_step_2.png) + ![Secrets Section](/images/Secrets_step_2.png) ### Using Secrets in Service Tasks -1. **Open the BPMN Diagram**: Open the diagram where you want to configure the service task. +1. **Open the BPMN Diagram**: Open the diagram where you want to configure the service task. -2. **Configure Service Task**: Click on the service task you want to configure and in the service properties panel, search for the Operator ID that you want to add a secret for and mention the response variable to capture the result of the request. +2. **Configure Service Task**: Click on the service task you want to configure and in the service properties panel, search for the Operator ID that you want to add a secret for and mention the response variable to capture the result of the request. -3. **Add Secret Reference**: In the parameters, you can reference the secret using the following format: +3. **Add Secret Reference**: In the parameters, you can reference the secret using the following format: - ```xml - spiffworkflow:parameter id="headers" type="any" value="{ "Authorization": "Bearer SPIFF_SECRET:github_oauth" }" - ``` + ```xml + spiffworkflow:parameter id="headers" type="any" value="{ "Authorization": "Bearer SPIFF_SECRET:github_oauth" }" + ``` + + Here, `SPIFF_SECRET:github_oauth` will be replaced by the actual, unencrypted value from the database when the service task runs. + + ![Secrets Configuration](/images/Secrets_configure_2.png) - Here, `SPIFF_SECRET:github_oauth` will be replaced by the actual, unencrypted value from the database when the service task runs. -![Secrets Configuration](images/Secrets_configure_2.png) --- Configuring secrets in SpiffArena provides a secure way to handle sensitive information in your BPMN diagrams. It allows you to make your processes public without exposing critical data, thereby enhancing both transparency and security. + +```{tags} how_to_guide + +``` diff --git a/docs/DevOps_installation_integration/deployment.md b/docs/how_to_guides/deployment/deploy.md similarity index 95% rename from docs/DevOps_installation_integration/deployment.md rename to docs/how_to_guides/deployment/deploy.md index a08131fa1..f36e9f0f8 100644 --- a/docs/DevOps_installation_integration/deployment.md +++ b/docs/how_to_guides/deployment/deploy.md @@ -1,4 +1,4 @@ -# Deployment +# Deploy The minimal deployment is to mimic the docker-compose.yml file at the root of spiff-arena. Steps for a more hardened production setup after that baseline include: @@ -26,3 +26,7 @@ graph TD; API, Celery Worker, Connector Proxy, and Frontend can run any number of replicas. The Background container is like a cron container, so it should run only one replica. + +```{tags} how_to_guide + +``` diff --git a/docs/DevOps_installation_integration/deploy_aws_lambda.md b/docs/how_to_guides/deployment/deploy_a_connector_proxy_as_an_aws_lambda_function.md similarity index 97% rename from docs/DevOps_installation_integration/deploy_aws_lambda.md rename to docs/how_to_guides/deployment/deploy_a_connector_proxy_as_an_aws_lambda_function.md index d72c93219..ac3b875db 100644 --- a/docs/DevOps_installation_integration/deploy_aws_lambda.md +++ b/docs/how_to_guides/deployment/deploy_a_connector_proxy_as_an_aws_lambda_function.md @@ -1,4 +1,4 @@ -# Deploying a Connector Proxy as an AWS Lambda Function +# Deploy a Connector Proxy as an AWS Lambda Function This guide shows you how to deploy the demo `Connector Proxy` as an `AWS Lambda Function` and integrate it with [SpiffArena](https://www.spiffworkflow.org/pages/spiffarena/). We will use the [Getting Started Guide](https://www.spiffworkflow.org/posts/articles/get_started/) as the basis for integration, but the steps should easily map to any custom installation. @@ -64,4 +64,7 @@ Click your function URL again to see a greeting from our deployed Connector Prox ## Integrating With SpiffArena Congratulations, your Connector Proxy has been deployed as a Lambda function. -For information on configuring SpiffArena to use the new Connector Proxy URL, please see [Configure a Connector Proxy](configure_connector_proxy). +For information on configuring SpiffArena to use the new Connector Proxy URL, please see [Configure a Connector Proxy](configure_a_connector_proxy). + +```{tags} how_to_guide, devops +``` diff --git a/docs/how_to_guides/deployment/index.md b/docs/how_to_guides/deployment/index.md new file mode 100644 index 000000000..7d5e89f03 --- /dev/null +++ b/docs/how_to_guides/deployment/index.md @@ -0,0 +1,14 @@ +# Deploy + +```{toctree} +:maxdepth: 1 +deploy +configure_secrets +manage_permissions +configure_okta_as_an_openid_provider +use_pathbased_routing +work_with_redis_celery_broker +deploy_a_connector_proxy_as_an_aws_lambda_function +configure_a_connector_proxy +manage_process_models +``` diff --git a/docs/DevOps_installation_integration/admin_and_permissions.md b/docs/how_to_guides/deployment/manage_permissions.md similarity index 73% rename from docs/DevOps_installation_integration/admin_and_permissions.md rename to docs/how_to_guides/deployment/manage_permissions.md index 918fe80c8..163be354a 100644 --- a/docs/DevOps_installation_integration/admin_and_permissions.md +++ b/docs/how_to_guides/deployment/manage_permissions.md @@ -1,4 +1,4 @@ -# Admin and Permissions +# Manage Permissions Permissions can be defined and managed at different levels such as process groups, individual processes, or users. @@ -34,11 +34,12 @@ This is just for documentation purposes and isn't used by the system. In this example, we are describing permissions for an "admin-type-user." There are three keys allowed under each permission: -* groups: lists the groups to which the permission applies (admin in this case) -* actions: lists the specific actions that are permitted for the group - * actions can be negated by prepending with "DENY:" -* uri: defines the target resource for these permissions - * /* indicates that the permissions apply to all resources within the system + +- groups: lists the groups to which the permission applies (admin in this case) +- actions: lists the specific actions that are permitted for the group + - actions can be negated by prepending with "DENY:" +- uri: defines the target resource for these permissions + - /\* indicates that the permissions apply to all resources within the system **Permissions allowed:** @@ -56,15 +57,15 @@ There are three keys allowed under each permission: To allow reading and updating, it would look like this: -```` +``` ["read", "update"] -```` +``` To allow reading and DISALLOW updating, it would look like this: -```` +``` ["read", "DENY:update"] -```` +``` ## Site Administration @@ -76,7 +77,7 @@ In such cases, you have the flexibility to define and tailor admin requirements From the main menu select 'Processes' and click on the 'Add a process group' button. -![add_a_process_group](images/add_a_process_group.png) +![add_a_process_group](/images/add_a_process_group.png) Complete the Process Groups form by entering the @@ -86,11 +87,11 @@ Complete the Process Groups form by entering the Once the required fields are filled, the form can be submitted. -![add_a_process_group](images/process_groups_tile.png) +![add_a_process_group](/images/process_groups_tile.png) The new Process Groups tile will be available under the Process Groups view. -![site_administration](images/site_administration.png) +![site_administration](/images/site_administration.png) ### Step 2: Add Process Model @@ -100,23 +101,23 @@ The new Process Groups tile will be available under the Process Groups view. - Description: Provide a brief description of the process model, outlining its purpose or functionality. - Notification Type: Specify the type of notification related to the process model. - Notification Addresses: Enter the addresses or destinations where notifications should be sent in the event that a process instance encounters an error. -You do not need to worry about setting these values unless you are interested in custom {ref}`process_error_handling`. + You do not need to worry about setting these values unless you are interested in custom {ref}`process_error_handling`. - Metadata Extraction Path: You can provide one or more metadata extractions to uplift data from your process instances to provide quick access in searches and perspectives. -Specify the key and path/location where metadata extraction should occur within the process model. -For example, if you have a script task that runs the statement `great_color = "blue"`, then you would set the extraction path to `great_color`. -You would probably also set the extraction key to `great_color`. -But if you wanted to, you could just call it `color`, assuming you wanted that to be the name used in reports, etc. + Specify the key and path/location where metadata extraction should occur within the process model. + For example, if you have a script task that runs the statement `great_color = "blue"`, then you would set the extraction path to `great_color`. + You would probably also set the extraction key to `great_color`. + But if you wanted to, you could just call it `color`, assuming you wanted that to be the name used in reports, etc. Make sure to accurately fill in all the required fields in the Process Model form to ensure proper configuration and functionality. -![add_process_model](images/add_process_model.png) +![add_process_model](/images/add_process_model.png) ### Step 3: Upload Workflows All the required workflows can be downloaded from [Github - set-permissions](https://github.com/sartography/sample-process-models/tree/sample-models-1/site-administration/set-permissions) Select to upload all downloaded files to the newly created Process model. -![add_file](images/add_file.png) +![add_file](/images/add_file.png) **Upload the following files:** @@ -124,15 +125,15 @@ Select to upload all downloaded files to the newly created Process model. - groups_permissions.dmn - users_to_groups.dmn -![upload_file](images/upload_file.png) +![upload_file](/images/upload_file.png) The Process Model view should now include all uploaded files. -![upload_file](images/admin_workflows.png) +![upload_file](/images/admin_workflows.png) ### Step 4: Understand the Process Models [Read more about DMN tables and how they work here. -](../Building_Diagrams/dmn.md) +](/reference/bpmn/decision_tables) #### Users to Groups @@ -146,22 +147,22 @@ Based on DMN functionality, leaving the "*" column empty means that all rules (' Read more about DMN tables to understand how the rules engine can be utilized for many different scenarios. ``` -![user_to_groups](images/user_to_groups.png) +![user_to_groups](/images/user_to_groups.png) #### Group Permission Now that the groups have been identified, their permissions can be set by adding the group name under the "permissions_group" column. - To determine a user's capabilities within the permissible scope, you can define specific permissions. -These permissions can be combined in a sequence if multiple apply to a particular rule. -For instance, ["read", "start"] indicates that the user can perform both reading and starting actions. -Alternatively, [All] can be employed to grant unrestricted access. + These permissions can be combined in a sequence if multiple apply to a particular rule. + For instance, ["read", "start"] indicates that the user can perform both reading and starting actions. + Alternatively, [All] can be employed to grant unrestricted access. - The hit policy is set to "Collect" which means that all conditions that are true will be applied. -[Read more about DMN tables and hit policies here.](../Building_Diagrams/dmn.md) + [Read more about DMN tables and hit policies here.](/reference/bpmn/decision_tables) - The permission URL can be configured to define the user's access privileges. -Our objective is to streamline the process by minimizing the necessity of being familiar with the complete set of permission URLs. -In most instances, utilizing BASIC and ELEVATED permissions, as well as PM/PG, should be sufficient. -However, it is also feasible to directly incorporate any API URL into the permissions. + Our objective is to streamline the process by minimizing the necessity of being familiar with the complete set of permission URLs. + In most instances, utilizing BASIC and ELEVATED permissions, as well as PM/PG, should be sufficient. + However, it is also feasible to directly incorporate any API URL into the permissions. In truth, what you are doing is writing an expression. In this case, it would read that if the variable 'permissions_group' type string is equal to 'permissions' variable of type string then set the 'permission_url' equal to the associated value. @@ -171,9 +172,13 @@ If you find coding more familiar and preferable to constructing DMN tables, you This similarity can help clarify or make it easier for you to understand the DMN table structure and its relation to the permission configuration. ``` -![group_permission](images/group_permission.png) +![group_permission](/images/group_permission.png) ### Step 5: Start Process To ensure that User Groups and Permissions take effect, it is necessary to run the process at least once. Whenever changes are made to any of these diagrams, like adding a user group or permission, the process should be started and completed successfully in order for the changes to be applied. + +```{tags} how_to_guide, dev_docs + +``` diff --git a/docs/DevOps_installation_integration/process_model_management.md b/docs/how_to_guides/deployment/manage_process_models.md similarity index 98% rename from docs/DevOps_installation_integration/process_model_management.md rename to docs/how_to_guides/deployment/manage_process_models.md index cefc0dee0..dda3a7376 100644 --- a/docs/DevOps_installation_integration/process_model_management.md +++ b/docs/how_to_guides/deployment/manage_process_models.md @@ -1,4 +1,4 @@ -# Process Model Management +# Manage Process Models Managing your process models is similar to managing your source code. As such, it is recommended to store these models in a version control system like Git so that you can track changes and collaborate with others. @@ -63,3 +63,6 @@ It is also possible to promote models piecemeal. This is activated via `SPIFFWORKFLOW_BACKEND_GIT_PUBLISH_TARGET_BRANCH`, which is for a specific use case where you want to publish specific process models from the source branch to a target Git branch, rather than promoting the entire Git branch. A publish function appears in the UI when `SPIFFWORKFLOW_BACKEND_GIT_PUBLISH_TARGET_BRANCH` is set. It is possibly not a recommended strategy for promoting changes, however, as it is not a standard Git workflow, and it is more error-prone in situations where multiple process models need to work together. + +```{tags} how_to_guide, devops +``` diff --git a/docs/DevOps_installation_integration/path_based_routing.md b/docs/how_to_guides/deployment/use_pathbased_routing.md similarity index 97% rename from docs/DevOps_installation_integration/path_based_routing.md rename to docs/how_to_guides/deployment/use_pathbased_routing.md index 22f997771..b3428a2ef 100644 --- a/docs/DevOps_installation_integration/path_based_routing.md +++ b/docs/how_to_guides/deployment/use_pathbased_routing.md @@ -1,4 +1,4 @@ -# Path-based Routing +# Use Path-based Routing If you are using the frontend, the frontend and backend need to share cookies. The backend, in particular, sets a cookie, and the frontend needs to read it. @@ -47,3 +47,6 @@ SPIFFWORKFLOW_BACKEND_WSGI_PATH_PREFIX=/api This will be used as the WSGI `SCRIPT_NAME`, which essentially removes the prefix before handing the URL to the app for routing, but also allows URLs generated by the app to return things like /api/v1.0/status. WSGI is a standard for serving Python apps, and there are implementations like Gunicorn, Green Unicorn, uWSGI, mod_wsgi, CherryPy, etc. + +```{tags} how_to_guide, devops +``` diff --git a/docs/DevOps_installation_integration/redis_celery_broker.md b/docs/how_to_guides/deployment/work_with_redis_celery_broker.md similarity index 94% rename from docs/DevOps_installation_integration/redis_celery_broker.md rename to docs/how_to_guides/deployment/work_with_redis_celery_broker.md index 6afaca26d..a9157cce9 100644 --- a/docs/DevOps_installation_integration/redis_celery_broker.md +++ b/docs/how_to_guides/deployment/work_with_redis_celery_broker.md @@ -1,4 +1,4 @@ -# Redis Celery Broker +# Work with Redis Celery Broker SpiffWorkflow can be configured to use Celery for efficient processing. Redis can be used as both a broker and backend for Celery. @@ -39,3 +39,7 @@ As such, if you wanted to get ALL of the results, you could use a command like: ```sh echo 'keys celery-task-meta-\*' | redis-cli | sed 's/^/get /' | redis-cli ``` + +```{tags} how_to_guide, dev_docs + +``` diff --git a/docs/how_to_guides/index.md b/docs/how_to_guides/index.md new file mode 100644 index 000000000..6456dd61b --- /dev/null +++ b/docs/how_to_guides/index.md @@ -0,0 +1,14 @@ +# How-to Guides + +**Step-by-step guides**: Covering key operations and common tasks. + +```{toctree} +:maxdepth: 1 +:caption: How-to Guides +building_diagrams/index +manage_processes +manage_welcome_messages +use_custom_process_metadata +troubleshoot_locally +deployment/index +``` diff --git a/docs/Support/manage_processes.md b/docs/how_to_guides/manage_processes.md similarity index 90% rename from docs/Support/manage_processes.md rename to docs/how_to_guides/manage_processes.md index 989dd0038..bb0de556a 100644 --- a/docs/Support/manage_processes.md +++ b/docs/how_to_guides/manage_processes.md @@ -22,7 +22,7 @@ If an instance is not active, it indicates that the process has already been com > **Step 2: Locate Suspend Icon** -![suspend](images/suspend.png) +![suspend](/images/suspend.png) - Next to the Process Instance Id, look for the icon that resembles the 'Suspend' icon and select it to initiate the suspension of the process instance. @@ -33,12 +33,12 @@ This action will pause the process instance, granting you the ability to make ed When ready, the process instance can be resumed. The process instance remains highlighted in yellow. -![suspend](images/active_process_instance.png) +![suspend](/images/active_process_instance.png) | ✅ Success | | :---------------------------------------------------------------: | | Confirm that the status has changed from ‘waiting’ to ‘suspended’ | -| ![suspended](images/suspended.png) | +| ![suspended](/images/suspended.png) | ## Resume a Process Instance @@ -46,7 +46,7 @@ Resuming a process is essential for ensuring that the process can continue its e > **Step 1: Locate Resume Icon** -![resume](images/resume.png) +![resume](/images/resume.png) - Next to the Process Instance Id, look for the icon that resembles the 'Resume' icon and select it to resume the suspended process instance. @@ -57,12 +57,12 @@ Resuming a process is essential for ensuring that the process can continue its e Depending on where the process instance is in its journey, the status might be waiting or some other active status. The process instance remains highlighted in yellow. -![suspend](images/active_process_instance.png) +![suspend](/images/active_process_instance.png) | ✅ Success | | :-----------------------------------------------------------------------: | | Confirm that the status has changed from ‘suspended’ to an active status. | -| ![waiting](images/waiting.png) | +| ![waiting](/images/waiting.png) | ## Terminate a Process Instance @@ -71,7 +71,7 @@ There are various reasons for terminating a process instance such as the instanc > **Step 1: Locate Terminate Icon** -![terminate](images/terminate.png) +![terminate](/images/terminate.png) - Next to the Process Instance Id, look for the icon that resembles the 'Terminate' icon and select it to terminate the process instance. @@ -83,15 +83,15 @@ There are various reasons for terminating a process instance such as the instanc > **Step 3: Confirm Termination** - Before proceeding with the termination, it is essential to be absolutely certain about your decision. - ![terminate_warning](images/terminate_warning.png) + ![terminate_warning](/images/terminate_warning.png) - The process status will now be 'Terminated' and the last active task will be highlighted in purple. - ![suspend](images/terminated_process_instance.png) + ![suspend](/images/terminated_process_instance.png) | ✅ Success | | :------------------------------------------------------------------: | | Confirm that the status has changed from ‘suspended’ to 'terminated' | -| ![suspend](images/terminated.png) | +| ![suspend](/images/terminated.png) | ## Reset a Process Instance @@ -104,7 +104,7 @@ There are various reasons for terminating a process instance such as the instanc > **Step 3: Suspend the Process** Ensure the status has changed from _user_input_required_ to _suspended_ -![Reset](images/reset_process2.png) +![Reset](/images/reset_process2.png) > **Step 4: Go to the relevant past activity** @@ -113,7 +113,7 @@ Only a previously completed section highlighted in grey can be chosen. > **Step 5: Select 'View process instance at the time when this task was active. > '** -![Reset](images/reset_process3.png) +![Reset](/images/reset_process3.png) > **Step 6: Observe the task once highlighted in grey should now be yellow. > ** @@ -123,14 +123,14 @@ A previously completed section is now active and shown in yellow. > **Step 7: Select 'Reset Process Here' icon in the popup window. > ** -![Reset](images/reset_process5.png) +![Reset](/images/reset_process5.png) > **Step 8: "Resume" process instance. > ** The process instance should be resumed by selecting the ‘Resume’ icon next to the Process Instance Id. -![Reset](images/reset_process6.png) +![Reset](/images/reset_process6.png) > **Step 9: Refresh page** @@ -184,14 +184,15 @@ In the case of the example, once you resume the instance and complete Manual Tas Migration is not possible when the following activities are active (started/ready/waiting): -- Call activity/Subprocess - The task itself cannot be changed once it is active. - Tasks inside the call activity or subprocess can be updated if they have not been reached. +- Call activity/Sub-process - The task itself cannot be changed once it is active. + Tasks inside the call activity or sub-process can be updated if they have not been reached. Tasks that directly follow one of these activities are special, and you cannot migrate an instance if you add or remove one of these. - Multi Instance tasks - Loop tasks - Signal boundary event - add/remove signals - Looping back through a part of a process which has already completed once + #### Forms Forms are not serialized as part of the process model specification, and therefore are not considered during migration. @@ -220,3 +221,7 @@ General path params: - **modified_process_model_identifier**: the process model identifier separated by colons - `:` - instead of slashes - **process_instance_id**: the id of the process instance to run on. + +```{tags} how_to_guide + +``` diff --git a/docs/Support/Welcome_Messages.md b/docs/how_to_guides/manage_welcome_messages.md similarity index 86% rename from docs/Support/Welcome_Messages.md rename to docs/how_to_guides/manage_welcome_messages.md index 537b23283..e7c14ba1f 100644 --- a/docs/Support/Welcome_Messages.md +++ b/docs/how_to_guides/manage_welcome_messages.md @@ -1,4 +1,4 @@ -# Welcome Messages in SpiffWorkflow +# Manage Welcome Messages ## Introduction @@ -13,28 +13,32 @@ This guide will walk you through the steps to modify this message in SpiffWorkfl 1. **Open the Process:** Navigate to the onboarding process model within SpiffWorkflow. - ![Process Model](images/onboarding_1.png) + ![Process Model](/images/onboarding_1.png) 2. **Access the `welcome.bpmn` File:** This is the specific file where the welcome message is configured. Ensure you're at the path `siteadministration.onboarding`. This path is crucial as it's the trigger for the welcome message. - ![Access Welcome file](images/onboarding_2.png) + ![Access Welcome file](/images/onboarding_2.png) 3. **Locate the End Event:** The end event within this process contains the welcome message. Any message configured in this end event will be displayed to users upon login. - ![Click End Event](images/onboarding_3.png) + ![Click End Event](/images/onboarding_3.png) 4. **Launch the Editor:** Use the built-in editor to modify the content of the welcome message. Ensure that your changes are clear, concise, and welcoming to provide users with a positive experience. - ![Launching Editor](images/onboarding_4.png) + ![Launching Editor](/images/onboarding_4.png) After making your desired modifications, save the changes to update the welcome message. Once you've updated the welcome message, it will be displayed prominently on the home page after users log in. The message will be positioned in a way that it's one of the first things users see, ensuring they receive the intended greeting every time they access the platform. + +```{tags} how_to_guide + +``` diff --git a/docs/Support/Running_Server_Locally.md b/docs/how_to_guides/troubleshoot_locally.md similarity index 94% rename from docs/Support/Running_Server_Locally.md rename to docs/how_to_guides/troubleshoot_locally.md index be5eeea8c..8892e0c18 100644 --- a/docs/Support/Running_Server_Locally.md +++ b/docs/how_to_guides/troubleshoot_locally.md @@ -1,4 +1,4 @@ -# Troubleshooting: Running Server Locally +# Troubleshoot Locally When setting up the SpiffWorkflow backend project locally, you might encounter issues related to the `sample-process-models` directory. This documentation aims to address those concerns. @@ -29,9 +29,9 @@ If you prefer not to use the `sample-process-models` directory or want to start - Run the following command with the path to your chosen repository: - ``` - SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR=/path/to/any/git/repo ./bin/run_server_locally - ``` + ``` + SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR=/path/to/any/git/repo ./bin/run_server_locally + ``` ### 3. Use Docker Compose @@ -55,7 +55,7 @@ You may need to install additional system dependencies: One person decided that mysqlclient and psycopg2 were more trouble than they were worth and removed them from the pyproject.toml, opting instead to run `poetry add pymysql`. If you are using mysql, psycopg2 is not necessary, and pymysql is a pure Python implementation of the MySQL client library. -In that case, Python won't recognize MySQLdb as a module, so after the above installs (which you would do pre-Poetry), add these lines to __init__.py in the backend project: +In that case, Python won't recognize MySQLdb as a module, so after the above installs (which you would do pre-Poetry), add these lines to `__init__.py` in the backend project: ```python import pymysql @@ -74,3 +74,7 @@ Setting up the SpiffWorkflow backend project locally can be straightforward once Whether you choose to clone the `sample-process-models` repository, use a different git repository, or opt for Docker Compose, the solutions provided should help you get started without any hitches. If you encounter further issues, always refer back to the repository's README or seek assistance from our Discord community. + +```{tags} how_to_guide + +``` diff --git a/docs/Building_Diagrams/custom_process_metadata.md b/docs/how_to_guides/use_custom_process_metadata.md similarity index 96% rename from docs/Building_Diagrams/custom_process_metadata.md rename to docs/how_to_guides/use_custom_process_metadata.md index 5c27f8a26..f59dfb0a7 100644 --- a/docs/Building_Diagrams/custom_process_metadata.md +++ b/docs/how_to_guides/use_custom_process_metadata.md @@ -1,4 +1,4 @@ -# Custom Process Metadata +# Use Custom Process Metadata This guide will walk you through the steps to create a process model that generates custom metadata using a metadata extraction path and how to query that metadata using process instance filtering. @@ -39,3 +39,6 @@ This guide will walk you through the steps to create a process model that genera - You can also filter process instances based on your custom column using the same column options. By following these steps, you can create a process model that generates custom metadata and efficiently query that metadata using process instance filtering. + +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/Building_Diagrams/images/add_file.png b/docs/images/1736024102_add_file.png similarity index 100% rename from docs/Building_Diagrams/images/add_file.png rename to docs/images/1736024102_add_file.png diff --git a/docs/Building_Diagrams/images/add_process_model.png b/docs/images/1736024102_add_process_model.png similarity index 100% rename from docs/Building_Diagrams/images/add_process_model.png rename to docs/images/1736024102_add_process_model.png diff --git a/docs/Building_Diagrams/images/my_process_instances.png b/docs/images/1736024102_my_process_instances.png similarity index 100% rename from docs/Building_Diagrams/images/my_process_instances.png rename to docs/images/1736024102_my_process_instances.png diff --git a/docs/Building_Diagrams/images/process_instance_not_found.png b/docs/images/1736024102_process_instance_not_found.png similarity index 100% rename from docs/Building_Diagrams/images/process_instance_not_found.png rename to docs/images/1736024102_process_instance_not_found.png diff --git a/docs/Building_Diagrams/images/suspend.png b/docs/images/1736024102_suspend.png similarity index 100% rename from docs/Building_Diagrams/images/suspend.png rename to docs/images/1736024102_suspend.png diff --git a/docs/Building_Diagrams/images/suspended.png b/docs/images/1736024102_suspended.png similarity index 100% rename from docs/Building_Diagrams/images/suspended.png rename to docs/images/1736024102_suspended.png diff --git a/docs/Building_Diagrams/images/upload_file.png b/docs/images/1736024102_upload_file.png similarity index 100% rename from docs/Building_Diagrams/images/upload_file.png rename to docs/images/1736024102_upload_file.png diff --git a/docs/Building_Diagrams/images/user_to_groups.png b/docs/images/1736024102_user_to_groups.png similarity index 100% rename from docs/Building_Diagrams/images/user_to_groups.png rename to docs/images/1736024102_user_to_groups.png diff --git a/docs/Building_Diagrams/images/admin_workflows.png b/docs/images/1736024103_admin_workflows.png similarity index 100% rename from docs/Building_Diagrams/images/admin_workflows.png rename to docs/images/1736024103_admin_workflows.png diff --git a/docs/Building_Diagrams/images/call_activity_popup.png b/docs/images/1736024103_call_activity_popup.png similarity index 100% rename from docs/Building_Diagrams/images/call_activity_popup.png rename to docs/images/1736024103_call_activity_popup.png diff --git a/docs/Building_Diagrams/images/inactive_subtask.png b/docs/images/1736024103_inactive_subtask.png similarity index 100% rename from docs/Building_Diagrams/images/inactive_subtask.png rename to docs/images/1736024103_inactive_subtask.png diff --git a/docs/Building_Diagrams/images/process_groups_tile.png b/docs/images/1736024103_process_groups_tile.png similarity index 100% rename from docs/Building_Diagrams/images/process_groups_tile.png rename to docs/images/1736024103_process_groups_tile.png diff --git a/docs/Building_Diagrams/images/Login.png b/docs/images/1736024104_Login.png similarity index 100% rename from docs/Building_Diagrams/images/Login.png rename to docs/images/1736024104_Login.png diff --git a/docs/Building_Diagrams/images/add_a_process_group.png b/docs/images/1736024104_add_a_process_group.png similarity index 100% rename from docs/Building_Diagrams/images/add_a_process_group.png rename to docs/images/1736024104_add_a_process_group.png diff --git a/docs/Building_Diagrams/images/site_administration.png b/docs/images/1736024104_site_administration.png similarity index 100% rename from docs/Building_Diagrams/images/site_administration.png rename to docs/images/1736024104_site_administration.png diff --git a/docs/Building_Diagrams/images/user_input_required.png b/docs/images/1736024104_user_input_required.png similarity index 100% rename from docs/Building_Diagrams/images/user_input_required.png rename to docs/images/1736024104_user_input_required.png diff --git a/docs/Getting_Started/images/Access_Process_Instance.png b/docs/images/Access_Process_Instance.png similarity index 100% rename from docs/Getting_Started/images/Access_Process_Instance.png rename to docs/images/Access_Process_Instance.png diff --git a/docs/Building_Diagrams/images/Annotation.png b/docs/images/Annotation.png similarity index 100% rename from docs/Building_Diagrams/images/Annotation.png rename to docs/images/Annotation.png diff --git a/docs/Building_Diagrams/images/BPMN_Editor.png b/docs/images/BPMN_Editor.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_Editor.png rename to docs/images/BPMN_Editor.png diff --git a/docs/Building_Diagrams/images/BPMN_Form_display.png b/docs/images/BPMN_Form_display.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_Form_display.png rename to docs/images/BPMN_Form_display.png diff --git a/docs/Building_Diagrams/images/BPMN_association-80x31.png b/docs/images/BPMN_association-80x31.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_association-80x31.png rename to docs/images/BPMN_association-80x31.png diff --git a/docs/Building_Diagrams/images/BPMN_message_flow-80x30.png b/docs/images/BPMN_message_flow-80x30.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_message_flow-80x30.png rename to docs/images/BPMN_message_flow-80x30.png diff --git a/docs/Building_Diagrams/images/BPMN_sequence_flow-80x31.png b/docs/images/BPMN_sequence_flow-80x31.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_sequence_flow-80x31.png rename to docs/images/BPMN_sequence_flow-80x31.png diff --git a/docs/Building_Diagrams/images/BPMN_swimlane-500x197 (1).png b/docs/images/BPMN_swimlane-500x197 (1).png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_swimlane-500x197 (1).png rename to docs/images/BPMN_swimlane-500x197 (1).png diff --git a/docs/Building_Diagrams/images/BPMN_swimlane-500x197.png b/docs/images/BPMN_swimlane-500x197.png similarity index 100% rename from docs/Building_Diagrams/images/BPMN_swimlane-500x197.png rename to docs/images/BPMN_swimlane-500x197.png diff --git a/docs/Building_Diagrams/images/Business-rule-tasks.png b/docs/images/Business-rule-tasks.png similarity index 100% rename from docs/Building_Diagrams/images/Business-rule-tasks.png rename to docs/images/Business-rule-tasks.png diff --git a/docs/Building_Diagrams/images/Businessrule.png b/docs/images/Businessrule.png similarity index 100% rename from docs/Building_Diagrams/images/Businessrule.png rename to docs/images/Businessrule.png diff --git a/docs/Building_Diagrams/images/Call_Activity.png b/docs/images/Call_Activity.png similarity index 100% rename from docs/Building_Diagrams/images/Call_Activity.png rename to docs/images/Call_Activity.png diff --git a/docs/Building_Diagrams/images/Call_Activity1.png b/docs/images/Call_Activity1.png similarity index 100% rename from docs/Building_Diagrams/images/Call_Activity1.png rename to docs/images/Call_Activity1.png diff --git a/docs/Building_Diagrams/images/Callactivity.png b/docs/images/Callactivity.png similarity index 100% rename from docs/Building_Diagrams/images/Callactivity.png rename to docs/images/Callactivity.png diff --git a/docs/Building_Diagrams/images/CatchErrorExample.png b/docs/images/CatchErrorExample.png similarity index 100% rename from docs/Building_Diagrams/images/CatchErrorExample.png rename to docs/images/CatchErrorExample.png diff --git a/docs/Getting_Started/images/Completed_by_me.png b/docs/images/Completed_by_me.png similarity index 100% rename from docs/Getting_Started/images/Completed_by_me.png rename to docs/images/Completed_by_me.png diff --git a/docs/Getting_Started/images/Completed_by_others.png b/docs/images/Completed_by_others.png similarity index 100% rename from docs/Getting_Started/images/Completed_by_others.png rename to docs/images/Completed_by_others.png diff --git a/docs/Building_Diagrams/images/Complex.png b/docs/images/Complex.png similarity index 100% rename from docs/Building_Diagrams/images/Complex.png rename to docs/images/Complex.png diff --git a/docs/Getting_Started/images/Corelation.png b/docs/images/Corelation.png similarity index 100% rename from docs/Getting_Started/images/Corelation.png rename to docs/images/Corelation.png diff --git a/docs/Building_Diagrams/images/DMN_EM.png b/docs/images/DMN_EM.png similarity index 100% rename from docs/Building_Diagrams/images/DMN_EM.png rename to docs/images/DMN_EM.png diff --git a/docs/Building_Diagrams/images/DMN_Properties_Table.png b/docs/images/DMN_Properties_Table.png similarity index 100% rename from docs/Building_Diagrams/images/DMN_Properties_Table.png rename to docs/images/DMN_Properties_Table.png diff --git a/docs/Building_Diagrams/images/DMN_table.png b/docs/images/DMN_table.png similarity index 100% rename from docs/Building_Diagrams/images/DMN_table.png rename to docs/images/DMN_table.png diff --git a/docs/Building_Diagrams/images/DataStore_JSON_Output.png b/docs/images/DataStore_JSON_Output.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_JSON_Output.png rename to docs/images/DataStore_JSON_Output.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV.png b/docs/images/DataStore_KKV.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV.png rename to docs/images/DataStore_KKV.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_1.png b/docs/images/DataStore_KKV_1.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_1.png rename to docs/images/DataStore_KKV_1.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_2.png b/docs/images/DataStore_KKV_2.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_2.png rename to docs/images/DataStore_KKV_2.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_3.png b/docs/images/DataStore_KKV_3.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_3.png rename to docs/images/DataStore_KKV_3.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_4.png b/docs/images/DataStore_KKV_4.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_4.png rename to docs/images/DataStore_KKV_4.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_Output.png b/docs/images/DataStore_KKV_Output.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_Output.png rename to docs/images/DataStore_KKV_Output.png diff --git a/docs/Building_Diagrams/images/DataStore_KKV_Store.png b/docs/images/DataStore_KKV_Store.png similarity index 100% rename from docs/Building_Diagrams/images/DataStore_KKV_Store.png rename to docs/images/DataStore_KKV_Store.png diff --git a/docs/Building_Diagrams/images/Data_Object.png b/docs/images/Data_Object.png similarity index 100% rename from docs/Building_Diagrams/images/Data_Object.png rename to docs/images/Data_Object.png diff --git a/docs/Building_Diagrams/images/Data_Storage.png b/docs/images/Data_Storage.png similarity index 100% rename from docs/Building_Diagrams/images/Data_Storage.png rename to docs/images/Data_Storage.png diff --git a/docs/Building_Diagrams/images/Display_Content.png b/docs/images/Display_Content.png similarity index 100% rename from docs/Building_Diagrams/images/Display_Content.png rename to docs/images/Display_Content.png diff --git a/docs/Building_Diagrams/images/Display_UI_Help.png b/docs/images/Display_UI_Help.png similarity index 100% rename from docs/Building_Diagrams/images/Display_UI_Help.png rename to docs/images/Display_UI_Help.png diff --git a/docs/Building_Diagrams/images/Elements-08-06.png b/docs/images/Elements-08-06.png similarity index 100% rename from docs/Building_Diagrams/images/Elements-08-06.png rename to docs/images/Elements-08-06.png diff --git a/docs/Building_Diagrams/images/End.png b/docs/images/End.png similarity index 100% rename from docs/Building_Diagrams/images/End.png rename to docs/images/End.png diff --git a/docs/Building_Diagrams/images/End1.png b/docs/images/End1.png similarity index 100% rename from docs/Building_Diagrams/images/End1.png rename to docs/images/End1.png diff --git a/docs/Building_Diagrams/images/End_Task_Properties.png b/docs/images/End_Task_Properties.png similarity index 100% rename from docs/Building_Diagrams/images/End_Task_Properties.png rename to docs/images/End_Task_Properties.png diff --git a/docs/Building_Diagrams/images/Env_variable_Screenshot.png b/docs/images/Env_variable_Screenshot.png similarity index 100% rename from docs/Building_Diagrams/images/Env_variable_Screenshot.png rename to docs/images/Env_variable_Screenshot.png diff --git a/docs/Building_Diagrams/images/ErrorEndEventExample (1).png b/docs/images/ErrorEndEventExample (1).png similarity index 100% rename from docs/Building_Diagrams/images/ErrorEndEventExample (1).png rename to docs/images/ErrorEndEventExample (1).png diff --git a/docs/Building_Diagrams/images/ErrorEndEventExample.png b/docs/images/ErrorEndEventExample.png similarity index 100% rename from docs/Building_Diagrams/images/ErrorEndEventExample.png rename to docs/images/ErrorEndEventExample.png diff --git a/docs/Building_Diagrams/images/Escalation_ID.png b/docs/images/Escalation_ID.png similarity index 100% rename from docs/Building_Diagrams/images/Escalation_ID.png rename to docs/images/Escalation_ID.png diff --git a/docs/Building_Diagrams/images/Escalation_Order.png b/docs/images/Escalation_Order.png similarity index 100% rename from docs/Building_Diagrams/images/Escalation_Order.png rename to docs/images/Escalation_Order.png diff --git a/docs/Building_Diagrams/images/Escalation_Order_2.png b/docs/images/Escalation_Order_2.png similarity index 100% rename from docs/Building_Diagrams/images/Escalation_Order_2.png rename to docs/images/Escalation_Order_2.png diff --git a/docs/Building_Diagrams/images/Event_Gateway.png b/docs/images/Event_Gateway.png similarity index 100% rename from docs/Building_Diagrams/images/Event_Gateway.png rename to docs/images/Event_Gateway.png diff --git a/docs/Building_Diagrams/images/Eventbased.png b/docs/images/Eventbased.png similarity index 100% rename from docs/Building_Diagrams/images/Eventbased.png rename to docs/images/Eventbased.png diff --git a/docs/Getting_Started/images/Events.png b/docs/images/Events.png similarity index 100% rename from docs/Getting_Started/images/Events.png rename to docs/images/Events.png diff --git a/docs/Getting_Started/images/Events_Example.png b/docs/images/Events_Example.png similarity index 100% rename from docs/Getting_Started/images/Events_Example.png rename to docs/images/Events_Example.png diff --git a/docs/Building_Diagrams/images/Exclusive.png b/docs/images/Exclusive.png similarity index 100% rename from docs/Building_Diagrams/images/Exclusive.png rename to docs/images/Exclusive.png diff --git a/docs/Building_Diagrams/images/Exclusive_Em.png b/docs/images/Exclusive_Em.png similarity index 100% rename from docs/Building_Diagrams/images/Exclusive_Em.png rename to docs/images/Exclusive_Em.png diff --git a/docs/dev/images/Extension1.png b/docs/images/Extension1.png similarity index 100% rename from docs/dev/images/Extension1.png rename to docs/images/Extension1.png diff --git a/docs/dev/images/Extension_UI_schema.png b/docs/images/Extension_UI_schema.png similarity index 100% rename from docs/dev/images/Extension_UI_schema.png rename to docs/images/Extension_UI_schema.png diff --git a/docs/dev/images/Extensions_dashboard.png b/docs/images/Extensions_dashboard.png similarity index 100% rename from docs/dev/images/Extensions_dashboard.png rename to docs/images/Extensions_dashboard.png diff --git a/docs/Getting_Started/images/Filter_icon.png b/docs/images/Filter_icon.png similarity index 100% rename from docs/Getting_Started/images/Filter_icon.png rename to docs/images/Filter_icon.png diff --git a/docs/Support/images/Flask.png b/docs/images/Flask.png similarity index 100% rename from docs/Support/images/Flask.png rename to docs/images/Flask.png diff --git a/docs/Building_Diagrams/images/Form-Builder.png b/docs/images/Form-Builder.png similarity index 100% rename from docs/Building_Diagrams/images/Form-Builder.png rename to docs/images/Form-Builder.png diff --git a/docs/Building_Diagrams/images/Form_display.png b/docs/images/Form_display.png similarity index 100% rename from docs/Building_Diagrams/images/Form_display.png rename to docs/images/Form_display.png diff --git a/docs/Building_Diagrams/images/Form_editor.png b/docs/images/Form_editor.png similarity index 100% rename from docs/Building_Diagrams/images/Form_editor.png rename to docs/images/Form_editor.png diff --git a/docs/Building_Diagrams/images/Form_editor1.png b/docs/images/Form_editor1.png similarity index 100% rename from docs/Building_Diagrams/images/Form_editor1.png rename to docs/images/Form_editor1.png diff --git a/docs/Building_Diagrams/images/Form_editor2.png b/docs/images/Form_editor2.png similarity index 100% rename from docs/Building_Diagrams/images/Form_editor2.png rename to docs/images/Form_editor2.png diff --git a/docs/Building_Diagrams/images/Form_editor3.png b/docs/images/Form_editor3.png similarity index 100% rename from docs/Building_Diagrams/images/Form_editor3.png rename to docs/images/Form_editor3.png diff --git a/docs/Building_Diagrams/images/Form_editor4.png b/docs/images/Form_editor4.png similarity index 100% rename from docs/Building_Diagrams/images/Form_editor4.png rename to docs/images/Form_editor4.png diff --git a/docs/Building_Diagrams/images/Form_json.png b/docs/images/Form_json.png similarity index 100% rename from docs/Building_Diagrams/images/Form_json.png rename to docs/images/Form_json.png diff --git a/docs/Building_Diagrams/images/Form_manual_editor.png b/docs/images/Form_manual_editor.png similarity index 100% rename from docs/Building_Diagrams/images/Form_manual_editor.png rename to docs/images/Form_manual_editor.png diff --git a/docs/Getting_Started/images/Grey Image.png b/docs/images/Grey Image.png similarity index 100% rename from docs/Getting_Started/images/Grey Image.png rename to docs/images/Grey Image.png diff --git a/docs/Getting_Started/images/Grey_color.png b/docs/images/Grey_color.png similarity index 100% rename from docs/Getting_Started/images/Grey_color.png rename to docs/images/Grey_color.png diff --git a/docs/Building_Diagrams/images/Group.png b/docs/images/Group.png similarity index 100% rename from docs/Building_Diagrams/images/Group.png rename to docs/images/Group.png diff --git a/docs/Getting_Started/images/Guest.png b/docs/images/Guest.png similarity index 100% rename from docs/Getting_Started/images/Guest.png rename to docs/images/Guest.png diff --git a/docs/Getting_Started/images/Guest_1.png b/docs/images/Guest_1.png similarity index 100% rename from docs/Getting_Started/images/Guest_1.png rename to docs/images/Guest_1.png diff --git a/docs/Getting_Started/images/Guest_2.png b/docs/images/Guest_2.png similarity index 100% rename from docs/Getting_Started/images/Guest_2.png rename to docs/images/Guest_2.png diff --git a/docs/Getting_Started/images/Guest_3.png b/docs/images/Guest_3.png similarity index 100% rename from docs/Getting_Started/images/Guest_3.png rename to docs/images/Guest_3.png diff --git a/docs/Getting_Started/images/Guest_@.png b/docs/images/Guest_@.png similarity index 100% rename from docs/Getting_Started/images/Guest_@.png rename to docs/images/Guest_@.png diff --git a/docs/Building_Diagrams/images/Inclusive.png b/docs/images/Inclusive.png similarity index 100% rename from docs/Building_Diagrams/images/Inclusive.png rename to docs/images/Inclusive.png diff --git a/docs/Building_Diagrams/images/Instructions_panel.png b/docs/images/Instructions_panel.png similarity index 100% rename from docs/Building_Diagrams/images/Instructions_panel.png rename to docs/images/Instructions_panel.png diff --git a/docs/Building_Diagrams/images/Intermdiate.png b/docs/images/Intermdiate.png similarity index 100% rename from docs/Building_Diagrams/images/Intermdiate.png rename to docs/images/Intermdiate.png diff --git a/docs/Building_Diagrams/images/Intermediate.png b/docs/images/Intermediate.png similarity index 100% rename from docs/Building_Diagrams/images/Intermediate.png rename to docs/images/Intermediate.png diff --git a/docs/Building_Diagrams/images/Introduction_manual.png b/docs/images/Introduction_manual.png similarity index 100% rename from docs/Building_Diagrams/images/Introduction_manual.png rename to docs/images/Introduction_manual.png diff --git a/docs/Building_Diagrams/images/JSONSchema.png b/docs/images/JSONSchema.png similarity index 100% rename from docs/Building_Diagrams/images/JSONSchema.png rename to docs/images/JSONSchema.png diff --git a/docs/Building_Diagrams/images/JSON_Data_Store_1.png b/docs/images/JSON_Data_Store_1.png similarity index 100% rename from docs/Building_Diagrams/images/JSON_Data_Store_1.png rename to docs/images/JSON_Data_Store_1.png diff --git a/docs/Building_Diagrams/images/JSON_data_store.png b/docs/images/JSON_data_store.png similarity index 100% rename from docs/Building_Diagrams/images/JSON_data_store.png rename to docs/images/JSON_data_store.png diff --git a/docs/Getting_Started/images/Login.png b/docs/images/Login.png similarity index 100% rename from docs/Getting_Started/images/Login.png rename to docs/images/Login.png diff --git a/docs/Building_Diagrams/images/Loop_Settings.png b/docs/images/Loop_Settings.png similarity index 100% rename from docs/Building_Diagrams/images/Loop_Settings.png rename to docs/images/Loop_Settings.png diff --git a/docs/Building_Diagrams/images/Manual.png b/docs/images/Manual.png similarity index 100% rename from docs/Building_Diagrams/images/Manual.png rename to docs/images/Manual.png diff --git a/docs/Building_Diagrams/images/Manual_EM.png b/docs/images/Manual_EM.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_EM.png rename to docs/images/Manual_EM.png diff --git a/docs/Building_Diagrams/images/Manual_instructions.png b/docs/images/Manual_instructions.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_instructions.png rename to docs/images/Manual_instructions.png diff --git a/docs/Building_Diagrams/images/Manual_instructions_panel.png b/docs/images/Manual_instructions_panel.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_instructions_panel.png rename to docs/images/Manual_instructions_panel.png diff --git a/docs/Building_Diagrams/images/Manual_instructions_side_by_side.png b/docs/images/Manual_instructions_side_by_side.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_instructions_side_by_side.png rename to docs/images/Manual_instructions_side_by_side.png diff --git a/docs/Building_Diagrams/images/Manual_last.png b/docs/images/Manual_last.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_last.png rename to docs/images/Manual_last.png diff --git a/docs/Building_Diagrams/images/Manual_lasttt.png b/docs/images/Manual_lasttt.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_lasttt.png rename to docs/images/Manual_lasttt.png diff --git a/docs/Building_Diagrams/images/Manual_task.png b/docs/images/Manual_task.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task.png rename to docs/images/Manual_task.png diff --git a/docs/Building_Diagrams/images/Manual_task1.png b/docs/images/Manual_task1.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task1.png rename to docs/images/Manual_task1.png diff --git a/docs/Building_Diagrams/images/Manual_task_Properties.png b/docs/images/Manual_task_Properties.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task_Properties.png rename to docs/images/Manual_task_Properties.png diff --git a/docs/Building_Diagrams/images/Manual_task_Properties1.png b/docs/images/Manual_task_Properties1.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task_Properties1.png rename to docs/images/Manual_task_Properties1.png diff --git a/docs/Building_Diagrams/images/Manual_task_Properties12.png b/docs/images/Manual_task_Properties12.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task_Properties12.png rename to docs/images/Manual_task_Properties12.png diff --git a/docs/Building_Diagrams/images/Manual_task_instructions_panel.png b/docs/images/Manual_task_instructions_panel.png similarity index 100% rename from docs/Building_Diagrams/images/Manual_task_instructions_panel.png rename to docs/images/Manual_task_instructions_panel.png diff --git a/docs/Getting_Started/images/Milestone_Screenshot.png b/docs/images/Milestone_Screenshot.png similarity index 100% rename from docs/Getting_Started/images/Milestone_Screenshot.png rename to docs/images/Milestone_Screenshot.png diff --git a/docs/Support/images/Mimicking_inclusive_gateway.png b/docs/images/Mimicking_inclusive_gateway.png similarity index 100% rename from docs/Support/images/Mimicking_inclusive_gateway.png rename to docs/images/Mimicking_inclusive_gateway.png diff --git a/docs/Building_Diagrams/images/Navigating_Process.png b/docs/images/Navigating_Process.png similarity index 100% rename from docs/Building_Diagrams/images/Navigating_Process.png rename to docs/images/Navigating_Process.png diff --git a/docs/Building_Diagrams/images/Nested_form_display.png b/docs/images/Nested_form_display.png similarity index 100% rename from docs/Building_Diagrams/images/Nested_form_display.png rename to docs/images/Nested_form_display.png diff --git a/docs/Building_Diagrams/images/Output_extensions.png b/docs/images/Output_extensions.png similarity index 100% rename from docs/Building_Diagrams/images/Output_extensions.png rename to docs/images/Output_extensions.png diff --git a/docs/Building_Diagrams/images/Parallet_gateway.png b/docs/images/Parallet_gateway.png similarity index 100% rename from docs/Building_Diagrams/images/Parallet_gateway.png rename to docs/images/Parallet_gateway.png diff --git a/docs/Building_Diagrams/images/Pre-post_scripts.png b/docs/images/Pre-post_scripts.png similarity index 100% rename from docs/Building_Diagrams/images/Pre-post_scripts.png rename to docs/images/Pre-post_scripts.png diff --git a/docs/Building_Diagrams/images/Propertise_panel.png b/docs/images/Propertise_panel.png similarity index 100% rename from docs/Building_Diagrams/images/Propertise_panel.png rename to docs/images/Propertise_panel.png diff --git a/docs/Getting_Started/images/Purple.png b/docs/images/Purple.png similarity index 100% rename from docs/Getting_Started/images/Purple.png rename to docs/images/Purple.png diff --git a/docs/Building_Diagrams/images/Receive.png b/docs/images/Receive.png similarity index 100% rename from docs/Building_Diagrams/images/Receive.png rename to docs/images/Receive.png diff --git a/docs/Building_Diagrams/images/Receive_task.png b/docs/images/Receive_task.png similarity index 100% rename from docs/Building_Diagrams/images/Receive_task.png rename to docs/images/Receive_task.png diff --git a/docs/Getting_Started/images/Red.png b/docs/images/Red.png similarity index 100% rename from docs/Getting_Started/images/Red.png rename to docs/images/Red.png diff --git a/docs/Building_Diagrams/images/Scores_EM.png b/docs/images/Scores_EM.png similarity index 100% rename from docs/Building_Diagrams/images/Scores_EM.png rename to docs/images/Scores_EM.png diff --git a/docs/Building_Diagrams/images/Script-tasks.png b/docs/images/Script-tasks.png similarity index 100% rename from docs/Building_Diagrams/images/Script-tasks.png rename to docs/images/Script-tasks.png diff --git a/docs/Building_Diagrams/images/Script.png b/docs/images/Script.png similarity index 100% rename from docs/Building_Diagrams/images/Script.png rename to docs/images/Script.png diff --git a/docs/Building_Diagrams/images/Script_Em.png b/docs/images/Script_Em.png similarity index 100% rename from docs/Building_Diagrams/images/Script_Em.png rename to docs/images/Script_Em.png diff --git a/docs/Building_Diagrams/images/Script_instructions.png b/docs/images/Script_instructions.png similarity index 100% rename from docs/Building_Diagrams/images/Script_instructions.png rename to docs/images/Script_instructions.png diff --git a/docs/Building_Diagrams/images/Script_task_example.png b/docs/images/Script_task_example.png similarity index 100% rename from docs/Building_Diagrams/images/Script_task_example.png rename to docs/images/Script_task_example.png diff --git a/docs/Building_Diagrams/images/Script_task_update.png b/docs/images/Script_task_update.png similarity index 100% rename from docs/Building_Diagrams/images/Script_task_update.png rename to docs/images/Script_task_update.png diff --git a/docs/DevOps_installation_integration/images/Secrets_configure_2.png b/docs/images/Secrets_configure_2.png similarity index 100% rename from docs/DevOps_installation_integration/images/Secrets_configure_2.png rename to docs/images/Secrets_configure_2.png diff --git a/docs/DevOps_installation_integration/images/Secrets_step_1.png b/docs/images/Secrets_step_1.png similarity index 100% rename from docs/DevOps_installation_integration/images/Secrets_step_1.png rename to docs/images/Secrets_step_1.png diff --git a/docs/DevOps_installation_integration/images/Secrets_step_2.png b/docs/images/Secrets_step_2.png similarity index 100% rename from docs/DevOps_installation_integration/images/Secrets_step_2.png rename to docs/images/Secrets_step_2.png diff --git a/docs/Building_Diagrams/images/Send.png b/docs/images/Send.png similarity index 100% rename from docs/Building_Diagrams/images/Send.png rename to docs/images/Send.png diff --git a/docs/Building_Diagrams/images/Send_task.png b/docs/images/Send_task.png similarity index 100% rename from docs/Building_Diagrams/images/Send_task.png rename to docs/images/Send_task.png diff --git a/docs/Building_Diagrams/images/Service-tasks.png b/docs/images/Service-tasks.png similarity index 100% rename from docs/Building_Diagrams/images/Service-tasks.png rename to docs/images/Service-tasks.png diff --git a/docs/Building_Diagrams/images/Service_task.png b/docs/images/Service_task.png similarity index 100% rename from docs/Building_Diagrams/images/Service_task.png rename to docs/images/Service_task.png diff --git a/docs/Building_Diagrams/images/Sevice.png b/docs/images/Sevice.png similarity index 100% rename from docs/Building_Diagrams/images/Sevice.png rename to docs/images/Sevice.png diff --git a/docs/Getting_Started/images/Short_link.png b/docs/images/Short_link.png similarity index 100% rename from docs/Getting_Started/images/Short_link.png rename to docs/images/Short_link.png diff --git a/docs/Building_Diagrams/images/Signal_EM.png b/docs/images/Signal_EM.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_EM.png rename to docs/images/Signal_EM.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example.png b/docs/images/Signal_events_spiff_example.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example.png rename to docs/images/Signal_events_spiff_example.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example1.png b/docs/images/Signal_events_spiff_example1.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example1.png rename to docs/images/Signal_events_spiff_example1.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example2.png b/docs/images/Signal_events_spiff_example2.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example2.png rename to docs/images/Signal_events_spiff_example2.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example3.png b/docs/images/Signal_events_spiff_example3.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example3.png rename to docs/images/Signal_events_spiff_example3.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example4.png b/docs/images/Signal_events_spiff_example4.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example4.png rename to docs/images/Signal_events_spiff_example4.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example5.png b/docs/images/Signal_events_spiff_example5.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example5.png rename to docs/images/Signal_events_spiff_example5.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example6.png b/docs/images/Signal_events_spiff_example6.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example6.png rename to docs/images/Signal_events_spiff_example6.png diff --git a/docs/Building_Diagrams/images/Signal_events_spiff_example7.png b/docs/images/Signal_events_spiff_example7.png similarity index 100% rename from docs/Building_Diagrams/images/Signal_events_spiff_example7.png rename to docs/images/Signal_events_spiff_example7.png diff --git a/docs/Building_Diagrams/images/Start.png b/docs/images/Start.png similarity index 100% rename from docs/Building_Diagrams/images/Start.png rename to docs/images/Start.png diff --git a/docs/Building_Diagrams/images/Start_Event.png b/docs/images/Start_Event.png similarity index 100% rename from docs/Building_Diagrams/images/Start_Event.png rename to docs/images/Start_Event.png diff --git a/docs/Building_Diagrams/images/Start_Event_Properties.png b/docs/images/Start_Event_Properties.png similarity index 100% rename from docs/Building_Diagrams/images/Start_Event_Properties.png rename to docs/images/Start_Event_Properties.png diff --git a/docs/Building_Diagrams/images/Start_Event_Properties1.png b/docs/images/Start_Event_Properties1.png similarity index 100% rename from docs/Building_Diagrams/images/Start_Event_Properties1.png rename to docs/images/Start_Event_Properties1.png diff --git a/docs/Building_Diagrams/images/Start_event_error_example.png b/docs/images/Start_event_error_example.png similarity index 100% rename from docs/Building_Diagrams/images/Start_event_error_example.png rename to docs/images/Start_event_error_example.png diff --git a/docs/Building_Diagrams/images/SubProcess.png b/docs/images/SubProcess.png similarity index 100% rename from docs/Building_Diagrams/images/SubProcess.png rename to docs/images/SubProcess.png diff --git a/docs/Building_Diagrams/images/Submit_text.png b/docs/images/Submit_text.png similarity index 100% rename from docs/Building_Diagrams/images/Submit_text.png rename to docs/images/Submit_text.png diff --git a/docs/Getting_Started/images/Task_instance.png b/docs/images/Task_instance.png similarity index 100% rename from docs/Getting_Started/images/Task_instance.png rename to docs/images/Task_instance.png diff --git a/docs/Building_Diagrams/images/Typeahead.png b/docs/images/Typeahead.png similarity index 100% rename from docs/Building_Diagrams/images/Typeahead.png rename to docs/images/Typeahead.png diff --git a/docs/Building_Diagrams/images/UI-Schema.png b/docs/images/UI-Schema.png similarity index 100% rename from docs/Building_Diagrams/images/UI-Schema.png rename to docs/images/UI-Schema.png diff --git a/docs/Building_Diagrams/images/Untitled design.png b/docs/images/Untitled design.png similarity index 100% rename from docs/Building_Diagrams/images/Untitled design.png rename to docs/images/Untitled design.png diff --git a/docs/Getting_Started/images/Untitled.png b/docs/images/Untitled.png similarity index 100% rename from docs/Getting_Started/images/Untitled.png rename to docs/images/Untitled.png diff --git a/docs/Getting_Started/images/Untitled_1.png b/docs/images/Untitled_1.png similarity index 100% rename from docs/Getting_Started/images/Untitled_1.png rename to docs/images/Untitled_1.png diff --git a/docs/Getting_Started/images/Untitled_10.png b/docs/images/Untitled_10.png similarity index 100% rename from docs/Getting_Started/images/Untitled_10.png rename to docs/images/Untitled_10.png diff --git a/docs/Getting_Started/images/Untitled_11.png b/docs/images/Untitled_11.png similarity index 100% rename from docs/Getting_Started/images/Untitled_11.png rename to docs/images/Untitled_11.png diff --git a/docs/Getting_Started/images/Untitled_12.png b/docs/images/Untitled_12.png similarity index 100% rename from docs/Getting_Started/images/Untitled_12.png rename to docs/images/Untitled_12.png diff --git a/docs/Getting_Started/images/Untitled_13.png b/docs/images/Untitled_13.png similarity index 100% rename from docs/Getting_Started/images/Untitled_13.png rename to docs/images/Untitled_13.png diff --git a/docs/Getting_Started/images/Untitled_14.png b/docs/images/Untitled_14.png similarity index 100% rename from docs/Getting_Started/images/Untitled_14.png rename to docs/images/Untitled_14.png diff --git a/docs/Getting_Started/images/Untitled_15.png b/docs/images/Untitled_15.png similarity index 100% rename from docs/Getting_Started/images/Untitled_15.png rename to docs/images/Untitled_15.png diff --git a/docs/Getting_Started/images/Untitled_16.png b/docs/images/Untitled_16.png similarity index 100% rename from docs/Getting_Started/images/Untitled_16.png rename to docs/images/Untitled_16.png diff --git a/docs/Getting_Started/images/Untitled_17.png b/docs/images/Untitled_17.png similarity index 100% rename from docs/Getting_Started/images/Untitled_17.png rename to docs/images/Untitled_17.png diff --git a/docs/Getting_Started/images/Untitled_18.png b/docs/images/Untitled_18.png similarity index 100% rename from docs/Getting_Started/images/Untitled_18.png rename to docs/images/Untitled_18.png diff --git a/docs/Getting_Started/images/Untitled_19.png b/docs/images/Untitled_19.png similarity index 100% rename from docs/Getting_Started/images/Untitled_19.png rename to docs/images/Untitled_19.png diff --git a/docs/Getting_Started/images/Untitled_2.png b/docs/images/Untitled_2.png similarity index 100% rename from docs/Getting_Started/images/Untitled_2.png rename to docs/images/Untitled_2.png diff --git a/docs/Getting_Started/images/Untitled_20.png b/docs/images/Untitled_20.png similarity index 100% rename from docs/Getting_Started/images/Untitled_20.png rename to docs/images/Untitled_20.png diff --git a/docs/Getting_Started/images/Untitled_21.png b/docs/images/Untitled_21.png similarity index 100% rename from docs/Getting_Started/images/Untitled_21.png rename to docs/images/Untitled_21.png diff --git a/docs/Getting_Started/images/Untitled_22.png b/docs/images/Untitled_22.png similarity index 100% rename from docs/Getting_Started/images/Untitled_22.png rename to docs/images/Untitled_22.png diff --git a/docs/Getting_Started/images/Untitled_23.png b/docs/images/Untitled_23.png similarity index 100% rename from docs/Getting_Started/images/Untitled_23.png rename to docs/images/Untitled_23.png diff --git a/docs/Getting_Started/images/Untitled_24.png b/docs/images/Untitled_24.png similarity index 100% rename from docs/Getting_Started/images/Untitled_24.png rename to docs/images/Untitled_24.png diff --git a/docs/Getting_Started/images/Untitled_25.png b/docs/images/Untitled_25.png similarity index 100% rename from docs/Getting_Started/images/Untitled_25.png rename to docs/images/Untitled_25.png diff --git a/docs/Getting_Started/images/Untitled_26.png b/docs/images/Untitled_26.png similarity index 100% rename from docs/Getting_Started/images/Untitled_26.png rename to docs/images/Untitled_26.png diff --git a/docs/Getting_Started/images/Untitled_27.png b/docs/images/Untitled_27.png similarity index 100% rename from docs/Getting_Started/images/Untitled_27.png rename to docs/images/Untitled_27.png diff --git a/docs/Getting_Started/images/Untitled_28.png b/docs/images/Untitled_28.png similarity index 100% rename from docs/Getting_Started/images/Untitled_28.png rename to docs/images/Untitled_28.png diff --git a/docs/Getting_Started/images/Untitled_29.png b/docs/images/Untitled_29.png similarity index 100% rename from docs/Getting_Started/images/Untitled_29.png rename to docs/images/Untitled_29.png diff --git a/docs/Getting_Started/images/Untitled_3.png b/docs/images/Untitled_3.png similarity index 100% rename from docs/Getting_Started/images/Untitled_3.png rename to docs/images/Untitled_3.png diff --git a/docs/Getting_Started/images/Untitled_30.png b/docs/images/Untitled_30.png similarity index 100% rename from docs/Getting_Started/images/Untitled_30.png rename to docs/images/Untitled_30.png diff --git a/docs/Getting_Started/images/Untitled_31.png b/docs/images/Untitled_31.png similarity index 100% rename from docs/Getting_Started/images/Untitled_31.png rename to docs/images/Untitled_31.png diff --git a/docs/Getting_Started/images/Untitled_32.png b/docs/images/Untitled_32.png similarity index 100% rename from docs/Getting_Started/images/Untitled_32.png rename to docs/images/Untitled_32.png diff --git a/docs/Getting_Started/images/Untitled_4.png b/docs/images/Untitled_4.png similarity index 100% rename from docs/Getting_Started/images/Untitled_4.png rename to docs/images/Untitled_4.png diff --git a/docs/Getting_Started/images/Untitled_5.png b/docs/images/Untitled_5.png similarity index 100% rename from docs/Getting_Started/images/Untitled_5.png rename to docs/images/Untitled_5.png diff --git a/docs/Getting_Started/images/Untitled_6.png b/docs/images/Untitled_6.png similarity index 100% rename from docs/Getting_Started/images/Untitled_6.png rename to docs/images/Untitled_6.png diff --git a/docs/Getting_Started/images/Untitled_7.png b/docs/images/Untitled_7.png similarity index 100% rename from docs/Getting_Started/images/Untitled_7.png rename to docs/images/Untitled_7.png diff --git a/docs/Getting_Started/images/Untitled_8.png b/docs/images/Untitled_8.png similarity index 100% rename from docs/Getting_Started/images/Untitled_8.png rename to docs/images/Untitled_8.png diff --git a/docs/Getting_Started/images/Untitled_9.png b/docs/images/Untitled_9.png similarity index 100% rename from docs/Getting_Started/images/Untitled_9.png rename to docs/images/Untitled_9.png diff --git a/docs/Building_Diagrams/images/Usecase.png b/docs/images/Usecase.png similarity index 100% rename from docs/Building_Diagrams/images/Usecase.png rename to docs/images/Usecase.png diff --git a/docs/Building_Diagrams/images/Usecase_extensions.png b/docs/images/Usecase_extensions.png similarity index 100% rename from docs/Building_Diagrams/images/Usecase_extensions.png rename to docs/images/Usecase_extensions.png diff --git a/docs/Building_Diagrams/images/User.png b/docs/images/User.png similarity index 100% rename from docs/Building_Diagrams/images/User.png rename to docs/images/User.png diff --git a/docs/Building_Diagrams/images/User_EM.png b/docs/images/User_EM.png similarity index 100% rename from docs/Building_Diagrams/images/User_EM.png rename to docs/images/User_EM.png diff --git a/docs/Building_Diagrams/images/User_instructions.png b/docs/images/User_instructions.png similarity index 100% rename from docs/Building_Diagrams/images/User_instructions.png rename to docs/images/User_instructions.png diff --git a/docs/Building_Diagrams/images/User_task.png b/docs/images/User_task.png similarity index 100% rename from docs/Building_Diagrams/images/User_task.png rename to docs/images/User_task.png diff --git a/docs/Building_Diagrams/images/Users_task.png b/docs/images/Users_task.png similarity index 100% rename from docs/Building_Diagrams/images/Users_task.png rename to docs/images/Users_task.png diff --git a/docs/Building_Diagrams/images/Using_forms.png b/docs/images/Using_forms.png similarity index 100% rename from docs/Building_Diagrams/images/Using_forms.png rename to docs/images/Using_forms.png diff --git a/docs/Getting_Started/images/View_Forms1.png b/docs/images/View_Forms1.png similarity index 100% rename from docs/Getting_Started/images/View_Forms1.png rename to docs/images/View_Forms1.png diff --git a/docs/Getting_Started/images/View_Forms2.png b/docs/images/View_Forms2.png similarity index 100% rename from docs/Getting_Started/images/View_Forms2.png rename to docs/images/View_Forms2.png diff --git a/docs/Getting_Started/images/View_Forms3.png b/docs/images/View_Forms3.png similarity index 100% rename from docs/Getting_Started/images/View_Forms3.png rename to docs/images/View_Forms3.png diff --git a/docs/Getting_Started/images/View_Forms4.png b/docs/images/View_Forms4.png similarity index 100% rename from docs/Getting_Started/images/View_Forms4.png rename to docs/images/View_Forms4.png diff --git a/docs/Getting_Started/images/View_Forms5.png b/docs/images/View_Forms5.png similarity index 100% rename from docs/Getting_Started/images/View_Forms5.png rename to docs/images/View_Forms5.png diff --git a/docs/Getting_Started/images/Yellow.png b/docs/images/Yellow.png similarity index 100% rename from docs/Getting_Started/images/Yellow.png rename to docs/images/Yellow.png diff --git a/docs/Support/images/active_call_activity.png b/docs/images/active_call_activity.png similarity index 100% rename from docs/Support/images/active_call_activity.png rename to docs/images/active_call_activity.png diff --git a/docs/Building_Diagrams/images/active_call_process.png b/docs/images/active_call_process.png similarity index 100% rename from docs/Building_Diagrams/images/active_call_process.png rename to docs/images/active_call_process.png diff --git a/docs/Support/images/active_process_instance.png b/docs/images/active_process_instance.png similarity index 100% rename from docs/Support/images/active_process_instance.png rename to docs/images/active_process_instance.png diff --git a/docs/Support/images/active_sub_task.png b/docs/images/active_sub_task.png similarity index 100% rename from docs/Support/images/active_sub_task.png rename to docs/images/active_sub_task.png diff --git a/docs/Building_Diagrams/images/active_subprocess.png b/docs/images/active_subprocess.png similarity index 100% rename from docs/Building_Diagrams/images/active_subprocess.png rename to docs/images/active_subprocess.png diff --git a/docs/Support/images/active_subtask.png b/docs/images/active_subtask.png similarity index 100% rename from docs/Support/images/active_subtask.png rename to docs/images/active_subtask.png diff --git a/docs/DevOps_installation_integration/images/add_a_process_group.png b/docs/images/add_a_process_group.png similarity index 100% rename from docs/DevOps_installation_integration/images/add_a_process_group.png rename to docs/images/add_a_process_group.png diff --git a/docs/DevOps_installation_integration/images/add_file.png b/docs/images/add_file.png similarity index 100% rename from docs/DevOps_installation_integration/images/add_file.png rename to docs/images/add_file.png diff --git a/docs/DevOps_installation_integration/images/add_process_model.png b/docs/images/add_process_model.png similarity index 100% rename from docs/DevOps_installation_integration/images/add_process_model.png rename to docs/images/add_process_model.png diff --git a/docs/DevOps_installation_integration/images/admin_workflows.png b/docs/images/admin_workflows.png similarity index 100% rename from docs/DevOps_installation_integration/images/admin_workflows.png rename to docs/images/admin_workflows.png diff --git a/docs/appendices/images/articles.png b/docs/images/articles.png similarity index 100% rename from docs/appendices/images/articles.png rename to docs/images/articles.png diff --git a/docs/Support/images/assigned_to_me.png b/docs/images/assigned_to_me.png similarity index 100% rename from docs/Support/images/assigned_to_me.png rename to docs/images/assigned_to_me.png diff --git a/docs/Building_Diagrams/images/assumptions.png b/docs/images/assumptions.png similarity index 100% rename from docs/Building_Diagrams/images/assumptions.png rename to docs/images/assumptions.png diff --git a/docs/Building_Diagrams/images/boundary_event.png b/docs/images/boundary_event.png similarity index 100% rename from docs/Building_Diagrams/images/boundary_event.png rename to docs/images/boundary_event.png diff --git a/docs/Building_Diagrams/images/boundary_example.png b/docs/images/boundary_example.png similarity index 100% rename from docs/Building_Diagrams/images/boundary_example.png rename to docs/images/boundary_example.png diff --git a/docs/Support/images/call_activity_popup.png b/docs/images/call_activity_popup.png similarity index 100% rename from docs/Support/images/call_activity_popup.png rename to docs/images/call_activity_popup.png diff --git a/docs/Support/images/cant_find_process_instance.png b/docs/images/cant_find_process_instance.png similarity index 100% rename from docs/Support/images/cant_find_process_instance.png rename to docs/images/cant_find_process_instance.png diff --git a/docs/Building_Diagrams/images/catch_events.png b/docs/images/catch_events.png similarity index 100% rename from docs/Building_Diagrams/images/catch_events.png rename to docs/images/catch_events.png diff --git a/docs/Building_Diagrams/images/catch_example.png b/docs/images/catch_example.png similarity index 100% rename from docs/Building_Diagrams/images/catch_example.png rename to docs/images/catch_example.png diff --git a/docs/Building_Diagrams/images/category.png b/docs/images/category.png similarity index 100% rename from docs/Building_Diagrams/images/category.png rename to docs/images/category.png diff --git a/docs/Getting_Started/images/chef.png b/docs/images/chef.png similarity index 100% rename from docs/Getting_Started/images/chef.png rename to docs/images/chef.png diff --git a/docs/Building_Diagrams/images/collaboration_correlation.png b/docs/images/collaboration_correlation.png similarity index 100% rename from docs/Building_Diagrams/images/collaboration_correlation.png rename to docs/images/collaboration_correlation.png diff --git a/docs/Building_Diagrams/images/collaboration_messages_1.png b/docs/images/collaboration_messages_1.png similarity index 100% rename from docs/Building_Diagrams/images/collaboration_messages_1.png rename to docs/images/collaboration_messages_1.png diff --git a/docs/Building_Diagrams/images/collaboration_msg.png b/docs/images/collaboration_msg.png similarity index 100% rename from docs/Building_Diagrams/images/collaboration_msg.png rename to docs/images/collaboration_msg.png diff --git a/docs/Support/images/completed.png b/docs/images/completed.png similarity index 100% rename from docs/Support/images/completed.png rename to docs/images/completed.png diff --git a/docs/Building_Diagrams/images/conditional_intermediate_example_1.png b/docs/images/conditional_intermediate_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_intermediate_example_1.png rename to docs/images/conditional_intermediate_example_1.png diff --git a/docs/Building_Diagrams/images/conditional_intermediate_example_2.png b/docs/images/conditional_intermediate_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_intermediate_example_2.png rename to docs/images/conditional_intermediate_example_2.png diff --git a/docs/Building_Diagrams/images/conditional_intermediate_example_3.png b/docs/images/conditional_intermediate_example_3.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_intermediate_example_3.png rename to docs/images/conditional_intermediate_example_3.png diff --git a/docs/Building_Diagrams/images/conditional_start_event.png b/docs/images/conditional_start_event.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_start_event.png rename to docs/images/conditional_start_event.png diff --git a/docs/Building_Diagrams/images/conditional_start_example.png b/docs/images/conditional_start_example.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_start_example.png rename to docs/images/conditional_start_example.png diff --git a/docs/Building_Diagrams/images/conditional_start_example_1.png b/docs/images/conditional_start_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/conditional_start_example_1.png rename to docs/images/conditional_start_example_1.png diff --git a/docs/Building_Diagrams/images/conditions.png b/docs/images/conditions.png similarity index 100% rename from docs/Building_Diagrams/images/conditions.png rename to docs/images/conditions.png diff --git a/docs/Building_Diagrams/images/configure_conditional_event.png b/docs/images/configure_conditional_event.png similarity index 100% rename from docs/Building_Diagrams/images/configure_conditional_event.png rename to docs/images/configure_conditional_event.png diff --git a/docs/Building_Diagrams/images/correlation_1.png b/docs/images/correlation_1.png similarity index 100% rename from docs/Building_Diagrams/images/correlation_1.png rename to docs/images/correlation_1.png diff --git a/docs/Building_Diagrams/images/correlation_keys_1.png b/docs/images/correlation_keys_1.png similarity index 100% rename from docs/Building_Diagrams/images/correlation_keys_1.png rename to docs/images/correlation_keys_1.png diff --git a/docs/Building_Diagrams/images/correlation_properties_1.png b/docs/images/correlation_properties_1.png similarity index 100% rename from docs/Building_Diagrams/images/correlation_properties_1.png rename to docs/images/correlation_properties_1.png diff --git a/docs/Building_Diagrams/images/data_input.png b/docs/images/data_input.png similarity index 100% rename from docs/Building_Diagrams/images/data_input.png rename to docs/images/data_input.png diff --git a/docs/Building_Diagrams/images/data_input_form.png b/docs/images/data_input_form.png similarity index 100% rename from docs/Building_Diagrams/images/data_input_form.png rename to docs/images/data_input_form.png diff --git a/docs/Building_Diagrams/images/data_object_pools_1.png b/docs/images/data_object_pools_1.png similarity index 100% rename from docs/Building_Diagrams/images/data_object_pools_1.png rename to docs/images/data_object_pools_1.png diff --git a/docs/Building_Diagrams/images/data_object_prop.png b/docs/images/data_object_prop.png similarity index 100% rename from docs/Building_Diagrams/images/data_object_prop.png rename to docs/images/data_object_prop.png diff --git a/docs/Building_Diagrams/images/data_object_reference.png b/docs/images/data_object_reference.png similarity index 100% rename from docs/Building_Diagrams/images/data_object_reference.png rename to docs/images/data_object_reference.png diff --git a/docs/Building_Diagrams/images/data_output.png b/docs/images/data_output.png similarity index 100% rename from docs/Building_Diagrams/images/data_output.png rename to docs/images/data_output.png diff --git a/docs/Building_Diagrams/images/data_store.png b/docs/images/data_store.png similarity index 100% rename from docs/Building_Diagrams/images/data_store.png rename to docs/images/data_store.png diff --git a/docs/documentation/images/docs_dir.png b/docs/images/docs_dir.png similarity index 100% rename from docs/documentation/images/docs_dir.png rename to docs/images/docs_dir.png diff --git a/docs/Building_Diagrams/images/documentation_field.png b/docs/images/documentation_field.png similarity index 100% rename from docs/Building_Diagrams/images/documentation_field.png rename to docs/images/documentation_field.png diff --git a/docs/Building_Diagrams/images/end-event-error.256x255.png b/docs/images/end-event-error.256x255.png similarity index 100% rename from docs/Building_Diagrams/images/end-event-error.256x255.png rename to docs/images/end-event-error.256x255.png diff --git a/docs/Building_Diagrams/images/end_escalation_event.png b/docs/images/end_escalation_event.png similarity index 100% rename from docs/Building_Diagrams/images/end_escalation_event.png rename to docs/images/end_escalation_event.png diff --git a/docs/Building_Diagrams/images/end_event.png b/docs/images/end_event.png similarity index 100% rename from docs/Building_Diagrams/images/end_event.png rename to docs/images/end_event.png diff --git a/docs/Building_Diagrams/images/end_message.png b/docs/images/end_message.png similarity index 100% rename from docs/Building_Diagrams/images/end_message.png rename to docs/images/end_message.png diff --git a/docs/Building_Diagrams/images/end_msg_event.png b/docs/images/end_msg_event.png similarity index 100% rename from docs/Building_Diagrams/images/end_msg_event.png rename to docs/images/end_msg_event.png diff --git a/docs/Building_Diagrams/images/end_signal_event.png b/docs/images/end_signal_event.png similarity index 100% rename from docs/Building_Diagrams/images/end_signal_event.png rename to docs/images/end_signal_event.png diff --git a/docs/Building_Diagrams/images/end_signal_event_example.png b/docs/images/end_signal_event_example.png similarity index 100% rename from docs/Building_Diagrams/images/end_signal_event_example.png rename to docs/images/end_signal_event_example.png diff --git a/docs/Building_Diagrams/images/error-events1.png b/docs/images/error-events1.png similarity index 100% rename from docs/Building_Diagrams/images/error-events1.png rename to docs/images/error-events1.png diff --git a/docs/Building_Diagrams/images/error_boundary_event.png b/docs/images/error_boundary_event.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event.png rename to docs/images/error_boundary_event.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess1.png b/docs/images/error_boundary_event_with_expanded-subprocess1.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess1.png rename to docs/images/error_boundary_event_with_expanded-subprocess1.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess2.png b/docs/images/error_boundary_event_with_expanded-subprocess2.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess2.png rename to docs/images/error_boundary_event_with_expanded-subprocess2.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess3.png b/docs/images/error_boundary_event_with_expanded-subprocess3.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess3.png rename to docs/images/error_boundary_event_with_expanded-subprocess3.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess4.png b/docs/images/error_boundary_event_with_expanded-subprocess4.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess4.png rename to docs/images/error_boundary_event_with_expanded-subprocess4.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess5.png b/docs/images/error_boundary_event_with_expanded-subprocess5.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess5.png rename to docs/images/error_boundary_event_with_expanded-subprocess5.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess6.png b/docs/images/error_boundary_event_with_expanded-subprocess6.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess6.png rename to docs/images/error_boundary_event_with_expanded-subprocess6.png diff --git a/docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess7.png b/docs/images/error_boundary_event_with_expanded-subprocess7.png similarity index 100% rename from docs/Building_Diagrams/images/error_boundary_event_with_expanded-subprocess7.png rename to docs/images/error_boundary_event_with_expanded-subprocess7.png diff --git a/docs/Building_Diagrams/images/error_end_event.png b/docs/images/error_end_event.png similarity index 100% rename from docs/Building_Diagrams/images/error_end_event.png rename to docs/images/error_end_event.png diff --git a/docs/Building_Diagrams/images/error_event_example1.png b/docs/images/error_event_example1.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example1.png rename to docs/images/error_event_example1.png diff --git a/docs/Building_Diagrams/images/error_event_example2.png b/docs/images/error_event_example2.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example2.png rename to docs/images/error_event_example2.png diff --git a/docs/Building_Diagrams/images/error_event_example3.png b/docs/images/error_event_example3.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example3.png rename to docs/images/error_event_example3.png diff --git a/docs/Building_Diagrams/images/error_event_example4.png b/docs/images/error_event_example4.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example4.png rename to docs/images/error_event_example4.png diff --git a/docs/Building_Diagrams/images/error_event_example5.png b/docs/images/error_event_example5.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example5.png rename to docs/images/error_event_example5.png diff --git a/docs/Building_Diagrams/images/error_event_example6.png b/docs/images/error_event_example6.png similarity index 100% rename from docs/Building_Diagrams/images/error_event_example6.png rename to docs/images/error_event_example6.png diff --git a/docs/Building_Diagrams/images/error_intermediate_event.png b/docs/images/error_intermediate_event.png similarity index 100% rename from docs/Building_Diagrams/images/error_intermediate_event.png rename to docs/images/error_intermediate_event.png diff --git a/docs/Building_Diagrams/images/escalation_example_2.png b/docs/images/escalation_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/escalation_example_2.png rename to docs/images/escalation_example_2.png diff --git a/docs/Building_Diagrams/images/escalation_example_3.png b/docs/images/escalation_example_3.png similarity index 100% rename from docs/Building_Diagrams/images/escalation_example_3.png rename to docs/images/escalation_example_3.png diff --git a/docs/Building_Diagrams/images/escalation_example_4.png b/docs/images/escalation_example_4.png similarity index 100% rename from docs/Building_Diagrams/images/escalation_example_4.png rename to docs/images/escalation_example_4.png diff --git a/docs/Building_Diagrams/images/event_based_gateway.png b/docs/images/event_based_gateway.png similarity index 100% rename from docs/Building_Diagrams/images/event_based_gateway.png rename to docs/images/event_based_gateway.png diff --git a/docs/Building_Diagrams/images/event_correlation_msg.png b/docs/images/event_correlation_msg.png similarity index 100% rename from docs/Building_Diagrams/images/event_correlation_msg.png rename to docs/images/event_correlation_msg.png diff --git a/docs/Building_Diagrams/images/event_types.png b/docs/images/event_types.png similarity index 100% rename from docs/Building_Diagrams/images/event_types.png rename to docs/images/event_types.png diff --git a/docs/Building_Diagrams/images/events_categories.png b/docs/images/events_categories.png similarity index 100% rename from docs/Building_Diagrams/images/events_categories.png rename to docs/images/events_categories.png diff --git a/docs/Building_Diagrams/images/events_table.png b/docs/images/events_table.png similarity index 100% rename from docs/Building_Diagrams/images/events_table.png rename to docs/images/events_table.png diff --git a/docs/Building_Diagrams/images/exclusive_gateway.png b/docs/images/exclusive_gateway.png similarity index 100% rename from docs/Building_Diagrams/images/exclusive_gateway.png rename to docs/images/exclusive_gateway.png diff --git a/docs/Building_Diagrams/images/exclusive_gateway_default.png b/docs/images/exclusive_gateway_default.png similarity index 100% rename from docs/Building_Diagrams/images/exclusive_gateway_default.png rename to docs/images/exclusive_gateway_default.png diff --git a/docs/Building_Diagrams/images/exclusive_gateway_examples.png b/docs/images/exclusive_gateway_examples.png similarity index 100% rename from docs/Building_Diagrams/images/exclusive_gateway_examples.png rename to docs/images/exclusive_gateway_examples.png diff --git a/docs/Building_Diagrams/images/exclusive_merge.png b/docs/images/exclusive_merge.png similarity index 100% rename from docs/Building_Diagrams/images/exclusive_merge.png rename to docs/images/exclusive_merge.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample.png b/docs/images/exclusivegatewayexample.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample.png rename to docs/images/exclusivegatewayexample.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample1.png b/docs/images/exclusivegatewayexample1.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample1.png rename to docs/images/exclusivegatewayexample1.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample2.png b/docs/images/exclusivegatewayexample2.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample2.png rename to docs/images/exclusivegatewayexample2.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample3.png b/docs/images/exclusivegatewayexample3.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample3.png rename to docs/images/exclusivegatewayexample3.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample4.png b/docs/images/exclusivegatewayexample4.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample4.png rename to docs/images/exclusivegatewayexample4.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample5.png b/docs/images/exclusivegatewayexample5.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample5.png rename to docs/images/exclusivegatewayexample5.png diff --git a/docs/Building_Diagrams/images/exclusivegatewayexample6.png b/docs/images/exclusivegatewayexample6.png similarity index 100% rename from docs/Building_Diagrams/images/exclusivegatewayexample6.png rename to docs/images/exclusivegatewayexample6.png diff --git a/docs/Debugging_Diagrams/images/executable.png b/docs/images/executable.png similarity index 100% rename from docs/Debugging_Diagrams/images/executable.png rename to docs/images/executable.png diff --git a/docs/Debugging_Diagrams/images/executable1.png b/docs/images/executable1.png similarity index 100% rename from docs/Debugging_Diagrams/images/executable1.png rename to docs/images/executable1.png diff --git a/docs/Support/images/find_by_id.png b/docs/images/find_by_id.png similarity index 100% rename from docs/Support/images/find_by_id.png rename to docs/images/find_by_id.png diff --git a/docs/documentation/images/git.png b/docs/images/git.png similarity index 100% rename from docs/documentation/images/git.png rename to docs/images/git.png diff --git a/docs/DevOps_installation_integration/images/group_permission.png b/docs/images/group_permission.png similarity index 100% rename from docs/DevOps_installation_integration/images/group_permission.png rename to docs/images/group_permission.png diff --git a/docs/Building_Diagrams/images/guest_user1.png b/docs/images/guest_user1.png similarity index 100% rename from docs/Building_Diagrams/images/guest_user1.png rename to docs/images/guest_user1.png diff --git a/docs/Building_Diagrams/images/guest_user2.png b/docs/images/guest_user2.png similarity index 100% rename from docs/Building_Diagrams/images/guest_user2.png rename to docs/images/guest_user2.png diff --git a/docs/Building_Diagrams/images/guest_user3.png b/docs/images/guest_user3.png similarity index 100% rename from docs/Building_Diagrams/images/guest_user3.png rename to docs/images/guest_user3.png diff --git a/docs/Building_Diagrams/images/high_level.png b/docs/images/high_level.png similarity index 100% rename from docs/Building_Diagrams/images/high_level.png rename to docs/images/high_level.png diff --git a/docs/Building_Diagrams/images/id_field.png b/docs/images/id_field.png similarity index 100% rename from docs/Building_Diagrams/images/id_field.png rename to docs/images/id_field.png diff --git a/docs/DevOps_installation_integration/images/image.png b/docs/images/image.png similarity index 100% rename from docs/DevOps_installation_integration/images/image.png rename to docs/images/image.png diff --git a/docs/Support/images/inactive_call_activity.png b/docs/images/inactive_call_activity.png similarity index 100% rename from docs/Support/images/inactive_call_activity.png rename to docs/images/inactive_call_activity.png diff --git a/docs/Building_Diagrams/images/inactive_call_process.png b/docs/images/inactive_call_process.png similarity index 100% rename from docs/Building_Diagrams/images/inactive_call_process.png rename to docs/images/inactive_call_process.png diff --git a/docs/Support/images/inactive_subtask.png b/docs/images/inactive_subtask.png similarity index 100% rename from docs/Support/images/inactive_subtask.png rename to docs/images/inactive_subtask.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway.png b/docs/images/inclusive_gateway.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway.png rename to docs/images/inclusive_gateway.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway_conditions.png b/docs/images/inclusive_gateway_conditions.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway_conditions.png rename to docs/images/inclusive_gateway_conditions.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway_example.png b/docs/images/inclusive_gateway_example.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway_example.png rename to docs/images/inclusive_gateway_example.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway_example1.png b/docs/images/inclusive_gateway_example1.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway_example1.png rename to docs/images/inclusive_gateway_example1.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway_merge.png b/docs/images/inclusive_gateway_merge.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway_merge.png rename to docs/images/inclusive_gateway_merge.png diff --git a/docs/Building_Diagrams/images/inclusive_gateway_mp.png b/docs/images/inclusive_gateway_mp.png similarity index 100% rename from docs/Building_Diagrams/images/inclusive_gateway_mp.png rename to docs/images/inclusive_gateway_mp.png diff --git a/docs/Building_Diagrams/images/instructions.png b/docs/images/instructions.png similarity index 100% rename from docs/Building_Diagrams/images/instructions.png rename to docs/images/instructions.png diff --git a/docs/Building_Diagrams/images/intermediate-event-catch-error.256x255.png b/docs/images/intermediate-event-catch-error.256x255.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate-event-catch-error.256x255.png rename to docs/images/intermediate-event-catch-error.256x255.png diff --git a/docs/Building_Diagrams/images/intermediate-event-error.png b/docs/images/intermediate-event-error.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate-event-error.png rename to docs/images/intermediate-event-error.png diff --git a/docs/Building_Diagrams/images/intermediate_catch_msg_event.png b/docs/images/intermediate_catch_msg_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_catch_msg_event.png rename to docs/images/intermediate_catch_msg_event.png diff --git a/docs/Building_Diagrams/images/intermediate_catch_signal_event.png b/docs/images/intermediate_catch_signal_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_catch_signal_event.png rename to docs/images/intermediate_catch_signal_event.png diff --git a/docs/Building_Diagrams/images/intermediate_catch_signal_example.png b/docs/images/intermediate_catch_signal_example.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_catch_signal_example.png rename to docs/images/intermediate_catch_signal_example.png diff --git a/docs/Building_Diagrams/images/intermediate_catch_signal_example_2.png b/docs/images/intermediate_catch_signal_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_catch_signal_example_2.png rename to docs/images/intermediate_catch_signal_example_2.png diff --git a/docs/Building_Diagrams/images/intermediate_conditional_event.png b/docs/images/intermediate_conditional_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_conditional_event.png rename to docs/images/intermediate_conditional_event.png diff --git a/docs/Building_Diagrams/images/intermediate_escalation_catch_event.png b/docs/images/intermediate_escalation_catch_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_escalation_catch_event.png rename to docs/images/intermediate_escalation_catch_event.png diff --git a/docs/Building_Diagrams/images/intermediate_escalation_throw_event.png b/docs/images/intermediate_escalation_throw_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_escalation_throw_event.png rename to docs/images/intermediate_escalation_throw_event.png diff --git a/docs/Building_Diagrams/images/intermediate_event.png b/docs/images/intermediate_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_event.png rename to docs/images/intermediate_event.png diff --git a/docs/Building_Diagrams/images/intermediate_signal_event_example.png b/docs/images/intermediate_signal_event_example.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_signal_event_example.png rename to docs/images/intermediate_signal_event_example.png diff --git a/docs/Building_Diagrams/images/intermediate_throw_msg_event.png b/docs/images/intermediate_throw_msg_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_throw_msg_event.png rename to docs/images/intermediate_throw_msg_event.png diff --git a/docs/Building_Diagrams/images/intermediate_throw_signal_event.png b/docs/images/intermediate_throw_signal_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_throw_signal_event.png rename to docs/images/intermediate_throw_signal_event.png diff --git a/docs/Building_Diagrams/images/intermediate_throw_signal_example.png b/docs/images/intermediate_throw_signal_example.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_throw_signal_example.png rename to docs/images/intermediate_throw_signal_example.png diff --git a/docs/Building_Diagrams/images/intermediate_throw_signal_example_2.png b/docs/images/intermediate_throw_signal_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_throw_signal_example_2.png rename to docs/images/intermediate_throw_signal_example_2.png diff --git a/docs/Building_Diagrams/images/intermediate_timer_event.png b/docs/images/intermediate_timer_event.png similarity index 100% rename from docs/Building_Diagrams/images/intermediate_timer_event.png rename to docs/images/intermediate_timer_event.png diff --git a/docs/Building_Diagrams/images/interrupting_example.png b/docs/images/interrupting_example.png similarity index 100% rename from docs/Building_Diagrams/images/interrupting_example.png rename to docs/images/interrupting_example.png diff --git a/docs/Building_Diagrams/images/interrupting_group.png b/docs/images/interrupting_group.png similarity index 100% rename from docs/Building_Diagrams/images/interrupting_group.png rename to docs/images/interrupting_group.png diff --git a/docs/Building_Diagrams/images/interrupting_intermediate.png b/docs/images/interrupting_intermediate.png similarity index 100% rename from docs/Building_Diagrams/images/interrupting_intermediate.png rename to docs/images/interrupting_intermediate.png diff --git a/docs/Building_Diagrams/images/interrupting_start.png b/docs/images/interrupting_start.png similarity index 100% rename from docs/Building_Diagrams/images/interrupting_start.png rename to docs/images/interrupting_start.png diff --git a/docs/Building_Diagrams/images/lane_configuration_1.png b/docs/images/lane_configuration_1.png similarity index 100% rename from docs/Building_Diagrams/images/lane_configuration_1.png rename to docs/images/lane_configuration_1.png diff --git a/docs/Building_Diagrams/images/lane_owners.png b/docs/images/lane_owners.png similarity index 100% rename from docs/Building_Diagrams/images/lane_owners.png rename to docs/images/lane_owners.png diff --git a/docs/Building_Diagrams/images/lanes_1.png b/docs/images/lanes_1.png similarity index 100% rename from docs/Building_Diagrams/images/lanes_1.png rename to docs/images/lanes_1.png diff --git a/docs/Building_Diagrams/images/lanes_pools_example_1.png b/docs/images/lanes_pools_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/lanes_pools_example_1.png rename to docs/images/lanes_pools_example_1.png diff --git a/docs/Building_Diagrams/images/lanes_pools_example_2.png b/docs/images/lanes_pools_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/lanes_pools_example_2.png rename to docs/images/lanes_pools_example_2.png diff --git a/docs/Building_Diagrams/images/lanes_pools_example_3.png b/docs/images/lanes_pools_example_3.png similarity index 100% rename from docs/Building_Diagrams/images/lanes_pools_example_3.png rename to docs/images/lanes_pools_example_3.png diff --git a/docs/Building_Diagrams/images/lanes_pools_example_4.png b/docs/images/lanes_pools_example_4.png similarity index 100% rename from docs/Building_Diagrams/images/lanes_pools_example_4.png rename to docs/images/lanes_pools_example_4.png diff --git a/docs/Building_Diagrams/images/loop_example1.png b/docs/images/loop_example1.png similarity index 100% rename from docs/Building_Diagrams/images/loop_example1.png rename to docs/images/loop_example1.png diff --git a/docs/Building_Diagrams/images/loop_example2.png b/docs/images/loop_example2.png similarity index 100% rename from docs/Building_Diagrams/images/loop_example2.png rename to docs/images/loop_example2.png diff --git a/docs/Building_Diagrams/images/manual_outpul.png b/docs/images/manual_outpul.png similarity index 100% rename from docs/Building_Diagrams/images/manual_outpul.png rename to docs/images/manual_outpul.png diff --git a/docs/documentation/images/markdown.png b/docs/images/markdown.png similarity index 100% rename from docs/documentation/images/markdown.png rename to docs/images/markdown.png diff --git a/docs/Building_Diagrams/images/message_1.png b/docs/images/message_1.png similarity index 100% rename from docs/Building_Diagrams/images/message_1.png rename to docs/images/message_1.png diff --git a/docs/Building_Diagrams/images/message_event_example_1.png b/docs/images/message_event_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/message_event_example_1.png rename to docs/images/message_event_example_1.png diff --git a/docs/Building_Diagrams/images/message_example1.png b/docs/images/message_example1.png similarity index 100% rename from docs/Building_Diagrams/images/message_example1.png rename to docs/images/message_example1.png diff --git a/docs/Building_Diagrams/images/message_example2.png b/docs/images/message_example2.png similarity index 100% rename from docs/Building_Diagrams/images/message_example2.png rename to docs/images/message_example2.png diff --git a/docs/Building_Diagrams/images/message_example3.png b/docs/images/message_example3.png similarity index 100% rename from docs/Building_Diagrams/images/message_example3.png rename to docs/images/message_example3.png diff --git a/docs/Building_Diagrams/images/message_example4.png b/docs/images/message_example4.png similarity index 100% rename from docs/Building_Diagrams/images/message_example4.png rename to docs/images/message_example4.png diff --git a/docs/Building_Diagrams/images/message_example5.png b/docs/images/message_example5.png similarity index 100% rename from docs/Building_Diagrams/images/message_example5.png rename to docs/images/message_example5.png diff --git a/docs/Building_Diagrams/images/message_example6.png b/docs/images/message_example6.png similarity index 100% rename from docs/Building_Diagrams/images/message_example6.png rename to docs/images/message_example6.png diff --git a/docs/Building_Diagrams/images/model_convention.png b/docs/images/model_convention.png similarity index 100% rename from docs/Building_Diagrams/images/model_convention.png rename to docs/images/model_convention.png diff --git a/docs/Building_Diagrams/images/model_left_to_right_r.png b/docs/images/model_left_to_right_r.png similarity index 100% rename from docs/Building_Diagrams/images/model_left_to_right_r.png rename to docs/images/model_left_to_right_r.png diff --git a/docs/Building_Diagrams/images/model_left_to_right_w.png b/docs/images/model_left_to_right_w.png similarity index 100% rename from docs/Building_Diagrams/images/model_left_to_right_w.png rename to docs/images/model_left_to_right_w.png diff --git a/docs/Building_Diagrams/images/msg_event_example_2.png b/docs/images/msg_event_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/msg_event_example_2.png rename to docs/images/msg_event_example_2.png diff --git a/docs/Building_Diagrams/images/msg_event_example_3.png b/docs/images/msg_event_example_3.png similarity index 100% rename from docs/Building_Diagrams/images/msg_event_example_3.png rename to docs/images/msg_event_example_3.png diff --git a/docs/Building_Diagrams/images/msg_event_example_4.png b/docs/images/msg_event_example_4.png similarity index 100% rename from docs/Building_Diagrams/images/msg_event_example_4.png rename to docs/images/msg_event_example_4.png diff --git a/docs/Building_Diagrams/images/msg_event_example_5.png b/docs/images/msg_event_example_5.png similarity index 100% rename from docs/Building_Diagrams/images/msg_event_example_5.png rename to docs/images/msg_event_example_5.png diff --git a/docs/Building_Diagrams/images/multiinstance_ex.png b/docs/images/multiinstance_ex.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_ex.png rename to docs/images/multiinstance_ex.png diff --git a/docs/Building_Diagrams/images/multiinstance_ex1.png b/docs/images/multiinstance_ex1.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_ex1.png rename to docs/images/multiinstance_ex1.png diff --git a/docs/Building_Diagrams/images/multiinstance_example1.png b/docs/images/multiinstance_example1.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_example1.png rename to docs/images/multiinstance_example1.png diff --git a/docs/Building_Diagrams/images/multiinstance_example2.png b/docs/images/multiinstance_example2.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_example2.png rename to docs/images/multiinstance_example2.png diff --git a/docs/Building_Diagrams/images/multiinstance_example5.png b/docs/images/multiinstance_example5.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_example5.png rename to docs/images/multiinstance_example5.png diff --git a/docs/Building_Diagrams/images/multiinstance_parallel_example.png b/docs/images/multiinstance_parallel_example.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_parallel_example.png rename to docs/images/multiinstance_parallel_example.png diff --git a/docs/Building_Diagrams/images/multiinstance_properties.png b/docs/images/multiinstance_properties.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_properties.png rename to docs/images/multiinstance_properties.png diff --git a/docs/Building_Diagrams/images/multiinstance_sequential_example.png b/docs/images/multiinstance_sequential_example.png similarity index 100% rename from docs/Building_Diagrams/images/multiinstance_sequential_example.png rename to docs/images/multiinstance_sequential_example.png diff --git a/docs/Support/images/my_process_instances.png b/docs/images/my_process_instances.png similarity index 100% rename from docs/Support/images/my_process_instances.png rename to docs/images/my_process_instances.png diff --git a/docs/documentation/images/myst.png b/docs/images/myst.png similarity index 100% rename from docs/documentation/images/myst.png rename to docs/images/myst.png diff --git a/docs/Building_Diagrams/images/name_field.png b/docs/images/name_field.png similarity index 100% rename from docs/Building_Diagrams/images/name_field.png rename to docs/images/name_field.png diff --git a/docs/Building_Diagrams/images/naming_convention.png b/docs/images/naming_convention.png similarity index 100% rename from docs/Building_Diagrams/images/naming_convention.png rename to docs/images/naming_convention.png diff --git a/docs/Building_Diagrams/images/non-boundary_event.png b/docs/images/non-boundary_event.png similarity index 100% rename from docs/Building_Diagrams/images/non-boundary_event.png rename to docs/images/non-boundary_event.png diff --git a/docs/Building_Diagrams/images/non-boundary_event_example.png b/docs/images/non-boundary_event_example.png similarity index 100% rename from docs/Building_Diagrams/images/non-boundary_event_example.png rename to docs/images/non-boundary_event_example.png diff --git a/docs/Building_Diagrams/images/non-interrupting_example.png b/docs/images/non-interrupting_example.png similarity index 100% rename from docs/Building_Diagrams/images/non-interrupting_example.png rename to docs/images/non-interrupting_example.png diff --git a/docs/Building_Diagrams/images/non-interrupting_group.png b/docs/images/non-interrupting_group.png similarity index 100% rename from docs/Building_Diagrams/images/non-interrupting_group.png rename to docs/images/non-interrupting_group.png diff --git a/docs/Debugging_Diagrams/images/non_executable.png b/docs/images/non_executable.png similarity index 100% rename from docs/Debugging_Diagrams/images/non_executable.png rename to docs/images/non_executable.png diff --git a/docs/Debugging_Diagrams/images/non_executable1.png b/docs/images/non_executable1.png similarity index 100% rename from docs/Debugging_Diagrams/images/non_executable1.png rename to docs/images/non_executable1.png diff --git a/docs/Building_Diagrams/images/non_interrupting_conditional_start_event.png b/docs/images/non_interrupting_conditional_start_event.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_conditional_start_event.png rename to docs/images/non_interrupting_conditional_start_event.png diff --git a/docs/Building_Diagrams/images/non_interrupting_intermediate_conditional_event.png b/docs/images/non_interrupting_intermediate_conditional_event.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_intermediate_conditional_event.png rename to docs/images/non_interrupting_intermediate_conditional_event.png diff --git a/docs/Building_Diagrams/images/non_interrupting_intermediate_escalation_event.png b/docs/images/non_interrupting_intermediate_escalation_event.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_intermediate_escalation_event.png rename to docs/images/non_interrupting_intermediate_escalation_event.png diff --git a/docs/Building_Diagrams/images/non_interrupting_intermediate_timer_event.png b/docs/images/non_interrupting_intermediate_timer_event.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_intermediate_timer_event.png rename to docs/images/non_interrupting_intermediate_timer_event.png diff --git a/docs/Building_Diagrams/images/non_interrupting_start_escalation_event.png b/docs/images/non_interrupting_start_escalation_event.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_start_escalation_event.png rename to docs/images/non_interrupting_start_escalation_event.png diff --git a/docs/Building_Diagrams/images/non_interrupting_start_timer.png b/docs/images/non_interrupting_start_timer.png similarity index 100% rename from docs/Building_Diagrams/images/non_interrupting_start_timer.png rename to docs/images/non_interrupting_start_timer.png diff --git a/docs/DevOps_installation_integration/images/okta_config.png b/docs/images/okta_config.png similarity index 100% rename from docs/DevOps_installation_integration/images/okta_config.png rename to docs/images/okta_config.png diff --git a/docs/Support/images/onboarding_1.png b/docs/images/onboarding_1.png similarity index 100% rename from docs/Support/images/onboarding_1.png rename to docs/images/onboarding_1.png diff --git a/docs/Support/images/onboarding_2.png b/docs/images/onboarding_2.png similarity index 100% rename from docs/Support/images/onboarding_2.png rename to docs/images/onboarding_2.png diff --git a/docs/Support/images/onboarding_3.png b/docs/images/onboarding_3.png similarity index 100% rename from docs/Support/images/onboarding_3.png rename to docs/images/onboarding_3.png diff --git a/docs/Support/images/onboarding_4.png b/docs/images/onboarding_4.png similarity index 100% rename from docs/Support/images/onboarding_4.png rename to docs/images/onboarding_4.png diff --git a/docs/Building_Diagrams/images/out_of_stock.png b/docs/images/out_of_stock.png similarity index 100% rename from docs/Building_Diagrams/images/out_of_stock.png rename to docs/images/out_of_stock.png diff --git a/docs/Building_Diagrams/images/parallel_gateway.png b/docs/images/parallel_gateway.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateway.png rename to docs/images/parallel_gateway.png diff --git a/docs/Building_Diagrams/images/parallel_gateway_ex1.png b/docs/images/parallel_gateway_ex1.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateway_ex1.png rename to docs/images/parallel_gateway_ex1.png diff --git a/docs/Building_Diagrams/images/parallel_gateway_ex2.png b/docs/images/parallel_gateway_ex2.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateway_ex2.png rename to docs/images/parallel_gateway_ex2.png diff --git a/docs/Building_Diagrams/images/parallel_gateways.png b/docs/images/parallel_gateways.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateways.png rename to docs/images/parallel_gateways.png diff --git a/docs/Building_Diagrams/images/parallel_gateways_examples.png b/docs/images/parallel_gateways_examples.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateways_examples.png rename to docs/images/parallel_gateways_examples.png diff --git a/docs/Building_Diagrams/images/parallel_gateways_merge.png b/docs/images/parallel_gateways_merge.png similarity index 100% rename from docs/Building_Diagrams/images/parallel_gateways_merge.png rename to docs/images/parallel_gateways_merge.png diff --git a/docs/Building_Diagrams/images/participant_configuration_1.png b/docs/images/participant_configuration_1.png similarity index 100% rename from docs/Building_Diagrams/images/participant_configuration_1.png rename to docs/images/participant_configuration_1.png diff --git a/docs/Building_Diagrams/images/participant_customer_1.png b/docs/images/participant_customer_1.png similarity index 100% rename from docs/Building_Diagrams/images/participant_customer_1.png rename to docs/images/participant_customer_1.png diff --git a/docs/Building_Diagrams/images/participant_lane_1.png b/docs/images/participant_lane_1.png similarity index 100% rename from docs/Building_Diagrams/images/participant_lane_1.png rename to docs/images/participant_lane_1.png diff --git a/docs/Building_Diagrams/images/participant_sales_1.png b/docs/images/participant_sales_1.png similarity index 100% rename from docs/Building_Diagrams/images/participant_sales_1.png rename to docs/images/participant_sales_1.png diff --git a/docs/Building_Diagrams/images/payload_msg.png b/docs/images/payload_msg.png similarity index 100% rename from docs/Building_Diagrams/images/payload_msg.png rename to docs/images/payload_msg.png diff --git a/docs/Building_Diagrams/images/pool_configuration.png b/docs/images/pool_configuration.png similarity index 100% rename from docs/Building_Diagrams/images/pool_configuration.png rename to docs/images/pool_configuration.png diff --git a/docs/Building_Diagrams/images/pool_settings_1.png b/docs/images/pool_settings_1.png similarity index 100% rename from docs/Building_Diagrams/images/pool_settings_1.png rename to docs/images/pool_settings_1.png diff --git a/docs/Building_Diagrams/images/pools_and_lanes_1.png b/docs/images/pools_and_lanes_1.png similarity index 100% rename from docs/Building_Diagrams/images/pools_and_lanes_1.png rename to docs/images/pools_and_lanes_1.png diff --git a/docs/Support/images/previous_active_state.png b/docs/images/previous_active_state.png similarity index 100% rename from docs/Support/images/previous_active_state.png rename to docs/images/previous_active_state.png diff --git a/docs/Building_Diagrams/images/private_data_object.png b/docs/images/private_data_object.png similarity index 100% rename from docs/Building_Diagrams/images/private_data_object.png rename to docs/images/private_data_object.png diff --git a/docs/DevOps_installation_integration/images/process_groups_tile.png b/docs/images/process_groups_tile.png similarity index 100% rename from docs/DevOps_installation_integration/images/process_groups_tile.png rename to docs/images/process_groups_tile.png diff --git a/docs/Support/images/process_instance_not_found.png b/docs/images/process_instance_not_found.png similarity index 100% rename from docs/Support/images/process_instance_not_found.png rename to docs/images/process_instance_not_found.png diff --git a/docs/Support/images/process_instance_tab.png b/docs/images/process_instance_tab.png similarity index 100% rename from docs/Support/images/process_instance_tab.png rename to docs/images/process_instance_tab.png diff --git a/docs/Building_Diagrams/images/relationship_message.png b/docs/images/relationship_message.png similarity index 100% rename from docs/Building_Diagrams/images/relationship_message.png rename to docs/images/relationship_message.png diff --git a/docs/Support/images/reset_process.png b/docs/images/reset_process.png similarity index 100% rename from docs/Support/images/reset_process.png rename to docs/images/reset_process.png diff --git a/docs/Support/images/reset_process1.png b/docs/images/reset_process1.png similarity index 100% rename from docs/Support/images/reset_process1.png rename to docs/images/reset_process1.png diff --git a/docs/Support/images/reset_process2.png b/docs/images/reset_process2.png similarity index 100% rename from docs/Support/images/reset_process2.png rename to docs/images/reset_process2.png diff --git a/docs/Support/images/reset_process3.png b/docs/images/reset_process3.png similarity index 100% rename from docs/Support/images/reset_process3.png rename to docs/images/reset_process3.png diff --git a/docs/Support/images/reset_process4.png b/docs/images/reset_process4.png similarity index 100% rename from docs/Support/images/reset_process4.png rename to docs/images/reset_process4.png diff --git a/docs/Support/images/reset_process5.png b/docs/images/reset_process5.png similarity index 100% rename from docs/Support/images/reset_process5.png rename to docs/images/reset_process5.png diff --git a/docs/Support/images/reset_process6.png b/docs/images/reset_process6.png similarity index 100% rename from docs/Support/images/reset_process6.png rename to docs/images/reset_process6.png diff --git a/docs/Support/images/resume.png b/docs/images/resume.png similarity index 100% rename from docs/Support/images/resume.png rename to docs/images/resume.png diff --git a/docs/Building_Diagrams/images/rsjf_markdown.png b/docs/images/rsjf_markdown.png similarity index 100% rename from docs/Building_Diagrams/images/rsjf_markdown.png rename to docs/images/rsjf_markdown.png diff --git a/docs/Building_Diagrams/images/search_process_instance.png b/docs/images/search_process_instance.png similarity index 100% rename from docs/Building_Diagrams/images/search_process_instance.png rename to docs/images/search_process_instance.png diff --git a/docs/Building_Diagrams/images/sensitive_value.png b/docs/images/sensitive_value.png similarity index 100% rename from docs/Building_Diagrams/images/sensitive_value.png rename to docs/images/sensitive_value.png diff --git a/docs/Building_Diagrams/images/separate_pools_1.png b/docs/images/separate_pools_1.png similarity index 100% rename from docs/Building_Diagrams/images/separate_pools_1.png rename to docs/images/separate_pools_1.png diff --git a/docs/Building_Diagrams/images/service_task_doc1.png b/docs/images/service_task_doc1.png similarity index 100% rename from docs/Building_Diagrams/images/service_task_doc1.png rename to docs/images/service_task_doc1.png diff --git a/docs/Building_Diagrams/images/service_task_doc2.png b/docs/images/service_task_doc2.png similarity index 100% rename from docs/Building_Diagrams/images/service_task_doc2.png rename to docs/images/service_task_doc2.png diff --git a/docs/Building_Diagrams/images/service_task_doc3.png b/docs/images/service_task_doc3.png similarity index 100% rename from docs/Building_Diagrams/images/service_task_doc3.png rename to docs/images/service_task_doc3.png diff --git a/docs/Building_Diagrams/images/setting_permissions.png b/docs/images/setting_permissions.png similarity index 100% rename from docs/Building_Diagrams/images/setting_permissions.png rename to docs/images/setting_permissions.png diff --git a/docs/Building_Diagrams/images/signal_event_example.png b/docs/images/signal_event_example.png similarity index 100% rename from docs/Building_Diagrams/images/signal_event_example.png rename to docs/images/signal_event_example.png diff --git a/docs/Building_Diagrams/images/signal_event_example_2.png b/docs/images/signal_event_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/signal_event_example_2.png rename to docs/images/signal_event_example_2.png diff --git a/docs/Building_Diagrams/images/signal_relationships.png b/docs/images/signal_relationships.png similarity index 100% rename from docs/Building_Diagrams/images/signal_relationships.png rename to docs/images/signal_relationships.png diff --git a/docs/Building_Diagrams/images/signal_sync_example.png b/docs/images/signal_sync_example.png similarity index 100% rename from docs/Building_Diagrams/images/signal_sync_example.png rename to docs/images/signal_sync_example.png diff --git a/docs/DevOps_installation_integration/images/site_administration.png b/docs/images/site_administration.png similarity index 100% rename from docs/DevOps_installation_integration/images/site_administration.png rename to docs/images/site_administration.png diff --git a/docs/Building_Diagrams/images/start-event-error.1024x1024.png b/docs/images/start-event-error.1024x1024.png similarity index 100% rename from docs/Building_Diagrams/images/start-event-error.1024x1024.png rename to docs/images/start-event-error.1024x1024.png diff --git a/docs/Building_Diagrams/images/start-event-error.256x256.png b/docs/images/start-event-error.256x256.png similarity index 100% rename from docs/Building_Diagrams/images/start-event-error.256x256.png rename to docs/images/start-event-error.256x256.png diff --git a/docs/Building_Diagrams/images/start_conditional_event.png b/docs/images/start_conditional_event.png similarity index 100% rename from docs/Building_Diagrams/images/start_conditional_event.png rename to docs/images/start_conditional_event.png diff --git a/docs/Building_Diagrams/images/start_escalation_event.png b/docs/images/start_escalation_event.png similarity index 100% rename from docs/Building_Diagrams/images/start_escalation_event.png rename to docs/images/start_escalation_event.png diff --git a/docs/Building_Diagrams/images/start_escalation_example.png b/docs/images/start_escalation_example.png similarity index 100% rename from docs/Building_Diagrams/images/start_escalation_example.png rename to docs/images/start_escalation_example.png diff --git a/docs/Building_Diagrams/images/start_escalation_example_1.png b/docs/images/start_escalation_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/start_escalation_example_1.png rename to docs/images/start_escalation_example_1.png diff --git a/docs/Building_Diagrams/images/start_escalation_example_2.png b/docs/images/start_escalation_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/start_escalation_example_2.png rename to docs/images/start_escalation_example_2.png diff --git a/docs/Building_Diagrams/images/start_event_t.png b/docs/images/start_event_t.png similarity index 100% rename from docs/Building_Diagrams/images/start_event_t.png rename to docs/images/start_event_t.png diff --git a/docs/Building_Diagrams/images/start_message_event_1.png b/docs/images/start_message_event_1.png similarity index 100% rename from docs/Building_Diagrams/images/start_message_event_1.png rename to docs/images/start_message_event_1.png diff --git a/docs/Building_Diagrams/images/start_signal_event.png b/docs/images/start_signal_event.png similarity index 100% rename from docs/Building_Diagrams/images/start_signal_event.png rename to docs/images/start_signal_event.png diff --git a/docs/Building_Diagrams/images/start_timer_event.png b/docs/images/start_timer_event.png similarity index 100% rename from docs/Building_Diagrams/images/start_timer_event.png rename to docs/images/start_timer_event.png diff --git a/docs/Building_Diagrams/images/start_timer_example.png b/docs/images/start_timer_example.png similarity index 100% rename from docs/Building_Diagrams/images/start_timer_example.png rename to docs/images/start_timer_example.png diff --git a/docs/Building_Diagrams/images/start_timer_example_1.png b/docs/images/start_timer_example_1.png similarity index 100% rename from docs/Building_Diagrams/images/start_timer_example_1.png rename to docs/images/start_timer_example_1.png diff --git a/docs/Building_Diagrams/images/start_timer_example_2.png b/docs/images/start_timer_example_2.png similarity index 100% rename from docs/Building_Diagrams/images/start_timer_example_2.png rename to docs/images/start_timer_example_2.png diff --git a/docs/Building_Diagrams/images/start_timer_example_3.png b/docs/images/start_timer_example_3.png similarity index 100% rename from docs/Building_Diagrams/images/start_timer_example_3.png rename to docs/images/start_timer_example_3.png diff --git a/docs/Building_Diagrams/images/styling_forms.png b/docs/images/styling_forms.png similarity index 100% rename from docs/Building_Diagrams/images/styling_forms.png rename to docs/images/styling_forms.png diff --git a/docs/Building_Diagrams/images/sub_process.png b/docs/images/sub_process.png similarity index 100% rename from docs/Building_Diagrams/images/sub_process.png rename to docs/images/sub_process.png diff --git a/docs/Building_Diagrams/images/sub_process1.png b/docs/images/sub_process1.png similarity index 100% rename from docs/Building_Diagrams/images/sub_process1.png rename to docs/images/sub_process1.png diff --git a/docs/Support/images/suspend.png b/docs/images/suspend.png similarity index 100% rename from docs/Support/images/suspend.png rename to docs/images/suspend.png diff --git a/docs/Support/images/suspended.png b/docs/images/suspended.png similarity index 100% rename from docs/Support/images/suspended.png rename to docs/images/suspended.png diff --git a/docs/Getting_Started/images/task_instance_history.png b/docs/images/task_instance_history.png similarity index 100% rename from docs/Getting_Started/images/task_instance_history.png rename to docs/images/task_instance_history.png diff --git a/docs/Support/images/terminate.png b/docs/images/terminate.png similarity index 100% rename from docs/Support/images/terminate.png rename to docs/images/terminate.png diff --git a/docs/Support/images/terminate_warning.png b/docs/images/terminate_warning.png similarity index 100% rename from docs/Support/images/terminate_warning.png rename to docs/images/terminate_warning.png diff --git a/docs/Support/images/terminated.png b/docs/images/terminated.png similarity index 100% rename from docs/Support/images/terminated.png rename to docs/images/terminated.png diff --git a/docs/Support/images/terminated_process_instance.png b/docs/images/terminated_process_instance.png similarity index 100% rename from docs/Support/images/terminated_process_instance.png rename to docs/images/terminated_process_instance.png diff --git a/docs/Building_Diagrams/images/throw_events.png b/docs/images/throw_events.png similarity index 100% rename from docs/Building_Diagrams/images/throw_events.png rename to docs/images/throw_events.png diff --git a/docs/Building_Diagrams/images/throw_example.png b/docs/images/throw_example.png similarity index 100% rename from docs/Building_Diagrams/images/throw_example.png rename to docs/images/throw_example.png diff --git a/docs/Building_Diagrams/images/timer_field.png b/docs/images/timer_field.png similarity index 100% rename from docs/Building_Diagrams/images/timer_field.png rename to docs/images/timer_field.png diff --git a/docs/DevOps_installation_integration/images/upload_file.png b/docs/images/upload_file.png similarity index 100% rename from docs/DevOps_installation_integration/images/upload_file.png rename to docs/images/upload_file.png diff --git a/docs/Building_Diagrams/images/user_groups.png b/docs/images/user_groups.png similarity index 100% rename from docs/Building_Diagrams/images/user_groups.png rename to docs/images/user_groups.png diff --git a/docs/Support/images/user_input_required.png b/docs/images/user_input_required.png similarity index 100% rename from docs/Support/images/user_input_required.png rename to docs/images/user_input_required.png diff --git a/docs/Building_Diagrams/images/user_tasks_properties.png b/docs/images/user_tasks_properties.png similarity index 100% rename from docs/Building_Diagrams/images/user_tasks_properties.png rename to docs/images/user_tasks_properties.png diff --git a/docs/DevOps_installation_integration/images/user_to_groups.png b/docs/images/user_to_groups.png similarity index 100% rename from docs/DevOps_installation_integration/images/user_to_groups.png rename to docs/images/user_to_groups.png diff --git a/docs/Building_Diagrams/images/version.png b/docs/images/version.png similarity index 100% rename from docs/Building_Diagrams/images/version.png rename to docs/images/version.png diff --git a/docs/Getting_Started/images/waiter.png b/docs/images/waiter.png similarity index 100% rename from docs/Getting_Started/images/waiter.png rename to docs/images/waiter.png diff --git a/docs/Support/images/waiting.png b/docs/images/waiting.png similarity index 100% rename from docs/Support/images/waiting.png rename to docs/images/waiting.png diff --git a/docs/index.md b/docs/index.md index a81ba11a5..d7dd7050f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,94 +1,68 @@ -# Welcome to SpiffWorkflow's documentation +# Welcome to SpiffWorkflow's Documentation + +**SpiffWorkflow: Streamline Your Processes with Ease.** SpiffWorkflow is a platform designed to help you automate and manage complex workflows efficiently. + +**What SpiffWorkflow Does:** It provides a comprehensive suite of tools to model, execute, and monitor business processes, enabling organizations to improve productivity and transparency. + +**Meeting Your Needs:** Whether you're looking to automate routine tasks or manage intricate workflows--including AI and Human-in-the-loop--SpiffWorkflow offers the flexibility and scalability to meet your business needs, in an open and standards-based package. + +**Who Benefits from SpiffWorkflow:** Ideal for businesses of all sizes, SpiffWorkflow is perfect for process architects, IT professionals, and anyone looking to optimize their workflow management. + +--- + +## In This Documentation ```{toctree} -:maxdepth: 1 -:caption: Getting Started -Getting_Started/quick_start.md +:maxdepth: 2 +:hidden: + +tutorials/index +how_to_guides/index +explanation/index +reference/index ``` -```{toctree} -:maxdepth: 1 -:caption: Building Diagrams -Building_Diagrams/learn_basics.md -Building_Diagrams/bpmn.md -Building_Diagrams/user_tasks_and_forms.md -Building_Diagrams/gateways.md -Building_Diagrams/events.md -Building_Diagrams/message_events.md -Building_Diagrams/signal_events.md -Building_Diagrams/timer_events.md -Building_Diagrams/escalation_events.md -Building_Diagrams/conditional_events.md -Building_Diagrams/error_events.md -Building_Diagrams/Displaying_Content.md -Building_Diagrams/Script_Tasks.md -Building_Diagrams/service_tasks.md -Building_Diagrams/sub-processes_and_call_activities.md -Building_Diagrams/data.md -Building_Diagrams/multiinstance.md -Building_Diagrams/dmn.md -Building_Diagrams/pools_and_lanes.md -Building_Diagrams/Builtin_examples.md -``` +## [Tutorials](tutorials/index) + +**Start here**: A hands-on introduction to SpiffWorkflow for new users. + +## [How-to guides](how_to_guides/index) + +**Step-by-step guides**: Covering key operations and common tasks. + +## [Reference](reference/index) + +**Technical information**: Specifications, APIs, architecture. + +## [Explanation](explanation/index) + +**Discussion and clarification**: Background covering key topics ```{toctree} :maxdepth: 1 :caption: Debugging Diagrams -Debugging_Diagrams/bpmn_unit_tests.md -Debugging_Diagrams/process_error_handling.md -Debugging_Diagrams/executable_non_executable.md ``` ```{toctree} :maxdepth: 1 :caption: Support & Administration -Support/manage_processes.md -Support/Welcome_Messages.md -Support/Running_Server_Locally.md -Support/FAQ.md -``` - -```{toctree} -:maxdepth: 1 -:caption: Technical Docs -dev/index.md -dev/setup.md -dev/backend.md -dev/frontend.md -dev/connector_proxy.md -dev/how_to_build_a_connector.md -dev/extensions.md -dev/process.md ``` ```{toctree} :maxdepth: 1 :caption: DevOps - Installation & Integration -DevOps_installation_integration/deployment.md -DevOps_installation_integration/admin_and_permissions.md -DevOps_installation_integration/permission_url.md -DevOps_installation_integration/configure_connector_proxy.md -DevOps_installation_integration/deploy_aws_lambda.md -DevOps_installation_integration/Secrets.md -DevOps_installation_integration/redis_celery_broker.md -DevOps_installation_integration/path_based_routing.md -DevOps_installation_integration/process_model_management.md -DevOps_installation_integration/okta_config.md ``` ```{toctree} :maxdepth: 1 :caption: Appendices -appendices/glossary.md -appendices/articles.md -appendices/bpmn_terminology.md -documentation/documentation.md -Building_Diagrams/custom_process_metadata.md -wish_list/wish_list.md ``` -## Indices and tables +## Project and Community -- [](genindex) -- [](modindex) -- [](search) +SpiffWorkflow is an open-source project that welcomes community contributions, suggestions, and feedback. + +- [Join our online chat](https://discord.gg/F6Kb7HNK7B) +- [Contribute](https://github.com/sartography/spiff-arena/blob/main/CONTRIBUTING.rst) +- [Roadmap](https://github.com/sartography/spiff-arena/issues) +- Thinking about using SpiffWorkflow for your next project? [Get in touch!](https://www.spiffworkflow.org/) diff --git a/docs/Building_Diagrams/conditional_events.md b/docs/reference/bpmn/conditional_events.md similarity index 80% rename from docs/Building_Diagrams/conditional_events.md rename to docs/reference/bpmn/conditional_events.md index 31ec08952..d989cdc2a 100644 --- a/docs/Building_Diagrams/conditional_events.md +++ b/docs/reference/bpmn/conditional_events.md @@ -1,4 +1,4 @@ -# Conditional Event +# Conditional Events A Conditional Event is a type of event that activates based on the evaluation of a condition, typically expressed as a Boolean expression (true or false). Conditional Events depend on the state or value of process variables that are part of the process context. @@ -18,14 +18,14 @@ Importantly, this variable needs to be accessible within the process context. ## Start Conditional Event -![start_signal_event](images/start_conditional_event.png) -![start_signal_event](images/non_interrupting_conditional_start_event.png) +![start_signal_event](/images/start_conditional_event.png) +![start_signal_event](/images/non_interrupting_conditional_start_event.png) A Start Conditional Event marks the beginning of a process or a sub-process, triggered when a specific condition is fulfilled, or in other terms, when the condition evaluates to true. **Example:** -![conditional_start_example](images/conditional_start_example_1.png) +![conditional_start_example](/images/conditional_start_example_1.png) **Conditional Start Event (interrupting):** In the first scenario, as a transaction is being processed, funds are withdrawn from a ledger. @@ -39,8 +39,8 @@ Our goal is to maintain an uninterrupted shopping experience for the customer, y ## Intermediate Conditional Event -![intermediate_conditional_event](images/intermediate_conditional_event.png) -![intermediate_conditional_event](images/non_interrupting_intermediate_conditional_event.png) +![intermediate_conditional_event](/images/intermediate_conditional_event.png) +![intermediate_conditional_event](/images/non_interrupting_intermediate_conditional_event.png) An Intermediate Conditional Event serves as a gate or checkpoint within the flow of a process. The process flow will proceed once the attached condition evaluates to true. @@ -49,7 +49,7 @@ This ensures that certain actions are taken or the process is redirected when pa **Example:** -![conditional_intermediate_example_1](images/conditional_intermediate_example_1.png) +![conditional_intermediate_example_1](/images/conditional_intermediate_example_1.png) **Conditional Intermediate Catch Event:** Once an order is packed and ready for shipping, it doesn't necessarily imply immediate delivery. @@ -64,7 +64,7 @@ Given that our pastries need a specific temperature for baking, only when this c **Example:** -![conditional_intermediate_example_2](images/conditional_intermediate_example_2.png) +![conditional_intermediate_example_2](/images/conditional_intermediate_example_2.png) **Conditional Boundary Event (interrupting):** Boundary events allow us to redirect our processes based on shifts in certain conditions. @@ -82,7 +82,7 @@ The task still requires completion, but there's an additional remark or modifica **Best Modeling Practices:** -![conditional_intermediate_example_3](images/conditional_intermediate_example_3.png) +![conditional_intermediate_example_3](/images/conditional_intermediate_example_3.png) When utilizing a condition to loop back to a previous stage, it's crucial to highlight that the condition should be reset to evaluate as false once again. If not adjusted, the condition might activate immediately when the instance revisits the task, potentially causing an infinite loop. @@ -92,10 +92,13 @@ Always revert the condition to its default state to ensure appropriate behavior. | 💻 Form | ⌨ Field Input | 📝 Description | | ---------------------------------------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------- | -| ![name_field](images/name_field.png) | **Name:** Request Assistance | A descriptive name given to the element, providing a human-readable label or title. | -| ![id_field](images/id_field.png) | **ID:** Example - request_assistance | An identifier used to uniquely identify the element within the BPMN model. | -| ![configure_conditional_event](images/configure_conditional_event.png) | **Conditional Expression:** request_assistance == true | Set the expression that needs to be evaluated to take action. | +| ![name_field](/images/name_field.png) | **Name:** Request Assistance | A descriptive name given to the element, providing a human-readable label or title. | +| ![id_field](/images/id_field.png) | **ID:** Example - request_assistance | An identifier used to uniquely identify the element within the BPMN model. | +| ![configure_conditional_event](/images/configure_conditional_event.png) | **Conditional Expression:** request_assistance == true | Set the expression that needs to be evaluated to take action. | ```{admonition} Note ⚠ When configuring the conditional expression, ensure there's such a variable in your process context. ``` + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/message_example_event.md b/docs/reference/bpmn/configuring_messages_and_correlation_properties.md similarity index 92% rename from docs/Building_Diagrams/message_example_event.md rename to docs/reference/bpmn/configuring_messages_and_correlation_properties.md index 9c2349681..15f0b49a5 100644 --- a/docs/Building_Diagrams/message_example_event.md +++ b/docs/reference/bpmn/configuring_messages_and_correlation_properties.md @@ -21,13 +21,13 @@ Each message you define in a BPMN model can carry a payload (data) and have corr To create a new message: 1. **Access the Message Editor**: -![Message Example](images/message_example1.png) +![Message Example](/images/message_example1.png) Click on a **Send Task** or **Message Event** in your process model. Under the **Message** tab, select "Open Message Editor". 2. **Define the Message**: -![Message Example](images/message_example2.png) +![Message Example](/images/message_example2.png) - **Message Name**: Give your message a unique name (e.g., `order_accept`, `order_dispatch`). This should not contain spaces or special characters. - **Location**: Define the path where this message will be accessible. Only process models within this path will have access to the message. - **JSON Schema**: If you need the message to conform to a specific data format, you can define a JSON schema here. The payload must match this schema if specified. @@ -46,14 +46,14 @@ For instance, in our **Waiter** process: - Open the **Message** tab in the task configuration. Select the **order_accept** message from the drop-down. - In the **Payload** section, specify the data variable that holds the payload (e.g., `order`). - ![Send Task Configuration](images/message_example3.png) + ![Send Task Configuration](/images/message_example3.png) In our **Chef** process: - **Message Start Event**: The process is initiated when the `order_accept` message is received. - Open the **Message** tab in the Start Event configuration. Select the **order_accept** message. - In the **Variable Name** section, specify the variable where the payload will be stored (e.g., `order_to_cook`). -![Message Example](images/message_example6.png) +![Message Example](/images/message_example6.png) ### 3. Setting Correlation Properties in Messages @@ -63,10 +63,13 @@ To ensure that messages are delivered to the correct process instance, correlati - In the Chef process, when the chef sends a response message (`order_dispatch`) back to the waiter, the correlation property ensures that the message is directed to the correct waiter process. -![Message Example](images/message_example6.png) +![Message Example](/images/message_example6.png) - Correlation becomes relevant only for ongoing communication between processes, such as when the Chef sends a response back to the Waiter process using the order_dispatch message, ensuring the message is directed to the correct process instance. -![Message Example](images/message_example4.png) +![Message Example](/images/message_example4.png) -By using messages and correlation properties, you can effectively manage communication between multiple BPMN processes. This ensures that the right data reaches the right process at the right time, allowing for dynamic and responsive workflows. \ No newline at end of file +By using messages and correlation properties, you can effectively manage communication between multiple BPMN processes. This ensures that the right data reaches the right process at the right time, allowing for dynamic and responsive workflows. + +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/Building_Diagrams/data.md b/docs/reference/bpmn/data.md similarity index 70% rename from docs/Building_Diagrams/data.md rename to docs/reference/bpmn/data.md index 2a715bdab..07e44f6d2 100644 --- a/docs/Building_Diagrams/data.md +++ b/docs/reference/bpmn/data.md @@ -7,3 +7,6 @@ task_data.md data_objects.md data_stores.md ``` + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/data_objects.md b/docs/reference/bpmn/data_objects.md similarity index 62% rename from docs/Building_Diagrams/data_objects.md rename to docs/reference/bpmn/data_objects.md index b869948d3..b0a796b8a 100644 --- a/docs/Building_Diagrams/data_objects.md +++ b/docs/reference/bpmn/data_objects.md @@ -20,21 +20,21 @@ They aid in elucidating the data flow and dependencies within the process, thus ### Data Input -![data_input](images/data_input.png) +![data_input](/images/data_input.png) This represents the data or information that is needed as an input to initiate or carry out a specific task or process. BPMN input defines the data elements that must be provided or available for the task to be performed. ### Data Output -![data_output](images/data_output.png) +![data_output](/images/data_output.png) This signifies the data or information that is created or generated as a result of executing a task or process. BPMN output describes the data elements that are produced or altered during the execution of the task. ### Data Object Reference -![data_object_reference](images/data_object_reference.png) +![data_object_reference](/images/data_object_reference.png) A Data Object in BPMN typically signifies a particular piece of information or a data entity that is exchanged or manipulated during the course of a business process. It can represent both physical and digital data. @@ -42,12 +42,12 @@ Examples of Data Objects include documents, forms, reports, databases, or any ot ## Data Input Configuration -| 💻 Form | ⌨ Field Input | 📝 Description | -| --- | --- | --- | -| ![name_field](images/name_field.png) | **Name:** Update Customer Information | An identifier used to uniquely identify the element within the BPMN model. | -| ![id_field](images/id_field.png) | **ID:** Example - updateCustomerInformation | A descriptive name given to the element, providing a human-readable label or title. | -| ![documentation_field](images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | -| ![data_object_prop](images/data_object_prop.png) | **Element Documentation:** inventory_items | Enter an existing data object ID | +| 💻 Form | ⌨ Field Input | 📝 Description | +| ------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| ![name_field](/images/name_field.png) | **Name:** Update Customer Information | An identifier used to uniquely identify the element within the BPMN model. | +| ![id_field](/images/id_field.png) | **ID:** Example - updateCustomerInformation | A descriptive name given to the element, providing a human-readable label or title. | +| ![documentation_field](/images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | +| ![data_object_prop](/images/data_object_prop.png) | **Element Documentation:** inventory_items | Enter an existing data object ID | ## Handling Sensitive Data Using Data Objects @@ -57,48 +57,50 @@ This documentation outlines the process of creating and managing sensitive data ### Process Breakdown #### 1. Identifying Sensitive Data + - Determine what constitutes sensitive data within your workflow. -This could include personal information, financial details, or confidential business information. + This could include personal information, financial details, or confidential business information. #### 2. Data Object Creation and Script Task Integration - **Script Task Setup**: Develop a script task that interacts with the data object. -The script should be designed to handle the sensitive data securely, ensuring it's not exposed or logged inadvertently. + The script should be designed to handle the sensitive data securely, ensuring it's not exposed or logged inadvertently. - **Data Object Creation**: Create a data object in the workflow to store the sensitive data. -This object acts as a container for the data, separating it from the main workflow logic. + This object acts as a container for the data, separating it from the main workflow logic. #### 3. Assigning Data Categories - **Categorization**: Assign a specific category to the data object that reflects its sensitive nature. -For example, categories like `confidential` or `private` or the name of the field can be used. + For example, categories like `confidential` or `private` or the name of the field can be used. #### 4. Implementing Access Controls -- **Permission Rules**: Establish permission rules, using a Decision Model and Notation (DMN) table or another mechanism as described under [Admin and Permissions](/DevOps_installation_integration/admin_and_permissions.md). -This step involves specifying who can access the sensitive data. +- **Permission Rules**: Establish permission rules, using a Decision Model and Notation (DMN) table or another mechanism as described under [Admin and Permissions](/how_to_guides/deployment/manage_permissions). + This step involves specifying who can access the sensitive data. - **Access Restrictions**: Define the access level (e.g., read, write, deny) for different user groups or roles. -For instance, you might restrict read access to certain groups while denying it to others. + For instance, you might restrict read access to certain groups while denying it to others. - **URL-Based Permissions**: Use URL patterns to enforce permissions. -For example, a URL pattern like `/process-data/confidential/*` can be used to control access to all data objects categorized as confidential. + For example, a URL pattern like `/process-data/confidential/*` can be used to control access to all data objects categorized as confidential. ### Example: Steps to Handle Sensitive Data #### 1. Creating a Script Task with Sensitive Data + - **Initial Setup**: Start by creating a script task where the script sets a variable (e.g., `a=1`). -This variable `a` could represent sensitive data like a credit card number. + This variable `a` could represent sensitive data like a credit card number. - **Execution**: Run the task to observe the value of `a`. -![image](images/private_data_object.png) + ![image](/images/private_data_object.png) #### 2. Converting to a Data Object - **Data Object Creation**: Create a data object and name it (e.g., `a`). -Link this data object to the script task and set the data object ID to `a`. + Link this data object to the script task and set the data object ID to `a`. - **Assign a Category**: Assume the data object represents a credit card number. -Assign a category to this data object, such as `creditcards`. + Assign a category to this data object, such as `creditcards`. - **Visibility**: The credit card data is visible until permissions are set to restrict access. -![image](images/category.png) + ![image](/images/category.png) - **Process Execution**: Upon running the process, the value of the data object will be `1`. -![image](images/sensitive_value.png) + ![image](/images/sensitive_value.png) #### 3. Setting Permissions with DMN Table @@ -108,7 +110,7 @@ Assign a category to this data object, such as `creditcards`. - `permissions` to `"DENY:read"` - `permission_urls` to `"/process-data/creditcards/"` -![image](images/setting_permissions.png) +![image](/images/setting_permissions.png) #### 4. Implementing Restricted Access @@ -116,3 +118,7 @@ With these permissions, access to the credit card data is denied to everyone, en By following these steps, SpiffWorkflow users can securely handle sensitive data within their processes. The combination of data objects, categorization, and precise permission settings ensures that sensitive information like credit card numbers is protected and accessible only to those with the necessary authorization. + +```{tags} reference, building_diagrams + +``` diff --git a/docs/Building_Diagrams/data_stores.md b/docs/reference/bpmn/data_stores.md similarity index 95% rename from docs/Building_Diagrams/data_stores.md rename to docs/reference/bpmn/data_stores.md index 02cd08db7..f22e0a217 100644 --- a/docs/Building_Diagrams/data_stores.md +++ b/docs/reference/bpmn/data_stores.md @@ -1,6 +1,6 @@ # Data Stores -![data_store](images/data_store.png) +![data_store](/images/data_store.png) A Data Store is a BPMN construct that represents a storage location where data is stored, retrieved, and can be accessed among multiple process instances, including different process models. It can represent a database, a file system, or any other storage mechanism. @@ -32,7 +32,7 @@ Here's how to depict such interactions using a BPMN example focused on movie dat ### BPMN Example: Movie Data Management #### Process Overview -![KKV data_store](images/DataStore_KKV.png) +![KKV data_store](/images/DataStore_KKV.png) 1. **Start Event**: Initiates the movie data management workflow. @@ -60,7 +60,7 @@ Here's how to depict such interactions using a BPMN example focused on movie dat 5. **End Event**: Marks the completion of the workflow. After running the process, you can view the new movie data in the data store: -![KKV data_store](images/DataStore_KKV_Store.png) +![KKV data_store](/images/DataStore_KKV_Store.png) #### Modeling Data Store Interactions @@ -103,7 +103,7 @@ This JSON array contains various Gatorade flavors, each with attributes for `nam #### BPMN Example: Gatorade Flavors -![JSON data_store](images/JSON_data_store.png) +![JSON data_store](/images/JSON_data_store.png) 1. **Start Event**: Triggers the workflow for Gatorade flavor selection. @@ -152,11 +152,14 @@ This JSON array contains various Gatorade flavors, each with attributes for `nam **Output**: -![JSON data_store](images/JSON_Data_Store_1.png) +![JSON data_store](/images/JSON_Data_Store_1.png) -![JSON data_store](images/DataStore_JSON_Output.png) +![JSON data_store](/images/DataStore_JSON_Output.png) ```{admonition} Note ⚠ In the data store creation, you will see fields like 'Name' and 'Identifier'. If you are using script tasks that interacts with the data store, reference the `identifier` exactly as it is named in the data store configuration. ``` By integrating a JSON data store within a BPMN process, workflows can dynamically manage and interact with structured data. + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/dmn.md b/docs/reference/bpmn/decision_tables.md similarity index 97% rename from docs/Building_Diagrams/dmn.md rename to docs/reference/bpmn/decision_tables.md index d272e56ca..48e237d32 100644 --- a/docs/Building_Diagrams/dmn.md +++ b/docs/reference/bpmn/decision_tables.md @@ -52,4 +52,7 @@ Expression for Range: - For values from 7 to 10 inclusive: 7 <= ? <= 10 - For values from 10 to 12 inclusive: 10 <= ? <= 12 -These expressions set up the conditions in a way that the DMN engine can clearly understand and process, ensuring that the workflow behaves as expected based on the input values. \ No newline at end of file +These expressions set up the conditions in a way that the DMN engine can clearly understand and process, ensuring that the workflow behaves as expected based on the input values. + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/error_events.md b/docs/reference/bpmn/error_events.md similarity index 73% rename from docs/Building_Diagrams/error_events.md rename to docs/reference/bpmn/error_events.md index cfccdef0b..ec971a00b 100644 --- a/docs/Building_Diagrams/error_events.md +++ b/docs/reference/bpmn/error_events.md @@ -8,29 +8,29 @@ Below, we delve into the types of Error Events, offering definitions and enriche ### 1. Error Start Event -![Error Start Event](images/error-events1.png) +![Error Start Event](/images/error-events1.png) -The Error Start Event triggers the start of a subprocess in reaction to an error identified in a different process or subprocess. +The Error Start Event triggers the start of a sub-process in reaction to an error identified in a different process or sub-process. It is a specialized event used to initiate error handling workflows dynamically. **Reason to Use**: -- **Modular Error Handling**: Separates error handling logic into dedicated subprocesses, improving process organization and maintainability. -- **Reusability**: Allows for the reuse of error-handling subprocesses across multiple parent processes. +- **Modular Error Handling**: Separates error handling logic into dedicated sub-processes, improving process organization and maintainability. +- **Reusability**: Allows for the reuse of error-handling sub-processes across multiple parent processes. - **Focused Recovery Strategies**: Enables the development of targeted recovery strategies for specific errors, enhancing error resolution effectiveness. **Example**: -![](images/Start_event_error_example.png) +![](/images/Start_event_error_example.png) -In an automated supply chain system, an Error Start Event initiates a "Supplier Notification" subprocess when inventory restocking fails due to supplier issues, triggering actions such as alternative supplier selection and impact analysis. +In an automated supply chain system, an Error Start Event initiates a "Supplier Notification" sub-process when inventory restocking fails due to supplier issues, triggering actions such as alternative supplier selection and impact analysis. ```{admonition} Note -⚠ The start event needs to be in an **event subprocess** to be selected. +⚠ The start event needs to be in an **event sub-process** to be selected. ``` ### 2. Error Intermediate Event/Error Boundary Event -![Error Intermediate Event](images/error_intermediate_event.png) +![Error Intermediate Event](/images/error_intermediate_event.png) An Error Boundary Event is attached to an activity, such as a service task, and is designed to catch errors that occur during the execution of that activity, allowing for an immediate transition to an error handling flow. @@ -39,12 +39,12 @@ Positioned within the normal flow of a process, this event signifies where an er **Reason to Use**: - **Error Escalation**: Facilitates the escalation of critical errors that cannot be resolved within the current process context. - **Process Integrity**: Maintains the integrity of the business process by preventing the continuation of flawed executions. -- **Comprehensive Error Management**: Ensures that unresolvable errors within subprocesses are properly managed. +- **Comprehensive Error Management**: Ensures that unresolvable errors within sub-processes are properly managed. - **Clarity in Process Design**: Enhances the readability and understandability of the process model by explicitly marking potential error points. **Example**: -![Error Boundary Event Error Event](images/error_boundary_event.png) +![Error Boundary Event Error Event](/images/error_boundary_event.png) In a customer order workflow, when payment is initiated, a "Process Payment" service task interacts with an external gateway. An attached Error Boundary Event catches errors like "Payment Gateway Timeout" or "Payment Declined." @@ -53,7 +53,7 @@ This setup ensures efficient error handling, guiding the process toward resoluti ### 3. Error End Event -![Error End Event](images/error_end_event.png) +![Error End Event](/images/error_end_event.png) This event marks the termination of a process path due to an error, signaling that the workflow cannot proceed beyond this point due to the encountered issue, and propagates the error to the parent process for further handling. @@ -64,9 +64,9 @@ This event marks the termination of a process path due to an error, signaling th **Example**: -![Error End Event](images/ErrorEndEventExample.png) +![Error End Event](/images/ErrorEndEventExample.png) -In a retail inventory management workflow, an End Error Event within a stock replenishment subprocess indicates the detection of an "Out of Stock" condition for a critical product that cannot be immediately resolved. +In a retail inventory management workflow, an End Error Event within a stock replenishment sub-process indicates the detection of an "Out of Stock" condition for a critical product that cannot be immediately resolved. This error propagates to the main inventory management process, prompting a temporary pause in sales operations for the affected product. ## Example 1: Error Boundary Events in SpiffArena @@ -78,13 +78,13 @@ This process begins with a simple task and moves through a service task designed 1. **Start Event**: -![Error Event](images/error_event_example1.png) +![Error Event](/images/error_event_example1.png) The process kicks off with an action that requires fetching specific employee details. 2. **Service Task - Fetch Employee Data**: -![Error Event](images/error_event_example2.png) +![Error Event](/images/error_event_example2.png) - **Configuration**: This task is configured to make an HTTP GET request to the BambooHR API to retrieve employee information. - **Operator ID**: `http/getrequestV2`, indicating the operation type and version. @@ -94,20 +94,20 @@ The process kicks off with an action that requires fetching specific employee de 3. **Error Handling Setup**: -![Error Event](images/error_event_example3.png) +![Error Event](/images/error_event_example3.png) Prior to the service task's execution, one potential error ID is defined as `Error_1`. 4. **Error Boundary Event**: -![Error Event](images/error_event_example5.png) +![Error Event](/images/error_event_example5.png) Attached to the service task, this event catches `Error_1`, setting an alternative path for error handling. The error details are stored in a variable named `err1`. 5. **Manual Tasks for Error Handling and Success Path**: -![Error Event](images/error_event_example6.png) +![Error Event](/images/error_event_example6.png) **A**. **No Errors Path**: If the service task executes without encountering the predefined errors, the process flows to a **Manual task 1** where the fetched employee data can be further processed or reviewed. @@ -126,63 +126,66 @@ Concurrently, the successful execution path without errors would lead directly t This BPMN example highlights the utility of Error Boundary Events in ensuring process resilience, especially when integrating external services. -## Example 2: Error Boundary Events in Subprocess +## Example 2: Error Boundary Events in Sub-process -In this example, we're outlining a BPMN process that demonstrates how to handle errors within an expanded subprocess and subsequently manage the error through an Error Boundary Event. +In this example, we're outlining a BPMN process that demonstrates how to handle errors within an expanded sub-process and subsequently manage the error through an Error Boundary Event. ### Process Description: 1. **Start Event**: -![Error Event](images/error_boundary_event_with_expanded-subprocess1.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess1.png) The process is triggered by a user action or system event, setting the stage for a sequence of tasks. -2. **Expanded Subprocess**: +2. **Expanded Sub-process**: -![Error Event](images/error_boundary_event_with_expanded-subprocess2.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess2.png) This element encapsulates a more detailed process flow within itself, starting with its own Start Event and comprising several tasks. -The **Start Event** marks the beginning of the subprocess. -Next, the **Manual Task 1** represents an initial activity within the subprocess that could be anything from data entry to review by a human operator. +The **Start Event** marks the beginning of the sub-process. +Next, the **Manual Task 1** represents an initial activity within the sub-process that could be anything from data entry to review by a human operator. Then the Error End Event is used to throw an error within the process. The setup of the error end event is: - **Error ID Setup** -![Error Event](images/error_boundary_event_with_expanded-subprocess6.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess6.png) Before proceeding further, an error ID (Error1) is defined in the process. - **Configure Properties**: -![Error Event](images/error_boundary_event_with_expanded-subprocess3.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess3.png) Configured to represent the occurrence of Error1, with an error code "Err1" and a payload detailing the error message (`{ "err_msg" : "Error Occurred"}`). 3. **Error Boundary Event**: -![Error Event](images/error_boundary_event_with_expanded-subprocess4.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess4.png) -Attached to the Expanded Subprocess, an Error Boundary Event is designed to catch Error1 emanating from the subprocess, particularly from the Error End Event. +Attached to the Expanded Sub-process, an Error Boundary Event is designed to catch Error1 emanating from the sub-process, particularly from the Error End Event. The error caught is identified by the code "Err1", and its details are captured in a variable named `message`. 4. **Manual Task** -![Error Event](images/error_boundary_event_with_expanded-subprocess5.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess5.png) **Manual Task 2** is attached to this Error Boundary Event, with its instructions including the usage of the error message payload (`{{msg}}`), indicating a step to address or respond to the error condition. -5. **End Events for Expanded Subprocess**: +5. **End Events for Expanded Sub-process**: -![Error Event](images/error_boundary_event_with_expanded-subprocess7.png) +![Error Event](/images/error_boundary_event_with_expanded-subprocess7.png) -**A**. Beyond the boundary event's error handling path, the subprocess connects to a main End Event, indicating the normal conclusion of the subprocess activities if no errors occur. +**A**. Beyond the boundary event's error handling path, the sub-process connects to a main End Event, indicating the normal conclusion of the sub-process activities if no errors occur. **B**. An End Event follows Manual Task 2, suggesting the conclusion of the error handling path with specific actions taken based on the error encountered. -This example demonstrates the utility of expanded subprocesses for detailed internal workflows, coupled with Error Boundary Events for effective error detection and handling, ensuring processes remain uninterrupted and resilient against anticipated issues. +This example demonstrates the utility of expanded sub-processes for detailed internal workflows, coupled with Error Boundary Events for effective error detection and handling, ensuring processes remain uninterrupted and resilient against anticipated issues. ### Conclusion Error Events in BPMN offer a nuanced approach to managing errors within business processes. By defining Error Start, End, and Boundary Events, BPMN provides process designers with the tools necessary to anticipate, signal, and handle errors efficiently. + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/escalation_events.md b/docs/reference/bpmn/escalation_events.md similarity index 85% rename from docs/Building_Diagrams/escalation_events.md rename to docs/reference/bpmn/escalation_events.md index c0e512eb7..6737cdb40 100644 --- a/docs/Building_Diagrams/escalation_events.md +++ b/docs/reference/bpmn/escalation_events.md @@ -1,4 +1,4 @@ -# Escalation Event +# Escalation Events An Escalation Event in BPMN symbolizes a situation where an issue or condition within a process requires attention at a higher level or a different domain. This event acts as a mechanism to raise awareness or invoke intervention. @@ -10,23 +10,23 @@ An escalation represents a one-to-one relationship, whereas a signal event embod **Reasons to Use an Escalation Event:** -- Communicate to a subprocess or an upper (parent) process +- Communicate to a sub-process or an upper (parent) process - Provide a structured way to handle exceptions, ensuring processes remain fluid despite interruptions ## Start Escalation Event -![start_escalation_event](images/start_escalation_event.png)![non_interrupting_start_escalation_event](images/non_interrupting_start_escalation_event.png) +![start_escalation_event](/images/start_escalation_event.png)![non_interrupting_start_escalation_event](/images/non_interrupting_start_escalation_event.png) A Start Escalation Event indicates the beginning of a sub-process, triggered explicitly by an escalation from another process or activity. ```{admonition} Note ⚠ Escalation Events are typically used in scenarios where the standard process flow is disrupted, and involvement from other actors becomes essential for resolution. -They are mostly used to communicate from a subprocess to an upper process. +They are mostly used to communicate from a sub-process to an upper process. ``` **Example:** -![start_escalation_example](images/start_escalation_example_1.png) +![start_escalation_example](/images/start_escalation_example_1.png) **Escalation Start Event (interrupting):** In a production environment, if a machine malfunctions frequently or requires calibration, the issue might be escalated to a specialized technical team. @@ -40,7 +40,7 @@ It allows for parallel processing to allow the process to continue seamlessly to ## Intermediate Escalation Event -![intermediate_escalation_event](images/intermediate_escalation_throw_event.png)![intermediate_escalation_event](images/intermediate_escalation_catch_event.png)![intermediate_escalation_event](images/non_interrupting_intermediate_escalation_event.png) +![intermediate_escalation_event](/images/intermediate_escalation_throw_event.png)![intermediate_escalation_event](/images/intermediate_escalation_catch_event.png)![intermediate_escalation_event](/images/non_interrupting_intermediate_escalation_event.png) An Intermediate Escalation Event serves as a mechanism within a process flow to raise an escalation. This could be due to an exception, a delay, or any condition that requires intervention. @@ -48,7 +48,7 @@ As a Boundary Event, it can also be associated with specific tasks or sub-proces **Example:** -![escalation_intermediate_example_2](images/escalation_example_2.png) +![escalation_intermediate_example_2](/images/escalation_example_2.png) In the same BPMN scenario, escalations can be managed at a higher level in the process hierarchy through a boundary escalation event. This method involves placing the escalation event on the border of the parent process activity. @@ -68,18 +68,18 @@ This parallel processing ensures that there are two active instances within the **Example:** -![escalation_intermediate_example_2](images/escalation_example_3.png) +![escalation_intermediate_example_2](/images/escalation_example_3.png) **Escalation Boundary Event (interrupting):** -In the given scenario, utilizing a subprocess can lead to the desired outcome similarly. +In the given scenario, utilizing a sub-process can lead to the desired outcome similarly. A gateway is used to assess whether a machine needs calibration. -With only one potential result from this evaluation—calibration being necessary—the escalation event is captured at the boundary of the subprocess. +With only one potential result from this evaluation—calibration being necessary—the escalation event is captured at the boundary of the sub-process. In this case, since there is a single active process instance, the non-interrupting characteristic of the event does not impact the process's flow. **Escalation Boundary Event (non-interrupting):** In a subsequent setup, a parallel gateway launches two simultaneous paths. While one path proceeds with the shipment as usual, the other leverages parallel processing to update the customer. -The update is facilitated through a non-interrupting boundary event within a subprocess, which ensures the shipment process continues uninterrupted. +The update is facilitated through a non-interrupting boundary event within a sub-process, which ensures the shipment process continues uninterrupted. ```{admonition} Note ⚠ The same end result was achieved by three different use cases for the escalation events. @@ -88,7 +88,7 @@ The choice of event type should be based on the particular application and conte ## End Escalation Event -![intermediate_escalation_event](images/end_escalation_event.png) +![intermediate_escalation_event](/images/end_escalation_event.png) In our earlier examples, we demonstrated how to use throw and catch events. The End Escalation event functions similarly to the Intermediate Throw Escalation event, with the key distinction being its occurrence at the end of a particular pathway. @@ -97,7 +97,7 @@ Particularly in scenarios involving non-interrupting events, the process instanc **Example:** -![escalation_intermediate_example_2](images/escalation_example_4.png) +![escalation_intermediate_example_2](/images/escalation_example_4.png) In this scenario, we observe an End Escalation following a Boundary Event. This thrown End Escalation can be intercepted by the boundary event of a Call Activity or at the start of a sub-process, as shown in previous examples on this page. @@ -113,7 +113,7 @@ Here's how to set up these components: **Define the Escalation ID**: Determine the task or process stage where an escalation might need to be triggered due to exceptional circumstances and decide on a unique identifier for your escalation event. -![Escalation ID](images/Escalation_ID.png) +![Escalation ID](/images/Escalation_ID.png) ```{admonition} Note ⚠ In the above example, the escalation ID is created with `Escalation_Throw_1`. @@ -123,7 +123,7 @@ Here's how to set up these components: Add an Intermediate Throw Escalation Event immediately after the task identified. Select the escalation ID and create a unique **escalation code**. -![Escalation Order](images/Escalation_Order.png) +![Escalation Order](/images/Escalation_Order.png) ```{admonition} Note ⚠ The escalation code is essential for matching the throw event with its corresponding catch event. @@ -136,7 +136,7 @@ This can be a boundary event attached to a task where the escalation should be c For a boundary catch event, attach it to the task designated to handle the escalation. For an intermediate catch event, place it at the appropriate point in the process flow. -![Escalation Order](images/Escalation_Order_2.png) +![Escalation Order](/images/Escalation_Order_2.png) ```{admonition} Note ⚠ Ensure this matches exactly with the code assigned to the throw event to ensure proper linkage. @@ -150,3 +150,6 @@ You may need to set additional properties for the escalation event, such as: - **Documentation**: Providing details on when the escalation should be triggered and how it should be handled. After setting up the escalation event, test the workflow to ensure the escalation is triggered under the right conditions and that the catch event handles it as expected. + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/events.md b/docs/reference/bpmn/events.md similarity index 90% rename from docs/Building_Diagrams/events.md rename to docs/reference/bpmn/events.md index 8e62dc3b4..df864af5c 100644 --- a/docs/Building_Diagrams/events.md +++ b/docs/reference/bpmn/events.md @@ -4,7 +4,7 @@ Events are specific occurrences that dictate the flow or outcome of processes. They are visually represented by circles. Based on their position and function, events are categorized as: Start Events, Intermediate Events, or End Events. -![start_message_event](images/events_categories.png) +![start_message_event](/images/events_categories.png) Start Events initialize a process and have no incoming flows. Intermediate Events represent something happening during the process and can have both incoming and outgoing flows. @@ -25,15 +25,15 @@ End Events signify the conclusion of a process and don't have outgoing flows. We will delve into the various event types, exploring their categorizations and applications. It's vital to note that not every type of event is suitable for all variations; there are specific rules and guidelines governing their use. As highlighted in the table, there are distinct limitations. -For instance, while you cannot initiate a primary process with an escalation event, it's entirely permissible to kickstart a subprocess with such an event. +For instance, while you cannot initiate a primary process with an escalation event, it's entirely permissible to kickstart a sub-process with such an event. To adhere to BPMN standards, it's crucial to consult and follow the provided guide. Always ensure that your processes and diagrams conform to these accepted norms. -![events_table](images/events_table.png) +![events_table](/images/events_table.png) ## Start Event -![start_event_t](images/start_event_t.png) +![start_event_t](/images/start_event_t.png) Start events signify the beginning of a specific process and can consist of catch, timer, or conditional events. They do not possess any incoming sequence flows. @@ -46,7 +46,7 @@ They do not possess any incoming sequence flows. ## Intermediate Event -![intermediate_event](images/intermediate_event.png) +![intermediate_event](/images/intermediate_event.png) An Intermediate Event takes place between the beginning and the conclusion of a process. They can either wait for a specific occurrence (such as receiving a message), initiate an occurrence (like dispatching a message), or pause until a condition is fulfilled or a designated time elapses. @@ -62,7 +62,7 @@ They can either wait for a specific occurrence (such as receiving a message), in ## End Event -![intermediate_throw_message_event](images/end_event.png) +![intermediate_throw_message_event](/images/end_event.png) End events signify the end of a particular process. Once this event is reached, the process stops, and no further activities within this process will be executed. @@ -81,7 +81,7 @@ Non-Interrupting Events allow the current process or activity to continue its ex ### Interrupting Events -![interrupting_group](images/interrupting_group.png) +![interrupting_group](/images/interrupting_group.png) When an interrupting event is triggered, it interrupts the flow of the process or activity it's attached to. Once triggered, the current activity or process is halted, and the process flow directed by the interrupting event is taken up. @@ -91,7 +91,7 @@ Once triggered, the current activity or process is halted, and the process flow - In the case of an error, where the current activity cannot proceed further and an exception flow needs to be initiated. - When an alternative flow should immediately replace the main flow, like when a timer goes off, indicating a timeout. -![interrupting_example](images/interrupting_example.png) +![interrupting_example](/images/interrupting_example.png) **Example:** Think of a scenario where a manager is given a specific duration to assess a request. @@ -101,7 +101,7 @@ The provided example demonstrates the same function, but one is with an interrup ### Non-Interrupting Events -![non-interrupting_group](images/non-interrupting_group.png) +![non-interrupting_group](/images/non-interrupting_group.png) When a Non-Interrupting event is triggered, it does not halt or disrupt the main activity it's attached to. Instead, the process or activity continues its execution in parallel with the event's associated flow. @@ -111,7 +111,7 @@ Instead, the process or activity continues its execution in parallel with the ev - To initiate parallel activities without disturbing the primary flow, like sending periodic reminders while still waiting for a main task to complete. - When you want to monitor situations without interrupting the main flow, such as watching for specific signals or messages. -![interrupting_example](images/non-interrupting_example.png) +![interrupting_example](/images/non-interrupting_example.png) **Example:** Consider the previous example, but instead of terminating the initial review task when the time elapses, a Non-Interrupting Event is triggered, creating another thread. @@ -127,7 +127,7 @@ Catch Events passively wait or listen for messages, signals, or events to be rec ## Throw Event -![throw_events](images/throw_events.png) +![throw_events](/images/throw_events.png) Throw events are used to "send" or "throw" a particular type of event. In BPMN, when we talk about a throw event, we're generally discussing an activity or a situation where a specific signal, message, or error is being generated or sent out. @@ -144,7 +144,7 @@ They wait for signals to guide them towards an alternative route, whether it's i - To signal an error in a particular part of the process. - To indicate the raising or sending of a specific event or signal to other parts of the process or even to other processes. -![throw_example](images/throw_example.png) +![throw_example](/images/throw_example.png) **Example:** Imagine a situation where, as soon as the manufacturing of an item begins, a signal is sent to trigger a notification to another department or a customer. @@ -154,7 +154,7 @@ It's crucial to recognize that there are numerous approaches to catching or rece ## Catch Event -![catch_events](images/catch_events.png) +![catch_events](/images/catch_events.png) Catch events are used to "receive" or "catch" a particular type of event. In BPMN, when we refer to a catch event, we're talking about a point in the process where it's waiting for or listening to a specific event from another process or activity. @@ -171,7 +171,7 @@ They serve as triggers to initiate subsequent processes or actions. - To catch or handle an error. - To wait for a specific signal or event to be triggered before proceeding. -![catch_example](images/catch_example.png) +![catch_example](/images/catch_example.png) **Example:** The reception of an event can take place in various ways. @@ -186,7 +186,7 @@ Boundary and Non-Boundary Events are pivotal in determining how certain events a ### Boundary Event -![boundary_event](images/boundary_event.png) +![boundary_event](/images/boundary_event.png) Boundary events are attached to specific activities in a BPMN diagram, representing something that could happen while the activity is being executed. If the boundary event gets triggered, it can interrupt or not interrupt the attached activity, depending on its type. @@ -197,18 +197,18 @@ If the boundary event gets triggered, it can interrupt or not interrupt the atta - To capture intermediate events that can interrupt (or sometimes not interrupt) the main flow of an activity. - To depict certain conditions under which the process should take an alternative path. -![boundary_example](images/boundary_example.png) +![boundary_example](/images/boundary_example.png) **Example:** In our initial scenario where a manager needs to approve or review a submission, employing a timer as a start event impacts the entire workflow. This implies that if this timer is triggered, a different process will kick off, regardless of where the main process currently stands. -On the other hand, when we utilize boundary events, we can confine the timer's influence to a specific task, subprocess, or call-activity. -This approach grants us greater precision over the timer's scope, as it only applies to the particular task or subprocess it's linked to, and the timer only initiates when the first task within its designated scope begins. +On the other hand, when we utilize boundary events, we can confine the timer's influence to a specific task, sub-process, or call-activity. +This approach grants us greater precision over the timer's scope, as it only applies to the particular task or sub-process it's linked to, and the timer only initiates when the first task within its designated scope begins. Note that a boundary event can be interrupting or non-interrupting. ## Non-Boundary Event -![non-boundary_event](images/non-boundary_event.png) +![non-boundary_event](/images/non-boundary_event.png) Non-boundary Events stand alone in the BPMN process flow. They aren't attached to any activity, and they represent something that happens between activities. @@ -219,7 +219,7 @@ Unlike boundary events that are attached to tasks or sub-processes. - To depict events that occur independently of specific activities, such as timers or messages that are awaited. - To showcase events that affect the current flow but aren't tied to a particular task or activity. -![non-boundary_event_example](images/non-boundary_event_example.png) +![non-boundary_event_example](/images/non-boundary_event_example.png) **Example:** @@ -237,3 +237,7 @@ A message, much like a signal, will only be caught in an intermediate event if t ```{admonition} Note ⚠ Remember the key distinction between signals and message events is that while messages adhere to a one-to-one correspondence, signals can potentially relate to multiple recipients in a one-to-many fashion. ``` + +```{tags} reference, building_diagrams + +``` diff --git a/docs/Building_Diagrams/exclusivegatewayexample.md b/docs/reference/bpmn/exclusive_gateways_example.md similarity index 50% rename from docs/Building_Diagrams/exclusivegatewayexample.md rename to docs/reference/bpmn/exclusive_gateways_example.md index d676b214f..ca93ec6aa 100644 --- a/docs/Building_Diagrams/exclusivegatewayexample.md +++ b/docs/reference/bpmn/exclusive_gateways_example.md @@ -7,59 +7,68 @@ This example demonstrates the use of an Exclusive Gateway to manage conditional ## Process Steps -![User Task](images/exclusivegatewayexample.png) +![User Task](/images/exclusivegatewayexample.png) 1. **User Task: Show User Form** -![User Task](images/exclusivegatewayexample1.png) +![User Task](/images/exclusivegatewayexample1.png) + - **Purpose**: Captures user data which influences pathway decisions. - **Form Configuration**: - ```json - { - "title": "First Name Required", - "type": "object", - "required": ["firstName"], - "properties": { - "firstName": { - "type": "string", - "title": "First name", - "default": "Chuck" - } - } - } - ``` - - **Role**: Collects inputs that determine the execution path through the Exclusive Gateway. + + ```json + { + "title": "First Name Required", + "type": "object", + "required": ["firstName"], + "properties": { + "firstName": { + "type": "string", + "title": "First name", + "default": "Chuck" + } + } + } + ``` + + - **Role**: Collects inputs that determine the execution path through the Exclusive Gateway. 2. **Exclusive Gateway**: Evaluates the `firstName` property from the form to decide the subsequent pathway. - **Sequence Flows**: + **Sequence Flows**: - **a**. **Others**: Leads to a general greeting for users not named "Chuck." + **a**. **Others**: Leads to a general greeting for users not named "Chuck." - ![Sequence Flows](images/exclusivegatewayexample3.png) - - **For 'Others' Sequence Flow**: - - **Condition Expression**: `firstName != "Chuck"` - - Goes to **Manual Task**: "Hello to Others" displays a greeting to non-Chuck users. + ![Sequence Flows](/images/exclusivegatewayexample3.png) - **b**. **Chuck**: Directs to a personalized greeting for users named "Chuck." + **For 'Others' Sequence Flow**: - ![Sequence Flows](images/exclusivegatewayexample4.png) - - **For 'Chuck' Sequence Flow**: - - **Condition Expression**: `firstName == "Chuck"` - - Goes to **Manual Task**: "Hi to Chuck" delivers a custom greeting to users named Chuck. + - **Condition Expression**: `firstName != "Chuck"` + - Goes to **Manual Task**: "Hello to Others" displays a greeting to non-Chuck users. + + **b**. **Chuck**: Directs to a personalized greeting for users named "Chuck." + + ![Sequence Flows](/images/exclusivegatewayexample4.png) + + **For 'Chuck' Sequence Flow**: + + - **Condition Expression**: `firstName == "Chuck"` + - Goes to **Manual Task**: "Hi to Chuck" delivers a custom greeting to users named Chuck. 3. **Exclusive Gateway Merge**: Merges the paths from manual tasks: "Hello to Others" and "Hi to Chuck," continuing to the next unified step in the process. -![Exclusive Gateway Merge](images/exclusivegatewayexample5.png) +![Exclusive Gateway Merge](/images/exclusivegatewayexample5.png) 4. **Manual Task: Show End Message**: Concludes the interaction by displaying a closing message and displays "Thank you for your participation, {{firstName}}." -![Exclusive Gateway Merge](images/exclusivegatewayexample6.png) +![Exclusive Gateway Merge](/images/exclusivegatewayexample6.png) After the manual task, marks the completion of the process through the end event. Therefore, Exclusive Gateways are critical in BPMN for managing decisions within the workflow that require conditional logic based on user input or other process variables. They ensure that the process flow is correctly directed based on specific conditions, preventing incorrect executions and ensuring that the process adapts dynamically to varying inputs. + +```{tags} tutorial, building_diagrams + +``` diff --git a/docs/Building_Diagrams/gateways.md b/docs/reference/bpmn/gateways.md similarity index 85% rename from docs/Building_Diagrams/gateways.md rename to docs/reference/bpmn/gateways.md index c05923693..771be9d48 100644 --- a/docs/Building_Diagrams/gateways.md +++ b/docs/reference/bpmn/gateways.md @@ -14,7 +14,7 @@ Gateways are used to evaluate conditions or rules and determine the appropriate ## Exclusive Gateway -![exclusive_gateway](images/exclusive_gateway.png) +![exclusive_gateway](/images/exclusive_gateway.png) Exclusive Gateway (XOR): An Exclusive Gateway represents a decision point where only one outgoing sequence flow can be taken. It is used when the process flow needs to make a mutually exclusive choice between different paths. @@ -26,14 +26,14 @@ Whenever the conditions on the other paths aren't met, the instance will proceed In other words, if none of the conditions for the outgoing sequence flows are met, the Default Flow provides an alternative route for the process to follow. This ensures that the process can still progress even if none of the explicitly defined conditions are satisfied, providing a fallback option for handling unexpected scenarios. -![exclusive_gateway_default](images/exclusive_gateway_default.png) +![exclusive_gateway_default](/images/exclusive_gateway_default.png) **Challenges:** Avoiding conflicting conditions is straightforward when evaluating only one variable that can have only one value (see image 1 below). However, with more complex conditions, it's crucial to carefully structure logical expressions ensuring that only one condition can be true at a time. This becomes especially important when dealing with multiple variables or scenarios that could potentially lead to conflicting conditions. -![exclusive_gateway_examples](images/exclusive_gateway_examples.png) +![exclusive_gateway_examples](/images/exclusive_gateway_examples.png) For example, consider a scenario where multiple variables are involved in a process, and it's possible for more than one variable to be true in the process context (see image 2 above). To guarantee that only one condition will be true, you can use additional expressions, such as "voucher == false" to specify distinct paths for each condition. @@ -50,18 +50,18 @@ When the process encounters the Exclusive Merge, only one of the incoming sequen While the Exclusive Merge is commonly used alongside the Exclusive Gateway, it is also compatible with other gateway types in BPMN. It serves as a valuable mechanism for synchronizing and consolidating multiple parallel paths, ensuring that only one path is followed based on the given conditions. -![exclusive_merge](images/exclusive_merge.png) +![exclusive_merge](/images/exclusive_merge.png) Check out this detailed exclusive gateway example: ```{toctree} :maxdepth: 1 -exclusivegatewayexample.md +exclusive_gateways_example ``` ## Inclusive Gateway -![inclusive_gateway](images/inclusive_gateway.png) +![inclusive_gateway](/images/inclusive_gateway.png) Inclusive Gateway (OR): Represents a decision point, but it allows multiple outgoing sequence flows to be taken. It is used when the process flow needs to make an inclusive choice, where multiple paths can be followed simultaneously. @@ -71,13 +71,13 @@ Each outgoing sequence flow can have a condition associated with it, but even if ⚠ Note that the Default Flow is only followed if no other outgoing flows are valid. ``` -![inclusive_gateway_mp](images/inclusive_gateway_mp.png) +![inclusive_gateway_mp](/images/inclusive_gateway_mp.png) **Challenges:** At least one path should be true for the process to continue. Unlike an Exclusive Gateway, where only one path can be taken based on the conditions, the Inclusive Gateway evaluates all incoming sequence flows and enables all the paths for which the conditions are met. -![inclusive_gateway_conditions](images/inclusive_gateway_conditions.png) +![inclusive_gateway_conditions](/images/inclusive_gateway_conditions.png) For example, in a career matching system, individuals can input their skill sets, educational qualifications, and work experience. An Inclusive Gateway can be employed to assess the compatibility of the individual's skill sets with various job roles. @@ -91,7 +91,7 @@ The purpose of an Inclusive Gateway merge is to consolidate multiple parallel pa Unlike an Exclusive Gateway merge, which selects only one path based on conditions, the Inclusive Gateway merge evaluates all incoming sequence flows and allows all paths with true conditions to proceed. This means that if multiple paths were activated during the parallel execution, all these paths will converge. -![inclusive_gateway_merge](images/inclusive_gateway_merge.png) +![inclusive_gateway_merge](/images/inclusive_gateway_merge.png) It's important to note that the use of an Inclusive Gateway and its corresponding merge is not mandatory in a process. They can be used independently, depending on the specific scenario and process requirements. @@ -100,12 +100,12 @@ Similarly, the Inclusive Gateway merge can be used without an Inclusive Gateway ```{toctree} :maxdepth: 1 -inclusivegatewayexample.md +inclusive_gateway_example ``` ## Parallel Gateway -![parallel_gateway](images/parallel_gateway.png) +![parallel_gateway](/images/parallel_gateway.png) Parallel Gateway (AND): Is used to split the process flow into multiple parallel paths, allowing concurrent execution of activities. All outgoing sequence flows from a Parallel Gateway are taken simultaneously, and the process flow continues along all the paths simultaneously. @@ -118,7 +118,7 @@ This means that tasks or activities connected to the outgoing sequence flows wil ⚠ Note that Default Flow is not possible with Parallel Gateways. ``` -![parallel_gateways](images/parallel_gateways.png) +![parallel_gateways](/images/parallel_gateways.png) **Challenges:** Since a Parallel Gateway does not dictate the flow based on conditions, it avoids conflicts that may arise from complex decision-making logic. @@ -132,12 +132,12 @@ Check out this detailed parallel gateway example: ```{toctree} :maxdepth: 1 -parallelgatewayexample.md +parallel_gateways_example ``` ## Event-Based Gateway -![event_based_gateway](images/event_based_gateway.png) +![event_based_gateway](/images/event_based_gateway.png) Event-Based Gateway: An Event-Based Gateway is used to represent a branching point based on events occurring in the process. It is often associated with intermediate events in the process flow. @@ -154,9 +154,9 @@ It's also crucial to understand that conditions aren't required for incoming seq | 💻 Form | ⌨ Field Input | 📝 Description | | ------------------------------------------------------ | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -| ![name_field](images/name_field.png) | **Name:** Update Customer Information | A descriptive name given to the element, providing a human-readable label or title. | -| ![id_field](images/id_field.png) | **ID:** Example - updateCustomerInformation | An identifier used to uniquely identify the element within the BPMN model. | -| ![documentation_field](images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | +| ![name_field](/images/name_field.png) | **Name:** Update Customer Information | A descriptive name given to the element, providing a human-readable label or title. | +| ![id_field](/images/id_field.png) | **ID:** Example - updateCustomerInformation | An identifier used to uniquely identify the element within the BPMN model. | +| ![documentation_field](/images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | **Outgoing Sequence:** @@ -166,4 +166,6 @@ It's also crucial to understand that conditions aren't required for incoming seq | 💻 Form | ⌨ Field Input | 📝 Description | | ------------------------------------ | ---------------------------------------------- | ------------------------------------------------------------------------------------- | -| ![conditions](images/conditions.png) | **Condition:** payment_method == "credit_card" | Python expression. Note that multiple conditions can be strung together using AND/OR. | +| ![conditions](/images/conditions.png) | **Condition:** payment_method == "credit_card" | Python expression. Note that multiple conditions can be strung together using AND/OR. | + +**Keywords**: reference, building_diagrams, dev_docs diff --git a/docs/Building_Diagrams/inclusivegatewayexample.md b/docs/reference/bpmn/inclusive_gateway_example.md similarity index 94% rename from docs/Building_Diagrams/inclusivegatewayexample.md rename to docs/reference/bpmn/inclusive_gateway_example.md index 2a426e8de..67efb7ad1 100644 --- a/docs/Building_Diagrams/inclusivegatewayexample.md +++ b/docs/reference/bpmn/inclusive_gateway_example.md @@ -4,11 +4,11 @@ This BPMN example outlines the process of making travel arrangements using an in ## Process Flow -![Inclusive Gateway Example](images/inclusive_gateway_example.png) +![Inclusive Gateway Example](/images/inclusive_gateway_example.png) 1. **User Task: Get Travel Information**: The user task collects the travel preferences of the user regarding different modes of transportation. - ![Inclusive Gateway Example 1](images/inclusive_gateway_example1.png) + ![Inclusive Gateway Example 1](/images/inclusive_gateway_example1.png) **Form Details**: ```json @@ -54,3 +54,5 @@ This inclusive gateway setup is ideal for scenarios where multiple actions might By employing inclusive gateways, the process adapts dynamically to the user's specific needs without requiring separate processes or redundant tasks for different combinations of travel modes. +```{tags} explanation, building_diagrams +``` diff --git a/docs/reference/bpmn/index.md b/docs/reference/bpmn/index.md new file mode 100644 index 000000000..4490b9a47 --- /dev/null +++ b/docs/reference/bpmn/index.md @@ -0,0 +1,22 @@ +# Elements of BPMN + +This section provides detailed information about the various elements used in Business Process Model and Notation (BPMN) diagrams within SpiffWorkflow. + +```{toctree} +:maxdepth: 1 +gateways.md +events.md +message_events +signal_events +timer_events +escalation_events +conditional_events +error_events.md +script_tasks.md +service_tasks.md +subprocesses_and_call_activities +data.md +multiinstance_tasks +decision_tables +pools_and_lanes.md +``` diff --git a/docs/Building_Diagrams/message_events.md b/docs/reference/bpmn/message_events.md similarity index 62% rename from docs/Building_Diagrams/message_events.md rename to docs/reference/bpmn/message_events.md index aa2ed5a02..54fc573c8 100644 --- a/docs/Building_Diagrams/message_events.md +++ b/docs/reference/bpmn/message_events.md @@ -1,10 +1,10 @@ -# Message Event +# Message Events A Message Event acts as a channel for the exchange of information between different process participants or external systems. While it might be tempting to associate "message events" with emails, their scope extends beyond digital correspondence. They signify the transmission of information between various process components, whether within the same process or across different processes. -![message_relationship](images/relationship_message.png) +![message_relationship](/images/relationship_message.png) **Reasons to Use a Message Event:** @@ -15,11 +15,11 @@ They signify the transmission of information between various process components, ## Start Message Event -![start_message_event](images/start_message_event_1.png) +![start_message_event](/images/start_message_event_1.png) A Message Start Event serves as a starting point for a process, activated specifically by a message received from another process or external system. -![message_event_example_4](images/msg_event_example_3.png) +![message_event_example_4](/images/msg_event_example_3.png) In the given example, a process can be initiated either by a message from an external system or by capturing a throw event from another process. @@ -29,26 +29,26 @@ In a subsequent example, it's clarified that message events can span multiple BP ## Intermediate Message Throw Event -![intermediate_throw_message_event](images/intermediate_throw_msg_event.png) +![intermediate_throw_message_event](/images/intermediate_throw_msg_event.png) An Intermediate Throw Event sends a message from within the process to a receiver. When the process execution reaches this event, it triggers a message event that can be captured by a corresponding Message Catch Event in another process or by an external system. -![message_event_example_4](images/msg_event_example_2.png) +![message_event_example_4](/images/msg_event_example_2.png) In the example provided, once a quote is finalized, the sales team forwards a formal quotation. Similarly, upon receiving a purchase order from the customer, the sales department generates an order confirmation receipt and sends it to the customer. ## Intermediate Message Catch Event -![intermediate_catch_message_event](images/intermediate_catch_msg_event.png) +![intermediate_catch_message_event](/images/intermediate_catch_msg_event.png) An Intermediate Catch Event is used to wait for and capture a specific message from another source. Once activated upon receiving the designated message, it allows the process flow to continue from that point onward. It's crucial to understand that the process instance remains in a waiting state until triggered by another source or process. This fundamental distinction sets Intermediate Catch Events apart from Intermediate Throw Events, as Catch Events exclusively await external triggers, while Throw Events initiate those triggers. -![message_event_example_5](images/msg_event_example_5.png) +![message_event_example_5](/images/msg_event_example_5.png) Alternatively, Message Events can be utilized beyond the confines of pools and lanes. The process outlined in the previous section can be split into two distinct BPMN files without affecting its functionality, as demonstrated in the example above. @@ -67,12 +67,12 @@ Without feedback from both the customer and the shipping department at this stag ## End Message Event -![end_message_event](images/end_msg_event.png) +![end_message_event](/images/end_msg_event.png) This type of event signifies the completion of a process and indicates that a message is sent to an external recipient to notify them of the process's conclusion. It serves as the endpoint of the process and sends a message when the process reaches this event. -![message_event_example_4](images/msg_event_example_4.png) +![message_event_example_4](/images/msg_event_example_4.png) Please note that the End Event, when using pools, signifies the conclusion of the process within that specific pool, but it does not necessarily indicate the end of the entire process. In the provided example, the final step involves sending the customer an invoice. @@ -100,29 +100,29 @@ Three separate configurations need to be completed. | 💻 Form | ⌨ Field Input | 📝 Description | | ------------------------------------------------------------- | --- | --- | -| ![name_field](images/name_field.png) | **Name:** Place Order | A descriptive name given to the element, providing a human-readable label or title. | -| ![id_field](images/id_field.png) | **ID:** Example - send_invoice | An identifier used to uniquely identify the element within the BPMN model. | -| ![documentation_field](images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | +| ![name_field](/images/name_field.png) | **Name:** Place Order | A descriptive name given to the element, providing a human-readable label or title. | +| ![id_field](/images/id_field.png) | **ID:** Example - send_invoice | An identifier used to uniquely identify the element within the BPMN model. | +| ![documentation_field](/images/documentation_field.png) | **Element Documentation:** URL, Raw Data, Plain Text | Additional information or documentation related to the element, such as URLs, plain text, or raw data. | **Collaboration:** -![collaboration](images/collaboration_msg.png) +![collaboration](/images/collaboration_msg.png) The identical configuration must be applied to every BPMN diagram if messages extend across multiple diagrams. | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![correlation_keys](images/correlation_keys_1.png) | **Correlation Keys:** order | A correlation key is a unique identifier or attribute used to establish a connection or relationship between message events (it can be likened to the shared subject between them). It is possible to have multiple correlation keys for a process. | -| ![correlation_properties](images/correlation_properties_1.png) | **Correlation Properties:** invoice_number | The correlation property is what differentiates each key instance from another, and it's the defining attribute that sets them apart. For instance, if "order" is selected as the correlation key, a property like "invoice_number" could be used to distinguish each order instance from another. Keep in mind that this variable should be incorporated within the context of the process instance. | -| ![collaboration_messages](images/collaboration_messages_1.png) | **Messages:** order_approval, order_dispatch, etc. | Messages are established for each message pair (Throw and Catch Message Events). This setup will be utilized to configure the events, linking the associated occurrences together. | +| ![correlation_keys](/images/correlation_keys_1.png) | **Correlation Keys:** order | A correlation key is a unique identifier or attribute used to establish a connection or relationship between message events (it can be likened to the shared subject between them). It is possible to have multiple correlation keys for a process. | +| ![correlation_properties](/images/correlation_properties_1.png) | **Correlation Properties:** invoice_number | The correlation property is what differentiates each key instance from another, and it's the defining attribute that sets them apart. For instance, if "order" is selected as the correlation key, a property like "invoice_number" could be used to distinguish each order instance from another. Keep in mind that this variable should be incorporated within the context of the process instance. | +| ![collaboration_messages](/images/collaboration_messages_1.png) | **Messages:** order_approval, order_dispatch, etc. | Messages are established for each message pair (Throw and Catch Message Events). This setup will be utilized to configure the events, linking the associated occurrences together. | **Throw Message Event:** | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![conditions](images/message_1.png) | **Message:** order_approval | This input isn't an open-text field; instead, it provides a dropdown list populated by the Messages configured in the preceding Collaboration section. | -| ![conditions](images/payload_msg.png) | **Payload:** order_amount | The Payload can include a variable, holding unique information specific to the instance, or in this scenario, the order. | -| ![conditions](images/event_correlation_msg.png) | **Correlation:** invoice_number | Select the correlation that can identify the distinct property distinguishing one process instance from another. | +| ![conditions](/images/message_1.png) | **Message:** order_approval | This input isn't an open-text field; instead, it provides a dropdown list populated by the Messages configured in the preceding Collaboration section. | +| ![conditions](/images/payload_msg.png) | **Payload:** order_amount | The Payload can include a variable, holding unique information specific to the instance, or in this scenario, the order. | +| ![conditions](/images/event_correlation_msg.png) | **Correlation:** invoice_number | Select the correlation that can identify the distinct property distinguishing one process instance from another. | **Catch Message Event:** @@ -130,13 +130,16 @@ The connected catch event is configured in precisely the same manner as the thro | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![conditions](images/message_1.png) | **Message:** order_approval | This input isn't an open-text field; instead, it consists of a dropdown list populated by the Messages configured in the preceding Collaboration section. | -| ![conditions](images/payload_msg.png) | **Variable Name:** order_amount | The Variable Name can include a variable, holding unique information specific to the instance, or in this scenario, the order. | -| ![conditions](images/event_correlation_msg.png) | **Correlation:** invoice_number | Select the correlation that can identify the distinct property distinguishing one process instance from another. | +| ![conditions](/images/message_1.png) | **Message:** order_approval | This input isn't an open-text field; instead, it consists of a dropdown list populated by the Messages configured in the preceding Collaboration section. | +| ![conditions](/images/payload_msg.png) | **Variable Name:** order_amount | The Variable Name can include a variable, holding unique information specific to the instance, or in this scenario, the order. | +| ![conditions](/images/event_correlation_msg.png) | **Correlation:** invoice_number | Select the correlation that can identify the distinct property distinguishing one process instance from another. | Check out this example on Message Event. ```{toctree} :maxdepth: 1 :caption: Message Event Example -message_example_event.md -``` \ No newline at end of file +configuring_messages_and_correlation_properties +``` + +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/Building_Diagrams/multiinstance.md b/docs/reference/bpmn/multiinstance_tasks.md similarity index 90% rename from docs/Building_Diagrams/multiinstance.md rename to docs/reference/bpmn/multiinstance_tasks.md index 99fc2139e..b6e91d960 100644 --- a/docs/Building_Diagrams/multiinstance.md +++ b/docs/reference/bpmn/multiinstance_tasks.md @@ -10,7 +10,7 @@ Tasks are executed one after another, ensuring that each task instance begins on In the case of a sequential multi-instance activity, the instances are executed one at a time. When one instance is completed, a new instance is created for the next element in the input collection. -![Multi_instance_Sequential](images/multiinstance_sequential_example.png) +![Multi_instance_Sequential](/images/multiinstance_sequential_example.png) ## **Parallel Execution** @@ -18,13 +18,13 @@ All instances of the task are launched simultaneously, allowing for concurrent p In the case of a parallel multi-instance activity, all instances are created when the multi-instance body is activated. The instances are executed concurrently and independently of each other. -![Multi_instance_parallel](images/multiinstance_parallel_example.png) +![Multi_instance_parallel](/images/multiinstance_parallel_example.png) ## Components of Multi-Instance Tasks Multi-instance tasks comprise several key properties that define their behavior: -```{image} ./images/multiinstance_properties.png +```{image} /images/multiinstance_properties.png :width: 230px :align: right ``` @@ -58,7 +58,7 @@ Specifically, the process manages a list of composers, their names, and genres, 2. **Script Task - Create Dictionary**: This task initializes a list (array) of dictionaries, each representing a composer with their name and associated genre. The script effectively sets up the data structure that will be manipulated in subsequent steps of the process. -![Multi_instance_example](images/multiinstance_example2.png) +![Multi_instance_example](/images/multiinstance_example2.png) **Script**: @@ -73,7 +73,7 @@ The script effectively sets up the data structure that will be manipulated in su 3. **Multi-Instance Task - Edit Composer**: This task is configured as a multi-instance task that iterates over the `composers` array created by the previous script task. It allows for the editing of each composer's information within the array. -![Multi_instance_example](images/multiinstance_ex.png) +![Multi_instance_example](/images/multiinstance_ex.png) **Properties Configuration**: @@ -88,7 +88,7 @@ It allows for the editing of each composer's information within the array. 4. **Manual Task - Display Edited Composers**: This task presents the edited list of composers and their genres, using a loop to display each composer's name and genre in the format provided. -![Multi_instance_example](images/multiinstance_ex1.png) +![Multi_instance_example](/images/multiinstance_ex1.png) **Instructions**: @@ -108,9 +108,9 @@ This multi-instance example in a BPMN process highlights the capability to dynam By iterating over a list of composers, allowing for the editing of each item, and finally displaying the edited list, the process demonstrates how data can be manipulated and presented in a structured workflow, showcasing the flexibility and power of BPMN for data-driven processes. ```{admonition} Note -If a data object is to be used within a multi-instance subprocess, ensure that it is created within the subprocess itself. +If a data object is to be used within a multi-instance sub-process, ensure that it is created within the sub-process itself. This practice prevents scope and reference issues that can lead to data inconsistencies and errors during the execution of multiple instances. -This ensures that each instance of the subprocess has its own unique and correct reference to the data object. +This ensures that each instance of the sub-process has its own unique and correct reference to the data object. ``` ### Loops @@ -120,7 +120,7 @@ These loops allow for the execution of a specific task or sequence of tasks repe ### Key Concepts -![Loop Configuration](images/Loop_Settings.png) +![Loop Configuration](/images/Loop_Settings.png) 1. **Loop Marker**: A visual indicator (a small loop symbol) placed at the bottom center of an activity to denote that the activity is subject to repeated execution. @@ -151,7 +151,7 @@ This scenario is effectively managed using a standard loop in BPMN. #### Process Overview -![Loop Example](images/loop_example1.png) +![Loop Example](/images/loop_example1.png) 1. **Start Event**: Initiates the workflow. @@ -160,10 +160,13 @@ This scenario is effectively managed using a standard loop in BPMN. 3. **Script Loop Task - Increment Counter**: Implement the Script Loop Task with a loop marker and configure the loop condition (`counter < 10`) and increment script (`counter = counter + 1;`). The process engine will increment the `counter` by 1 on each iteration. -![Loop Example](images/loop_example2.png) +![Loop Example](/images/loop_example2.png) The task is marked with a loop indicator, and the loop condition ensures the task repeats until `counter` reaches 10. 4. **End Event**: Marks the completion of the process once the loop condition is no longer satisfied. This example illustrates the use of a standard loop in BPMN to model repetitive actions within a workflow, showcasing how loops can automate iterative tasks based on dynamic conditions. + +```{tags} tutorial, building_diagrams +``` diff --git a/docs/Building_Diagrams/parallelgatewayexample.md b/docs/reference/bpmn/parallel_gateways_example.md similarity index 91% rename from docs/Building_Diagrams/parallelgatewayexample.md rename to docs/reference/bpmn/parallel_gateways_example.md index 3d55ac62d..a26fd4cd5 100644 --- a/docs/Building_Diagrams/parallelgatewayexample.md +++ b/docs/reference/bpmn/parallel_gateways_example.md @@ -8,7 +8,7 @@ Parallel gateways are powerful BPMN elements that split a process flow into mult ### Process Steps -![Parallel Gateway Example](images/parallel_gateway_ex1.png) +![Parallel Gateway Example](/images/parallel_gateway_ex1.png) 1. **Parallel Gateway (Split)**: After the start event, the gateway divides the main flow into two separate paths, enabling tasks to be processed in parallel. 2. **Sequence Flow 1: Script Task [y = 1]**: Assigns the value `1` to variable `y`. This script task initializes variable `y` and demonstrates setting a simple variable in one branch of the parallel flow. @@ -25,4 +25,7 @@ After the script task, signal the successful completion of the process with the **Output**: After running the task, it will compute and show the result: -![Parallel Gateway Example](images/parallel_gateway_ex2.png) +![Parallel Gateway Example](/images/parallel_gateway_ex2.png) + +```{tags} explanation, building_diagrams +``` diff --git a/docs/Building_Diagrams/pools_and_lanes.md b/docs/reference/bpmn/pools_and_lanes.md similarity index 81% rename from docs/Building_Diagrams/pools_and_lanes.md rename to docs/reference/bpmn/pools_and_lanes.md index b857de1b1..bc7f3d03e 100644 --- a/docs/Building_Diagrams/pools_and_lanes.md +++ b/docs/reference/bpmn/pools_and_lanes.md @@ -18,7 +18,7 @@ A process can have one or more Pools, each with one or more Lanes. A Pool can be configured as an "Empty Pool" (collapsed) or an "Expanded Pool." You can choose the desired configuration 🔧 from the element's options after dragging it onto your diagram. -![pools_and_lanes](images/pools_and_lanes_1.png) +![pools_and_lanes](/images/pools_and_lanes_1.png) Empty Pools are used to represent role players in cases where a specific process is neither known nor required, but the interaction points remain valuable. They serve to illustrate the engagement of certain entities without detailing their internal processes. @@ -30,16 +30,16 @@ Conversely, Expanded Pools are employed when the processes are known and hold re Lanes group activities within a single Pool, usually signifying different roles or departments. -![lanes](images/lanes_1.png) +![lanes](/images/lanes_1.png) Lanes are incorporated into Pools when the roles they represent belong to the same entity. However, if a process doesn't logically fit within the same Pool, like those for different organizations or businesses, it's more appropriate to represent it as a separate Pool rather than another Lane. -![lanes](images/separate_pools_1.png) +![lanes](/images/separate_pools_1.png) ## Configuration -![participant_configuration](images/participant_configuration_1.png) +![participant_configuration](/images/participant_configuration_1.png) **Collapsed (Empty) Pool configuration:** @@ -47,8 +47,8 @@ Configuring an "Empty Pool" (collapsed) to represent an external entity, such as | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![participant_sales](images/participant_customer_1.png) | **Participant Name:** Sales, **Participant ID:** sales, | A clear and descriptive name serves as a human-readable label or title for the participant. Additionally, a unique ID is essential to distinguish the participant from other participants. | -| ![data_object_pools](images/data_object_pools_1.png) | **Data Objects:** order_details | Create or reference a Data Object to store information for sharing between entities. | +| ![participant_sales](/images/participant_customer_1.png) | **Participant Name:** Sales, **Participant ID:** sales, | A clear and descriptive name serves as a human-readable label or title for the participant. Additionally, a unique ID is essential to distinguish the participant from other participants. | +| ![data_object_pools](/images/data_object_pools_1.png) | **Data Objects:** order_details | Create or reference a Data Object to store information for sharing between entities. | **Expanded Pool configuration:** @@ -56,20 +56,20 @@ Setting up an "Expanded Pool" requires referencing the process, in contrast to t | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![participant_sales](images/participant_sales_1.png) | **Participant Name:** Sales, **Participant ID:** sales, **Process ID:** process_order, **Process Name:** Process Order | A clear and descriptive name serves as a human-readable label or title for both the participant and the process. Additionally, a unique ID is essential to distinguish both the participant and the process from others. | -| ![data_object_pools](images/data_object_pools_1.png) | **Data Objects:** order_details | Create or reference a Data Object to store information for sharing between entities. | +| ![participant_sales](/images/participant_sales_1.png) | **Participant Name:** Sales, **Participant ID:** sales, **Process ID:** process_order, **Process Name:** Process Order | A clear and descriptive name serves as a human-readable label or title for both the participant and the process. Additionally, a unique ID is essential to distinguish both the participant and the process from others. | +| ![data_object_pools](/images/data_object_pools_1.png) | **Data Objects:** order_details | Create or reference a Data Object to store information for sharing between entities. | **Collapsed Pool configuration:** -![lanes](images/lane_configuration_1.png) +![lanes](/images/lane_configuration_1.png) Remember that each pool requires Lane configuration, even if it contains just a single Lane. -![lanes](images/pool_settings_1.png) +![lanes](/images/pool_settings_1.png) | 💻 Form | ⌨ Field Input | 📝 Description | | --- | --- | --- | -| ![participant_sales](images/participant_lane_1.png) | **Name:** Manager | A concise and descriptive label that accurately represents the owner and role of the Lane. | -| ![data_object_pools](images/data_object_pools_1.png) | **ID:** lane_manager | A distinct ID to differentiate each Lane, especially when there are multiple. | +| ![participant_sales](/images/participant_lane_1.png) | **Name:** Manager | A concise and descriptive label that accurately represents the owner and role of the Lane. | +| ![data_object_pools](/images/data_object_pools_1.png) | **ID:** lane_manager | A distinct ID to differentiate each Lane, especially when there are multiple. | --- ### Example: Using Lanes and Pools for Petty Cash Request Process @@ -80,7 +80,7 @@ The process is structured around different tasks allocated to Lanes and Pools, e #### BPMN Diagram -![Lanes and Pools Example](images/lanes_pools_example_1.png) +![Lanes and Pools Example](/images/lanes_pools_example_1.png) **Process Flow:** @@ -88,13 +88,13 @@ The process is structured around different tasks allocated to Lanes and Pools, e 1. **User Task: Petty Cash Request**: This task uses a form to collect petty cash requests, including the requested amount and the reason for the request. - ![Lanes and Pools Example](images/lanes_pools_example_2.png) + ![Lanes and Pools Example](/images/lanes_pools_example_2.png) The process transitions from the Requester Lane to the Cashier Lane within the Cashier Pool for approval. 1. **User Task: Approve Petty Cash**: In this task, cashiers review and approve the petty cash request, recording the approver’s name for accountability. - ![Lanes and Pools Example](images/lanes_pools_example_3.png) + ![Lanes and Pools Example](/images/lanes_pools_example_3.png) After approval, the workflow returns to the Requester Lane for final confirmation and display of the approval outcome. @@ -109,7 +109,7 @@ Your petty cash request for {{amount}} has been approved by {{approved_by}} This message informs the requester of the approval status, including the approved amount and the name of the approver. After the manual task, marks the end of the process. -![Lanes and Pools Example](images/lanes_pools_example_4.png) +![Lanes and Pools Example](/images/lanes_pools_example_4.png) This BPMN diagram effectively uses Lanes and Pools to structure a petty cash request process, ensuring that responsibilities are clearly assigned and the workflow is logically organized. @@ -198,7 +198,7 @@ For example, a process might involve several departments or roles, each represen - **Process Start** - The process begins and an initial script task sets the lane owners. The BPMN model below effectively demonstrates a comprehensive workflow leading to a dynamic assignment of reviewers in the "Script Task: Get Reviewers". -![Lane Owners](images/lane_owners.png) +![Lane Owners](/images/lane_owners.png) - **Task Execution**: - As tasks are executed, the workflow engine checks the `lane_owners` dictionary to determine which users are responsible for tasks in specific lanes. @@ -207,3 +207,6 @@ For example, a process might involve several departments or roles, each represen ```{admonition} Note ⚠ Specifying a user group in the `lane_owners` dictionary in a script task does not require it to previously exist in the database. ``` + +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/Building_Diagrams/Script_Tasks.md b/docs/reference/bpmn/script_tasks.md similarity index 98% rename from docs/Building_Diagrams/Script_Tasks.md rename to docs/reference/bpmn/script_tasks.md index 0bbd03f93..d24c68154 100644 --- a/docs/Building_Diagrams/Script_Tasks.md +++ b/docs/reference/bpmn/script_tasks.md @@ -7,7 +7,7 @@ In SpiffArena, the scripting language used for writing scripts is Python, a wide Python offers a rich array of libraries, frameworks, and tools that facilitate script development, making it a popular choice for implementing custom logic and automation. ## **Script Task Properties** - ```{image} ./images/Script_task_update.png + ```{image} /images/Script_task_update.png :alt: Script Task :width: 300px :align: right @@ -56,7 +56,7 @@ The score is then stored in the "score" variable. Let's delve into how we configured the script tasks: -![Script_Task](images/Script_task_example.png) +![Script_Task](/images/Script_task_example.png) **Step 1**: With the script task selected, you will notice the properties tab. @@ -109,7 +109,7 @@ Now, we have configured our script task with a script and unit tests. After the Script Task, we have a Manual Task with a pre-script and instructions to display the score. -![Script_Task](images/Pre-post_scripts.png) +![Script_Task](/images/Pre-post_scripts.png) - **Pre-script** is added as an example. @@ -184,3 +184,6 @@ Please see the [implementing files themselves](https://github.com/sartography/sp | set_user_properties | Sets given user properties on the current user. | | times_executed_by_user | Returns the number of times the user has started an instance of the current process model. | | user_has_started_instance | Returns a boolean indicating if the user has started an instance of the current process model. | + +```{tags} tutorial, reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/service_tasks.md b/docs/reference/bpmn/service_tasks.md similarity index 96% rename from docs/Building_Diagrams/service_tasks.md rename to docs/reference/bpmn/service_tasks.md index 75f9c5f78..15e65f5c0 100644 --- a/docs/Building_Diagrams/service_tasks.md +++ b/docs/reference/bpmn/service_tasks.md @@ -30,7 +30,7 @@ Below, we’ll walk through detailed setup instructions for two examples to illu This simpler example demonstrates how to retrieve user data from the JSONPlaceholder API, useful for testing or prototyping workflows. #### Service Task Configuration - ```{image} ./images/service_task_doc3.png + ```{image} /images/service_task_doc3.png :alt: Service Task :width: 300px :align: right @@ -57,7 +57,7 @@ In this example, we’ll configure a Service Task that fetches employee details Below is workflow overview: -![Service Task](images/service_task_doc1.png) +![Service Task](/images/service_task_doc1.png) 1. **Start Event**: Begins the workflow. 2. **Service Task**: Retrieves employee information from BambooHR. @@ -65,7 +65,7 @@ Below is workflow overview: 4. **End Event**: Completes the workflow. #### **Service Task Configuration** - ```{image} ./images/service_task_doc2.png + ```{image} /images/service_task_doc2.png :alt: Login Screen :class: bg-primary mb-1 :width: 300px @@ -99,3 +99,5 @@ Below is workflow overview: - **url**: `'https://api.bamboohr.com/api/gateway.php/{your_company_subdomain}/v1/employees/directory'` - Replace `{your_company_subdomain}` with your BambooHR subdomain. +```{tags} how_to_guide, building_diagrams +``` diff --git a/docs/Building_Diagrams/signal_events.md b/docs/reference/bpmn/signal_events.md similarity index 88% rename from docs/Building_Diagrams/signal_events.md rename to docs/reference/bpmn/signal_events.md index 81f709b6a..f8252bf17 100644 --- a/docs/Building_Diagrams/signal_events.md +++ b/docs/reference/bpmn/signal_events.md @@ -1,4 +1,4 @@ -# Signal Event +# Signal Events A Signal Event is a type of event that provides a mechanism for communication across different processes. Unlike messages that are sent from a specific sender to a specific receiver, signals are broadcast to multiple recipients. @@ -6,7 +6,7 @@ When a signal is thrown, all active processes that are listening for that signal Signals do not have any expectation of a response. Once a signal is sent out, it does not wait for a reply. - ![signal_relationship](images/signal_relationships.png) + ![signal_relationship](/images/signal_relationships.png) **Reasons to Use a Signal Event:** @@ -18,11 +18,11 @@ Once a signal is sent out, it does not wait for a reply. ## Start Signal Event -![start_signal_event](images/start_signal_event.png) +![start_signal_event](/images/start_signal_event.png) -A Start Signal Event serves as a starting point for a process or subprocess, triggered specifically by a signal broadcasted from another part of the system or even a different system entirely. +A Start Signal Event serves as a starting point for a process or sub-process, triggered specifically by a signal broadcasted from another part of the system or even a different system entirely. -![signal_event_example_2](images/signal_event_example_2.png) +![signal_event_example_2](/images/signal_event_example_2.png) **Example:** A Start Signal Event is especially valuable in situations where a parallel process needs to commence while the primary process continues. @@ -36,12 +36,12 @@ It's important to note that a Start Signal Event is typically activated by an in ## Intermediate Signal Throw Event -![intermediate_throw_message_event](images/intermediate_throw_signal_event.png) +![intermediate_throw_message_event](/images/intermediate_throw_signal_event.png) An Intermediate Signal Throw Event is an event that happens in the middle of a process (not at the start or the end) and sends out a signal. This can be caught by another process or a different part of the same process using a Signal Catch Event. -![intermediate_throw_signal_example_2](images/intermediate_throw_signal_example_2.png) +![intermediate_throw_signal_example_2](/images/intermediate_throw_signal_example_2.png) **Example:** Using an Intermediate Throw Event aligns perfectly with the scenario illustrated earlier. @@ -54,12 +54,12 @@ Implementing multiple threads to concurrently execute tasks for an instance, as ## Intermediate Signal Catch Event -![intermediate_catch_message_event](images/intermediate_catch_signal_event.png) +![intermediate_catch_message_event](/images/intermediate_catch_signal_event.png) An Intermediate Signal Catch Event waits for a specific signal to start or continue a process. To "catch" means that this event is actively waiting or listening for that signal to be thrown from another part of the process or even from a different process. -![intermediate_catch_signal_example](images/intermediate_catch_signal_example.png) +![intermediate_catch_signal_example](/images/intermediate_catch_signal_example.png) **Example:** To better understand the difference between a start event and an intermediate event, let's examine a manufacturing example. @@ -74,7 +74,7 @@ This is because the process necessitates the completion of part two, after which This scenario highlights the importance of understanding the intricacies of each symbol when designing functional and reliable workflows. ``` -![intermediate_catch_signal_example](images/intermediate_catch_signal_example_2.png) +![intermediate_catch_signal_example](/images/intermediate_catch_signal_example_2.png) **Example:** Let's delve into an example distinguishing between interrupting and non-interrupting boundary catch events. @@ -85,11 +85,11 @@ Conversely, for the non-interrupting event (depicted on the right), while Task 2 ## End Signal Event -![end_signal_event](images/end_signal_event.png) +![end_signal_event](/images/end_signal_event.png) This type of event signifies the end of a process or path and, at the same time, broadcasts a signal to other processes or process instances. -![end_signal_event_example](images/end_signal_event_example.png) +![end_signal_event_example](/images/end_signal_event_example.png) **Example:** @@ -97,7 +97,7 @@ In an online shopping system, when a customer's payment is successfully processe This signal initiates three distinct processes: (1) the "Send Notification" process alerts the customer of their successful purchase, (2) the "Pack Order" process prompts the warehouse team to prepare the item for dispatch, and (3) the "Schedule Delivery" process alerts logistics to arrange for the item's delivery. In this manner, one event efficiently orchestrates a sequence of actions across multiple departments. -![end_signal_event_example](images/signal_sync_example.png) +![end_signal_event_example](/images/signal_sync_example.png) **Example:** Signals are instrumental in coordinating workflows among varied processes, making certain that tasks adhere to a specified order. @@ -113,7 +113,7 @@ This BPMN example showcases the flexibility of using Signal Events to create dyn By incorporating manual tasks with multiple outcomes, signal-based routing, and automated timing controls, the example illustrates how complex decision logic and external system integration can be efficiently managed within a BPMN process. -![signal_event_example](images/Signal_events_spiff_example.png) +![signal_event_example](/images/Signal_events_spiff_example.png) ### 1. **Start Event**: @@ -124,7 +124,7 @@ Initiates the workflow, leading to the first and main manual task. This task is unique in that it presents the user with distinct options in the form of buttons. The default flow is a standard submission button that, when clicked, directs the workflow towards a conventional end. -![signal_event_example](images/Signal_events_spiff_example1.png) +![signal_event_example](/images/Signal_events_spiff_example1.png) Attached to **My Manual Task**, three Signal Boundary Events are set to listen for specific signals. These signals determine the flow of the process after the second button is pressed. @@ -148,7 +148,7 @@ These IDs are essential for the Signal Boundary Events to correctly identify and Attached to **My Manual Task**, this event is configured to trigger after a specific duration, automating the process flow if the user does not interact with the manual task within the given timeframe. Notably, this event leads the process towards an alternative path or end without requiring user input. -![signal_event_example](images/Signal_events_spiff_example6.png) +![signal_event_example](/images/Signal_events_spiff_example6.png) ### 3. **End Events**: @@ -162,4 +162,7 @@ The others are linked to the outcomes of the Signal Boundary Events and the Time After starting the task, the signal buttons "Eat Cheetos" and "Eat Spam" will appear. Clicking on any button will lead to the respective manual task. -![signal_event_example](images/Signal_events_spiff_example3.png) +![signal_event_example](/images/Signal_events_spiff_example3.png) + +```{tags} reference, building_diagrams +``` diff --git a/docs/Building_Diagrams/sub-processes_and_call_activities.md b/docs/reference/bpmn/subprocesses_and_call_activities.md similarity index 76% rename from docs/Building_Diagrams/sub-processes_and_call_activities.md rename to docs/reference/bpmn/subprocesses_and_call_activities.md index 8fe2be739..71be7d8d0 100644 --- a/docs/Building_Diagrams/sub-processes_and_call_activities.md +++ b/docs/reference/bpmn/subprocesses_and_call_activities.md @@ -6,10 +6,10 @@ They serve distinct purposes and are used in different scenarios. ## **Reasons to use Sub-Processes or Call Activities:** - Consolidate tasks that either have common features or collaboratively form a distinct functionality. -For example, a Notification Gateway, which includes script tasks and a service task, works together to construct and send a notification, such as an email. + For example, a Notification Gateway, which includes script tasks and a service task, works together to construct and send a notification, such as an email. - Group tasks where a Boundary Event can be efficiently applied to the entire group. -For instance, instead of individually assigning a condition or timer to each task, all tasks can be included within a sub-process or call activity, where the condition or timer inherently applies to all the contained tasks. + For instance, instead of individually assigning a condition or timer to each task, all tasks can be included within a sub-process or call activity, where the condition or timer inherently applies to all the contained tasks. ## Sub-Processes @@ -22,45 +22,54 @@ For instance, instead of individually assigning a condition or timer to each tas - **Conditions or events need to be applied:** When specific conditions or events, such as a timer event, need to be applied to a set of tasks, but these tasks do not collectively form a reusable workflow that can be called as a separate process. ### **Example Use Case: Restaurant Ordering System** -A restaurant management workflow where customers place an order online, and the system processes their selections step by step. To streamline the workflow, the food selection process is encapsulated in a Subprocess. -![Sub process](images/sub_process.png) +A restaurant management workflow where customers place an order online, and the system processes their selections step by step. To streamline the workflow, the food selection process is encapsulated in a Sub-process. + +![Sub process](/images/sub_process.png) + +**Step 1**: **Enter Name** -**Step 1**: **Enter Name** - A User Task that collects the customer's name using a web form. -**Step 2**: **Select Food** -- A Subprocess that encapsulates the food selection process. +**Step 2**: **Select Food** + +- A Sub-process that encapsulates the food selection process. + +**Step 3**: **Display Bill Value** -**Step 3**: **Display Bill Value** - A Script Task that calculates the total bill based on the selected items. -**Step 4**: **Handle Payment** +**Step 4**: **Handle Payment** + - A Call Activity that integrates an external payment handling process. **Step 5**: **Order Confirmation** - A User Task that displays the confirmation message to the user. -#### **Subprocess: Select Food** -![Sub process](images/sub_process1.png) +#### **Sub-process: Select Food** + +![Sub process](/images/sub_process1.png) **Goal**: Simplify the food selection process into smaller, more manageable steps. **Internal Workflow**: -1. **Start Event**: Initiates the subprocess. + +1. **Start Event**: Initiates the sub-process. 2. **Appetizer Task**: User selects an appetizer via a form. 3. **Soup Task**: User selects a soup option. 4. **Main Course Task**: User chooses a main course. 5. **Dessert Task**: User selects a dessert. -6. **End Event**: Marks the completion of the subprocess. +6. **End Event**: Marks the completion of the sub-process. 7. **Input Variables**: - - No specific inputs required in this example as tasks dynamically retrieve options from context or form -8. **Output Variables**: - - `selected_items`: A dictionary containing the user’s food selections (e.g., `{"Appetizer": "Spring Rolls", "Soup": "Tomato Soup", ...}`). +- No specific inputs required in this example as tasks dynamically retrieve options from context or form + +8. **Output Variables**: + +- `selected_items`: A dictionary containing the user’s food selections (e.g., `{"Appetizer": "Spring Rolls", "Soup": "Tomato Soup", ...}`). ## Call Process -![active_call_process](images/active_call_process.png) +![active_call_process](/images/active_call_process.png) A Call Process is similar to a Sub-Process in that it encapsulates part of a workflow, but it is designed to be reused across multiple different processes. It's essentially a stand-alone process that can be "called" into action as required by other processes. @@ -77,17 +86,17 @@ Using a Call Process can help to eliminate redundancy and ensure consistent exec - **Delegation:** When different individuals or teams are responsible for executing tasks within a process, a call activity can be assigned to the most appropriate person or team. - **Access Control:** If a specific segment of a process should not be available to every user, converting it into a call process helps establish access control. -More information about this can be found in the [Admin and Permission](../DevOps_installation_integration/admin_and_permissions.md) section. - + More information about this can be found in the [Admin and Permission](/how_to_guides/deployment/manage_permissions) section. ### **Example Use Case: Payment Handling** + A restaurant management workflow handles customer orders, calculates the bill, and processes payments. To maintain modularity and reusability, the payment processing logic is encapsulated in a separate workflow and invoked using a Call Activity. -![Call Process](images/Call_Activity1.png) +![Call Process](/images/Call_Activity1.png) **Step 1**: **Enter Name** - A User Task that collects the customer's name. -**Step 2**: **Select Food** - A Subprocess to handle food selection. +**Step 2**: **Select Food** - A Sub-process to handle food selection. **Step 3**: **Display Bill Value** - A Script Task to calculate the total bill. @@ -95,14 +104,16 @@ A restaurant management workflow handles customer orders, calculates the bill, a **Step 5**: **Order Confirmation** - A User Task that displays order confirmation. -#### **Call Activity: Handle Payment**: +#### **Call Activity: Handle Payment** + A restaurant management workflow handles customer orders, calculates the bill, and processes payments. To maintain modularity and reusability, the payment processing logic is encapsulated in a separate workflow and invoked using a Call Activity. -![Call Process](images/Call_Activity.png) +![Call Process](/images/Call_Activity.png) **Goal**: Abstract the logic of handling different payment methods into a reusable process. **Internal Workflow of Called Process**: + 1. **Start Event**: Initiates the payment process. 2. **Select Payment Method**: - A User Task where the customer selects a payment method (e.g., "Pay on Delivery" or "Pay Online"). @@ -117,4 +128,8 @@ A restaurant management workflow handles customer orders, calculates the bill, a In the example of "Handle Payment," the main workflow remains focused on order management while delegating payment logic to a reusable process, improving both clarity and efficiency. -Therefore, the Call Process is a critical tool for creating modular, reusable, and scalable workflows in SpiffWorkflow. +Therefore, the Call Process is a critical tool for creating modular, reusable, and scalable workflows in SpiffWorkflow. + +```{tags} reference, building_diagrams + +``` diff --git a/docs/Building_Diagrams/task_data.md b/docs/reference/bpmn/task_data.md similarity index 96% rename from docs/Building_Diagrams/task_data.md rename to docs/reference/bpmn/task_data.md index 727a3e3ef..f7f88eabb 100644 --- a/docs/Building_Diagrams/task_data.md +++ b/docs/reference/bpmn/task_data.md @@ -15,3 +15,6 @@ Then, when the data is merged back together at a merging gateway, if multiple br Therefore, if you have tasks a, b, and c that run in parallel, it might not be a good idea for both a and b to set the "desired_withdrawal_amount" variable since, depending on how fast a and b run (and other implementation details around the parallel processing), the expected "winner" would not be knowable in advance. This general branching and merging strategy is applied to all parallel constructs, including inclusive gateways. + +```{tags} explanation, building_diagrams +``` diff --git a/docs/Building_Diagrams/timer_events.md b/docs/reference/bpmn/timer_events.md similarity index 83% rename from docs/Building_Diagrams/timer_events.md rename to docs/reference/bpmn/timer_events.md index 0b003ae9c..3a858593e 100644 --- a/docs/Building_Diagrams/timer_events.md +++ b/docs/reference/bpmn/timer_events.md @@ -1,4 +1,4 @@ -# Timer Event +# Timer Events A Timer Event in BPMN is tied to the concept of time. It represents a specific moment or duration after which certain actions in a process are initiated or controlled. @@ -36,13 +36,13 @@ The R denotes recurrence, followed by the number of recurrences, and PT8H is the ## Start Timer Event -![start_signal_event](images/start_timer_event.png)![start_timer_example](images/non_interrupting_start_timer.png) +![start_signal_event](/images/start_timer_event.png)![start_timer_example](/images/non_interrupting_start_timer.png) A Start Timer Event marks the beginning of a process or sub-process, but only once a specified period has elapsed or at a predetermined time. **Example:** -![start_timer_example](images/start_timer_example.png) +![start_timer_example](/images/start_timer_example.png) **Timer Start Event:** Consider a company that sends out a newsletter on the first of every month. To achieve this, they could set up a 'Start Timer Event' named 'Monthly Newsletter Timer' with a cyclic timer to activate on the first day of each month. @@ -53,13 +53,13 @@ Here, a 'Start Timer Event' can be used to automatically close the proposal subm **Timer Start Event (non-interrupting):** Taking a more customer-centric example, envision an online shopping platform. While a customer browses and adds items to the cart, they might get distracted and forget to check out. -To address this, the platform can trigger a 'Non-Interrupting Timer Event' coupled with a subprocess. -If the cart remains unattended for an hour, this timer triggers the subprocess, sending an email to the customer reminding them of their abandoned cart. +To address this, the platform can trigger a 'Non-Interrupting Timer Event' coupled with a sub-process. +If the cart remains unattended for an hour, this timer triggers the sub-process, sending an email to the customer reminding them of their abandoned cart. The advantage is that it doesn't disrupt the customer's current session, providing a seamless experience. ## Intermediate Timer Event -![intermediate_timer_event](images/intermediate_timer_event.png) ![non_interrupting_intermediate_timer_event](images/non_interrupting_intermediate_timer_event.png) +![intermediate_timer_event](/images/intermediate_timer_event.png) ![non_interrupting_intermediate_timer_event](/images/non_interrupting_intermediate_timer_event.png) An Intermediate Timer Event acts as a pause or delay within the flow of a process. The process flow will only continue after the set time has been reached or elapsed. @@ -67,7 +67,7 @@ Furthermore, as a Boundary Event, it can be linked to specific tasks or sub-proc **Example:** -![timer_intermediate_example_1](images/start_timer_example_1.png) +![timer_intermediate_example_1](/images/start_timer_example_1.png) **Timer Intermediate Catch Event:** @@ -79,11 +79,11 @@ To manage this, an 'Intermediate Timer Event' can be set, signaling a baking pro Transitioning to a logistics scenario, let's consider a company that processes multiple orders throughout the day. They might spend hours collecting items, packaging, and preparing them for shipment. However, rather than dispatching each order individually, they follow a batch process strategy, consolidating all orders for a one-time dispatch. -An 'Intermediate Timer Event' can be configured here to accumulate the day's orders and trigger a batch processing subprocess at a specific time, ensuring efficient and streamlined delivery operations. +An 'Intermediate Timer Event' can be configured here to accumulate the day's orders and trigger a batch processing sub-process at a specific time, ensuring efficient and streamlined delivery operations. **Example:** -![start_timer_example_2](images/start_timer_example_2.png) +![start_timer_example_2](/images/start_timer_example_2.png) **Timer Boundary Event (interrupting):** @@ -100,12 +100,12 @@ If they don't purchase within this time frame, the timer activates, removing the A company prides itself on responding to customer support queries within 12 hours. When a new query is logged, a task named "Respond to Customer" is initiated. This task has a timer boundary event set for 12 hours. -If the customer support team hasn't addressed the query within this time frame, the timer boundary event triggers a notification subprocess to alert the team lead or manager about the overdue response. +If the customer support team hasn't addressed the query within this time frame, the timer boundary event triggers a notification sub-process to alert the team lead or manager about the overdue response. Note that the original task is still active. **Best Modeling Practices:** -![start_timer_example_3](images/start_timer_example_3.png) +![start_timer_example_3](/images/start_timer_example_3.png) In process automation, ensuring all tasks and processes reach a definitive end is a fundamental aspect of good modeling practice. Abandoned or lingering tasks can strain resources and introduce inefficiencies. @@ -121,11 +121,14 @@ Just remember to have a mechanism in place to eventually break out of the loop a | 💻 Form | ⌨ Field Input | 📝 Description | | -------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------- | -| ![name_field](images/name_field.png) | **Name:** Cancel Order | A descriptive name given to the element, providing a human-readable label or title. | -| ![id_field](images/id_field.png) | **ID:** Example - cancel_order | An identifier used to uniquely identify the element within the BPMN model. | -| ![timer_field](images/timer_field.png) | **Type:** Duration **Value:** PT48H | Choose the type of trigger you want to set: Specific Date/Time, Duration, or Cycle Trigger. | +| ![name_field](/images/name_field.png) | **Name:** Cancel Order | A descriptive name given to the element, providing a human-readable label or title. | +| ![id_field](/images/id_field.png) | **ID:** Example - cancel_order | An identifier used to uniquely identify the element within the BPMN model. | +| ![timer_field](/images/timer_field.png) | **Type:** Duration **Value:** PT48H | Choose the type of trigger you want to set: Specific Date/Time, Duration, or Cycle Trigger. | ```{admonition} Timer Delay 💡 Note: Timer events, especially those set for short durations, may face delays of 20-30 seconds, varying with the number of active instances. Despite significant improvements, our ongoing efforts aim to further reduce these delays. ``` + +```{tags} reference, building_diagrams +``` diff --git a/docs/Support/FAQ.md b/docs/reference/frequently_asked_questions.md similarity index 97% rename from docs/Support/FAQ.md rename to docs/reference/frequently_asked_questions.md index 832731478..858f291fe 100644 --- a/docs/Support/FAQ.md +++ b/docs/reference/frequently_asked_questions.md @@ -7,7 +7,7 @@ **Q:** Is there a setup where I can run it within PyCharm? **A:** Yes, you can run SpiffWorkflow within PyCharm. For detailed settings, refer to the provided screenshot of Flask server details. -![Flask](images/Flask.png) +![Flask](/images/Flask.png) ### **2. Adding Python Libraries to SpiffWorkflow** @@ -64,10 +64,10 @@ workflow.reset_from_task_id(start.id) 1. **Script Tasks**: These allow you to execute Python code directly within your workflow. This method is suitable for simpler integrations where the code logic is not too complex. 2. **Service Tasks**: For more complex integrations, you can write services that can be called via service tasks within your workflow. This method provides more flexibility and is ideal for scenarios where you need to interface with external systems or perform more intricate operations. -### **9. Using Call Activity for preconfigured modular subprocesses** +### **9. Using Call Activity for preconfigured modular sub-processes** -**Q:** I need my users to generate many BPMN workflows by dropping preconfigured subprocesses into their workflows. Is this possible? -**A:** Yes, you can use a "Call Activity" in SpiffArena to reference other processes in your diagram. SpiffArena provides a way to search for other processes in the system that can be used as Call Activities. This means you can create modular workflows by designing subprocesses (like ‘send to accounts’) and then incorporating them into multiple main workflows as needed. This modular approach not only streamlines the design process but also ensures consistency across different workflows. +**Q:** I need my users to generate many BPMN workflows by dropping preconfigured sub-processes into their workflows. Is this possible? +**A:** Yes, you can use a "Call Activity" in SpiffArena to reference other processes in your diagram. SpiffArena provides a way to search for other processes in the system that can be used as Call Activities. This means you can create modular workflows by designing sub-processes (like ‘send to accounts’) and then incorporating them into multiple main workflows as needed. This modular approach not only streamlines the design process but also ensures consistency across different workflows. ### **10. Integrating SpiffWorkflow with External Role Management** @@ -114,7 +114,7 @@ workflow.reset_from_task_id(start.id) **Q:** How can we mimic an inclusive gateway since SpiffWorkflow doesn't support it? **A:** You can work around the absence of an inclusive gateway in SpiffWorkflow by using a Parallel Gateway. Within each path following the Parallel Gateway, you can place an Exclusive Gateway to check for the conditions that are or are not required. This approach is effective if the flows can eventually be merged back together. -![Mimicking Inclusive Gateway](images/Mimicking_inclusive_gateway.png) +![Mimicking Inclusive Gateway](/images/Mimicking_inclusive_gateway.png) ### **19. Designing an Approval Process in SpiffWorkflow** @@ -447,7 +447,7 @@ By adjusting the return value of your script task's `execute` method and underst **A:** **Event Handling in SpiffWorkflow:** -- **Internal vs. External Events:** The distinction between internal and external events in SpiffWorkflow is primarily for deciding whether an event should be handled within the workflow or passed up to a parent workflow from a subprocess. This is now managed by targeting a particular subworkflow or leaving the target as None for internal handling. +- **Internal vs. External Events:** The distinction between internal and external events in SpiffWorkflow is primarily for deciding whether an event should be handled within the workflow or passed up to a parent workflow from a sub-process. This is now managed by targeting a particular subworkflow or leaving the target as None for internal handling. - **External Event Management:** For real external events, SpiffWorkflow allows the creation of an event object and passing it to the `send_event` function. This approach is used for events that need to be handled outside the workflow system. - **Event Translation and Messaging:** External systems should translate their events into SpiffWorkflow's format and call `send_events` to trigger the workflow. SpiffWorkflow collects all unhandled events, which the workflow system should periodically check using `get_events`. This process allows for the translation and sending of these events to external systems. - **Practical Application:** In real-world applications, tasks like UserTasks can be mapped to ApprovalTasks or FormTasks, and ServiceTasks can be mapped to API calls to external systems. The approach to handling events or messages, such as using RabbitMQ for pub/sub events or direct messaging via email or SMS, depends on the specific requirements and design of the workflow system. @@ -528,10 +528,10 @@ Common errors occur when configuring HTTP Service Tasks. - **Common Errors:** - **Missing `headers`:** Add `{}` to the `headers` field. -### **45: Mapping input/Output for Call Activity Subprocess** -**Q:** How do I map input and output for Call Activity subprocesses?** +### **45: Mapping input/Output for Call Activity Sub-process** +**Q:** How do I map input and output for Call Activity sub-processes?** -**A:** In the subprocess: +**A:** In the sub-process: - Use single `=` for variable assignments (e.g., `result = "approve"`). - Avoid using double `==`, as it is a comparison operator, not an assignment. @@ -546,7 +546,7 @@ Users need to retrieve the group or username associated with a specific lane dur ```python group_members = get_group_members(lane_name) ``` -- Refer to the [Pools and Lanes Documentation](https://spiff-arena.readthedocs.io/en/latest/Building_Diagrams/pools_and_lanes.html) and [Script Tasks Documentation](https://spiff-arena.readthedocs.io/en/latest/Building_Diagrams/Script_Tasks.html) for additional details. +- Refer to the [Pools and Lanes Documentation](https://spiff-arena.readthedocs.io/en/latest/Building_Diagrams/pools_and_lanes.html) and [Script Tasks Documentation](https://spiff-arena.readthedocs.io/en/latest/Building_Diagrams/script_tasks.html) for additional details. ### **48: Modify Process Instances during Execution** **Q:** Can I modify process instances during execution?** @@ -559,4 +559,7 @@ Users need to change task data or adjust token positions in running processes. T **Limitations:** - Modifying data objects directly is not supported. -- BPMN diagram changes cannot be made during runtime. \ No newline at end of file +- BPMN diagram changes cannot be made during runtime. + +```{tags} how_to_guide +``` diff --git a/docs/appendices/bpmn_terminology.md b/docs/reference/glossary.md similarity index 85% rename from docs/appendices/bpmn_terminology.md rename to docs/reference/glossary.md index 08df52ba1..ada157b3d 100644 --- a/docs/appendices/bpmn_terminology.md +++ b/docs/reference/glossary.md @@ -1,11 +1,11 @@ -# BPMN Terminology +# Glossary ## Activity -This refers to the work carried out by an individual or an organization within a process. -Activities can be classified into three categories: Task, Subprocess, and Call Activity. +Refers to the work carried out by an individual or an organization within a process. +Activities can be classified into three categories: Task, Sub-process, and Call Activity. These activities can be either atomic or non-atomic. -Atomic activities are indivisible and represent single tasks, while non-atomic activities involve multiple steps or subprocesses that work together to achieve a larger objective. +Atomic activities are indivisible and represent single tasks, while non-atomic activities involve multiple steps or sub-processes that work together to achieve a larger objective. ## Boundary Event @@ -30,9 +30,9 @@ This is the visual platform where business processes are represented and mapped This refers to the act of a parent or higher-level process invoking a predefined or reusable child process, which is represented in another process diagram. This invocation allows for the utilization of the child process multiple times, enhancing reusability within the overall model. -## Collapsed Subprocess +## Collapsed Sub-process -This is a Subprocess that conceals the underlying process it includes. +This is a Sub-process that conceals the underlying process it includes. ## Connecting Element @@ -72,9 +72,9 @@ Exceptions can be triggered by Time, Error, or Message Events. This denotes a juncture within the process where multiple alternative paths are available, but only one path can be chosen. The decision regarding the chosen path is determined by a condition. -## Expanded Subprocess +## Expanded Sub-process -This is a Subprocess that shows the process it contains. +This is a Sub-process that shows the process it contains. ## Gateway @@ -109,7 +109,7 @@ The message is transmitted through a Message Flow. ## Non-atomic Activity This refers to an Activity that can be further decomposed into more detailed steps or subtasks. -A Subprocess is an example of a non-atomic Activity. +A Sub-process is an example of a non-atomic Activity. It is also commonly referred to as a "compound" Activity. ## Parallel Gateway @@ -118,7 +118,7 @@ This indicates a specific point within the process where the Flow divides or mer ## Parent Process -This is a process that contains a Subprocess. +This is a process that contains a Sub-process. ## Participant @@ -128,6 +128,14 @@ This refers to a business entity, which can be an organization, department, unit This represents a Participant in a process. +## Process Instance + +A Process Instance is a specific occurrence of a Process Model that is executed within a workflow engine. + +## Process Model + +A Process Model is a visual representation of a process that defines the sequence of activities, decisions, and interactions required to achieve a particular goal. + ## Sequence Flow This specifies the sequence and behavior of the Flow Elements within a process. @@ -140,7 +148,7 @@ This is an Event that is transmitted to all individuals or entities participatin This indicates where a process starts. -## Subprocess +## Sub-process This is a self-contained and compound Activity incorporated within a process, capable of being further decomposed into smaller units of work. @@ -160,3 +168,6 @@ This provides additional information about the elements in a diagram. ## Trigger This is a mechanism that detects and identifies a particular condition or circumstance within a Start Event or Intermediate Event, subsequently initiating a corresponding response. + +```{tags} reference +``` diff --git a/docs/documentation/documentation.md b/docs/reference/how_to_contribute_to_the_documentation.md similarity index 89% rename from docs/documentation/documentation.md rename to docs/reference/how_to_contribute_to_the_documentation.md index c22638750..278b14a68 100644 --- a/docs/documentation/documentation.md +++ b/docs/reference/how_to_contribute_to_the_documentation.md @@ -1,15 +1,15 @@ # How to Contribute to the Documentation -This documentation is currently hosted live at [Spiff-Arena's ReadTheDocs](https://spiff-arena.readthedocs.io/en/latest/). +The spiff-arena documentation is currently hosted live at [ReadTheDocs](https://spiff-arena.readthedocs.io/en/latest/). -Please set aside a couple of hours to work through this, as getting this set up correctly once is 10,000 times better than having problems every day for the rest of your life. +If you intend to edit the docs on an ongoing basis, please set aside a couple of hours to work through this guide, as getting this set up correctly once is 10,000 times better than having problems every day for the rest of your life. ## Our Methodology The methodology we are following is known as ["Docs as Code"](https://www.writethedocs.org/guide/docs-as-code/). This means using the same tools and processes that software developers use for writing code to write the documentation for code. -In following this methodology, you will have to pick up some tools you haven't had to use before (Git, Sphinx). +In following this methodology, you may have to pick up some tools you haven't had to use before (Git, Sphinx). Why would a technical writer need to learn these software engineering tools? I'll never make the case as well as an article by [Tom Johnson](https://idratherbewriting.com/trends/trends-to-follow-or-forget-docs-as-code.html). @@ -28,7 +28,7 @@ Here are some [quick examples](https://commonmark.org/help/). And here is a great [10-minute tutorial](https://commonmark.org/help/tutorial/). This will cover a lot of the basics, like bolding text, italics, paragraphs, lists, and other common formatting techniques. -![Markdown screenshot](./images/markdown.png "Markdown example") +![Markdown screenshot](/images/markdown.png "Markdown example") ### MyST @@ -100,7 +100,7 @@ So let's open just that folder in VSCode. Now click on the two pieces of paper at the top corner of your screen, and you should see a project that looks like this without all the rest of the code in your way: -![Docs Directory](./images/docs_dir.png "Docs Directory") +![Docs Directory](/images/docs_dir.png "Docs Directory") ### Step 6: Add some extensions @@ -109,7 +109,7 @@ Now click on the two pieces of paper at the top corner of your screen, and you s - Click the "install" button. - Repeat, this time installing the "Python" extension for VSCode (from Microsoft) -![Myst Extension](./images/myst.png "Search for MyST in extensions") +![Myst Extension](/images/myst.png "Search for MyST in extensions") ### Step 7: Install Python Dependencies @@ -135,7 +135,7 @@ You can do that by following these steps: ### Step 10: Commit your changes and push them up for everyone -1. Select the "git" button on the left-hand side of the toolbar (circles with lines between them) ![Git button](./images/git.png "Git button") +1. Select the "git" button on the left-hand side of the toolbar (circles with lines between them) ![Git button](/images/git.png "Git button") 2. Press the blue "Commit" button. 3. Any changes you pushed up should be live on our website within 5 to 10 minutes. @@ -150,3 +150,12 @@ Documentation people: please ignore this for now. We may decide to check the documentation with a "linter" which is designed to keep the documentation consistent and standardized. One option is [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli), which uses David Anson's [NodeJS-based markdownlint](https://github.com/DavidAnson/markdownlint), which these days seems to be more popular than the [ruby-based markdownlint](https://github.com/markdownlint/markdownlint). A `.markdownlint.jsonc` file has been added that configures the same markdownlint program (basically to ignore the rule about long lines, since we are using ventilated prose). + +## Doc Philosphy + +We try to use [Diátaxis](https://diataxis.fr/). +This is also highly related: + +```{tags} tutorial + +``` diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 000000000..475f7d84a --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,13 @@ +# Reference + +The Reference section contains detailed information about SpiffWorkflow's components and features. + +```{toctree} +:maxdepth: 1 +bpmn/index +glossary +frequently_asked_questions +wish_list +permission_url +how_to_contribute_to_the_documentation +``` diff --git a/docs/DevOps_installation_integration/permission_url.md b/docs/reference/permission_url.md similarity index 98% rename from docs/DevOps_installation_integration/permission_url.md rename to docs/reference/permission_url.md index 6028a7e5d..75cb76dd7 100644 --- a/docs/DevOps_installation_integration/permission_url.md +++ b/docs/reference/permission_url.md @@ -2,7 +2,7 @@ The permission URL, or target URI, refers to the specific endpoint or resource to which permission is granted to perform certain actions. -- **PG:** [process_group_identifier]: Applies to the specified process group, including all subprocess groups and process models. +- **PG:** [process_group_identifier]: Applies to the specified process group, including all sub-process groups and process models. - **PM:** [process_model_identifier]: Applies to the specified process model. - **BASIC:** Allows basic access to complete tasks and use the site. - **SUPPORT:** BASIC permissions plus significant administrative permissions. @@ -126,3 +126,6 @@ It provides administrator-level permissions, allowing the user to perform any ac /users/exists/by-username: /users/search: ``` + +```{tags} reference +``` diff --git a/docs/wish_list/wish_list.md b/docs/reference/wish_list.md similarity index 99% rename from docs/wish_list/wish_list.md rename to docs/reference/wish_list.md index 1d5790821..899df7af0 100644 --- a/docs/wish_list/wish_list.md +++ b/docs/reference/wish_list.md @@ -161,3 +161,6 @@ But a separate system for comments would also allow for adding comments at any t Comments from people tend to be highly relevant for coworkers who need to interact with processes, such as with approvals. These comments could be more easily presented in the UI associated with a process instance. The approver will be looking for this type of information, so having a standard place to put it might be beneficial. + +```{tags} explanation +``` diff --git a/docs/requirements.txt b/docs/requirements.txt index a722b031b..b9caffddf 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -45,6 +45,7 @@ sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 sphinxcontrib-mermaid==0.9.2 +sphinx-tags==0.1.0 tornado==6.4.1 typeguard==4.3.0 Unidecode==1.3.8 diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md new file mode 100644 index 000000000..7dedd2151 --- /dev/null +++ b/docs/tutorials/index.md @@ -0,0 +1,8 @@ +# Tutorials + +Welcome to the Tutorials section. Here you will find step-by-step guides to help you get started with SpiffWorkflow. + +```{toctree} +:maxdepth: 1 +/getting_started/quickstart_guide +``` diff --git a/spiffworkflow-backend/bin/create_and_run_process_instance.py b/spiffworkflow-backend/bin/create_and_run_process_instance.py index d048d330a..74ab32779 100644 --- a/spiffworkflow-backend/bin/create_and_run_process_instance.py +++ b/spiffworkflow-backend/bin/create_and_run_process_instance.py @@ -8,7 +8,7 @@ from spiffworkflow_backend.services.user_service import UserService def main() -> None: app = create_app() - process_model_identifier = sys.argv[1] + process_model_identifier = sys.argv[1].replace(":", "/") with app.app_context(): user = UserModel.query.first() diff --git a/spiffworkflow-backend/keycloak/bin/export_keycloak_realms b/spiffworkflow-backend/keycloak/bin/export_keycloak_realms index 44e16c4dd..f12810b0d 100755 --- a/spiffworkflow-backend/keycloak/bin/export_keycloak_realms +++ b/spiffworkflow-backend/keycloak/bin/export_keycloak_realms @@ -20,7 +20,14 @@ fi docker_container_path=/tmp/hey local_tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) docker exec keycloak rm -rf "$docker_container_path" -docker exec keycloak /opt/keycloak/bin/kc.sh export --dir "${docker_container_path}" --users realm_file || echo '' + +docker exec -it keycloak sh -c \ + "cp -rp /opt/keycloak/data/h2 /tmp ; \ + /opt/keycloak/bin/kc.sh export --dir ${docker_container_path} --users realm_file \ + --http-management-port 9001 \ + --db dev-file \ + --db-url 'jdbc:h2:file:/tmp/h2/keycloakdb;NON_KEYWORDS=VALUE'" + docker cp "keycloak:${docker_container_path}" "$local_tmp_dir" for realm in $realms; do diff --git a/spiffworkflow-backend/keycloak/bin/start_keycloak b/spiffworkflow-backend/keycloak/bin/start_keycloak index b155c2e34..afb5ed28f 100755 --- a/spiffworkflow-backend/keycloak/bin/start_keycloak +++ b/spiffworkflow-backend/keycloak/bin/start_keycloak @@ -15,6 +15,8 @@ setup_traps set -o errtrace -o errexit -o nounset -o pipefail +keycloak_version=26.0.7 + realm_name="${1:-}" if [[ -z "$realm_name" ]]; then realm_name="spiffworkflow-local" @@ -37,8 +39,24 @@ if [[ -n "$(docker ps -qa -f name=$container_regex)" ]]; then docker rm $container_name fi +function wait_for_keycloak_to_be_up() { + local max_attempts=600 + echo "waiting for keycloak to come up..." + local attempts=0 + local url="localhost:7009/health/ready" + while [[ "$(curl -s -o /dev/null -w '%{http_code}' "$url")" != "200" ]]; do + if [[ "$attempts" -gt "$max_attempts" ]]; then + echo >&2 "ERROR: $url not up after $max_attempts attempts. There is probably a problem" + return 1 + fi + attempts=$((attempts + 1)) + sleep 1 + done +} + docker run \ -p 7002:8080 \ + -p 7009:9000 \ -d \ --network=spiffworkflow \ --name keycloak \ @@ -46,7 +64,8 @@ docker run \ -e ROOT_LOGLEVEL=ALL \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ - quay.io/keycloak/keycloak:22.0.4 start-dev \ + -e KC_HEALTH_ENABLED="true" \ + quay.io/keycloak/keycloak:${keycloak_version} start-dev \ -Dkeycloak.profile.feature.token_exchange=enabled \ -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled \ -D--spi-theme-static-max-age=-1 \ @@ -57,23 +76,14 @@ script_dir="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 pwd -P )" -cp "${script_dir}/../realm_exports/${realm_name}-realm.json" /tmp/${realm_name}-realm.json +file_path=/tmp/${realm_name}-realm.json +cp "${script_dir}/../realm_exports/${realm_name}-realm.json" "$file_path" spiff_subdomain="for-local-dev.spiffworkflow.org" -perl -pi -e "s/replace-me-with-spiff-backend-host-and-path/${spiff_subdomain}/g" /tmp/${realm_name}-realm.json -docker cp /tmp/${realm_name}-realm.json keycloak:/tmp - -sleep 20 -remove_traps -set +e -import_output=$(docker exec keycloak /opt/keycloak/bin/kc.sh import --file /tmp/${realm_name}-realm.json 2>&1) -setup_traps -set -e -# if ! grep -qE "Import finished successfully" <<<"$import_output"; then -if ! grep -qE "Realm '${realm_name}' imported" <<<"$import_output"; then - echo -e "IMPORT FAILED: $import_output" - exit 1 -fi +perl -pi -e "s/replace-me-with-spiff-backend-host-and-path/${spiff_subdomain}/g" "$file_path" +wait_for_keycloak_to_be_up +token=$(curl --fail -s -X POST "http://localhost:7002/realms/master/protocol/openid-connect/token" -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=password&client_id=admin-cli&username=admin&password=admin' | jq -r .access_token) +curl --fail -s -X POST "http://localhost:7002/admin/realms" -H "Authorization: Bearer $token" -H 'Content-Type: application/json' --data "@$file_path" -v echo 'imported realms' if [ "${TURN_OFF_SSL:-}" == "true" ]; then diff --git a/spiffworkflow-backend/keycloak/realm_exports/spiffworkflow-basic-realm.json b/spiffworkflow-backend/keycloak/realm_exports/spiffworkflow-basic-realm.json new file mode 100644 index 000000000..a75b579bc --- /dev/null +++ b/spiffworkflow-backend/keycloak/realm_exports/spiffworkflow-basic-realm.json @@ -0,0 +1,2233 @@ +{ + "id" : "spiffworkflow", + "realm" : "spiffworkflow", + "notBefore" : 0, + "defaultSignatureAlgorithm" : "RS256", + "revokeRefreshToken" : false, + "refreshTokenMaxReuse" : 0, + "accessTokenLifespan" : 1800, + "accessTokenLifespanForImplicitFlow" : 900, + "ssoSessionIdleTimeout" : 86400, + "ssoSessionMaxLifespan" : 864000, + "ssoSessionIdleTimeoutRememberMe" : 0, + "ssoSessionMaxLifespanRememberMe" : 0, + "offlineSessionIdleTimeout" : 2592000, + "offlineSessionMaxLifespanEnabled" : false, + "offlineSessionMaxLifespan" : 5184000, + "clientSessionIdleTimeout" : 0, + "clientSessionMaxLifespan" : 0, + "clientOfflineSessionIdleTimeout" : 0, + "clientOfflineSessionMaxLifespan" : 0, + "accessCodeLifespan" : 60, + "accessCodeLifespanUserAction" : 300, + "accessCodeLifespanLogin" : 1800, + "actionTokenGeneratedByAdminLifespan" : 43200, + "actionTokenGeneratedByUserLifespan" : 300, + "oauth2DeviceCodeLifespan" : 600, + "oauth2DevicePollingInterval" : 5, + "enabled" : true, + "sslRequired" : "external", + "registrationAllowed" : false, + "registrationEmailAsUsername" : false, + "rememberMe" : false, + "verifyEmail" : false, + "loginWithEmailAllowed" : true, + "duplicateEmailsAllowed" : false, + "resetPasswordAllowed" : false, + "editUsernameAllowed" : false, + "bruteForceProtected" : false, + "permanentLockout" : false, + "maxTemporaryLockouts" : 0, + "bruteForceStrategy" : "MULTIPLE", + "maxFailureWaitSeconds" : 900, + "minimumQuickLoginWaitSeconds" : 60, + "waitIncrementSeconds" : 60, + "quickLoginCheckMilliSeconds" : 1000, + "maxDeltaTimeSeconds" : 43200, + "failureFactor" : 30, + "roles" : { + "realm" : [ { + "id" : "c9f0ff93-642d-402b-965a-04d70719886b", + "name" : "default-roles-spiffworkflow", + "description" : "${role_default-roles}", + "composite" : true, + "composites" : { + "realm" : [ "offline_access", "uma_authorization" ], + "client" : { + "account" : [ "view-profile", "manage-account" ] + } + }, + "clientRole" : false, + "containerId" : "spiffworkflow", + "attributes" : { } + }, { + "id" : "9f474167-5707-4c10-8f9e-bb54ec715cd3", + "name" : "uma_authorization", + "description" : "${role_uma_authorization}", + "composite" : false, + "clientRole" : false, + "containerId" : "spiffworkflow", + "attributes" : { } + }, { + "id" : "6738d143-2d1d-4458-8a98-01ea003fde14", + "name" : "admin", + "composite" : false, + "clientRole" : false, + "containerId" : "spiffworkflow", + "attributes" : { } + }, { + "id" : "6cbcdea5-0083-469d-9576-1d245fb3cdfd", + "name" : "repeat-form-role-realm", + "composite" : false, + "clientRole" : false, + "containerId" : "spiffworkflow", + "attributes" : { } + }, { + "id" : "b5a92aee-82d2-4687-8282-365df4df21a9", + "name" : "offline_access", + "description" : "${role_offline-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "spiffworkflow", + "attributes" : { } + } ], + "client" : { + "realm-management" : [ { + "id" : "257c348c-4b9e-4fea-be39-5fdd28e8bb93", + "name" : "manage-authorization", + "description" : "${role_manage-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "1d224265-63a8-40ea-9316-47627d0aed8c", + "name" : "view-authorization", + "description" : "${role_view-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "535d7ca0-0f06-42d8-938b-e6e7aabffb42", + "name" : "query-groups", + "description" : "${role_query-groups}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "9ff52ab5-2558-4cb0-901f-6e6f1469d075", + "name" : "realm-admin", + "description" : "${role_realm-admin}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "manage-authorization", "view-authorization", "query-groups", "view-clients", "view-realm", "manage-users", "query-users", "impersonation", "manage-clients", "view-identity-providers", "create-client", "query-realms", "view-users", "view-events", "manage-identity-providers", "manage-events", "query-clients", "manage-realm" ] + } + }, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "98db35e3-833f-4b61-83af-fc50484fda57", + "name" : "view-clients", + "description" : "${role_view-clients}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-clients" ] + } + }, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "e0dc0e0c-eba4-4de7-b2eb-2ba095c4c6d4", + "name" : "manage-users", + "description" : "${role_manage-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "69ce3805-1897-4291-842b-b8e8e9f29bd7", + "name" : "view-realm", + "description" : "${role_view-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "3e803641-96b1-44d8-9de5-7dee83a0a75b", + "name" : "impersonation", + "description" : "${role_impersonation}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "2c92c3e5-1a0a-4318-9b63-617c5dca0b66", + "name" : "query-users", + "description" : "${role_query-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "326a3718-390d-4e41-af00-2197d3ef6858", + "name" : "manage-clients", + "description" : "${role_manage-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "e4c69181-5e0d-484e-ac31-be6beef57c28", + "name" : "create-client", + "description" : "${role_create-client}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "f4ac66cc-97b4-4590-beae-5ff23c9935b3", + "name" : "query-realms", + "description" : "${role_query-realms}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "a24704fe-13fd-40e6-bf2d-29014f63c069", + "name" : "view-identity-providers", + "description" : "${role_view-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "7deec87c-2716-40c1-a115-2a0fe840b119", + "name" : "view-users", + "description" : "${role_view-users}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-groups", "query-users" ] + } + }, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "827c40ae-b4c2-4574-9f34-db33925cd19c", + "name" : "view-events", + "description" : "${role_view-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "cbe05c62-2b07-4ac7-a33a-ffca7c176252", + "name" : "manage-events", + "description" : "${role_manage-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "8ca56814-a817-4849-a515-45399eb1dcc1", + "name" : "manage-identity-providers", + "description" : "${role_manage-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "1134c6df-d0ff-498d-9dc4-ad989f7cfe93", + "name" : "query-clients", + "description" : "${role_query-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + }, { + "id" : "3bb14549-60f6-4078-8f4e-47a1162412f2", + "name" : "manage-realm", + "description" : "${role_manage-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "attributes" : { } + } ], + "security-admin-console" : [ ], + "admin-cli" : [ ], + "spiffworkflow-backend" : [ { + "id" : "4d71d1bb-d627-43c8-bc07-d542f816e04b", + "name" : "spiffworkflow-admin", + "composite" : false, + "clientRole" : true, + "containerId" : "f44558af-3601-4e54-b854-08396a247544", + "attributes" : { } + }, { + "id" : "2341ca1c-24c8-4ddf-874c-7153c9408068", + "name" : "uma_protection", + "composite" : false, + "clientRole" : true, + "containerId" : "f44558af-3601-4e54-b854-08396a247544", + "attributes" : { } + }, { + "id" : "cf88054e-4bdc-491c-bf93-c660cdaad72d", + "name" : "repeat-form-role-2", + "composite" : false, + "clientRole" : true, + "containerId" : "f44558af-3601-4e54-b854-08396a247544", + "attributes" : { + "repeat-form-role-2-att-key" : [ "repeat-form-role-2-att-value" ] + } + } ], + "broker" : [ { + "id" : "6d688d72-cf5b-4450-a902-cb2d41f0e04c", + "name" : "read-token", + "description" : "${role_read-token}", + "composite" : false, + "clientRole" : true, + "containerId" : "55d75754-cf1b-4875-bf3e-15add4be8c99", + "attributes" : { } + } ], + "account" : [ { + "id" : "9c51c3e1-028d-4a0d-96dc-6619196b49f0", + "name" : "delete-account", + "description" : "${role_delete-account}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "f395d221-7f80-4fcf-90ac-0a89c8b15a9b", + "name" : "manage-consent", + "description" : "${role_manage-consent}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "view-consent" ] + } + }, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "7abb4169-1960-4b4d-b5ae-6ea45cf91ee4", + "name" : "view-consent", + "description" : "${role_view-consent}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "4d3c24ed-cc61-4a6e-ac78-47af4545b415", + "name" : "manage-account-links", + "description" : "${role_manage-account-links}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "a4954091-9be9-4b7c-a196-1af934917ff7", + "name" : "view-profile", + "description" : "${role_view-profile}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "0810773c-a57d-449e-a31f-1344e1eb4b9b", + "name" : "manage-account", + "description" : "${role_manage-account}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "manage-account-links" ] + } + }, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "f75e4973-b9b6-4ff0-a691-5f900199b17a", + "name" : "view-groups", + "description" : "${role_view-groups}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + }, { + "id" : "ae774a41-a274-4f99-9d7f-f4a0d5dbc085", + "name" : "view-applications", + "description" : "${role_view-applications}", + "composite" : false, + "clientRole" : true, + "containerId" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "attributes" : { } + } ] + } + }, + "groups" : [ { + "id" : "47f7e95a-ea3a-458f-a5a7-fba8cbf6db9a", + "name" : "test_group_from_open_id", + "path" : "/test_group_from_open_id", + "subGroups" : [ ], + "attributes" : { }, + "realmRoles" : [ ], + "clientRoles" : { } + } ], + "defaultRole" : { + "id" : "c9f0ff93-642d-402b-965a-04d70719886b", + "name" : "default-roles-spiffworkflow", + "description" : "${role_default-roles}", + "composite" : true, + "clientRole" : false, + "containerId" : "spiffworkflow" + }, + "requiredCredentials" : [ "password" ], + "otpPolicyType" : "totp", + "otpPolicyAlgorithm" : "HmacSHA1", + "otpPolicyInitialCounter" : 0, + "otpPolicyDigits" : 6, + "otpPolicyLookAheadWindow" : 1, + "otpPolicyPeriod" : 30, + "otpPolicyCodeReusable" : false, + "otpSupportedApplications" : [ "totpAppFreeOTPName", "totpAppGoogleName", "totpAppMicrosoftAuthenticatorName" ], + "localizationTexts" : { }, + "webAuthnPolicyRpEntityName" : "keycloak", + "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyRpId" : "", + "webAuthnPolicyAttestationConveyancePreference" : "not specified", + "webAuthnPolicyAuthenticatorAttachment" : "not specified", + "webAuthnPolicyRequireResidentKey" : "not specified", + "webAuthnPolicyUserVerificationRequirement" : "not specified", + "webAuthnPolicyCreateTimeout" : 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyAcceptableAaguids" : [ ], + "webAuthnPolicyExtraOrigins" : [ ], + "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyPasswordlessRpId" : "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", + "webAuthnPolicyPasswordlessCreateTimeout" : 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], + "webAuthnPolicyPasswordlessExtraOrigins" : [ ], + "users" : [ { + "id" : "26b0e310-ea33-4cea-8bfd-a32dc6bc11d4", + "username" : "admin", + "email" : "admin@example.com", + "emailVerified" : false, + "createdTimestamp" : 1676302139599, + "enabled" : true, + "totp" : false, + "credentials" : [ { + "id" : "644ff652-31d1-4349-9340-ce3b5fb76b5c", + "type" : "password", + "createdDate" : 1676302139645, + "secretData" : "{\"value\":\"7H+4mWHu2+toP0Ub16iAmVPiq87j1AqvWUojpHvvzGE=\",\"salt\":\"KhS5/VUWg/2eJ2+V0gOC3Q==\",\"additionalParameters\":{}}", + "credentialData" : "{\"hashIterations\":5,\"algorithm\":\"argon2\",\"additionalParameters\":{\"hashLength\":[\"32\"],\"memory\":[\"7168\"],\"type\":[\"id\"],\"version\":[\"1.3\"],\"parallelism\":[\"1\"]}}" + } ], + "disableableCredentialTypes" : [ ], + "requiredActions" : [ ], + "realmRoles" : [ "default-roles-spiffworkflow" ], + "clientRoles" : { + "realm-management" : [ "realm-admin" ] + }, + "notBefore" : 0, + "groups" : [ ] + }, { + "id" : "24c7779e-f7d1-442f-8de1-9a5d61aaef0a", + "username" : "service-account-spiffworkflow-backend", + "emailVerified" : false, + "createdTimestamp" : 1722366626829, + "enabled" : true, + "totp" : false, + "serviceAccountClientId" : "spiffworkflow-backend", + "credentials" : [ ], + "disableableCredentialTypes" : [ ], + "requiredActions" : [ ], + "realmRoles" : [ "default-roles-spiffworkflow" ], + "clientRoles" : { + "spiffworkflow-backend" : [ "uma_protection" ] + }, + "notBefore" : 0, + "groups" : [ ] + } ], + "scopeMappings" : [ { + "clientScope" : "offline_access", + "roles" : [ "offline_access" ] + } ], + "clients" : [ { + "id" : "e39b3c85-bb9d-4c73-8250-be087c82ae48", + "clientId" : "account", + "name" : "${client_account}", + "rootUrl" : "${authBaseUrl}", + "baseUrl" : "/realms/spiffworkflow/account/", + "surrogateAuthRequired" : false, + "enabled" : false, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/realms/spiffworkflow/account/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "+", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "false", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "false", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "02fa6179-9399-4bb1-970f-c4d8e8b5f99f", + "clientId" : "admin-cli", + "name" : "${client_admin-cli}", + "description" : "", + "rootUrl" : "", + "adminUrl" : "", + "baseUrl" : "", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : false, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "+", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "false", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "false", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "client.use.lightweight.access.token.enabled" : "true", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : true, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "55d75754-cf1b-4875-bf3e-15add4be8c99", + "clientId" : "broker", + "name" : "${client_broker}", + "surrogateAuthRequired" : false, + "enabled" : false, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "+", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "true", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "false", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "4ce68130-aced-4e67-936a-8082dc843cc2", + "clientId" : "realm-management", + "name" : "${client_realm-management}", + "surrogateAuthRequired" : false, + "enabled" : false, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "+", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "true", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "false", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "7c82344d-d4ae-4599-bbce-583cc8848199", + "clientId" : "security-admin-console", + "name" : "${client_security-admin-console}", + "rootUrl" : "${authAdminUrl}", + "baseUrl" : "/admin/spiffworkflow/console/", + "surrogateAuthRequired" : false, + "enabled" : false, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/admin/spiffworkflow/console/*" ], + "webOrigins" : [ "+" ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "+", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "false", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "false", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "pkce.code.challenge.method" : "S256", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "client.use.lightweight.access.token.enabled" : "true", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : true, + "nodeReRegistrationTimeout" : 0, + "protocolMappers" : [ { + "id" : "949c8afa-a06e-4a86-9260-6f477fc9ad9d", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + } ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "f44558af-3601-4e54-b854-08396a247544", + "clientId" : "spiffworkflow-backend", + "name" : "", + "description" : "", + "rootUrl" : "", + "adminUrl" : "", + "baseUrl" : "", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "secret" : "JXeQExm0JhQPLumgHtIIqf52bDalHz0q", + "redirectUris" : [ "http://localhost:7000/*", "https://replace-me-with-spiff-backend-host-and-path/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : true, + "authorizationServicesEnabled" : true, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "saml.force.post.binding" : "false", + "saml.multivalued.roles" : "false", + "frontchannel.logout.session.required" : "false", + "post.logout.redirect.uris" : "https://replace-me-with-spiff-frontend-host-and-path/*##http://localhost:7001/*", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false", + "saml.server.signature.keyinfo.ext" : "false", + "use.refresh.tokens" : "true", + "realm_client" : "false", + "oidc.ciba.grant.enabled" : "false", + "backchannel.logout.session.required" : "true", + "client_credentials.use_refresh_token" : "false", + "require.pushed.authorization.requests" : "false", + "saml.client.signature" : "false", + "saml.allow.ecp.flow" : "false", + "id.token.as.detached.signature" : "false", + "saml.assertion.signature" : "false", + "client.secret.creation.time" : "1657115173", + "saml.encrypt" : "false", + "saml.server.signature" : "false", + "exclude.session.state.from.auth.response" : "false", + "saml.artifact.binding" : "false", + "saml_force_name_id_format" : "false", + "acr.loa.map" : "{}", + "tls.client.certificate.bound.access.tokens" : "false", + "saml.authnstatement" : "false", + "display.on.consent.screen" : "false", + "token.response.type.bearer.lower-case" : "false", + "saml.onetimeuse.condition" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : true, + "nodeReRegistrationTimeout" : -1, + "protocolMappers" : [ { + "id" : "af3598ab-74a9-48ba-956f-431b14acd896", + "name" : "Client IP Address", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "clientAddress", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "clientAddress", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "144579f3-168a-4dc3-a8ff-a9ac89dd7658", + "name" : "groups", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "introspection.token.claim" : "true", + "multivalued" : "true", + "user.attribute" : "foo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "groups", + "jsonType.label" : "String" + } + }, { + "id" : "87369cf7-2a77-40fd-a926-a26d689831a0", + "name" : "Client Host", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "clientHost", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "clientHost", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "2c78d7e8-0a99-43bd-bc29-0ba062ed8750", + "name" : "Client ID", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "clientId", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "clientId", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "a7692d41-b905-4049-9004-f6bea690051d", + "name" : "spiffworkflow-employeeid", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "aggregate.attrs" : "false", + "userinfo.token.claim" : "true", + "multivalued" : "false", + "user.attribute" : "spiffworkflow-employeeid", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "spiffworkflow-employeeid" + } + } ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ], + "authorizationSettings" : { + "allowRemoteResourceManagement" : true, + "policyEnforcementMode" : "ENFORCING", + "resources" : [ { + "name" : "everything", + "ownerManagedAccess" : false, + "attributes" : { }, + "uris" : [ "/*" ], + "scopes" : [ { + "name" : "read" + }, { + "name" : "update" + }, { + "name" : "delete" + }, { + "name" : "instantiate" + } ] + }, { + "name" : "Default Resource", + "type" : "urn:spiffworkflow-backend:resources:default", + "ownerManagedAccess" : false, + "attributes" : { }, + "uris" : [ "/*" ] + }, { + "name" : "process-model-with-repeating-form-crud", + "type" : "process-model", + "ownerManagedAccess" : false, + "displayName" : "process-model-with-repeating-form-crud", + "attributes" : { + "test_resource_att1" : [ "this_is_the_value" ] + }, + "uris" : [ "/process-models/category_number_one/process-model-with-repeating-form" ], + "scopes" : [ { + "name" : "read" + }, { + "name" : "update" + }, { + "name" : "delete" + }, { + "name" : "instantiate" + } ] + } ], + "policies" : [ { + "name" : "repeat-form-role-policy", + "type" : "role", + "logic" : "POSITIVE", + "decisionStrategy" : "UNANIMOUS", + "config" : { + "roles" : "[{\"id\":\"spiffworkflow-backend/repeat-form-role-2\",\"required\":false}]" + } + }, { + "name" : "admins have everything", + "type" : "role", + "logic" : "POSITIVE", + "decisionStrategy" : "UNANIMOUS", + "config" : { + "roles" : "[{\"id\":\"spiffworkflow-backend/spiffworkflow-admin\",\"required\":false}]" + } + }, { + "name" : "Default Policy", + "description" : "A policy that grants access only for users within this realm", + "type" : "role", + "logic" : "POSITIVE", + "decisionStrategy" : "AFFIRMATIVE", + "config" : { + "roles" : "[{\"id\":\"spiffworkflow-backend/repeat-form-role-2\",\"required\":false}]" + } + }, { + "name" : "repeat-form-read", + "type" : "scope", + "logic" : "POSITIVE", + "decisionStrategy" : "UNANIMOUS", + "config" : { + "resources" : "[\"process-model-with-repeating-form-crud\"]", + "scopes" : "[\"read\"]", + "applyPolicies" : "[\"repeat-form-role-policy\"]" + } + }, { + "name" : "all_permissions", + "type" : "resource", + "logic" : "POSITIVE", + "decisionStrategy" : "UNANIMOUS", + "config" : { + "resources" : "[\"everything\"]", + "applyPolicies" : "[\"admins have everything\"]" + } + }, { + "name" : "Default Permission", + "description" : "A permission that applies to the default resource type", + "type" : "resource", + "logic" : "POSITIVE", + "decisionStrategy" : "UNANIMOUS", + "config" : { + "defaultResourceType" : "urn:spiffworkflow-backend:resources:default", + "applyPolicies" : "[\"Default Policy\"]" + } + } ], + "scopes" : [ { + "name" : "read", + "displayName" : "read" + }, { + "name" : "update", + "displayName" : "update" + }, { + "name" : "delete", + "displayName" : "delete" + }, { + "name" : "instantiate", + "displayName" : "instantiate" + } ], + "decisionStrategy" : "UNANIMOUS" + } + } ], + "clientScopes" : [ { + "id" : "fa3d9944-cf66-4af9-b931-1f3b02943e5b", + "name" : "acr", + "description" : "OpenID Connect scope for add acr (authentication context class reference) to the token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "12ad0a69-d414-4b5b-9f5f-b647db5f8959", + "name" : "acr loa level", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-acr-mapper", + "consentRequired" : false, + "config" : { + "id.token.claim" : "true", + "access.token.claim" : "true", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "4e69d058-1229-4704-9411-decf25da0a49", + "name" : "profile", + "description" : "OpenID Connect built-in scope: profile", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "consent.screen.text" : "${profileScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "d0d7334e-3f11-45d2-9670-46dbc1977cb2", + "name" : "full name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-full-name-mapper", + "consentRequired" : false, + "config" : { + "id.token.claim" : "true", + "access.token.claim" : "true", + "userinfo.token.claim" : "true" + } + }, { + "id" : "4efcf169-4df2-4cdb-b331-005aff1cee28", + "name" : "website", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "website", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "website", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "3f639f2f-cf0e-4651-ab93-15a77023b5a0", + "name" : "given name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "firstName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "given_name", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "16e93663-bf6a-4f6d-b5ab-8e68bf118f72", + "name" : "nickname", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "nickname", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "nickname", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "b9c97283-8153-4c4d-b8d8-dd1bde17823b", + "name" : "username", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "preferred_username", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "eeead6c7-1dae-4be1-9eca-988ffb38aaf4", + "name" : "zoneinfo", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "zoneinfo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "zoneinfo", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "d62991bc-2583-42be-bb08-8d1527c4f162", + "name" : "family name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "lastName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "family_name", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "9f761222-f84d-4a25-a53f-13e196d38a46", + "name" : "profile", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "profile", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "profile", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "ec866e3c-582f-4c99-920f-d57cf03d772d", + "name" : "gender", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "gender", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "gender", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "b05e679c-e00e-427e-8e47-0a4fd411c7a6", + "name" : "updated at", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "updatedAt", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "updated_at", + "jsonType.label" : "long", + "userinfo.token.claim" : "true" + } + }, { + "id" : "fe4a096a-cede-4775-affa-b0cc6d630b70", + "name" : "groups", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-group-membership-mapper", + "consentRequired" : false, + "config" : { + "full.path" : "true", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "groups", + "userinfo.token.claim" : "true" + } + }, { + "id" : "505ff402-5533-48ea-91f9-ab4804c3826b", + "name" : "middle name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "middleName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "middle_name", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "d546af31-b669-442b-9a9d-8a6478364002", + "name" : "picture", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "picture", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "picture", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "5a75c993-290f-4bfb-9044-5d7d269378b2", + "name" : "birthdate", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "birthdate", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "birthdate", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "2d387240-0f2f-4f30-8464-0e7c57946743", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "2efee39d-723c-44af-9eb1-4dde9635b249", + "name" : "email", + "description" : "OpenID Connect built-in scope: email", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "consent.screen.text" : "${emailScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "5bf7db0f-a915-43c2-bff4-475ee5c3259b", + "name" : "email", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "email", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "687a8c7d-c93f-47d9-a176-78b0954429c7", + "name" : "email verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "emailVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email_verified", + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "4a7737cf-83e3-40e1-b36d-9566b34e4148", + "name" : "phone", + "description" : "OpenID Connect built-in scope: phone", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "consent.screen.text" : "${phoneScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "14bd2816-a2f3-4fde-9ac2-452dea2e9e58", + "name" : "phone number", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "phoneNumber", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + }, { + "id" : "6172e315-8999-4df8-89fa-75ffd1981793", + "name" : "phone number verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "phoneNumberVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number_verified", + "jsonType.label" : "boolean", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "5ad0c621-d3ec-4018-98c8-d6fb630d661f", + "name" : "microprofile-jwt", + "description" : "Microprofile - JWT built-in scope", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "252fdd9f-cc91-4ca3-aaab-cdf053360e94", + "name" : "groups", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "multivalued" : "true", + "userinfo.token.claim" : "true", + "user.attribute" : "foo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "groups", + "jsonType.label" : "String" + } + }, { + "id" : "8e9b880e-6dd8-4e2f-ade2-77fc8fd0bc6d", + "name" : "upn", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "upn", + "jsonType.label" : "String", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "77ca4f26-3777-451b-a907-e258f46f7b95", + "name" : "roles", + "description" : "OpenID Connect scope for add user roles to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "consent.screen.text" : "${rolesScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "e7ebb9c0-5ed3-4c6f-bb69-22e01d26b49f", + "name" : "audience resolve", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-audience-resolve-mapper", + "consentRequired" : false, + "config" : { } + }, { + "id" : "66fd470f-419e-44cd-822e-43df8ee5fe1b", + "name" : "realm roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "realm_access.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + }, { + "id" : "f3c313bc-7da7-4cf6-a0df-b62e77209b7c", + "name" : "client roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-client-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "resource_access.${client_id}.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + } ] + }, { + "id" : "3e9849f5-15ff-43c6-b929-40f26fda2c05", + "name" : "offline_access", + "description" : "OpenID Connect built-in scope: offline_access", + "protocol" : "openid-connect", + "attributes" : { + "consent.screen.text" : "${offlineAccessScopeConsentText}", + "display.on.consent.screen" : "true" + } + }, { + "id" : "ffda6ea6-8add-4c7e-9754-66d00c6735a1", + "name" : "web-origins", + "description" : "OpenID Connect scope for add allowed web origins to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "consent.screen.text" : "", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "05635d42-8bb3-440b-b871-b64c97f524da", + "name" : "allowed web origins", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-allowed-origins-mapper", + "consentRequired" : false, + "config" : { } + } ] + }, { + "id" : "6f56ae2b-253f-40f7-ba99-e8c5bbc71423", + "name" : "role_list", + "description" : "SAML role list", + "protocol" : "saml", + "attributes" : { + "consent.screen.text" : "${samlRoleListScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "7036c17a-9306-4481-82a1-d8d9d77077e5", + "name" : "role list", + "protocol" : "saml", + "protocolMapper" : "saml-role-list-mapper", + "consentRequired" : false, + "config" : { + "single" : "false", + "attribute.nameformat" : "Basic", + "attribute.name" : "Role" + } + } ] + }, { + "id" : "ce4493c0-ccb4-45f9-a46e-a40cc3f6d4b2", + "name" : "address", + "description" : "OpenID Connect built-in scope: address", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "consent.screen.text" : "${addressScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "8a0d3248-d231-40b2-9b8e-3d63bd5a5d12", + "name" : "address", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-address-mapper", + "consentRequired" : false, + "config" : { + "user.attribute.formatted" : "formatted", + "user.attribute.country" : "country", + "user.attribute.postal_code" : "postal_code", + "userinfo.token.claim" : "true", + "user.attribute.street" : "street", + "id.token.claim" : "true", + "user.attribute.region" : "region", + "access.token.claim" : "true", + "user.attribute.locality" : "locality" + } + } ] + }, { + "id" : "7cade407-da52-4f51-bc95-5bc2986d7ad6", + "name" : "basic", + "description" : "OpenID Connect scope for add all basic claims to the token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "7d25d163-7fc8-4384-92fc-bcbc1ae8a833", + "name" : "auth_time", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usersessionmodel-note-mapper", + "consentRequired" : false, + "config" : { + "user.session.note" : "AUTH_TIME", + "id.token.claim" : "true", + "introspection.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "auth_time", + "jsonType.label" : "long" + } + }, { + "id" : "3cbe1c84-33b0-40e1-b68d-574dae2a03d9", + "name" : "sub", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-sub-mapper", + "consentRequired" : false, + "config" : { + "introspection.token.claim" : "true", + "access.token.claim" : "true" + } + } ] + } ], + "defaultDefaultClientScopes" : [ "email", "profile", "role_list", "roles", "acr", "web-origins", "basic" ], + "defaultOptionalClientScopes" : [ "offline_access", "phone", "microprofile-jwt", "address" ], + "browserSecurityHeaders" : { + "contentSecurityPolicyReportOnly" : "", + "xContentTypeOptions" : "nosniff", + "referrerPolicy" : "no-referrer", + "xRobotsTag" : "none", + "xFrameOptions" : "SAMEORIGIN", + "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection" : "1; mode=block", + "strictTransportSecurity" : "max-age=31536000; includeSubDomains" + }, + "smtpServer" : { }, + "eventsEnabled" : false, + "eventsListeners" : [ "jboss-logging" ], + "enabledEventTypes" : [ ], + "adminEventsEnabled" : false, + "adminEventsDetailsEnabled" : false, + "identityProviders" : [ ], + "identityProviderMappers" : [ ], + "components" : { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { + "id" : "b8617465-1c84-4a5f-a16f-a6f10f0f66b1", + "name" : "Trusted Hosts", + "providerId" : "trusted-hosts", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "host-sending-registration-request-must-match" : [ "true" ], + "client-uris-must-match" : [ "true" ] + } + }, { + "id" : "6061713a-c1f5-46e1-adfb-762b8768976a", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-property-mapper", "oidc-usermodel-attribute-mapper", "oidc-address-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper" ] + } + }, { + "id" : "d68e938d-dde6-47d9-bdc8-8e8523eb08cd", + "name" : "Max Clients Limit", + "providerId" : "max-clients", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "max-clients" : [ "200" ] + } + }, { + "id" : "1209fa5d-37df-4f9a-b4fa-4a3cd94e21fe", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "oidc-full-name-mapper", "saml-role-list-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-attribute-mapper" ] + } + }, { + "id" : "3854361d-3fe5-47fb-9417-a99592e3dc5c", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + }, { + "id" : "4c4076ec-68ed-46c1-b0a5-3c8ed08dd4f6", + "name" : "Consent Required", + "providerId" : "consent-required", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "bbbe2ea2-2a36-494b-b57f-8b202740ebf4", + "name" : "Full Scope Disabled", + "providerId" : "scope", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "41eef3e1-bf71-4e8a-b729-fea8eb16b5d8", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + } ], + "org.keycloak.userprofile.UserProfileProvider" : [ { + "id" : "576f8c6a-00e6-45dd-a63d-614100fb2cc4", + "providerId" : "declarative-user-profile", + "subComponents" : { }, + "config" : { + "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ] + } + } ], + "org.keycloak.keys.KeyProvider" : [ { + "id" : "1f9958a4-b3ac-4a1b-af95-fd8e6053864a", + "name" : "hmac-generated", + "providerId" : "hmac-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "0e64ccae-03a6-484f-b453-1ddec0e77d70" ], + "secret" : [ "vkyt6IHy19NlCwU0a3TSxVPGyZdSTjKEEDotaUWtU0mX8dhjOmLbegb83hKF0SkANHLYLTjfHTX2k3KIRr959wIxyR4pthjst_SstqRaLczcW1s8_sKzgQl90zNoY1OGU3Uneke6wDg0gIAuPjPILvKjj48LEyjdnJyH99FqdxU" ], + "priority" : [ "100" ], + "algorithm" : [ "HS256" ] + } + }, { + "id" : "70fe0720-f3b7-47b4-a625-ae8fb6635da1", + "name" : "aes-generated", + "providerId" : "aes-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "76118b54-fc74-4149-9028-fab1fdc07860" ], + "secret" : [ "DvxTn0KA4TEUPqSFBw8qAw" ], + "priority" : [ "100" ] + } + }, { + "id" : "08f0a677-76e8-4713-a3ae-41d48db61cf3", + "name" : "hmac-generated-hs512", + "providerId" : "hmac-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "8c1cf7f1-c91c-42e0-9b7f-5eafab51dbae" ], + "secret" : [ "3USf7gzFw511KYuau8pmcyk_UZVtRGDMzajvSRhNtTfidVt81jwyODPY0gwWPPQiL4T4_AKH0avhu0wSNrl2QBKhwFkyWDrdYFaHFSLQrBArdi7S267y6SL2XMPbrcmvjCqpPEvP5phh9f4AM9m9A1fYYtTgimBkXSSYDNO4lvw" ], + "priority" : [ "100" ], + "algorithm" : [ "HS512" ] + } + }, { + "id" : "a12fdd97-1d72-4d9e-9e6a-f9e0b5d4e5f0", + "name" : "rsa-generated", + "providerId" : "rsa-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEpAIBAAKCAQEAimbfmG2pL3qesWhUrQayRyYBbRFE0Ul5Ii/AW8Kq6Kad9R2n2sT2BvXWnsWBH6KuINUFJz3Tb+gWy235Jy0Idmekwx63JR20//ZJ7dyQ+b1iadmYPpqyixGL7NrVxQYT0AEGLcD/Fwsh869F3jgfQt7N15q2arRnOrW5NMwi+IvtHxZRZ3UluxShut2577ef8cakwCv4zoTV29y+Z3XhtlKZ4WOCuqIHL3SRHwNkb+k8cY0Gwc88FHl/ihFR0fX/lc7W2AHRd98ex8il4kBFfShBZur8ZLE7QWQdXRY2EYYr3D/W6/5wf/R2fAvbVmGzcYGZ2qm6d+K1XH8VU3X84wIDAQABAoIBABXXrHwa+nOCz57CD3MLNoGiDuGOsySwisyJartQmraC7TTtDDurkASDMe72zq0WeJK368tIp6DmqQpL/eFf6xD8xHUC2PajnJg033AJuluftvNroupmcb0e9M1ZsBkbH29Zagc4iUmyuRYDWGx8wPpFvYjEYvuuIwiR+3vIp9A/0ZbcBwdtml3Of5gYTXChPj28PrA4K7oFib2Zu1aYCBEdF8h9bKRF/UlvyWeSajjddexSQ6gkEjzAEMpliCDbOGSFGwNu1pY7FF4EpyJbalzdpn44m5v9bqfS9/CDrIOOUus88Nn5wCD2OAmAQnWn0Hnh7at4A5fw3VBUmEt70ckCgYEAx0Fg8Gp3SuMaytrf9HJHJcltyDRsdSxysF1ZvDV9cDUsD28QOa/wFJRVsABxqElU+W6QEc20NMgOHVyPFed5UhQA6WfmydzGIcF5C6T5IbE/5Uk3ptGuPdI0aR7rlRfefQOnUBr28dz5UDBTb93t9+Klxcss+nLGRbugnFBAtTUCgYEAsdD+92nuF/GfET97vbHxtJ6+epHddttWlsa5PVeVOZBE/LUsOZRxmxm4afvZGOkhUrvmA1+U0arcp9crS5+Ol2LUGh/9efqLvoBImBxLwB37VcIYLJi0EVPrhVPh+9r3vah1YMBhtapS0VtuEZOr47Yz7asBg1s1Z06l+bD1JLcCgYA+3YS9NYn/qZl5aQcBs9B4vo2RfeC+M1DYDgvS0rmJ3mzRTcQ7vyOrCoXiarFxW/mgXN69jz4M7RVu9BX83jQrzj3fZjWteKdWXRlYsCseEzNKnwgc7MjhnmGEzQmc15QNs0plfqxs8MAEKcsZX1bGP873kbvWJMIjnCf3SWaxBQKBgQCh9zt2w19jIewA+vFMbXw7SGk6Hgk6zTlG50YtkMxU/YtJIAFjhUohu8DVkNhDr35x7MLribF1dYu9ueku3ew1CokmLsNkywllAVaebw+0s9qOV9hLLuC989HQxQJPtTj54SrhcPrPTZBYME7G5dqo9PrB3oTnUDoJmoLmOABjawKBgQCeyd12ShpKYHZS4ZvE87OfXanuNfpVxhcXOqYHpQz2W0a+oUu9e78MlwTVooR4O52W/Ohch2FPEzq/1DBjJrK6PrMY8DS018BIVpQ9DS35/Ga9NtSi8DX7jTXacYPwL9n/+//U3vw0mjaoMXgCv44nYu4ro62J6wvVM98hjQmLJw==" ], + "keyUse" : [ "SIG" ], + "certificate" : [ "MIICqTCCAZECBgGBz6+bXzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1zcGlmZndvcmtmbG93MB4XDTIyMDcwNTE4NDUwMVoXDTMyMDcwNTE4NDY0MVowGDEWMBQGA1UEAwwNc3BpZmZ3b3JrZmxvdzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIpm35htqS96nrFoVK0GskcmAW0RRNFJeSIvwFvCquimnfUdp9rE9gb11p7FgR+iriDVBSc902/oFstt+SctCHZnpMMetyUdtP/2Se3ckPm9YmnZmD6asosRi+za1cUGE9ABBi3A/xcLIfOvRd44H0Lezdeatmq0Zzq1uTTMIviL7R8WUWd1JbsUobrdue+3n/HGpMAr+M6E1dvcvmd14bZSmeFjgrqiBy90kR8DZG/pPHGNBsHPPBR5f4oRUdH1/5XO1tgB0XffHsfIpeJARX0oQWbq/GSxO0FkHV0WNhGGK9w/1uv+cH/0dnwL21Zhs3GBmdqpunfitVx/FVN1/OMCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAaI7BEPZpf4MU7bMWmNgyfRTRDy5wtpyfuLPGHZ9EqtnvwwzsmlmXXsC55SLXx3wJETm+rFqeRFbo/hamlRajzzD317AUpE7nhnONTukmh6UuB8hXoWiQTD+YDYMy8kneSP4zvfm27F+TgUC4cvJSYuWVaCxFx52kxqW1hZkBzYUcfi21Qb1jRrbTbso37BxuVX+GdN015If3DPD6QnAhLPAYEFA9jiL16YeMdWHdvlXXmvriDegMUYQjFYPRh6iPzUEdG6KGHItF4AkOYBQAcoaYhfxpxofVlDdOqMZ/1c7AAbe4lR6/jYQ0CbHwdUu4dzJQe3vxr7GdxcB1ypvXPA==" ], + "priority" : [ "100" ] + } + }, { + "id" : "e16c740d-3ae2-4cc5-a68d-49d99e079672", + "name" : "rsa-enc-generated", + "providerId" : "rsa-enc-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEowIBAAKCAQEAsqGsclDQDFSTn8HS1LiiNAnTwn3CS8HXPLDYMHr/jUQ8r5eD+vQY5ICh5V5c8l8J6ydbpzffFEKam54Ypp4yzaWJZ4huYBMf4vL7xrAZ4VXBreu16BIxOrThzrJe9WmI8+Annzo62mNYZbjf4WNpZDURmxZSo7v6Czprd5O6T4N5bxr8sjRRptZR8hxtrRvJnuC0jF+dLHIO5SKR1hUVG/gbpIBqGcsLkNC9nnS6M/N5YFzUIV5JhXo3+mrR/yvw7m+oS5yRsN0raCSXVenNP05Dhsd4FOYqoXBBcdgXXbiDxed0HWB/g5dASqyMydHriddGr8FU0W8/uZmF79wxPwIDAQABAoIBAFsWCaL5Bj1jWytZYDJMO5mhcTN5gPu0ShaObo66CVl1dCRtdEUg9xh9ZxBYf7ivMZWRKjEoUj44gDHd+d/sRyeJw3jhnraqydWl5TC5V1kJq4sN6GH/9M5kscf+OGGXgNgqcsnEnYICqm6kSLTbRkBstx+H0HfhQG09StNcpuIn4MsoMZT8XmZbXRLb3FhfpuTSX3t2nbSDRfUf7LI1EDnFQen/AJAA5lOHthLCdz4Gj1vfalOFjCMYOUWmL/mCDEb38F6QJZxkyhmS/r2kM09PFLOio6z3J8C8mVeq7uao0s5xAKj5SJqx4r+TTvL5aOF8JBWm8Hz1Vcip9/MjsQECgYEA/8Hpb4RggNyn+YzTxqxtPtbLFL0YywtNT+gutmJH1gyTjfx7p3dmA/NsdIeuJmBpZfA7oDXIqfj2M9QLfC5bdKnggQzrIO3BgClI88zOIWd229Bt6D1yx92k4+9eaRwOKBPn8+u0mCk8TBv32ecMLQ9o8AKNIHeCZQjByvOrIMECgYEAss0J3TzrRuEOpnxJ9fNOeB3rNpIFrpNua+oEQI4gDbBvyT7osBKkGqfXJpUQMftr8a6uBHLHV7/Wq6/aRkRhk+aER8h01DUIWGLmbCUdkFSJZ8iObMZQvURtckhzxxhYu0Ybwn0RJg/zzR4onTRO+eL1fTnb5Id55PyPt3Pp0f8CgYEAovDOoP6MYOyzk5h1/7gwrX04ytCicBGWQtdgk0/QBn3ir+3wdcPq2Y+HREKA3/BClfBUfIBnhGqZqHFqk8YQ/CWSY4Vwc30l71neIX0UwlFhdy+2JeSoMM9z0sfYtUxrdHsiJtO/LcXvpWmYIVpC9p4/s9FcShf5mhbXKE7PcsECgYBN7qqvAH94LF4rWJ8QEZWRK1E7Ptg1KFOHu79Qt+HmtZFzwPTA0c8vQxq22V/uuSxqcf2tOK4EZDxYJtTXrbRuN5pOg2PQnrDdfXX7iw3gu8gMMVFKvgGxDSM7HbNBAy6hqcQtuD+CPI/CRrPjGUqXBkKD63UZnacWlLK7fk1a1wKBgExUaqOBKmr0vldVn66E1XzZj4F4+fV5Ggka9289pBNBRlJFD4VmIYkDkOrLimyy2cYeCkocrOvF6HMJqTcOzD50pj44OWkYFRbs6vK0S7iLSX0eR158XOR9C+uZzp1vIA4sYwW3504HVdVoIU5M8ItSgDsFjGnvHopTGu3MBWPT" ], + "keyUse" : [ "ENC" ], + "certificate" : [ "MIICqTCCAZECBgGBz6+byzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1zcGlmZndvcmtmbG93MB4XDTIyMDcwNTE4NDUwMVoXDTMyMDcwNTE4NDY0MVowGDEWMBQGA1UEAwwNc3BpZmZ3b3JrZmxvdzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALKhrHJQ0AxUk5/B0tS4ojQJ08J9wkvB1zyw2DB6/41EPK+Xg/r0GOSAoeVeXPJfCesnW6c33xRCmpueGKaeMs2liWeIbmATH+Ly+8awGeFVwa3rtegSMTq04c6yXvVpiPPgJ586OtpjWGW43+FjaWQ1EZsWUqO7+gs6a3eTuk+DeW8a/LI0UabWUfIcba0byZ7gtIxfnSxyDuUikdYVFRv4G6SAahnLC5DQvZ50ujPzeWBc1CFeSYV6N/pq0f8r8O5vqEuckbDdK2gkl1XpzT9OQ4bHeBTmKqFwQXHYF124g8XndB1gf4OXQEqsjMnR64nXRq/BVNFvP7mZhe/cMT8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEArDDC7bYbuBg33PbUQi7P77lV7PuE9uQU1F3HqulhkARQeM/xmBdJRj9CHjj62shkI3An70tJtGBJkVAHltmvjC+A6IDO5I8IbnPkvWJFu9HwphdP/C1HXYmGPPe7yGdKpy6mdCZ+LMZP7BENhOlx9yXLDFYtcGvqZ4u3XvfsLqUsRGqZHNlhVJD13dUbI6pvbwMsb3gIxozgTIa2ySHMbHafln2UQk5jD0eOIVkaNAdlHqMHiBpPjkoVxnhAmJ/dUIAqKBvuIbCOu9N0kOQSl82LqC7CZ21JCyT86Ll3n1RTkxY5G3JzGW4dyJMOGSyVnWaQ9Z+C92ZMFcOt611M2A==" ], + "priority" : [ "100" ], + "algorithm" : [ "RSA-OAEP" ] + } + } ] + }, + "internationalizationEnabled" : false, + "supportedLocales" : [ ], + "authenticationFlows" : [ { + "id" : "62d7bb2a-5919-48b2-a9f9-511ecf5474c7", + "alias" : "Account verification options", + "description" : "Method with which to verity the existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-email-verification", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Verify Existing Account by Re-authentication", + "userSetupAllowed" : false + } ] + }, { + "id" : "34e18ea8-f515-46dc-9dbf-5b79f8154564", + "alias" : "Browser - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "933e581c-56d8-4614-b2a3-d2db10397ea0", + "alias" : "Direct Grant - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "direct-grant-validate-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "0986dc8c-4bcf-477f-8ba2-3cac02ea656f", + "alias" : "First broker login - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "534381e4-b0b9-43b2-9ac5-9f1e006b5920", + "alias" : "Handle Existing Account", + "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-confirm-link", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Account verification options", + "userSetupAllowed" : false + } ] + }, { + "id" : "922e84ab-85db-494a-8a8c-84d3b0c675f4", + "alias" : "Reset - Conditional OTP", + "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "24b1b409-b6fc-44dc-9a97-93b2f4a78c89", + "alias" : "User creation or linking", + "description" : "Flow for the existing/non-existing user alternatives", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "create unique user config", + "authenticator" : "idp-create-user-if-unique", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Handle Existing Account", + "userSetupAllowed" : false + } ] + }, { + "id" : "c015a916-a45b-4797-a466-2399164da6fe", + "alias" : "Verify Existing Account by Re-authentication", + "description" : "Reauthentication of existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "First broker login - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "fc7aec31-855b-4993-b770-57660ff0524f", + "alias" : "browser", + "description" : "browser based authentication", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-cookie", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-spnego", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "identity-provider-redirector", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 25, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "autheticatorFlow" : true, + "flowAlias" : "forms", + "userSetupAllowed" : false + } ] + }, { + "id" : "9769d765-42c8-4391-a7ec-aa24f0e84040", + "alias" : "clients", + "description" : "Base authentication for clients", + "providerId" : "client-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "client-secret", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-secret-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-x509", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 40, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "49a937cc-9d51-43d0-a379-67aaae38c51a", + "alias" : "direct grant", + "description" : "OpenID Connect Resource Owner Grant", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "direct-grant-validate-username", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "direct-grant-validate-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 30, + "autheticatorFlow" : true, + "flowAlias" : "Direct Grant - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "1a766b69-7ead-442a-84a4-083cd84949cd", + "alias" : "docker auth", + "description" : "Used by Docker clients to authenticate against the IDP", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "docker-http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "e4ac0543-cfb6-4232-947d-52b8615e0629", + "alias" : "first broker login", + "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "review profile config", + "authenticator" : "idp-review-profile", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "User creation or linking", + "userSetupAllowed" : false + } ] + }, { + "id" : "86247ee8-b507-406b-9d32-3c68c80084a5", + "alias" : "forms", + "description" : "Username, password, otp and other auth forms.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Browser - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "89abf09a-bfb4-4dea-b164-ca7c563b4009", + "alias" : "registration", + "description" : "registration flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-page-form", + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : true, + "flowAlias" : "registration form", + "userSetupAllowed" : false + } ] + }, { + "id" : "52d31bf0-dcb6-4b01-a252-b2ba705df036", + "alias" : "registration form", + "description" : "registration form", + "providerId" : "form-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-user-creation", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "registration-password-action", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 50, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "registration-recaptcha-action", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 60, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "22041b6b-6d9e-43eb-8d2a-94a3052c49aa", + "alias" : "reset credentials", + "description" : "Reset credentials for a user if they forgot their password or something", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "reset-credentials-choose-user", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-credential-email", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 30, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 40, + "autheticatorFlow" : true, + "flowAlias" : "Reset - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "153aaf25-b6d9-42b4-9740-f63c94c16626", + "alias" : "saml ecp", + "description" : "SAML ECP Profile Authentication Flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + } ], + "authenticatorConfig" : [ { + "id" : "e0075b39-a2ad-47de-9ee6-e61073387e71", + "alias" : "create unique user config", + "config" : { + "require.password.update.after.registration" : "false" + } + }, { + "id" : "aa24bff3-bd25-4b2a-973f-63fea5c21dd1", + "alias" : "review profile config", + "config" : { + "update.profile.on.first.login" : "missing" + } + } ], + "requiredActions" : [ { + "alias" : "CONFIGURE_TOTP", + "name" : "Configure OTP", + "providerId" : "CONFIGURE_TOTP", + "enabled" : true, + "defaultAction" : false, + "priority" : 10, + "config" : { } + }, { + "alias" : "TERMS_AND_CONDITIONS", + "name" : "Terms and Conditions", + "providerId" : "TERMS_AND_CONDITIONS", + "enabled" : false, + "defaultAction" : false, + "priority" : 20, + "config" : { } + }, { + "alias" : "UPDATE_PASSWORD", + "name" : "Update Password", + "providerId" : "UPDATE_PASSWORD", + "enabled" : true, + "defaultAction" : false, + "priority" : 30, + "config" : { } + }, { + "alias" : "UPDATE_PROFILE", + "name" : "Update Profile", + "providerId" : "UPDATE_PROFILE", + "enabled" : true, + "defaultAction" : false, + "priority" : 40, + "config" : { } + }, { + "alias" : "VERIFY_EMAIL", + "name" : "Verify Email", + "providerId" : "VERIFY_EMAIL", + "enabled" : true, + "defaultAction" : false, + "priority" : 50, + "config" : { } + }, { + "alias" : "delete_account", + "name" : "Delete Account", + "providerId" : "delete_account", + "enabled" : false, + "defaultAction" : false, + "priority" : 60, + "config" : { } + }, { + "alias" : "delete_credential", + "name" : "Delete Credential", + "providerId" : "delete_credential", + "enabled" : true, + "defaultAction" : false, + "priority" : 100, + "config" : { } + }, { + "alias" : "update_user_locale", + "name" : "Update User Locale", + "providerId" : "update_user_locale", + "enabled" : true, + "defaultAction" : false, + "priority" : 1000, + "config" : { } + } ], + "browserFlow" : "browser", + "registrationFlow" : "registration", + "directGrantFlow" : "direct grant", + "resetCredentialsFlow" : "reset credentials", + "clientAuthenticationFlow" : "clients", + "dockerAuthenticationFlow" : "docker auth", + "firstBrokerLoginFlow" : "first broker login", + "attributes" : { + "cibaBackchannelTokenDeliveryMode" : "poll", + "cibaAuthRequestedUserHint" : "login_hint", + "clientOfflineSessionMaxLifespan" : "0", + "oauth2DevicePollingInterval" : "5", + "clientSessionIdleTimeout" : "0", + "actionTokenGeneratedByUserLifespan-execute-actions" : "", + "actionTokenGeneratedByUserLifespan-verify-email" : "", + "clientOfflineSessionIdleTimeout" : "0", + "actionTokenGeneratedByUserLifespan-reset-credentials" : "", + "cibaInterval" : "5", + "realmReusableOtpCode" : "false", + "cibaExpiresIn" : "120", + "oauth2DeviceCodeLifespan" : "600", + "actionTokenGeneratedByUserLifespan-idp-verify-account-via-email" : "", + "parRequestUriLifespan" : "60", + "clientSessionMaxLifespan" : "0" + }, + "keycloakVersion" : "26.0.7", + "userManagedAccessAllowed" : false, + "organizationsEnabled" : false, + "clientProfiles" : { + "profiles" : [ ] + }, + "clientPolicies" : { + "policies" : [ ] + } +} diff --git a/spiffworkflow-backend/poetry.lock b/spiffworkflow-backend/poetry.lock index 7e07ca35f..84a87931c 100644 --- a/spiffworkflow-backend/poetry.lock +++ b/spiffworkflow-backend/poetry.lock @@ -1190,13 +1190,13 @@ files = [ [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -1937,6 +1937,7 @@ files = [ {file = "psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4"}, {file = "psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067"}, {file = "psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e"}, + {file = "psycopg2-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:91fd603a2155da8d0cfcdbf8ab24a2d54bca72795b90d2a3ed2b6da8d979dee2"}, {file = "psycopg2-2.9.10-cp39-cp39-win32.whl", hash = "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b"}, {file = "psycopg2-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442"}, {file = "psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11"}, @@ -2079,13 +2080,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.9.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.extras] @@ -2837,19 +2838,23 @@ tornado = ["tornado (>=6)"] [[package]] name = "setuptools" -version = "72.1.0" +version = "75.7.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, + {file = "setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183"}, + {file = "setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "shellingham" @@ -3522,4 +3527,4 @@ tests-strict = ["pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==3.0.0)"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "79ac61ab5ead4b8042cd1a7ad12c54541d2de8fc23bfa41a76af123a009211f6" +content-hash = "ece4134e3f4258e155ce46eb689729fbb23d444584724aa62fccdb9d05cfef65" diff --git a/spiffworkflow-backend/pyproject.toml b/spiffworkflow-backend/pyproject.toml index eef559aa3..0e249bf84 100644 --- a/spiffworkflow-backend/pyproject.toml +++ b/spiffworkflow-backend/pyproject.toml @@ -39,7 +39,7 @@ spiffworkflow-connector-command = {git = "https://github.com/sartography/spiffwo # and to lower than 67 because i didn't feel like addressing # new deprecation warnings. we don't need this library explicitly, # but at one time it was pulled in by various libs we depend on. -setuptools = "^72.1.0" +setuptools = "^75.7.0" # we cannot upgrade werkzeug due to connexion. See comment in .snyk file werkzeug = "^2.3" @@ -47,9 +47,9 @@ connexion = {extras = [ "swagger-ui",], version = "^2"} lxml = "^5.3.0" marshmallow-enum = "^1.5.1" -PyJWT = "^2.9.0" +PyJWT = "^2.10.1" APScheduler = "*" -Jinja2 = "^3.1.3" +Jinja2 = "^3.1.5" RestrictedPython = "^7.4" Flask-SQLAlchemy = "^3" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_worker.py b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_worker.py index 49f1ed0d4..7bb6a4f7d 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_worker.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/background_processing/celery_worker.py @@ -26,6 +26,3 @@ def setup_loggers(logger: Any, *args: Any, **kwargs: Any) -> None: stdout_handler.setFormatter(log_formatter) logger.addHandler(stdout_handler) setup_logger_for_app(the_flask_app, logger, force_run_with_celery=True) - # this handler is getting added somewhere but not sure where so set its - # level really high since we do not need it - logging.getLogger("spiff").setLevel(logging.CRITICAL) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py index 8c6fb649b..46e830e77 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py @@ -118,12 +118,6 @@ def _set_up_open_id_scopes(app: Flask) -> None: ) if os.environ.get("SPIFFWORKFLOW_BACKEND_OPEN_ID_SCOPES") is None: scopes = app.config["SPIFFWORKFLOW_BACKEND_OPENID_SCOPE"].split(" ") - if ( - os.environ.get("SPIFFWORKFLOW_BACKEND_OPEN_ID_SCOPES") is None - and app.config["SPIFFWORKFLOW_BACKEND_OPEN_ID_IS_AUTHORITY_FOR_USER_GROUPS"] - and "groups" not in scopes - ): - scopes.append("groups") app.config["SPIFFWORKFLOW_BACKEND_OPEN_ID_SCOPES"] = scopes diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py index 4061f7895..88a7aa335 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py @@ -168,6 +168,7 @@ config_from_env("SPIFFWORKFLOW_BACKEND_LOG_LEVEL", default="info") config_from_env("SPIFFWORKFLOW_BACKEND_LOG_TO_FILE", default=False) config_from_env("SPIFFWORKFLOW_BACKEND_EVENT_STREAM_HOST", default=None) config_from_env("SPIFFWORKFLOW_BACKEND_EVENT_STREAM_PORT", default=None) +config_from_env("SPIFFWORKFLOW_BACKEND_EVENT_STREAM_SOURCE", default="spiffworkflow.org") ### permissions config_from_env("SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_ABSOLUTE_PATH") diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 16a59eabd..74b47681e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -70,11 +70,12 @@ def process_instance_create( process_instance = _process_instance_create(process_model_identifier) - LoggingService.log_event( - ProcessInstanceEventType.process_instance_created.value, - process_model_identifier=process_model_identifier, - process_instance_id=process_instance.id, - ) + log_extras = { + "milestone": "Started", + "process_model_identifier": process_model_identifier, + "process_instance_id": process_instance.id, + } + LoggingService.log_event(ProcessInstanceEventType.process_instance_created.value, log_extras) return Response( json.dumps(ProcessInstanceModelSchema().dump(process_instance)), diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py index ff101b071..21b895aa8 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/logging_service.py @@ -39,15 +39,11 @@ class SpiffLogHandler(SocketHandler): return json.dumps( { "version": "1.0", - "action": "add_event", - "event": { - "specversion": "1.0", - "type": record.name, - "id": str(uuid4()), - "source": "spiffworkflow.org", - "timestamp": datetime.utcnow().timestamp(), - "data": record._spiff_data, - }, + "type": record.name, + "id": str(uuid4()), + "source": self.app.config["SPIFFWORKFLOW_BACKEND_EVENT_STREAM_SOURCE"], + "timestamp": datetime.utcnow().timestamp(), + "data": record._spiff_data, } ) @@ -65,40 +61,49 @@ class SpiffLogHandler(SocketHandler): return None, None def filter(self, record: Any) -> bool: - if record.name.startswith("spiff") and getattr(record, "event_type", "") not in ["task_completed", "task_cancelled"]: + if record.name.startswith("spiff"): user_id, user_name = self.get_user_info() - data = { "message": record.msg, "userid": user_id, "username": user_name, + "process_instance_id": getattr(record, "process_instance_id", None), + "process_model_identifier": getattr(record, "process_model_identifier", None), } process_instance_id, process_model_identifier = self.get_default_process_info() - - if not hasattr(record, "process_instance_id"): + if data["process_instance_id"] is None: data["process_instance_id"] = process_instance_id - if not hasattr(record, "process_model_identifier"): + if data["process_model_identifier"] is None: data["process_model_identifier"] = process_model_identifier - task_properties_from_spiff = [ - "worflow_spec", - "task_spec", - "task_id", - "task_type", - "state", - "last_state_change", - "elapsed", - "parent", - ] - workflow_properties_from_spiff = ["completed", "success"] - properties_from_spiff = task_properties_from_spiff + workflow_properties_from_spiff - for attr in properties_from_spiff: + if record.name in "spiff.task": + properties = [ + "workflow_spec", + "task_spec", + "task_id", + "task_type", + "state", + "last_state_change", + "elapsed", + "parent", + ] + elif record.name == "spiff.workflow": + properties = ["workflow_spec", "completed", "success"] + elif record.name == "spiff.data": + properties = ["workflow_spec", "task_spec", "task_id", "task_type"] + elif record.name == "spiff.event": + properties = ["bpmn_name", "milestone", "task_id", "task_spec", "metadata", "error_info"] + else: + properties = [] + + for attr in properties: if hasattr(record, attr): - data[attr] = str(getattr(record, attr)) - else: - data[attr] = None - record._spiff_data = data + data[attr] = getattr(record, attr) + if not (data[attr] is None or isinstance(data[attr], dict)): + data[attr] = str(data[attr]) + record._spiff_data = data + return True else: return False @@ -296,25 +301,8 @@ def get_log_formatter(app: Flask) -> logging.Formatter: class LoggingService: - _spiff_logger = logging.getLogger("spiff") + _spiff_logger = logging.getLogger("spiff.event") @classmethod - def log_event( - cls, - event_type: str, - task_guid: str | None = None, - process_model_identifier: str | None = None, - process_instance_id: int | None = None, - ) -> None: - extra: dict[str, Any] = {"event_type": event_type} - - if task_guid is not None: - extra["task_guid"] = task_guid - - if process_model_identifier is not None: - extra["process_model_Identifier"] = process_model_identifier - - if process_instance_id is not None: - extra["process_instance_id"] = process_instance_id - - cls._spiff_logger.info(event_type, extra=extra) + def log_event(cls, message: str, log_extras: dict | None = None) -> None: + cls._spiff_logger.info(message, extra=log_extras) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 05ebe9541..2e5b6ba38 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -993,43 +993,14 @@ class ProcessInstanceProcessor: "lane_assignment_id": lane_assignment_id, } - def extract_metadata(self) -> None: - # we are currently not getting the metadata extraction paths based on the version in git from the process instance. - # it would make sense to do that if the shell-out-to-git performance cost was not too high. - # we also discussed caching this information in new database tables. something like: - # process_model_version - # id - # process_model_identifier - # git_hash - # display_name - # notification_type - # metadata_extraction - # id - # extraction_key - # extraction_path - # metadata_extraction_process_model_version - # process_model_version_id - # metadata_extraction_id - process_model_info = ProcessModelService.get_process_model(self.process_instance_model.process_model_identifier) - metadata_extraction_paths = process_model_info.metadata_extraction_paths - if metadata_extraction_paths is None: - return - if len(metadata_extraction_paths) <= 0: - return - - current_data = self.get_current_data() - for metadata_extraction_path in metadata_extraction_paths: - key = metadata_extraction_path["key"] - path = metadata_extraction_path["path"] - path_segments = path.split(".") - data_for_key = current_data - for path_segment in path_segments: - if path_segment in data_for_key: - data_for_key = data_for_key[path_segment] - else: - data_for_key = None # type: ignore - break + def extract_metadata(self) -> dict: + return ProcessModelService.extract_metadata( + self.process_instance_model.process_model_identifier, + self.get_current_data(), + ) + def store_metadata(self, metadata: dict) -> None: + for key, data_for_key in metadata.items(): if data_for_key is not None: pim = ProcessInstanceMetadataModel.query.filter_by( process_instance_id=self.process_instance_model.id, @@ -1190,21 +1161,26 @@ class ProcessInstanceProcessor: if self.process_instance_model.start_in_seconds is None: self.process_instance_model.start_in_seconds = round(time.time()) + metadata = self.extract_metadata() if self.process_instance_model.end_in_seconds is None: if self.bpmn_process_instance.is_completed(): self.process_instance_model.end_in_seconds = round(time.time()) if self._workflow_completed_handler is not None: self._workflow_completed_handler(self.process_instance_model) - LoggingService.log_event( - ProcessInstanceEventType.process_instance_completed.value, - ) + log_extras = { + "milestone": "Completed", + "process_model_identifier": self.process_instance_model.process_model_identifier, + "process_instance_id": self.process_instance_model.id, + "metadata": metadata, + } + LoggingService.log_event(ProcessInstanceEventType.process_instance_completed.value, log_extras) db.session.add(self.process_instance_model) human_tasks = HumanTaskModel.query.filter_by(process_instance_id=self.process_instance_model.id, completed=False).all() ready_or_waiting_tasks = self.get_all_ready_or_waiting_tasks() - self.extract_metadata() + self.store_metadata(metadata) self.update_summary() for ready_or_waiting_task in ready_or_waiting_tasks: @@ -1839,8 +1815,18 @@ class ProcessInstanceProcessor: task_guid=task_model.guid, user_id=user.id, exception=task_exception, + log_event=False, ) + log_extras = { + "task_id": str(spiff_task.id), + "task_spec": spiff_task.task_spec.name, + "bpmn_name": spiff_task.task_spec.bpmn_name, + "process_model_identifier": self.process_instance_model.process_model_identifier, + "process_instance_id": self.process_instance_model.id, + "metadata": self.extract_metadata(), + } + LoggingService.log_event(task_event, log_extras) # children of a multi-instance task has the attribute "triggered" set to True # so use that to determine if a spiff_task is apart of a multi-instance task # and therefore we need to process its parent since the current task will not diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_tmp_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_tmp_service.py index 1bf3fa8bf..3d51f2fd3 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_tmp_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_tmp_service.py @@ -1,5 +1,6 @@ import time import traceback +from typing import Any from flask import g from SpiffWorkflow.bpmn.exceptions import WorkflowTaskException # type: ignore @@ -32,6 +33,7 @@ class ProcessInstanceTmpService: timestamp: float | None = None, add_to_db_session: bool | None = True, migration_details: ProcessInstanceMigrationDetailDict | None = None, + log_event: bool = True, ) -> tuple[ProcessInstanceEventModel, ProcessInstanceErrorDetailModel | None]: if user_id is None and hasattr(g, "user") and g.user: user_id = g.user.id @@ -47,6 +49,8 @@ class ProcessInstanceTmpService: if add_to_db_session: db.session.add(process_instance_event) + log_extras: dict[str, Any] = {"task_id": task_guid} + process_instance_error_detail = None if exception is not None: # NOTE: I tried to move this to its own method but @@ -82,10 +86,19 @@ class ProcessInstanceTmpService: task_offset=task_offset, ) + log_extras["error_info"] = { + "trace": stacktrace, + "line_number": task_line_number, + "line_offset": task_offset, + "line_content": task_line_contents, + } + if add_to_db_session: db.session.add(process_instance_error_detail) - LoggingService.log_event(event_type, task_guid) + if log_event: + # Some events need to be logged elsewhere so that all required info can be included + LoggingService.log_event(event_type, log_extras) if migration_details is not None: pi_detail = cls.add_process_instance_migration_detail(process_instance_event, migration_details) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py index 401092c30..d84dc8de5 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py @@ -126,6 +126,46 @@ class ProcessModelService(FileSystemService): full_json_data = {**existing_json, **json_data} cls.write_json_file(json_path, full_json_data) + @classmethod + def extract_metadata(cls, process_model_identifier: str, current_data: dict) -> dict[str, Any]: + # we are currently not getting the metadata extraction paths based on the version in git from the process instance. + # it would make sense to do that if the shell-out-to-git performance cost was not too high. + # we also discussed caching this information in new database tables. something like: + # process_model_version + # id + # process_model_identifier + # git_hash + # display_name + # notification_type + # metadata_extraction + # id + # extraction_key + # extraction_path + # metadata_extraction_process_model_version + # process_model_version_id + # metadata_extraction_id + process_model_info = cls.get_process_model(process_model_identifier) + metadata_extraction_paths = process_model_info.metadata_extraction_paths + if metadata_extraction_paths is None: + return {} + if len(metadata_extraction_paths) <= 0: + return {} + + current_metadata = {} + for metadata_extraction_path in metadata_extraction_paths: + key = metadata_extraction_path["key"] + path = metadata_extraction_path["path"] + path_segments = path.split(".") + data_for_key = current_data + for path_segment in path_segments: + if path_segment in data_for_key: + data_for_key = data_for_key[path_segment] + else: + data_for_key = None # type: ignore + break + current_metadata[key] = data_for_key + return current_metadata + @classmethod def save_process_model(cls, process_model: ProcessModelInfo) -> None: process_model_path = os.path.abspath(os.path.join(FileSystemService.root_path(), process_model.id_for_file_path())) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py index 727871a83..406d9bb26 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py @@ -246,6 +246,7 @@ class TaskService: task_guid=task_model.guid, timestamp=timestamp, add_to_db_session=False, + log_event=False, # Log this in the execution service instead ) self.process_instance_events[task_model.guid] = process_instance_event diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py index 6cc1040bf..ca76b5ede 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py @@ -41,8 +41,10 @@ from spiffworkflow_backend.models.task import TaskModel # noqa: F401 from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.services.assertion_service import safe_assertion from spiffworkflow_backend.services.jinja_service import JinjaService +from spiffworkflow_backend.services.logging_service import LoggingService from spiffworkflow_backend.services.process_instance_lock_service import ProcessInstanceLockService from spiffworkflow_backend.services.process_instance_tmp_service import ProcessInstanceTmpService +from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.task_service import StartAndEndTimes from spiffworkflow_backend.services.task_service import TaskService @@ -323,21 +325,36 @@ class TaskModelSavingDelegate(EngineStepDelegate): # NOTE: used with process-all-tasks and process-children-of-last-task task_model = self.task_service.update_task_model_with_spiff_task(spiff_task) if self.current_task_start_in_seconds is None: - raise Exception("Could not find cached current_task_start_in_seconds. This should never have happend") + raise Exception("Could not find cached current_task_start_in_seconds. This should never have happened") task_model.start_in_seconds = self.current_task_start_in_seconds task_model.end_in_seconds = time.time() + metadata = ProcessModelService.extract_metadata( + self.process_instance.process_model_identifier, + spiff_task.data, + ) + log_extras = { + "task_id": str(spiff_task.id), + "task_spec": spiff_task.task_spec.name, + "bpmn_name": spiff_task.task_spec.bpmn_name, + "process_model_identifier": self.process_instance.process_model_identifier, + "process_instance_id": self.process_instance.id, + "metadata": metadata, + } if ( spiff_task.task_spec.__class__.__name__ in ["StartEvent", "EndEvent", "IntermediateThrowEvent"] and spiff_task.task_spec.bpmn_name is not None ): self.process_instance.last_milestone_bpmn_name = spiff_task.task_spec.bpmn_name + log_extras["milestone"] = spiff_task.task_spec.bpmn_name elif spiff_task.workflow.parent_task_id is None: # if parent_task_id is None then this should be the top level process if spiff_task.task_spec.__class__.__name__ == "EndEvent": self.process_instance.last_milestone_bpmn_name = "Completed" elif spiff_task.task_spec.__class__.__name__ == "StartEvent": self.process_instance.last_milestone_bpmn_name = "Started" + + LoggingService.log_event(ProcessInstanceEventType.task_completed.value, log_extras) self.process_instance.task_updated_at_in_seconds = round(time.time()) self._last_completed_spiff_task = spiff_task if self.secondary_engine_step_delegate: