Salesforceフローオーケストラで承認処理を実装してみた

## フローオーケストラとは？
https://admin.salesforce.com/blog/2021/introducing-flow-orchestrator-unify-your-complex-business-processes-without-code

>Salesforce Orchestratorは、コードではなくクリックするだけで、洗練されたマルチユーザー、マルチステップの自動化されたビジネスプロセスをすばやく作成できるように作成されました。

>多くのSalesforce管理者は、フローがインパクトを最大化し、最高のユーザーエクスペリエンスを生み出すため>の秘訣であると言うでしょう。Orchestratorを使用すると、ステップとステージという2つの新機能を導入するこ>とで、新規および既存のフローの影響を増幅できます。

>ステップは、実行するフロー、ステップに割り当てられている個人、受信する通知、およびレコードページなどのフローを表示する場所を定義します。最大限の柔軟性を実現するために、ステップを順番にまたは並行して割り>当てることができます。

>ステージはステップをグループ化し、順番に実行されます。これらは、複雑なロジックをサポートするために、Decision要素で区切ることができます。つまり、ステージは1つ以上のステップで構成されます。

>どのフローをステップにするかを整理してから、それらをステージに整理します。Orchestratorは、より大規模>で複雑なビジネスプロセスの拡大するギャップを埋めることができます。これは、生産性の向上、顧客の満足、収益の増加を意味します。

要するに、複雑なビジネスプロセスをコード無しで１つにまとめることができる。

## シナリオ
経費申請・承認プロセスを実装する。
申請者が申請処理を行うと承認者へ業務プロセスが変遷する。
１．直列での承認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/e8ab7a59-d2cd-d41f-1726-6bcc37722fad.png)

２．並列での承認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/f95e4603-d035-4c00-e5be-9ae6b12a0421.png)

## 処理の流れ
### 直列で承認するパターン
Aさん→Bさん→Cさんと承認ルートが決まっているような場合
１．経費データを作成後、申請ボタンを押下
※申請ボタンには画面フローを配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/740469c5-a61a-ee7f-9cdb-b267d22a6877.png)

２．申請フローを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/036f5052-2242-b92b-e652-0e88ef683028.png)

３．経費のレコードタイプが「申請中」となる
※レコードタイプは「作成中」「申請中」「承認済」で分類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/b5480223-820c-c220-10dc-b067e08c5d32.png)

４．営業課長ユーザでログインし、１のレコードを確認
作業ガイドに承認画面フローが出る
最初の承認者は承認可否と承認ルートを決定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/57021882-f24b-34d7-b79e-428bcd71481b.png)

５．承認、直列にて承認を進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/fb62728a-0fb6-96a2-fc17-bd5b085415ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/0e4b7730-0022-eaf3-5b1a-655154feb1b0.png)

６．営業部長ユーザでログインし、１のレコードを確認
作業ガイドに承認画面フローが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/bb5118ab-e072-e4ed-3fd5-2dc9e78513a1.png)

７．承認を進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/f9d194cb-abe8-9548-5816-e62429d15f66.png)

８．経理課長ユーザでログインし、１のレコードを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/8b53d3c0-b67d-81db-6025-a2ed5f5bbe8d.png)

９．承認を行い、最終承認まで完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/d8fec4de-7782-d307-3118-40e39515c10f.png)

１０．レコードタイプが「承認済」となり、承認処理が完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/f561f1fc-3771-7a31-0a4a-5e763de14abf.png)


### 並列で承認するパターン
Aさん→Bさん/Cさんのように、いずれかの承認を得られたら承認が進む場合
１～４を実行

５．承認、並列にて承認を進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/57f408cf-8e6f-55e4-340c-e2a08968e37b.png)

６－１．営業部長ユーザでログインし、１のレコードを確認
作業ガイドに承認画面フローが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/ba180752-7298-8068-5789-7744121c8edc.png)

６－２．経理課長ユーザでログインし、１のレコードを確認
作業ガイドに承認画面フローが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/496a940a-fdf7-3673-a364-f7c26f150b5f.png)

７．経理課長ユーザで承認を進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/eb7545ec-e5db-96c2-f989-102f6f7c8bd3.png)

８．レコードタイプが「承認済」となり、承認処理が完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/c264c7c7-89ec-d6cc-f740-6e8c5fd98ff4.png)

※営業部長ユーザでログインし、１のレコードを確認
承認画面フローが出ていないことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/f74a7b73-b7a0-5238-36fb-dadf02b428db.png)


## 実装内容
### カスタムオブジェクト
経費、経費明細
#### 経費のレコードタイプ
作成済、承認済、申請中
#### 経費のボタンアクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/d4051f56-66b0-c493-b709-d8af961aa22d.png)
#### ページレイアウト
作成済みのみ「申請」ボタンを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/b57916d6-5365-6144-cee1-fa0b1fc04cd5.png)

### ユーザ
営業課長ユーザ、営業部長ユーザ、経理課長ユーザ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/7f702780-f54c-38b9-c273-daef173e9359.png)

### キュー
経理承認キュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/a84983fb-2449-ea3d-34ab-e514ca238617.png)
※キューはオブジェクトに対してユーザ（ロール、公開グループ、ユーザ）を割り当てることができる機能
ケースやToDoなどでキューのメンバーに対してレコードを割り当て、担当者や責任者として業務を進めることに寄与する

### フローオーケストラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/2ce992b2-15d2-dad4-b01d-d99201a5d069.png)

#### 起動条件
レコードタイプが「申請中」へ更新時に起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/71d6538a-c0ec-5eee-67d5-5c654968659c.png)
#### フェーズ１
画面フロー「承認画面フロー」を使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/479df770-579b-7844-fc4a-6e23f54359d2.png)
#### 承認決定ステップ１
レコードタイプが「申請中」であれば「申請中」へ
「申請中」でなければ「デフォルトの結果」へ（申請を否決）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/5296e32c-5b43-a4a2-140e-35879e85ad41.png)
#### 承認ルート
承認ルートが「直列」であれば「直列」のルートへ
「直列」でなければ「並列」のルートへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/71724fa2-44e0-a592-0f1c-20fd53fc916f.png)
#### フェーズ２（直列）
画面フロー「承認画面フロー」を使用
割り当てユーザに「営業部長ユーザ」を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/e478fbd4-403d-9e17-1bd1-829cf1e6090f.png)
#### フェーズ２（並列）
画面フロー「最終承認画面フロー」を使用
割り当てユーザに「経費承認キュー」を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/4c040dd6-27d0-cc8f-bbd6-87938fefd355.png)
#### 承認決定ステップ２
レコードタイプが「申請中」であれば「申請中」へ
「申請中」でなければ「デフォルトの結果」へ（申請を否決）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/97faaa12-9f48-8136-0778-653318e39e50.png)
#### フェーズ３
画面フロー「最終承認画面フロー」を使用
割り当てユーザに「経費課長ユーザ」を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/a65860ad-da06-1b6c-87ca-6c6a64a3748f.png)

### 画面フロー
#### 申請画面フロー
経費オブジェクトのボタンに配置
経費オブジェクトのレコードタイプを「申請中」へ更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/1f35cc08-5794-8575-db06-a5d641770ca6.png)
#### 承認画面フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/6082f404-cd79-28c9-73aa-0ead1e321147.png)
申請中判定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/caf4928a-508d-c4ef-89dd-ee70b3d5dffb.png)
初回承認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/1a50dd3f-b880-6e3d-46c2-ab5089ad7c39.png)
承認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/9572868c-d660-ee4c-8a2d-293171f7d620.png)
初回承認結果割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/793bea71-d093-5c29-e5c1-515ecf8dcf77.png)
承認結果割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/635fd5fd-81c5-1dba-8717-bb2bb5a0037d.png)
ToDo作成
承認時のコメントをToDoに残すために使用（本来なら承認履歴オブジェクトを作ったほうがダッシュボード・レポート管理など行いやすくなる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/55a3f9d9-5184-930f-a033-fadce4a8f5bf.png)
ステップ数を加算
初回承認かどうかを判定するために使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/278fd019-5635-f180-9797-ee166bd07f36.png)
レコードタイプを作成中へ更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/2892b113-c55e-0b51-b4f9-70656b9495e5.png)
#### 最終承認画面フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/8798eb9d-29bb-79aa-b50c-d2bb324f7271.png)
承認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/574d2d57-dbc0-47e6-b70a-eac527eceec9.png)
承認結果割り当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/9b46b6ad-1249-191e-cab7-fdfe3b9433c5.png)
ToDo作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/825aa792-6d60-7efa-3112-b785a62b5041.png)
承認結果判定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/21d66d91-6af5-53fc-3486-952d01e216d7.png)
承認
レコートタイプを「承認済」へ更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/dd31f488-c5d2-dba0-9c11-e2cfe8a3ab8a.png)
否決
レコードタイプを「作成中」へ更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542419/64248f64-fec4-e8d1-34f9-7b8a76c3b242.png)
## まとめ
- シンプルな業務フローであればフローオーケストラで実装可能
- レコードロックの考慮が必要な場合、要件に沿った対応が必要
  - レコードタイプによる参照ページへの切り替え
  - 共有設定でレコード所有者のみ変更できるようにする
  - Apexを使ったレコードロック・解除の仕組みなど