【IM_Workflow】案件が最終承認をしたのと同時に参照画面のPDFを出力する方法

#はじめに
intramartでforma-designerの申請画面をIM-Workflowでの最終承認時にPDFとして出力する方法について、紹介します。
* のついている箇所は参考欄を参照してください。

#前提
・バージョンは2018Summer
・案件終了処理、ジョブで使用するソースはintramart公式が公開しているもの(*1,*2)を編集する。

#やりたいこと
・案件終了時に画面のPDFをパブリックストレージに保存する
・案件終了処理のプログラムから、ファイルを出力するジョブを起動する

#手順1 ジョブを作成する
####1-1 ジョブで実行するプログラムのソースを組む
PDF出力を行うジョブのソースをサンプルプログラム(*3)を編集し以下のように作成する。
以下では、印刷するPDFの設定を行っている。

```js:execute.js#execute
// グローバル変数
const storageFolderName = "test";  // パブリックストレージ→testのフォルダにファイルを出力する
const applicationId = "app";  // アプリケーションID

function execute() {
  
  var insertId = "test123456";  // formadesignerで作成されるアプリケーションデータを格納するテーブルのimfr_sd_insert_id
  var userCd = "aoyagi";  // 申請者を設定

  var title = "";
　var options = [];
  // リンク無効
  options.push("--disable-external-links");
  // 印刷モード
  options.push("--print-media-type");
  // タイムアウト処理
  options.push("--javascript-delay");
  options.push("20000");
  // 拡大縮小設定
  options.push("--zoom");
  options.push("1.0);  // 倍率

  title = "PDF出力タイトル";  // 一意となるタイトルにする
}
```

そして以下でPDF出力を実行する

```js:execute.js#execute
title = "PDF出力タイトル";  // 一意となるタイトルにする

try{
  var pdfConv = new FRApplicationPDFConverterAsync();
  var result = pdfConv.createPDF(applicationId,insertId,userCdoptions);

}catch(error){
  return {
    status : 'warning' ,
    message : error.errorMessage
  };
}
```

この時点でPDFを作成できているはずなので、そのファイルをパブリックストレージに保存する処理を作成します。

```js:execute.js#execute
     message : error.errorMessage
  };
}
// 作成されたPDFファイル
var pdfFile = result.data;

// 保存先を指定
var dirStorage = new PublicStorage(storageFolderName, title);

try{
  dirStorage.createAsBinary(function(reader,error1){  // ストレージにファイルを作成する
    if(error1 != null){
      throw error1
    }
    pdfFile.openAsBinary(function(reader,error2){  // 作成されたPDFファイルを開き、中身を読み込む
      if(error2 != null){
        throw error2;
      }
      reader.transferTo(writer);  // 読み込んだデータをパブリックストレージに作成したファイルにコピーする
    });
  });
}catch(error){
  return {
    status : 'warning' ,
    message : error.errorMessage
  };
}finally{
  // 作成されたPDFファイルを削除する
  pdfFile.remove();
}
```

####1-2 ジョブを作成する
公式にて紹介されているジョブ・ジョブネットの設定手順(*4)に従って、ジョブネットを作成してください。その際のジョブネットIDをjobExecute.js内の変数と同期させてください。

#手順2 案件終了処理を作成する
####2-1 案件終了処理のソースを組む

```js:matter_end.js#execute
function execute(parameter){

  var result = {
       "resultFlag" : true,
       "message" : "",
       "data : true
  };
  var jobnetId = "testJob";  // 1-2で作成したジョブネットのIDを指定する

  var jobManager = new JobSchedulerManager();
  var result = jobManager.execute(jobnetId);

  return result;
}
```

#手順3 案件終了処理をIM-Workflowと連携する
####3-1 コンテンツ定義に案件終了処理を登録する
作成したソースをjssp/src以下に配置する。今回はsrc/sampleに配置した。
コンテンツ定義⇒ユーザプログラムで新規作成し、以下のように入力する。

プログラム名：画面PDF出力処理
プラグイン種別：案件終了処理
プラグイン種類：【案件終了処理スクリプト開発モデル】
   sample\matter_end
備考：
初期使用：チェック
実行順番：1
※必ず初期使用のチェックボックスを入れること


#おわりに
これにて完成です。
案件が終了すると同時にファイル出力のジョブが実行され、パブリックストレージにPDFファイルが作成されます(作成完了まで20秒ほどかかります)。
あとはjobExecute.js内でアプリケーションIDごとにタイトルやオプションを動的に変更させるなどにより、その後の開発でも再利用することができますね。
また、これを応用して、申請画面に添付されたファイルも同じくパブリックストレージに出力することもできます。
そちらについてはまた後の機会に紹介するかと思います・・・

#参考
*1・・・案件終了処理等のサンプルプログラム

https://document.intra-mart.jp/library/iap/public/im_workflow/im_workflow_programming_guide/texts/appendix/template/appendix_1.html

*2・・・ジョブで実行するプログラムのサンプル

https://document.intra-mart.jp/library/iap/public/im_job_scheduler/im_job_scheduler_specification/texts/example/index.html

*3・・・ジョブスケジューラAPI

https://api.intra-mart.jp/iap/apilist-ssjs/doc/platform/JobSchedulerManager/index.html

*4・・・ジョブの設定手順

https://document.intra-mart.jp/library/iap/public/operation/tenant_administrator_guide/texts/basic_guide/basic_guide_14.html