/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKSmtvlYoSanshoFukaInfCC
*	ソースファイル名：JKKSmtvlYoSanshoFukaInfCC.java
*	作成者			：富士通
*	日付			：2012年10月08日
*＜機能概要＞
*	スマートバリュー用参照_付加サービス情報CC
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/10/08	FJ)強矢		新規作成 【ANK-0534-00-00】WDAスマートバリュー対応
*	v13.00.00	2015/03/10	FJ)川島		【OM-2015-0000216】代表電話番号を電話番号に変更
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
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.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0241B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2141B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2141B001CBSMsg1List;


/**
 * スマートバリュー用参照の付加サービス情報の取得を行う部品。
 * 
 * @author 富士通
 *
 */
public class JKKSmtvlYoSanshoFukaInfCC extends AbstractCommonComponent
{

	/** テンプレートID(EKK0081A010) */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	
	/** テンプレートID(EKK0241B003) */
	private static final String TEMPLATE_ID_EKK0241B003 = "EKK0241B003";
	
	/** テンプレートID(EKK0241B002) */
	private static final String TEMPLATE_ID_EKK0241B002 = "EKK0241B002";
	
	/** テンプレートID(EKK0161B004) */
	private static final String TEMPLATE_ID_EKK0161B004 = "EKK0161B004";
	
	/** テンプレートID(EKK2141B001) */
	private static final String TEMPLATE_ID_EKK2141B001 = "EKK2141B001";
	
	/** テンプレートID(EKK0191A010) */
	private static final String TEMPLATE_ID_EKK0191A010 = "EKK0191A010";
	
	/** サービスID */
	private static final String SERVICE_ID = "KKSV065102CC";
	
	
	/**
	 * スマートバリュー用参照の付加サービス情報の取得を行う。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getSmtvlYoSanshoFukaInf(SessionHandle handle, 
																IRequestParameterReadWrite param, 
																String fixedText) throws Exception
	{
		HashMap<String, Object> work02Map = new HashMap<String, Object>();
		param.setData("KKSV0651WORK02", work02Map);
		
		// ◇ SC呼出実行
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// 電話のサービス契約番号を取得する
		String svc_kei_no = getSvcKeiNoToTelSvc(handle, param, scCall);
		
		// 電話のサービス契約が存在しなかった場合
		if (svc_kei_no == null)
		{
			work02Map.put("return_result_cd", "000000");
			return param;
		}
		
		ArrayList<CAANMsg> svcKeiUcwkList = new ArrayList<CAANMsg>();
		
		// ***** EKK0161B004(サービス契約内訳一覧照会) の実行 *****
		Object[][] ekk0161b004IN = {
				// 電話のサービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0161B004CBSMsg.KEY_SVC_KEI_NO, svc_kei_no},
				// "" => ＫＥＹ＿料金コースコード
				{EKK0161B004CBSMsg.KEY_PCRS_CD, ""},
				// "" => ＫＥＹ＿サービス期間中フラグ
				{EKK0161B004CBSMsg.KEY_SVC_PRD_FLG, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0161b004Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0161B004, "1", ekk0161b004IN);
		
		// 処理結果
		CAANMsg[] ekk0161b004MsgList = ekk0161b004Msg.getCAANMsgList(EKK0161B004CBSMsg.EKK0161B004CBSMSG1LIST);
		
		for (int i = 0; i < ekk0161b004MsgList.length; i++)
		{
			// 対象データは、以下の条件をすべて満たすもの。
			// ・サービス契約内訳.サービス契約内訳ステータスが、
			//   "010"（受付済）または "020"（照査済）または "030"（締結済）または "100"（サービス提供中）または
			//   ("210"（休止・中断中）で、かつ、休止中断コードが"02"（中断中)）であること
			
			String svc_kei_ucwk_stat = ekk0161b004MsgList[i].getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT);
			String pause_stp_cd = ekk0161b004MsgList[i].getString(EKK0161B004CBSMsg1List.PAUSE_STP_CD);
			
			ArrayList<String> conditionList = new ArrayList<String>();
			conditionList.add("010");
			conditionList.add("020");
			conditionList.add("030");
			conditionList.add("100");
			
			if (conditionList.contains(svc_kei_ucwk_stat) || ("210".equals(svc_kei_ucwk_stat) && "02".equals(pause_stp_cd)))
			{
				svcKeiUcwkList.add(ekk0161b004MsgList[i]);
			}
		}
		
		// 対象データ件数が２件を超えた場合
		if (2 < svcKeiUcwkList.size())
		{
			work02Map.put("return_result_cd", "008002");
			return param;
		}
		
		for (int i = 0; i < svcKeiUcwkList.size(); i++)
		{
			// ***** EKK2141B001(旧ICSコード変換一覧照会) の実行 *****
			Object[][] ekk2141b001IN = {
					// "02"（AxM） => ＫＥＹ＿連携先システム識別コード
					{EKK2141B001CBSMsg.KEY_RNK_SAKI_SYS_SKBT_CD, "02"},
					// "01"（サービス契約ステータス）=> ＫＥＹ＿旧ICSコード変換種別コード
					{EKK2141B001CBSMsg.KEY_OLD_ICS_CD_CHG_SBT_CD, "01"},
					// EKK0161B004.サービス契約内訳ステータス => ＫＥＹ＿サービス契約ステータス
					{EKK2141B001CBSMsg.KEY_SVC_KEI_STAT, svcKeiUcwkList.get(i).getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT)}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk2141b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK2141B001, "1", ekk2141b001IN);
			
			// 処理結果
			CAANMsg[] ekk2141b001MsgList = ekk2141b001Msg.getCAANMsgList(EKK2141B001CBSMsg.EKK2141B001CBSMSG1LIST);
			
			
			// ***** EKK0191A010(サービス契約内訳＜eo光電話＞一意照会) の実行 *****
			Object[][] ekk0191a010IN = {
					// EKK0161B004.サービス契約内訳番号 => ＫＥＹ＿サービス契約内訳番号
					{EKK0191A010CBSMsg.KEY_SVC_KEI_UCWK_NO, svcKeiUcwkList.get(i).getString(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO)},
					// EKK0161B004.世代登録年月日時分秒 => ＫＥＹ＿世代登録年月日時分秒
					{EKK0191A010CBSMsg.KEY_GENE_ADD_DTM, svcKeiUcwkList.get(i).getString(EKK0161B004CBSMsg1List.GENE_ADD_DTM)}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0191a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0191A010, "1", ekk0191a010IN);
			
			// 処理結果
			CAANMsg[] ekk0191a010MsgList = ekk0191a010Msg.getCAANMsgList(EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST);
			
			
			// *** 下りデータの作成 ***
			HashMap<String, Object> keiInfMap = new HashMap<String, Object>();
			
			if (ekk0191a010MsgList != null && 0 < ekk0191a010MsgList.length)
			{
				// 代表電話番号
// OM-2015-0000216 MOD START
//				keiInfMap.put("dihyo_dnw_bngu", ekk0191a010MsgList[0].getString(EKK0191A010CBSMsg1List.DAIHYO_TELNO));
				keiInfMap.put("dihyo_dnw_bngu", ekk0191a010MsgList[0].getString(EKK0191A010CBSMsg1List.TELNO));
// OM-2015-0000216 MOD END
			}
			if (ekk2141b001MsgList != null && 0 < ekk2141b001MsgList.length)
			{
				// 契約状態
				keiInfMap.put("kiyk_joti", ekk2141b001MsgList[0].getString(EKK2141B001CBSMsg1List.OLD_ICS_KEI_STAT_CD));
			}
			// 照査日
			keiInfMap.put("shous_b", svcKeiUcwkList.get(i).getString(EKK0161B004CBSMsg1List.SHOSA_YMD));
			
			// 付加サービス情報リスト
			if (!ccMsg.containsKey("fuka_inf_list"))
			{
				ccMsg.put("fuka_inf_list", new ArrayList<HashMap<String, Object>>());
			}
			((ArrayList<HashMap<String, Object>>)ccMsg.get("fuka_inf_list")).add(keiInfMap);
		}
		
		work02Map.put("return_result_cd", "000000");
		
		return param;
	}
	
	/**
	 * 電話のサービス契約番号を取得する
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @return 
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private String getSvcKeiNoToTelSvc(SessionHandle handle, 
										IRequestParameterReadWrite param, 
										ServiceComponentRequestInvoker scCall) throws Exception
	{
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// ***** EKK0081A010(サービス契約一意照会) の実行 *****
		Object[][] ekk0081a010IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
				// "" => ＫＥＹ＿世代登録年月日時分秒
				{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
				// 運用日 => ＫＥＹ＿予約適用年月日
				{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0081a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
		
		// 処理結果
		CAANMsg[] ekk0081a010MsgList = ekk0081a010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
		// サービス契約一意照会の検索結果が無い場合
		if (ekk0081a010MsgList == null || ekk0081a010MsgList.length == 0)
		{
			return null;
		}
		else
		{
			String prc_grp_cd = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.PRC_GRP_CD);
			
			// 料金グループコードが "10"(ｅｏ光電話)の場合
			if ("10".equals(prc_grp_cd))
			{
				// 電話のサービス契約番号
				return ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_NO);
			}
			// 料金グループコードが "02"(ｅｏ光ネットホームタイプ), "03"(ｅｏ光ネットメゾンタイプ), "04"(ｅｏ光ネットマンションタイプ)以外の場合
			// 対象データとしない。
			else if (!("02".equals(prc_grp_cd) || "03".equals(prc_grp_cd) || "04".equals(prc_grp_cd)))
			{
				return null;
			}
		}
		
		// ***** EKK0241B003(回線対象サービス契約一覧照会（サービス契約番号）) の実行 *****
		Object[][] ekk0241b003IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0241B003CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0241b003Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0241B003, "1", ekk0241b003IN);
		
		// 処理結果
		CAANMsg[] ekk0241b003MsgList = ekk0241b003Msg.getCAANMsgList(EKK0241B003CBSMsg.EKK0241B003CBSMSG1LIST);
		
		// 回線対象サービス契約テーブルにサービス契約番号で紐づくデータが存在する場合
		if (ekk0241b003MsgList != null && 0 < ekk0241b003MsgList.length)
		{
			String svc_kei_kaisen_ucwk_no = ekk0241b003MsgList[0].getString(EKK0241B003CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO);
			
			// ***** EKK0241B002(回線対象サービス契約一覧照会) の実行 *****
			Object[][] eck0241b002IN = {
					// EKK0241B003.サービス契約回線内訳番号 => ＫＥＹ＿サービス契約回線内訳番号
					{EKK0241B002CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svc_kei_kaisen_ucwk_no}
			};
			
			// ◇ SC呼出実行
			CAANMsg eck0241b002Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0241B002, "1", eck0241b002IN);
			
			// 処理結果
			CAANMsg[] eck0241b002MsgList = eck0241b002Msg.getCAANMsgList(EKK0241B002CBSMsg.EKK0241B002CBSMSG1LIST);
			
			// ※ 回線対象サービス契約テーブルにサービス契約番号で紐づくレコードのサービス契約回線内訳番号での
			//    回線対象サービス契約テーブル検索であるため、必ずデータが存在する
			
			for (int i = 0; i < eck0241b002MsgList.length; i++)
			{
				// ***** EKK0081A010(サービス契約一意照会) の実行 *****
				Object[][] ekk0081a010IN_2 = {
						// EKK0241B002.サービス契約番号 => ＫＥＹ＿サービス契約番号
						{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, eck0241b002MsgList[i].getString(EKK0241B002CBSMsg1List.SVC_KEI_NO)},
						// "" => ＫＥＹ＿世代登録年月日時分秒
						{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
						// 運用日 => ＫＥＹ＿予約適用年月日
						{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
				};
				
				// ◇ SC呼出実行
				CAANMsg ekk0081a010Msg_2 = callSC(handle, param, scCall, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN_2);
				
				// 処理結果
				CAANMsg[] ekk0081a010MsgList_2 = ekk0081a010Msg_2.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
				
				// ※ EKK0241B002_回線対象サービス契約一覧照会で取得したサービス契約番号での
				//    サービス契約テーブル検索であるため、必ずデータが存在する
				String prc_grp_cd = ekk0081a010MsgList_2[0].getString(EKK0081A010CBSMsg1List.PRC_GRP_CD);
				
				// 料金グループコードが "10"(ｅｏ光電話)の場合
				if ("10".equals(prc_grp_cd))
				{
					// 電話のサービス契約番号
					return ekk0081a010MsgList_2[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_NO);
				}
			}
		}
		
		return null;
	}
	
	/**
	 * チェック処理用のサービスインターフェイスを作成し、返却する。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return HashMap<String, Object> サービスインターフェイスマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, 
												IRequestParameterReadWrite param, 
												String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// *** EKK0081A010(サービス契約一意照会) の実行 ***
		Object[][] ekk0081a010IN = {
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿世代登録年月日時分秒
			{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
		};
		
		// ◇ SC呼出実行
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
		
		return paramMap;
	}
	
	/**
	 * SC呼出
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param svcIfId
	 * @param funcCode
	 * @param svcIfMapData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							IRequestParameterReadWrite param, 
							ServiceComponentRequestInvoker scCall,
							String svcIfId,
							String funcCode,
							Object[][] svcIfMapData) throws Exception
	{
		
		// ◇ 上りマッピング処理
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, svcIfId, funcCode, svcIfMapData);
		
		// SC呼出実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果の判定
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の転記
		editErrorInfo(param, templates, (Integer)result.get(JCMConstants.RET_CD_INT_KEY));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		int status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status))
		{
			throw new SCCallException("戻り値不正", rtnCode, status);
		}
		
		return ((CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
	}
	
	/**
	 * 上りマッピング処理
	 * @param param
	 * @param svcIfId
	 * @param funcCode
	 * @param mapData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, 
												String svcIfId, 
												String funcCode,
												Object[][] mapData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		CAANMsg template = new CAANMsg("eo.ejb.cbs.cbsmsg." + svcIfId + "CBSMsg");
		
		// テンプレートID
		template.set(JCMConstants.TEMPLATE_ID_KEY, svcIfId);
		
		// 機能コード
		template.set(JCMConstants.FUNC_CODE_KEY, funcCode);
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		for (int i = 0; i < mapData.length; i++)
		{
			Object[] mapVal = mapData[i];
			if ("".equals(mapVal[1]))
			{
				template.setNull((String)mapVal[0]);
			}
			else
			{
				template.set((String)mapVal[0], (String)mapVal[1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param templates サービスインターフェイスリスト
	 * @param returnCode リターンコード	
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, 
													CAANMsg[] templates,
													int returnCode) throws RequestParameterException
	{
		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg template = templates[i];
			int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
			if (returnCode != 0)
			{
				templateStatus = 9000;
			}
			if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
			{
				templateStatus = 0;
			}
			
			int bpStatus = 0;
			Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if (obj == null)
			{
				bpStatus = -1;
			}
			else
			{
				bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
			}
			
			if (templateStatus > bpStatus)
			{
				// BPにサービスコンポーネントのステータスを設定する。
				String formatStatus = String.format("%1$04d", templateStatus);
				String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}
			
			HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SERVICE_ID);
			
			HashMap<?, ?> mp = template.getHashMap();
			
			Iterator it = mp.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				if (key.endsWith("_err"))
				{
					int keyIdx = key.lastIndexOf("_err");
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, mp.get(key));
					}
				}
			}
		}
		
		return param;
	}
}
