/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKeiHimoSeikyKeiKakinsUpdCC
*	ソースファイル名：JKKKeiHimoSeikyKeiKakinsUpdCC.java
*	作成者			：FJ
*	日付			：2012年11月20日
*＜機能概要＞ 
*	契約紐付変更登録画面 請求契約・課金先変更の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/20	FJ)稲岡		新規作成
*	v4.01.00	2013/02/01	FJ)稲岡		【OT-2013-0000027】対応
*	v4.02.00	2013/02/01	FJ)稲岡		【ST2-2013-0000370】対応
*	v4.03.00	2013/02/05	FJ)稲岡		【ST2-2013-0000514】対応
*	v4.04.00	2013/03/25	FJ)宇野		【IT1-2013-0000573】対応
*	v4.05.00	2013/04/25	FJ)稲岡		【IT1-2013-0001040】対応
*	v5.00.00	2013/07/05	FJ)馬場		【IT1-2013-0001327】対応
*	v5.00.01	2013/07/08	FJ)馬場		【IT2-2013-0000600】対応
*	v5.00.02	2013/07/10	FJ)磯俣		【TG1-2013-0000658】プラン終了種別コードを削除
*	v8.00.00	2014/02/20	FJ)磯俣		【IT2-2014-0000126】請求オプション解約条件にＭＶＮＯ追加
*	v8.00.01	2014/04/22	FJ)澁谷		【OM-2014-0001601】対応
*	v8.00.02	2014/06/03	FJ)磯俣		【OM-2014-0002009】課金終了日の編集方法変更
*	v11.00.00	2014/10/25	FJ)舩橋		【ANK-2248-00-00】対応
*	v15.00.00	2015/08/27	FJ)窪田		【OM-2015-0001840】対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECH0501B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0501B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0151D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B006CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321C020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441C210CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441C230CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441C240CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * 
 * @author 909837
 *
 */
public class JKKKeiHimoSeikyKakinsUpdCC extends AbstractCommonComponent
{
	/** テンプレートID(課金先請求契約変更) */
	private static final String TEMPLATE_ID_EKK0321C020 = "EKK0321C020";
	/** テンプレートID(課金先一覧照会（請求契約番号/サービス契約番号）） */
	private static final String TEMPLATE_ID_EKK0321B002 = "EKK0321B002";
	/** テンプレートID(サービス契約一意照会） */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** テンプレートID(請求契約一意照会) */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";
	/** テンプレートID(請求契約内容変更) */
	private static final String TEMPLATE_ID_EKK0491C060 = "EKK0491C060";
	/** テンプレートID(請求オプションサービス契約一覧照会（複合検索）) */
	private static final String TEMPLATE_ID_EKK0441B002 = "EKK0441B002";
	/** テンプレートID(料金スケジュール定義イベント一覧照会) */
	private static final String TEMPLATE_ID_ECH0501B010 = "ECH0501B010";
	/** テンプレートID(請求オプションサービス契約キャンセル) */
	private static final String TEMPLATE_ID_EKK0441C210 = "EKK0441C210";
	/** テンプレートID(請求オプションサービス契約解約) */
	private static final String TEMPLATE_ID_EKK0441C230 = "EKK0441C230";
/* ++++++++++ v4.05.00 追加開始 ++++++++++ */
	/** テンプレートID(請求オプションサービス契約解約確定) */
	private static final String TEMPLATE_ID_EKK0441C240 = "EKK0441C240";
/* ++++++++++ v4.05.00 追加終了 ++++++++++ */
	/** テンプレートID(指示書登録) */
	private static final String TEMPLATE_ID_ECK0151D010 = "ECK0151D010";
/* ++++++++++ v8.00.01 追加開始 ++++++++++ */
	/** テンプレートID(業務パラメータ管理一意照会) */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
/* ++++++++++ v8.00.01 追加終了 ++++++++++ */
	
	/** 機能コード */
	private static final String FUNC_CODE_1 = "1";
	/** 機能コード */
	private static final String FUNC_CODE_2 = "2";
	
	/** 要否（否） */
	private static final String KH_FAIL = "0";
	/** 存在フラグ（存在する） */
	private static final String EXIST_FLG_Y = "1";
	
	/** サービス契約ステータス 解約済 */
	private static final String SVC_KEI_STAT_DSL_ZM = "910";
	/** サービス契約ステータス キャンセル済 */
	private static final String SVC_KEI_STAT_CANCEL_ZM = "920";
	
	/** 請求オプションサービス契約ステータス 受付済 */
	private static final String SEIOP_SVC_KEI_STAT_UK_ZM = "010";
	/** 請求オプションサービス契約ステータス 照査済 */
	private static final String SEIOP_SVC_KEI_STAT_SHOSA_ZM = "020";
	/** 請求オプションサービス契約ステータス 解約済 */
	private static final String SEIOP_SVC_KEI_STAT_DSL_ZM = "910";
	/** 請求オプションサービス契約ステータス キャンセル済 */
	private static final String SEIOP_SVC_KEI_STAT_CANCEL_ZM = "920";
	
	/** サービスコード インターネットサービス */
	private static final String SVC_CD_NET = "01";
/* ++++++++++ v8.00.01 変更開始 ++++++++++ */
//	/** 料金グループコード(ｅｏモバイル(メールアドレス)) */
//	private static final String PRC_GRP_CD_EOMOBILE_MLAD = "16";
//	/** 料金グループコード(マンション・オーナー) */
//	private static final String PRC_GRP_CD_MANS_OWNR = "99";
	/** 請求書発行手数料非課金料金グループ */
	private static final String KK_SKSHAK_HCHRG_PRGP = "KK_SKSHAK_HCHRG_PRGP";
/* ++++++++++ v8.00.01 変更終了 ++++++++++ */
	
	/** １日 */
	private static final String FIRST_DATE = "01";
	
/* ++++++++++ v4.03.00 追加開始 ++++++++++ */
	/** 異動区分（請求契約併合） */
	private static final String IDO_DIV_VALUE_00016 = "00016";
/* ++++++++++ v4.03.00 追加終了 ++++++++++ */
	
	/** 指示書設定値:課金先.課金先適用終了年月日 */
	private static final String KAKINS_TEND_YMD = "20991231";

	// ANK-2248-00-00 ADD START
	/** 請求オプションサービス契約 料金コースコード：NHK団体一括契約 */
	private static final String SEIOP_SVC_KEI_PCRS_CD_NHK = "E02";

	/** 請求オプションサービス契約 料金プランコード：NHK団体一括契約 */
	private static final String SEIOP_SVC_KEI_PPLAN_CD_NHK = "PE0201";
	// ANK-2248-00-00 ADD END
	
	/**
	 *  請求契約内容変更、
	 *  課金先請求契約変更、
	 *  請求オプションサービス契約解約／キャンセル
	 *  を行います。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeUpd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ情報
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		IRequestParameterReadWrite retParam = param;
		
/* ++++++++++ v8.00.01 追加開始 ++++++++++ */
		// ***** EZM0321A010（業務パラメータ管理一意照会）*****
		Object[][] ezm0321a010IN = {
			{ EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010 },
			{ EZM0321A010CBSMsg.FUNC_CODE, "1"},
			{ EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, KK_SKSHAK_HCHRG_PRGP}
		};
		CAANMsg[] ezm0321a010cbsMsg1list 
						= callSC(handle, scCall, param, fixedText, ezm0321a010IN).getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		String skshakHchrgPrgp = ezm0321a010cbsMsg1list[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
/* ++++++++++ v8.00.01 追加終了 ++++++++++ */
		
		// 併合元リスト取得
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0360WORK01");
		ArrayList heigoMtList = (ArrayList)work01Map.get("svc_kei_list");
		
		// 併合先＿請求書作成要否
		String skSeikyusHakkoYh = (String)dataMap.get("sk_seikyus_hakko_yh");
		
		/************************************************************/
		/** 併合先 処理												*/
		/************************************************************/
		// 併合先＿インターネットサービス契約検索フラグ
		boolean skNetKeiSearchFlg = false;
		// 併合先＿インターネットサービス契約存在フラグ
		boolean skNetKeiExistFlg = false;
		// 併合先＿請求契約更新契約フラグ
		boolean skSeikyKeiUpdFlg = false;
		
		//**********************************************************
		// 併合先＿請求書作成要否 判定
		//**********************************************************
		// 併合先＿請求書作成要否 = "否"
		if(KH_FAIL.equals(skSeikyusHakkoYh))
		{
			// 請求オプションサービス契約していないので処理なし
		}
		else
		{
			// 併合元.併合対象(チェック有)サービス契約にネット契約有
			// ※インターネットサービス契約件数 = １件以上
			if(hasNetSvcKei(heigoMtList, skshakHchrgPrgp))
			{
				skNetKeiSearchFlg = true;
			}
		}
		
		// 併合先:サービス契約検索フラグ = true
		if(skNetKeiSearchFlg)
		{
			// 併合先:インターネットサービス契約が存在するか請求契約番号で課金先→サービス契約を検索
			skNetKeiExistFlg = hasNetSvcKeiFromSeikyKei(handle, param, scCall, dataMap, fixedText, (String)dataMap.get("sk_seiky_kei_no"), null);
		}
		
		// 併合先:インターネットサービスの契約件数が1件以上の場合
		if(skNetKeiExistFlg)
		{
			// 処理なし
		}
		// 併合先:インターネットサービスの契約件数が0件の場合
		else
		{
			//**********************************************************
			// 併合先 請求契約更新
			// 請求書作成要否を「否」に変更
			//**********************************************************
			executeUpdSeikyKei(handle, param, scCall, dataMap, fixedText, (String)dataMap.get("sk_seiky_kei_no"));
			
			skSeikyKeiUpdFlg = true;
		}
		
		//**********************************************************
		// 併合元の請求契約番号リスト(重複なし)取得
		// ※請求併合処理前に取得する
		//**********************************************************
		HashMap<String, String> mtSeikyKeiNoMap = getMtSeikyKeiNoMap(heigoMtList);
		
		/************************************************************/
		/** 請求併合処理（課金先請求契約変更）						*/
		/************************************************************/
		// 課金先.更新年月日時分秒(更新前) 格納値
		String updDtmBfForKK0321 = "";
		
		// 併合先 請求契約が更新された場合
		if(skSeikyKeiUpdFlg)
		{
			// 作業項目マップより取得
			Map workMap = (Map)param.getMappingWorkArea();
			HashMap workDataMap = (HashMap)workMap.get("WORK");
			updDtmBfForKK0321 = (String)workDataMap.get("ekk0491_upd_dtm");
		}
		else
		{
			// 画面.併合先＿請求契約更新年月日時分秒
			updDtmBfForKK0321 = (String)dataMap.get("sk_seiky_upd_dtm");
		}
		
		// 請求併合処理（課金先請求契約変更）
		executeUpdKakinsSeikyKei(handle, param, scCall, dataMap, heigoMtList, fixedText, updDtmBfForKK0321);
		
		/************************************************************/
		/** 併合元 処理												*/
		/************************************************************/
		// 併合元＿請求契約番号リスト件数ループ
		for(Iterator it = mtSeikyKeiNoMap.entrySet().iterator(); it.hasNext();)
		{
			Entry entry = (Entry)it.next();
			// 併合元＿請求契約番号
			String mtSeikyKeiNo = (String)entry.getKey();
			// 更新年月日時分秒(請求契約)
			String updDtmKK0491 = (String)entry.getValue();
			
			//**********************************************************
			// 請求契約一意照会
			//**********************************************************
			Object[][] ekk0491a010inMsg = {
											{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010},
											{EKK0491A010CBSMsg.FUNC_CODE, FUNC_CODE_2},
											{EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, mtSeikyKeiNo},
/* ++++++++++ v4.02.00 修正開始 ++++++++++ */
											{EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, (String)dataMap.get("ope_date")}
/* ++++++++++ v4.02.00 修正終了 ++++++++++ */
											};
			
			CAANMsg[] ekk0491a010outMsg = callSC(handle, scCall, param, fixedText, ekk0491a010inMsg).getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
			
			if (ekk0491a010outMsg == null || ekk0491a010outMsg.length == 0)
			{
				continue;
			}
			
			// 請求書発行要否
			String mtSeikyusHakkoYh = ekk0491a010outMsg[0].getString(EKK0491A010CBSMsg1List.SEIKYUS_HAKKO_YH);
			
			// 併合元＿インターネットサービス契約検索フラグ
			boolean mtNetKeiSearchFlg = false;
			// 併合元＿インターネットサービス契約存在フラグ
			boolean mtNetKeiExistFlg = false;
			
			//**********************************************************
			// 併合元請求書作成要否 判定
			//**********************************************************
			// 併合元請求書作成要否 = "否"
			if(KH_FAIL.equals(mtSeikyusHakkoYh))
			{
				// 処理なし
			}
			else
			{
				// 併合元.併合対象(チェック有)サービス契約にネット契約有
				// ※インターネットサービス契約件数 = １件以上
				if(hasNetSvcKei(heigoMtList, skshakHchrgPrgp))
				{
					mtNetKeiSearchFlg = true;
				}
			}
			
			// サービス契約検索フラグ = true
			if(mtNetKeiSearchFlg)
			{
				// インターネットサービス契約が存在するか請求契約番号で課金先→サービス契約を検索
				mtNetKeiExistFlg = hasNetSvcKeiFromSeikyKei(handle, param, scCall, dataMap, fixedText, mtSeikyKeiNo, (String)dataMap.get("rsv_aply_ymd"));
			}
			
			// 併合元:インターネットサービスの契約件数が1件以上の場合
			if(mtNetKeiExistFlg)
			{
				// 処理なし
			}
			// 併合元:インターネットサービスの契約件数が0件の場合
			else
			{
				// 併合元:請求オプションサービス契約が存在する場合
				if(isExistSeikyOpSvcKei(handle, param, scCall, dataMap, fixedText, mtSeikyKeiNo))
				{
					// 作業項目マップより請求オプションサービス契約ステータス取得
					Map workMap = (Map)param.getMappingWorkArea();
					HashMap workDataMap = (HashMap)workMap.get("WORK");
					String seiopsvcKeiStat = (String)workDataMap.get("seiopsvc_kei_stat");
					
					// 併合元:請求オプションサービス契約ステータス判定
					if(isCnclSeikyOpSvcKei(seiopsvcKeiStat))
					{
						// "010":受付済、"020":照査済の場合
						// 併合元:請求オプションサービス契約 キャンセル
						executeCnclSeikyOpSvcKei(handle, param, scCall, dataMap, fixedText, mtSeikyKeiNo, updDtmKK0491);
					}
					else
					{
						// "030":締結済、"100":サービス提供中、"210"休止・中断中、"220":停止中の場合
						// 併合元:請求オプションサービス契約解約 解約確定
						executeDslSeikyOpSvcKei(handle, param, scCall, dataMap, fixedText, mtSeikyKeiNo, updDtmKK0491);
					}
				}
			}
		}
		
		// 請求先更新CCを実行する。
		execCallSeikyuUpdCC(handle, param, dataMap, fixedText);
		
		return retParam;
	}
	
	/**
	 * チェック処理です。<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;
	}
	
	/**
	 * 請求先更新CC呼出処理。
	 * 
	 * @param handle
	 * @param param
	 * @param inMap
	 * @param dataMapKey
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void execCallSeikyuUpdCC(SessionHandle handle,
									  IRequestParameterReadWrite param,
									  HashMap<String, Object> inMap,
									  String dataMapKey) throws Exception
	{
		// 請求先更新CC実行処理
		String jacSeikyuUpdKey = "JACSEIKYUPDCC";
		param.setData(jacSeikyuUpdKey, new HashMap<String, Object>());
		
		HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData(jacSeikyuUpdKey);
		
		// オンライン運用日
		// OM-2015-0001840 MOD START
		//Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		//outMap.put("unyo_day", operateDate);
		// 適用開始日
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		outMap.put("unyo_day", (String)ccMsg.get("rsv_aply_ymd"));
		// OM-2015-0001840 MOD END
		
		ArrayList<HashMap<String, Object>> workSvcKeiArray = new ArrayList<HashMap<String, Object>>();
		// OM-2015-0001840 DEL START
		//HashMap<String, Object> svckeiMap = new HashMap<String, Object>();
		// OM-2015-0001840 DEL END
		
		// 併合先請求契約番号と併合元のサービス契約番号を設定する。
		// 併合元のサービス契約番号のデータ数分のリストを作成する
		
		// 変更対象のリストを取得
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0360WORK01");
		ArrayList<HashMap<String, String>> svcKeiList = (ArrayList<HashMap<String, String>>)work01Map.get("svc_kei_list");
		for(HashMap<String, String> childMap : svcKeiList)
		{
			// 画面で選択されている場合
			if((Boolean.valueOf(childMap.get("isSelect"))))
			{
				// OM-2015-0001840 ADD START
				HashMap<String, Object> svckeiMap = new HashMap<String, Object>();
				// OM-2015-0001840 ADD END

				// KEY_請求契約番号
				svckeiMap.put("seiky_kei_no", (String)inMap.get("sk_seiky_kei_no"));
				
				// KEY_サービス契約番号
				svckeiMap.put("svc_kei_no", (String)childMap.get("svc_kei_no"));
				
				workSvcKeiArray.add(svckeiMap);
			}
		}
		outMap.put("JACseikyupdMsg1List", workSvcKeiArray);
		
		JACSeikyUpdCC jacSeikyuUpd = new JACSeikyUpdCC();
		jacSeikyuUpd.svcifcall(handle, param, jacSeikyuUpdKey);
	}
	
	/**
	 * 課金先請求契約を更新します。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param heigoMtSvcKeiList
	 * @param fixedText
	 * @param updDtmBfForKK0321
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void executeUpdKakinsSeikyKei(
											SessionHandle handle, 
											IRequestParameterReadWrite param, 
											ServiceComponentRequestInvoker scCall, 
											HashMap<String, Object> dataMap, 
											ArrayList heigoMtSvcKeiList, 
											String fixedText, 
											String updDtmBfForKK0321) throws Exception
	{
		Map<?, ?> result = null;
		HashMap<String, Object> paramMap = null;
		HashMap<String, String> mtSvcKeiMap = null;
		
		// 作業エリアの取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		// 申込明細番号取得
		String mskmDtlNo = (String)workDataMap.get("mskm_dtl_no");
		
		// 課金先請求契約更新カウント
		int updCnt = 1;
		
		for(int i=0; i<heigoMtSvcKeiList.size(); i++)
		{
			mtSvcKeiMap = (HashMap)heigoMtSvcKeiList.get(i);
			
/* ++++++++++ v4.01.00 追加開始 ++++++++++ */
			// 画面で選択されていないサービス契約は請求併合対象外
			if(!(Boolean.valueOf(mtSvcKeiMap.get("isSelect"))))
			{
				continue;
			}
/* ++++++++++ v4.01.00 追加終了 ++++++++++ */
			
			// ***********************************************
			// 初回以外はi-1のOUT項目の更新年月日時分秒を格納
			// ***********************************************
			String updDtmBf = "";
			
			// 初回 課金先請求契約更新
			if(1 == updCnt)
			{
				updDtmBf = updDtmBfForKK0321;
			}
			// ２回目以降
			else
			{
				// 課金先更新時のOUT項目
				workMap = (Map)param.getMappingWorkArea();
				workDataMap = (HashMap)workMap.get("WORK");
				updDtmBf = (String)workDataMap.get("ekk0321_upd_dtm");
			}
			
			// 上りマッピング処理
			paramMap = editInMsg_EKK0321C020(param, dataMap, mtSvcKeiMap, mskmDtlNo, updDtmBf);
			
			// SC呼出実行
			result = scCall.run(paramMap, handle);
			
			// 実行結果の編集
			editOutMsg_EKK0321C020(result, param, fixedText);
			
			// 指示書登録処理
			// E請求契約番号（#T）の情報
			// ◇ 上りマッピング処理
			addSjishoSeiKyKeiNoInf(handle, param, scCall, result, fixedText, dataMap, mtSvcKeiMap);
			
			updCnt++;
		}
	}
	
	
	/**
	 * 請求契約を更新します。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param fixedText
	 * @param skSeikyKeiNo
	 * @throws Exception
	 */
	private void executeUpdSeikyKei(
										SessionHandle handle, 
										IRequestParameterReadWrite param, 
										ServiceComponentRequestInvoker scCall, 
										HashMap<String, Object> dataMap, 
										String fixedText, 
										String skSeikyKeiNo) throws Exception
	{
		Map<?, ?> resultEKK0491A010 = null;
		Map<?, ?> result = null;
		HashMap<String, Object> paramMap = null;
		
		//**********************************************************
		// 請求契約一意照会
		//**********************************************************
		// 上りメッセージ作成
		paramMap = editInMsg_EKK0491A010(param, dataMap, skSeikyKeiNo);
		
		// サービスIFの実行
		resultEKK0491A010 = scCall.run(paramMap, handle);
		
		// 実行結果の編集
		editOutMsg_EKK0491A010(resultEKK0491A010, param, dataMap, fixedText);
		
		//**********************************************************
		// 請求契約内容変更
		//**********************************************************
		// 上りメッセージ作成
		paramMap = editInMsg_EKK0491C060(param, dataMap, skSeikyKeiNo, resultEKK0491A010);
		
		// サービスIFの実行
		result = scCall.run(paramMap, handle);
		
		// 実行結果の編集
		editOutMsg_EKK0491C060(result, param, dataMap, fixedText);
	}
	
	/**
	 * 請求オプションサービス契約存在チェック
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param fixedText
	 * @param mtSeikyKeiNo
	 * @return boolean
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private boolean isExistSeikyOpSvcKei(
											SessionHandle handle, 
											IRequestParameterReadWrite param, 
											ServiceComponentRequestInvoker scCall, 
											HashMap<String, Object> dataMap, 
											String fixedText, 
											String mtSeikyKeiNo) throws Exception
	{
		Map<?, ?> result = null;
		HashMap<String, Object> paramMap = null;
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		//**********************************************************
		// 請求オプションサービス契約一覧照会（複合検索）
		//**********************************************************
		// 上りメッセージ作成
		paramMap = editInMsg_EKK0441B002(param, dataMap, mtSeikyKeiNo);
		
		// サービスIFの実行
		result = scCall.run(paramMap, handle);
		
		// 実行結果の編集
		editOutMsg_EKK0441B002(result, param, dataMap, fixedText);
		
		// 請求オプションサービス契約存在フラグ
		String existFlg = (String)workDataMap.get("seiopsvc_kei_exist_flg");
		
		if(EXIST_FLG_Y.equals(existFlg))
		{
			return true;
		}
		
		return false;
	}
	
/* ++++++++++ v4.05.00 変更開始 ++++++++++ */
	/**
	 * 請求オプションサービス契約をキャンセルします。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param fixedText
	 * @param seikyKeiNo
	 * @param updDtmBf
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void executeCnclSeikyOpSvcKei(
											SessionHandle handle, 
											IRequestParameterReadWrite param, 
											ServiceComponentRequestInvoker scCall, 
											HashMap<String, Object> dataMap, 
											String fixedText, 
											String seikyKeiNo,
											String updDtmBf) throws Exception
	{
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		Object[][] ekk0441c210In = {{EKK0441C210CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0441C210},
									{EKK0441C210CBSMsg.FUNC_CODE, FUNC_CODE_1},
									{EKK0441C210CBSMsg.SEIOPSVC_KEI_NO, workDataMap.get("seiopsvc_kei_no")},	// 請求オプションサービス契約番号
									{EKK0441C210CBSMsg.MSKM_DTL_NO, workDataMap.get("mskm_dtl_no")},			// 申込明細番号
									{EKK0441C210CBSMsg.SVC_CANCEL_RSN_CD, dataMap.get("svc_cancel_rsn_cd")},	// サービスキャンセル理由コード(01:申出によるキャンセル)
									{EKK0441C210CBSMsg.IDO_DIV, dataMap.get("ido_div")},						// 異動区分
									{EKK0441C210CBSMsg.UPD_DTM_BF, updDtmBf}};									// 請求契約＿更新年月日時分秒
		
		// 実行
		callSC(handle, scCall, param, fixedText, ekk0441c210In);
	}
	
	/**
	 * 請求オプションサービス契約を解約します。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param fixedText
	 * @param seikyKeiNo
	 * @param updDtmBf
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void executeDslSeikyOpSvcKei(
											SessionHandle handle, 
											IRequestParameterReadWrite param, 
											ServiceComponentRequestInvoker scCall, 
											HashMap<String, Object> dataMap, 
											String fixedText, 
											String seikyKeiNo,
											String updDtmBf) throws Exception
	{
		Map<?, ?> result = null;
		HashMap<String, Object> paramMap = null;
		
		//**********************************************************
		// 料金スケジュール定義イベント一覧照会
		// 料金計算走行日 取得
		//**********************************************************
		// 上りメッセージ作成
		paramMap = editInMsg_ECH0501B010(param, dataMap);
		
		// サービスIFの実行
		result = scCall.run(paramMap, handle);
		
		// 実行結果の編集
		editOutMsg_ECH0501B010(result, param, dataMap, fixedText);
		
		//**********************************************************
		// サービス課金終了年月日 取得
		//**********************************************************
		String svcChrgEndYmd = getSvcChrgEndYmd(param, dataMap, fixedText);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		String seiopsvcKeiNo = (String)workDataMap.get("seiopsvc_kei_no");
		String svcEndymd = (String)dataMap.get("svc_endymd");
		String svcDslymd = (String)dataMap.get("svc_dsl_ymd");
		String svcDlreCd = (String)dataMap.get("svc_dlre_cd");
		
		//**********************************************************
		// 請求オプションサービス契約解約
		//**********************************************************
		Object[][] ekk0441c230In = {{EKK0441C230CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0441C230},
									{EKK0441C230CBSMsg.FUNC_CODE, FUNC_CODE_1},
									{EKK0441C230CBSMsg.SEIOPSVC_KEI_NO, seiopsvcKeiNo},					// 請求オプションサービス契約番号
									{EKK0441C230CBSMsg.MSKM_DTL_NO, workDataMap.get("mskm_dtl_no")},	// 申込明細番号
									{EKK0441C230CBSMsg.SVC_ENDYMD, svcEndymd},							// サービス終了年月日
									{EKK0441C230CBSMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd},					// サービス課金終了年月日
//									{EKK0441C230CBSMsg.PLAN_END_SBT_CD, dataMap.get("plan_end_sbt_cd")},// プラン終了種別コード（2:解約による終了）
									{EKK0441C230CBSMsg.SVC_DSL_YMD, svcDslymd},							// サービス解約年月日
									{EKK0441C230CBSMsg.SVC_DLRE_CD, svcDlreCd},							// サービス解約理由コード（01:通常解約）
									{EKK0441C230CBSMsg.IDO_DIV, dataMap.get("ido_div")},				// 異動区分
									{EKK0441C230CBSMsg.UPD_DTM_BF, updDtmBf}};							// 請求契約＿更新年月日時分秒
		
		// 実行
		CAANMsg ekk0441c230Out = callSC(handle, scCall, param, fixedText, ekk0441c230In);
		String c230OutGeneAddDtm = ekk0441c230Out.getString(EKK0441C230CBSMsg.GENE_ADD_DTM);
		String c230OutUpdDtm = ekk0441c230Out.getString(EKK0441C230CBSMsg.UPD_DTM);
		
		//**********************************************************
		// 請求オプションサービス契約解約確定
		//**********************************************************
		Object[][] ekk0441c240In = {{EKK0441C240CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0441C240},
									{EKK0441C240CBSMsg.FUNC_CODE, FUNC_CODE_1},
									{EKK0441C240CBSMsg.SEIOPSVC_KEI_NO, seiopsvcKeiNo},					// 請求オプションサービス契約番号
									{EKK0441C240CBSMsg.GENE_ADD_DTM, c230OutGeneAddDtm},				// 請求オプションサービス契約解約.世代登録年月日時分秒
									{EKK0441C240CBSMsg.SVC_ENDYMD, svcEndymd},							// サービス終了年月日
									{EKK0441C240CBSMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd},					// サービス課金終了年月日
									{EKK0441C240CBSMsg.SVC_DSL_YMD, svcDslymd},							// サービス解約年月日
									{EKK0441C240CBSMsg.SVC_DLRE_CD, svcDlreCd},							// サービス解約理由コード（01:通常解約）
									{EKK0441C240CBSMsg.UPD_DTM_BF, c230OutUpdDtm}};						// 請求オプションサービス契約解約.更新年月日時分秒
		
		// 実行
		callSC(handle, scCall, param, fixedText, ekk0441c240In);
	}
/* ++++++++++ v4.05.00 変更終了 ++++++++++ */
	
	/**
	 * 指示書の登録処理を行います。
	 * E請求契約番号（#T）の情報
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private IRequestParameterReadWrite addSjishoSeiKyKeiNoInf(
																SessionHandle handle, 
																IRequestParameterReadWrite param, 
																ServiceComponentRequestInvoker scCall, 
																Map<?, ?> result, 
																String fixedText, 
																HashMap<String, Object> dataMap, 
																HashMap<String, String> svcMap) throws Exception
	{
		HashMap<String, Object> paramMap = null;
		
		// ◇ 上りマッピング処理
		paramMap = editInMsgSjisho(param, dataMap, svcMap);
		
		// ◇ SC呼出実行
		result = scCall.run(paramMap, handle);
		
		// ◇ 下りマッピング処理
		editOutMsgSjisho(result, param, fixedText);
		
		return param;
	}
	
	/**
	 * 指示書登録（請求契約番号情報）用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @param kakinsOut
	 * @param skSeikyKeiNo
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsgSjisho(
														IRequestParameterReadWrite param,
														HashMap<String, Object> dataMap, 
														HashMap<String, String> svcMap) throws RequestParameterException
	{
		// 共通部の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(ECK0151D010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ECK0151D010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0151D010);
		// 機能コード
		template.set(ECK0151D010CBSMsg.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);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		// ◇ 業務データの設定
		setParam(template, dataMap, ECK0151D010CBSMsg.TRN_CD, "trn_cd");									// 処理コード
		setParam(template, dataMap, ECK0151D010CBSMsg.TRGT_TABLE_ID, "seiky_trgt_table_id");				// 対象テーブルID
		setParam(template, dataMap, ECK0151D010CBSMsg.TRAN_TRGT_SYSID, "sk_sysid");							// 処理対象SYSID
		setParam(template, dataMap, ECK0151D010CBSMsg.RSLT_FLG, "rslt_flg");								// 結果フラグ
		setParam(template, dataMap, ECK0151D010CBSMsg.PARAMETER_YK_CNT, "seiky_pram_yk_cnt");				// パラメータ有効数
		setParam(template, svcMap, ECK0151D010CBSMsg.PARAMETER_1, "svc_kei_no");							// パラメータ1
		setParam(template, dataMap, ECK0151D010CBSMsg.PARAMETER_2, "seiky_param2_svc_kei_cd");				// パラメータ2
		setParam(template, dataMap, ECK0151D010CBSMsg.PARAMETER_3, "seiky_param3_svc_kei_cd_tbn");			// パラメータ3
		setParam(template, dataMap, ECK0151D010CBSMsg.PARAMETER_4, "sk_seiky_kei_no");						// パラメータ4
		/* ++++++++++ v4.04.00 追加開始 ++++++++++ */
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_5, "ekk0321_kakins_tstaymd");			// パラメータ5
		/* ++++++++++ v4.04.00 追加開始 ++++++++++ */
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_6, "ekk0321_kakins_tendymd");			// パラメータ6
		template.setNull(ECK0151D010CBSMsg.PARAMETER_7);													// パラメータ7
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_8, "ekk0321_mk_flg");					// パラメータ8
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_9, "ekk0321_add_dtm");					// パラメータ9
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_10, "ekk0321_add_opeacnt");				// パラメータ10
		template.setNull(ECK0151D010CBSMsg.PARAMETER_11);													// パラメータ11
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_12, "ekk0321_upd_dtm");					// パラメータ12
		setParam(template, workDataMap, ECK0151D010CBSMsg.PARAMETER_13, "ekk0321_upd_opeacnt");				// パラメータ13
		template.setNull(ECK0151D010CBSMsg.PARAMETER_14);													// パラメータ11
		
		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 RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsgSjisho(
															Map<?, ?> msgList,
															IRequestParameterReadWrite param,
															String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo(param, templates, Integer.parseInt(rtnCode), fixedText, ECK0151D010CBSMsg.STATUS);
		
		//エラー情報のマップを取得
		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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * インターネットサービス契約が存在するか請求契約側からチェック。
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param dataMap
	 * @param fixedText
	 * @param seikyKeiNo
	 * @param rsvAplyYmd
	 * @return boolean
	 * @throws Exception
	 */
	private boolean hasNetSvcKeiFromSeikyKei(
												SessionHandle handle, 
												IRequestParameterReadWrite param, 
												ServiceComponentRequestInvoker scCall, 
												HashMap<String, Object> dataMap, 
												String fixedText, 
												String seikyKeiNo,
												String rsvAplyYmd) throws Exception
	{
		//**********************************************************
		// 請求契約側からサービス契約を検索
		// 課金先一覧照会（請求契約番号/サービス契約番号）
		//**********************************************************
		Object[][] ekk0321b002inMsg = {
										{EKK0321B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B002},
										{EKK0321B002CBSMsg.FUNC_CODE, FUNC_CODE_1},
										{EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo},
										{EKK0321B002CBSMsg.KEY_RSV_APLY_YMD, rsvAplyYmd}
										};
		
		CAANMsg[] ekk0321b002outMsg = callSC(handle, scCall, param, fixedText, ekk0321b002inMsg).getCAANMsgList(EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST);
		
		for(int i=0; i<ekk0321b002outMsg.length; i++)
		{
			if(isEmpty(ekk0321b002outMsg[i].getString(EKK0321B002CBSMsg1List.SVC_KEI_NO)))
			{
				continue;
			}
			
			//**********************************************************
			// サービス契約一意照会
			//**********************************************************
			Object[][] ekk0081a010inMsg = {
											{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010},
											{EKK0081A010CBSMsg.FUNC_CODE, FUNC_CODE_2},
											{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, ekk0321b002outMsg[i].getString(EKK0321B002CBSMsg1List.SVC_KEI_NO)},
/* ++++++++++ v4.02.00 修正開始 ++++++++++ */
											{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, (String)dataMap.get("ope_date")}
/* ++++++++++ v4.02.00 修正終了 ++++++++++ */
											};
			
			CAANMsg[] ekk0081a010outMsg =callSC(handle, scCall, param, fixedText, ekk0081a010inMsg).getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
			
			if (ekk0081a010outMsg == null || ekk0081a010outMsg.length == 0)
			{
				continue;
			}
			
			// サービス契約ステータス
			String svcKeiStat = ekk0081a010outMsg[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
			
			// サービス契約ステータス = 910:"解約済" または 920:"キャンセル済" は対象外
			if(SVC_KEI_STAT_DSL_ZM.equals(svcKeiStat) || SVC_KEI_STAT_CANCEL_ZM.equals(svcKeiStat))
			{
				continue;
			}
			
/* ++++++++++ v8.00.00 変更開始 ++++++++++ */
			// サービスコード = 01:"インターネットサービス"の契約件数が1件以上の場合
//			if(SVC_CD_NET.equals(ekk0081a010outMsg[0].getString(EKK0081A010CBSMsg1List.SVC_CD)))
			if(JKKStrConst.CD00130_01.equals(ekk0081a010outMsg[0].getString(EKK0081A010CBSMsg1List.SVC_CD))
					|| JKKStrConst.CD00130_51.equals(ekk0081a010outMsg[0].getString(EKK0081A010CBSMsg1List.SVC_CD)))
/* ++++++++++ v8.00.00 変更終了 ++++++++++ */
			{
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * 課金先請求契約変更用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @param svcMap
	 * @param mskmDtlNo
	 * @param updDtmBf
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_EKK0321C020(
															IRequestParameterReadWrite param,
															HashMap<String, Object> dataMap,
															HashMap<String, String> svcMap,
															String mskmDtlNo, 
															String updDtmBf) throws RequestParameterException
	{
		// 共通領域の情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0321C020CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0321C020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321C020);
		// 機能コード
		template.set(EKK0321C020CBSMsg.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);
		
		// ◇ 業務データの設定
		setParam(template, svcMap, EKK0321C020CBSMsg.KAKINS_NO, "kakins_no_KK0321");	// 課金先番号
		setParam(template, dataMap, EKK0321C020CBSMsg.SEIKY_KEI_NO, "sk_seiky_kei_no");	// 請求契約番号(併合先)
		setParam(template, dataMap, EKK0321C020CBSMsg.KAKINS_TSTAYMD, "kakins_tstaymd");// 課金先適用開始年月日
/* ++++++++++ v4.03.00 修正開始 ++++++++++ */
		template.set(EKK0321C020CBSMsg.IDO_DIV, IDO_DIV_VALUE_00016);					// 異動区分
/* ++++++++++ v4.03.00 修正終了 ++++++++++ */
		template.set(EKK0321C020CBSMsg.MSKM_DTL_NO, mskmDtlNo);							// 申込明細番号
		template.set(EKK0321C020CBSMsg.UPD_DTM_BF, updDtmBf);							// 更新年月日時分秒(更新前)
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 請求契約一意照会用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @param skSeikyKeiNo
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_EKK0491A010(
															IRequestParameterReadWrite param,
															HashMap<String, Object> inMap, 
															String skSeikyKeiNo) throws RequestParameterException
	{
		// 共通領域の情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0491A010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010);
		// 機能コード
		template.set(EKK0491A010CBSMsg.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(EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, skSeikyKeiNo);					// 請求契約番号(併合先)
/* ++++++++++ v4.02.00 修正開始 ++++++++++ */
		setParam(template, inMap, EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, "ope_date");		// 運用日
/* ++++++++++ v4.02.00 修正終了 ++++++++++ */
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 請求契約内容変更用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @param skSeikyKeiNo
	 * @param resultEKK0491A010
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg_EKK0491C060(IRequestParameterReadWrite param,
															HashMap<String, Object> inMap,
															String skSeikyKeiNo, 
															Map<?, ?> resultEKK0491A010) throws RequestParameterException
	{
		// 共通領域の情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0491C060CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0491C060CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491C060);
		// 機能コード
		template.set(EKK0491C060CBSMsg.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);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		// ◇ 業務データの設定
		template.set(EKK0491C060CBSMsg.SEIKY_KEI_NO, skSeikyKeiNo);							// 請求契約番号（併合先）
		setParam(template, workDataMap, EKK0491C060CBSMsg.MSKM_DTL_NO, "mskm_dtl_no");		// 申込明細番号
		setParam(template, inMap, EKK0491C060CBSMsg.SEIKYUS_HAKKO_YH, "seikyus_hakko_yh");	// 請求書発行要否（否）
/* ++++++++++ v4.02.00 修正開始 ++++++++++ */
		setParam(template, inMap, EKK0491C060CBSMsg.RSV_APLY_YMD, "ope_date");				// 運用日
/* ++++++++++ v4.02.00 修正終了 ++++++++++ */
/* ++++++++++ v4.03.00 修正開始 ++++++++++ */
		template.set(EKK0491C060CBSMsg.IDO_DIV, IDO_DIV_VALUE_00016);						// 異動区分
/* ++++++++++ v4.03.00 修正終了 ++++++++++ */
		setParam(template, inMap, EKK0491C060CBSMsg.UPD_DTM_BF, "sk_seiky_upd_dtm");		// 更新年月日時分秒（更新前）
		
		//******************************************
		// 請求契約内容変更 ← 請求契約一意照会
		//******************************************
		
		// 請求契約一意照会戻り値
		CAANMsg[] templatesEKK0491A010 = (CAANMsg[]) resultEKK0491A010.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templatesEKK0491A010[0];
		CAANMsg[] templateArray = null;
		
		templateArray = parentTemplate.getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
		
		if (templateArray != null) {
				CAANMsg childTemplate = templateArray[0];
			
			// 請求契約カナ名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SEIKY_KEI_KANA)) {
				template.setNull(EKK0491C060CBSMsg.SEIKY_KEI_KANA);
			} else {
				template.set(EKK0491C060CBSMsg.SEIKY_KEI_KANA, childTemplate.getString(EKK0491A010CBSMsg1List.SEIKY_KEI_KANA));
			}
			
			// 情報表示コード
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.INFO_DSP_CD)) {
				template.setNull(EKK0491C060CBSMsg.INFO_DSP_CD);
			} else {
				template.set(EKK0491C060CBSMsg.INFO_DSP_CD, childTemplate.getString(EKK0491A010CBSMsg1List.INFO_DSP_CD));
			}
			
			// 契約者住所差異フラグ
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SKS_SHS_KSH_AD_SAI_FLG)) {
				template.setNull(EKK0491C060CBSMsg.SKS_SHS_KSH_AD_SAI_FLG);
			} else {
				template.set(EKK0491C060CBSMsg.SKS_SHS_KSH_AD_SAI_FLG, childTemplate.getString(EKK0491A010CBSMsg1List.SKS_SHS_KSH_AD_SAI_FLG));
			}
			
			// お客様名差異フラグ
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SKS_SHS_NM_CUST_NM_SAI_FLG)) {
				template.setNull(EKK0491C060CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG);
			} else {
				template.set(EKK0491C060CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG, childTemplate.getString(EKK0491A010CBSMsg1List.SKS_SHS_NM_CUST_NM_SAI_FLG));
			}
			
			// 送付先法人格種別コード
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SHS_HOJIN_SBT_CD)) {
				template.setNull(EKK0491C060CBSMsg.SHS_HOJIN_SBT_CD);
			} else {
				template.set(EKK0491C060CBSMsg.SHS_HOJIN_SBT_CD, childTemplate.getString(EKK0491A010CBSMsg1List.SHS_HOJIN_SBT_CD));
			}
			
			// 送付先法人格前後指定コード
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SHS_HOJIN_ZENGO_SHITEI_CD)) {
				template.setNull(EKK0491C060CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD);
			} else {
				template.set(EKK0491C060CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD, childTemplate.getString(EKK0491A010CBSMsg1List.SHS_HOJIN_ZENGO_SHITEI_CD));
			}
			
			// 送付先カナ名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SHS_KANA)) {
				template.setNull(EKK0491C060CBSMsg.SHS_KANA);
			} else {
				template.set(EKK0491C060CBSMsg.SHS_KANA, childTemplate.getString(EKK0491A010CBSMsg1List.SHS_KANA));
			}
			
			// 送付先名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_NM));
			}
			
			// 請送付先部課名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_BKM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_BKM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_BKM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_BKM));
			}
			
			// 送付先担当者名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_TNTSHA_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_TNTSHA_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_TNTSHA_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_TNTSHA_NM));
			}
			
			// 送付先住所コード
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_AD_CD)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_AD_CD);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_AD_CD, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_AD_CD));
			}
			
			// 送付先郵便番号
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_PCD)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_PCD);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_PCD, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_PCD));
			}
			
			// 送付先都道府県名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_STATE_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_STATE_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_STATE_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_STATE_NM));
			}
			
			// 送付先市区町村名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_CITY_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_CITY_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_CITY_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_CITY_NM));
			}
			
			// 送付先大字通称名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_OAZTSU_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_OAZTSU_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_OAZTSU_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_OAZTSU_NM));
			}
			
			// 送付先字丁目名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_AZCHO_NM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_AZCHO_NM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_AZCHO_NM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_AZCHO_NM));
			}
			
			// 送付先住所補記・建物名
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_ADRTTM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_ADRTTM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_ADRTTM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_ADRTTM));
			}
			
			// 送付先住所補記・部屋番号
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_ADRRM)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_ADRRM);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_ADRRM, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_ADRRM));
			}
			
			// 送付先番地号
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_BNCHIGO)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_BNCHIGO);
			} else {
				template.set(EKK0491C060CBSMsg.SOHUS_BNCHIGO, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_BNCHIGO));
			}
			
			// 送付先電話番号
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_TELNO)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_TELNO);	
			} else {
				template.set(EKK0491A010CBSMsg1List.SOHUS_TELNO, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_TELNO));
			}
			
			// 送付先FAX番号
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_FAX_NO)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_FAX_NO);
			} else {
				template.set(EKK0491A010CBSMsg1List.SOHUS_FAX_NO, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_FAX_NO));
			}
			
			// 送付先メールアドレス
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_MLAD)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_MLAD);
			} else {
				template.set(EKK0491A010CBSMsg1List.SOHUS_MLAD, childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_MLAD));
			}
			
			// 請求書送付先変更年月日
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SEIKYUS_SOHUS_CHGE_YMD)) {
				template.setNull(EKK0491C060CBSMsg.SEIKYUS_SOHUS_CHGE_YMD);
			} else {
				template.set(EKK0491A010CBSMsg1List.SEIKYUS_SOHUS_CHGE_YMD, childTemplate.getString(EKK0491A010CBSMsg1List.SEIKYUS_SOHUS_CHGE_YMD));
			}
			
			// 請求方法適用調整年月日
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SEIKY_WAY_APLY_ADJ_YMD)) {
				template.setNull(EKK0491C060CBSMsg.SEIKY_WAY_APLY_ADJ_YMD);
			} else {
				template.set(EKK0491A010CBSMsg1List.SEIKY_WAY_APLY_ADJ_YMD, childTemplate.getString(EKK0491A010CBSMsg1List.SEIKY_WAY_APLY_ADJ_YMD));
			}
			
			// 予約適用開始希望年月日
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.RSV_TSTA_KIBO_YMD)) {
				template.setNull(EKK0491C060CBSMsg.RSV_TSTA_KIBO_YMD);
			} else {
				template.set(EKK0491C060CBSMsg.RSV_TSTA_KIBO_YMD, childTemplate.getString(EKK0491A010CBSMsg1List.RSV_TSTA_KIBO_YMD));
			}
			
			// 予約適用コード
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.RSV_APLY_CD)) {
				template.setNull(EKK0491C060CBSMsg.RSV_APLY_CD);	
			} else {
				template.set(EKK0491C060CBSMsg.RSV_APLY_CD, childTemplate.getString(EKK0491A010CBSMsg1List.RSV_APLY_CD));
			}
			
			// 初回請求年月
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.FIRST_SEIKY_YM)) {
				template.setNull(EKK0491C060CBSMsg.FIRST_SEIKY_YM);
			} else {
				template.set(EKK0491C060CBSMsg.FIRST_SEIKY_YM, childTemplate.getString(EKK0491A010CBSMsg1List.FIRST_SEIKY_YM));
			}
			
			// 初回支払申込書送付要否
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YH)) {
				template.setNull(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YH);
			} else {
				template.set(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YH, childTemplate.getString(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YH));
			}
			
			// 初回支払申込書送付年月日
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YMD)) {
				template.setNull(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YMD);
			} else {
				template.set(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YMD, childTemplate.getString(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YMD));
			}
			
			// 初回支払申込書受領年月日
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_RCP_YMD)) {
				template.setNull(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD);
			} else {
				template.set(EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD, childTemplate.getString(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_RCP_YMD));
			}
			
			// 送付先住所手動入力フラグ
			String sohusAdManInputFlg = "";
			if (childTemplate.isNull(EKK0491A010CBSMsg1List.SOHUS_AD_MAN_INPUT_FLG)) {
				template.setNull(EKK0491C060CBSMsg.SOHUS_AD_MAN_INPUT_FLG);
			} else {
				sohusAdManInputFlg = childTemplate.getString(EKK0491A010CBSMsg1List.SOHUS_AD_MAN_INPUT_FLG);
				template.set(EKK0491C060CBSMsg.SOHUS_AD_MAN_INPUT_FLG, sohusAdManInputFlg);
			}
			
			// 送付先住所チェックレベル
			if("1".equals(sohusAdManInputFlg))
			{
				template.set(EKK0491C060CBSMsg.SOHUS_AD_CHK_LV, "0");
			}
			else
			{
				template.set(EKK0491C060CBSMsg.SOHUS_AD_CHK_LV, "1");
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 請求オプションサービス契約一覧照会（複合検索）用のメッセージを作成します。
	 * １請求＝１請求オプションサービス契約
	 * ※検索Ｋｅｙに予約適用年月日を指定しないことで世代登録年月日時分秒の最大が取得できる
	 * 
	 * @param param
	 * @param inMap
	 * @param mtSeikyKeiNo
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_EKK0441B002(
															IRequestParameterReadWrite param,
															HashMap<String, Object> inMap,
															String mtSeikyKeiNo) throws RequestParameterException
	{
		// 共通領域の情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(EKK0441B002CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK0441B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0441B002);
		// 機能コード
		template.set(EKK0441B002CBSMsg.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(EKK0441B002CBSMsg.KEY_SEIKY_KEI_NO, mtSeikyKeiNo);					// 併合元請求契約番号
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * 料金スケジュール定義イベント一覧照会用のメッセージを作成します。
	 * 
	 * @param param
	 * @param inMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg_ECH0501B010(
															IRequestParameterReadWrite param,
															HashMap<String, Object> inMap) throws RequestParameterException
	{
		// 共通領域の情報の設定
		HashMap<String, Object> paramMap = editInMsg(param);
		
		CAANMsg template = new CAANMsg(ECH0501B010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(ECH0501B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0501B010);
		// 機能コード
		template.set(ECH0501B010CBSMsg.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(ECH0501B010CBSMsg.KEY_EVENT_CD, "03");						// イベントコード
/* ++++++++++ v4.02.00 修正開始 ++++++++++ */
		setParam(template, inMap, ECH0501B010CBSMsg.KEY_STDARDYMD, "ope_date");	// 運用日
/* ++++++++++ v4.02.00 修正終了 ++++++++++ */
		
		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;
	}
	
	/**
	 * 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 msgList
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0321C020(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0321C020(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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		if (templates != null && templates.length > 0)
		{
			// 課金先適用開始年月日
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD)))
			{
				workDataMap.put("ekk0321_kakins_tstaymd", templates[0].getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD));
			}
			else
			{
				workDataMap.put("ekk0321_kakins_tstaymd", new String());
			}
			
			// 課金先適用終了年月日
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.KAKINS_TENDYMD)))
			{
				workDataMap.put("ekk0321_kakins_tendymd", templates[0].getString(EKK0321C020CBSMsg.KAKINS_TENDYMD));
			}
			else
			{
				workDataMap.put("ekk0321_kakins_tendymd", KAKINS_TEND_YMD);
			}
			
			// 無効フラグ
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.MK_FLG)))
			{
				workDataMap.put("ekk0321_mk_flg", templates[0].getString(EKK0321C020CBSMsg.MK_FLG));
			}
			
			// 登録年月日時分秒
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.ADD_DTM)))
			{
				workDataMap.put("ekk0321_add_dtm", templates[0].getString(EKK0321C020CBSMsg.ADD_DTM));
			}
			
			// 登録オペレータアカウント
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.ADD_OPEACNT)))
			{
				workDataMap.put("ekk0321_add_opeacnt", templates[0].getString(EKK0321C020CBSMsg.ADD_OPEACNT));
			}
			
			// 更新年月日時分秒
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.UPD_DTM)))
			{
				workDataMap.put("ekk0321_upd_dtm", templates[0].getString(EKK0321C020CBSMsg.UPD_DTM));
			}
			
			// 更新オペレータアカウント
			if (!isEmpty(templates[0].getString(EKK0321C020CBSMsg.UPD_OPEACNT)))
			{
				workDataMap.put("ekk0321_upd_opeacnt", templates[0].getString(EKK0321C020CBSMsg.UPD_OPEACNT));
			}
		}
		
		workMap.put("WORK", workDataMap);
		param.setMappingWorkArea(workMap);
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0491A010(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> dataMap,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = null;
		
		retParam = this.editErrorInfo_EKK0491A010(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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0491C060(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> dataMap,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = null;
		
		retParam = this.editErrorInfo_EKK0491C060(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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		if (templates != null)
		{
			// 更新年月日時分秒
			if(!isEmpty(templates[0].getString(EKK0491C060CBSMsg.UPD_DTM)))
			{
				workDataMap.put("ekk0491_upd_dtm", templates[0].getString(EKK0491C060CBSMsg.UPD_DTM));
			}
		}
		
		workMap.put("WORK", workDataMap);
		param.setMappingWorkArea(workMap);
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_ECH0501B010(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> dataMap,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_ECH0501B010(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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		templateArray = parentTemplate.getCAANMsgList(ECH0501B010CBSMsg.ECH0501B010CBSMSG1LIST);
		
		if (templateArray != null && templateArray.length != 0) {
			
			CAANMsg childTemplate = templateArray[0];
			
			// 料金スケジュール定義一覧照会マップ.料金スケジュール定義一覧照会結果リスト.イベント年月日 ← 料金スケジュール定義一覧照会結果リスト.イベント年月日
			if (!childTemplate.isNull(ECH0501B010CBSMsg1List.EVENT_YMD)) {
				workDataMap.put("ch501_event_ymd", childTemplate.getString(ECH0501B010CBSMsg1List.EVENT_YMD));
			}
		}
		
		return retParam;
	}
	
	/**
	 * 
	 * @param msgList
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg_EKK0441B002(
																Map<?, ?> msgList,
																IRequestParameterReadWrite param,
																HashMap<String, Object> dataMap,
																String fixedText) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		// リターンコード取得
		String rtnCode = msgList.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = templates[0].getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		IRequestParameterReadWrite retParam = this.editErrorInfo_EKK0441B002(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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status)){
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		// 請求オプションサービス契約一覧照会明細
		templateArray = parentTemplate.getCAANMsgList(EKK0441B002CBSMsg.EKK0441B002CBSMSG1LIST);
		
		String existFlg = "0";
		
		if (templateArray != null && templateArray.length > 0)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				// 請求オプションサービス契約ステータスが"910":解約済 または "920":キャンセル済は対象外
				if (!childTemplate.isNull(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT))
				{
					String seiopsvcKeiStat = childTemplate.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT);
					if(SEIOP_SVC_KEI_STAT_DSL_ZM.equals(seiopsvcKeiStat) || SEIOP_SVC_KEI_STAT_CANCEL_ZM.equals(seiopsvcKeiStat))
					{
						continue;
					}
				}

				// ANK-2248-00-00 ADD START
				String seiopsvcKeiPcrs = childTemplate.getString(EKK0441B002CBSMsg1List.PCRS_CD);
				String seiopsvcKeiPplan = childTemplate.getString(EKK0441B002CBSMsg1List.PPLAN_CD);

				// 料金コースコードと料金プランコードがNHK団体一括契約は対象外
				if(SEIOP_SVC_KEI_PCRS_CD_NHK.equals(seiopsvcKeiPcrs) && SEIOP_SVC_KEI_PPLAN_CD_NHK.equals(seiopsvcKeiPplan))
				{
					continue;
				}
				// ANK-2248-00-00 ADD END
				
				// 作業項目マップ.請求オプションサービス契約番号 ← 請求オプションサービス契約一覧照会明細.請求オプションサービス契約番号
				if (!childTemplate.isNull(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_NO))
				{
					workDataMap.put("seiopsvc_kei_no", childTemplate.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_NO));
					existFlg = EXIST_FLG_Y;
				}
				
				// 作業項目マップ.請求オプションサービス契約ステータス ← 請求オプションサービス契約一覧照会明細.請求オプションサービス契約ステータス
				if (!childTemplate.isNull(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT))
				{
					workDataMap.put("seiopsvc_kei_stat", childTemplate.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT));
				}
				
				// 作業項目マップ.サービス課金開始年月日 ← 請求オプションサービス契約一覧照会明細.サービス課金開始年月日
				if (!childTemplate.isNull(EKK0441B002CBSMsg1List.SVC_CHRG_STAYMD))
				{
					workDataMap.put("svc_chrg_staymd", childTemplate.getString(EKK0441B002CBSMsg1List.SVC_CHRG_STAYMD));
				}
			}
		}
		
		workDataMap.put("seiopsvc_kei_exist_flg", existFlg);
		
		workMap.put("WORK", workDataMap);
		param.setMappingWorkArea(workMap);
		
		return retParam;
	}
	
	/**
	 * エラー情報を設定します。
	 * 
	 * @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));
					}
				}
			}
		}
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0321C020(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK0321C020CBSMsg.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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0491A010(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK0491A010CBSMsg.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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0491C060(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK0491C060CBSMsg.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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_ECH0501B010(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(ECH0501B010CBSMsg.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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo_EKK0441B002(
																	IRequestParameterReadWrite param, 
																	CAANMsg[] templates,
																	int returnCode,
																	String fixedText) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK0441B002CBSMsg.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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @param status
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, 
														CAANMsg[] templates,
														int returnCode,
														String fixedText, 
														String status) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(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(template, (HashMap<String, Object>)param.getData(fixedText));
		
		return param;
	}
	
	/**
	 * 併合対象(併合元)の請求契約番号マップ(重複なし)を取得します。<br>
	 * <br>
	 * @param list
	 * @return HashMap<String, String> 
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, String> getMtSeikyKeiNoMap(ArrayList<HashMap<String, String>> list)
	{
		// 併合対象(併合元)の請求契約番号マップ
		HashMap<String, String> mtSeikyKeiNoMap = new HashMap<String, String>();
		
		// 併合元リスト分ループ
		for(int i=0; i<list.size(); i++)
		{
			// 併合元一覧データマップ
			HashMap<String, String> dataMap = (HashMap)list.get(i);
			
			// 画面で選択されていない場合は対象外
			if(!(Boolean.valueOf(dataMap.get("isSelect"))))
			{
				continue;
			}
			
			// 併合元＿請求契約番号
			String seikyKeiNo = dataMap.get("seiky_kei_no");
			
			// 併合元＿請求契約番号が重複しない場合
			if(!mtSeikyKeiNoMap.containsKey(seikyKeiNo))
			{
				// 併合元＿請求契約番号をkeyに更新年月日時分秒(請求契約)を格納
				mtSeikyKeiNoMap.put(seikyKeiNo, dataMap.get("upd_dtm_KK0491"));
			}
		}
		
		return mtSeikyKeiNoMap;
	}
	
	/**
	 * サービス課金終了年月日取得
	 * <br>
	 * @param param
	 * @param dataMap
	 * @param fixedText
	 * @return svcChrgEndYmd
	 * @throws RequestParameterException, ParseException
	 */
	@SuppressWarnings("unchecked")
	private String getSvcChrgEndYmd(
										IRequestParameterReadWrite param, 
										HashMap<String, Object> dataMap,
										String fixedText) throws RequestParameterException, ParseException
	{
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("WORK");
		
		// サービス課金終了年月日
		String svcChrgEndYmd = "";
		
//		// 料金計算走行日
//		String prcSokoYmd = (String)workDataMap.get("ch501_event_ymd");
//		
///* ++++++++++ v4.02.00 修正開始 ++++++++++ */
//		// 運用日
//		String opeDate = (String)dataMap.get("ope_date");
///* ++++++++++ v4.02.00 修正終了 ++++++++++ */
//		
//		// 運用日(YYYYMM)
//		String opeDateYM = opeDate.substring(0, 6);
//		
//		// 当月１日
//		String beginOfMonth = "";
//		// 当月末日
//		String endOfMonth = "";
//		
//		// 当月１日
//		beginOfMonth = editDate(opeDateYM, FIRST_DATE);
//		
//		// 当月末日
//		endOfMonth = editDate(opeDateYM, JPCUtilCommon.getEndOfMonth(opeDateYM));
//		
//		// 運用日が「当月１日〜料金計算走行日(走行日含)」の場合
//		if(JPCUtilCommon.isFutureDate(opeDate, beginOfMonth, "1") && JPCUtilCommon.isPastDate(opeDate, prcSokoYmd, "1"))
//		{
//			// 『サービス課金終了年月日』に当月末日を設定する
//			svcChrgEndYmd = endOfMonth;
//		}
//		// 運用日が「料金計算走行日後(走行日除)〜当月末日」の場合
//		else if(JPCUtilCommon.isFutureDate(opeDate, prcSokoYmd, "0") && JPCUtilCommon.isPastDate(opeDate, endOfMonth, "1"))
//		{
//			// 『サービス課金終了年月日』に来月末日を設定する
//			String nextOpeYM = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
//			svcChrgEndYmd = editDate(nextOpeYM, JPCUtilCommon.getEndOfMonth(nextOpeYM));
//		}
		
		// 適用開始日
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		String rsvAplyYmd = (String)ccMsg.get("rsv_aply_ymd");
		// 適用開始日の年月
		String rsvAplyYm = rsvAplyYmd.substring(0, 6);
		
/* ++++++++++ v8.00.02 変更開始 ++++++++++ */
//		// 請求オプションサービス契約のサービス課金開始年月日
//		String svcChrgStaymd = (String)workDataMap.get("svc_chrg_staymd");
//		
//		// サービス課金開始年月日が空白　または　サービス課金開始年月≧適用開始年日の場合
//		if(svcChrgStaymd == null || "".equals(svcChrgStaymd) || JPCUtilCommon.isFutureDate(svcChrgStaymd.substring(0, 6) + "01", rsvAplyYm + "01", "1"))
//		{
//			// 『サービス課金終了年月日』に適用開始日の前月末日を設定する
//			String preRsvYM = JPCUtilCommon.addMonth(rsvAplyYmd, -1).substring(0, 6);
//			svcChrgEndYmd = editDate(preRsvYM, JPCUtilCommon.getEndOfMonth(preRsvYM));
//		}
//		// サービス課金開始年月＜適用開始年日の場合
//		else if(JPCUtilCommon.isPastDate(svcChrgStaymd.substring(0, 6) + "01", rsvAplyYm + "01", "0"))
//		{
			// 『サービス課金終了年月日』に適用開始日の当月末日を設定する
			svcChrgEndYmd = editDate(rsvAplyYm, JPCUtilCommon.getEndOfMonth(rsvAplyYm));
//		}
/* ++++++++++ v8.00.02 変更終了 ++++++++++ */
		
		return svcChrgEndYmd;
	}
	
	/**
	 * 併合対象のサービス契約にネット契約(請求書発行非課金料金グループは除外)
	 * が含まれているか判定します。<br>
	 * <br>
	 * @param list
	 * @return boolean
	 */
	@SuppressWarnings("unchecked")
	private boolean hasNetSvcKei(ArrayList list, String skshakHchrgPrgp)
	{
		HashMap<String, String> map = null;
		String svcCd = "";
		String prcGrpCd = "";
		
		for(int i=0; i<list.size(); i++)
		{
			map = (HashMap)list.get(i);
			
			// 画面で選択されている場合
			if((Boolean.valueOf(map.get("isSelect"))))
			{
				// サービスコード取得
				svcCd = map.get("svc_cd_KK0081");
				
/* ++++++++++ v8.00.00 変更開始 ++++++++++ */
				// サービスコードが"01":ネットサービスの場合
//				if(SVC_CD_NET.equals(svcCd))
				if(JKKStrConst.CD00130_01.equals(svcCd) || JKKStrConst.CD00130_51.equals(svcCd))
/* ++++++++++ v8.00.00 変更終了 ++++++++++ */
				{
					// 料金グループコード取得
					prcGrpCd = map.get("prc_grp_cd_KK0081");
					
					// 請求書発行非課金料金グループ以外が１件以上存在
					if(isTargetPrcGrpCd(prcGrpCd, skshakHchrgPrgp))
					{
						return true;
					}
				}
			}
		}
		
		return false;
	}
	
	/**
	 * 処理対象料金グループコードか判定を行います。
	 * 併合先サービス契約.料金グループコードが
	 * 請求書発行手数料非課金料金グループなら除外
	 * <br>
	 * @param prcGrpCd
	 * @return boolean
	 */
	private boolean isTargetPrcGrpCd(String prcGrpCd, String skshakHchrgPrgp)
	{
/* ++++++++++ v8.00.01 変更開始 ++++++++++ */
//		// "16":ｅｏモバイル（メールアドレス）は除外
//		if(PRC_GRP_CD_EOMOBILE_MLAD.equals(prcGrpCd))
//		{
//			return false;
//		}
//		
//		// "99":マンション・オーナー は除外
//		if(PRC_GRP_CD_MANS_OWNR.equals(prcGrpCd))
//		{
//			return false;
//		}
		
		if(null != skshakHchrgPrgp && !"".equals(skshakHchrgPrgp.trim())){
			// 取得した請求書発行非課金料金グループを、カンマで分割
			String[] skshakHchrgPrgpList = skshakHchrgPrgp.split(",");

			for(int i=0; i < skshakHchrgPrgpList.length; i++){
				// 一致する場合は除外する
				if(prcGrpCd.equals(skshakHchrgPrgpList[i])){
					return false;
				}
			}
		}
		
		return true;
/* ++++++++++ v8.00.01 変更終了 ++++++++++ */
	}
	
	/**
	 * 請求オプションサービス契約ステータスの判定を行います。
	 * <br>
	 * @param seiopsvcKeiStat
	 * @return boolean
	 */
	private boolean isCnclSeikyOpSvcKei(String seiopsvcKeiStat)
	{
		// "010":受付済
		if(SEIOP_SVC_KEI_STAT_UK_ZM.equals(seiopsvcKeiStat))
		{
			return true;
		}
		
		// "020":照査済
		if(SEIOP_SVC_KEI_STAT_SHOSA_ZM.equals(seiopsvcKeiStat))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * 日付編集
	 * <br>
	 * @param	yyyymm		年月
	 * @param	dd			日
	 * @return	yyyymmdd	年月日
	 */
	private String editDate(String yyyymm, String dd)
	{
		StringBuilder date = new StringBuilder();
		date.append(yyyymm);
		date.append(dd);
		
		return date.toString();
	}
	
	/**
	 * パラメータを設定します。
	 * @param template
	 * @param map
	 * @param item
	 * @param key
	 */
	@SuppressWarnings("unchecked")
	private void setParam(CAANMsg template, HashMap map, String item, String key)
	{
		String value = null;
		
		if(isNull(map))
		{
			template.setNull(item);
		}
		else
		{
			value = (String)map.get(key);
			if(isEmpty(value))
			{
				template.setNull(item);
			}
			else
			{
				template.set(item, value);
			}
		}
	}
	
	/**
	 * 引数のNULL判定を行います。
	 * @param param
	 * @return boolean
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * 引数の空文字判定を行います。
	 * @param param
	 * @return boolean
	 */
	private boolean isEmpty(String param)
	{
		if(param == null || "".equals(param))
		{
			return true;
		}
		
		return false;
	}
	
}
