/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*   モジュール名    ：JKKMvnoSvcUseStpUkCC
*   ソースファイル名：JKKMvnoSvcUseStpUkCC.java
*	作成者			：FJ
*	日付			：2013年12月26日
*＜機能概要＞
*	MVNOシステムより連携されたデータを元にサービス利用停止受付に関連する処理を実行し、
*	MVNOシステムへの返却パラメータを設定する。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v8.00.00	2013/12/26	FJ)高川		新規作成
*	v8.01.00	2014/03/19	FJ）藤田	【IT1-2014-0000098】対応
*	v8.02.00	2014/06/04	FJ）藤田	【OM-2014-0002073】請求オプション一意照会結果の取得でシステムエラー
*   v11.00.00	2014/10/11  FJ) 齋藤	【ANK-2248-00-00】 NHK団体一括対象範囲拡大について
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
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.JPCModelConstant;

import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B526CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B526CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081C050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg1List;


/**
 * MVNOサービス利用停止受付CC
 * @author FJ
 *
 */
public class JKKMvnoSvcUseStpUkCC extends AbstractCommonComponent 
{
	/**
	 * テンプレートID
	 */
	private static final String TEMPLATE_ID_SVC_KEI_SELECT = "EKK0081A010";
	/**
	 * テンプレートID
	 */
	private static final String TEMPLATE_ID_MSKM_NAIYO_SHONIN_ADD = "EKK0011D020";
	/**
	 * テンプレートID
	 */
	private static final String TEMPLATE_ID_SVC_KEI_STP_UPD = "EKK0081C050";
	/**
	 * テンプレートID
	 */
	private static final String TEMPLATE_ID_SVC_KEI_STP_RLS_UPD = "EKK0081C060";
	/**
	 * 実行判定用(サービス契約停止)
	 */
	private static final String JUDGE_SVC_KEI_STP = "KKSV076701SC";
	/**
	 * 実行判定用(サービス契約停止解除)
	 */
	private static final String JUDGE_SVC_KEI_STP_RLS = "KKSV076801SC";
	
	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD START
	// 内部で取得するリスト用のマップキー サービス契約番号
	private static final String SVCKEILIST1_SVC_KEI_NO = "svc_kei_no";
	// 内部で取得するリスト用のマップキー サービス契約ステータス
	private static final String SVCKEILIST1_SVC_KEI_STAT = "svc_kei_stat";
	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD END
	//ANK-2248-00-00 ADD START
	/** 請求オプションサービスコード：請求書発行手数料 */
	private static final String SEIOPSVC_CD_SEIKYSH_HAKKO = "E001";
	//ANK-2248-00-00 ADD END
	

	/**
	 * MVNOサービス契約利用停止受付
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite mvnoSvcUseStpUk(SessionHandle handle, 
			IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		HashMap<String, Object> workMap = new HashMap<String, Object>();
		
//		try
//		{
			// データを取得する。
			HashMap inParamMap = (HashMap)param.getData(fixedText);
			
			// サービス契約情報取得処理
			getSvcKeiInfo(handle, param, fixedText, workMap);
			
//			// 申込内容承認登録処理
//			addMskmNaiyoShonin(handle, param, fixedText, workMap);
			
			// 実行判定
			if (JUDGE_SVC_KEI_STP.equals(fixedText))
			{
				// サービス契約停止処理
				updSvcKeiStp(handle, param, fixedText, workMap);
			}
			else if (JUDGE_SVC_KEI_STP_RLS.equals(fixedText))
			{
				// サービス契約停止解除処理
				updSvcKeiStpRls(handle, param, fixedText, workMap);
			}
//		}
//		catch (SCCallException scCallEx)
//		{
//			throw scCallEx;
//		}
//		finally
//		{
//			// MVNO返却パラメータ設定処理
//			setMvnoRtnParam(param, fixedText, workMap);
//		}
			
			//進捗登録
			addPrg(handle, param, fixedText, workMap);

			// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD START
			updateSeikyOptionService(handle, param, fixedText, workMap);
			// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD END
			
		return param;
	}

	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD START
	private void updateSeikyOptionService(
				  SessionHandle handle
				, IRequestParameterReadWrite param
				, String fixedText
				, HashMap<String, Object> workMap
		) throws Throwable
	{
		HashMap inMap = (HashMap)param.getData(fixedText);
		String svcKeiNo = (String)inMap.get("svc_kei_no");
		String seikyKeiNo = (String)workMap.get("seiky_kei_no");
		// 異動区分
		String idoDiv = "";
		
		if (JUDGE_SVC_KEI_STP.equals(fixedText))			//利用停止
		{
			// 同一の「請求契約」を指定するインターネットサービス、またはMVNOサービスの「サービス契約」（【解約済】、【キャンセル済】を除く）が存在する場合、何も更新しない
			// 上記以外の場合、配下の請求オプションサービス契約の状態により【停止中】に遷移させる
			idoDiv = "00062";
			List<Map> iservices = getInternetServicesBySeikyuNo(handle, param, fixedText, seikyKeiNo);
			if (!isExistsEnabledServices(iservices, svcKeiNo))
			{
				stopForSeikyuOptionService(handle, param, fixedText, seikyKeiNo, idoDiv);
			}
		}
		else if (JUDGE_SVC_KEI_STP_RLS.equals(fixedText))	//利用停止解除
		{	
			// 配下の請求オプションサービス契約に【停止中】が存在する場合【サービス提供中】に遷移させる
			idoDiv = "00063";
			stopRlsForSeikyuOptionService(handle, param, fixedText, seikyKeiNo, idoDiv);
		}
	}
	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD END

	/**
	 * 進捗を登録します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 入力データのキーID
	 * @param workMap 作業マップ
	 * @throws Throwable 任意の例外
	 */
	private void addPrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap) throws Throwable
	{
		/* ユーザデータ情報 */
		HashMap<?, ?> inMap = (HashMap<?, ?>) param.getData(fixedText);
		
		// 進捗登録SIFを実行
		JKKSIFEKK1091Mapper mapper = new JKKSIFEKK1091Mapper();
		String[] idoRsnCdList = new String[]{"56"};
		Map<String,Object> prgAddMap = new HashMap<String,Object>();
		
		// サービス契約番号
		prgAddMap.put("svc_kei_no", inMap.get("svc_kei_no"));
		
		// 請求契約番号
		callEKK0321B005SC(handle, param, fixedText, workMap);
		prgAddMap.put("seiky_kei_no", workMap.get("seiky_kei_no"));
		
		// 異動区分
		String idoDiv = "";
		// 進捗ステータス
		String prgStat = "";
		
		if (JUDGE_SVC_KEI_STP.equals(fixedText))			//利用停止
		{
			idoDiv = "00062";
			prgStat = "2201";
		}
		else if (JUDGE_SVC_KEI_STP_RLS.equals(fixedText))	//利用停止解除
		{	
			idoDiv = "00063";
			prgStat = "2202";
		}
		else
		{
			return;
		}
		prgAddMap.put("ido_div", idoDiv);
		prgAddMap.put("prg_stat", prgStat);
		
		//異動日時
		prgAddMap.put("ido_dtm", JCCBPCommon.getOpeDateTimeStamp(null));
		
		CAANMsg templateEKK1091D010 = mapper.getMappedTemplateEKK1091D010(prgAddMap, idoRsnCdList);

		// SIF実行
		CAANMsg[] resultMsgsEKK1091D010 = callScCmn(param, handle, templateEKK1091D010, mapper, fixedText);
		
	}


	/**
	 * EKK0321B005課金先一覧照会（サービス契約番号）S-IFを実行します
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 入力データのキーID
	 * @param workMap 作業マップ
	 * @throws Throwable 任意の例外
	 */
	@SuppressWarnings("unchecked")
	private void callEKK0321B005SC(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> workMap) throws Throwable
	{
		String seiky_kei_no = null;
		
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>) param.getData(fixedText);
		
		String svcKeiNo = (String) inMap.get("svc_kei_no");		//サービス契約番号
		
		
		JKKSIFEKK0321Mapper mapper = new JKKSIFEKK0321Mapper();
		CAANMsg templateEKK0321B005 = mapper.getMappedTemplateEKK0321B005(svcKeiNo);

		// SIF実行
		CAANMsg[] resultMsgsEKK0321B005 = callScCmn(param, handle, templateEKK0321B005, mapper, fixedText);
		
		if (resultMsgsEKK0321B005.length > 0) {
			List<CAANMsg> data = new ArrayList();
			for (int i=0; i < resultMsgsEKK0321B005.length; i++) {
				CAANMsg r = resultMsgsEKK0321B005[i];
				CAANMsg[] kakinsList = r.getCAANMsgList(EKK0321B005CBSMsg.EKK0321B005CBSMSG1LIST);
				for (int j=0; j < kakinsList.length; j++) {
					data.add(kakinsList[j]);
				}
			}
			
			// 課金先番号 - 降順ソート
			Collections.sort(data, new Comparator<CAANMsg>()
					{
						public int compare(CAANMsg map1, CAANMsg map2)
						{
							String key1 = (String)map1.getString("kakins_no");
							String key2 = (String)map2.getString("kakins_no");
							return key2.compareTo(key1);
						}
					});
			// 最新の請求契約番号を取得
			if (data.size() > 0) {
				seiky_kei_no = data.get(0).getString("seiky_kei_no");
			}
		}
		
		workMap.put("seiky_kei_no", seiky_kei_no);
	}


	/**
	 * 
	 * @param param
	 * @param handle
	 * @param template
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg[] callScCmn(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			CAANMsg template,
			JKKSIFMapperBase mapper,
			String fixedText
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		Map<?, ?> sIFResult = null;

		//テンプレート共通情報を設定
		mapper.editTemplateCommon(param, template);
		
		// サービスIF共通の情報を設定
		sIFRequest = mapper.editInMsgCmn(param);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SIFの呼び出し
		sIFResult = (new ServiceComponentRequestInvoker()).run(sIFRequest, handle);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// エラー情報のマッピング
		editResultRP(sIFResult, param, fixedText);

		errChk(sIFResult);

		// リターンコード取得
		int returnCode = (Integer)sIFResult.get(JCMConstants.RET_CD_INT_KEY);
		if (returnCode != 0) {
			throw new Exception();
		}

		return resultMsgs;
	}


	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * </pre>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 * @since 2012-08-27 ST1-2012-0000418対応のついで（業務結果とFW処理結果の格納の切り分け）
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editResultRP(
			Map<?, ?> msgList,
			IRequestParameterReadWrite param, String fixedText) 
			throws Throwable 
	{
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>) param.getData(fixedText);
		
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode.intValue() != 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);
		}

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		String tName = template.getString("templateID");		//S-IF名
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		// ユーザデータ情報にエラー情報をマッピング
		Map<String, Object> contentsMap = template.getMsgData();
		Object[] contents = contentsMap.keySet().toArray();
		for(int i = 0 ; contents != null && i < contents.length ; i++)
		{
			String element = null;
			element = (String)contents[i];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					//‘key_’を除く
					String e = element.replaceFirst("key_", "");
					// エラーフラグのセット
					inMap.put(e, template.getString(element));
				}
			}
		}

		return param;
	}


	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws Exception 
	 * @since 2012-08-27 ST1-2012-0000418対応のついで（業務結果とFW処理結果の格納の切り分け）
	 */
	private void errChk(Map<?, ?> msgList) throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_ERROR_OCCURED";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}


	/**
	 * メッセージ共通部設定処理
	 * @param param
	 * @param paramMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, HashMap<String, Object> paramMap) throws RequestParameterException
	{
		// 電文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;
	}
	
	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param workMap 
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode, HashMap<String, Object> workMap) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
//		//作業用マップにエラー情報を格納する
//		workMap.put(SCControlMapKeys.RETURN_CODE, param.getControlMapData(SCControlMapKeys.RETURN_CODE));
//		workMap.put(SCControlMapKeys.RETURN_MESSAGE,param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE));
//		workMap.put("errorLevel",param.getData("errorLevel"));
		
		return param;
	}
	
	
//	/**
//	 * エラーチェック処理。 <br>
//	 * 
//	 * @param msgList サービスインタフェース実行結果
//	 * @return void
//	 * @throws SCCallException
//	 */
//	private void errChk(Map<?, ?> msgList) throws SCCallException
//	{
//		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
//		CAANMsg template = templates[0];
//
//		// リターンコード取得
//		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
//
//		// ステータス取得
//		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
//
//	}
	
	/**
	 * 
	 * サービス契約情報の取得を行う
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void getSvcKeiInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// サービス契約一意照会上りマッピング
		paramMap = editEKK0081A010InMsg(param, paramMap, fixedText);
		
		// SC呼び出しクラスの生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SIFの呼び出し
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// サービス契約一意照会下りマッピング
		IRequestParameterReadWrite rtnParam = editEKK0081A010OutMsg(result, param, fixedText, workMap);
		
		//取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)rtnParam.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
	}
	
	/**
	 * サービス契約一意照会上りマッピング
	 * @param param
	 * @param paramMap
	 * @param fixedText
	 * @param workMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editEKK0081A010InMsg(IRequestParameterReadWrite param, HashMap<String, Object> paramMap, 
			String fixedText) throws RequestParameterException
	{
		// メッセージ共通部設定処理
		paramMap = editInMsg(param, paramMap);
		
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_SVC_KEI_SELECT);
		// 機能コード（"2"固定）
		template.set(EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);
//		// 検索処理パターン
//		template.set(EKK0081A010CBSMsg.SEARCH_TYPE, inMap.get(EKK0081A010CBSMsg.SEARCH_TYPE));
//		// 最大検索件数
//		template.set(EKK0081A010CBSMsg.MAX_SEARCH_NUM, inMap.get(EKK0081A010CBSMsg.MAX_SEARCH_NUM));
//		// 表示件数
//		template.set(EKK0081A010CBSMsg.DISPLAY_NUM, inMap.get(EKK0081A010CBSMsg.DISPLAY_NUM));
//		// 表示ページ番号
//		template.set(EKK0081A010CBSMsg.DISPLAY_PAGE_NUM, inMap.get(EKK0081A010CBSMsg.DISPLAY_PAGE_NUM));
		// オペレータID
		template.set(EKK0081A010CBSMsg.OPERATORID, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(EKK0081A010CBSMsg.OPERATEDATE, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(EKK0081A010CBSMsg.OPERATEDATETIME,  param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		// ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inMap.get("svc_kei_no"));
		
		//ＫＥＹ＿予約適用日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JKKBpCommon.getOpeDate(null));
		
		template.setNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービス契約一意照会下りマッピング
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editEKK0081A010OutMsg(Map<?, ?> msgList, IRequestParameterReadWrite param, 
			String fixedText, HashMap<String, Object> workMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得。
		HashMap<String, Object> dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		dataMap = (HashMap<String, Object>)param.getData(fixedText);
		
		if(dataMap == null) 
		{
			dataMap = new HashMap<String, Object>();
			param.setData(fixedText, dataMap);
		}
		
		templateArray = parentTemplate.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		dataList = (ArrayList)dataMap.get("EKK0081A010CBSMsg1List");

		if (dataList == null) 
		{
			dataList = new ArrayList();
		}
		
		if (templateArray != null) 
		{
			for(int i = 0; i < templateArray.length; i++) 
			{
				
				CAANMsg childTemplate = templateArray[i];
				if(i >= dataList.size())
				{
					dataList.add(new HashMap<String, Object>());
				}
				HashMap<String, Object> childMap = (HashMap<String, Object>)dataList.get(i);

				if (childTemplate.isNull(EKK0081A010CBSMsg1List.SYSID)) 
				{
					childMap.put("sysid", "");
					workMap.put("sysid", "");
				} 
				else 
				{
					childMap.put("sysid", childTemplate.getString(EKK0081A010CBSMsg1List.SYSID));
					workMap.put("sysid", childTemplate.getString(EKK0081A010CBSMsg1List.SYSID));
				}

				if (childTemplate.isNull(EKK0081A010CBSMsg1List.LAST_UPD_DTM)) 
				{
					childMap.put("last_upd_dtm", "");
					workMap.put("last_upd_dtm", "");
				} 
				else 
				{
					childMap.put("last_upd_dtm", childTemplate.getString(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
					workMap.put("last_upd_dtm", childTemplate.getString(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
				}
			}
		}

		// 対象のサービス契約が存在しなかった場合に、更新時の更新年月日時分秒(更新前)にて
		// 単項目チェックエラーとなってしまうのを抑制する
		if (workMap.get("last_upd_dtm") == null)
		{
			workMap.put("last_upd_dtm", "19000101000000000");
		}
		
// 下り電文に乗らないようマップをクリア
//		dataMap.put("EKK0081A010CBSMsg1List", dataList);

		// エラー情報の設定
		IRequestParameterReadWrite rtnParam = editErrorInfo(param, templates, (Integer)return_code, workMap);
		rtnParam = editEKK0081A010ErrorInfo(rtnParam, templates, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)rtnParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		rtnParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return rtnParam;
	}
	
	/**
	 * <pre>
	 * サービス契約一意照会のエラー情報マッピング処理
	 * 
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editEKK0081A010ErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, String fixedText)
			throws Exception
	{
		CAANMsg template = templates[0];
		
		// テンプレートID取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (TEMPLATE_ID_SVC_KEI_SELECT.equals(templateId))
		{
			contents = new EKK0081A010CBSMsg().getContents();
		}
		
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						String e = element.replaceFirst("key_", "");
						inMap.put(e, template.getString(element));
					}
				}
			}
		}
		
		return param;
	}
	
//	/**
//	 * 
//	 * 申込内容承認登録を行う
//	 * @param handle
//	 * @param param
//	 * @param fixedText
//	 * @param workMap
//	 * @throws Exception
//	 */
//	@SuppressWarnings("unchecked")
//	private void addMskmNaiyoShonin(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap) throws Exception
//	{
//		HashMap<String, Object> paramMap = new HashMap<String, Object>();
//		
//		// 申込内容承認登録上りマッピング
//		paramMap = editEKK0011D020InMsg(param, paramMap, fixedText, workMap);
//		
//		// SC呼び出しクラスの生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// SIFの呼び出し
//		Map<?, ?> result = scCall.run(paramMap, handle);
//		
//		// 申込内容承認登録下りマッピング
//		IRequestParameterReadWrite rtnParam = editEKK0011D020OutMsg(result, param, fixedText, workMap);
//		
//		//取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
//		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
//		String status = (String)rtnParam.getControlMapData(SCControlMapKeys.RETURN_CODE);
//		
//		// 異常の場合、SCCallExceptionを生成してスローする
//		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
//		{
//			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCode, Integer.parseInt(status));
//			throw scCallEx;
//		}
//	}

	/**
	 * 申込内容承認登録上りマッピング
	 * @param param
	 * @param paramMap
	 * @param fixedText
	 * @param workMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editEKK0011D020InMsg(IRequestParameterReadWrite param, HashMap<String, Object> paramMap, 
			String fixedText, HashMap<String, Object> workMap) throws RequestParameterException
	{
		// メッセージ共通部設定処理
		paramMap = editInMsg(param, paramMap);
		
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0011D020CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0011D020CBSMsg.TEMPLATEID, TEMPLATE_ID_MSKM_NAIYO_SHONIN_ADD);
		// 機能コード：MVNOより取得した機能コードを格納する("1"固定)
		template.set(EKK0011D020CBSMsg.FUNC_CODE, inMap.get(EKK0011D020CBSMsg.FUNC_CODE));
		// オペレータID
		template.set(EKK0011D020CBSMsg.OPERATORID, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(EKK0011D020CBSMsg.OPERATEDATE, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(EKK0011D020CBSMsg.OPERATEDATETIME,  param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		// ＳＹＳＩＤ
		template.set(EKK0011D020CBSMsg.SYSID, workMap.get("sysid"));
		if (JUDGE_SVC_KEI_STP.equals(fixedText))
		{
			// 申込種別コード
			template.set(EKK0011D020CBSMsg.MSKM_SBT_CD, "00039");
		}
		else if (JUDGE_SVC_KEI_STP_RLS.equals(fixedText))
		{
			// 申込種別コード
			template.set(EKK0011D020CBSMsg.MSKM_SBT_CD, "00040");
		}
		// 申込受付年月日時分秒
		template.set(EKK0011D020CBSMsg.MSKM_UK_DTM, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		// 申込年月日
		template.set(EKK0011D020CBSMsg.MSKM_YMD, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// コンシューマ営業用申込状態識別コード
		template.set(EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD, "04");
		
		//申込明細一覧
		CAANMsg childTemplate = new CAANMsg(EKK0011D020CBSMsg1List.class.getName());
		template.set(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST, new CAANMsg[]{childTemplate});
		
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * 申込内容承認登録下りマッピング
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editEKK0011D020OutMsg(Map<?, ?> msgList, IRequestParameterReadWrite param, 
			String fixedText, HashMap<String, Object> workMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得。
		HashMap<String, Object> dataMap = null;
		ArrayList dataList = null;
		ArrayList msg1List = null;

		/* 業務データ設定 */
		dataMap = (HashMap<String, Object>)param.getData(fixedText);
		
		if(dataMap == null) 
		{
			dataMap = new HashMap<String, Object>();
			param.setData(fixedText, dataMap);
		}
		
		dataList = (ArrayList)dataMap.get("EKK0011D020CBSMsg");
		if (dataList == null)
		{
			dataList = new ArrayList();
		}
		
		for (int i = 0; i < templates.length; i++) 
		{
			
			HashMap childMap = new HashMap();
			
			CAANMsg parentTemplate = templates[i];
			CAANMsg[] templateArray = null;
			
			// 申込番号
			if (parentTemplate.isNull(EKK0011D020CBSMsg.MSKM_NO))
			{
				childMap.put("mskm_no", "");
			}
			else
			{
				childMap.put("mskm_no", parentTemplate.getString(EKK0011D020CBSMsg.MSKM_NO));
			}

			// 世代登録年月日時分秒(申込)
			if (parentTemplate.isNull(EKK0011D020CBSMsg.KK0011_GENE_ADD_DTM)) 
			{
				childMap.put("kk0011_gene_add_dtm", "");
			}
			else
			{
				childMap.put("kk0011_gene_add_dtm", parentTemplate.getString(EKK0011D020CBSMsg.KK0011_GENE_ADD_DTM));
			}

			// 申込ステータス
			if (parentTemplate.isNull(EKK0011D020CBSMsg.MSKM_STAT)) 
			{
				childMap.put("mskm_stat", "");
			}
			else
			{
				childMap.put("mskm_stat", parentTemplate.getString(EKK0011D020CBSMsg.MSKM_STAT));
			}

			// 登録年月日時分秒
			if (parentTemplate.isNull(EKK0011D020CBSMsg.ADD_DTM)) 
			{
				childMap.put("add_dtm", "");
			}
			else
			{
				childMap.put("add_dtm", parentTemplate.getString(EKK0011D020CBSMsg.ADD_DTM));
			}

			// 登録オペレータアカウント
			if (parentTemplate.isNull(EKK0011D020CBSMsg.ADD_OPEACNT)) 
			{
				childMap.put("add_opeacnt", "");
			}
			else
			{
				childMap.put("add_opeacnt", parentTemplate.getString(EKK0011D020CBSMsg.ADD_OPEACNT));
			}

			// 更新年月日時分秒
			if (parentTemplate.isNull(EKK0011D020CBSMsg.UPD_DTM)) 
			{
				childMap.put("upd_dtm", "");
			}
			else
			{
				childMap.put("upd_dtm", parentTemplate.getString(EKK0011D020CBSMsg.UPD_DTM));
			}

			// 更新オペレータアカウント
			if (parentTemplate.isNull(EKK0011D020CBSMsg.UPD_OPEACNT)) 
			{
				childMap.put("upd_opeacnt", "");
			}
			else
			{
				childMap.put("upd_opeacnt", parentTemplate.getString(EKK0011D020CBSMsg.UPD_OPEACNT));
			}

			// 無効フラグ
			if (parentTemplate.isNull(EKK0011D020CBSMsg.MK_FLG)) 
			{
				childMap.put("mk_flg", "");
			}
			else
			{
				childMap.put("mk_flg", parentTemplate.getString(EKK0011D020CBSMsg.MK_FLG));
			}

			templateArray = parentTemplate.getCAANMsgList(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
			msg1List = (ArrayList)childMap.get("EKK0011D020CBSMsg1List");

			if (msg1List == null)
			{
				msg1List = new ArrayList();
			}

			if (templateArray != null)
			{
				for (int j = 0; j < templateArray.length; j++)
				{
					CAANMsg childTemplate = templateArray[j];
					if (j >= msg1List.size())
					{
						msg1List.add(new HashMap());
					}
					HashMap childListMap = (HashMap)msg1List.get(i);

					// 申込内容承認登録明細.申込明細番号
					if (childTemplate.isNull(EKK0011D020CBSMsg1List.MSKM_DTL_NO))
					{
						childListMap.put("mskm_dtl_no", "");
					}
					else
					{
						childListMap.put("mskm_dtl_no", childTemplate.getString(EKK0011D020CBSMsg1List.MSKM_DTL_NO));
					}

					// 申込内容承認登録明細.世代登録年月日時分秒（申込明細）
					if (childTemplate.isNull(EKK0011D020CBSMsg1List.KK0021_GENE_ADD_DTM))
					{
						childListMap.put("kk0021_gene_add_dtm", "");
					}
					else
					{
						childListMap.put("kk0021_gene_add_dtm", childTemplate.getString(EKK0011D020CBSMsg1List.KK0021_GENE_ADD_DTM));
					}

					// 申込内容承認登録明細.申込明細ステータス
					if (childTemplate.isNull(EKK0011D020CBSMsg1List.MSKM_DTL_STAT))
					{
						childListMap.put("mskm_dtl_stat", "");
					}
					else
					{
						childListMap.put("mskm_dtl_stat", childTemplate.getString(EKK0011D020CBSMsg1List.MSKM_DTL_STAT));
					}

					// 申込内容承認登録明細.オプションサービス引継有無（出力）
					if (childTemplate.isNull(EKK0011D020CBSMsg1List.OP_SVC_HKTGI_UM_O))
					{
						childListMap.put("op_svc_hktgi_um_o", "");
					}
					else
					{
						childListMap.put("op_svc_hktgi_um_o", childTemplate.getString(EKK0011D020CBSMsg1List.OP_SVC_HKTGI_UM_O));
					}

					// 申込内容承認登録明細.割引自動適用対象外フラグ（出力）
					if (childTemplate.isNull(EKK0011D020CBSMsg1List.WRIB_AUTO_APLY_TG_GAI_FLG_O))
					{
						childListMap.put("wrib_auto_aply_tg_gai_flg_o", "");
					}
					else
					{
						childListMap.put("wrib_auto_aply_tg_gai_flg_o", childTemplate.getString(EKK0011D020CBSMsg1List.WRIB_AUTO_APLY_TG_GAI_FLG_O));
					}
				}
			}
			childMap.put("EKK0011D020CBSMsg1List", msg1List);
			
			dataList.add(childMap);
		}

		dataMap.put("EKK0011D020CBSMsg", dataList);

		// エラー情報の設定
		IRequestParameterReadWrite rtnParam = editErrorInfo(param, templates, (Integer)return_code, workMap);
		rtnParam = editEKK0011D020ErrorInfo(rtnParam, templates, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)rtnParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		rtnParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return rtnParam;
	}

	/**
	 * <pre>
	 * 申込内容承認登録のエラー情報マッピング処理
	 * 
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editEKK0011D020ErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, String fixedText)
			throws Exception
	{
		CAANMsg template = templates[0];
		
		// テンプレートID取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (TEMPLATE_ID_MSKM_NAIYO_SHONIN_ADD.equals(templateId))
		{
			contents = new EKK0011D020CBSMsg().getContents();
		}
		
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						inMap.put(element, template.getString(element));
					}
				}
			}
		}
		
		return param;
	}

	/**
	 * 
	 * サービス契約停止を行う
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void updSvcKeiStp(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// サービス契約停止上りマッピング
		paramMap = editEKK0081C050InMsg(param, paramMap, fixedText, workMap);
		
		// SC呼び出しクラスの生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SIFの呼び出し
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// サービス契約停止下りマッピング
		IRequestParameterReadWrite rtnParam = editEKK0081C050OutMsg(result, param, fixedText, workMap);
		
		//取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)rtnParam.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
	}

	/**
	 * サービス契約停止上りマッピング
	 * @param param
	 * @param paramMap
	 * @param fixedText
	 * @param workMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editEKK0081C050InMsg(IRequestParameterReadWrite param, HashMap<String, Object> paramMap, 
			String fixedText, HashMap<String, Object> workMap) throws RequestParameterException
	{
		// メッセージ共通部設定処理
		paramMap = editInMsg(param, paramMap);
		
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0081C050CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081C050CBSMsg.TEMPLATEID, TEMPLATE_ID_SVC_KEI_STP_UPD);
		// 機能コード：MVNOより取得した機能コードを格納する("1"固定)
		template.set(EKK0081C050CBSMsg.FUNC_CODE, inMap.get(EKK0081C050CBSMsg.FUNC_CODE));
		// オペレータID
		template.set(EKK0081C050CBSMsg.OPERATORID, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(EKK0081C050CBSMsg.OPERATEDATE, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(EKK0081C050CBSMsg.OPERATEDATETIME,  param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		// サービス契約番号
		template.set(EKK0081C050CBSMsg.SVC_KEI_NO, inMap.get(EKK0081C050CBSMsg.SVC_KEI_NO));
		// サービス停止年月日
		template.set(EKK0081C050CBSMsg.SVC_STP_YMD, inMap.get(EKK0081C050CBSMsg.SVC_STP_YMD));
		// サービス停止理由コード
		template.set(EKK0081C050CBSMsg.SVC_STP_RSN_CD, inMap.get(EKK0081C050CBSMsg.SVC_STP_RSN_CD));
		// 異動区分
		template.set(EKK0081C050CBSMsg.IDO_DIV, "00062");
		// 更新年月日時分秒(更新前)
		template.set(EKK0081C050CBSMsg.UPD_DTM_BF, workMap.get("last_upd_dtm"));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * サービス契約停止下りマッピング
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editEKK0081C050OutMsg(Map<?, ?> msgList, IRequestParameterReadWrite param, 
			String fixedText, HashMap<String, Object> workMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得。
		HashMap<String, Object> dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		dataMap = (HashMap<String, Object>)param.getData(fixedText);
		
		if(dataMap == null) 
		{
			dataMap = new HashMap<String, Object>();
			param.setData(fixedText, dataMap);
		}
		
//		for (int i = 0; i < templates.length; i++) 
//		{
//			
//			HashMap childMap = new HashMap();
//			
//			CAANMsg parentTemplate = templates[i];
//
//			// 世代登録年月日時分秒
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.GENE_ADD_DTM)) 
//			{
//				childMap.put("gene_add_dtm", "");
//			}
//			else
//			{
//				childMap.put("gene_add_dtm", parentTemplate.getString(EKK0081C050CBSMsg.GENE_ADD_DTM));
//			}
//
//			// サービス契約ステータス
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.SVC_KEI_STAT)) 
//			{
//				childMap.put("svc_kei_stat", "");
//			}
//			else
//			{
//				childMap.put("svc_kei_stat", parentTemplate.getString(EKK0081C050CBSMsg.SVC_KEI_STAT));
//			}
//
//			// 予約適用コード
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.RSV_APLY_CD)) 
//			{
//				childMap.put("rsv_aply_cd", "");
//			}
//			else
//			{
//				childMap.put("rsv_aply_cd", parentTemplate.getString(EKK0081C050CBSMsg.RSV_APLY_CD));
//			}
//
//			// サービス停止解除年月日
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.SVC_STP_RLS_YMD)) 
//			{
//				childMap.put("svc_stp_rls_ymd", "");
//			}
//			else
//			{
//				childMap.put("svc_stp_rls_ymd", parentTemplate.getString(EKK0081C050CBSMsg.SVC_STP_RLS_YMD));
//			}
//
//			// サービス停止解除理由コード
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.SVC_STP_RLS_RSN_CD)) 
//			{
//				childMap.put("svc_stp_rls_rsn_cd", "");
//			}
//			else
//			{
//				childMap.put("svc_stp_rls_rsn_cd", parentTemplate.getString(EKK0081C050CBSMsg.SVC_STP_RLS_RSN_CD));
//			}
//
//			// 登録年月日時分秒
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.ADD_DTM)) 
//			{
//				childMap.put("add_dtm", "");
//			}
//			else
//			{
//				childMap.put("add_dtm", parentTemplate.getString(EKK0081C050CBSMsg.ADD_DTM));
//			}
//
//			// 登録オペレータアカウント
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.ADD_OPEACNT)) 
//			{
//				childMap.put("add_opeacnt", "");
//			}
//			else
//			{
//				childMap.put("add_opeacnt", parentTemplate.getString(EKK0081C050CBSMsg.ADD_OPEACNT));
//			}
//
//			// 更新年月日時分秒
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.UPD_DTM)) 
//			{
//				childMap.put("upd_dtm", "");
//			}
//			else
//			{
//				childMap.put("upd_dtm", parentTemplate.getString(EKK0081C050CBSMsg.UPD_DTM));
//			}
//
//			// 更新オペレータアカウント
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.UPD_OPEACNT)) 
//			{
//				childMap.put("upd_opeacnt", "");
//			}
//			else
//			{
//				childMap.put("upd_opeacnt", parentTemplate.getString(EKK0081C050CBSMsg.UPD_OPEACNT));
//			}
//
//			// 無効フラグ
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.MK_FLG)) 
//			{
//				childMap.put("mk_flg", "");
//			}
//			else
//			{
//				childMap.put("mk_flg", parentTemplate.getString(EKK0081C050CBSMsg.MK_FLG));
//			}
//
//			// 予約適用年月日
//			if (parentTemplate.isNull(EKK0081C050CBSMsg.RSV_APLY_YMD)) 
//			{
//				childMap.put("rsv_aply_ymd", "");
//			}
//			else
//			{
//				childMap.put("rsv_aply_ymd", parentTemplate.getString(EKK0081C050CBSMsg.RSV_APLY_YMD));
//			}
//
//			dataList.add(childMap);
//		}
//
//		dataMap.put("EKK0081C050CBSMsg", dataList);

		
		// エラー情報の設定
		IRequestParameterReadWrite rtnParam = editErrorInfo(param, templates, (Integer)return_code, workMap);
		rtnParam = editEKK0081C050ErrorInfo(rtnParam, templates, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)rtnParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		rtnParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return rtnParam;
	}

	/**
	 * <pre>
	 * サービス契約停止のエラー情報マッピング処理
	 * 
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editEKK0081C050ErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, String fixedText)
			throws Exception
	{
		CAANMsg template = templates[0];
		
		// テンプレートID取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (TEMPLATE_ID_SVC_KEI_STP_UPD.equals(templateId))
		{
			contents = new EKK0081C050CBSMsg().getContents();
		}
		
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						inMap.put(element, template.getString(element));
					}
				}
			}
		}
		
		return param;
	}
	
	/**
	 * 
	 * サービス契約停止解除を行う
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void updSvcKeiStpRls(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// サービス契約停止解除上りマッピング
		paramMap = editEKK0081C060InMsg(param, paramMap, fixedText, workMap);
		
		// SC呼び出しクラスの生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SIFの呼び出し
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// サービス契約停止解除下りマッピング
		IRequestParameterReadWrite rtnParam = editEKK0081C060OutMsg(result, param, fixedText, workMap);
		
		//取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)rtnParam.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
	}

	/**
	 * サービス契約停止解除上りマッピング
	 * @param param
	 * @param paramMap
	 * @param fixedText
	 * @param workMap
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editEKK0081C060InMsg(IRequestParameterReadWrite param, HashMap<String, Object> paramMap, 
			String fixedText, HashMap<String, Object> workMap) throws RequestParameterException
	{
		// メッセージ共通部設定処理
		paramMap = editInMsg(param, paramMap);
		
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		CAANMsg template = new CAANMsg(EKK0081C060CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081C060CBSMsg.TEMPLATEID, TEMPLATE_ID_SVC_KEI_STP_RLS_UPD);
		// 機能コード：MVNOより取得した機能コードを格納する("1"固定)
		template.set(EKK0081C060CBSMsg.FUNC_CODE, inMap.get(EKK0081C060CBSMsg.FUNC_CODE));
		// オペレータID
		template.set(EKK0081C060CBSMsg.OPERATORID, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(EKK0081C060CBSMsg.OPERATEDATE, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(EKK0081C060CBSMsg.OPERATEDATETIME,  param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		// サービス契約番号
		template.set(EKK0081C060CBSMsg.SVC_KEI_NO, inMap.get(EKK0081C060CBSMsg.SVC_KEI_NO));
		// サービス停止年月日
		template.set(EKK0081C060CBSMsg.SVC_STP_RLS_YMD, inMap.get(EKK0081C060CBSMsg.SVC_STP_RLS_YMD));
		// サービス停止理由コード
		template.set(EKK0081C060CBSMsg.SVC_STP_RLS_RSN_CD, inMap.get(EKK0081C060CBSMsg.SVC_STP_RLS_RSN_CD));
		// 異動区分
		template.set(EKK0081C060CBSMsg.IDO_DIV, "00063");
		// 更新年月日時分秒(更新前)
		template.set(EKK0081C060CBSMsg.UPD_DTM_BF, workMap.get("last_upd_dtm"));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * サービス契約停止解除下りマッピング
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param workMap
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editEKK0081C060OutMsg(Map<?, ?> msgList, IRequestParameterReadWrite param, 
			String fixedText, HashMap<String, Object> workMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
//		// 結果を詰めるマップを取得。
//		HashMap<String, Object> dataMap = null;
//		ArrayList dataList = null;
//
//		/* 業務データ設定 */
//		dataMap = (HashMap<String, Object>)param.getData(fixedText);
//		
//		if(dataMap == null) 
//		{
//			dataMap = new HashMap<String, Object>();
//			param.setData(fixedText, dataMap);
//		}
//		
//		for (int i = 0; i < templates.length; i++) 
//		{
//			
//			HashMap childMap = new HashMap();
//			
//			CAANMsg parentTemplate = templates[i];
//
//			// 世代登録年月日時分秒
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.GENE_ADD_DTM)) 
//			{
//				childMap.put("gene_add_dtm", "");
//			}
//			else
//			{
//				childMap.put("gene_add_dtm", parentTemplate.getString(EKK0081C060CBSMsg.GENE_ADD_DTM));
//			}
//
//			// サービス契約ステータス
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.SVC_KEI_STAT)) 
//			{
//				childMap.put("svc_kei_stat", "");
//			}
//			else
//			{
//				childMap.put("svc_kei_stat", parentTemplate.getString(EKK0081C060CBSMsg.SVC_KEI_STAT));
//			}
//
//			// 予約適用コード
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.RSV_APLY_CD)) 
//			{
//				childMap.put("rsv_aply_cd", "");
//			}
//			else
//			{
//				childMap.put("rsv_aply_cd", parentTemplate.getString(EKK0081C060CBSMsg.RSV_APLY_CD));
//			}
//
//			// 登録年月日時分秒
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.ADD_DTM)) 
//			{
//				childMap.put("add_dtm", "");
//			}
//			else
//			{
//				childMap.put("add_dtm", parentTemplate.getString(EKK0081C060CBSMsg.ADD_DTM));
//			}
//
//			// 登録オペレータアカウント
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.ADD_OPEACNT)) 
//			{
//				childMap.put("add_opeacnt", "");
//			}
//			else
//			{
//				childMap.put("add_opeacnt", parentTemplate.getString(EKK0081C060CBSMsg.ADD_OPEACNT));
//			}
//
//			// 更新年月日時分秒
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.UPD_DTM)) 
//			{
//				childMap.put("upd_dtm", "");
//			}
//			else
//			{
//				childMap.put("upd_dtm", parentTemplate.getString(EKK0081C060CBSMsg.UPD_DTM));
//			}
//
//			// 更新オペレータアカウント
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.UPD_OPEACNT)) 
//			{
//				childMap.put("upd_opeacnt", "");
//			}
//			else
//			{
//				childMap.put("upd_opeacnt", parentTemplate.getString(EKK0081C060CBSMsg.UPD_OPEACNT));
//			}
//
//			// 無効フラグ
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.MK_FLG)) 
//			{
//				childMap.put("mk_flg", "");
//			}
//			else
//			{
//				childMap.put("mk_flg", parentTemplate.getString(EKK0081C060CBSMsg.MK_FLG));
//			}
//
//			// 予約適用年月日
//			if (parentTemplate.isNull(EKK0081C060CBSMsg.RSV_APLY_YMD)) 
//			{
//				childMap.put("rsv_aply_ymd", "");
//			}
//			else
//			{
//				childMap.put("rsv_aply_ymd", parentTemplate.getString(EKK0081C060CBSMsg.RSV_APLY_YMD));
//			}
//
//			dataList.add(childMap);
//		}
//
//		dataMap.put("EKK0081C060CBSMsg", dataList);

		// エラー情報の設定
		IRequestParameterReadWrite rtnParam = editErrorInfo(param, templates, (Integer)return_code, workMap);
		rtnParam = editEKK0081C060ErrorInfo(rtnParam, templates, fixedText);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)rtnParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		rtnParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return rtnParam;
	}

	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD START
	/**
	 * 指定された請求契約番号に紐づくサービス契約のリストを取得します
	 * <br>
	 * @param handle
	 * @param param
	 * @param seikyKeiNo
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	private List<Map> getInternetServicesBySeikyuNo(
			 SessionHandle handle
			,IRequestParameterReadWrite param
			,String fixedText
			,String seikyKeiNo
		) throws Throwable
	{
		// 戻り値マップ
		List<Map> rtnList = new ArrayList<Map>();
		CAANMsg[] resultMsgs = null;
		
		// インターネットサービス一覧照会（請求契約番号）実行処理
		JKKSIFEKK0081Mapper mapperEKK0081 = new JKKSIFEKK0081Mapper();
		CAANMsg templateEKK0081B526 = mapperEKK0081.getMappedTemplateEKK0081B526(seikyKeiNo, JPCModelConstant.FUNC_CD_1);
		// SIF実行
		resultMsgs = callScCmn(param, handle, templateEKK0081B526, mapperEKK0081, fixedText);
		CAANMsg[] msgEKK0081B526List = resultMsgs[0].getCAANMsgList(EKK0081B526CBSMsg.EKK0081B526CBSMSG1LIST);
		
		for(int i = 0; i < msgEKK0081B526List.length; i++)
		{
			CAANMsg msgEKK0081B526 = msgEKK0081B526List[i];

			// インターネットサービス一覧照会（請求契約番号）SIFから値を取得
			String rtnSvcKeiNo = msgEKK0081B526.getString(EKK0081B526CBSMsg1List.SVC_KEI_NO);		// サービス契約番号
			String rtnSvcKeiStat = msgEKK0081B526.getString(EKK0081B526CBSMsg1List.SVC_KEI_STAT);	// サービス契約ステータス

			Map<String, Object> map = new HashMap<String, Object>();
			map.put(SVCKEILIST1_SVC_KEI_NO, rtnSvcKeiNo);
			map.put(SVCKEILIST1_SVC_KEI_STAT, rtnSvcKeiStat);
			rtnList.add(map);
		}
		
		return rtnList;
	}
	
	/**
	 * リストで渡されたサービス契約にキャンセルまたは解約されていない有効なサービス契約がある場合に真を返します<br>
	 * その際、mineoSvcKeiNoに指定されたサービス契約番号はチェック対象から省きます
	 * ※解約・キャンセル処理内にてチェック処理
	 * <br>
	 * @param services
	 * @param statusList
	 * @param mineoSvcKeiNo
	 * @return 有効なサービス契約が含まれていればtrueを、なければfalseを返します
	 */
	private boolean isExistsEnabledServices(
			 List<Map> services
			,String mineoSvcKeiNo
		)
	{
		int aliveOtherNetCnt = 0;
		for (int i=0; i < services.size(); i++)
		{
			Map<String, Object> map = services.get(i);
			String svcKeiNo = (String)map.get(SVCKEILIST1_SVC_KEI_NO);
			String svcKeiStat = (String)map.get(SVCKEILIST1_SVC_KEI_STAT);
			// 自分以外のインターネットサービスで、解約・キャンセル済以外の場合、カウントする
			if(
				(svcKeiNo != null)
				&& !mineoSvcKeiNo.equals(svcKeiNo)
				&& (
						!JKKSvcConst.SVC_KEI_STAT_910.equals(svcKeiStat)
						&& !JKKSvcConst.SVC_KEI_STAT_920.equals(svcKeiStat)
				)
			)
			{
				aliveOtherNetCnt++;
			}
		}
		return aliveOtherNetCnt > 0;
	}

	/**
	 * 請求オプションサービス契約を停止します
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param seikyKeiNo
	 * @param idoDiv
	 * @throws Throwable
	 */
	private void stopForSeikyuOptionService(
			 SessionHandle handle
			,IRequestParameterReadWrite param
			,String fixedText
			,String seikyKeiNo
			,String idoDiv
		) throws Throwable
	{
		CAANMsg[] resultMsgs = null;
		// 請求オプションサービス契約一覧照会実行
		JKKSIFEKK0441Mapper mapperEKK0441 = new JKKSIFEKK0441Mapper();
		CAANMsg templateEKK0441B002 = mapperEKK0441.getMappedTemplateEKK0441B002(
							  seikyKeiNo
							, null
							, null
							, null
							, null
							, JPCModelConstant.FUNC_CD_1
						);
		// SIF実行
		resultMsgs = callScCmn(param, handle, templateEKK0441B002, mapperEKK0441, fixedText);
		CAANMsg[] msgEKK0441B002List = resultMsgs[0].getCAANMsgList(EKK0441B002CBSMsg.EKK0441B002CBSMSG1LIST);
		
		for(int i = 0; i < msgEKK0441B002List.length; i++)
		{
			CAANMsg msgEKK0441B002 = msgEKK0441B002List[i];

			// 請求オプションサービス契約番号
			String seiopsvcKeiNo = msgEKK0441B002.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_NO);
			// 請求サービス契約ステータスを取得
			String seiopsvcKeiStat = msgEKK0441B002.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT);
			
			// 請求オプションサービス契約一意照会実行
			CAANMsg templateEKK0441A010 = mapperEKK0441.getMappedTemplateEKK0441A010(
								  seiopsvcKeiNo
								, null
								, JCCBPCommon.getOpeDate(null)
								, JPCModelConstant.FUNC_CD_2
							);
			// SIF実行
			resultMsgs = callScCmn(param, handle, templateEKK0441A010, mapperEKK0441, fixedText);
			CAANMsg[] msgEKK0441A010List = resultMsgs[0].getCAANMsgList(EKK0441A010CBSMsg.EKK0441A010CBSMSG1LIST);
			// OM-2014-0002073 請求オプション一意照会結果の取得でシステムエラー 2014/06/04 藤田 MOD START
//			CAANMsg msgEKK0441A010 = msgEKK0441A010List[i];
			CAANMsg msgEKK0441A010 = msgEKK0441A010List[0];
			// OM-2014-0002073 請求オプション一意照会結果の取得でシステムエラー 2014/06/04 藤田 MOD END
			//ANK-2248-00-00 ADD START
			//請求書発行手数料以外のオプションは無視
			if (!SEIOPSVC_CD_SEIKYSH_HAKKO.equals((String)msgEKK0441A010.getString(EKK0441A010CBSMsg1List.SEIOPSVC_CD)))
			{
				continue;
			}
			//ANK-2248-00-00 ADD END
			// 更新年月日時分秒(更新前)
			String updDtmBf = msgEKK0441A010.getString(EKK0441A010CBSMsg1List.LAST_UPD_DTM);
			
			// 【サービス提供中】または【休止・中断中】の場合
			if(JKKSvcConst.SVC_KEI_STAT_100.equals(seiopsvcKeiStat)
				|| JKKSvcConst.SVC_KEI_STAT_210.equals(seiopsvcKeiStat))
			{	// 停止する
				
				/* ユーザデータ情報 */
				HashMap inMap = (HashMap)param.getData(fixedText);
				// サービス停止年月日
				String svcStpYmd = (String)inMap.get(EKK0081C050CBSMsg.SVC_STP_YMD);
				// サービス停止理由コード
				String svcStpRsnCd = (String)inMap.get(EKK0081C050CBSMsg.SVC_STP_RSN_CD);
				// 機能コード："1"固定で連携を想定
				String funcCode = (String)inMap.get(EKK0081C050CBSMsg.FUNC_CODE);
				
				// 請求オプションサービス契約停止
				CAANMsg templateEKK0441C080 = mapperEKK0441.getMappedTemplateEKK0441C080(
							  seiopsvcKeiNo
							, svcStpYmd
							, svcStpRsnCd
							, idoDiv
							, updDtmBf
							, funcCode
						);
				// SIF実行
				resultMsgs = callScCmn(param, handle, templateEKK0441C080, mapperEKK0441, fixedText);
			}
		}
	}

	/**
	 * 請求オプションサービス契約を停止解除します
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param seikyKeiNo
	 * @param idoDiv
	 * @throws Throwable
	 */
	private void stopRlsForSeikyuOptionService(
			 SessionHandle handle
			,IRequestParameterReadWrite param
			,String fixedText
			,String seikyKeiNo
			,String idoDiv
		) throws Throwable
	{
		CAANMsg[] resultMsgs = null;
		// 請求オプションサービス契約一覧照会実行
		JKKSIFEKK0441Mapper mapperEKK0441 = new JKKSIFEKK0441Mapper();
		CAANMsg templateEKK0441B002 = mapperEKK0441.getMappedTemplateEKK0441B002(
							  seikyKeiNo
							, null
							, null
							, null
							, null
							, JPCModelConstant.FUNC_CD_1
						);
		// SIF実行
		resultMsgs = callScCmn(param, handle, templateEKK0441B002, mapperEKK0441, fixedText);
		CAANMsg[] msgEKK0441B002List = resultMsgs[0].getCAANMsgList(EKK0441B002CBSMsg.EKK0441B002CBSMSG1LIST);
		
		for(int i = 0; i < msgEKK0441B002List.length; i++)
		{
			CAANMsg msgEKK0441B002 = msgEKK0441B002List[i];

			// 請求オプションサービス契約番号
			String seiopsvcKeiNo = msgEKK0441B002.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_NO);
			// 請求サービス契約ステータスを取得
			String seiopsvcKeiStat = msgEKK0441B002.getString(EKK0441B002CBSMsg1List.SEIOPSVC_KEI_STAT);

			// 請求オプションサービス契約一意照会実行
			CAANMsg templateEKK0441A010 = mapperEKK0441.getMappedTemplateEKK0441A010(
								  seiopsvcKeiNo
								, null
								, JCCBPCommon.getOpeDate(null)
								, JPCModelConstant.FUNC_CD_2
							);
			// SIF実行
			resultMsgs = callScCmn(param, handle, templateEKK0441A010, mapperEKK0441, fixedText);
			CAANMsg[] msgEKK0441A010List = resultMsgs[0].getCAANMsgList(EKK0441A010CBSMsg.EKK0441A010CBSMSG1LIST);
			// OM-2014-0002073 請求オプション一意照会結果の取得でシステムエラー 2014/06/04 藤田 MOD START
//			CAANMsg msgEKK0441A010 = msgEKK0441A010List[i];
			CAANMsg msgEKK0441A010 = msgEKK0441A010List[0];
			// OM-2014-0002073 請求オプション一意照会結果の取得でシステムエラー 2014/06/04 藤田 MOD END
			//ANK-2248-00-00 ADD START
			//請求書発行手数料以外のオプションは無視
			if (!SEIOPSVC_CD_SEIKYSH_HAKKO.equals((String)msgEKK0441A010.getString(EKK0441A010CBSMsg1List.SEIOPSVC_CD)))
			{
				continue;
			}
			//ANK-2248-00-00 ADD END
			// 更新年月日時分秒(更新前)
			String updDtmBf = msgEKK0441A010.getString(EKK0441A010CBSMsg1List.LAST_UPD_DTM);
			
			// 【停止中】の場合
			if(JKKSvcConst.SVC_KEI_STAT_220.equals(seiopsvcKeiStat))
			{	// 停止解除する
				
				/* ユーザデータ情報 */
				HashMap inMap = (HashMap)param.getData(fixedText);
				// サービス停止解除年月日
				String svcStpRlsYmd = (String)inMap.get(EKK0081C050CBSMsg.SVC_STP_RLS_YMD);
				// サービス停止解除理由コード
				String svcStpRlsRsnCd = (String)inMap.get(EKK0081C050CBSMsg.SVC_STP_RLS_RSN_CD);
				// 機能コード："1"固定で連携を想定
				String funcCode = (String)inMap.get(EKK0081C050CBSMsg.FUNC_CODE);
				
				// 請求オプションサービス契約停止解除
				CAANMsg templateEKK0441C090 = mapperEKK0441.getMappedTemplateEKK0441C090(
							  seiopsvcKeiNo
							, svcStpRlsYmd
							, svcStpRlsRsnCd
							, idoDiv
							, updDtmBf
							, funcCode
						);
				// SIF実行
				resultMsgs = callScCmn(param, handle, templateEKK0441C090, mapperEKK0441, fixedText);
			}
		}
	}
	// IT1-2014-0000098 請求オプション対応 2014/03/19 藤田 ADD END

	
	/**
	 * <pre>
	 * サービス契約停止解除のエラー情報マッピング処理
	 * 
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editEKK0081C060ErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, String fixedText)
			throws Exception
	{
		CAANMsg template = templates[0];
		
		// テンプレートID取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		
		/* ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (TEMPLATE_ID_SVC_KEI_STP_RLS_UPD.equals(templateId))
		{
			contents = new EKK0081C060CBSMsg().getContents();
		}
		
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						inMap.put(element, template.getString(element));
					}
				}
			}
		}
		
		return param;
	}

//	/**
//	 * 
//	 * MVNO返却パラメータ設定を行う
//	 * @param handle
//	 * @param param
//	 * @param fixedText
//	 * @param workMap
//	 * @throws Exception
//	 */
//	@SuppressWarnings("unchecked")
//	private void setMvnoRtnParam(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> workMap)
//	 throws RequestParameterException
//	{
//		/* ユーザデータ情報 */
//		HashMap dataMap = (HashMap)param.getData(fixedText);
//		
//		//エラーレベル
//		dataMap.put("errorLevel",workMap.get("errorLevel"));
//		//リターンコード
//		dataMap.put("returnCode",workMap.get("returnCode"));
//		//リターンメッセージ
//		dataMap.put("returnMessage",workMap.get("returnMessage"));
//	}
}
