9.3 Pool and Participant
A Pool is the graphical representation of a Participant in a Collaboration.
経費精算のワークフローの参加者は会社全体を想定しています。作成されたプールの属性が右ペインに表示されます。ダイアグラムの表現として使われるのみで、APEXで作成するアプリケーションに影響を与えることはありません。
作成したプールのIDはCOMPANY、名前は会社とします。
配置したプールを4つのレーンに分割します。BPMN 2.0によるレーンの定義は以下になりますす。
10.8 Lanes
[中略]
Lanes are used to organize and categorize Activities within a Pool. The meaning of the Lanes is up to the modeler.
BPMN does not specify the usage of Lanes. Lanes are often used for such things as internal roles (e.g., Manager,
Associate), systems (e.g., an enterprise application), an internal department (e.g., shipping, finance), etc.
BPMNではレーンの記法は定義しますが、意味づけについては設計者が行うことになっています。今回は例にあるように経費精算に関わる参加者の役割(ロール)に従って分割します。ただし、これもダイアグラムの表現として使われるのみで、ここで作成したレーンが自動的にAPEXアプリケーションのロールとなったりはしません。
プールの操作ツールを使って、レーンを作成します。
レーンの追加方法として、上にレーンを追加、レーンを2分割、レーンを3分割、下にレーンを追加といった方法が提供されています。
分割する4つのレーンはそれぞれ、従業員、上司、部門長、経理とします。このフローを扱う経費精算のアプリケーションには、これらの4つのロールを持たせます。
最上位のレーンを選択しIDはEMPLOYEE、名前は従業員とします。レーンを選択したつもりで、コラボレーションなどが選択されている場合もあります。正しくレーンが選択されていることを確認します。
同様にして、他の3つのレーンのIDと名前を設定します。
ID - MANAGER, 名前 - 上司
ID - VICE_PRESIDENT, 名前 - 部門長
ID - ACCOUNTANT, 名前 - 経理
ツール・パレットより
開始イベントを作成を実行し、
従業員のレーンに
開始イベントを配置します。BPMN 2.0による
イベントの定義は以下になります。
10.5 Events
An Event is something that “happens” during the course of a Process.
[中略]
Events allow for the description of “event-driven” Processes. In these Processes, there are three main types of Events:
- Start Events (see page 237), which indicate where a Process will start.
- End Events (see page 245), which indicate where a path of a Process will end.
- Intermediate Events (see page 248), which indicate where something happens somewhere between the start and end of a Process.
Flows for APEXで扱えるイベントは
開始イベント(StartEvent)、
終了イベント(EndEvent)、
中間イベント(Intermediate/Boundary Event)の3種類です。
開始イベントのIDはoutstanding_expense、名前は経費精算の開始とします。ラベルの位置は調整できるので、見やすい位置にします。
開始イベントの操作ツールよりタスクを追加を実行します。
BPMN 2.0によるタスクの定義は以下になります。
10.3.3 Tasks
A Task is an atomic Activity within a Process flow. A Task is used when the work in the Process cannot be broken down to a finer level of detail. Generally, an end-user and/or applications are used to perform the Task when it is executed.
これ以上分解できない処理、となっています。BPMNのタスクの上位概念としてアクティビティというのがあり、アクティビティにはタスクとサブプロセスが含まれます。サブプロセスはフローの定義なので分割可能ですが、プロセスはそうではありません。APEXとの連携という観点では、プロセスはAPEXアプリケーションによる操作(エンドユーザーによる処理)であったり、PL/SQLコードの実行(アプリケーションによる処理)にあたります。
ツール・パレットよりタスクを作成を実行してタスクを配置し、その後にツール・パレットよりグローバルコネクトツールを作動を実行し、開始イベントとタスクをシーケンスフローによって接続することもできます。BPMN 2.0によるシーケンスフローの定義は以下になります。
8.4.13 Sequence Flow
A Sequence Flow is used to show the order of Flow Elements in a Process or a Choreography. Each
Sequence Flow has only one source and only one target. The source and target MUST be from the set of the following
Flow Elements: Events (Start, Intermediate, and End), Activities (Task and Sub-Process; for Processes),
Choreography Activities (Choreography Task and Sub-Choreography; for Choreographies), and
Gateways.
シーケンスフローはイベント、アクティビティおよびゲートウェイを接続するために使用します。
タスクを開始イベントの右隣に配置し、操作ツールのタイプの変更(レンチのアイコン)を実行します。タスクのタイプをユーザータスクに変更します。
ユーザータスクはAPEXアプリケーションでの画面操作に対応します。
配置したタスクのIDをsubmit_expense_claim、名前を経費精算の申請とします。ユーザー・タスク・タイプはデフォルトのAPEXページから変更しません。
ユーザー・タスク・タイプにAPEXページを選択すると、APEXページのタブが現れます。通常は、このタスクに紐づくAPEXアプリケーションとページを設定します。
タスク経費精算の申請は、APEXのアプリケーションの経費精算の申請を行うフォームにて、ワークフローの開始(プロセス・インスタンスの作成と開始)の後続処理として、経費精算の申請を行なうタスク(この経費精算の申請のタスク)を、ユーザーがAPEXページを開くこと無く完了させるように実装します。そのため、このタスクではAPEXページの属性を設定する必要はありません。
タスク経費精算の申請の操作ツールよりタスクを追加を実行します。作成されたタスクは上司のレーンに配置します。
こちらのタスクもタイプをユーザータスクに変更します。IDはreview_expense_mgr、名前は申請のレビューとします。ユーザー・タスク・タイプはAPEXページです。
上司は申請された経費のレビューを、APEXアプリケーションのページを開いて行います。そしてレビューの結果として、経費精算申請の承認もしくは却下を行います。承認と却下の作業を行なうページを、タスクの
APEXページの属性として設定します。
APEXアプリケーションは作成済みですがページは未作成であるため、アプリケーションのメタデータから属性を指定できません。
APEXページの
入力として
手動入力を選択します。
Application IDはEXPENSECLAIMとし、Page IDとしてreview-mgrを設定します。
ページ項目として、デフォルトの作成で追加されるPROCESS_ID、SUBFLOW_ID、STEP_KEYに加え、アイテム名P5_EXPE_IDとしてアイテム値&F4A$BUSINESS_REF.(business_refのクリック)を追加します。
ワークフローを実装するAPEX
アプリケーションの別名は
EXPENSECLAIMです。後ほどアプリケーションに、上司による経費申請の承認と却下を行なうページを作成し、
ページの別名を
review-mgrにします。
ページ別名を設定していますが、
ページ項目に経費申請のIDを保持する
P5_EXPE_IDが含まれています。ページ・アイテムのプレフィックスが
P5なので、
ページ番号として
5を指定してページを作成する必要があります。
上司の決定に従ってフローを分岐させるゲートウェイを配置します。タスク申請のレビューの操作ツールよりゲートウェイを追加(菱形のアイコン)を実行します。作成されたゲートウェイはタスク申請のレビューの右隣に配置します。BPMN 2.0によるゲートウェイの定義は以下になります。
10.6 Gateways
Gateways are used to control how Sequence Flows interact as they converge and diverge within a Process. If the flow does not need to be controlled, then a Gateway is not needed. The term “Gateway” implies that there is a gating mechanism that either allows or disallows passage through the Gateway. As tokens arrive at a Gateway they can be merged together on input and/or split apart on output as the Gateway mechanisms are invoked.
いわゆるワークフローは処理の流れになりますが、ゲートウェイはその流れの分岐、または合流を定義します。Flows for APEXでは排他ゲートウェイ(Exclusive Gateway)、包含ゲートウェイ(Inclusive Gateway)、並列ゲートウェイ(Parallel Gateway)、イベントベースゲートウェイ(Event based Gateway)を扱うことができます。複合ゲートウェイ(Complex Gateway)は扱うことができません。
大まかな説明ですが、排他ゲートウェイでは分岐するフローのうち、唯1つのパスが選択されます。包含ゲートウェイでは分岐するフローのうち、最低でも1つのパス(デフォルトのパス)が選択され、その他のパスも条件に依存して複数選択されます。並列ゲートウェイには条件はなく、分岐するフローはそれぞれ実行されます。また、分岐したフローの同期(合流)にも使用されます。イベントベースゲートウェイはメッセージの受信やタイマーによる起動など、外部のイベントを受けてフローを進める際に使用します。複合ゲートウェイはサポートされていませんが、排他や包含などを組み合わせた複雑な分岐を定義する際に使用するゲートウェイです。
今回の経費精算のワークフローでは、排他ゲートウェイのみ使用します。
配置した排他ゲートウェイの名前はレビュー結果?と設定します。
ゲートウェイレビュー結果?の操作ツールよりタスクを追加を実行します。作成されたタスクはゲートウェイレビュー結果?の右隣に配置します。
操作ツールのタイプの変更(レンチのアイコン)より、タイプをサービスタスクに変更します。IDはinform_employee、名前は従業員への通知とします。
上司から経費申請を却下された際に実行する処理を定義します。
PL/SQLタブのPL/SQLコードとして、本来は従業員宛にメールを送信するといったコードを記載すべきところです。実際に通知を実装するには色々な準備が必要になるため、通知の実装は省略してnull;とだけ記載します。
ゲートウェイレビュー結果?とタスク従業員への通知を接続しているシーケンスフローを選択します。名前は却下とします。このシーケンスフローをデフォルトとするため、条件の順序として後に評価されるよう9999と大きな数値にします。
ラベルの却下はゲートウェイの近くに配置すると分かりやすいでしょう。
選択したシーケンスフローの操作ツールよりタイプの変更を実行し、タイプをデフォルトフロー(操作ツールではディフォルトフロー)に変更します。
デフォルトフローには、斜線が付加されます。
タスク従業員への通知の操作ツールよりタスクを追加を実行します。作成されたタスクは従業員のレーンに配置します。
タスクのタイプをユーザータスクに変更します。IDはcorrect_expense_claim、名前は申請の修正とします。APEXページの属性はタスク経費精算の申請と同様に、何も指定しません。
タスク申請の修正の操作ツールよりシーケンス/メッセージフローまたは関連線で接続(2本の矢印のアイコン)を実行し、シーケンスフローでタスク申請のレビューに接続します。従業員は差し戻された経費精算申請を修正し、上司へ経費精算申請のレビューを再度依頼します。
ゲートウェイ
レビュー結果?の操作ツールより
ゲートウェイを追加を実行します。作成されたゲートウェイは
部門長のレーンに配置します。
名前は50米ドルより高額?とします。
ゲートウェイレビュー結果?とゲートウェイ50米ドルより高額?を接続するシーケンスフローを選択します。名前は承認とします。条件の順序を10、条件タイプとして式を選択し、条件に以下を記述します。
:F4A$EXPE_STATUS = 'approved_by_mgr'
プロセス変数の
EXPE_STATUSの値が
approved_by_mgrのときに
承認のシーケンスフローが選択されます。
それ以外は、デフォルトフローの
却下に制御が移ります。
ユーザータスク
申請のレビュー(これは、APEXのアプリケーションのページ
review-mgrでの操作として実装されます)ではプロセス変数
EXPE_STATUSに
承認する場合は
approved_by_mgr、
却下の場合は
それ以外の値を設定する必要があります。
ゲートウェイ50米ドルより高額?の操作ツールよりタスクを追加を実行します。作成されたタスクは、ゲートウェイ50米ドルより高額?の右隣に配置します。
タスクのタイプをユーザータスクに変更します。IDはreview_expense_vp、名前は申請のレビューとします。ユーザー・タスク・タイプはAPEXページです。
部門長による承認と却下の作業を行なうページを、タスクの
APEXページの属性として設定します。
APEXページのApplication IDはEXPENSECLAIMとし、Page IDとしてreview-vpを設定します。ページ項目はデフォルトの作成によって追加されるPROCESS_ID、SUBFLOW_ID、STEP_KEYに加えて、アイテム名P8_EXPE_ID、アイテム値&F4A$BUSINESS_REF.を追加します。
Page IDにreview-vpと設定しますが、ページ項目にP8_EXPE_IDが含まれているため、この処理を行なうページのページ番号は8にする必要があります。
ゲートウェイ
50米ドルより高額?とタスク
申請のレビュー(部門長のレーン)を接続している
シーケンスフローを選択します。
名前を
はいとします。
条件の
順序を
10、
条件タイプとして
式を選択します。
条件として以下を記述します。
:F4A$EXPE_AMOUNT > 50
プロセス変数
EXPE_AMOUNTの値が
50より多い場合、このシーケンスフローが選択されます。このゲートウェイより前のタスクにて、プロセス変数EXPE_AMOUNTに経費申請の金額が設定されている必要があります。
ゲートウェイ50米ドルより高額?の操作ツールよりタスクを追加を実行します。作成されたタスクは経理のレーンに配置します。
タスクのタイプをユーザータスクに変更します。IDはprepare_payment、名前は支払いの準備とします。ユーザー・タスク・タイプはAPEXページです。
経理担当者が支払い作業を行なうページを、タスクの
APEXページの属性として設定します。
APEXページのApplication IDはEXPENSECLAIMとし、Page IDとしてprepare-paymentを設定します。ページ項目はデフォルトの作成で追加されるPROCESS_ID、SUBFLOW_ID、STEP_KEYを追加します。
経費担当者による処理は対話グリッドで実装しフォームは使用しないので、ページ・アイテムは作成されません。そのため追加するページ・アイテムはありません。
ゲートウェイ50米ドルより高額?とタスク支払いの準備を接続するシーケンスフローを選択します。名前はいいえとします。条件の順序を9999とします。
シーケンスフローの操作ツールより、タイプをデフォルトフローに変更します。経費の申請額が$50以下であれば部門長の承認は不要で、経費精算申請はそのまま経理に回ります。
部門長のレーンにあるタスク申請のレビューの操作ツールよりゲートウェイを追加を実行します。作成されたゲートウェイはタスク申請のレビューの右隣に配置します。ゲートウェイのタイプは、デフォルトの排他ゲートウェイです。
名前はレビュー結果?とします。
部門長のレーンにあるゲートウェイレビュー結果?の操作ツールよりシーケンス/メッセージフローまたは関連線で接続を実行し、シーケンスフローでタスク従業員への通知に接続します。部門長に経費精算申請が却下されると、申請した従業員に通知されます。
接続したシーケンスフローの名前は却下とします。条件の順序を9999とし、タイプをデフォルトフローに変更します。
部門長のレーンにあるゲートウェイレビュー結果?の操作ツールよりシーケンス/メッセージフローまたは関連線で接続を実行し、シーケンスフローでタスク支払いの準備に接続します。
接続したシーケンスフローの名前は承認とします。条件の順序は10とし、条件タイプとして式を選択します。条件には以下を指定します。
:F4A$EXPE_STATUS = 'approved_by_vp'
タスク支払いの準備の操作ツールよりタスクを追加を実行します。作成されたタスクはタスク支払いの準備の右隣に配置します。
タスクのタイプをスクリプトタスクに変更します。IDはexecute_transaction、名前は経費の支払いとします。
経費の支払いを実際に行なうスクリプトを定義します。
右ペインでPL/SQLタブを開きます。PL/SQLコードとして以下のコードを記載します。
BPMNの記法上、サービスタスクはワークフロー・エンジン以外で実行するタスク、スクリプトタスクはワークフロー・エンジンが実行するタスクと定義されています。Flows for APEXではサービスタスクはPL/SQLコードより外部のタスクを呼び出す処理、スクリプトタスクはPL/SQLの処理で完結(データベース内で完結)する、ということになります。サービスタスクの場合、タイプとしてメールの送信を選択できます。
タスク経費の支払いの操作ツールより終了イベントを実行します。作成された終了イベントはタスク経費の支払いの右隣に配置します。
IDはexpense_repayed、名前は支払いの完了とします。
以上で経費申請のフロー・ダイアグラムは完成です。
BPMNのフロー・モデルのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/20221220-0847_%E7%B5%8C%E8%B2%BB%E7%B2%BE%E7%AE%97.bpmn