2022年1月28日金曜日

Flows for APEXによる経費精算アプリの作成(7) - タイマー・イベント

BPMN 2.0に含まれるタイマー・イベントを使用してみます。

タイマー・イベントを使用するには、Flows for APEXのZIPファイルのApplications/Enable_Timers以下に含まれるenable_times.sqlを実行し、DBMS_SCHEDULERのジョブを開始する必要があります。

enable_timers.sqlをAPEXワークスペースで実行するには、ワークスペースのスキーマにCREATE JOB権限が必要です。以下のコマンドにて、権限を付与します。

grant create job to <ワークスペース・スキーマ>;

Autonomous Databaseの場合、ユーザーADMINデータベース・アクションに接続し、SQLの画面より実行します。


APEXに戻り、SQLワークショップSQLスクリプトを開き、ファイルenable_timers.sqlアップロードし、実行します。


Flows for APEX 22.2に添付されているenable_timers.sqlの内容です。FLOW_TIMERS_PKG.STEP_TIMERS10秒ごとに実行しています。

-- Enable timers in BPMN --
--
-- execute in your workspace schema
--
-- Make sure you have the privilege "create job"
-- If not, execute the following statement as sys first:
-- grant create job to <my_workspace_schema>;

begin
dbms_scheduler.create_program
( program_name => 'APEX_FLOW_STEP_TIMERS_P'
, program_type => 'STORED_PROCEDURE'
, program_action => '"FLOW_TIMERS_PKG"."STEP_TIMERS"'
, number_of_arguments => 0
, enabled => true
, comments => 'Update timers status and move the flow forward.'
);

dbms_scheduler.create_job
( job_name => 'APEX_FLOW_STEP_TIMERS_J'
, program_name => 'APEX_FLOW_STEP_TIMERS_P'
, job_style => 'LIGHTWEIGHT'
, start_date => systimestamp
, repeat_interval => 'FREQ=SECONDLY;INTERVAL=10'
, enabled => true
);
end;

以上の設定にて、フロー・ダイアグラムに含まれるタイマー・イベントが有効になります。

フロー・ダイアグラムを修正します。ステータスがdraftのバージョンのフロー・ダイアグラムをフロー・モデラーで開きます。今までの記事通りに作業をされていると、フロー・モデル経費精算のバージョン2がステータスdraftで編集可能になっているので、それを開きます。

上司部門長による申請のレビューにて却下された申請はタスク申請の修正へ回され、従業員による再提出待ち(タスク申請の修正)になります。このとき、一定の時間までに再提出されない場合は経費精算の申請を破棄(ステータスをabandonedに変更)し、ワークフローを完了します。

ツール・バーより中間境界イベントを作成を選択し、タスク申請の修正の上に配置します。


配置したイベントのタイプの変更(レンチのアイコン)より、タイマー境界イベントを選択します。


タイマー境界イベントのプロパティを設定します。名前再申請の待機とします。詳細タイマー定義タイプ日付または期間のどちらかを選択できます。今回は期間を選択します。どちらも書式にOracleまたはISO 8601を選択できます。

タイマー定義タイプとして期間(ISO 8601)を選択します。

タイマー定義にはISO 8601に従った値を指定します。今回はPT1Mとし、1分以内に再申請がなければ申請を破棄します。(PはPeriod - 期間、TはTime - 時間、1Mで1分の意味です)。


タイマー境界イベント再申請の待機の操作ツールよりタスクを追加を実行します。作成されたタスクのタイプスクリプトタスクに変更し、タスクの名前申請の破棄とします。


PL/SQLタブを開き、PL/SQLコードとして以下を記述します。



タスク申請の破棄の操作ツールより終了イベントを追加を実行します。作成された終了イベント名前支払いせずに完了とします。


以上でタイマー・イベントを使ったフロー・ダイアグラムに変更されました。変更の適用を実行して変更を保存します。

変更したフロー・ダイアグラムはバージョンのステータスをreleasedにするまで、稼働中のアプリケーションでは使用できません。とはいえreleasedに変更すると、フロー・ダイアグラムに間違いがあったときにバージョンをあげる必要があります。

こちらの記事で作成した経費精算 - 開発中のアプリケーションは、ステータスがdraftのバージョン2を使うように作られています。このアプリケーションを使って動作を確認します。

従業員にて経費精算の申請を行い、上司が却下をします。その状態で1分待ちます。もう一つ、経費精算の申請を行い部門長が却下します(金額は100米ドルより高額にします)。

両方の申請ともに、ステータスはabandonedになります。


上司に却下された後、再申請が時間切れになったフローをビューワーで確認します。


部門長に却下されたフローです。


どちらも期待通りのフローになっています。

変更したフロー・ダイアグラムのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/20221221-2347_%E7%B5%8C%E8%B2%BB%E7%B2%BE%E7%AE%97_draft_2.bpmn