処理プログラムについて



処理プログラムとは

処理プログラムとは、フロー図中の申請者(承認者)と承認者の間の処理を定義するプログラムである。
フロー図
この処理は、通常処理(through)、分岐処理(junction)、結合処理(combine)、 分岐&結合処理(compound)、終結処理(terminate)の5種類 が定義されている。 それぞれの処理種別に対して複数の処理(処理プログラムファイル)を定義できる。
処理プログラムファイルは workflow/init.jsファイル内でベースモジュールに 読み込む必要がある。(例:include("workflow/process/throSmp01");) (詳細はマニュアルを参照して下さい。)
*分岐、結合、分岐&結合処理は、別売のワークフローデザイナーでの機能となります。

これらはワークフローオブジェクトの Module.workflow.setProcess() メソッドにより 登録されたプログラムであり、初期インストール時には workflow/process/ フォルダに格納されている。
それぞれの処理プログラムファイル中の処理関数の引数、oCurrent、aBefore、aNext の仕様は 以下の通り。


概要

承認案件の状態を参照するためのオブジェクト
oCurrent: 現在作業対象のブロックオブジェクト(Object型)
aBefore : 前ブロックオブジェクト群 (配列型:oCurrentオブジェクトと同様のオブジェクトが、前ブロックの数分、配列に格納されている。 oCurrentが結合位置だった場合、配列の要素が複数となる。)
aNext : 次ブロックオブジェクト群 (配列型:oCurrentオブジェクトと同様のオブジェクトが、次ブロックの数分、配列に格納されている。 oCurrentが分岐開始位置だった場合、配列の要素が複数となる。)

位置関係

oCurrentの構造図

    oCurrent
	  ├ application     //承認種別コード
	  ├ route           //ルートコード
	  ├ block           //申請または承認処理を行ったブロックコード
	  ├ id              //案件番号
	  ├ active          //処理結果
	  |   ├ status        //結果ステータス
	  |   ├ comment       //コメント
	  |   ├ nego          //根回しメール
	  |   |  ├ user          //ユーザコード(カンマ区切り)
	  |   |  ├ name          //ユーザ名(カンマ区切り)
	  |   |  ├ to            //メールアドレス(カンマ区切り)
	  |   |  ├ subject       //タイトル
	  |   |  └ body          //本文
	  |   ├ key[]         //承認種別アプリケーションより渡されたデータ
	  |   └ sendback      //差し戻し
	  |       └ to        //ブロックコード
	  ├ applicant       //申請者ブロック
	  ├ user            //申請者ユーザ
	  |  ├ code            //ユーザコード
	  |  ├ name            //ユーザ名
	  |  └ mail            //メールアドレス
	  ├ data
	  |   ├ transaction       //進捗状況
	  |   |  └ ブロックコード
	  |   |         └ user[]        //ユーザの時間軸ごとの処理(*1)
	  |   |             ├ code          //ユーザコード
	  |   |             ├ name          //ユーザ名
	  |   |             ├ mail          //メールアドレス
	  |   |             ├ status        //申請(承認)ステータス
	  |   |             ├ comment       //コメント
	  |   |             ├ count         //催促回数カウンタ
	  |   |             ├ nego          //根回し先 (ユーザコード(カンマ区切り))
	  |   |             ├ date          //進捗日付
	  |   |             |   ├ start        //進捗開始日付
	  |   |             |   ├ term         //進捗期限日付
	  |   |             |   └ end          //承認行為をした日付
	  |   |             └ block        //ブロックコード
	  |   ├ key[]        //承認種別アプリケーションより渡されたデータ
	  |   ├ code         //案件番号
	  |   ├ name         //案件名
	  |   ├ route        //ルートコード
	  |   ├ application  //承認種別コード
	  |   └ status       //結果ステータスコード
	  ├ before[]    //前ブロックコード配列(昇順)
	  ├ same[]      //同列ブロックコード配列(昇順)
	  ├ next[]      //次ブロックコード配列(昇順)
	  ├ program     //処理プログラム名
	  |
	  ├ approve()enforce()decision()sendback()isCondition()getCondition()getOperation()isConfig()isApprove()isUnsolved()isEndOfFlow()isApplicant()getApplicant()isAgency()getAgency()setAgency()getOther()sendMail()sendEndMail()sendNegoMail()


(*1)差し戻し、再申請などが行われる度にレコードが追加される。
ブロックコードについて

コーディング例: 通常処理  条件分岐
戻る





詳細

getOperation()






approve(sStatus)






enforce()






getCondition()






isCondition(sKeyword)






isAgency()






getAgency()






setAgency()






isConfig(sKeyWord)






isApprove()






isUnsolved()






isApplicant()






isEndOfFlow()






getApplicant()






decision(sStatus)






sendback()






getOther(sBlockID)






sendMail()






sendEndMail()






sendNegoMail()






ブロックコードについて


各ブロックには識別IDとしてブロックコードがつけられている。
ブロックコードは、ブロックの位置が右よりも左、下よりも上のほうに より若い番号が割り当てられている。

<イメージ>                ※ □・・・ブロック
□ □ □ □ □ □
□ □ □ □ □ □
□ □ □ □ □ □
というある範囲内の状態に対して、

1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18
という順番でブロックコードがふられている。
※実際のブロックコードは4桁の数字(0000?)になっている。





通常処理 通常処理サンプルコード(through01.js)

必要に応じて各行を変更可。
/*****************************************************************************/
/*        ワークフロー通常処理プログラム                                     */
/*****************************************************************************/
// 登録
Module.workflow.setProcess("through01", "通常処理サンプル", throughOfFlow, "through");
											//第四引数は変更不可

//=============================================================================
//    ワークフロー通常処理関数
//         【 入力 】oCurrent: 現在作業対象のブロックオブジェクト
//                   aBefore : 前ブロックオブジェクト群
//                   aNext   : 次ブロックオブジェクト群
//         【返却値】真値:正常終了
//                   偽値:エラー発生
//         【 作成 】1999/03/10 NTT DATA INTRAMART
//         【 更新 】
//         【 概要 】通常処理を行います。
//                   前ブロックオブジェクト群(aBefore)は、現在作業対象の
//                   ブロックと同列(同レベル)のブロックです。
//=============================================================================
function throughOfFlow(oCurrent, aBefore, aNext) {
	var oUser;
	var oBlock;

	// 通常処理を記述します。
	switch(oCurrent.getOperation()){
		case "ok":			// 承認処理
			if(! oCurrent.approve()){
				// エラーが発生
				return false;
			}
			// エラー無しの場合には、以下の処理を行う

			//====================================
			//例:固有な処理 1
			//====================================
			固有処理のコード1

		case "apply":		// 申請処理

			//====================================
			//例:固有な処理2
			//====================================
			固有処理のコード2

		case "retry":		// 再申請処理
			// 次の承認者の承認待ちスタート
			if(! aNext[0].enforce()){
				// エラー発生
				return false;
			}
			// 承認者の代理状況の確認
			if(! Procedure.workflow.chkAgency(aNext[0])){
				// エラー発生
				return false;
			}
			// メールの配信
			oCurrent.sendMail(aNext[0].user.mail, aNext[0].user.name);
			oCurrent.sendNegoMail();

			// 正常終了
			return true;

		case "ng":			// 否認処理
			// 進捗&最終結果ともに承認結果を設定
			if(! oCurrent.approve()){
				// エラー発生
				return false;
			}
			// フローの終了処理
			if(oCurrent.isEndOfFlow()){
				if(! oCurrent.decision(Module.old_classify.getCode("im_wf_st", "endofflow"))){
					// エラー発生
					return false;
				}
			}

			// メールの配信
			oUser = oCurrent.getApplicant();
			oCurrent.sendMail(oUser.user[0].mail, oUser.user[0].name);
			//根回しメール
			oCurrent.sendNegoMail();
			// 正常終了
			return true;

		case "sendback":	// 差し戻し処理
			// 差し戻し先インスタンスの取得
			oBlock = oCurrent.sendback();
			if(oBlock == false){
				// 差し戻し先が適切ではない
				return false;
			}
			// 差し戻し先のスタート
			if(! oBlock.enforce()){
				// エラー発生
				return false;
			}
			// 承認者の代理状況の確認
			if(! Procedure.workflow.chkAgency(oBlock)){
				// エラー発生
				return false;
			}

			// メールの配信
			oCurrent.sendMail(oBlock.user.mail, oBlock.user.name);
			oCurrent.sendNegoMail();
			return true;

		case "hold":	// 保留処理
			if(oCurrent.approve()){
				// 保留処理の成功
				return true;
			}
			else{
				// エラーが発生
				return false;
			}
	}

	return false;
}

/* End of File */




条件分岐 条件分岐サンプルコード(juncSmp01.js)

必要に応じて各行を変更可。
/*****************************************************************************/
/*        ワークフロー分岐処理プログラム                                     */
/*****************************************************************************/
// 登録
Module.workflow.setProcess("juncSmp01", "条件分岐for勤怠テストルート2", junctionOfFlow, "junction");
											//第四引数は変更不可

//=============================================================================
//    勤怠アプリケーション(kintai) のサンプル
//        ルート名:勤怠テストルート2(ルートコード:test002) 用 条件分岐処理
//         【 入力 】oCurrent: 現在作業対象のブロックオブジェクト
//                   aBefore : 前ブロックオブジェクト群
//                   aNext   : 次ブロックオブジェクト群
//         【返却値】真値:正常終了
//                   偽値:エラー発生
//         【 作成 】1999/03/10 NTT DATA INTRAMART
//         【 更新 】
//         【 概要 】分岐処理を行います。
//                   前ブロックオブジェクト群(aBefore)は、現在作業対象の
//                   ブロックと同列(同レベル)のブロックです。
//=============================================================================
function junctionOfFlow(oCurrent, aBefore, aNext) {
//Debug.browse("oCurrent",oCurrent,"aBefore",aBefore,"aNext",aNext);
//Debug.browse("aNext",aNext);
//Debug.browse("oCurrent",oCurrent.data);
//Debug.browse("aNext",aNext);
	var aMail, aName;
	var oUser;
	var oBlock;
	var strSql;
	var objDatas;
	var numWkTime;

	// 通常処理を記述します。
	switch(oCurrent.getOperation()){
		case "ok":			// 承認処理
			if(! oCurrent.approve()){
				// エラーが発生
				return false;
			}
			// エラー無しの場合には、以下の処理を行う

		case "apply":		// 申請処理
		case "retry":		// 再申請処理
			// 次の承認者の承認待ちスタート
			aMail = new Array();
			aName = new Array();

			//=========================================================
			//条件設定
			//    一月の実動時間が160時間を越えていたら上のルート
			//    一月の実動時間が160時間以内なら下のルート
			//=========================================================
				//oCurrent.data.key[0] == "ユーザコード";
				//oCurrent.data.key[1] == "申請年月(YYYY/MM)";
			var strSTDate  = oCurrent.data.key[1] + "/01|00:00:00";
			var strEDDate  = oCurrent.data.key[1] + "/31|23:59:59";
			// 勤怠時間の合計を取得
			strSql =  "SELECT ";
			strSql += " sum(wk_time) sum_wk_time";
			strSql += " FROM  t_stf_attend";
			strSql += " where user_cd = '" + oCurrent.data.key[0] + "'";
			strSql += "  and attend_date >= '" + strSTDate + "'";
			strSql += "  and attend_date <= '" + strEDDate + "'";
			objDatas = Module.database.select(strSql);
			numWkTime = parseFloat(objDatas.data[0].sum_wk_time);

			//申請処理
				
				//フロー図において、ブロック位置が下より上、
				//右より左の方がブロックコードが若い
				
			if(numWkTime > 160){
				if(! aNext[0].enforce()){
					// エラー発生
					return false;
				}
				// 承認者の代理状況の確認
				if(! Procedure.workflow.chkAgency(aNext[0])){
					// エラー発生
					return false;
				}
				// メール送信用データの作成
				aMail[0] = aNext[0].user.mail;
				aName[0] = aNext[0].user.name;
			}else{
				if(! aNext[1].enforce()){
					// エラー発生
					return false;
				}
				// 承認者の代理状況の確認
				if(! Procedure.workflow.chkAgency(aNext[1])){
					// エラー発生
					return false;
				}
				// メール送信用データの作成
				aMail[1] = aNext[1].user.mail;
				aName[1] = aNext[1].user.name;
			}
			//============
			//条件分岐終了
			//============

			// メールの配信
			oCurrent.sendMail(aMail.join(","), aName.join(","));
			oCurrent.sendNegoMail();

			// 正常終了
			return true;

		case "ng":			// 否認処理
			// 進捗&最終結果ともに承認結果を設定
			if(! oCurrent.approve()){
				// エラー発生
				return false;
			}
			// フローの終了処理
			if(oCurrent.isEndOfFlow()){
				if(! oCurrent.decision(Module.old_classify.getCode("im_wf_st", "endofflow"))){
					// エラー発生
					return false;
				}
			}

			// メールの配信
			oUser = oCurrent.getApplicant();
			oCurrent.sendMail(oUser.user[0].mail, oUser.user[0].name);
			//根回しメール
			oCurrent.sendNegoMail();
			// 正常終了
			return true;

		case "sendback":	// 差し戻し処理
			// 差し戻し先インスタンスの取得
			oBlock = oCurrent.sendback();
			if(oBlock == false){
				// 差し戻し先が適切ではない
				return false;
			}
			// 差し戻し先のスタート
			if(! oBlock.enforce()){
				// エラー発生
				return false;
			}
			// 承認者の代理状況の確認
			if(! Procedure.workflow.chkAgency(oBlock)){
				// エラー発生
				return false;
			}

			// メールの配信
			oCurrent.sendMail(oBlock.user.mail, oBlock.user.name);
			oCurrent.sendNegoMail();
			return true;

		case "hold":	// 保留処理
			if(oCurrent.approve()){
				// 保留処理の成功
				return true;
			}
			else{
				// エラーが発生
				return false;
			}
	}

	return false;
}

/* End of File */