この特集のトップページへ
Chapter 6:ビジネスロジックの設計

head2.gif 6.5.3 承認,却下処理
 次に,伝票の承認ならびに却下の処理を実装してゆく。

●伝票の却下
 まずは伝票の却下から説明する。伝票の却下処理は次の2つの処理の組み合わせとなる。

  1. 伝票のREQ_CONSENTFLAGフィールドの値をFalseとし,REJECTEDFLAGフィールドの値をTrueとする

  2. 製品テーブルの予約数(BACKORDERフィールドの値)に加えた値を減らして元に戻す

 よって,処理内容としては,List 6-156に示した承認依頼を取り消すためのCancelRequestConsentメソッドと同じような処理になる。実際にこのメソッドをBusiness.SlipコンポーネントにRejectSlipという名前で実装したものが,List 6-157である。List 6-157に示したRejectSlipメソッドは,引数に却下したい伝票の伝票番号と却下時のコメントをとり,指定した伝票を却下状態にする。

 List 6-156List 6-157の処理で異なるのは,伝票のREJECTEDFLAGフィールドをTrueにする処理を加えたこと(60行目)と,ユーザー権限の調査処理が異なること,という2点のみである。List 6-156に示した承認依頼を取り消すためのCancelRequestConsentメソッドでは,伝票の起票者またはSalesAdminロールかAllAdminロールに属するユーザーかどうかを調べているが,List 6-167RejectSlipメソッドでは伝票を却下できるのは営業部の上司であるSalesManagerロールに属するユーザーまたはSalesAdminロールかAllAdminロールに属するユーザーとした(48〜52行目)。それ以外の処理については,まったく同じである。

●伝票の却下取り消し
 誤操作により伝票を却下してしまったときのことを考えると,却下を取り消すメソッドも必要となる。ただし,却下を取り消すメソッドは必須のものではない。なぜなら,誤って却下した場合,却下された伝票をもう一度承認依頼すればよいからである。しかし,伝票を承認依頼できるのは伝票の起票者であり営業部上司ではない。そのため,営業部上司は伝票の起票者に誤って伝票を却下してしまったことを告げ,ふたたび承認依頼してほしい旨を何らかの方法で伝える必要が生じる(SalesAdminロールかAllAdminロールに属するユーザーであれば,承認依頼処理を実行できるため,営業部上司がSalesAdminロールまたはAllAdminロールに属するのであれば,この限りではない)。これでは,使いづらい。

 以上の理由から,伝票の却下を取り消すメソッドを用意しておく。伝票の却下を取り消すには,伝票の却下と逆の処理をすればよい。すなわち,次の処理の組み合わせとなる。

  1. 伝票のREJECTEDFLAGフィールドの値をFalseとし,REQ_CONSENTFLAGフィールドの値をTrueとする

  2. 明細に記されている在庫を調査する

  3. 製品テーブルの予約数(BACKORDERフィールドの値)と,伝票に付随する明細に記載されている数量とを加え,予約ずみとする

 つまり,内容的にはList 6-151に示したBusiness.SlipコンポーネントのRequestConsentメソッドと同じような処理になる。実際に却下を取り消すメソッドをBusiness.SlipコンポーネントにCancelRejectSlipという名前のメソッドとして実装したものがList 6-158である。

 なお,List 6-158の52〜64行目を見るとわかるように,CancelRejectSlipメソッドを呼び出すことができるユーザーは,伝票を却下したユーザーまたは,SalesAdminロールかAllAdminロールに属するユーザーに制限している。伝票を却下したユーザーのアカウント名は,伝票を示すレコードのREJECTEDUSERフィールドに格納されるので(List 6-144の46行目を参照),それとメソッドを呼び出したユーザーのアカウント名とを比較すれば,伝票を却下したユーザーであるかどうかを判定できる。SalesManagerロールに対して権限を与えていないのは,もしSalesManagerロールに対して権限を与えると,SalesManagerロールに複数のユーザーが所属する場合に,あるユーザーによる却下処理を別のユーザーが取り消すことができるようになり,業務上好ましくないためである。

 ところで,List 6-158CancelRejectSlipメソッドの呼び出しは失敗する可能性がある点に注意したい。伝票を却下するには,List 6-157RejectSlipメソッドを呼び出す。この処理に際しては,73〜83行目のWhileループ内で,製品の予約数を解放している。よって,List 6-158CancelRejectSlipメソッドを呼び出すまえに別の伝票が追加され,製品の在庫が足りなくなったならば,伝票の却下を取り消すことはできないということになる。このような状況になった場合には,伝票の納入予定日を延ばして再度承認依頼処理をするか,追加した別の伝票を削除するしか解決の方法はない。

prevpg.gif Chapter 6 73/92 nextpg.gif