[ODC]Workflowの追加機能 (2024/11) を確認する

2024/11/12のProduct Releases and Updatesで、ODCのWorkflow（O11で言うと、BPTに相当する）への機能追加が発表された。

ODCのWorlflow一般については、以前書いた以下の記事を参照。

https://qiita.com/jyunji_watanabe/items/45d2c822314b684ead77

# Product Releases and Updates
[Workflows - New language elements and public roles | OutSystems](https://www.outsystems.com/product-updates/workflows-new-language-elements-and-public-roles/)

発表された新機能は、以下4つ。

1. Wait（フローを一定Event発生まで停止するステップ）
1. Conditional Start（Startとは別の起点をワークフローに持てる）
1. Terminate（Conditional Startで始まるフローの最後に配置すると、インスタンス全体が停止する）
1. Role-based Human Activities

# 動作確認シナリオ
新機能全てをカバーする以下の仮想業務シナリオを使って、動作確認していく。
（本当にこんな業務があるかは知らないが）

「契約書作成システム」
ある程度実績のある種別の契約書を、ユーザーの入力と申請に応じて作成し、必要なレビューを行い、必要に応じて、顧問弁護士にも確認を依頼する。
1. ユーザーが契約内容を入力
1. システムが、法務部門に契約書案のレビューを依頼（法務部門RoleにHuman Activityを割り当てる）
1. 法務部門によるチェック後、契約金額等の条件によっては、顧問弁護士のチェックを依頼する。この場合は、チェック結果はシステムには自動入力されず、チェック結果を受け取ったというイベントを待ってワークフローを進める（顧問弁護士によるチェックはシステム外で行われるので、Waitを使ってその終了イベントが発生するまでワークフローを止める）
1. レビュー結果に基づき、契約書を最終版に

最終盤になるまでの間、依頼者は以下の操作を行える
- コメント追加：レビュー担当者へコメント内容が通知される。ワークフローはそのまま継続 (Conditional Start + End)
- 取り下げ：契約書が不要になった、不備があるので一旦撤回する時の操作。レビュー中であってもワークフロー全体を終了させる (Conditional Start + Terminate)

# 作成したワークフロー
丸囲み数字を配置した部分が今回の新機能に対応するので、そこだけ見ていく。
![スクリーンショット 2024-11-23 20.24.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9274c4b3-608f-8289-ee74-02f90ce5a44a.png)

# ①Human ActivityをRoleに対しても割り当てられるようになった
https://qiita.com/jyunji_watanabe/items/598ded3446f61ccf2297

で見たように、Roleは公開可能になった。同時に、Human Activityの割り当て先を、PublicなRoleとできるようになった。

## 設定UI 
これまで通り、個別ユーザーに割り当てる（User）か、Roleに割り当てる（Roles）かをスイッチで選べるようになった。Roleの場合は、Add rolesの「＋」アイコンで割当先のRoleを指定する。
![スクリーンショット 2024-11-23 20.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/dc220819-9f9d-b4c9-15d8-691f3211e3c7.png)

## ODC Portalでインスタンスを確認する
以下の通り、Roleに割り当てられているのが確認できる。
![スクリーンショット 2024-11-23 20.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b92f27fe-ee27-d27d-3e79-48258c02cb4d.png)

## RoleのIdを確認できるか　→　2024/11時点では難しそう
現時点ではRoleのIdを確認するのが難しい。思いつくのは以下の手順くらい。

1. Human ActivityのRole割り当てを定義してPublish
1. そのWorkflowを開始し、Role割り当てするHuman Activityまで進める
1. (System)/HumanActivityRoleのデータを見て、RoleId属性の値を取得する

# ②Waitでイベント発生までワークフローを止めて待てるようになった
指定方法はHuman ActivityのClose onと同じ。指定Eventが発生し、かつそのEventがConditionに指定した条件に合致するまではワークフローの進行を停止する。
![スクリーンショット 2024-11-23 20.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/42362667-7899-af65-23d9-c68c55ac0eda.png)

ODC Portalでインスタンスの実行状況を確認したところ。
![スクリーンショット 2024-11-23 20.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3b6190b7-1f93-3833-32ff-e87e4a09b923.png)

# ③Conditional Startで進行中のワークフローインスタンスに割り込みをかけられる
Startノードからつながる一連のステップとは独立したフローを開始できるのがConditional Start。
Waitと同じく、開始基点となるEventと、そのEventの中で満たすべき条件を示すConditionを設定する。
![スクリーンショット 2024-11-23 20.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3e5b0b01-92aa-994d-26f9-653fdc474c2c.png)

Conditioanl Startで始まるフローはEndとTerminateいずれでも終えられる。
Endの場合は、Startから始まる本来のフローはそのまま実行を継続できる。
Terminateにした場合、インスタンスそのものが終了する。

インスタンスをConditional Start → Terminateで終えた状態の例。
![スクリーンショット 2024-11-23 20.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a57ebdf5-23d9-4f7f-fb36-dca9f07b81c7.png)

Startから始まる流れは、最後に有効だったWaitステップがTerminatedで終えられている。それに対し、Conditonal Startから始まる流れはCompletedになっている。なお、このとき、インスタンスそのもののステータスはDone。