/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKEKK0081B011ReqChk
*	ソースファイル名：JKKEKK0081B011ReqChk.java
*	作成者			：富士通
*	日付			：2012年11月29日
*＜機能概要＞
*	同一利用場所サービス契約一覧照会サービスの実行判定部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/29	FJ)上松		新規作成
*	v4.01.00	2012/12/17	FJ)松田		【KAD-2012-0001108】書面での受付番号の申込イメージの紐付けについて
*	v5.00.00	2013/01/17	FJ)松田		【KAD-2012-0001108】書面での受付番号の申込イメージの紐付けについて
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.reqchk;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKCommonUtil;


/**
 * BPから呼び出すサービスIFの
 * 単項目チェック・単関連チェックを実施する。
 * <BR>
 * @author 富士通
 */
public class JKKEKK0081B011ReqChk extends AbstractCustomReqChk
{

	/** 作業マップ名 */
	private static final String PREVIOUS_CC_WORK = "JKKGetMskmSvcKeiUcwkListCCWork";
	
	/**
	 * 実行判定クラス。
     * <BR>
     * @param irp リクエストパラメータ
     * @param conditionvalue SCのマップキー("KKSV007905SC"、"KKSV008103SC"など)
	 * @return boolean
	 * @throws ReqChkException
	 */
	@SuppressWarnings("unchecked")
	public boolean checkExecution(IRequestParameterReadOnly irp, IConditionValue conditionvalue) throws ReqChkException
	{
		try
		{
			// SCマップから必要な情報を取り出す。
			HashMap<String, Object> scMap = (HashMap<String, Object>)irp.getData(conditionvalue.get("value"));
			if (JKKCommonUtil.isNull(scMap))
			{
				// マップが存在しなければ実行しない。
				return false;
			}
			
			String keySvcKeiNo = (String)scMap.get("key_svc_kei_no");
			if (!isWorkNetTelTvSvc(irp, keySvcKeiNo))
			{
				// 先行CCのワークエリアにネット・電話・テレビのマップが存在しなければ実行しない。
				return false;
			}
			
			// 上記の条件以外であれば実行する。
			return true;
		}
		catch (RequestParameterException ex)
		{
			;
		}
		
		return false;
	}
	
	/**
	 * ワークマップからネット、電話、テレビのサービス契約番号を取得します。
	 * @param param リクエストパラメータ
	 * @param targetSvcKeiNo サービス契約番号（指定された場合、一致するサービス契約のみを対象として処理する。<br>
	 * 指定されなかった場合、すべてのサービス契約を対象とする。
	 * @return true:ネット、電話、テレビのサービス契約が存在する。 false:ネット、電話、テレビのサービス契約が存在しない。
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean isWorkNetTelTvSvc(IRequestParameterReadOnly param, String targetSvcKeiNo) throws RequestParameterException
	{
		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			return false;
		}

		// 申込サービス契約内訳一覧照会ＣＣの作業領域のマップを取得
		HashMap mskmSvcKeiUcwkWorkMap = (HashMap)workMap.get(PREVIOUS_CC_WORK);
		if (mskmSvcKeiUcwkWorkMap == null)
		{
			return false;
		}

		// 申込明細明細リストを取得
		ArrayList<HashMap> mskmDtlList = (ArrayList<HashMap>)mskmSvcKeiUcwkWorkMap.get("mskm_dtl_list");
		if (mskmDtlList == null || mskmDtlList.size() < 1)
		{
			return false;
		}

		// 申込明細のサービス契約リストからサービス契約：ネット・電話・テレビを検索
		for (HashMap mskmDtlMap : mskmDtlList)
		{
			ArrayList<HashMap> svcKeiList = (ArrayList<HashMap>)mskmDtlMap.get("svc_kei_list");
			if (svcKeiList == null || svcKeiList.size() < 1)
			{
				return false;
			}
			for (HashMap svcKeiMap : svcKeiList)
			{
				if (JKKCommonUtil.isNull(targetSvcKeiNo))
				{
					if (JKKStrConst.CD00037_DSL_ZM.equals((String)svcKeiMap.get("svc_kei_stat")))
					{
						// 解約済のサービス契約は使用しない
						continue;
					}
				}
				
				String svcKeiNo = (String)svcKeiMap.get("svc_kei_no");
				if (!JKKCommonUtil.isNull(targetSvcKeiNo) && !targetSvcKeiNo.equals(svcKeiNo))
				{
					// サービス契約番号が指定された場合、一致するサービス契約のみを対象として処理する。
					// 指定されなかった場合、すべてのサービス契約を対象とする。
					continue;
				}
				
				String svcCd = (String)svcKeiMap.get("svc_cd");
				String prcGrpCd = (String)svcKeiMap.get("prc_grp_cd");
				// ネット・電話・テレビのサービス契約であればtrue
				boolean isTarget = (JKKStrConst.CD00133_02.equals(prcGrpCd)
						|| JKKStrConst.CD00133_03.equals(prcGrpCd)
						|| JKKStrConst.CD00133_04.equals(prcGrpCd)
						|| JKKStrConst.CD00130_02.equals(svcCd)
						|| JKKStrConst.CD00130_03.equals(svcCd));
				
				if (isTarget)
				{
					// サービス契約：ネット・電話・テレビあり
					return true;
				}
			}
		}
		// サービス契約：ネット・電話・テレビなし
		return false;
	}
	

}
