2022年1月25日火曜日

Flows for APEXによる経費精算アプリの作成(2) - ワークフローの実装

経費精算のアプリケーションに、従業員による経費精算の申請、上司による申請のレビュー、部門長の申請のレビュー、経理による支払いを実装します。

最終的に作成されるアプリケーションは以下のような動作になります。




従業員による経費精算の申請



申請済みの経費精算の一覧を表示するレポートと、経費精算の申請を行なうフォームのページを作成します。アプリケーション・ビルダーにて、すでに作成済みの経費精算のアプリケーションを開き、ページの作成を実行します。

ページ作成ウィザードが実行されます。

対話モード・レポートを選択します。


ページ定義ページ番号名前従業員ページ・モード標準を選択し、フォーム・ページを含めるONにします。

フォーム・ページ番号はフロー・モデルで使用しているため必ずフォーム・ページ名経費精算の申請フォーム・ページ・モードモーダル・ダイアログとします。

データ・ソースソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。

申請済みの全ての経費精算(表TUTO_EXPENSES)とそれに紐づいたプロセス・インスタンスの情報(ビューFLOW_INSTANCES_VW)、および現在処理中のプロセス・インスタンスの状態(ビューFLOW_TASK_INBOX_VW)をジョインして一覧しています。

ナビゲーションは、標準ページのデフォルトであるブレッドクラムの使用ナビゲーションの使用ともにONから変更しません。

へ進みます。


主キー列1としてEXPE_ID (Number)を選択し、ページの作成をクリックします。


以上で、経費精算の一覧を表示するレポートと、経費精算を申請するフォームのページが作成されます。

ページ作成ウィザードに与えたSQLは経費精算の申請を一覧するためのもので、フォームのソースとしては適切ではありません。また、フォームのページはワークフローと連携させる必要があります。

ページ・デザイナにて、ページ経費精算の申請(ページ番号)を開きます。

フォーム・リージョン経費精算の申請を選択します。

ソースタイプ表/ビューに変更し、表名TUTO_EXPENSESを指定します。


ページ・アイテムP3_EXPE_SUBMITTED_ONP3_EXPE_ACCOUNTP3_EXPE_SUBMITTED_BYは経費精算の申請では使用しないため、ビルド・オプションコメント・アウトします。


ページ・アイテムP3_EXPE_COMMENT_MGRを選択します。識別タイプ表示のみに変更し、サーバー側の条件としてタイプアイテムはNULLではないアイテムとしてP3_EXPE_COMMENT_MGRを選択します。

この経費申請のフォームは、上司や部門長に経費の申請が却下された際の再申請にも使われます。上司や部門長が申請を却下する際に入力するコメントは、従業員は参照するだけなのでページ・アイテムのタイプは表示のみになります。また、最初の申請時は、上司や部門長のコメントは存在しないので、ページ・アイテムが表示される必要はありません。


ページ・アイテムP3_EXPE_COMMENT_VPについても同様の設定を行います。識別タイプ表示のみに変更し、サーバー側の条件としてタイプアイテムはNULLではないアイテムとしてP3_EXPE_COMMENT_VPを選択します。


このフォームから経費精算の申請および再申請を行なう際に、ページ・アイテムP3_EXPE_STATUSの値が必ずsubmittedとなるようするため、このページ・アイテムに計算を作成します。

ページ・アイテムP3_EXPE_STATUSを選択し、識別タイプ非表示に変更します。


ページ・アイテムP3_EXPE_STATUS上でコンテキスト・メニューを表示させ、計算の作成を実行します。


実行ポイント送信後に変更します。計算タイプ静的値静的値submittedを指定します。結果として、このフォームが送信されるときは常に、ページ・アイテムP3_EXPE_STATUSの値はsubmittedになります。


右ペインにてプロセス・ビューを開き、ワークフローと連携するためのプロセスを作成します。

最初にワークフローを開始するプロセスを作成します。プロセスの作成を実行し、プロセス・フォーム経費精算の申請ダイアログを閉じるの間に配置します。

識別名前F4A:ワークフローの開始タイプとしてFlows for APEX - Manage Flow Instance[プラグイン]を選択します。

以下の設定を行います。

Action:Create and Start
Flow Instance Name:&APP_NAME. - &APP_USER. - &P3_EXPE_AMOUNT. 米ドル
Select flow using:Component Setting
Flow (Diagram) selection based on:Name
Set Business Reference:P3_EXPE_ID
Return Instance ID into:PROCESS_ID
Set Process Variables?:Using JSON

JSONとして以下を記述します。申請した費用であるページ・アイテムP3_EXPE_AMOUNTの値が、ワークフローのプロセス変数EXPE_AMOUNTに設定されます。
[
    {
	    "name": "EXPE_AMOUNT",
	    "type": "number",
	    "value": &P3_EXPE_AMOUNT.
	}
]
フォーム上のボタン作成をクリックしたときに実行されるよう、サーバー側の条件ボタン押下時CREATEを指定します。


開始されたワークフローのSUBFLOW_IDSTEP_KEYを取得するプロセスを作成します。

プロセスの作成を実行し、プロセスワークフローの開始の下に配置します。

識別名前SUBFLOW_IDとSTEP_KEYの取得とし、タイプとしてコードの実行を選択します。ソース位置ローカル・データベース言語PL/SQLPL/SQLコードとして以下を記述します。
select sbfl_id, sbfl_step_key into :SUBFLOW_ID, :STEP_KEY
from flow_subflows_vw
where sbfl_prcs_id = :PROCESS_ID;
サーバー側の条件として、ボタン押下時CREATEを指定します。


フロー・モデルのタスク経費精算の申請を完了するプロセスを作成します。

プロセスの作成を実行し、プロセスSUBFLOW_IDの取得の下に配置します。

識別名前F4A:経費精算の申請とし、タイプとしてFlows for APEX - Manage Flow Instance Step [プラグイン]を選択します。

以下の設定を行います。

Action:Complete Step
Flow Instance Info:In Page Items
Process ID Item:PROCESS_ID
Subflow ID item:SUBFLOW_ID
Step Key: STEP_KEY
Set Gateway Routing?:OFF
Auto-Branching:OFF

サーバー側の条件ボタン押下時CREATEを指定します。


経費精算の再申請(タスク申請の修正を完了する)を行なうプロセスを作成します。

プロセスの作成を実行し、プロセス経費精算の申請の下に配置します。

識別名前F4A:申請の修正とします。タイプとしてFlows for APEX - Manage Flow Instance Step [プラグイン]を選択します。

設定ActionComplete StepFlow Instance Infoとしてfrom SQL Queryを選択し、以下をSQL Queryとして記述します。
select
    sbfl_prcs_id
    ,sbfl_id
    ,sbfl_step_key
from flow_task_inbox_vw
where sbfl_business_ref = :P3_EXPE_ID;
サーバー側の条件ボタン押下時SAVEを選択します。


経費精算の再申請の際に変更した費用で、プロセス変数EXPE_AMOUNTを更新するプロセスを作成します。

プロセスの作成を実行し、プロセス経費精算の再申請の下に配置します。

識別名前F4A:経費の更新タイプとしてFlows for APEX - Manage Flow Instance Variables [プラグイン]を選択します。

以下の設定を行います。

Action : Set
Flows Instance info : In Page Items
Process ID Item : PROCESS_ID
Subflow ID Item : SUBFLOW_ID
Manage Variable(s) using : APEX item(s)
Process Variable(s) Name(s) : EXPE_AMOUNT
APEX item(s) : P3_EXPE_AMOUNT

サーバー側の条件ボタン押下時SAVEを選択します。


最後に申請済みの経費精算を表TUTO_EXPENSESから削除する際に、その申請に紐づけて作成されているワークフロー(正確にはプロセス・インスタンス)を削除するプロセスを作成します。

プロセスの作成を実行し、プロセス経費の更新の下に配置します。

識別名前F4A:ワークフローの削除とし、タイプとしてFlows for APEX - Manage Flow Instance [プラグイン]を選択します。

以下の設定を行います。

Action:Delete
Select Flow using:SQL Query

SQL Queryとして以下を記述します。
select prcs_id
from flow_instances_vw
where prcs_business_ref = :P3_EXPE_ID;
サーバー側の条件として、ボタン押下時DELETEを選択します。フォームで削除ボタンを押したときに、申請された経費精算のIDであるP3_EXPE_IDに紐づけられているワークフロー(プロセス・インスタンス)が削除されます。


一旦申請した経費精算(ステータスがsubmittedのもの)および支払い済みの経費(ステータスがpaidのもの)を再度申請するパスは定義されていないので、ボタンSAVE(変更の適用)が表示されないようにサーバー側の条件を設定します。

ボタンSAVEを選択し、サーバー側の条件タイプ言語PL/SQLを選択し、PL/SQL式に以下を記述します。
:P3_EXPE_ID is not null 
and
:P3_EXPE_STATUS <> 'submitted' 
and
:P3_EXPE_STATUS <> 'paid'


以上で従業員によって、経費精算の申請を行なう画面が出来ました。

レポート列やフォームの入力項目の位置や幅、ラベルなどを調整するとより良いレポートやフォームにすることができます。


ワークフローの進捗を表示



ワークフローの進捗を表示する画面を作成し、経費精算の申請のレポート画面より開けるようにします。

ページの作成を実行します。


空白ページを選択します。


ページ番号として、ページの名前進捗の表示とします。ページ・モードとしてモーダル・ダイアログを選択します。モーダル・ダイアログのページなので、ナビゲーションブレッドクラムの使用ナビゲーションの使用ともにOFFがデフォルトです。

ページの作成をクリックします。


作成されたページのContent Body上でコンテキスト・メニューを表示させ、リージョンの作成を実行します。

作成したリージョンの識別タイトルとして進捗の表示タイプとしてFlows for APEX - Viewer [プラグイン]を選択します。ソース位置ローカル・データベースタイプ表/ビュー表の所有者Parsing Schemaとし、表名としてFLOW_INSTANCE_DETAILS_VW(これはビューです)を指定します。WHERE句として以下を記述します。

prcs_id = :P9_PRCS_ID

外観テンプレートとしてBlank with Attributes (No Grid)を選択します。


リージョン進捗の表示で、プロセスIDを保持するアイテムの作成をします。

識別名前P9_PRCS_IDタイプ非表示とします。


リージョン進捗の表示を選択し、右ペインにて属性を開きます。

設定Diagram XMLとしてDGRM_CONTENTを選択します。列DGRM_CONTENTにはフロー・ダイアグラムがXML形式で保存されています。Add HighlightingONに変更すると、Current NodesとしてALL_CURRENTCompleted NodesとしてALL_COMPLETEDError NodesとしてALL_ERRORSが指定されます。その他もデフォルトのままとします。


ページ進捗の表示を選択し、ダイアログとして900高さとして550を指定します。ダイアログの幅と高さを指定しないと、フロー・ダイアグラムが小さく表示されます。今のところダイアグラムの表示は、画面サイズに自動的にフィットしないようです。


経費精算の申請のレポートの列EXPE_STATUSに、進捗を表示するページをリンクします。

ページ番号従業員のページを開き、対話モード・レポートのからEXPE_STATUSを選択します。

識別タイプリンクに変更し、リンクターゲットを設定します。リンク・テキストとして#EXPE_STATUS#を指定します。


ターゲットタイプこのアプリケーションのページページになります。アイテムの設定名前としてP9_PRCS_IDとして#PRCS_ID#を指定します。OKをクリックします。


以上で、経費精算のワークフローの進捗を表示することができるようになりました。


上司による申請のレビュー



上司による承認が必要な経費精算の申請をレポートするページと、上司が申請の承認または却下を行なうフォームを作成します。

ページの作成を実行し、ページ作成ウィザードを起動します。対話モード・レポートを選択するまでは、従業員による経費精算の申請のページを作成する手順と同じです。

ページ定義ページ番号名前上司ページ・モード標準を選択し、フォーム・ページを含めるONにします。

フォーム・ページ番号はフロー・モデルで使用しているため必ずフォーム・ページ名申請のレビューフォーム・ページ・モードモーダル・ダイアログとします。

データ・ソースソース・タイプとしてSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。

ナビゲーションは、デフォルトでブレッドクラムの使用ナビゲーションの使用ともにONになっています。

へ進みます。


主キー列1としてEXPE_ID (Number)を選択します。ページの作成をクリックします。


対話モード・レポートとフォームのページが作成されます。

ページ・デザイナにて対話モード・レポートのページ(ページ番号)を開きます。対話モード・レポートのリージョンを選択して、右ペインにて属性を開きます。

リンクリンク列カスタム・ターゲットへのリンクターゲット#LINK_TEXT#へ変更します。


ターゲットの変更は、ターゲットをクリックして、リンク・ビルダー・ターゲットのダイアログを開いて行います。

ターゲットタイプURLとし、URLには#LINK_TEXT#を記述します。OKをクリックして、変更を確定します。


上司がこの画面より経費精算の申請をすることはないため、リージョンにあるボタンCREATEは不要です。

ボタンCREATE上でコンテキスト・メニューを表示させ、削除を実行します。


レポートのページの変更を保存し、ページ番号申請のレビューのページを開きます。

ページの別名をフロー・モデルで使用しているreview-mgrに変更します。


フォーム・リージョン申請のレビューを選択します。

ソースタイプ表/ビューに変更し、表名TUTO_EXPENSESを指定します。


ページ・アイテムP3_SUBMITTED_ONP3_EXPE_ACCOUNTは上司による申請のレビューでは使用しないため、ビルド・オプションコメント・アウトします。


上司が経費精算の申請の承認または却下を行なう際に入力する項目は、上司としてのコメントであるページ・アイテムP5_EXPE_COMMENT_MGRのみです。そのため、主キー項目であるページ・アイテムP5_EXPE_ID、この後に自動的に値を設定するページ・アイテムP5_EXPE_STATUSおよびP5_EXPE_COMMENT_MGR(とコメント・アウト済みのページ・アイテム)を除いた全てのページ・アイテムを選択し、識別タイプ表示のみへ変更します。


部門長によるコメントについてはコメントがある場合にのみ表示されるよう、サーバー側の条件タイプアイテムはNULLではないとし、アイテムとしてP5_EXPE_COMMENT_VPを指定します。


このフォームで上司は、申請の承認、却下または何もせずにフォームを閉じるという作業を行います。フォーム上のボタンを、それらの作業の合わせて変更します。

最初にボタンDELETEを削除します。ボタンDELETE上でコンテキスト・メニューを表示させ、削除を実行します。


ボタンCREATEを選択し、このボタンを却下を行なうボタンDECLINEに変更します。


識別ボタン名DECLINEラベル却下とします。外観ホットOFFに変更します。動作データベース・アクションSQL UPDATE操作とし、サーバー側の条件タイプ- 選択 -に戻し、条件を外します。


ボタンSAVEは承認の動作を行なうボタンAPPROVEに変更します。

識別ボタン名APPROVEラベル承認とします。それ以外はボタンDECLINEと同じ変更を適用します。


ボタンAPPROVEまたはDECLINEが押された時に、ページ・アイテムP5_EXPE_STATUSにそれぞれapproved_by_mgrdeclined_by_mgrが設定されるように、計算を作成します。

ユーザーからの入力を抑止するため、ページ・アイテムP5_EXPE_STATUSを選択し、識別タイプ非表示に変更します。


ページ・アイテムP5_EXPE_STATUS上でコンテキスト・メニューを表示させ、計算の作成を実行します。


作成された計算の実行ポイントとして送信後を選択します。計算タイプ静的値静的値としてapproved_by_mgrを指定します。サーバー側の条件タイプリクエスト = 値を選択し、APPROVEとします。

これでボタンAPPROVEを押した時に、ページ・アイテムP5_EXPE_STATUSの値としてapproved_by_mgrが送信されます。


同様に計算を作成し、却下のボタンを押したときの設定を行います。

ボタンAPPROVEと同様の設定ですが、計算静的値declined_by_mgrサーバー側の条件DECLINEとします。


ワークフローと連携を定義します。左ペインにてプロセス・ビューを開きます。

ページ・アイテムP5_EXPE_STATUSの値をプロセス変数EXPE_STATUSに設定するプロセスを作成します。

作成したプロセスをプロセス・フォーム申請のレビューの下に配置します。

識別名前F4A:EXPE_STATUSの設定とし、タイプとしてFlows for APEX - Manage Flow Instance Variables [プラグイン]を選択します。

以下の設定を行います。

Action : Set
Flow Instance info : In Page Items
Process ID Item : PROCESS_ID
Subflow ID Item : SUBFLOW_ID
Manage Variable(s) using : APEX item(s)
Process Variable(s) Name(s) : EXPE_STATUS
APEX item(s) : P5_EXPE_STATUS


ワークフローのユーザタスク申請のレビューを完了するプロセスを作成します。

識別名前F4A:申請のレビューとします。タイプとしてFlows for APEX - Manage Flow Instance Step [プラグイン]を選択します。

以下の設定を行います。

Action:Complete Step
Flow Instance Info:In Page Items
Process ID item:PROCESS_ID
Subflow ID item:SUBFLOW_ID
Step Key : STEP_KEY
Set Gateway Routing?:OFF
Auto-Branching?:OFF


プロセスダイアログを閉じるを選択し、サーバー側の条件タイプ- 選択 -に戻します。承認または却下のいずれのボタンが押された場合でも、ダイアログが閉じられます。


以上で上司による承認または却下を行なう画面が実装できました。


部門長による申請のレビュー



上司のレビューで承認されても金額が50米ドルを超えるときは、部門長の承認が必要なフローになっています。そのため、部門長向けに経費精算の申請をレポートする画面と、承認または却下を行うフォームを作成します。

部門長向けのレポートとフォームのページの作成手順は、上司の際に実施した手順とほぼ同じです。設定内容に言及がない場合は、上司のページを作成したときと同じ値を設定します。

ページの作成を実行し、対話モード・レポートのページを作成するところから始めます。

ページ定義ページ番号名前部門長フォーム・ページ番号フォーム・ページ名申請のレビューとします。フロー・モデルの定義に影響があるため、これらの設定はそのまま変更せずに指定します。
データ・ソースとしてローカル・データベースソース・タイプとしてSQL問合せを選択します。SQL SELECT文を入力に以下を記述します。

expe_statusの条件が上司のときはsubmittedだったのが部門長ではapproved_by_mgrsbfl_currentの条件が上司のときはreview_expense_mgrだったのが部門長ではreview_expense_vpとなっているところに違いがあります。

へ進みます。


主キー列1としてEXPE_ID (Number)を選択します。ページの作成をクリックします。


対話モード・レポートとフォームのページが作成されます。

対話モード・レポートのページ(ページ番号7)を開き、対話モード・レポートのリージョンを選択します。右ペインで属性を開き、リンクターゲットタイプURLURLとして#LINK_TEXT#を指定します。


リージョンのボタンCREATEは不要なので削除します。


レポートのページの変更を保存し、ページ番号8の申請のレビューのページを開きます。

ページの別名をフロー・モデルで使用しているreview-vpに変更します。


フォーム・リージョン申請のレビューを選択します。

ソースタイプ表/ビューに変更し、表名TUTO_EXPENSESを指定します。


ページ・アイテムP3_SUBMITTED_ONP3_EXPE_AMOUNTは部門長による申請のレビューでは使用しないため、ビルド・オプションコメント・アウトします。


部門長がコメントを入力するページ・アイテムはP8_EXPE_COMMENT_VPです。ページ・アイテムP8_EXPE_IDP8_EXPE_STATUSP8_EXPE_COMMENT_VP(とコメント・アウト済みのページ・アイテム)以外は識別のタイプを表示のみへ変更します。


上司によるコメントについてはコメントがある場合にのみ表示されるよう、サーバー側の条件タイプアイテムはNULLではないとし、アイテムとしてP8_EXPE_COMMENT_MGRを指定します。


ボタンDELETE削除します。


ボタンCREATEを選択し、申請を却下するボタンDECLINEに変更します。

識別ボタン名DECLINEラベル却下とします。外観ホットOFFにします。動作データベース・アクションSQL UPDATE操作を選択し、サーバー側の条件タイプ- 選択 -に戻し、条件を外します。


ボタンSAVEを選択し、申請を承認するボタンAPPROVEに変更します。

識別ボタン名APPROVEラベル承認とします。それ以外はボタンDECLINEと同じ変更を適用します。


ボタンAPPROVEまたはDECLINEが押された時に、ページ・アイテムP8_EXPE_STATUSにそれぞれapproved_by_vpdeclined_by_vpが設定されるように、計算を作成します。

ページ・アイテムP8_EXPE_STATUSを選択し、識別タイプ非表示にします。


ページ・アイテムP8_EXPE_STATUS計算を作成します。

実行ポイント送信後計算タイプ静的値静的値としてapproved_by_vpを指定します。サーバー側の条件タイプリクエスト = 値を選択し、APPROVEとします。


もうひとつ、ページ・アイテムP8_EXPE_STATUS計算を作成します。

ボタンAPPROVEと同様の設定ですが、計算静的値declined_by_vpサーバー側の条件の値はDECLINEとします。


ワークフローと連携を定義します。左ペインにてプロセス・ビューを開きます。

ページ・アイテムP8_EXPE_STATUSの値をプロセス変数EXPE_STATUSに設定するプロセスを作成します。

作成したプロセスをプロセス・フォーム申請のレビューの下に配置します。

識別名前F4A:EXPE_STATUSの設定とし、タイプとしてFlows for APEX - Manage Flow Instance Variables [プラグイン]を選択します。

以下の設定を行います。

Action : Set
Flow Instance info : In Page Items
Process ID Item : PROCESS_ID
Subflow ID Item : SUBFLOW_ID
Manage Variable(s) using : APEX item(s)
Process Variable(s) Name(s) : EXPE_STATUS
APEX item(s) : P8_EXPE_STATUS


ワークフローのユーザタスク申請のレビューを完了するプロセスを作成します。

識別名前F4A:申請のレビューとします。タイプとしてFlows for APEX - Manage Flow Instance Step [プラグイン]を選択します。

以下の設定を行います。

Action:Complete Step
Flow Instance Info:In Page Items
Process ID item:PROCESS_ID
Subflow ID item:SUBFLOW_ID
Step Key : STEP_KEY
Set Gateway Routing?:OFF
Auto-Branching?:OFF


プロセスダイアログを閉じるを選択し、サーバー側の条件タイプ- 選択 -に戻します。承認または却下のいずれのボタンが押された場合でも、ダイアログが閉じられます。


以上で部門長による承認または却下を行なう画面が実装できました。


経理による支払い処理



上司と部門長のレビューにより承認された経費精算の申請は、経理担当者により支払い処理が行われます。

経理担当者が支払い処理を行うためのページを作成します。

ページの作成を実行します。


対話グリッドを選択します。


ページ定義ページ番号6名前経理ページ・モード標準フォーム・ページを含めるOFFです。データ・ソースとしてローカル・データベースソース・タイプとしてSQL問合せを選択します。SQL SELECT文を入力に以下を記述します。


編集が有効をONにします。ナビゲーションはデフォルトのブレッドクラムの使用ナビゲーションの使用ともにONから変更しません。。

へ進みます。


主キー列1としてEXPE_ID (Number)を選択します。ページの作成を実行します。


対話グリッドのページが作成されます。

最初にページの別名としてprepare-paymentを設定します。


リージョン経理を開き、列の設定を調整します。

経理担当者が入力するのは列EXPE_ACCOUNTのみで、それ以外は主に申請者が入力し経理担当者が変更することはありません。列EXPE_IDEXPE_ACCOUNT(APEX$ROW_SELECTOR、APEX$ROW_ACTIONはデータの列ではないので、これらも除外)以外識別タイプ表示のみに変更します。


対話グリッドの属性を開き、編集実行可能な操作より行の追加行の削除を除きます(チェックを外す)。経理担当者が実行するのは、EXPE_ACCOUNTの更新のみです。


左ペインでプロセス・ビューを開き、対話グリッドを処理するプロセス経理 - 対話グリッド・データの保存を選択します。

設定ターゲット・タイプPL/SQL Codeに変更し、挿入/更新/削除するPL/SQLコードとして以下を記述します。

失われた更新の防止OFF行のロックNoに変更します。


対話グリッドには、未払いの経費精算の申請が一覧されていてます。支払いが済むと行が無くなります。

支払い済みの経費も確認できるように、対話モード・レポートをページに追加します。

左ペインでレンダリング・ビューを開き、リージョンの作成を実行します。

識別タイトル支払い済みタイプ対話モード・レポートとします。ソース位置ローカル・データベースタイプSQL問合せとして、SQL問合せに以下を記述します。


対話グリッドで変更作業があった後に、対話モード・レポートがリフレッシュされるように動的アクションを作成します。

リージョン経理上でコンテキスト・メニューを開き、動的アクションの作成を実行します。


作成された動的アクションの識別名前支払い済みの更新とします。タイミングイベント保存[対話グリッド]選択タイプリージョンリージョン経理になります。


TRUEアクション識別名前支払い済みのリフレッシュとし、アクションリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョン支払い済みになります。


以上で経理担当者が支払い処理を行なう画面ができました。

対話グリッドにある未払いの申請について、列EXPE_ACCOUNTに何かの数値を指定し(今回のサンプル・アプリケーションでは数値自体に意味はありません)保存すると、ワークフローが完了し、行が支払い済みに移動します。

以上でFlows for APEXを使った経費精算のワークフローが実装できました。

これまでに作成した経費精算のアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/expenseclaim-v0.zip

Flows for APEXによる経費精算アプリの作成(1) - フロー・モデルの作成

Flows for APEXのアプリケーションを実行して、経費精算のフローを作成します。

最終的に作成される経費精算のフロー・モデルは以下になります。


それではフローの作成を始めます。Flows for APEXのアプリケーションを実行します。

フロー管理の画面よりモデルの作成を実行します。


カテゴリー社内手続きとし、名前経費精算バージョンには0を入力します。

作成をクリックし、フロー・モデルを作成します。

フロー・モデル経費精算のバージョンが作成されます。

ダイアグラム変更をクリックし、フロー・ダイアグラムの記述を開始します。

フロー・モデラーが開きます。

作成中のフロー・ダイアグラムは自動保存はされません。変更の適用はまめに実行しましょう。変更の適用をせずに席外し等でブラウザを放置してセッションのタイムアウトが発生したりすると、それまで記述した内容は無くなります。


画面左のツール・パレットよりプール/参加者を作成をクリックし、画面上にプールを配置します。ドラッグ&ドロップによってプールを配置することも可能です。BPMN 2.0によるプールの定義は以下になります。
9.3 Pool and Participant 
A Pool is the graphical representation of a Participant in a Collaboration.
経費精算のワークフローの参加者は会社全体を想定しています。作成されたプールの属性が右ペインに表示されます。ダイアグラムの表現として使われるのみで、APEXで作成するアプリケーションに影響を与えることはありません。

作成したプールのIDCOMPANY名前会社とします。


配置したプールを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つのロールを持たせます。

最上位のレーンを選択IDEMPLOYEE名前従業員とします。レーンを選択したつもりで、コラボレーションなどが選択されている場合もあります。正しくレーンが選択されていることを確認します。

同様にして、他の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
  1. Start Events (see page 237), which indicate where a Process will start. 
  2. End Events (see page 245), which indicate where a path of a Process will end. 
  3. 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種類です。

開始イベントIDoutstanding_expense名前経費精算の開始とします。ラベルの位置は調整できるので、見やすい位置にします。


開始イベントの操作ツールよりタスクを追加を実行します。


BPMN 2.0によるタスクの定義は以下になります。
10.3.3 Tasks

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アプリケーションでの画面操作に対応します。


配置したタスクのIDsubmit_expense_claim名前経費精算の申請とします。ユーザー・タスク・タイプはデフォルトのAPEXページから変更しません。

ユーザー・タスク・タイプAPEXページを選択すると、APEXページタブが現れます。通常は、このタスクに紐づくAPEXアプリケーションページを設定します。

タスク経費精算の申請は、APEXのアプリケーションの経費精算の申請を行うフォームにて、ワークフローの開始(プロセス・インスタンスの作成と開始)の後続処理として、経費精算の申請を行なうタスク(この経費精算の申請のタスク)を、ユーザーがAPEXページを開くこと無く完了させるように実装します。そのため、このタスクではAPEXページの属性を設定する必要はありません。


タスク経費精算の申請の操作ツールよりタスクを追加を実行します。作成されたタスクは上司のレーンに配置します。

こちらのタスクもタイプユーザータスクに変更します。IDreview_expense_mgr名前申請のレビューとします。ユーザー・タスク・タイプAPEXページです。


上司は申請された経費のレビューを、APEXアプリケーションのページを開いて行います。そしてレビューの結果として、経費精算申請の承認もしくは却下を行います。承認と却下の作業を行なうページを、タスクのAPEXページの属性として設定します。

APEXアプリケーションは作成済みですがページは未作成であるため、アプリケーションのメタデータから属性を指定できません。APEXページ入力として手動入力を選択します。

Application IDEXPENSECLAIMとし、Page IDとしてreview-mgrを設定します。

ページ項目として、デフォルトの作成で追加されるPROCESS_IDSUBFLOW_IDSTEP_KEYに加え、アイテム名P5_EXPE_IDとしてアイテム値&F4A$BUSINESS_REF.business_refのクリック)を追加します。


ワークフローを実装するAPEXアプリケーションの別名EXPENSECLAIMです。後ほどアプリケーションに、上司による経費申請の承認と却下を行なうページを作成し、ページの別名review-mgrにします。

ページ別名を設定していますが、ページ項目に経費申請のIDを保持するP5_EXPE_IDが含まれています。ページ・アイテムのプレフィックスがP5なので、ページ番号としてを指定してページを作成する必要があります。

上司の決定に従ってフローを分岐させるゲートウェイを配置します。タスク申請のレビューの操作ツールよりゲートウェイを追加(菱形のアイコン)を実行します。作成されたゲートウェイはタスク申請のレビューの右隣に配置します。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つのパス(デフォルトのパス)が選択され、その他のパスも条件に依存して複数選択されます。並列ゲートウェイには条件はなく、分岐するフローはそれぞれ実行されます。また、分岐したフローの同期(合流)にも使用されます。イベントベースゲートウェイはメッセージの受信やタイマーによる起動など、外部のイベントを受けてフローを進める際に使用します。複合ゲートウェイはサポートされていませんが、排他や包含などを組み合わせた複雑な分岐を定義する際に使用するゲートウェイです。

今回の経費精算のワークフローでは、排他ゲートウェイのみ使用します。

配置した排他ゲートウェイ名前レビュー結果?と設定します。


ゲートウェイレビュー結果?の操作ツールよりタスクを追加を実行します。作成されたタスクはゲートウェイレビュー結果?の右隣に配置します。

操作ツールのタイプの変更(レンチのアイコン)より、タイプサービスタスクに変更します。IDinform_employee名前従業員への通知とします。


上司から経費申請を却下された際に実行する処理を定義します。

PL/SQLタブのPL/SQLコードとして、本来は従業員宛にメールを送信するといったコードを記載すべきところです。実際に通知を実装するには色々な準備が必要になるため、通知の実装は省略してnull;とだけ記載します。


ゲートウェイレビュー結果?とタスク従業員への通知を接続しているシーケンスフローを選択します。名前却下とします。このシーケンスフローをデフォルトとするため、条件順序として後に評価されるよう9999と大きな数値にします。

ラベルの却下はゲートウェイの近くに配置すると分かりやすいでしょう。


選択したシーケンスフローの操作ツールよりタイプの変更を実行し、タイプデフォルトフロー(操作ツールではデフォルトフロー)に変更します。


デフォルトフローには、斜線が付加されます。


タスク従業員への通知の操作ツールよりタスクを追加を実行します。作成されたタスクは従業員のレーンに配置します。

タスクのタイプユーザータスクに変更します。IDcorrect_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米ドルより高額?の右隣に配置します。

タスクのタイプユーザータスクに変更します。IDreview_expense_vp名前申請のレビューとします。ユーザー・タスク・タイプAPEXページです。


部門長による承認と却下の作業を行なうページを、タスクのAPEXページの属性として設定します。

APEXページApplication IDEXPENSECLAIMとし、Page IDとしてreview-vpを設定します。ページ項目デフォルトの作成によって追加されるPROCESS_IDSUBFLOW_IDSTEP_KEYに加えて、アイテム名P8_EXPE_ID、アイテム値&F4A$BUSINESS_REF.を追加します。

Page IDreview-vpと設定しますが、ページ項目にP8_EXPE_IDが含まれているため、この処理を行なうページのページ番号は8にする必要があります。


ゲートウェイ50米ドルより高額?とタスク申請のレビュー(部門長のレーン)を接続しているシーケンスフローを選択します。名前はいとします。条件順序10条件タイプとしてを選択します。条件として以下を記述します。

:F4A$EXPE_AMOUNT > 50

プロセス変数EXPE_AMOUNTの値が50より多い場合、このシーケンスフローが選択されます。このゲートウェイより前のタスクにて、プロセス変数EXPE_AMOUNTに経費申請の金額が設定されている必要があります。


ゲートウェイ50米ドルより高額?の操作ツールよりタスクを追加を実行します。作成されたタスクは経理のレーンに配置します。

タスクのタイプユーザータスクに変更します。IDprepare_payment名前支払いの準備とします。ユーザー・タスク・タイプAPEXページです。


経理担当者が支払い作業を行なうページを、タスクのAPEXページの属性として設定します。

APEXページApplication IDEXPENSECLAIMとし、Page IDとしてprepare-paymentを設定します。ページ項目デフォルトの作成で追加されるPROCESS_IDSUBFLOW_IDSTEP_KEYを追加します。

経費担当者による処理は対話グリッドで実装しフォームは使用しないので、ページ・アイテムは作成されません。そのため追加するページ・アイテムはありません。


ゲートウェイ50米ドルより高額?とタスク支払いの準備を接続するシーケンスフローを選択します。名前いいえとします。条件順序9999とします。

シーケンスフローの操作ツールより、タイプデフォルトフローに変更します。経費の申請額が$50以下であれば部門長の承認は不要で、経費精算申請はそのまま経理に回ります。


部門長のレーンにあるタスク申請のレビューの操作ツールよりゲートウェイを追加を実行します。作成されたゲートウェイはタスク申請のレビューの右隣に配置します。ゲートウェイタイプは、デフォルトの排他ゲートウェイです。

名前レビュー結果?とします。


部門長のレーンにあるゲートウェイレビュー結果?の操作ツールよりシーケンス/メッセージフローまたは関連線で接続を実行し、シーケンスフローでタスク従業員への通知に接続します。部門長に経費精算申請が却下されると、申請した従業員に通知されます。

接続したシーケンスフローの名前却下とします。条件順序9999とし、タイプデフォルトフローに変更します。


部門長のレーンにあるゲートウェイレビュー結果?の操作ツールよりシーケンス/メッセージフローまたは関連線で接続を実行し、シーケンスフローでタスク支払いの準備に接続します。

接続したシーケンスフローの名前承認とします。条件順序10とし、条件タイプとしてを選択します。条件には以下を指定します。

:F4A$EXPE_STATUS = 'approved_by_vp'

部門長のレーンに含まれるユーザータスク申請のレビューにて、承認の場合はプロセス変数EXPE_STATUSapproved_by_vp却下の場合はそれ以外の値が設定されている必要があります。


タスク支払いの準備の操作ツールよりタスクを追加を実行します。作成されたタスクはタスク支払いの準備の右隣に配置します。

タスクのタイプスクリプトタスクに変更します。IDexecute_transaction名前経費の支払いとします。


経費の支払いを実際に行なうスクリプトを定義します。

右ペインでPL/SQLタブを開きます。PL/SQLコードとして以下のコードを記載します。



BPMNの記法上、サービスタスクはワークフロー・エンジン以外で実行するタスク、スクリプトタスクはワークフロー・エンジンが実行するタスクと定義されています。Flows for APEXではサービスタスクはPL/SQLコードより外部のタスクを呼び出す処理、スクリプトタスクはPL/SQLの処理で完結(データベース内で完結)する、ということになります。サービスタスクの場合、タイプとしてメールの送信を選択できます。

タスク経費の支払いの操作ツールより終了イベントを実行します。作成された終了イベントはタスク経費の支払いの右隣に配置します。

IDexpense_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