iDempiere（JPiere）の画面からのプロセス起動

前回は、[iDempiere（JPiere）に装備されいるSOAP機能を使用してプロセスを起動](https://qiita.com/idempiere-fan/items/519507eb6fa9a94b791e)しました。
今回は、iDempiereの画面から実装したプロセスを起動したいと思います。

## プロセス起動までの設定および実装手順
画面からプロセス起動するにあたり、iDempiere画面からのメニュー登録設定とjavaコードによる実装を行います。
画面からプロセスを起動するシナリオは、以下の通り。
iDempiere画面のリンクをクリックすると、入力項目が表示されます。入力後、さらにユーザからの入力を受け付けるポップアップ画面が表示され、そこで入力した値を受け取り画面に入力値を表示して処理終了するというものです。

## iDempiere設定画面のメニュー登録
iDempiereのメニューに```PopupWindowCalcProcess```というリンクを追加します。
### 設定結果
メニューに登録した結果の状態を以下に示します。
画面上部アイコンをクリックすると、```PopupWindowCalcProcess```が表示されます。
このリンクにCalcProcessを紐づける設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/4757f4c5-9190-ba91-a9ab-7e15aeb89e6e.png)

以下に、設定手順を説明します。
### メニュー登録
メニューにCalcProcessを登録します。
* ログイン
メニューの設定を行うにあたり、ログインユーザはSystem Administratorとしてログインします。
**Tenant: System**
**Role: System Administrator**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/f9735dce-cff3-c6f9-1be4-539ba96bb9b6.png)

* メニューの追加
System Administratorでログイン後、左メニューに```Menu```が表示されます。
```Menu```をクリックし```新規ボタン```をクリックします。
入力欄に以下を設定します。
**Name: PopupWindowCalcProcess**
**Description: PopupWindowCalcProcess**
**Action: Process**
**Process: CalcProcess_CalcProcess**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/c062f48c-a884-5eb0-c40f-88edc7baa738.png)
上記内容を入力後、保存ボタンをクリックし情報を登録します。

メニューへの追加作業は以上です。
一度ログアウトし再度ログインします。

:::note
画面メニューを設定するにあたり、前回までの手順でProcessにCalcProcess(Process: CalcProcess_CalcProcess)が登録されている前提となります。
:::

## ポップアップを表示する実装
画面メニューからプロセス実行時、ユーザからの入力を受け付ける画面をポップアップとして表示する実装を行います。
ポップアップ表示の実装は、CalcProcessクラスに実装します。
※ 前回実装したCalcProcessをさらに修正します。

### 修正前のソースコード
前回までの実装により、フォルダ構成およびソースコードは以下の状態になっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/584d0e84-9fbc-2b63-c10a-3e8a23c5b0c4.png)

**CalcProcess.java**
```java
	@Override
	protected String doIt() throws Exception {

        /* 
        * 以下は前回までの実装内容です
        * 今回はこの部分にコードを記述していきます
        */
		log.warning("[x] doIt method.");
		
		log.warning(value1 != null ? " [-] argValue1: " + value1 : "argValue1 NULL");
		log.warning(value2 != null ? " [-] argValue2: " + value2 : "argValue2 NULL");
		
		return "Post values SUCCESS!";
	}
 ```
今回の修正は、```CalcProcessクラスのdoIt()メソッド（CalcProcess.java）```にコードを追加していきます。
 
### doItメソッドの修正結果
```java

	@Override
	protected String doIt() throws Exception {
		
		log.warning("[x] doIt method.");

        /* ポップアップ画面から入力された値を格納するバッファを用意します */
		final StringBuilder customValue1 = new StringBuilder();
		final StringBuilder customValue2 = new StringBuilder();
		
		/* 1つ目の画面を表示します。ここで入力された値をcustomValue1バッファに格納します */
		processUI.askForInput("Please enter a Value for customValue1.", new Callback<String>() {
			@Override
			public void onCallback(String result) {
				customValue1.append(result);
			}
		});
		/* customValue1に値が入力されるまでポップアップ画面を表示したままにします */
		while (customValue1.length() == 0) {
		  try {
            /* ユーザからの入力を認識させるため少し処理を待機させます */
		    Thread.sleep(200);
		  } catch (InterruptedException e) {}
		}


		/* 2つ目の画面を表示します。ここで入力された値をcustomValue2バッファに格納します */
		processUI.askForInput("Please enter a Value for customValue2.", new Callback<String>() {
			@Override
			public void onCallback(String result) {
				customValue2.append(result);
			}
		});
        /* customValue2に値が入力されるまでポップアップ画面を表示したままにします */
		while (customValue2.length() == 0) {
		  try {
		    Thread.sleep(200);
		  } catch (InterruptedException e) {}
		}
  
        /* 
        * argValueとcustomValueの値をそれぞれ画面に表示します。
        */
		addLog("Assumed Input Items argValue1 : " + value1);
		addLog("Assumed Input Items argValue2 : " + value2);
		addLog("Dynamic Input Items customValue1 : " + customValue1.toString());
		addLog("Dynamic Input Items customValue2 : " + customValue2.toString());
		
		return "Your input values.";
	}
```
実装は以上です。

以上で、画面の設定およびソースコードの修正が完了しましたので、iDempiereサービスを再起動します。

## 動作確認

### ログイン
サービス再起動後、GardenWorld Adminでログインします。
**Tenant: GardenWorld**
**Role: GardenWorld Admin**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/a5d49dc7-6c45-bd08-6436-f551320e03c3.png)

### メニューの表示内容確認
メニューアイコンをクリックすると一覧に```PopupWindowCalcProcess```が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/9a8c0707-2496-1bcf-bc39-6779a3052d34.png)

### プロセスの実行
上記メニューから```PopupWindowCalcProcess```をクリックします。

### 値の入力画面
* Process登録時の2項目の入力
入力画面が表示されます。ここで表示される項目は、CalcProcessをProcessに登録時に設定した2項目です。
※ SOAPのリクエストから受け付けるargValue1およびargValue2を登録したため、その2項目が最初の画面に表示されます。
値を入力後、```OKボタン```をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/c68fd1ce-6997-1589-a4ef-eff9e61f1b7e.png)

* ポップアップ項目
OKボタンをクリック後、1つ目のポップアップが表示されます。
```123```を入力し```チェックボタン```をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/b838ccc9-44b7-0b67-19cb-22491acc0298.png)

つづいて、2つ目のポップアップが表示されます。
```456```を入力し```チェックボタン```をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/792203e9-57cb-485d-7d58-bbb152971a9c.png)

### 入力値の表示結果
入力した値が内容がaddLog関数により画面上に表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623535/87d422ab-7ff6-20b1-1b67-9dcd9fb0660e.png)

メニューからの起動と動作確認は以上です。

## 次回は
今回は、プロセスとして実装した処理を画面のメニューから起動してみました。
次回は、[ログイン認証(OpenLDAPを認証サーバに使用する)](https://qiita.com/idempiere-fan/items/6d779d2d3b382bc75848)について検証したいと思います。