/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JZMeck0041b011ReqChk
*	ソースファイル名：JZMeck0041b011ReqChk.java
*	作成者			：FJ
*	日付			：2011年12月23日
*＜機能概要＞
*	権限グループ_権限一覧照会SC実行判定クラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/23	FJ		新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.reqchk;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.bp.x21.bpm.common.AbstractCustomReqChk;
import com.fujitsu.futurity.bp.x21.bpm.common.IConditionValue;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.reqchk.exception.ReqChkException;

/**
 * 権限グループ_権限一覧照会SC実行判定クラスです。
 * @author FJ
 *
 */
public class JZMeck0041b011ReqChk extends AbstractCustomReqChk 
{
	
	/** 兼務判定マップ:ZMSV008902 */
	private static final String ZMSV008902 = "ZMSV008902";
	
	/** 兼務判定 要否：否 */
	private static final String KENMU_FUYOU = "0";

	/**
	 * 実行判定クラス。
	 * 兼務を判定し、兼務が無い場合のみ実行する。
	 * 兼務判定不要の場合も実行する。
     * <BR>
     * @param req_param リクエストパラメータ
     * @param conditionvalue 判定条件
	 * @return boolean 実行判定結果 true:実行 false:実行しない
	 * @throws ReqChkException 
	 */
	@Override
	public boolean checkExecution(IRequestParameterReadOnly req_param, IConditionValue conditionvalue) throws ReqChkException 
	{
		boolean blnRet = false;
		try
		{
			
			// 兼務判定マップ
			HashMap inMap = (HashMap)req_param.getData(ZMSV008902);
			if(inMap != null)
			{
				
				// 兼務判定 要・不要
				String key_kenmu_flg = (String)inMap.get("key_kenmu_flg");
				if(KENMU_FUYOU.equals(key_kenmu_flg))
				{
					blnRet = true;
				}
				else
				{
					
					// 兼務判定
					blnRet = !(isHoldTwoOffices(inMap));
				}
			}
		}
		catch (RequestParameterException e) 
		{
			throw new ReqChkException(e.getMessage(), e);
		}
		return blnRet;
	}
	
	/**
	 * 兼務があるか判定
	 * @param inMap マップ(ZMSV008902)
	 * @return true:兼務あり false:兼務なし
	 */
	private boolean isHoldTwoOffices(HashMap inMap)
	{
		boolean blnRet = false;
		
		// 実組織 所属 件数
		int orgCnt = 0;
		
		// 業務個別設定組織 所属 件数
		int wkgrpCnt = 0;
		
		ArrayList<HashMap<String, Object>> list = (ArrayList<HashMap<String, Object>>)inMap.get("EZM0011B012CBSMsg1List");
		
		for(int iCnt = 0; iCnt < list.size(); iCnt++)
		{
			HashMap childMap = list.get(iCnt);
			if(childMap == null)
			{
				continue;
			}
			
			// 実組織 組織コード
			String org_cd = (String)childMap.get("org_cd");
			if(org_cd != null && !"".equals(org_cd))
			{
				
				// 実組織 所属 件数 カウントアップ
				orgCnt++;
			}
			
			// 業務個別設定組織 組織コード
			String wkgrrp_cd = (String)childMap.get("wkkbt_org_cd");
			if(wkgrrp_cd != null && !"".equals(wkgrrp_cd))
			{
				
				// 業務個別設定組織 所属 件数
				wkgrpCnt++;
			}
			
			// 兼務判定
			if(orgCnt >= 2 || wkgrpCnt >= 2)
			{
				
				// 実組織もしくは業務個別設定組織のどちらかが2件以上有る場合、兼務と判定
				blnRet = true;
				break;
			}
		}
		
		return blnRet;
	}

}
