2015年1月29日木曜日

iDempiere 想定業務フロー 1.7 Sales Order 受注 ワークフロー

書籍ADEMPIERE 3.4 ERP SOLUTIONS  では、もう一つワークフローの例を挙げています。
ある特定のベンダーに対する発注がキャンセルされた場合に、メールにて通知するというものです。

この仕組みを理解したいと思うのですが、せっかくですからちょっと違うケースでトライしてみようと思います。

想定するシナリオとしては、次の様に考えてみました。
顧客 Amadonは Minotta Film にとって超大口顧客であり、Amadonからの受注には特別な注意をはらって納入まで専任者にステータスのトラックをしてもらいたい。

このためAmadonからの受注を受けたら専任者にメールを自動発信し、専任者が見落とすことのないように管理できる様にする。

(実際には Ama○on からの発注は1日複数回EDI連携したりするのでいちいちメール飛ばしていたら大変ですが、)

さて、この仕組みを実現するにはどうすれば良いのでしょうか?

iDempiereにはDocument の Status が変化したことをトリガーとして処理を開始する機構があります。
受注伝票が起票されたとき、すべての受注を確認し、Business Partner が Amadon だった場合に Email を専任者に送るようワークフローを設定します。

今回は 1.7 受注のプロセスが対象となります。


1.7 受注をブレークダウンし、今回の投稿のプロセスを(無理矢理)書くと下の様になります。

なんのことはないのですが、 受注して、それが Amadonからだったらメール発信するだけです。オーダー追跡は専任者の作業とします。(本来はiDempiereのステータスを確認したりしますが、設定上意識するのはメールを出すところのみ範囲とします)

マスター系からいきます。Admin 広瀬さんでログインします。

専任者は多田さんにします。
Menu -> System Admin -> General Rules -> Security -> User
メールアドレスは idempiere3@xxxx.com

メールを発信しますので、以前の投稿と同様にメールのテンプレートを作成します。
Menu -> Partner Relations -> Mail Template
メールテンプレートを新規作成し、登録します。
Organization: *
Name/Subject: SO from Amadon
Message: We've got SO from Amadon. We have to treat this order carefully.

とでもしましょう。(なんでも構いません)

つづいてワークフローを追加します。
Menu -> System Admin -> General Rules -> Workflow -> Workflow
ワークフローを新規追加

なんちゃって仕様書でこれまでやってきましたが、若干記述が増えると情報量的とスペースの関係に限界が見えてきます。イメージとしてはいいのですが、業務として仕様を表すためには別に書式を用意した方がよさそうです。

Search Key: Process_SO_Amadon_Alert
Name : Process_SO_Amadon_Alert
Workflow Type: Document Value
Table: C_Order
Document Value Logic: @docstatus@=VO
Data Access Level: Client+Organization
Author: Me!

一度セーブして、Node を追加していきます。
追加するノードは3つ
(Start)
  Action: Wait
(SendEmail)
  Action: Email
  Email Address: idempiere3@xxxx.com
  Mail Template: SO from Amadon
(End)
  Action: Wait

(Start) と (SendEmail) に Transition を追加します。
(Start)
  Sequence: 10
  Next Node: (SendEmail)
  Sequence: 20
  Next Node: (End)

(SendEmail)
  Sequence: 10
  Next Node: (End)

(Start) の Transition に3つの Condition を追加します。
  Sequence: 10
  And/Or: or
  Condition: C_Bpartner_ID_BusinessPartner = (登録した BusinessPartner の ID)

  Sequence: 20
  And/Or: and
  Condition: IsSOTrx_SalesTransaction = Y

  Sequence: 30
  And/Or: and
  Condition:C_DocType_ID_Document Type = (Sale Order の Document ID )

-------------------------
Sequence:20 は、C_Order テーブルは、 Sales Order と Purchase Order 両方で使っており、IsSOTrx フィールドが Y か N で識別しているそうです。
今回の場合は IsSOTrx フィールドが Yes のものを選別しています。
例えば顧客Amadon が仕入れ先にならないと明確であれば、この Sequence:20の Condition は必要無いかもしれません。
--------------------------

ここで、 BusinessPartnerのID やらDocument ID やら出てきます。
内部コードが必要なため、DBを見てみます。

サーバーに接続し、PostgreSQLを開きます。
DBまわりのことは以前の投稿をご参照ください。
AWS EC2 CentOS6.5 に もう一度はじめからPostgreSQL9.3 を インストールしてみた(その3)

BusinessPartner ID だけでなく、 Document IDもクライアント毎に異なるため、自分のクライアントIDを把握する必要があります。

----------------------
[root@ip-xxxxx ~]# psql -d idempiere -U adempiere
psql (9.3.5)
Type "help" for help.

idempiere=# 
idempiere=# select ad_client_id, name from ad_client;
 ad_client_id |         name          
--------------+-----------------------
           11 | GardenWorld
            0 | System
      1000000 | Net Search Technology
      1000001 | Minotta Film
(4 rows)
-----------------------


Minotta Film の Client IDは '1000001' であることがわかります。

Business Partner を調べます

-----------------------------
idempiere=# select c_bpartner_id, ad_client_id, name from c_bpartner;
 c_bpartner_id | ad_client_id |         name          
---------------+--------------+-----------------------
           119 |           11 | GardenUser BP
           112 |           11 | Standard
       1000025 |      1000001 | ヨドゴシ 新宿店
       1000027 |      1000001 | Amadon
       1000024 |      1000001 | ヨドゴシ 練馬店
       1000056 |      1000001 | 多田
(61 rows)

-----------------------
大きく間引いていますが、 client 'Amadon' のBusinessPartner ID は 1000027 であることがわかります。

Document Type を調べます。

----------------------------
idempiere=# SELECT c_doctype_id , name FROM c_doctype WHERE ad_client_id = '1000001';
 c_doctype_id |             name             
--------------+------------------------------
      1000047 | GL Journal
      1000048 | GL Journal Batch
      1000049 | AR Invoice
      1000050 | AR Invoice Indirect
      1000051 | AR Credit Memo
      1000052 | AP Invoice
      1000053 | AP CreditMemo
      1000054 | Match Invoice
      1000055 | AR Receipt
      1000056 | AP Payment
      1000057 | Allocation
      1000058 | MM Shipment
      1000059 | MM Shipment Indirect
      1000060 | MM Vendor Return
      1000061 | MM Receipt
      1000062 | MM Customer Return
      1000063 | Purchase Order
      1000064 | Match PO
      1000065 | Purchase Requisition
      1000066 | Vendor Return Material
      1000067 | Bank Statement
      1000068 | Cash Journal
      1000069 | Material Movement
      1000070 | Physical Inventory
      1000071 | Material Production
      1000072 | Project Issue
      1000073 | Internal Use Inventory
      1000074 | Cost Adjustment
      1000075 | Binding offer
      1000076 | Non binding offer
      1000077 | Prepay Order
      1000078 | Customer Return Material
      1000079 | Standard Order
      1000080 | Credit Order
      1000081 | Warehouse Order
      1000082 | Manufacturing Order
      1000083 | Manufacturing Cost Collector
      1000084 | Maintenance Order
      1000085 | Quality Order
      1000086 | Distribution Order
      1000087 | Payroll
      1000088 | POS Order
      1000089 | AR Pro Forma Invoice
      1000090 | GL Document
      1000091 | Fixed Assets Disposal
      1000092 | Fixed Assets Addition
      1000093 | Fixed Assets Depreciation
      1000094 | In-Transit Material Movement

(48 rows)
----------------------------
ここでは Standard Order として考えます。IDは 1000079  となります。

--------------------------
余談1
書籍ADEMPIERE 3.4 ERP SOLUTIONS に Business Partner ID についてはAdempiereからの確認方法についての記述があったのですが、よく分からず挫折。
いずれにせよ Document Type ID は調べる必要があったのでDBを直接見ました。
余談2
せめてDBを覗くツール使った方が楽なのですが、今のところSQLで間に合うのでもちっとこのまま行きます。
余談3
Condition の Value に式を書いてあげればDB覗く必要ないのかもしれません。
例えば Document Type ID は
@SQL=SELECT c_doctype_id FROM c_doctype WHERE ad_client_id = @#AD_Client_ID@ AND name = ’Standard Order';
とか書けばできるかも??
でもなんでも「汎化」すれば良いとも思いません。変更の確率を考えて実現方法を選択するのも重要だと思います。(コーディング工数だけでなく、テスト工数や実行時のリソースも含めて)
このあたりの記述は以前の投稿「iDempiere アプリケーション辞書 画面のカスタマイズ(Default Logic)」参照ください。
--------------------------------


最後に Workflow Process_SO_Amado_Alertまで戻り、Start Node に (Start) をセットしてからValidateWorkflow ボタンを押し、整合性をチェックします。
(あれ?いままでやってなかったけどいいのかな?たぶんNodeなど変更したらチェックすべきなのでしょうね。)


書籍ADEMPIERE 3.4 ERP SOLUTIONS  では
 Node (Start) の Condition の3つをすべて or を指定してありますが、おそらく誤植だと思います。
また、ワークフローの画面も前の節で使った Process_Requisition のものなので、これも??です。
時折トラップありますので、確認が必要ですね。



0 件のコメント:

コメントを投稿