2022年1月25日火曜日

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