/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKEoelecKeiChgCC
*	ソースファイル名：JKKEoelecKeiChgCC.java
*	作成者			：FJ）藤本
*	日付			：2016年10月06日
*＜機能概要＞
*	eo電気契約情報変更の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v29.00.00	2016/10/06	FJ）藤本	【ANK-2990-00-00】【eo電気】同時申込・量販訪販対応（STEP2-2）
*	v34.00.00	2017/12/18	FJ) 宮下	【ANK-3210-16-00】【eo電気】eo電気の取扱コード連携機能追加
*	v36.00.00	2018/03/06	FJ) 謝		【ANK-3399-00-00】住変中のセットタイプ条件判定変更対応
*	v52.00.00   2021/01/17  FJ)星野 	【ANK-3910-00-00】定額サービスリース品追加対応
**********************************************************************/
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.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
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.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0011C020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C120CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B024CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B024CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0071B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0071E020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0071B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0071D010CBSMsg;


/**
 * eo電気契約情報変更の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JKKEoelecKeiChgCC extends AbstractCommonComponent
{
	/** テンプレートID：サービス契約履歴一覧照会 */
	private static final String TEMPLATE_ID_EKK0081B024 = "EKK0081B024";
	/** テンプレートID：申込明細一意照会 */
	private static final String TEMPLATE_ID_EKK0021A010 = "EKK0021A010";
	/** テンプレートID：申込明細情報変更(eo電気) */
	private static final String TEMPLATE_ID_EKK0021C120 = "EKK0021C120";
	/** テンプレートID：申込一意照会 */
	private static final String TEMPLATE_ID_EKK0011A010 = "EKK0011A010";
	/** テンプレートID：申込内容変更 */
	private static final String TEMPLATE_ID_EKK0011C020 = "EKK0011C020";
	// ANK-3210-16-00 ADD START
	/** テンプレートID：申込_代理店一覧照会 */
	private static final String TEMPLATE_ID_EKK0071B002 = "EKK0071B002";
	/** テンプレートID：申込_代理店削除 */
	private static final String TEMPLATE_ID_EKK0071E020 = "EKK0071E020";
	/** テンプレートID：申込_代理店登録 */
	private static final String TEMPLATE_ID_EKK0071D010 = "EKK0071D010";

	/** リクエスト項目名：取扱コード1-1 */
	private static final String TRAT_CD_1_1 = "trat_cd_1_1";
	/** リクエスト項目名：取扱コード1-2 */
	private static final String TRAT_CD_1_2 = "trat_cd_1_2";
	/** リクエスト項目名：取扱コード2-1 */
	private static final String TRAT_CD_2_1 = "trat_cd_2_1";
	/** リクエスト項目名：取扱コード2-2 */
	private static final String TRAT_CD_2_2 = "trat_cd_2_2";
	/** 取扱コード項目名のリスト */
	private static final String[] TRAT_LIST = {TRAT_CD_1_1, TRAT_CD_1_2, TRAT_CD_2_1, TRAT_CD_2_2};
	/** 表示順_1 */
	private static final String DSP_JUN_1 = "1";
	/** 表示順_2 */
	private static final String DSP_JUN_2 = "2";
	/** 表示順_3 */
	private static final String DSP_JUN_3 = "3";
	/** 表示順_4 */
	private static final String DSP_JUN_4 = "4";
	// ANK-3210-16-00 ADD END

	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** リターンコード：正常  */
	private static final int RETURN_CODE_NORMAL = 0;

	/** キー項目接頭辞 */
	private static final String KEYITEM_PREFIX = "key_";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	/** エラー項目設定値：EA */
	private static final String ERR_EA = "EA";
	// ANK-3210-16-00 ADD START
	/** エラー項目設定値：EB */
	private static final String ERR_EB = "EB";
	/** エラー項目設定値：EC */
	private static final String ERR_EC = "EC";
	/** エラー項目設定値：ED */
	private static final String ERR_ED = "ED";
	/** エラー項目設定値：E1 */
	private static final String ERR_E1 = "E1";
	// ANK-3210-16-00 ADD END
	/** チェックエラー時のエラーメッセージ */
	private static final String SC_ERROR_STRING = "サービスコンポーネントエラー";

	/**
	 * eo電気契約情報変更を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	public IRequestParameterReadWrite chgEoelecKei(SessionHandle handle, 
													IRequestParameterReadWrite param, 
													String fixedText) throws Throwable
	{
		// eo電気契約情報変更CCマップ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);

		// サービス契約履歴一覧照会
		CAANMsg[] ekk0081b024Msg1List = selectSvcKeiList(handle, param, fixedText, ccMsg);

		// サービス契約チェック
		checkSvcKei(param, ccMsg, ekk0081b024Msg1List);

		// 申込明細一意照会
		CAANMsg[] ekk0021a010Msg1List = selectMskmDtl(handle, param, fixedText, ekk0081b024Msg1List[0]);

		// 申込明細情報変更(eo電気)
		updateMskmDtl(handle, param, fixedText, ccMsg, ekk0021a010Msg1List[0]);

		// 申込一意照会
		CAANMsg[] ekk0011a010Msg1List = selectMskm(handle, param, fixedText, ekk0021a010Msg1List[0]);

		// 申込内容変更
		updateMskm(handle, param, fixedText, ccMsg, ekk0011a010Msg1List[0]);
		
		// ANK-3210-16-00 ADD START
		// 申込_代理店一覧照会
		CAANMsg[] ekk0071b002Msg1List = selectMskmAgnt(handle, param, fixedText, ekk0021a010Msg1List[0]);
		
		// 申込_代理店チェック
		checkMskmAgnt(handle, param, fixedText, ccMsg, ekk0071b002Msg1List , ekk0021a010Msg1List[0]);
		
		// 申込_代理店削除
		deleteMskmAgnt(handle, param, fixedText, ccMsg, ekk0071b002Msg1List);
		
		// 申込_代理店登録
		addMskmAgnt(handle, param, fixedText, ccMsg, ekk0021a010Msg1List[0]);
		// ANK-3210-16-00 ADD END
		
		return param;
	}

	/**
	 * サービス契約履歴一覧照会を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @return サービス契約履歴一覧照会明細
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] selectSvcKeiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMsg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス契約履歴一覧照会の上りマッピング
		Object[][] ekk0081b024In =
		{
			{EKK0081B024CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B024},
			// 機能コード："2"(世代登録年月日時分秒の昇順)
			{EKK0081B024CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			// サービス契約番号
			{EKK0081B024CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("svc_kei_no")}
		};

		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0081b024In, new EKK0081B024CBSMsg().getContents())
					.getCAANMsgList(EKK0081B024CBSMsg.EKK0081B024CBSMSG1LIST);
	}

	/**
	 * サービス契約チェックを行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0081b024Msg1List サービス契約履歴一覧照会明細
	 * @throws CCException チェックエラーの場合
	 */
	private void checkSvcKei(IRequestParameterReadWrite param, HashMap<String, Object> ccMsg, CAANMsg[] ekk0081b024Msg1List)
	throws CCException
	{
		int returnCode = 0;

		// 存在チェック
		if (0 == ekk0081b024Msg1List.length)
		{
			// 関連チェックエラー
			returnCode = JPCModelConstant.RELATION_ERR;
			ccMsg.put("svc_kei_no" + ERRITEM_SUFFIX, ERR_EA);
		}
		// 状態チェック
		else
		{
			String svcKeiStat = ekk0081b024Msg1List[ekk0081b024Msg1List.length - 1].getString(EKK0081B024CBSMsg1List.SVC_KEI_STAT);
// ANK-3399-00-00 MOD START
//			// サービス契約ステータスが「受付済」でない場合
//			if (!JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat))
			// サービス契約ステータスが「受付済」、「照査済」、「締結済」、「サービス提供中」でない場合
			if (!JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat)
					&& !JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat)
					&& !JKKStrConst.CD00037_CNC_ZM.equals(svcKeiStat)
					&& !JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat))
// ANK-3399-00-00 MOD END
			{
				// 状態遷移チェックエラー
				returnCode = JPCModelConstant.STATUSTRANS_ERR;
				ccMsg.put("svc_kei_no" + ERRITEM_SUFFIX, ERR_EA);
			}
		}
		
		// ANK-3210-16-00 ADD START
		String tratCd1 = null;
		String tratCd2 = null;
		String tratCd3 = null;
		String tratCd4 = null;
		
		if (ccMsg.containsKey(TRAT_CD_1_1))
		{
			tratCd1 = (String)ccMsg.get(TRAT_CD_1_1);
		}
		if (ccMsg.containsKey(TRAT_CD_1_2))
		{
			tratCd2 = (String)ccMsg.get(TRAT_CD_1_2);
		}
		if (ccMsg.containsKey(TRAT_CD_2_1))
		{
			tratCd3 = (String)ccMsg.get(TRAT_CD_2_1);
		}
		if (ccMsg.containsKey(TRAT_CD_2_2))
		{
			tratCd4 = (String)ccMsg.get(TRAT_CD_2_2);
		}

		// 取扱コード1チェック
		if(tratCd1 != null && "".equals(tratCd1) && !JKKStringUtil.isNullBlank(tratCd2))
		{
			// 単項目関連チェックエラー
			returnCode = JPCModelConstant.ITEM_RELATION_ERR;
			ccMsg.put(TRAT_CD_1_1 + ERRITEM_SUFFIX, ERR_E1);
		}
		
		// 取扱コード2チェック
		if(tratCd3 != null && "".equals(tratCd3) && !JKKStringUtil.isNullBlank(tratCd4))
		{
			// 単項目関連チェックエラー
			returnCode = JPCModelConstant.ITEM_RELATION_ERR;
			ccMsg.put(TRAT_CD_2_1 + ERRITEM_SUFFIX, ERR_E1);
		}
		// ANK-3210-16-00 ADD END

		// チェックエラーの場合
		if (0 < returnCode)
		{
			// エラー情報設定
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, returnCode);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);

			ArrayList<Object> errList = new ArrayList<Object>();
			HashMap<String, Object> errorMap = new HashMap<String, Object>();
			HashMap<String, String> errorMapChild = new HashMap<String, String>();
			errorMap.put(ErrorInfoMapKeys.RETURN_CODE, RETURN_CODE_NORMAL);
			errorMap.put(ErrorInfoMapKeys.TEMPLATE_ID, "JKKEoelecKeiChgCC");
			errorMap.put(ErrorInfoMapKeys.STATUS, returnCode);
			errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);
			errList.add(errorMap);
			param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);

			throw new CCException(SC_ERROR_STRING, new Exception());
		}
	}

	/**
	 * 申込明細一意照会を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ekk0081b024Msg サービス契約履歴一覧照会明細(最古のレコード)
	 * @return 申込明細一意照会明細
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] selectMskmDtl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, CAANMsg ekk0081b024Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込明細一意照会の上りマッピング
		Object[][] ekk0021a010In =
		{
			{EKK0021A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021A010},
			// 機能コード："2"(カレント)
			{EKK0021A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			// 申込明細番号
			{EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, ekk0081b024Msg.getString(EKK0081B024CBSMsg1List.MSKM_DTL_NO)}
		};

		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0021a010In, new EKK0021A010CBSMsg().getContents())
					.getCAANMsgList(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST);
	}

	/**
	 * 申込明細情報変更(eo電気)を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0021a010Msg 申込明細一意照会明細(カレント)
	 * @throws Throwable 例外が発生した場合
	 */
	private void updateMskmDtl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMsg, CAANMsg ekk0021a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込明細情報変更(eo電気)の上りマッピング
		Object[][] ekk0021c120In =
		{
			{EKK0021C120CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021C120},
			// 機能コード："1"(チェック＆登録)
			{EKK0021C120CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			// 申込明細番号
			{EKK0021C120CBSMsg.MSKM_DTL_NO, ekk0021a010Msg.getString(EKK0021A010CBSMsg1List.MSKM_DTL_NO)},
			// 申込書番号
			{EKK0021C120CBSMsg.MSKMSHO_NO, (String)ccMsg.get("mskmsho_no")},
			// 申込年月日
			{EKK0021C120CBSMsg.MSKM_YMD, (String)ccMsg.get("mskm_ymd")},
			// 申込形態コード
			{EKK0021C120CBSMsg.MSKM_FORM_CD, (String)ccMsg.get("mskm_form_cd")},
			// 同時申込eo光申込書番号
			{EKK0021C120CBSMsg.DOJI_MSKM_EOH_MSKMSHO_NO, (String)ccMsg.get("eoh_mskmsho_no")},
			// 更新年月日時分秒(更新前)
			{EKK0021C120CBSMsg.UPD_DTM_BF, ekk0021a010Msg.getString(EKK0021A010CBSMsg1List.LAST_UPD_DTM)}
		};

		// サービスIF実行
		callSC(handle, scCall, param, fixedText, ekk0021c120In, new EKK0021C120CBSMsg().getContents());
	}

	/**
	 * 申込一意照会を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ekk0021a010Msg 申込明細一意照会明細(カレント)
	 * @return 申込一意照会明細
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] selectMskm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, CAANMsg ekk0021a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込一意照会の上りマッピング
		Object[][] ekk0011a010In =
		{
			{EKK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011A010},
			// 機能コード："2"(カレント)
			{EKK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			// 申込番号
			{EKK0011A010CBSMsg.KEY_MSKM_NO, ekk0021a010Msg.getString(EKK0021A010CBSMsg1List.MSKM_NO)}
		};

		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0011a010In, new EKK0011A010CBSMsg().getContents())
					.getCAANMsgList(EKK0011A010CBSMsg.EKK0011A010CBSMSG1LIST);
	}

	/**
	 * 申込内容変更を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0011a010Msg 申込一意照会明細(カレント)
	 * @throws Throwable 例外が発生した場合
	 */
	private void updateMskm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMsg, CAANMsg ekk0011a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込内容変更の上りマッピング
		Object[][] ekk0011c020In =
		{
			{EKK0011C020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011C020},
			// 機能コード："1"(チェック＆登録)
			{EKK0011C020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			// 申込番号
			{EKK0011C020CBSMsg.MSKM_NO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.MSKM_NO)},
			// 申込種別コード
			{EKK0011C020CBSMsg.MSKM_SBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.MSKM_SBT_CD)},
			// 申込書到着年月日
			{EKK0011C020CBSMsg.MSKMSHO_ARIV_YMD, (String)ccMsg.get("mskmsho_ariv_ymd")},
			// 申込受付年月日時分秒
			{EKK0011C020CBSMsg.MSKM_UK_DTM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.MSKM_UK_DTM)},
			// 申込受付担当ユーザーID
			{EKK0011C020CBSMsg.MSKM_UK_TNT_USER_ID, (String)ccMsg.get("mskm_uk_tnt_user_id")},
			// 申込年月日
			{EKK0011C020CBSMsg.MSKM_YMD, (String)ccMsg.get("mskm_ymd")},
			// 総合営業申込契機コード
			{EKK0011C020CBSMsg.TTL_BUSINESS_MSKM_OPT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TTL_BUSINESS_MSKM_OPT_CD)},
			// 申込連絡先電話番号
			{EKK0011C020CBSMsg.MSKM_RRKS_TELNO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.MSKM_RRKS_TELNO)},
			// 申込実施者種別コード
			{EKK0011C020CBSMsg.MSKM_JSSIS_SBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.MSKM_JSSIS_SBT_CD)},
			// お客様ご要望事項
			{EKK0011C020CBSMsg.CUST_YOBO_JIKO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.CUST_YOBO_JIKO)},
			// 電話連絡希望日種別コード
			{EKK0011C020CBSMsg.TEL_RRK_KIBOD_SBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TEL_RRK_KIBOD_SBT_CD)},
			// 電話連絡希望時間帯コード
			{EKK0011C020CBSMsg.TEL_RRK_KIBO_TIME_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TEL_RRK_KIBO_TIME_CD)},
			// 宅内調査希望日種別コード
			{EKK0011C020CBSMsg.TAKCHO_KIBOD_SBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TAKCHO_KIBOD_SBT_CD)},
			// 宅内調査希望時間帯コード
			{EKK0011C020CBSMsg.TAKCHO_KIBO_TIME_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TAKCHO_KIBO_TIME_CD)},
			// リファラー
			{EKK0011C020CBSMsg.REFERER, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.REFERER)},
			// 関西電力お客様情報授受同意有無
			{EKK0011C020CBSMsg.KEPCO_CUSTINFO_JUJU_DOI_UM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.KEPCO_CUSTINFO_JUJU_DOI_UM)},
			// 照査前連絡事項要否
			{EKK0011C020CBSMsg.SHOSA_BF_RRK_JIKO_YH, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.SHOSA_BF_RRK_JIKO_YH)},
			// 照査前連絡事項
			{EKK0011C020CBSMsg.SHOSA_BF_RRK_JIKO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.SHOSA_BF_RRK_JIKO)},
			// 利用サービス継続種別コード
			{EKK0011C020CBSMsg.USE_SVC_KEIZK_SBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.USE_SVC_KEIZK_SBT_CD)},
			// 受付担当者識別コード
			{EKK0011C020CBSMsg.UK_TNTSHA_SKBT_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.UK_TNTSHA_SKBT_CD)},
			// 工事依頼情報連絡事項
			{EKK0011C020CBSMsg.KOJI_REQ_INFO_RRK_JIKO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.KOJI_REQ_INFO_RRK_JIKO)},
			// 提携住宅会社コード
			{EKK0011C020CBSMsg.TKJCP_CD, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCP_CD)},
			// 提携住宅会社名
			{EKK0011C020CBSMsg.TKJCP_NM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCP_NM)},
			// 提携住宅会社支店・営業所名
			{EKK0011C020CBSMsg.TKJCP_STNEGS_NM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCP_STNEGS_NM)},
			// 提携住宅会社担当者名
			{EKK0011C020CBSMsg.TKJCPTTS_NM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCPTTS_NM)},
			// 提携住宅会社担当者職種名
			{EKK0011C020CBSMsg.TKJCPTTS_SHKSNM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCPTTS_SHKSNM)},
			// 提携住宅会社担当者電話番号
			{EKK0011C020CBSMsg.TKJCPTTS_TLN, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TKJCPTTS_TLN)},
			// 分譲地名
			{EKK0011C020CBSMsg.BUNJOCHI_NM, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.BUNJOCHI_NM)},
			// 分譲地区画番号メモ
			{EKK0011C020CBSMsg.BUNJOCHI_KKK_NO_MEMO, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.BUNJOCHI_KKK_NO_MEMO)},
			// 入居予定時期
			{EKK0011C020CBSMsg.NYUKYO_RSV_JK, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.NYUKYO_RSV_JK)},
			// 代理店申込受付eoスタッフユーザーＩＤ
			{EKK0011C020CBSMsg.AGNT_MKM_UK_EOSTF_USER_ID, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.AGNT_MKM_UK_EOSTF_USER_ID)},
			// 代理店申込受付量販店員カナ名（姓）
			{EKK0011C020CBSMsg.AGNT_MKM_UK_RHSTF_KANA_SEI, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.AGNT_MKM_UK_RHSTF_KANA_SEI)},
// ANK-3910-00-00対応 20210117 星野 ADD START
			// 定額サービス申込機器
			{EKK0011C020CBSMsg.TEGAK_SVC_MSKM_KIKI, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.TEGAK_SVC_MSKM_KIKI)},
// ANK-3910-00-00対応 20210117 星野 ADD END
			// 更新年月日時分秒(更新前)
			{EKK0011C020CBSMsg.UPD_DTM_BF, ekk0011a010Msg.getString(EKK0011A010CBSMsg1List.LAST_UPD_DTM)}
		};

		// サービスIF実行
		callSC(handle, scCall, param, fixedText, ekk0011c020In, new EKK0011C020CBSMsg().getContents());
	}
	
	// ANK-3210-16-00 ADD START
	/**
	 * 申込_代理店一覧照会を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ekk0021a010Msg 申込明細一意照会明細(カレント)
	 * @return 申込_代理店一覧照会明細
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] selectMskmAgnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, CAANMsg ekk0021a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込_代理店一覧照会の上りマッピング
		Object[][] ekk0071b002In =
		{
			{EKK0071B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0071B002},
			// 機能コード："1"(チェック＆登録)
			{EKK0071B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			// 申込番号
			{EKK0071B002CBSMsg.KEY_MSKM_NO, ekk0021a010Msg.getString(EKK0021A010CBSMsg1List.MSKM_NO)}
		};
		
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0071b002In, new EKK0071B002CBSMsg().getContents())
					.getCAANMsgList(EKK0071B002CBSMsg.EKK0071B002CBSMSG1LIST);
	}
	
	/**
	 * 申込_代理店チェックを行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0071b002Msg1List 申込_代理店一覧照会明細
	 * @param ekk0021a010Msg 申込明細一意照会明細(カレント)
	 * @throws CCException チェックエラーの場合
	 */
	private void checkMskmAgnt(SessionHandle handle
								, IRequestParameterReadWrite param
								, String fixedText
								, HashMap<String
								, Object> ccMsg
								, CAANMsg[] ekk0071b002Msg1List
								, CAANMsg ekk0021a010Msg) throws CCException
	{
		String tratCd1 = "";
		String tratCd2 = "";
		String tratCd3 = "";
		String tratCd4 = "";
		
		for (CAANMsg item : ekk0071b002Msg1List)
		{
			String dspJun = item.getString(EKK0071B002CBSMsg1List.DSP_JUN);
			if (DSP_JUN_1.equals(dspJun))
			{
				tratCd1 = item.getString(EKK0071B002CBSMsg1List.AGNT_CD);
			}
			else if (DSP_JUN_2.equals(dspJun))
			{
				tratCd2 = item.getString(EKK0071B002CBSMsg1List.AGNT_CD);
			}
			else if (DSP_JUN_3.equals(dspJun))
			{
				tratCd3 = item.getString(EKK0071B002CBSMsg1List.AGNT_CD);
			}
			else if (DSP_JUN_4.equals(dspJun))
			{
				tratCd4 = item.getString(EKK0071B002CBSMsg1List.AGNT_CD);
			}
		}

		int returnCode = 0;
		
		// 取扱コード存在チェック
		returnCode = checkAgntX_1Exist(tratCd1, tratCd2, tratCd3, tratCd4, ccMsg);
		// チェックエラーの場合
		errorEdit(param , returnCode);
		
		// 取扱コード1存在チェック
		returnCode = checkAgnt1Exist(tratCd1, tratCd3, ccMsg);
		// チェックエラーの場合
		errorEdit(param , returnCode);
		
		// 取扱コード重複チェック
		returnCode = checkAgntDuplicate(tratCd2, tratCd4, ccMsg);
		// チェックエラーの場合
		errorEdit(param , returnCode);
	}
	
	/**
	 * エラー情報を作成します。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param returnCode リターンコード
	 * @throws CCException チェックエラーの場合
	 */
	private void errorEdit(IRequestParameterReadWrite param, int returnCode)
	throws CCException
	{

		if (0 < returnCode)
		{
			// エラー情報設定
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, returnCode);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);

			ArrayList<Object> errList = new ArrayList<Object>();
			HashMap<String, Object> errorMap = new HashMap<String, Object>();
			HashMap<String, String> errorMapChild = new HashMap<String, String>();
			errorMap.put(ErrorInfoMapKeys.RETURN_CODE, RETURN_CODE_NORMAL);
			errorMap.put(ErrorInfoMapKeys.TEMPLATE_ID, "JKKEoelecKeiChgCC");
			errorMap.put(ErrorInfoMapKeys.STATUS, returnCode);
			errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);
			errList.add(errorMap);
			param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);

			throw new CCException(SC_ERROR_STRING, new Exception());
		}
	}
	
	/**
	 * 取扱コード存在チェックを行います。
	 * <br>
	 * @param tratCd_1_1 取扱コード1-1
	 * @param tratCd_1_2 取扱コード1-2
	 * @param tratCd_2_1 取扱コード2-1
	 * @param tratCd_2_2 取扱コード2-2
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @return リターンコード
	 */
	private int checkAgntX_1Exist(String tratCd_1_1
									, String tratCd_1_2
									, String tratCd_2_1
									, String tratCd_2_2
									, HashMap<String, Object> ccMsg)
	{
		int returnCode = 0;
		
		String updateAgnt1_1 = tratCd_1_1;
		if (ccMsg.containsKey(TRAT_CD_1_1))
		{
			updateAgnt1_1 = (String)ccMsg.get(TRAT_CD_1_1);
		}

		String updateAgnt1_2 = tratCd_1_2;
		if (ccMsg.containsKey(TRAT_CD_1_2))
		{
			updateAgnt1_2 = (String)ccMsg.get(TRAT_CD_1_2);
		}

		if (JKKStringUtil.isNullBlank(updateAgnt1_1) && !JKKStringUtil.isNullBlank((updateAgnt1_2)))
		{
			// 関連チェックエラー
			returnCode = JPCModelConstant.RELATION_ERR;
			ccMsg.put(TRAT_CD_1_1 + ERRITEM_SUFFIX, ERR_ED);
			return returnCode;
		}

		String updateAgnt2_1 = tratCd_2_1;
		if (ccMsg.containsKey(TRAT_CD_2_1))
		{
			updateAgnt2_1 = (String)ccMsg.get(TRAT_CD_2_1);
		}

		String updateAgnt2_2 = tratCd_2_2;
		if (ccMsg.containsKey(TRAT_CD_2_2))
		{
			updateAgnt2_2 = (String)ccMsg.get(TRAT_CD_2_2);
		}

		if (JKKStringUtil.isNullBlank(updateAgnt2_1) && !JKKStringUtil.isNullBlank((updateAgnt2_2)))
		{
			// 関連チェックエラー
			returnCode = JPCModelConstant.RELATION_ERR;
			ccMsg.put(TRAT_CD_2_1 + ERRITEM_SUFFIX, ERR_ED);
			return returnCode;
		}

		return returnCode;
	}

	/**
	 * 取扱コード1存在チェックを行います。
	 * <br>
	 * @param tratCd_1_1 取扱コード1-1
	 * @param tratCd_2_1 取扱コード2-1
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @return リターンコード
	 */
	private int checkAgnt1Exist(String tratCd_1_1, String tratCd_2_1, HashMap<String, Object> ccMsg)
	{
		int returnCode = 0;

		String updateAgnt1_1 = tratCd_1_1;
		if (ccMsg.containsKey(TRAT_CD_1_1))
		{
			updateAgnt1_1 = (String)ccMsg.get(TRAT_CD_1_1);
		}

		String updateAgnt2_1 = tratCd_2_1;
		if (ccMsg.containsKey(TRAT_CD_2_1))
		{
			updateAgnt2_1 = (String)ccMsg.get(TRAT_CD_2_1);
		}

		if (JKKStringUtil.isNullBlank(updateAgnt1_1) && !JKKStringUtil.isNullBlank((updateAgnt2_1)))
		{
			// 関連チェックエラー
			returnCode = JPCModelConstant.RELATION_ERR;
			ccMsg.put(TRAT_CD_1_1 + ERRITEM_SUFFIX, ERR_EC);
			return returnCode;
		}
		
		return returnCode;
	}

	/**
	 * 取扱コード重複チェックを行います。
	 * <br>
	 * @param tratCd_1_2 取扱コード1-2
	 * @param tratCd_2_2 取扱コード2-2
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @return リターンコード
	 */
	private int checkAgntDuplicate(String tratCd_1_2, String tratCd_2_2, HashMap<String, Object> ccMsg)
	{
		int returnCode = 0;

		String updateAgnt1_2 = tratCd_1_2;
		if (ccMsg.containsKey(TRAT_CD_1_2))
		{
			updateAgnt1_2 = (String)ccMsg.get(TRAT_CD_1_2);
		}

		String updateAgnt2_2 = tratCd_2_2;
		if (ccMsg.containsKey(TRAT_CD_2_2))
		{
			updateAgnt2_2 = (String)ccMsg.get(TRAT_CD_2_2);
		}

		if (!JKKStringUtil.isNullBlank(updateAgnt1_2) && updateAgnt1_2.equals(updateAgnt2_2))
		{
			// 関連チェックエラー
			returnCode = JPCModelConstant.RELATION_ERR;
			ccMsg.put(TRAT_CD_1_2 + ERRITEM_SUFFIX, ERR_ED);
			return returnCode;
		}

		return returnCode;
	}
	
	/**
	 * 申込_代理店削除を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0071b002Msg1List 申込_代理店一覧照会
	 * @throws Throwable 例外が発生した場合
	 */
	private void deleteMskmAgnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> ccMsg, CAANMsg[] ekk0071b002Msg1List)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		for (CAANMsg item : ekk0071b002Msg1List)
		{
			String dspJun = item.getString(EKK0071B002CBSMsg1List.DSP_JUN);
			if (DSP_JUN_1.equals(dspJun) && ccMsg.containsKey(TRAT_CD_1_1))
			{
				deleteMskmAgnt2(handle, param, fixedText, item);
			}
			else if (DSP_JUN_2.equals(dspJun) && ccMsg.containsKey(TRAT_CD_1_2))
			{
				deleteMskmAgnt2(handle, param, fixedText, item);
			}
			else if (DSP_JUN_3.equals(dspJun) && ccMsg.containsKey(TRAT_CD_2_1))
			{
				deleteMskmAgnt2(handle, param, fixedText, item);
			}
			else if (DSP_JUN_4.equals(dspJun) && ccMsg.containsKey(TRAT_CD_2_2))
			{
				deleteMskmAgnt2(handle, param, fixedText, item);
			}
		}

	}

	/**
	 * 申込_代理店削除を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param targetRec 申込_代理店一覧照会
	 * @throws Throwable 例外が発生した場合
	 */
	private void deleteMskmAgnt2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, CAANMsg targetRec) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 申込_代理店削除の上りマッピング
		Object[][] ekk0071e020In =
		{
			{EKK0071E020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0071E020},
			// 機能コード："1"(チェック＆削除)
			{EKK0071E020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			// 申込番号
			{EKK0071E020CBSMsg.MSKM_NO, targetRec.getString(EKK0071B002CBSMsg1List.MSKM_NO)},
			// 代理店コード
			{EKK0071E020CBSMsg.AGNT_CD, targetRec.getString(EKK0071B002CBSMsg1List.AGNT_CD)},
			// 申込＿代理店番号
			{EKK0071E020CBSMsg.MSKM_AGNT_NO, "00" + targetRec.getString(EKK0071B002CBSMsg1List.DSP_JUN)},
			// 更新年月日時分秒(更新前)
			{EKK0071E020CBSMsg.UPD_DTM_BF, targetRec.getString(EKK0071B002CBSMsg1List.UPD_DTM)}
		};
		
		callSC(handle, scCall, param, fixedText, ekk0071e020In, new EKK0071E020CBSMsg().getContents());
	}
	
	/**
	 * 申込_代理店登録を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg eo電気契約情報変更CCマップ
	 * @param ekk0021a010Msg 申込明細一意照会明細(カレント)
	 * @throws Throwable 例外が発生した場合
	 */
	private void addMskmAgnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> ccMsg, CAANMsg ekk0021a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		for (int i = 0 ; i < TRAT_LIST.length; i++)
		{
			if (ccMsg.containsKey(TRAT_LIST[i]))
			{
				// 登録します。
				if (!JKKStringUtil.isNullBlank((String)ccMsg.get(TRAT_LIST[i])))
				{
					addMskmAgnt2(handle, param, fixedText, ekk0021a010Msg.getString(EKK0021A010CBSMsg1List.MSKM_NO), (String)ccMsg.get(TRAT_LIST[i]), i + 1);
				}
			}
		}
	}
	
	/**
	 * 申込_代理店登録を実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param mskmNo 申込番号
	 * @param tratCd 代理店コード
	 * @param dspJun 表示順
	 * @throws Throwable 例外が発生した場合
	 */
	private void addMskmAgnt2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String mskmNo, String tratCd, int dspJun)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 申込_代理店登録の上りマッピング
		Object[][] ekk0071d010In =
		{
			{EKK0071D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0071D010},
			// 機能コード："1"(チェック＆登録)
			{EKK0071D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			// 申込番号
			{EKK0071D010CBSMsg.MSKM_NO, mskmNo},
			// 代理店コード
			{EKK0071D010CBSMsg.AGNT_CD, tratCd},
			// 申込＿代理店番号
			{EKK0071D010CBSMsg.MSKM_AGNT_NO, "00" + String.valueOf(dspJun)},
			// 表示順序
			{EKK0071D010CBSMsg.DSP_JUN, String.valueOf(dspJun)}
		};
		
		callSC(handle, scCall, param, fixedText, ekk0071d010In, new EKK0071D010CBSMsg().getContents());
	}
	// ANK-3210-16-00 ADD END
	
	/**
	 * BPチェック用パラメータ作成。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return BPチェック用パラメータ
	 */
	public HashMap<?, ?> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// BPチェックはスキップする
		return JCKPmpScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。<br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCKPmpScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData,
							Object[][] contents) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData, contents);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}

		return msg;
	}

	/**
	 * 共通項目のメッセージを作成します。
	 * @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]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData,
														Object[][] contents) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			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);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);

		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith(ERRITEM_SUFFIX))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					// エラー項目名が"key_xxx_err"の場合は、"key_"を削除する
					if (itemNm.startsWith(KEYITEM_PREFIX))
					{
						itemNm = itemNm.substring(KEYITEM_PREFIX.length());
					}
					// エラー項目名が「同時申込eo光申込書番号エラー」の場合
					else if (EKK0021C120CBSMsg.DOJI_MSKM_EOH_MSKMSHO_NO_ERR.equals(itemNm))
					{
						itemNm = "eoh_mskmsho_no_err";
					}
					// ANK-3210-16-00 ADD START
					// エラー項目名が「代理店コードエラー」の場合
					else if (EKK0071D010CBSMsg.AGNT_CD_ERR.equals(itemNm))
					{
						String dspJun = (String)template.getString(EKK0071D010CBSMsg.DSP_JUN);
						if (DSP_JUN_1.equals(dspJun))
						{
							itemNm = TRAT_CD_1_1 + ERRITEM_SUFFIX;
						}
						else if(DSP_JUN_2.equals(dspJun))
						{
							itemNm = TRAT_CD_1_2 + ERRITEM_SUFFIX;
						}
						else if(DSP_JUN_3.equals(dspJun))
						{
							itemNm = TRAT_CD_2_1 + ERRITEM_SUFFIX;
						}
						else if(DSP_JUN_4.equals(dspJun))
						{
							itemNm = TRAT_CD_2_2 + ERRITEM_SUFFIX;
						}
						
						// 代理店存在チェック
						if (ERR_EA.equals(errCd))
						{
							errCd = ERR_EB;
						}
						// 代理店有効チェック
						else if (ERR_EB.equals(errCd))
						{
							errCd = ERR_EC;
						}
					}
					int keyIdx = itemNm.lastIndexOf(ERRITEM_SUFFIX);
					if (inMap.containsKey(itemNm.substring(0, keyIdx)))
					{
					// ANK-3210-16-00 ADD END
						inMap.put(itemNm, errCd);
					// ANK-3210-16-00 ADD START
					}
					// ANK-3210-16-00 ADD END
				}
			}
		}

		return param;
	}
}
