/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKSpMskmViewCtrlBaseCC
*   ソースファイル名：JKKSpMskmViewCtrlBaseCC.java
*   作成者          ：富士通
*   日付            ：2017年04月17日
*＜機能概要＞
*   セキュリティパック申込表示制御(共通)CC
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v32.00.00   2017/04/17   FJ）池原    【ANK-3149-00-00】新セキュリティパック導入 新規作成
*	v61.00.00   2022/01/31   FJ) 永江    【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
*   v65.00.00	2023/02/16	 FJ)小竹	【ANK-4346-00-00】【eo定期】CCMG再構築対応
*   v65.00.00	2024/02/06	 FJ)福島	【ANK-4346-00-00】【eo定期】CCMG再構築対応
*	v70.00.00	2024/03/04	FJ)吉田		【#84105】SIFエラーがＣＣＭＧエラーとして表示される
*	v70.00.00	2024/03/21	FJ)藤本涼	【#84336】ファミリー会員のウイルスバスター契約カウント不備
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.CCException;
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 com.fujitsu.futurity.model.ejb.common.StatusCodes;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JCNStrConst;
import eo.common.util.JCNStringUtil;
import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0451B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B003CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0021B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021B001CBSMsgList;
import eo.ejb.cbs.cbsmsg.EKK0341B019CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B019CBSMsg1List; 
import eo.ejb.cbs.cbsmsg.EKK2811B504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B504CBSMsg1List;

/**
 * セキュリティパック申込表示制御(共通)CC.
 * <br>
 * @author 富士通
 */
public class JKKSpMskmViewCtrlBaseCC extends AbstractCommonComponent
{
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー用 */
	protected static final String SC_ERROR_STRING = "サービスコンポーネントエラー";
	/** コンテンツ契約終了年月日時分秒 日付最大値文字列 */
	protected static final String CONT_KEI_END_DTM_MAX_DATE = JCNStrConst.S_MAX_DATE + JCNStrConst.S_MAX_MMDDSS;
	/** 文字列：半角カンマ */
	private static final String STR_HALF_COMMA = ",";
	/** 文字列：半角シングルクォーテーションマーク */
	private static final String STR_HALF_SINGLE_QUOTATION = "'";
	
	/** 機器提供サービス契約番号 */
	protected String ekk0341b019KktkSvcKeiNo = "";
	/** 料金コースコード */
	protected String ekk2811b504PcrsCd = "";
	
	/** ファミリー会員のSYSIDリスト */
	protected ArrayList<String> sysidList = null;
	
//ANK-4346-00-00 ADD START
	/**  コンテンツサービスID */
	public static final String SERVICE_ID = "service_id";
	/** 契約フラグ */
	private static final String CONTRACT_FLG = "contract_flg";
	/**  契約中 */
	public static final String KEIYAKUCHU = "1";
	/**  コンテンツ区分 : "1"（コンテンツ） */
	public static final String DIVISION_1 = "1";
	/**  要否フラグ : "0"（不要） */
	public static final String INFO_YOHI_0 = "0";
	/**  要否フラグ : "1"（要） */
	public static final String INFO_YOHI_1 = "1";

//ANK-4346-00-00 ADD END
	/**
	 * 表示制御取得（共通）を行います。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	protected IRequestParameterReadWrite getViewCtrlBase(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		if (inMap == null)
		{
			return param;
		}

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		Map<?, ?> result = null;
		CAANMsg template = null;
		
		Map<String, Object> outputMap = new HashMap<String, Object>();
		
		// 割引サービス契約一覧照会（割引サービス指定）
		template = editInEKK0451B010(param, fixedText); // 上りマッピング
		result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
		editRetEKK0451B010(result, param, fixedText, outputMap); // 下りマッピング
		if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
		{ // ステータスが単項目エラー以上であれば例外をスロー
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		// 割引サービス契約一覧照会（割引サービス指定）明細の件数が０件の場合
		if ((Integer)outputMap.get("templateArrayLength") == 0)
		{
			// ファミリーパック表示パターンに表示なしを設定
			inMap.put("fpViewPtn", JKKStrConst.FAMILY_PACK_VIEW_PTN_NASI);
		}
		else
		{
			// ファミリーパック表示パターンに表示ありを設定
			inMap.put("fpViewPtn", JKKStrConst.FAMILY_PACK_VIEW_PTN_ARI);
		}
		
		ArrayList<String> ekk0081a010OutputList = new ArrayList<String>();
		
		// サービス契約一意照会
		template = editInEKK0081A010(param, fixedText); // 上りマッピング
		result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
		editRetEKK0081A010(result, param, fixedText, ekk0081a010OutputList); // 下りマッピング
		if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
		{ // ステータスが単項目エラー以上であれば例外をスロー
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		sysidList = new ArrayList<String>();
		
		if (ekk0081a010OutputList.size() > 0)
		{
			// 家族会員情報一覧照会
			template = editInECK0011B003(param, fixedText, ekk0081a010OutputList); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetECK0011B003(result, param, fixedText, sysidList); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
//ANK-4346-00-00 MOD START
//		ArrayList<HashMap<String, Object>> ecn0021b001OutputList = new ArrayList<HashMap<String, Object>>();
//		
//		if (sysidList.size() > 0)
//		{
//			// コンテンツ契約一覧照会
//			template = editInECN0021B001(param, fixedText, sysidList); // 上りマッピング
//			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
//			editRetECN0021B001(result, param, fixedText, ecn0021b001OutputList); // 下りマッピング
//			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
//			{ // ステータスが単項目エラー以上であれば例外をスロー
//				throw new CCException(SC_ERROR_STRING, new Exception());
//			}
//		}
//		
//		// ウイルスバスター表示パターンの設定を行う
//		
//		// ウイルスバスター件数
//		int vbCnt = 0;
//		
//		for (int i = 0; i < ecn0021b001OutputList.size(); i++)
//		{
//			HashMap<String, Object> childMap = (HashMap<String, Object>) ecn0021b001OutputList.get(i);
//			
//			// コンテンツサービスコードがウイルスバスター以外の場合
//			if (!JKKStrConst.CONT_SVC_CD_VIRUSBUSTER.equals((String)childMap.get(ECN0021B001CBSMsgList.CONT_SVC_CD)))
//			{
//				continue;
//			}
//			// コンテンツ種別コードがコンテンツ以外の場合
//			if (!JKKStrConst.CONT_SBT_CD_CONT.equals((String)childMap.get(ECN0021B001CBSMsgList.CONT_SBT_CD)))
//
//			{
//				continue;
//			}
//			// コンテンツ契約終了年月日時分秒が日付最大値文字列以外の場合
//			if (!CONT_KEI_END_DTM_MAX_DATE.equals((String)childMap.get(ECN0021B001CBSMsgList.CONT_KEI_END_DTM)))
//			{
//				continue;
//			}
//			
//			// ウイルスバスター件数を＋１する
//			vbCnt++;
//		}
		// ウイルスバスター件数
		int vbCnt = 0;

		if (sysidList.size() > 0)
		{

			try
			{
				// ＃84290 DEL START
//				List<HashMap<String, Object>> inContDetailList = new ArrayList<HashMap<String, Object>>();
				// ＃84290 DEL END

				// コンテンツ契約一覧照会
				JCNContKeiListInfoCC contkeiInfo = new JCNContKeiListInfoCC();
				for (int i = 0; i < sysidList.size(); i++)
				{
					// ＃84290 ADD START
					List<HashMap<String, Object>> inContDetailList = new ArrayList<HashMap<String, Object>>();
					// ＃84290 ADD END
					
					HashMap<String, Object> inParam = new HashMap();
					inParam.put("func_code",						 		"8");
					inParam.put("sysid",  									sysidList.get(i));						// SYSID
					inParam.put("cont_svc_cd", 								JKKStrConst.CONT_SVC_CD_VIRUSBUSTER);	// コンテンツサービスID
					inParam.put("cont_sbt_cd", 								DIVISION_1);							// コンテンツ区分
					inParam.put("return_contract",							INFO_YOHI_1);							// コンテンツ契約情報要否
					inParam.put("return_charge", 							INFO_YOHI_0);							// 直近課金情報要否
					inParam.put("return_contract_adds", 					INFO_YOHI_0);							// 契約付加情報要否
					param.setData("JCNContKeiListInfoCC", inParam);
					inMap.put("status", "");
					
					// コンテンツ契約一覧照会CC呼び出し
					IRequestParameterReadWrite eca0170001result = contkeiInfo.execute(handle, param, "JCNContKeiListInfoCC");
					// コンテンツ契約一覧CCの結果を取得
					HashMap<String, Object> ccMsg = (HashMap<String, Object>)eca0170001result.getData("JCNContKeiListInfoCC");
					// 処理結果判定
					if(ccMsg.get("return_code") != null && !"".equals(ccMsg.get("return_code")))
					{
						// エラーコードを取得
						Integer errCode = Integer.parseInt(ccMsg.get("return_code").toString());
						// 返却パラメータを設定
						inMap.put("return_code", ccMsg.get("return_code").toString());
						// 返却パラメータ(フロント用)を設定
						inMap.put("fu_cnife047_return_code", ccMsg.get("return_code").toString());
						// 処理結果が正常以外の場合
						if (errCode != 0)
						{ 
							// #84105 ADD START
							inMap.put("CCMG_ERR_FLG", "1");
							inMap.put("CCMG_ERR_MSG", "契約一覧情報取得");
							// #84105 ADD END
							
							// ステータスが単項目エラー以上であれば例外をスロー
							throw new CCException(SC_ERROR_STRING, new Exception());
						}
					}
					// リターンコードがない場合
					else
					{
						// 返却パラメータを設定し、例外をスロー
						inMap.put("return_code", "");
						inMap.put("status", Integer.toString(StatusCodes.RELATION_ERR));
						// #84105 ADD START
						inMap.put("CCMG_ERR_FLG", "1");
						inMap.put("CCMG_ERR_MSG", "契約一覧情報取得");
						// #84105 ADD END
						throw new CCException(SC_ERROR_STRING, new Exception());
					}

					// 下りマッピング
					// レスポンス
					editJCNContKeiListInfoCC(inContDetailList, inParam);
					
					// ウイルスバスターかつ契約中の件数をカウントする
					for(HashMap<String, Object> resultMap : inContDetailList)
					{
						// ウイルスバスター件数を＋１する
						vbCnt++;
					}
				}
			}
			catch (Throwable e)
			{
				new Throwable(e);
				return param;
			}
		}
//ANK-4346-00-00 MOD END
		
		// 件数が０件の場合
		if (vbCnt == 0)
		{
			// ウイルスバスター表示パターンに表示なしを設定
			inMap.put("vbViewPtn", JKKStrConst.VIRUSBUSTER_VIEW_PTN_NASI);
		}
		else if (vbCnt == 1)
		{
			// ウイルスバスター表示パターンに単独契約を設定
			inMap.put("vbViewPtn", JKKStrConst.VIRUSBUSTER_VIEW_PTN_TAN);
		}
		else
		{
			// ウイルスバスター表示パターンに複数契約を設定
			inMap.put("vbViewPtn", JKKStrConst.VIRUSBUSTER_VIEW_PTN_FUKU);
		}
		
		ArrayList<HashMap<String, Object>> ekk0341b019OutputList = new ArrayList<HashMap<String, Object>>();
		
		// 機器提供サービス契約一覧照会(サービス契約番号、回線対象サービス契約経由)
		template = editInEKK0341B019(param, fixedText); // 上りマッピング
		result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
		editRetEKK0341B019(result, param, fixedText ,ekk0341b019OutputList); // 下りマッピング
		if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
		{ // ステータスが単項目エラー以上であれば例外をスロー
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		// 多機能ルーターを特定する
		for (int i = 0; i < ekk0341b019OutputList.size(); i++)
		{
			HashMap<String, Object> childMap = (HashMap<String, Object>) ekk0341b019OutputList.get(i);
			
			// 宅内機器種別コードが多機能ルーター、またはＨＧＷ以外の場合
// ANK-4315-00-00 MOD START
//			if (!JKKStrConst.TAKNKIKI_SBT_CD_TAKINORT.equals((String)childMap.get(EKK0341B019CBSMsg1List.TAKNKIKI_SBT_CD)))
			if (!JKKStrConst.TAKNKIKI_SBT_CD_TAKINORT.equals((String)childMap.get(EKK0341B019CBSMsg1List.TAKNKIKI_SBT_CD)) && 
					!JKKStrConst.TAKNKIKI_SBT_CD_HGW.equals((String)childMap.get(EKK0341B019CBSMsg1List.TAKNKIKI_SBT_CD)))
// ANK-4315-00-00 MOD END
			{
				continue;
			}
			// 機器提供サービス契約番号を保持する
			ekk0341b019KktkSvcKeiNo = (String)childMap.get(EKK0341B019CBSMsg1List.KKTK_SVC_KEI_NO);
			break;
		}
		
		ArrayList<HashMap<String, Object>> ekk2811b504OutputList = new ArrayList<HashMap<String, Object>>();

		// 機器提供サービス契約番号が存在する場合
		if (!JKKCommonUtil.isNull(ekk0341b019KktkSvcKeiNo))
		{
			// 機器オプションサービス契約一覧照会（複合検索）
			template = editInEKK2811B504(param, fixedText); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetEKK2811B504(result, param, fixedText, ekk2811b504OutputList); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
		// ルーター機能を特定する
		for (int i = 0; i < ekk2811b504OutputList.size(); i++)
		{
			HashMap<String, Object> childMap = (HashMap<String, Object>) ekk2811b504OutputList.get(i);
			
			// 機器オプションサービスコードがルーター機能以外の場合
			if (!JKKStrConst.KKOP_SVC_CD_ROUTER.equals((String)childMap.get(EKK2811B504CBSMsg1List.KKOP_SVC_CD)))
			{
				continue;
			}
			
			// 機器オプションサービス契約ステータスが解約済以上の場合
			if (JKKStrConst.CD01616_STAT_DSLZUMI.compareTo((String)childMap.get(EKK2811B504CBSMsg1List.KKOP_SVC_KEI_STAT)) <= 0)
			{
				continue;
			}
			// 料金コースコードを保持する
			ekk2811b504PcrsCd = (String)childMap.get(EKK2811B504CBSMsg1List.PCRS_CD);
			break;
		}
		
		return param;
	}

	/**
	 * SCインプット共通データ設定処理を行います。
	 * <br>
	 * @param param
	 * @param paramMap
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	protected HashMap<String, Object> setSCInputCommonData(IRequestParameterReadWrite param, HashMap<String, Object> paramMap)
			throws RequestParameterException
	{
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		return paramMap;
	}

	/**
	 * 単一CAANMsgのマッピング処理を行います。
	 * <br>
	 * @param paramMap
	 * @param template
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	protected HashMap<String, Object> putParamMap(HashMap<String, Object> paramMap, CAANMsg template) throws RequestParameterException
	{
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * SCの実行ステータスの取得処理を行います。
	 * <br>
	 * @param param
	 * @return SCの実行ステータス
	 * @throws Exception
	 */
	protected int getReturnCode(IRequestParameterReadWrite param) throws Exception
	{
		return Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
	}

	/**
	 * CAANMsgに必要なデータのマッピング処理を行います。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		// 実装なし
		
		CAANMsg[] templates = new CAANMsg[0];
		
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * エラー情報のマッピング処理を行います。
	 * <br>
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		// 実装なし
		return param;
	}

	/**
	 * 割引サービス契約一覧照会（割引サービス指定）の上りマップ
	 * <br>
	 * @param param
	 * @param fixedText
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0451B010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0451B010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0451B010CBSMsg.TEMPLATEID, "EKK0451B010");

		// 機能コード
		template.set(EKK0451B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータ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);
		
		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 割引サービス契約一覧照会（割引サービス指定）.ＫＥＹ＿サービス契約番号
		setTemplate(template, EKK0451B010CBSMsg.KEY_SVC_KEI_NO, inMap, "", "svc_kei_no");
		
		// 割引サービス契約一覧照会（割引サービス指定）.ＫＥＹ＿割引サービスコード
		template.set(EKK0451B010CBSMsg.KEY_WRIB_SVC_CD, JKKStrConst.WRIB_SVC_FAMIPA);

		return template;
	}
	
	/**
	 * 割引サービス契約一覧照会（割引サービス指定）の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK0451B010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, Map<String, Object> outputMap) throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		
		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0451B010CBSMsg.EKK0451B010CBSMSG1LIST);
		
		int len = 0;
		if (templateArray != null)
		{
			len = templateArray.length;
		}
		// 割引サービス契約一覧照会（割引サービス指定）明細の件数
		outputMap.put("templateArrayLength", len);
		
		// エラー情報の設定
		editErrInfoEKK0451B010(param, template, (Integer)returnCode, fixedText);
		
		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		return param;
	}
	
	
	/**
	 * 割引サービス契約一覧照会（割引サービス指定）のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0451B010(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		// 割引サービス契約一覧照会.ＫＥＹ＿サービス契約番号 → ＫＥＹ＿サービス契約番号のエラー情報返却
		setErrInfo(inMap, "", EKK0451B010CBSMsg.KEY_SVC_KEI_NO_ERR, template, EKK0451B010CBSMsg.KEY_SVC_KEI_NO_ERR);
		
		// 割引サービス契約一覧照会.ＫＥＹ＿割引サービスコード → ＫＥＹ＿割引サービスコードのエラー情報返却
		setErrInfo(inMap, "", EKK0451B010CBSMsg.KEY_WRIB_SVC_CD_ERR, template, EKK0451B010CBSMsg.KEY_WRIB_SVC_CD_ERR);

		return param;
	}
	
	/**
	 * サービス契約一意照会の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param
	 * @param fixedText
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0081A010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		String prefix = "";

		// テンプレートID
		template.set(EKK0081A010CBSMsg.TEMPLATEID, "EKK0081A010");

		// 機能コード
		template.set(EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// オペレータ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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// サービス契約一意照会.ＫＥＹ＿サービス契約番号
		setTemplate(template, EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inMap, prefix, "svc_kei_no");

		// サービス契約一意照会.ＫＥＹ＿予約適用年月日
		String gyomuOpDate = JCCBPCommon.getOpeDate(null);
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, gyomuOpDate);

		return template;
	}


	/**
	 * サービス契約一意照会の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param outputList
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK0081A010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, ArrayList<String> outputList)
			throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		templateArray = template.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);

		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				// SYSID
				outputList.add(templateArray[i].getString(EKK0081A010CBSMsg1List.SYSID));
			}
		}

		// エラー情報の設定
		editErrInfoEKK0081A010(param, template, (Integer)returnCode, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	
	/**
	 * サービス契約一意照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0081A010(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		// サービス契約一意照会.ＫＥＹ＿サービス契約番号 → サービス契約番号のエラー情報返却
		setErrInfo(inMap, "", EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR, template, EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR);
		
		// サービス契約一意照会.ＫＥＹ＿予約適用年月日 → 予約適用年月日のエラー情報返却
		setErrInfo(inMap, "", EKK0081A010CBSMsg.KEY_RSV_APLY_YMD_ERR, template, EKK0081A010CBSMsg.KEY_RSV_APLY_YMD_ERR);

		return param;
	}
	
	/**
	 * 家族会員情報一覧照会の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param
	 * @param fixedText
	 * @param inputList
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInECK0011B003(IRequestParameterReadWrite param, String fixedText, ArrayList<String> inputList) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(ECK0011B003CBSMsg.class.getName());

		// テンプレートID
		template.set(ECK0011B003CBSMsg.TEMPLATEID, "ECK0011B003");

		// 機能コード
		template.set(ECK0011B003CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータ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);

		// 家族会員情報一覧照会.ＫＥＹ＿SYSID
		template.set(ECK0011B003CBSMsg.KEY_SYSID, inputList.get(0));

		return template;
	}
	
	/**
	 * 家族会員情報一覧照会の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param outputList
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetECK0011B003(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, ArrayList<String> outputList)
			throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		templateArray = template.getCAANMsgList(ECK0011B003CBSMsg.ECK0011B003CBSMSG1LIST);
		
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				// SYSID
				outputList.add(templateArray[i].getString(ECK0011B003CBSMsg1List.SYSID));
			}
		}
		
		
		// エラー情報の設定
		editErrInfoECK0011B003(param, template, (Integer)returnCode, fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		return param;
	}
	
	/**
	 * 家族会員情報一覧照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoECK0011B003(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		// 家族会員情報一覧照会.ＫＥＹ＿SYSID → ＫＥＹ＿SYSIDのエラー情報返却
		setErrInfo(inMap, "", ECK0011B003CBSMsg.KEY_SYSID_ERR, template, ECK0011B003CBSMsg.KEY_SYSID_ERR);
		
		return param;
	}
	
	/**
	 * コンテンツ契約一覧照会の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param
	 * @param fixedText
	 * @param inputList
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	protected CAANMsg editInECN0021B001(IRequestParameterReadWrite param, String fixedText, ArrayList<String> inputList) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(ECN0021B001CBSMsg.class.getName());

		// テンプレートID
		template.set(ECN0021B001CBSMsg.TEMPLATEID, "ECN0021B001");

		// 機能コード
		template.set(ECN0021B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータ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);

		// コンテンツ契約一覧照会.ＫＥＹ＿SYSID
		// リスト内のSYSIDを'(シングルコーテーション)付きカンマで結合
		StringBuilder keySysid = new StringBuilder();
		for (int i = 0; i < inputList.size(); i++)
		{
			keySysid.append(STR_HALF_SINGLE_QUOTATION);
			keySysid.append(inputList.get(i));
			keySysid.append(STR_HALF_SINGLE_QUOTATION);
			keySysid.append(STR_HALF_COMMA);
		}
		// SYSID（末尾のカンマを除去）
		keySysid.delete(keySysid.length() - STR_HALF_COMMA.length(), keySysid.length());
		
		// 全てのSYSIDを'(シングルコーテーション)付きカンマ区切りで設定
		template.set(ECN0021B001CBSMsg.KEY_SYSID, keySysid.toString());
		
		// 運用年月日
		String gyomuOpDate = JCCBPCommon.getOpeDate(null);
		
		// コンテンツ契約一覧照会.ＫＥＹ＿予約適用年月日
		template.set(ECN0021B001CBSMsg.KEY_RSV_APLY_YMD, gyomuOpDate);
		
		// 運用年月日時分秒
		String gyomuOpDateTimeStamp = JCCBPCommon.getOpeDateTimeStamp(null);

		// コンテンツ契約一覧照会.ＫＥＹ＿システム年月日時分秒
		template.set(ECN0021B001CBSMsg.KEY_SYS_DTM, gyomuOpDateTimeStamp);

		return template;
	}
	
	/**
	 * コンテンツ契約一覧照会の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param outputList
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	protected IRequestParameterReadWrite editRetECN0021B001(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, ArrayList<HashMap<String, Object>> outputList)
			throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		templateArray = template.getCAANMsgList(ECN0021B001CBSMsg.ECN0021B001CBSMSGLIST);

		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				
				// コンテンツサービスコード ← コンテンツ契約一覧照会.コンテンツサービスコード
				setDataMap(childMap, "", ECN0021B001CBSMsgList.CONT_SVC_CD, templateArray[i], ECN0021B001CBSMsgList.CONT_SVC_CD);
				
				// コンテンツ種別コード ← コンテンツ契約一覧照会.コンテンツ種別コード
				setDataMap(childMap, "", ECN0021B001CBSMsgList.CONT_SBT_CD, templateArray[i], ECN0021B001CBSMsgList.CONT_SBT_CD);
				
				// コンテンツ契約終了年月日時分秒 ← コンテンツ契約一覧照会.コンテンツ契約終了年月日時分秒
				setDataMap(childMap, "", ECN0021B001CBSMsgList.CONT_KEI_END_DTM, templateArray[i], ECN0021B001CBSMsgList.CONT_KEI_END_DTM);
				
				// コンテンツ支払い方法コード ← コンテンツ契約一覧照会.コンテンツ支払い方法コード
				setDataMap(childMap, "", ECN0021B001CBSMsgList.CONT_PAYWAY_CD, templateArray[i], ECN0021B001CBSMsgList.CONT_PAYWAY_CD);
				
				// リストにマップを格納する
				outputList.add(childMap);
			}
		}
		// エラー情報の設定
		editErrInfoECN0021B001(param, template, (Integer)returnCode, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * コンテンツ契約一覧照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	protected IRequestParameterReadWrite editErrInfoECN0021B001(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		// コンテンツ契約一覧照会.ＫＥＹ＿SYSID → SYSIDのエラー情報返却
		setErrInfo(inMap, "", ECN0021B001CBSMsg.KEY_SYSID_ERR, template, ECN0021B001CBSMsg.KEY_SYSID_ERR);
		
		// コンテンツ契約一覧照会.ＫＥＹ＿予約適用年月日 → 予約適用年月日のエラー情報返却
		setErrInfo(inMap, "", ECN0021B001CBSMsg.KEY_RSV_APLY_YMD_ERR, template, ECN0021B001CBSMsg.KEY_RSV_APLY_YMD_ERR);
		
		// コンテンツ契約一覧照会.ＫＥＹ＿システム年月日時分秒 → システム年月日時分秒のエラー情報返却
		setErrInfo(inMap, "", ECN0021B001CBSMsg.KEY_SYS_DTM_ERR, template, ECN0021B001CBSMsg.KEY_SYS_DTM_ERR);

		return param;
	}
	
	/**
	 * 機器提供サービス契約一覧照会(サービス契約番号、回線対象サービス契約経由)の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param
	 * @param fixedText
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0341B019(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0341B019CBSMsg.class.getName());
		String prefix = "";

		// テンプレートID
		template.set(EKK0341B019CBSMsg.TEMPLATEID, "EKK0341B019");

		// 機能コード
		template.set(EKK0341B019CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_3);

		// オペレータ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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機器提供サービス契約一覧照会.ＫＥＹ＿サービス契約番号
		setTemplate(template, EKK0341B019CBSMsg.KEY_SVC_KEI_NO, inMap, prefix, "svc_kei_no");
		
		// 機器提供サービス契約一覧照会.ＫＥＹ＿基準年月日
		String gyomuOpDate = JCCBPCommon.getOpeDate(null);
		template.set(EKK0341B019CBSMsg.KEY_BASE_YMD, gyomuOpDate);

		return template;
	}
	
	/**
	 * 機器提供サービス契約一覧照会(サービス契約番号、回線対象サービス契約経由)の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param outputList
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK0341B019(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, ArrayList<HashMap<String, Object>> outputList)
			throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		templateArray = template.getCAANMsgList(EKK0341B019CBSMsg.EKK0341B019CBSMSG1LIST);

		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				
				// 機器提供サービス契約番号 ← 機器提供サービス契約一覧照会.機器提供サービス契約番号
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.KKTK_SVC_KEI_NO, templateArray[i], EKK0341B019CBSMsg1List.KKTK_SVC_KEI_NO);
				
				// 機器提供サービスコード ← 機器提供サービス契約一覧照会.機器提供サービスコード
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.KKTK_SVC_CD, templateArray[i], EKK0341B019CBSMsg1List.KKTK_SVC_CD);
				
				// 料金コースコード ← 機器提供サービス契約一覧照会.料金コースコード
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.PCRS_CD, templateArray[i], EKK0341B019CBSMsg1List.PCRS_CD);
				
				// 料金プランコード ← 機器提供サービス契約一覧照会.料金プランコード
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.PPLAN_CD, templateArray[i], EKK0341B019CBSMsg1List.PPLAN_CD);
				
				// 宅内機器種別コード ← 機器提供サービス契約一覧照会.宅内機器種別コード
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.TAKNKIKI_SBT_CD, templateArray[i], EKK0341B019CBSMsg1List.TAKNKIKI_SBT_CD);
				
				// 機器提供サービス契約ステータス ← 機器提供サービス契約一覧照会.機器提供サービス契約ステータス
				setDataMap(childMap, "", EKK0341B019CBSMsg1List.KKTK_SVC_KEI_STAT, templateArray[i], EKK0341B019CBSMsg1List.KKTK_SVC_KEI_STAT);
				
				// リストにマップを格納する
				outputList.add(childMap);
			}
		}
		// エラー情報の設定
		editErrInfoEKK0341B019(param, template, (Integer)returnCode, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * 機器提供サービス契約一覧照会(サービス契約番号、回線対象サービス契約経由)のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0341B019(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機器提供サービス契約一覧照会.ＫＥＹ＿サービス契約番号 → サービス契約番号のエラー情報返却
		setErrInfo(inMap, "", EKK0341B019CBSMsg.KEY_SVC_KEI_NO_ERR, template, EKK0341B019CBSMsg.KEY_SVC_KEI_NO_ERR);
		
		// 機器提供サービス契約一覧照会.ＫＥＹ＿基準年月日 → 基準年月日のエラー情報返却
		setErrInfo(inMap, "", EKK0341B019CBSMsg.KEY_BASE_YMD_ERR, template, EKK0341B019CBSMsg.KEY_BASE_YMD_ERR);
		
		return param;
	}
	
	/**
	 * 機器オプションサービス契約一覧照会（複合検索）の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param
	 * @param fixedText
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInEKK2811B504(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK2811B504CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK2811B504CBSMsg.TEMPLATEID, "EKK2811B504");
		
		// 機能コード
		template.set(EKK2811B504CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		
		// オペレータ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);
		
		// 機器オプションサービス契約一覧照会.ＫＥＹ＿機器提供サービス契約番号
		template.set(EKK2811B504CBSMsg.KEY_KKTK_SVC_KEI_NO, ekk0341b019KktkSvcKeiNo);
		
		// 機器オプションサービス契約一覧照会.ＫＥＹ＿予約適用年月日
		String gyomuOpDate = JCCBPCommon.getOpeDate(null);
		template.set(EKK2811B504CBSMsg.KEY_RSV_APLY_YMD, gyomuOpDate);

		return template;
	}
	
	/**
	 * 機器オプションサービス契約一覧照会（複合検索）の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param outputList
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK2811B504(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText, ArrayList<HashMap<String, Object>> outputList)
			throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		templateArray = template.getCAANMsgList(EKK2811B504CBSMsg.EKK2811B504CBSMSG1LIST);

		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				HashMap<String, Object> childMap = new HashMap<String, Object>();
				
				// 機器オプションサービス契約ステータス ← 機器オプションサービス契約一覧照会.機器オプションサービス契約ステータス
				setDataMap(childMap, "", EKK2811B504CBSMsg1List.KKOP_SVC_KEI_STAT, templateArray[i], EKK2811B504CBSMsg1List.KKOP_SVC_KEI_STAT);
				
				// 機器オプションサービスコード ← 機器オプションサービス契約一覧照会.機器オプションサービスコード
				setDataMap(childMap, "", EKK2811B504CBSMsg1List.KKOP_SVC_CD, templateArray[i], EKK2811B504CBSMsg1List.KKOP_SVC_CD);
				
				// 料金コースコード ← 機器オプションサービス契約一覧照会.料金コースコード
				setDataMap(childMap, "", EKK2811B504CBSMsg1List.PCRS_CD, templateArray[i], EKK2811B504CBSMsg1List.PCRS_CD);
				
				// リストにマップを格納する
				outputList.add(childMap);
			}
		}
		// エラー情報の設定
		editErrInfoEKK2811B504(param, template, (Integer)returnCode, fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		return param;
	}
	
	/**
	 * 機器オプションサービス契約一覧照会（複合検索）のエラー情報マッピング処理を行います。
	 * <br>
	 * @param iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK2811B504(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK0451B010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap)param.getData(fixedText);

		//  機器オプションサービス契約一覧照会.ＫＥＹ＿機器提供サービス契約番号 → 機器提供サービス契約番号のエラー情報返却
		setErrInfo(inMap, "", EKK2811B504CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR, template, EKK2811B504CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR);
		
		//  機器オプションサービス契約一覧照会.ＫＥＹ＿予約適用年月日 → 予約適用年月日のエラー情報返却
		setErrInfo(inMap, "", EKK2811B504CBSMsg.KEY_RSV_APLY_YMD_ERR, template, EKK2811B504CBSMsg.KEY_RSV_APLY_YMD_ERR);
		
		return param;
	}

	/**
	 * コントロールマップエラー情報格納処理を行います。
	 * <br>
	 * @param param
	 * @param itemplateStatus
	 * @param returnCode
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	protected IRequestParameterReadWrite setControlMapErrInfo(IRequestParameterReadWrite param, int itemplateStatus, int returnCode)
			throws RequestParameterException
	{
		int templateStatus = itemplateStatus;

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, 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)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		return param;
	}

	/**
	 * CAANMsgに値を設定します。<br>
	 *  @inMap内にデータが存在する場合、inMap内のデータを設定します。<br>
	 *  A上記以外の場合、setNullを呼び出します。<br>
	 * @param template 値を設定するメッセージキャリア
	 * @param setKey 設定先メッセージキャリアのキー名
	 * @param inMap ユーザデータ情報
	 * @param prefix ユーザデータ情報より取得する場合に付加するプレフィックス
	 * @param getKey ユーザデータ情報より取得するキー名
	 */
	protected void setTemplate(CAANMsg template, String setKey, HashMap<String, Object> inMap, String prefix, String getKey)
	{
		
		if (null == inMap || null == inMap.get(prefix + getKey) || 0 == ((String)inMap.get(prefix + getKey)).length())
		{
			template.setNull(setKey);
		}
		else
		{
			template.set(setKey, (String)inMap.get(prefix + getKey));
		}
	}
	
	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　@CAANMsgにデータが存在する場合、CAANMsgのデータを設定します。<br>
	 * 　A上記以外の場合、空文字を設定します。<br>
	 * @param dataMap 値を設定するユーザデータ情報
	 * @param prefix ユーザデータ情報に設定する際に付加するプレフィックス
	 * @param setKey ユーザデータ情報のキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアのキー名
	 */
	protected void setDataMap(HashMap<String, Object> dataMap, String prefix, String setKey, CAANMsg template, String getKey)
	{
		if (template.isNull(getKey))
		{
			dataMap.put(prefix + setKey, "");
		}
		else
		{
			dataMap.put(prefix + setKey, template.getString(getKey));
		}
	}
	
	/**
	 * エラー情報を設定します。<br>
	 * @param inMap ユーザデータ情報
	 * @param prefix ユーザデータ情報に設定する際に付加するプレフィックス
	 * @param setKey ユーザデータ情報のキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアのキー名
	 */
	protected void setErrInfo(HashMap<String, Object> inMap, String prefix, String setKey, CAANMsg template, String getKey)
	{
		if (!template.isNull(getKey))
		{
			if (!inMap.containsKey(prefix + setKey))
			{
				inMap.put(prefix + setKey, template.getString(getKey));
			}
		}
	}

//ANK-4346-00-00 ADD START
	/**
	 * コンテンツ契約サービスの下りマッピング
	 * @param map
	 * @param paramMap
	 */
	@SuppressWarnings("unchecked")
	private void editJCNContKeiListInfoCC(List<HashMap<String, Object>> map, HashMap<String, Object> paramMap)
	{
		if (paramMap != null)
		{
			List<Map<String, Object>> inMap = (List<Map<String, Object>>)paramMap.get("cont_kei_list");
//			HashMap<String, Object> retMap = new HashMap<String, Object>();
			String opeDate = JCCBPCommon.getOpeDate(null);
			if (inMap != null)
			{
				// レスポンス設定
				for (Map<String, Object> contInfo : inMap)
				{
					HashMap<String, Object> retMap = new HashMap<String, Object>();

					if(JCNStrConst.CD01821_KEI.equals(contInfo.get("cont_kei_stat_cd")))
					{
						String endDate = JCNStringUtil.nullToBlank((String) contInfo.get("contract_end_date"));
						// 契約終了年月日時がNULL または 空の場合、または運用日より未来日の場合契約中
						if(opeDate.compareTo(endDate) >= 0)
						{
							// 契約中
							retMap.put(CONTRACT_FLG, "1");
							map.add(retMap);
						}
					}
				}
			}
			
		}
	}

	/**
	 * 共通領域のメッセージを作成します。
	 * 
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) 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));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		setNullToMsg(template);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * エラー情報を設定します。
	 * 
	 * @param msg
	 * @param map
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (key.endsWith("_err"))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, msg.getString(key));
					}
				}
			}
		}
	}

	/**
	 * 未入力項目にnullを設定します。
	 * @param msg
	 */
	@SuppressWarnings("unchecked")
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (key.endsWith("_err"))
			{
				String tmpKey = key.substring(0, key.length() - 4);
				
				if (!msg.containsKeyOfMsgData(tmpKey))
				{
					msg.setNull(tmpKey);
				}
			}
		}
	}
//ANK-4346-00-00 ADD END

}
