/*********************************************************************
*	All Right reserved,Copyright (c) Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*	システム名		：契約管理
*	モジュール名	：JKKSelectSeikyKeiNoCC
*	ソースファイル名：JKKSelectSeikyKeiNoCC.java
*	作成者			：富士通
*	日付			：2012年09月05日
*＜機能概要＞
*	請求契約番号取得の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/09/05	FJ）		新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;


/**
 * 請求契約番号取得を行います。<p>
 * <BR>
 * @author 富士通
 */
public class JKKSelectSeikyKeiNoCC extends AbstractCommonComponent
{
	/** 作業領域 */
	private static ThreadLocal<HashMap<String, Object>> ccMap = new ThreadLocal<HashMap<String,Object>>();
	
	/** マッパー */
// OM-2013-0002021対応 20130913 星野 MOD START
//	private static JKKSelectSeikyKeiNoCCMapper mapper = new JKKSelectSeikyKeiNoCCMapper();
	private static JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
// OM-2013-0002021対応 20130913 星野 MOD END
	
	/** 引継情報 */
	private class CCMAP {
// OM-2013-0002021対応 20130913 星野 DEL START
//		/** SYSID */
//		private static final String SYSID = "sysid";
// OM-2013-0002021対応 20130913 星野 DEL END
// OM-2013-0002021対応 20130913 星野 ADD START
		/** サービス契約番号 */
		private static final String SVC_KEI_NO = "svc_kei_no";
// OM-2013-0002021対応 20130913 星野 ADD END
		/** 請求契約番号 */
		private static final String SEIKY_KEI_NO = "seiky_kei_no";
	}

	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
// OM-2013-0004303対応 20131120 星野 ADD START
		try {
// OM-2013-0004303対応 20131120 星野 ADD END
			// 引継情報をローカルに取り込む
			if (!init(param, fixedText)) {
				return param;
			}
			
	// OM-2013-0002021対応 20130913 星野 MOD START
	//		//-------------------------------------------
	//		// 請求契約一覧照会（SYSID）
	//		//-------------------------------------------
	//		executeEKK0491B005(handle, param);
	//		
	//		//-------------------------------------------
	//		// 返却用の請求契約番号取得・設定
	//		//-------------------------------------------
	//		setResultEKK0491B005(param);
			
			//-------------------------------------------
			// 課金先一覧照会（請求契約番号/サービス契約番号）
			//-------------------------------------------
			ArrayList<HashMap<String, Object>> kk0321_b002_list = executeEKK0321B002(handle, param, fixedText);
			
			//-------------------------------------------
			// 返却用の請求契約番号取得・設定
			//-------------------------------------------
			setResultEKK0321B002(param, kk0321_b002_list);
			
	// OM-2013-0002021対応 20130913 星野 MOD END
			
			return param;
		
// OM-2013-0004303対応 20131120 星野 ADD START
		} finally {

			// ・セッションハンドル保持域
			if(ccMap.get() != null){
				ccMap.remove();
			}
		}

// OM-2013-0004303対応 20131120 星野 ADD END
	}
	
	
// OM-2013-0002021対応 20130913 星野 ADD START
	/**
	 * 課金先一覧照会（請求契約番号/サービス契約番号）サービスI/F実行
	 * 
	 * @param handle
	 * @param param
	 * @return
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> executeEKK0321B002(	SessionHandle handle,
										IRequestParameterReadWrite param,
										String fixedText) throws Throwable
	{
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		condMap.clear();
		// 引継データ.サービス契約番号 → ＫＥＹ＿サービス契約番号
		condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, (String) ccMap.get().get(CCMAP.SVC_KEI_NO) );
		reqMap = mapper.setEKK0321B002( param, fixedText, condMap );
		resMap = scCall.run( reqMap, handle );
		ArrayList<HashMap<String, Object>> kk0321_b002_list = mapper.getEKK0321B002( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		return kk0321_b002_list;
	}
	
	/**
	 * 返却用の請求契約番号取得・設定
	 * 
	 * @param param
	 * @throws RequestParameterException
	 */
	private void setResultEKK0321B002(IRequestParameterReadWrite param, ArrayList<HashMap<String, Object>> kk0321_b002_list) throws RequestParameterException
	{
		// 課金先一覧照会（請求契約番号/サービス契約番号）の結果でループを行う
		for (HashMap<String, Object> map : kk0321_b002_list)
		{
			// 請求契約番号をリクエストパラメータに設定
			ccMap.get().put(CCMAP.SEIKY_KEI_NO, map.get(EKK0321B002CBSMsg1List.SEIKY_KEI_NO));
			return;
		}
	}
// OM-2013-0002021対応 20130913 星野 ADD END
	
// OM-2013-0002021対応 20130913 星野 DEL START
//	/**
//	 * 返却用の請求契約番号取得・設定
//	 * 
//	 * @param param
//	 * @throws RequestParameterException
//	 */
//	private void setResultEKK0491B005(IRequestParameterReadWrite param) throws RequestParameterException
//	{
//		// 請求契約一覧照会（SYSID）の結果でループを行う
//		ArrayList<HashMap<String, Object>> list = getKK0491B005List(param);
//		for (HashMap<String, Object> map : list)
//		{
//			// 料金グループコードが以下のいづれかの請求契約番号を取得（S-I/Fで請求契約番号昇順で取得しているので最若となる）
//			String prcGrpCd = (String)map.get(EKK0491B005CBSMsg1List.PRC_GRP_CD);
//			if( JKKAdchgConstCC.CD00133_NET_HOME.equals( prcGrpCd )			// eo光ネットホームタイプ
//				|| JKKAdchgConstCC.CD00133_NET_MEZON.equals( prcGrpCd )		// eo光ネットメゾンタイプ
//				|| JKKAdchgConstCC.CD00133_NET_MANTION.equals( prcGrpCd )	// eo光ネットマンションタイプ
//				|| JKKAdchgConstCC.CD00133_TEL.equals( prcGrpCd )			// eo光電話
//				|| JKKAdchgConstCC.CD00133_TV_KCAT.equals( prcGrpCd )		// eo光テレビ（Ｋ−ＣＡＴ）
//				|| JKKAdchgConstCC.CD00133_TV_KCN.equals( prcGrpCd )		// eo光テレビ（ＫＣＮ）
//				|| JKKAdchgConstCC.CD00133_TV_RESND.equals( prcGrpCd ) )	// eo光テレビ（再送信）
//			{
//				// 請求契約番号をリクエストパラメータに設定
//				ccMap.get().put(CCMAP.SEIKY_KEI_NO, map.get(EKK0491B005CBSMsg1List.SEIKY_KEI_NO));
//				return;
//			}
//		}
//	}
//	
//	/**
//	 * 請求契約一覧照会（SYSID）サービスI/F実行
//	 * 
//	 * @param handle
//	 * @param param
//	 * @return
//	 * @throws Throwable 
//	 */
//	private void executeEKK0491B005(	SessionHandle handle,
//										IRequestParameterReadWrite param) throws Throwable
//	{
//		HashMap<String, Object> inMap = new HashMap<String, Object>();
//		param.setData(JKKSelectSeikyKeiNoCCMapper.TEMPLATE_ID_EKK0491B005, inMap);
//		
//		// 機能コード（固定：1）
//		inMap.put(EKK0491B005CBSMsg.FUNC_CODE, "1");
//		// 引継データ.ＳＹＳＩＤ → ＫＥＹ＿ＳＹＳＩＤ
//		inMap.put(EKK0491B005CBSMsg.KEY_SYSID, ccMap.get().get(CCMAP.SYSID));
//		
//		/* ◇上りマッピング処理 */
//		HashMap<String, Object> paramMap = mapper.editInMsgEKK0491B005(param);
//		/* ◇ＳＣ呼出実行 */
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		Map<?, ?> result = scCall.run(paramMap, handle);
//		/* ◇下りマッピング処理 */
//		param = mapper.editResultRPEKK0491B005(result, param);
//		checkExecutionResult(result);
//		
//		return;
//	}
//	
//	
//	/**
//	 * 呼び出したサービスIFの処理結果を判定します。
//	 * 
//	 * @param result
//	 * @throws Throwable
//	 */
//	private void checkExecutionResult(Map<?, ?> result) throws Throwable
//	{
//		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
//		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
//		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
//		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
//		
//		// 異常の場合、SCCallExceptionを生成してスローする
//		if (!("0".equals(rtnCode) && 0 == status.intValue()))
//		{
//			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
//			throw scCallEx;
//		}
//	}
//	
//	/**
//	 * 請求契約一覧照会（SYSID）の結果取得
//	 * 
//	 * @param param
//	 * @return
//	 * @throws RequestParameterException
//	 */
//	@SuppressWarnings("unchecked")
//	private ArrayList<HashMap<String, Object>> getKK0491B005List(IRequestParameterReadOnly param) throws RequestParameterException
//	{
//		// 請求契約一覧照会（SYSID）の結果取得
//		HashMap<String, Object> eKK0491B005Map = (HashMap<String, Object>)param.getData(JKKSelectSeikyKeiNoCCMapper.TEMPLATE_ID_EKK0491B005);
//		return (ArrayList<HashMap<String, Object>>)eKK0491B005Map.get(EKK0491B005CBSMsg.EKK0491B005CBSMSG1LIST);
//	}
// OM-2013-0002021対応 20130913 星野 DEL END
	
	/**
	 * マップデータをローカル領域に保存
	 * 
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private boolean init(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		if (inMap == null) {
			return false;
		}
		ccMap.set(inMap);
		return true;
	}
	
	/**
	 * 請求契約番号取得チェック処理.
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[0]);
		return paramMap;
	}

	
	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * 
	 * @param param モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param templates CAANMsgクラス配列
	 * @param returnCode リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, Integer returnCode) throws Throwable
	{
		return param;
	}

}
