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コード として以下のコードを記載します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare
l_business_ref flow_process_variables.prov_var_vc2%type;
l_prcs_id flow_processes.prcs_id%type;
begin
-- retrieve process id
l_prcs_id:= flow_plsql_runner_pkg.get_current_prcs_id;
-- retrieve business ref
l_business_ref:= flow_process_vars.get_business_ref(l_prcs_id);
-- set expense status
update tuto_expenses expe set expe.expe_status = 'paid'
where expe.expe_id = to_number(l_business_ref);
end;
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