/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKeiHimoUpdAddChkCC
*	ソースファイル名：JKKKeiHimoUpdAddChkCC.java
*	作成者			：FAP)川田
*	日付			：2011年12月21日
*＜機能概要＞
*	サービス契約紐付変更登録の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/21	FJ)川田		新規作成
*	v4.00.00	2012/10/18	FJ)稲岡		【ANK-0024-05-00】対応
*	v6.00.00	2013/12/10	FJ)稲岡		【OM-2013-0005091】対応 部屋番号チェック削除
*	v8.00.00	2013/12/14	FJ)稲岡		【ANK-1584-00-00】対応 L2-MVNO(本体)
*   v10.00.00   2014/11/04	FJ)舩橋		【ANK-2273-00-00】対応
*   v11.00.00   2014/11/27	FJ)舩橋		【ANK-2250-00-00】対応
*   v16.00.00   2015/04/28	FJ)頼経		【ANK-2480-00-00】対応 新電力
*	v26.00.00	2016/08/05	FJ)柳		【ANK-2661-00-00】未来予約データ取消し処理改善
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.reqchk.JKKSeikyDojiHeigoReqChk;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.common.ConditionValueCustom;
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.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg;
//ANK-2250-00-00 ADD START
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg1List;
//ANK-2250-00-00 ADD END
import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B006CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0501A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;
//ANK-2273-00-00 ADD START
import eo.ejb.cbs.cbsmsg.EKK2951A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2951A010CBSMsg;
// ANK-2273-00-00 ADD END

/**
 * サービス契約紐付変更登録時のチェックを行います。<p>
 * <BR>
 * @author 富士通
 */
public class JKKKeiHimoUpdAddChkCC extends AbstractCommonComponent
{
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/** テンプレートID(サービス契約一覧照会（SYSID）) */
	private static final String TEMPLATE_ID_EKK0081B002 = "EKK0081B002";
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	/** テンプレートID(お客様一意照会) */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** テンプレートID(サービス契約一覧照会（SYSID）2) */
	private static final String TEMPLATE_ID_EKK0081B004 = "EKK0081B004";
	/** テンプレートID(サービス契約内訳一覧照会（SYSID）) */
	private static final String TEMPLATE_ID_EKK0161B003 = "EKK0161B003";
	/** テンプレートID(業務パラメータ管理一意照会) */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	/** テンプレートID(割引サービス適用中件数取得一覧照会) */
	private static final String TEMPLATE_ID_EKK0451B003 = "EKK0451B003";
	/** テンプレートID(請求契約番号／SYSID一覧照会) */
	private static final String TEMPLATE_ID_EKK0321B001 = "EKK0321B001";
	
	// ANK-2273-00-00 ADD START
	/** ＣＩＣ参照用請求契約一意照会 */
	private static final String TEMPLATE_ID_EKK2951A010 = "EKK2951A010";
	// ANK-2273-00-00 ADD END
	
	/** 関連エラー(契約者タイプエラー) */
	private static final String KANREN_ERR_KEI_TYPE = "EKB5080-KW";
/* ++++++++++ v6.00.00 削除開始 ++++++++++ */
//	/** 関連エラー(部屋番号エラー) */
//	private static final String KANREN_ERR_ADRRM = "EKB5090-KW";
/* ++++++++++ v6.00.00 削除終了 ++++++++++ */
	/** 関連エラー(サービス契約上限超えエラー) */
	private static final String KANREN_ERR_SVC_MAX = "EKB5100-KW";
	/** 関連エラー(公衆無線LANサービス契約上限超えエラー) */
	private static final String KANREN_ERR_KOSMU_LAN_MAX = "EKB5110-KW";
	/** 関連エラー(請求契約件数チェックエラー) */
	private static final String KANREN_ERR_SEIKYU_NO = "EKB5120-KW";
	/** 関連エラー(ファミリーパック契約数チェックワーニング) */
	private static final String KANREN_WAR_FMYPK_CNT = "EKB4930--Q";;
	
	/** 業務パラメータID(併合契約件数上限) */
	private static final String GYM_PRM_ID_HEIGO_KEI_MAX_CNT = "KK_HEIGO_KEI_MAX_CNT";
	/** 業務パラメータID(公衆無線LAN契約件数上限) */
	private static final String GYM_PRM_ID_KOSMU_LAN_MAX_CN = "KK_KOSMU_LAN_MAX_CNT";
	/** 業務パラメータID(ファミリーパック契約件数上限) */
	private static final String GYM_PRM_ID_FAMI_PACK_MAX_CNT = "KK_FAMI_PACK_MAX_CNT";
	
	/** 請求先同時併合チェック＿ＯＮ */
	private static final String SEIKY_DOJI_HEIGO_CHK_ON = "ON";
	
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
	/** テンプレートID(請求契約一意照会) */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";
	/** テンプレートID(口座一意照会) */
	private static final String TEMPLATE_ID_EKK0501A010 = "EKK0501A010";
	
	/** 関連エラー(契約状態チェックエラー・支払方法チェックエラー) */
	private static final String KANREN_ERR_MVNO = "EKB5440-JW";
	/** 関連エラー(支払方法チェックエラー(請求契約)) */
	private static final String KANREN_ERR_MVNO_PAYWAY_SEIKY = "E1";
	/** 関連エラー(支払方法チェックエラー(口座)) */
	private static final String KANREN_ERR_MVNO_PAYWAY_KOZA = "E2";
	
	/** 遷移元＿異動区分選択画面 */
	private static final String MT_SCREEN_ID_KKW00145 = "1";
	
	/** 新規コード "0":継続 */
	public static final String NEW_CD_KEIZK  = "0";
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite checkKeiHimoUpdAdd(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
		//***********************************************************
		// 併合先サービス契約番号取得
		//***********************************************************
		//【併合先】サービス契約一覧照会（SYSID）パラメータ設定
		paramMap = editInMsg_EKK0081B002(param, fixedText);
		
		// ◇ SC呼出実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング
		param = editOutMsg_EKK0081B002(result, param, fixedText);
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
		
		//***********************************************************
		// 契約者タイプチェック
		// ※エラー
		//***********************************************************
		// 【併合元】お客様一意照会 パラメータ設定
		paramMap = new HashMap<String, Object>();
		paramMap = editInMsg_ECK0011A010(param, fixedText, "mt_sysid");
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング
		editOutMsg_ECK0011A010(result, param, fixedText,"mt_keisha_type");
		
		//【併合先】お客様一意照会 パラメータ設定
		paramMap = new HashMap<String, Object>();
		paramMap = editInMsg_ECK0011A010(param, fixedText, "sk_sysid");
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング
		param = editOutMsg_ECK0011A010(result, param, fixedText, "sk_keisha_type");
		
/* ++++++++++ v6.00.00 変更開始 ++++++++++ */
//		// 契約者タイプと部屋番号のチェック
//		if(!chkKeishaType(param) || !chkAdrrm(param, fixedText))
//		{
//			return param;
//		}
		
		// 契約者タイプチェック
		if(!chkKeishaType(param))
		{
			return param;
		}
/* ++++++++++ v6.00.00 変更終了 ++++++++++ */
		
		//***********************************************************
		// 併合契約件数上限チェック
		// ※エラー
		//***********************************************************
		// ◇ 上りマッピング処理
		paramMap = new HashMap<String, Object>();
		
		// 併合契約上限件数取得
		paramMap = editInMsg_EZM0321A010(param, GYM_PRM_ID_HEIGO_KEI_MAX_CNT);
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EZM0321A010(result, param, fixedText, "1");
		
		//【併合先】サービス契約一覧照会（SYSID）2 パラメータ設定
		paramMap = editInMsg_EKK0081B004(param, fixedText);
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング
		param = editOutMsg_EKK0081B004(result, param, fixedText);
		
		// 併合契約件数上限チェック
		if(!chkSvcKeiCount(param, fixedText))
		{
			return param;
		}
		
		//***********************************************************
		// 公衆無線LAN件数上限チェック
		// ※エラー
		//***********************************************************
		// ◇ 上りマッピング処理
		paramMap = new HashMap<String, Object>();
		
		// 公衆無線LAN契約上限件数取得
		paramMap = editInMsg_EZM0321A010(param, GYM_PRM_ID_KOSMU_LAN_MAX_CN);
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EZM0321A010(result, param, fixedText, "2");
		
		//【併合先】サービス契約内訳一覧照会（SYSID）パラメータ設定
		paramMap = editInMsg_EKK0161B003(param, fixedText, "sk_sysid");
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// 下りマッピング
		param = editOutMsg_EKK0161B003(result, param, fixedText, "sk_kosmu_lan_count");
		
		// ◇ 上りマッピング処理
		paramMap = new HashMap<String, Object>();
		
		// 【併合元】サービス契約内訳一覧照会（SYSID）パラメータ設定
		paramMap = editInMsg_EKK0161B003(param, fixedText, "mt_sysid");
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング
		param = editOutMsg_EKK0161B003(result, param, fixedText, "mt_kosmu_lan_count");
		
		// 公衆無線LAN件数上限チェック
		if(!chkKosmuLanCount(param))
		{
			return param;
		}
		
		//***********************************************************
		// 請求契約件数チェック
		// ※エラー
		//***********************************************************
		// 実行判定クラス
		JKKSeikyDojiHeigoReqChk seikyDojiHeigoReqChk = new JKKSeikyDojiHeigoReqChk();
		
		// 実行条件
		ConditionValueCustom condValue = new ConditionValueCustom("ON");
		
		// 請求先同時併合が選択されている場合
		if(seikyDojiHeigoReqChk.checkExecution(param, condValue))
		{
			// 請求契約件数チェック
			// ◇ 上りマッピング処理
			paramMap = new HashMap<String, Object>();
			
			// 請求契約番号／SYSID一覧照会のパラメータ設定
			paramMap = editInMsg_EKK0321B001(param, fixedText);
			
			// ◇ SC呼出実行
			result = scCall.run(paramMap, handle);
			
			// ◇ 下りマッピング
			param = editOutMsg_EKK0321B001(result, param, fixedText);
			
			// 請求契約件数チェック
			if(!chkSeikyKeiNo(param))
			{
				return param;
			}
		}
		
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
		// ユーザデータ情報取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 作業項目領域取得
		HashMap<String, Object> work01Map = getWork01Map(param);
		
		// ANK-2661-00-00 2016/08/05 ADD START
		//***********************************************************
		// 請求契約件数チェック
		// ※ワーニング
		//***********************************************************
		// 画面項目『請求先同時併合』が選択されている場合
		if(SEIKY_DOJI_HEIGO_CHK_ON.equals((String)work01Map.get("seiky_doji_heigo")))
		{
			// 併合元サービス契約(チェック有)一覧
			ArrayList<HashMap<String, String>> keiSvcList = (ArrayList<HashMap<String, String>>)inMap.get("svc_kei_list");
			
			for(int i = 0; i < keiSvcList.size(); i++)
			{
				Object[][] ekk0491a010InMsg = {{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010},
						{EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
						{EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, null},
						{EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, JKKStrConst.END_YMD_DEFAULT},
						{EKK0491A010CBSMsg.KEY_GENE_ADD_DTM, null}};
				
				//**********************************************************
				// 併合元：請求契約一意照会
				//**********************************************************
				String heigoMtSeikyKeiNo = (String)inMap.get("mt_seiky_kei_no");
				
				// 併合元の請求契約に予約が存在する場合、請求契約併合元予約有無フラグ：有
				if (isSeikyKeiRsv(handle, param, fixedText, scCall, ekk0491a010InMsg, heigoMtSeikyKeiNo))
				{
					work01Map.put("seiky_kei_heigo_mt_rsv_um_flg", "1");
				}
				
				//**********************************************************
				// 併合先：請求契約一意照会
				//**********************************************************
				String heigoSkSeikyKeiNo = (String)inMap.get("sk_seiky_kei_no");
				
				// 併合先の請求契約に予約が存在する場合、請求契約併合先予約有無フラグ：有
				if (isSeikyKeiRsv(handle, param, fixedText, scCall, ekk0491a010InMsg, heigoSkSeikyKeiNo))
				{
					work01Map.put("seiky_kei_heigo_sk_rsv_um_flg", "1");
				}
			}
		}
		// ANK-2661-00-00 2016/08/05 ADD END
		
		// 遷移元＝異動区分選択画面の場合
		if(MT_SCREEN_ID_KKW00145.equals((String)inMap.get("senimoto_flg")))
		{
			// 請求先同時併合の場合
			if(SEIKY_DOJI_HEIGO_CHK_ON.equals((String)work01Map.get("seiky_doji_heigo")))
			{
				//***********************************************************
				// 支払方法チェック
				// ※エラー
				//***********************************************************
				if(!chkPayWay(handle, scCall, param, fixedText,inMap, work01Map))
				{
					return param;
				}
				
			}
		}
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
		
		// ANK-2273-00-00 ADD START
		boolean cicChkFlg = false;

		// 請求同時併合の場合
		if(seikyDojiHeigoReqChk.checkExecution(param, condValue) && !isEmpty((String)inMap.get("mt_seiky_kei_no"))) {
			// ＣＩＣ参照用請求契約一意照会(併合元)
			Object[][] ekk2951a010In = {{EKK2951A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2951A010},
										{EKK2951A010CBSMsg.FUNC_CODE, "1"},
										{EKK2951A010CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("mt_seiky_kei_no")}};
			
			CAANMsg[] ekk2951a010Out = callSC(handle, scCall, param, fixedText, ekk2951a010In).getCAANMsgList(EKK2951A010CBSMsg.EKK2951A010CBSMSG1LIST);

			// 通常連携以外の場合、NG
			if (ekk2951a010Out != null && ekk2951a010Out.length != 0 &&
				!"00".equals(ekk2951a010Out[0].getString(EKK2951A010CBSMsg1List.CIC_RNKI_NAIYO_CD))) {
				cicChkFlg = true;
			}

			if (!cicChkFlg) {
				// ＣＩＣ参照用請求契約一意照会(併合先)
				Object[][] ekk2951a010In2 = {{EKK2951A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2951A010},
											{EKK2951A010CBSMsg.FUNC_CODE, "1"},
											{EKK2951A010CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("sk_seiky_kei_no")}};
				
				CAANMsg[] ekk2951a010Out2 = callSC(handle, scCall, param, fixedText, ekk2951a010In2).getCAANMsgList(EKK2951A010CBSMsg.EKK2951A010CBSMSG1LIST);

				// 通常連携以外の場合、NG
				if (ekk2951a010Out2 != null && ekk2951a010Out2.length != 0 &&
					!"00".equals(ekk2951a010Out2[0].getString(EKK2951A010CBSMsg1List.CIC_RNKI_NAIYO_CD))) {
					cicChkFlg = true;
				}
			}
		}

		HashMap<String, Object> work01Map2 = getWork01Map(param);
		work01Map2.put("cic_chk_flg", cicChkFlg);
		// ANK-2273-00-00 ADD END
		
		// ANK-2250-00-00 ADD START
		//【併合元】ＭＶＮＯサービス契約確認
		paramMap = editInMsg_EKK0081B002_MVNO(param, (String)inMap.get("mt_sysid"));
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EKK0081B002_MOTO(result, param, fixedText);

		//【併合先】ＭＶＮＯサービス契約確認
		paramMap = editInMsg_EKK0081B002_MVNO(param, (String)inMap.get("sk_sysid"));
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EKK0081B002_SAKI(result, param, fixedText);
		// ANK-2250-00-00 ADD END
		
		//***********************************************************
		// ファミリーパック件数上限チェック
		// ※ワーニング
		//***********************************************************
		// ◇ 上りマッピング処理
		paramMap = new HashMap<String, Object>();
		
		// ファミリーパック契約上限件数取得
		paramMap = editInMsg_EZM0321A010(param, GYM_PRM_ID_FAMI_PACK_MAX_CNT);
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EZM0321A010(result, param, fixedText, "3");
		
		//【併合元】割引サービス適用中件数取得
		paramMap = editInMsg_EKK0451B003(param, inMap, (String)inMap.get("sk_sysid"));
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EKK0451B003(result, param, fixedText, true);
		
		//【併合先】割引サービス適用中件数取得
		paramMap = editInMsg_EKK0451B003(param, inMap, (String)inMap.get("mt_sysid"));
		result = scCall.run(paramMap, handle);
		param = editOutMsg_EKK0451B003(result, param, fixedText, false);
		
		// ファミリーパック件数上限チェック
		chkFamPkLimitCnt(param, fixedText);
		
		// ANK-2480-00-00 ADD START
		boolean denkiWarningFlg = false;
		
		// 作業項目領域取得
		HashMap<String, Object> work03Map = getWork01Map(param);
		
		// 請求先同時併合の場合
		if(SEIKY_DOJI_HEIGO_CHK_ON.equals((String)work03Map.get("seiky_doji_heigo")))
		{
			// 併合元サービス契約(チェック有)一覧
			ArrayList<HashMap<String, String>> keiSvcList = (ArrayList<HashMap<String, String>>)inMap.get("svc_kei_list");
			HashMap<String, String> keiSvcMap = null;
				
			for(int i=0; i<keiSvcList.size(); i++)
			{
				keiSvcMap = keiSvcList.get(i);
				
				// サービスコード
				String svcCd = keiSvcMap.get("svc_cd");
				
				// サービスが"05":ｅｏ電気の場合
				if(JKKStrConst.CD00130_05.equals(svcCd))
				{
					// 支払方法チェック(請求併合先)
					if(!isChkSeikyHeigoSk(handle, scCall, param, fixedText, inMap, work03Map))
					{
						// ワーニング情報を設定
						denkiWarningFlg = true;
						
					}
				}
			}
		}
		work03Map.put("denki_warning_flg", denkiWarningFlg);
		// ANK-2480-00-00 ADD END
		
		return param;
	}
	
	/**
	 * チェック処理です。<br>
	 * <br>
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws RequestParameterException {
	
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		
		return paramMap;
	}
	
	/**
	 * お客様一意照会用のメッセージを作成します。
	 * 
	 * @param param
	 * @param fixedText
	 * @param key
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_ECK0011A010(IRequestParameterReadWrite param,
															String fixedText,
															String key) throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(ECK0011A010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010);
		// 機能コード
		template.set(ECK0011A010CBSMsg.FUNC_CODE, "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);
		
		// ◇ 業務データの設定
		// お客様一意照会マップ.ＫＥＹ＿ＳＹＳＩＤ → ＫＥＹ＿ＳＹＳＩＤ
		String temp = (String)inMap.get(key);
		if (isEmpty(temp))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_SYSID, temp);
		}
		
		// お客様一意照会マップ.ＫＥＹ＿世代登録年月日時分秒 → ＫＥＹ＿世代登録年月日時分秒
		temp = (String)inMap.get("key_gene_add_dtm");
		if (isEmpty(temp))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM, temp);
		}
		
		// お客様一意照会マップ.ＫＥＹ＿予約適用年月日 → ＫＥＹ＿予約適用年月日
		temp = (String)inMap.get("key_rsv_aply_ymd");
		if (isEmpty(temp))
		{
			template.setNull(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD);
		}
		else
		{
			template.set(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, temp);
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/**
	 * サービス契約一覧照会（ＳＹＳＩＤ）用のメッセージを作成します。
	 * 
	 * @param param
	 * @param fixedText
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0081B002(IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0081B002CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0081B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B002);
		// 機能コード
		template.set(EKK0081B002CBSMsg.FUNC_CODE, "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(EKK0081B002CBSMsg.SEARCH_TYPE, "1");
		template.set(EKK0081B002CBSMsg.DISPLAY_NUM, "100");
		template.set(EKK0081B002CBSMsg.DISPLAY_PAGE_NUM, "1");
		
		// ◇ 業務データの設定
		// 契約紐付更新登録チェックマップ.ＫＥＹ＿ＳＹＳＩＤ → ＫＥＹ＿ＳＹＳＩＤ
		String temp = (String)inMap.get("sk_sysid");
		if (isEmpty(temp))
		{
			template.setNull(EKK0081B002CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(EKK0081B002CBSMsg.KEY_SYSID, temp);
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	
	/**
	 * サービス契約一覧照会（ＳＹＳＩＤ）２用のメッセージを作成します。
	 * 
	 * @param param
	 * @param fixedText
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0081B004(IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0081B004CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0081B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B004);
		// 機能コード
		template.set(EKK0081B004CBSMsg.FUNC_CODE, "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(EKK0081B004CBSMsg.SEARCH_TYPE, "1");
		template.set(EKK0081B004CBSMsg.DISPLAY_NUM, "100");
		template.set(EKK0081B004CBSMsg.DISPLAY_PAGE_NUM, "1");
		template.set(EKK0081B004CBSMsg.MAX_SEARCH_NUM, "2000");
		
		// ◇ 業務データの設定
		// 契約紐付更新登録チェックマップ.ＫＥＹ＿ＳＹＳＩＤ → ＫＥＹ＿ＳＹＳＩＤ
		String temp = (String)inMap.get("sk_sysid");
		if (isEmpty(temp))
		{
			template.setNull(EKK0081B004CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(EKK0081B004CBSMsg.KEY_SYSID, temp);
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービス契約内訳一覧照会（ＳＹＳＩＤ）用のメッセージを作成します。
	 * 
	 * @param param
	 * @param fixedText
	 * @param key
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0161B003(IRequestParameterReadWrite param,
															String fixedText,
															String key)
															throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0161B003CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0161B003CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0161B003);
		// 機能コード
		template.set(EKK0161B003CBSMsg.FUNC_CODE, "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);
		
		// ◇ 業務データの設定
		// 契約紐付更新登録チェックマップ.ＳＹＳＩＤ → ＫＥＹ＿ＳＹＳＩＤ
		String temp = (String)inMap.get(key);
		if (isEmpty(temp))
		{
			template.setNull(EKK0161B003CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(EKK0161B003CBSMsg.KEY_SYSID, temp);
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 請求契約番号／SYSID一覧照会用のメッセージを作成します。
	 * 
	 * @param param
	 * @param fixedText
	 * @param key
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0321B001(IRequestParameterReadWrite param,
															String fixedText)
															throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0321B001CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0321B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B001);
		// 機能コード
		template.set(EKK0321B001CBSMsg.FUNC_CODE, "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(EKK0321B001CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("sk_seiky_kei_no"));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 業務パラメータ管理一意照会 メッセージ作成
	 * 
	 * @param param				リクエストパラメータ
	 * @param keyWorkParamID	ＫＥＹ＿業務パラメータＩＤ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_EZM0321A010(IRequestParameterReadWrite param, String keyWorkParamID) throws RequestParameterException
	{
		
		// 共通領域の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EZM0321A010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010);
		// 機能コード
		template.set(EZM0321A010CBSMsg.FUNC_CODE, "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);
		// 業務パラメータ管理一意照会マップ.ＫＥＹ＿業務パラメータID → ＫＥＹ＿業務パラメータＩＤ
		template.set(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, keyWorkParamID);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 割引サービス適用中件数取得一覧照会用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @param sysId
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_EKK0451B003(IRequestParameterReadWrite param,
															HashMap<String, Object> inMap, 
															String sysId)
															throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0451B003CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0451B003CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0451B003);
		// 機能コード
		template.set(EKK0451B003CBSMsg.FUNC_CODE, "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(EKK0451B003CBSMsg.KEY_SYSID, sysId);
		// 割引サービス適用中件数取得一覧照会.ＫＥＹ＿割引サービスコード
		template.set(EKK0451B003CBSMsg.KEY_WRIB_SVC_CD, (String)inMap.get("key_wrib_svc_cd"));
		// 割引サービス適用中件数取得一覧照会.ＫＥＹ＿サービス終了年月日
		template.set(EKK0451B003CBSMsg.KEY_SVC_ENDYMD, (String)inMap.get("key_rsv_aply_ymd"));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 上りメッセージの共通領域を設定します。
	 * 
	 * @param param
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param) 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));
		
		return paramMap;
	}
	
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0081B002(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業項目領域取得
		HashMap<String, Object> work01Map = getWork01Map(param);
		
		// サービス契約一覧照会（SYSID）明細
		templateArray = parentTemplate.getCAANMsgList(EKK0081B002CBSMsg.EKK0081B002CBSMSG1LIST);
		
		if (templateArray != null && templateArray.length > 0){
			
			CAANMsg childTemplate = templateArray[0];
			
			if (!childTemplate.isNull(EKK0081B004CBSMsg1List.SVC_KEI_NO)) {
				
				work01Map.put("sk_svc_kei_no", childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_NO));
			}
		}
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0081B002(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param key
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_ECK0011A010(Map<?, ?> msgList,
													IRequestParameterReadWrite param, 
													String fixedText,
													String key) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		if (workDataMap == null)
		{
			workDataMap = new HashMap<String, Object>();
		}
		
		// お客様一意照会明細
		templateArray = parentTemplate.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		if (templateArray != null)
		{
			CAANMsg childTemplate = templateArray[0];
			
			// 契約者タイプ
			if (childTemplate.isNull(ECK0011A010CBSMsg1List.KEISHA_TYPE_CD))
			{
				workDataMap.put(key, "");
			}
			else
			{
				workDataMap.put(key, childTemplate.getString(ECK0011A010CBSMsg1List.KEISHA_TYPE_CD));
			}
			
/* ++++++++++ v6.00.00 削除開始 ++++++++++ */
//			// 併合先検索の場合
//			if(key.startsWith("sk"))
//			{
//				// 部屋番号
//				if (childTemplate.isNull(ECK0011A010CBSMsg1List.KEISHA_ADRRM))
//				{
//					workDataMap.put("sk_adrrm", "");
//				}
//				else
//				{
//					workDataMap.put("sk_adrrm", childTemplate.getString(ECK0011A010CBSMsg1List.KEISHA_ADRRM));
//				}
//			}
/* ++++++++++ v6.00.00 削除終了 ++++++++++ */
		}
		
		workMap.put("WORK", workDataMap);
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_ECK0011A010(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0081B004(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		if (workDataMap == null)
		{
			workDataMap = new HashMap<String, Object>();
		}
		
		// サービス契約件数
		int count = 0;
		
		// サービス契約一覧照会（SYSID）2明細
		templateArray = parentTemplate.getCAANMsgList(EKK0081B004CBSMsg.EKK0081B004CBSMSG1LIST);
		
		if (templateArray != null)
		{
			CAANMsg childTemplate = null;
			String svcKeiStat = null;
			
			for(int i=0; i<templateArray.length; i++)
			{
				childTemplate = templateArray[i];
				
				if (childTemplate.isNull(EKK0081B004CBSMsg1List.SVC_KEI_STAT))
				{
					continue;
				}
				else
				{
					// サービス契約ステータス
					svcKeiStat = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_STAT);
					
					if(!"910".equals(svcKeiStat) && !"920".equals(svcKeiStat) )
					{
						count++;
					}
				}
			}
		}
		
		workDataMap.put("svc_kei_count", String.valueOf(count));
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0081B004(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param key
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0161B003(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText,
																String key) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		if (workDataMap == null)
		{
			workDataMap = new HashMap<String, Object>();
		}
		
		// サービス契約件数
		int count = 0;
		
		// サービス契約内訳一覧照会（SYSID）明細
		templateArray = parentTemplate.getCAANMsgList(EKK0161B003CBSMsg.EKK0161B003CBSMSG1LIST);
		
		if (templateArray != null)
		{
			CAANMsg childTemplate = null;
			String svcKeUcwkStat = null;
			String svc_kei_ucwk_no = null;
			ArrayList<HashMap<String,String>> svckeiList = null;
			HashSet<String> set = null;
			
			// ユーザデータ情報
			HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
			
			// 併合元の検索処理の場合
			if(key.startsWith("mt_"))
			{
				svckeiList = (ArrayList<HashMap<String,String>>)inMap.get("svc_kei_list");
				set = new HashSet(); 
				HashMap<String, String> svcMap = null;
				for(int i=0; i<svckeiList.size(); i++){
					svcMap = svckeiList.get(i);
					set.add(svcMap.get("l_svc_kei_ucwk_no"));
				}
			}
			
			for(int i=0; i<templateArray.length; i++)
			{
				childTemplate = templateArray[i];
				
				if (childTemplate.isNull(EKK0161B003CBSMsg1List.SVC_KEI_UCWK_STAT))
				{
					continue;
				}
				else
				{
					// サービス契約内訳ステータス
					svcKeUcwkStat = childTemplate.getString(EKK0161B003CBSMsg1List.SVC_KEI_UCWK_STAT);
					
					if(!"910".equals(svcKeUcwkStat) && !"920".equals(svcKeUcwkStat))
					{
						// サービス契約内訳番号
						svc_kei_ucwk_no = childTemplate.getString(EKK0161B003CBSMsg1List.SVC_KEI_UCWK_NO);
						
						// 併合元サービス契約一覧で未選択の場合カウントしない
						if(!isNull(set) && !set.contains(svc_kei_ucwk_no))
						{
							continue;
						}
						
						count++;
					}
				}
			}
		}
		
		// 公衆無線LAN契約数
		workDataMap.put(key, String.valueOf(count));
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0161B003(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * @param msgList (I) CAANMsgクラス 
	 * @param param (I) 業務データ取得・書込用I/F
	 * @return 業務データ取得・書込用I/F
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EZM0321A010(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText, 
																String setMaxCntFlg) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 結果を詰めるマップを取得
		ArrayList<HashMap<String, Object>> dataList = null;
		
		// 業務データ設定
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(fixedText, dataMap);
		}
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		// 作業項目マップ
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		if (workDataMap == null) {
			workDataMap = new HashMap();
		}
		
		templateArray = parentTemplate.getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		dataList = (ArrayList)dataMap.get("EZM0321A010CBSMsg1List");
		
		if (dataList == null){
			dataList = new ArrayList<HashMap<String, Object>>();
		}
		
		if (templateArray != null) {
			for (int i = 0; i < templateArray.length; i++) {
				CAANMsg childTemplate = templateArray[i];
				if ( i >= dataList.size()) {
					dataList.add(new HashMap());
				}
				// 業務パラメータ管理一意照会マップ.業務パラメータ管理一意照会明細.業務パラメータ設定値 ← 業務パラメータ管理一意照会明細.業務パラメータ設定値
				if (childTemplate.isNull(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE)) {
					if("1".equals(setMaxCntFlg)){
						workDataMap.put("zm321_heigo_kei_max_cnt", "0");
					}else if("2".equals(setMaxCntFlg)){
						workDataMap.put("zm321_kosmu_lan_max_cnt", "0");
					}else if("3".equals(setMaxCntFlg)){
						workDataMap.put("zm321_fami_pack_max_cnt", "0");
					}
				} else {
					if("1".equals(setMaxCntFlg)){
						workDataMap.put("zm321_heigo_kei_max_cnt", childTemplate.getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
					}else if("2".equals(setMaxCntFlg)){
						workDataMap.put("zm321_kosmu_lan_max_cnt", childTemplate.getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
					}else if("3".equals(setMaxCntFlg)){
						workDataMap.put("zm321_fami_pack_max_cnt", childTemplate.getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
					}
				}
			}
		}
		
		
		//*********************************************************************************
		// 作業項目マップ(WORK) を作業領域に格納
		//*********************************************************************************
		workMap.put("WORK", workDataMap);
		param.setMappingWorkArea(workMap);
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = editErrorInfo_EZM0321A010(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = parentTemplate.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param hgSkFlg
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0451B003(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText,
																boolean hgSkFlg) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		// 作業項目マップ
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		if (workDataMap == null) {
			workDataMap = new HashMap();
		}
		
		// 割引サービス適用中件数取得一覧照会明細
		templateArray = parentTemplate.getCAANMsgList(EKK0451B003CBSMsg.EKK0451B003CBSMSG1LIST);
		
		if (templateArray != null && templateArray.length > 0){
			
			CAANMsg childTemplate = templateArray[0];
			
			if (!childTemplate.isNull(EKK0451B003CBSMsg1List.APPLY_CNT)) {
				
				if(hgSkFlg)
				{
					workDataMap.put("sk_kk0451_apply_cnt", childTemplate.getString(EKK0451B003CBSMsg1List.APPLY_CNT));
				}
				else
				{
					workDataMap.put("mt_kk0451_apply_cnt", childTemplate.getString(EKK0451B003CBSMsg1List.APPLY_CNT));
				}
			}
		}
		
		//*********************************************************************************
		// 作業項目マップ(WORK) を作業領域に格納
		//*********************************************************************************
		workMap.put("WORK", workDataMap);
		param.setMappingWorkArea(workMap);
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0451B003(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0321B001(Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText) throws Exception
	{
		
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		if (workDataMap == null)
		{
			workDataMap = new HashMap<String, Object>();
		}
		
		// 請求契約番号/SYSID一覧照会明細
		templateArray = parentTemplate.getCAANMsgList(EKK0321B001CBSMsg.EKK0321B001CBSMSG1LIST);
		
		if (templateArray != null)
		{
			CAANMsg childTemplate = null;
			ArrayList<String> seikyKeiNoList = new ArrayList<String>();
			for(int i=0; i<templateArray.length; i++ )
			{
				childTemplate = templateArray[i];
				seikyKeiNoList.add(childTemplate.getString(EKK0321B001CBSMsg1List.SEIKY_KEI_NO));
			}
			
			workDataMap.put("seiky_kei_no_list", seikyKeiNoList);
		}
		
		workMap.put("WORK", workDataMap);
		
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0321B001(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0081B002(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK0081B002CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, EKK0081B002CBSMsg.KEY_SYSID_ERR, "key_sysid_err");		// ＫＥＹ＿ＳＹＳＩＤ
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_ECK0011A010(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(ECK0011A010CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, ECK0011A010CBSMsg.KEY_SYSID_ERR, "key_sysid_err");					// ＫＥＹ＿ＳＹＳＩＤ
		setErr(template, inMap, ECK0011A010CBSMsg.KEY_GENE_ADD_DTM_ERR, "key_gene_add_dtm_err");	// ＫＥＹ＿世代登録年月日時分秒
		setErr(template, inMap, ECK0011A010CBSMsg.KEY_GENE_ADD_DTM_ERR, "key_rsv_aply_ymd_err");	// ＫＥＹ＿予約適用年月日
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0081B004(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK0081B004CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, EKK0081B004CBSMsg.KEY_SYSID_ERR, "key_sysid_err");		// ＫＥＹ＿ＳＹＳＩＤ
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0161B003(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK0161B003CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, EKK0161B003CBSMsg.KEY_SYSID_ERR, "key_sysid_err");		// ＫＥＹ＿ＳＹＳＩＤ
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0321B001(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK0321B001CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, EKK0321B001CBSMsg.KEY_SYSID_ERR, "key_sysid_err");					// ＫＥＹ＿ＳＹＳＩＤ
		setErr(template, inMap, EKK0321B001CBSMsg.KEY_SEIKY_KEI_NO_ERR, "key_seiky_kei_no_err");	// ＫＥＹ＿請求契約番号
		
		return param;
	}
	
	/**
	 * エラー処理メソッド
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EZM0321A010(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EZM0321A010CBSMsg.STATUS);
		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(fixedText);
		
		// エラー情報返却
		setErr(template, inMap, EZM0321A010CBSMsg.KEY_WORK_PARAM_ID_ERR, "key_work_param_id_err");		//  ＫＥＹ＿業務パラメータＩＤ
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0451B003(IRequestParameterReadWrite param,
																CAANMsg[] templates,
																int returnCode,
																String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK0451B003CBSMsg.STATUS);
		
		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(fixedText);
		
		// 業務エラー設定
		setErr(template, inMap, EKK0451B003CBSMsg.KEY_SYSID_ERR, "key_sysid_err");				// ＫＥＹ＿ＳＹＳＩＤ
		setErr(template, inMap, EKK0451B003CBSMsg.KEY_WRIB_SVC_CD_ERR, "key_wrib_svc_cd_err");	// ＫＥＹ＿割引サービスコード
		setErr(template, inMap, EKK0451B003CBSMsg.KEY_SVC_ENDYMD, "key_sysid_err");				// ＫＥＹ＿サービス終了年月日
		
		return param;
	}
	
	/**
	 * 契約者タイプの関連チェックを行います。
	 * 
	 * @param param
	 * 
	 * @return boolean 契約者タイプチェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkKeishaType(IRequestParameterReadWrite param) throws RequestParameterException
	{
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		String mt_keishaType = (String)workDataMap.get("mt_keisha_type");		// 併合元契約者タイプ
		String sk_keishaType = (String)workDataMap.get("sk_keisha_type");		// 併合先契約者タイプ
		
		// 契約者タイプが同じ場合は正常
		if(mt_keishaType.equals(sk_keishaType))
		{
			return true;
		}
		
		// 契約者タイプが個人←→法人の変更は可能
		if(("1".equals(mt_keishaType) || "2".equals(mt_keishaType))
			&& ("1".equals(sk_keishaType) || "2".equals(sk_keishaType)))
		{
			return true;
		}
		
		// 作業項目領域取得
		HashMap<String, Object> work01Map = getWork01Map(param);
		
		// エラー情報を設定
		work01Map.put("kanren_error_cd", KANREN_ERR_KEI_TYPE);
		setCheckResult(param);
		
		return false;
	}
	
/* ++++++++++ v6.00.00 削除開始 ++++++++++ */
//	/**
//	 * 部屋番号の関連チェックを行います。
//	 * 
//	 * @param param
//	 * @param fixedText
//	 * 
//	 * @return boolean 契約者タイプチェック結果
//	 * @throws RequestParameterException
//	 */
//	@SuppressWarnings("unchecked")
//	private boolean chkAdrrm(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
//	{
//		// 併合先部屋番号の取得
//		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
//		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
//		String sk_adrrm = (String)workDataMap.get("sk_adrrm");
//		
//		// 部屋番号が設定されている場合、チェックなし
//		if(!isEmpty(sk_adrrm)){
//			return true;
//		}
//		
//		// 業務データの取得
//		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
//		
//		// 併合元サービス契約一覧の取得
//		ArrayList<HashMap<String, String>> keiSvcList = (ArrayList<HashMap<String, String>>)dataMap.get("svc_kei_list");
//		HashMap<String, String> keiSvcMap = null;
//		String prcGrpCd = null;
//		for(int i=0; i<keiSvcList.size(); i++)
//		{
//			keiSvcMap = keiSvcList.get(i);
//			prcGrpCd = keiSvcMap.get("prc_grp_cd");
//			
//			// サービスがマンション系の場合
//			if("04".equals(prcGrpCd))
//			{
//				// 作業項目領域取得
//				HashMap<String, Object> work01Map = getWork01Map(param);
//				
//				// エラー情報を設定
//				work01Map.put("kanren_error_cd", KANREN_ERR_ADRRM);
//				setExeChkError(param);
//				return false;
//			}
//		}
//		
//		return true;
//	}
/* ++++++++++ v6.00.00 削除終了 ++++++++++ */
	
	/**
	 * 併合後のサービス契約数の件数チェックを行います。
	 * 
	 * @param param
	 * @param fixedText
	 * 
	 * @return boolean サービス契約数チェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkSvcKeiCount(IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		// 併合先サービス契約数
		int skSvcKeiCount = Integer.parseInt((String)workDataMap.get("svc_kei_count"));
		
		// 併合サービス契約数上限
		int heigoKeiMaxCount = 0;
		heigoKeiMaxCount = Integer.parseInt((String)workDataMap.get("zm321_heigo_kei_max_cnt"));
		
		// 業務データの取得
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList mtSvcList = (ArrayList)dataMap.get("svc_kei_list");	// 併合元サービス契約リスト
		
		// 併合後のサービス契約数が上限を超えている場合
		if(heigoKeiMaxCount < (skSvcKeiCount + mtSvcList.size()))
		{
			// 作業項目領域取得
			HashMap<String, Object> work01Map = getWork01Map(param);
			
			// エラー情報を設定
			work01Map.put("kanren_error_cd", KANREN_ERR_SVC_MAX);
			setCheckResult(param);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 公衆無線LANサービス契約数の件数チェックを行います。
	 * 
	 * @param param
	 * 
	 * @return boolean サービス契約数チェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkKosmuLanCount(IRequestParameterReadWrite param)
			throws RequestParameterException
	{
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		int skKosmuLanCount = Integer.parseInt((String)workDataMap.get("sk_kosmu_lan_count"));			// 併合先公衆無線LAN契約数
		int mtKosmuLanCount = Integer.parseInt((String)workDataMap.get("mt_kosmu_lan_count"));			// 併合元公衆無線LAN契約数
		
		// 公衆無線LAN契約の上限数
		int kosmuLanMaxCount = 0;
		kosmuLanMaxCount = Integer.parseInt((String)workDataMap.get("zm321_kosmu_lan_max_cnt"));
		
		// 併合後のサービス契約数が上限を超えている場合
		if(kosmuLanMaxCount < (skKosmuLanCount + mtKosmuLanCount))
		{
			// 作業項目領域取得
			HashMap<String, Object> work01Map = getWork01Map(param);
			
			// エラー情報を設定
			work01Map.put("kanren_error_cd", KANREN_ERR_KOSMU_LAN_MAX);
			setCheckResult(param);
			return false;
		}
		
		return true;
	}
	
	/**
	 * ファミリーパック件数上限チェックを行います。
	 * 
	 * @param param
	 * @param fixedText
	 * @return boolean ファミリーパック件数上限チェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkFamPkLimitCnt(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		int mtApplyCnt = Integer.parseInt((String)workDataMap.get("mt_kk0451_apply_cnt"));			// 併合先：割引サービス適用中件数
		int skApplyCnt = Integer.parseInt((String)workDataMap.get("sk_kk0451_apply_cnt"));			// 併合元：割引サービス適用中件数
		int famiPackMaxCnt = Integer.parseInt((String)workDataMap.get("zm321_fami_pack_max_cnt"));	// ファミリーパック契約件数上限
		
		// 割引サービス適用中件数が上限を超えている場合
		if((mtApplyCnt + skApplyCnt) > famiPackMaxCnt)
		{
			// 作業項目領域取得
			HashMap<String, Object> work01Map = getWork01Map(param);
			
			// ワーニング情報を設定
			work01Map.put("kanren_warning_cd", KANREN_WAR_FMYPK_CNT);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 請求契約番号の件数チェックを行います。
	 * 
	 * @param param
	 * 
	 * @return boolean サービス契約数チェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkSeikyKeiNo(IRequestParameterReadWrite param) throws RequestParameterException
	{
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		// 請求契約番号リストの取得
		ArrayList<String> seikyKeiNoList = (ArrayList<String>)workDataMap.get("seiky_kei_no_list");
		
		// 検索件数が１件ならば正常
		if(seikyKeiNoList.size() == 1)
		{
			return true;
		}
		
		HashSet<String> set = null;
		for(int i=0; i<seikyKeiNoList.size(); i++)
		{
			// 一回目の場合は値を設定
			if(i==0){
				set = new HashSet<String>();
				set.add(seikyKeiNoList.get(i));
			}
			else
			{
				// 請求契約番号が複数ある場合はエラー
				if(!set.contains(seikyKeiNoList.get(i)))
				{
					// 作業項目領域取得
					HashMap<String, Object> work01Map = getWork01Map(param);
					
					// エラー情報を設定
					work01Map.put("kanren_error_cd", KANREN_ERR_SEIKYU_NO);
					setCheckResult(param);
					return false;
				}
			}
		}
		
		return true;
	}
	
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
	/**
	 * 支払方法チェックを行います。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param inMap
	 * @param work01Map
	 * @return boolean 契約状態チェック結果
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private boolean chkPayWay(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, 
			String fixedText,
			HashMap<String, Object> inMap, 
			HashMap<String, Object> work01Map) throws Exception
	{
		// 併合元サービス契約(チェック有)一覧
		ArrayList<HashMap<String, String>> keiSvcList = (ArrayList<HashMap<String, String>>)inMap.get("svc_kei_list");
		HashMap<String, String> keiSvcMap = null;
		
		for(int i=0; i<keiSvcList.size(); i++)
		{
			keiSvcMap = keiSvcList.get(i);
			
			// サービスコード
			String svcCd = keiSvcMap.get("svc_cd");
			
			// サービスが"51":ｍｉｎｅｏの場合
			if(JKKStrConst.CD00130_51.equals(svcCd))
			{
				// 支払方法チェック(請求併合先)
				if(!isChkMvnoSeikyHeigoSk(handle, scCall, param, fixedText, inMap, work01Map))
				{
					// エラー情報を設定
					work01Map.put("kanren_error_cd", KANREN_ERR_MVNO);
					// 作業領域にチェック結果を設定
					setCheckResult(param);
					return false;
				}
			}
		}
		
		return true;
	}
	
	/**
	 * 支払方法チェックを行います。
	 * 請求併合先の請求契約.請求方法コード、口座.新規コードの判定
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param inMap
	 * @param work01Map
	 * @return 判定結果
	 */
	private boolean isChkMvnoSeikyHeigoSk(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, 
			String fixedText,
			HashMap<String, Object> inMap, 
			HashMap<String, Object> work01Map) throws Exception
	{
		// 併合先＿請求契約番号
		String skSeikyKeiNo = (String)inMap.get("sk_seiky_kei_no");
		
		//**********************************************************
		// 請求契約一意照会
		//**********************************************************
		Object[][] ekk0491a010InMsg = 
		{
				{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010},
				{EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
				{EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, skSeikyKeiNo},
				{EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}
		};
		
		CAANMsg[] ekk0491a010outMsg = callSC(handle, scCall, param, fixedText, ekk0491a010InMsg).getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
		
		if (ekk0491a010outMsg == null || ekk0491a010outMsg.length == 0)
		{
			return false;
		}
		
		//***********************************************************
		// 請求方法コード
		//  "1":窓口払い
		//  "2":預金口座振替
		//  "3":郵便自動振込
		//  "4":クレジット
		//***********************************************************
		// 請求方法コード
		String seikyWayCd = ekk0491a010outMsg[0].getString(EKK0491A010CBSMsg1List.SEIKY_WAY_CD);
		
		// 請求併合先の請求契約.請求方法コードが"1":窓口払いの場合、エラー
		if(JKKStrConst.SEIKY_WAY_CD_MADOGUCHI.equals(seikyWayCd))
		{
			// 支払方法チェックエラー（請求）
			work01Map.put("mvno_chk_err_cd", KANREN_ERR_MVNO_PAYWAY_SEIKY);
			return false;
		}
		// 請求併合先の契約.請求方法コードが"2":預金口座振替、又は"3":郵便自動振込の場合
		else if(JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(seikyWayCd) || JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(seikyWayCd))
		{
			// 請求方法番号(口座)
			String seikyWayNoKoza =  ekk0491a010outMsg[0].getString(EKK0491A010CBSMsg1List.SEIKY_WAY_NO_KOZA);
			
			//**********************************************************
			// 口座一意照会
			// 請求契約.請求方法番号(口座)をKEYに検索
			//**********************************************************
			Object[][] ekk0501a010InMsg = 
			{
					{EKK0501A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0501A010},
					{EKK0501A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
					{EKK0501A010CBSMsg.KEY_SEIKY_WAY_NO_KOZA, seikyWayNoKoza}
			};
			
			CAANMsg[] ekk0501a010outMsg = callSC(handle, scCall, param, fixedText, ekk0501a010InMsg).getCAANMsgList(EKK0501A010CBSMsg.EKK0501A010CBSMSG1LIST);
			
			if (ekk0501a010outMsg == null || ekk0501a010outMsg.length == 0)
			{
				return false;
			}
			
			//***********************************************************
			// 新規コード
			//  "0":継続
			//  "1":新規
			//  "2":変更
			//***********************************************************
			// 請求併合先の口座.新規コードが"0":継続以外の場合、エラー
			if(!NEW_CD_KEIZK.equals(ekk0501a010outMsg[0].getString(EKK0501A010CBSMsg1List.NEW_CD)))
			{
				// 支払方法チェックエラー（口座）
				work01Map.put("mvno_chk_err_cd", KANREN_ERR_MVNO_PAYWAY_KOZA);
				return false;
			}
		}
		
		return true;
	}
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
							ServiceComponentRequestInvoker scCall,
							IRequestParameterReadWrite param,
							String fixedText,
							Object[][] mappingData) throws Exception
	{
		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];
		
		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		
		int templateStatus = msg.getInt(EKK0081B006CBSMsg.STATUS);
		
		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);
		}
		
		setErrorInf(msg, (HashMap<String, Object>)param.getData(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(result, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		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 = editInMsg(param);
		
		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 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));
					}
				}
			}
		}
	}
	
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
	
	/**
	 * 作業項目領域を取得します。
	 * 
	 * @param param
	 * 
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getWork01Map(IRequestParameterReadWrite param)
		throws RequestParameterException
	{
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData("KKSV0359WORK01");
		if (isNull(dataMap))
		{
			dataMap = (HashMap<String, Object>)param.getData("KKSV0360WORK01");
		}
		
		return dataMap;
	}

	/**
	 * 作業領域にサービス契約紐付変更登録チェック結果を設定します。
	 * 
	 * @param param
	 * 
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setCheckResult(IRequestParameterReadWrite param)
		throws RequestParameterException
	{
		// 作業エリアの取得
		Map<Object, Object> workMap = (Map<Object, Object>)param.getMappingWorkArea();
		HashMap<String, Object> workDataMap = (HashMap<String, Object>)workMap.get("WORK");
		
		workDataMap.put("checkResult", "false");
	}
	
	/**
	 * エラー情報を設定します。
	 * @param template
	 * @param map
	 * @param item
	 * @param key
	 * @return 判定結果
	 */
	private void setErr(CAANMsg template, HashMap<String, Object> inMap, String item, String key) {
		
		if (!template.isNull(item))
		{
			if (!inMap.containsKey(key))
			{
				inMap.put(key, template.getString(item));
			}
		}
	}
	
	/**
	 * 引数のNULL判定を行います。
	 * @param param
	 * @return 判定結果
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 引数の空文字判定を行います。
	 * @param param
	 * @return 判定結果
	 */
	private boolean isEmpty(String param)
	{
		if(param == null || "".equals(param))
		{
			return true;
		}
		return false;
	}

	// ANK-2250-00-00 ADD START
	/**
	 * サービス契約一覧照会（ＭＶＮＯチェック）用のメッセージを作成します。
	 * 
	 * @param param
	 * @param sysId
	 * 
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0081B002_MVNO(IRequestParameterReadWrite param, String sysId)
			throws RequestParameterException
	{
		// 共通情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0081B002CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0081B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B002);
		// 機能コード
		template.set(EKK0081B002CBSMsg.FUNC_CODE, "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);
		
		// アプリ的には不要だが設定しないとエラーになるため設定
		template.set(EKK0081B002CBSMsg.SEARCH_TYPE, "1");
		template.set(EKK0081B002CBSMsg.DISPLAY_NUM, "100");
		template.set(EKK0081B002CBSMsg.DISPLAY_PAGE_NUM, "1");
		
		// ◇ 業務データの設定
		// ＫＥＹ＿ＳＹＳＩＤ
		template.set(EKK0081B002CBSMsg.KEY_SYSID, sysId);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * 【併合元】ＭＶＮＯサービス契約を確認します。
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0081B002_MOTO(Map<?, ?> msgList,
																	IRequestParameterReadWrite param,
																	String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// サービス契約一覧照会（SYSID）明細
		templateArray = parentTemplate.getCAANMsgList(EKK0081B002CBSMsg.EKK0081B002CBSMSG1LIST);

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 併合元サービス契約(チェック有)一覧
		ArrayList<HashMap<String,String>> svckeiList = null;
		svckeiList = (ArrayList<HashMap<String,String>>)inMap.get("svc_kei_list");
		HashMap<String, String> svcMap = null;

		boolean mvnoMotoChkFlg = false;
		
		// サービス契約件数
		int count = 0;

		svcMap = null;
		for(int j=0; j<svckeiList.size(); j++){
			svcMap = svckeiList.get(j);

			// サービスコード(チェック有)
			String svc_cd = svcMap.get("svc_cd");

			// サービス契約ステータス(チェック有)
			String svc_kei_stat = svcMap.get("svc_kei_stat");

			// サービス契約番号(チェック有)に照査済み以降の件数確認
			if ("51".equals(svc_cd) &&
				("020".equals(svc_kei_stat) || "030".equals(svc_kei_stat) ||
				 "100".equals(svc_kei_stat) || "220".equals(svc_kei_stat))) {
				count++;
			}
		}
		if (count > 1) {
			mvnoMotoChkFlg = true;
		}

		if (!mvnoMotoChkFlg && templateArray != null)
		{
			CAANMsg childTemplate = null;
			
			for(int i=0; i<templateArray.length; i++)
			{
				childTemplate = templateArray[i];
				
				if (childTemplate.isNull(EKK0081B004CBSMsg1List.SVC_KEI_NO))
				{
					continue;
				}
				else
				{
					// サービス契約番号
					String svc_kei_no_db = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_NO);

					// サービス契約コード
					String svc_cd_db = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_CD);

					// サービス契約ステータス
					String svc_kei_stat_db = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_STAT);

					// 照査済み以降の存在確認
					if ("51".equals(svc_cd_db) &&
						("020".equals(svc_kei_stat_db) || "030".equals(svc_kei_stat_db) ||
						 "100".equals(svc_kei_stat_db) || "220".equals(svc_kei_stat_db))) {

						svcMap = null;
						for(int j=0; j<svckeiList.size(); j++){
							svcMap = svckeiList.get(j);

							// サービス契約番号(チェック有)
							String svc_kei_no = svcMap.get("svc_kei_no");

							// サービスコード(チェック有)
							String svc_cd = svcMap.get("svc_cd");

							// サービス契約ステータス(チェック有)
							String svc_kei_stat = svcMap.get("svc_kei_stat");

							// サービス契約番号(チェック有)以外に照査済み以降の存在確認
							if (!svc_kei_no_db.equals(svc_kei_no) && "51".equals(svc_cd) &&
								("020".equals(svc_kei_stat) || "030".equals(svc_kei_stat) ||
								 "100".equals(svc_kei_stat) || "220".equals(svc_kei_stat))) {
								mvnoMotoChkFlg = true;
								break;
							}
						}
					}
				}
			}
		}

		HashMap<String, Object> work01Map2 = getWork01Map(param);
		work01Map2.put("mvno_moto_chk_flg", mvnoMotoChkFlg);

		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0081B002(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}

	/**
	 * 【併合先】ＭＶＮＯサービス契約を確認します。
	 * 
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * 
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0081B002_SAKI(Map<?, ?> msgList,
																	IRequestParameterReadWrite param,
																	String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// サービス契約一覧照会（SYSID）明細
		templateArray = parentTemplate.getCAANMsgList(EKK0081B002CBSMsg.EKK0081B002CBSMSG1LIST);

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 併合元サービス契約(チェック有)一覧
		ArrayList<HashMap<String,String>> svckeiList = null;
		svckeiList = (ArrayList<HashMap<String,String>>)inMap.get("svc_kei_list");
		HashMap<String, String> svcMap = null;

		boolean mvnoChkFlg = false;
		boolean mvnoSakiChkFlg = false;
		boolean mvnoContChkFlg = false;

		svcMap = null;
		for(int j=0; j<svckeiList.size(); j++){
			svcMap = svckeiList.get(j);

			// サービスコード(チェック有)
			String svc_cd = svcMap.get("svc_cd");

			// サービス契約ステータス(チェック有)
			String svc_kei_stat = svcMap.get("svc_kei_stat");

			// サービス契約番号(チェック有)に照査済み以降の存在確認
			if ("51".equals(svc_cd) &&
				("010".equals(svc_kei_stat) || "020".equals(svc_kei_stat) || "030".equals(svc_kei_stat) ||
				 "100".equals(svc_kei_stat) || "220".equals(svc_kei_stat))) {
				mvnoChkFlg = true;
				break;
			}
		}

		// サービス契約番号(チェック有)に照査済み以降が存在した場合のみ併合先を確認
		if (mvnoChkFlg) {
			if (templateArray != null)
			{
				CAANMsg childTemplate = null;
				mvnoContChkFlg = true;

				for(int i=0; i<templateArray.length; i++)
				{
					childTemplate = templateArray[i];
					
					if (childTemplate.isNull(EKK0081B004CBSMsg1List.SVC_KEI_NO))
					{
						continue;
					}
					else
					{
						// 料金コースコード
						String pcrs_cd_db = childTemplate.getString(EKK0081B002CBSMsg1List.PCRS_CD);

						// 料金グループコード
						String prc_grp_cd_db = childTemplate.getString(EKK0081B004CBSMsg1List.PRC_GRP_CD);

						// サービス契約ステータス
						String svc_kei_stat_db = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_STAT);

						// コンテンツ同意の存在確認
						if ("A58".equals(pcrs_cd_db) && "100".equals(svc_kei_stat_db)) {
							mvnoContChkFlg = false;
						}

						// 照査済み以降の存在確認
						if ("51".equals(prc_grp_cd_db) &&
							("020".equals(svc_kei_stat_db) || "030".equals(svc_kei_stat_db) ||
							 "100".equals(svc_kei_stat_db) || "220".equals(svc_kei_stat_db))) {
							mvnoSakiChkFlg = true;
						}
					}
				}
			}
		}

		HashMap<String, Object> work01Map2 = getWork01Map(param);
		work01Map2.put("mvno_chk_flg", mvnoChkFlg);
		work01Map2.put("mvno_saki_chk_flg", mvnoSakiChkFlg);
		work01Map2.put("mvno_cont_chk_flg", mvnoContChkFlg);

		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0081B002(param, templates, Integer.parseInt(rtnCode), fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)retParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		retParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	// ANK-2250-00-00 ADD END
	
	// ANK-2480-00-00 ADD START
	/**
	 * 支払方法チェックを行います。
	 * 請求併合先の請求契約.請求方法コード、口座.新規コードの判定
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param inMap
	 * @param work01Map
	 * @return 判定結果
	 */
	private boolean isChkSeikyHeigoSk(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param, 
			String fixedText,
			HashMap<String, Object> inMap, 
			HashMap<String, Object> work01Map) throws Exception
	{
		// 併合先＿請求契約番号
		String skSeikyKeiNo = (String)inMap.get("sk_seiky_kei_no");
		
		//**********************************************************
		// 請求契約一意照会
		//**********************************************************
		Object[][] ekk0491a010InMsg = 
		{
				{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010},
				{EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
				{EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, skSeikyKeiNo},
				{EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}
		};
		
		CAANMsg[] ekk0491a010outMsg = callSC(handle, scCall, param, fixedText, ekk0491a010InMsg).getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
		
		if (ekk0491a010outMsg == null || ekk0491a010outMsg.length == 0)
		{
			return false;
		}
		
		//***********************************************************
		// 請求方法コード
		//  "1":窓口払い
		//  "2":預金口座振替
		//  "3":郵便自動振込
		//  "4":クレジット
		//***********************************************************
		// 請求方法コード
		String seikyWayCd = ekk0491a010outMsg[0].getString(EKK0491A010CBSMsg1List.SEIKY_WAY_CD);
		
		// 請求併合先の請求契約.請求方法コードが"1":窓口払いの場合、false
		if(JKKStrConst.SEIKY_WAY_CD_MADOGUCHI.equals(seikyWayCd))
		{
			return false;
		}
		
		
		return true;
	}
	// ANK-2480-00-00 ADD END
	// ANK-2661-00-00 2016/08/05 ADD START
	/**
	 * 併合元 または 併合先の請求契約予約有無を判定します。
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * @param ekk0491a010InMsg
	 * @param seikyKeiNo 併合元 または 併合先の請求契約番号
	 * @return true：予約有 false：予約無
	 */
	private boolean isSeikyKeiRsv(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ServiceComponentRequestInvoker scCall, Object[][] ekk0491a010InMsg, String seikyKeiNo) throws Exception {
		if (!JKKCommonUtil.isNull(seikyKeiNo))
		{
			ekk0491a010InMsg[2][1] = seikyKeiNo;
			CAANMsg[] ekk0491a010OutMsg = callSC(handle, scCall,
					param, fixedText, ekk0491a010InMsg).getCAANMsgList(
					EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
			
			if (ekk0491a010OutMsg != null)
			{
				String rsvAplyYmd = ekk0491a010OutMsg[0].getString(EKK0491A010CBSMsg1List.RSV_APLY_YMD);
				
				// 運用日＜予約適用年月日の場合、予約有
				if (JPCUtilCommon.isFutureDate(rsvAplyYmd, JCCBPCommon.getOpeDate(null), "0"))
				{
					return true;
				}
			}
		}
		
		return false;
	}
	// ANK-2661-00-00 2016/08/05 ADD END
	
}
