/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JkkOpsvkeiTelIktAddCC
 *   ソースファイル名：JkkOpsvkeiTelIktAddCC.java
 *   作成者          ：富士通
 *   日付            ：2011年08月12日
 *＜機能概要＞
 *   オプションサービス契約＜電話＞一括登録部品
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/08/12   FJ）阪本    新規作成
 *   v3.00.00    2012/03/09	  FJ)尾崎    【ANK-0048-00-00】国際電話停止
 *   v3.00.00    2012/03/09	  FJ)尾崎	 【ANK-0047-00-00】通話料指定額到達通知機能対応(ICS)
 *   v4.00.00    2012/09/10   FJ)木村    【ANK-0571-00-00】オプションサービス開始日変更対応
 *   v4.00.00    2012/10/30   FJ)森      【ANK-1223-00-00】進捗補足事項編集対応
 *   v50.00.00   2020/06/11   FJ)平野    【ANK-3754-00-00】トビラフォン対応
 *   v50.00.01   2020/08/24   FJ)舘山     IT2-2020-0000014_横並び対応
 *   v61.00.00   2023/04/03   FJ)新井    【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
 *   v71.00.00   2024/05/13   FJ)舘山    【#84334】HGW瑕疵内障害
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.fujitsu.futurity.bp.custom.constant.JKKHakkoSODConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
import com.fujitsu.futurity.bp.custom.constant.KKSV0050_KKSV0050OP;
import com.fujitsu.futurity.bp.custom.constant.KKSV0050_KKSV0050OP_KKSV005001CC;
import com.fujitsu.futurity.bp.custom.constant.KKSV0050_KKSV0050OP_KKSV005001CC_JKKOpsvkeiTelIktAddCCList;
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.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EAC0401C020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0371A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0371C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371C050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0431C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0431C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0431C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0431D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0831A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0831A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0011B090CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011B090CBSMsg1List;
import eo.ejb.common.JCCModelCommon;


/**
 * オプションサービス契約＜電話＞一括登録部品
 * <p>
 * <br>
 * 電話オプション画面での登録処理を司る <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKOpsvkeiTelIktAddCC extends AbstractCommonComponent
{
	
	/** ----- 作業用クラスフィールド ----- **/
	// IT1-2013-0000291 2013/02/26 MOD START
//	private static String oPE_DATE = "";
	private String oPE_DATE = "";
	// IT1-2013-0000291 2013/02/26 MOD START
	
	/** 結果のキャッシュ **/
	private static final ArrayList<HashMap<String, Object>> CASH_RESULTS = new ArrayList<HashMap<String, Object>>();
	
	/** ----- リクエストパラメータ定数 ----- **/
	/** オプションサービス契約＜電話＞一括登録　作業項目リスト **/
	private static final String KKSV005001CC = KKSV0050_KKSV0050OP.KKSV005001CC;	// "KKSV005001CC";

	/** 機能コード **/
	private static final String FUNC_CODE = JCMConstants.FUNC_CODE_KEY;	// "func_code";

	/** SYSID **/
	private static final String SYSID = KKSV0050_KKSV0050OP_KKSV005001CC.SYSID;	//"sysid";

	/** サービス契約番号 **/
	private static final String SVC_KEI_NO = KKSV0050_KKSV0050OP_KKSV005001CC.SVC_KEI_NO;		//"svc_kei_no";
	
	/** サービス契約内訳番号 **/
	private static final String SVC_KEI_UCWK_NO = KKSV0050_KKSV0050OP_KKSV005001CC.SVC_KEI_UCWK_NO;	//"svc_kei_ucwk_no";

	/** サービス契約ステータス **/
	private static final String SVC_KEI_STAT = "svc_kei_stat";

	/** サービス契約内訳ステータス **/
	private static final String SVC_KEI_UCWK_STAT = "svc_kei_ucwk_stat";

	/** 請求契約番号 **/
	private static final String SEIKY_KEI_NO = KKSV0050_KKSV0050OP_KKSV005001CC.SEIKY_KEI_NO;		// "seiky_kei_no";

	/** 運用年月日 **/
	private static final String UNYO_DTM = "unyo_dtm";

	/** 運用年月日時分秒 **/
	private static final String UNYO_YMD = "unyo_ymd";

	/** 申込種別コード **/
	private static final String MSKM_SBT_CD = "mskm_sbt_cd";

	/** 異動区分 **/
	private static final String IDO_DIV = "ido_div";

	/** 異動理由コードリスト **/
	private static final String IDO_RSN_CD_LIST = "ido_rsn_cdList";

	/** 異動理由コード **/
	private static final String IDO_RSN_CD = "ido_rsn_cd";
	// UI残65_異動理由の要否について 2012/05/14 ariyoshi strat
	/** 異動理由メモ **/
	private static final String IDO_RSN_MEMO = "ido_rsn_memo";
	// UI残65_異動理由の要否について 2012/05/14 ariyoshi end
	
//	/** 進捗ステータス **/
//	private static final String PRG_STAT = "prg_stat";

	/** 親契約識別コード **/
	private static final String OYA_KEI_SKBT_CD = "oya_kei_skbt_cd";

	/** オプションサービス契約＜電話＞一括登録リスト **/
	private static final String JKKOPSVKEITELIKTADDCCLIST = "JKKOpsvkeiTelIktAddCCList";

	/** オプションサービスコード **/
	private static final String OP_SVC_CD = "op_svc_cd";

	/** サブオプションサービスコード **/
	private static final String SBOP_SVC_CD = "sbop_svc_cd";

	/** 利用開始年月日 **/
	private static final String USE_START_YMD = KKSV0050_KKSV0050OP_KKSV005001CC_JKKOpsvkeiTelIktAddCCList.USE_START_YMD;

	/** 料金コースコード **/
	private static final String PCRS_CD = "pcrs_cd";

	/** 料金プランコード **/
	private static final String PPLAN_CD = "pplan_cd";

	/** 通話料指定額到達通知指定金額 **/
	private static final String TWRYO_STIAM_TTU_TCHI_STIAM = "twryo_stiam_ttu_tchi_stiam";

	/** 更新年月日時分秒 **/
	private static final String UPD_DTM = "upd_dtm";

	/**
	 * 世代登録年月日時分秒（オプションサービス契約）「サブオプション登録用」
     * @since 2012-07-25追加　ST2-2012-0001384対応
	 */
	private static final String PARAM_KK0351_GENE_ADD_DTM = "kk0351_gene_add_dtm";

	/**************************************************************************/
	/** スキーマID定数                                                       **/
	/**************************************************************************/
	/** 申込内容承認登録                                 **/
	private static final String TEMPLATE_ID_EKK0011D020 = "EKK0011D020";
	/** 申込明細照査・後続業務依頼                       **/
	private static final String TEMPLATE_ID_EKK0021C060 = "EKK0021C060";
	/** サービス契約一意照会                             **/
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** サービス契約内訳一意照会                         **/
	private static final String TEMPLATE_ID_EKK0161A010 = "EKK0161A010";
	/** サービス契約回線内訳一覧照会（現在利用中）       **/
	private static final String TEMPLATE_ID_EKK0251B003 = "EKK0251B003";
	/** 機器提供サービス契約一覧照会（サービス契約番号） **/
	private static final String TEMPLATE_ID_EKK0341B002 = "EKK0341B002";
	/** オプションサービス契約＜電話＞一意照会           **/
	private static final String TEMPLATE_ID_EKK0371A010 = "EKK0371A010";
	/** オプションサービス契約＜ISP＞照査                **/
	private static final String TEMPLATE_ID_EKK0371C010 = "EKK0371C010";
	/** オプションサービス契約＜電話＞照査締結           **/
	private static final String TEMPLATE_ID_EKK0371C030 = "EKK0371C030";
	/** オプションサービス契約＜電話＞開始               **/
	private static final String TEMPLATE_ID_EKK0371C040 = "EKK0371C040";
	/** オプションサービス契約＜電話＞情報変更           **/
	private static final String TEMPLATE_ID_EKK0371C050 = "EKK0371C050";
	/** オプションサービス契約＜電話＞登録               **/
	private static final String TEMPLATE_ID_EKK0371D010 = "EKK0371D010";
	/** eo光電話通話合計超過通知コード変更               **/
	private static final String TEMPLATE_ID_EAC0401C020 = "EAC0401C020";
	/** サブオプションサービス契約＜ISP＞照査            **/
	private static final String TEMPLATE_ID_EKK0431C010 = "EKK0431C010";
	/** サブオプションサービス契約＜電話＞照査締結       **/
	private static final String TEMPLATE_ID_EKK0431C030 = "EKK0431C030";
	/** サブオプションサービス契約＜電話＞使用開始       **/
	private static final String TEMPLATE_ID_EKK0431C040 = "EKK0431C040";
	/** サブオプションサービス契約＜電話＞登録           **/
	private static final String TEMPLATE_ID_EKK0431D010 = "EKK0431D010";
	/** オプションサービス一意照会                       **/
	private static final String TEMPLATE_ID_EKK0821A010 = "EKK0821A010";
	/** サブオプションサービス一意照会                   **/
	private static final String TEMPLATE_ID_EKK0831A010 = "EKK0831A010";
	/** 進捗登録                                         **/
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
// ANK-3754-00-00 ADD START
	/** 契約機器配送対象物品一覧照会         **/
	private static final String TEMPLATE_ID_EDK0011B090 = "EDK0011B090";
// ANK-3754-00-00 ADD END


	private static final Object[][] CONTENTS_LIST =
	{
		{TEMPLATE_ID_EKK0011D020, new EKK0011D020CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0021C060, new EKK0021C060CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0081A010, new EKK0081A010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0161A010, new EKK0161A010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0251B003, new EKK0251B003CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0341B002, new EKK0341B002CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371A010, new EKK0371A010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371C010, new EKK0371C010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371C030, new EKK0371C030CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371C040, new EKK0371C040CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371C050, new EKK0371C050CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0371D010, new EKK0371D010CBSMsg().getContents()},
		{TEMPLATE_ID_EAC0401C020, new EAC0401C020CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0431C010, new EKK0431C010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0431C030, new EKK0431C030CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0431C040, new EKK0431C040CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0431D010, new EKK0431D010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0821A010, new EKK0821A010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK0831A010, new EKK0831A010CBSMsg().getContents()},
		{TEMPLATE_ID_EKK1091D010, new EKK1091D010CBSMsg().getContents()},
// ANK-3754-00-00 ADD START
		{TEMPLATE_ID_EDK0011B090, new EDK0011B090CBSMsg().getContents()},
// ANK-3754-00-00 ADD END
	};

	/** ----- コード値定数 ----- **/
	/** 機器提供サービスコード 光電話用ＶＡ */
	private static final String KKTK_SVC_CD_EOH_TEL_VA = "C004";
	/** オプションサービスコード（通話料上限通知） */
	private static final String OP_SVC_CD_VALUE_TWRYO_STIAM = "B072";

	/** 排他制御用更新日時 */
	private static final String EX_UPD_DTM = "ex_upd_dtm";

	//↓↓↓2012-02-20追加↓↓↓	ST2-2012-0000185対応
	/** 異動年月日時分秒 */
	private static final String IDO_DTM = "ido_dtm";

	private static final String EX_MSKM_DTL_NO = "mksm_dtl_noNOW";
	//↑↑↑2012-02-20追加↑↑↑	ST2-2012-0000185対応

	// ST2-2012-0000355 2012/03/12 ADD START
	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	// ST2-2012-0000355 2012/03/12 ADD END

	/** VLAN-ID確定フラグ：確定済 */
	public static final String VLAN_ID_FIX_FLG_ON = "1";
	
	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";
	
	/** 進捗特記事項１: 更新時埋込み固定文字列: 情報 **/
	public static final String PRG_TKJK_1_JYOHO = "情報";
	
	/** 進捗特記事項１: 更新時埋込み固定文字列: オプション処理区分 **/
	public static final String PRG_TKJK_1_TOUROKU = "登録";

	private static final boolean OUTPUT_LIST = true;
	private static final boolean OUTPUT_MSG  = false;

// ▽▽▽ ANK-3754-00-00 ADD START
	/** EKK0342B002の全データを取得するためのキー文字列 */
	private static final String ALLDATA_EKK0341B002 = "ALLDATA_EKK0341B002";
// △△△ ANK-3754-00-00 ADD END
	/**
	 *　オプションサービス契約＜電話＞一括登録
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		HashMap<String, Object> requestParam = null;
		int statusCode = 0;
		
		//作業日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);

		//キャッシュのクリア
		CASH_RESULTS.clear();
		
		//リクエストパラメータの取得
		requestParam = analyzeRequestParam(param);
	
		initOpSvcKeiKeyMap();		//2012-07-25追加　ST2-2012-0001384対応

		//メイン処理開始
		statusCode = mainProc(
				handle, 
				param, 
				requestParam, 
				fixedText);
	
		if(statusCode != 0)
		{
			throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode));
		}
		
		//リターンコードの設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, String.valueOf(statusCode));
		
		//処理終了
		return param;
		
	}
	
	/**
	 * メイン処理
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param requestParam リクエストパラメータ
	 * @param fixedText ユーザ任意文字列
	 * @return SIF呼び出し時のリターンコード
	 * @throws Throwable
	 */
	public int mainProc(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			HashMap<String, Object> requestParam,
			String fixedText
	) throws Throwable
	{
		HashMap<String, Object> wkResultHash = null;
		ArrayList<HashMap<String, Object>> jkkOpsvkeiTelIktAddCCList = null;

		int statusCode = 0;

		String svcKeiStat     = "";			// サービス契約ステータス
		String svcKeiUcwkStat = "";			// サービス契約内訳ステータス
		// 20120423 ST2-2012-0000737 START
		boolean sodHakkoFlg = false;		// ＳＯＤ発行フラグ
		// 20120423 ST2-2012-0000737 END

// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD START
		String prgTkjk1 = "";				// 進捗特記事項１
		String opSvcNm  = "";				// オプションサービス名
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD END

		wkResultHash = new HashMap<String, Object>();

		/*************************************************************************************/
		/** サービス契約一意照会                                                            **/
		/*************************************************************************************/
		statusCode = callEKK0081A010SC(param, handle, requestParam, wkResultHash);

		// 失敗していたらステータスコードを返却する
		if (statusCode != 0)
		{
			return statusCode;
		}

		// サービス契約ステータスを取得
		Map<String, Object> svcKeiInfo = (Map<String, Object>)wkResultHash.get(TEMPLATE_ID_EKK0081A010);
		svcKeiStat = (String)svcKeiInfo.get(SVC_KEI_STAT);

		// サービス契約一意照会の更新日時を取得
		if (wkResultHash != null)
		{
			requestParam.put(EX_UPD_DTM, getLastUpdDtm(wkResultHash, TEMPLATE_ID_EKK0081A010));
		}

		/*************************************************************************************/
		/** サービス契約内訳一意照会                                                        **/
		/*************************************************************************************/
		statusCode = callEKK0161A010SC(param, handle, requestParam, wkResultHash);

		// 失敗していたらステータスコードを返却する
		if(statusCode != 0)
		{
			return statusCode;
		}

		// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
		// サービス契約内訳ステータスを取得
		Map<String, Object> svcKeiUcwkInfo = (Map<String, Object>)wkResultHash.get(TEMPLATE_ID_EKK0161A010);
		svcKeiUcwkStat = (String)svcKeiUcwkInfo.get(SVC_KEI_UCWK_STAT);
		// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲

		/*************************************************************************************/
		/** 機器提供サービス契約一覧照会（サービス契約番号）                                **/
		/*************************************************************************************/
		statusCode = callEKK0341B002SC(param, handle, requestParam, wkResultHash);

		// 失敗していたらステータスコードを返却する
		if(statusCode != 0)
		{
			return statusCode;
		}

		// 20120423 ST2-2012-0000737 START
		// 機器提供サービス契約一覧照会（サービス契約番号）の結果より、機器製造番号を取得
		HashMap<String, Object> eKK0341B002Hash = (HashMap<String, Object>)wkResultHash.get(TEMPLATE_ID_EKK0341B002);
		String kikiSeizoNo = null;
		if (eKK0341B002Hash != null)
		{
			kikiSeizoNo = (String)eKK0341B002Hash.get(EKK0341B002CBSMsg1List.KIKI_SEIZO_NO);
		}
// ▽▽▽ ANK-3754-00-00 ADD END
		
		// 上記のロジックでは多機能ルータのレコードを特定できない
		// このため、検索結果を全件取得する。（判定は後で実施）
		// ちなみに下のロジックで多機能ルータを取得しようとしているが「提供中」までなら必ず返却されるはず。
		CAANMsg[] kk0341b002CbsMsg1List = (CAANMsg[])wkResultHash.get(ALLDATA_EKK0341B002);
		
		// 念のため下のロジックでデータが取得できるように変数を定義
		HashMap<String, Object> kk0341b504 = null;
		
// △△△ ANK-3754-00-00 ADD END
		// ▼▼▼▼▼ 2013/01/25 ST3-2013-0000202 SOD発行フラグ復活 UPD START ▼▼▼▼▼
		// ※※右記案件にて削除（2012/09/10 【ANK-0571-00-00】オプションサービス開始日変更対応）
		/*************************************************************************************/
		/** サービス契約回線内訳一覧照会（現在利用中）                                      **/
		/*************************************************************************************/
		statusCode = callEKK0251B003SC(param, handle, wkResultHash, (String)svcKeiInfo.get(EKK0081A010CBSMsg1List.SVC_KEI_NO));
		HashMap<String, Object> ekk0251b003Hash = (HashMap<String, Object>)wkResultHash.get(TEMPLATE_ID_EKK0251B003);

		if (ekk0251b003Hash != null && ekk0251b003Hash.size() > 0)
		{
//↓↓↓2013-12-26追加　2014年２月案件IT2-2013-0000844（照査前登録での電話オプション追加でシステムエラー）↓↓↓
			//サービス契約に付くＢＢＲを検索できなかった場合、サービス契約回線内訳に付く多機能ルータを検索してみる
			if (null == kikiSeizoNo || 1 > kikiSeizoNo.length())
			{
				String kk0251No = (String)ekk0251b003Hash.get(EKK0251B003CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO);
				callEKK0341B504SC(param, handle, kk0251No, wkResultHash);
				ArrayList<HashMap<String, Object>> ekk0341b504List = (ArrayList<HashMap<String, Object>>)wkResultHash.get("EKK0341B504");
				for (int i=0; null!=ekk0341b504List && i<ekk0341b504List.size(); i++)
				{
					HashMap<String, Object> childMap = ekk0341b504List.get(i);
					String kk0341Stat = (String) childMap.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT);
					String kktkSvcCd  = (String) childMap.get(EKK0341B504CBSMsg1List.KKTK_SVC_CD);
					// ▽▽▽ ANK-4315-00-00 MOD START
					//if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) && "910".compareTo(kk0341Stat) > 0)
					if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) && "910".compareTo(kk0341Stat) > 0 || JKKStrConst.KKTK_SVC_CD_HGW.equals(kktkSvcCd) && "910".compareTo(kk0341Stat) > 0)
					// △△△ ANK-4315-00-00 MOD END
					{
// ▽▽▽ ANK-3754-00-00 ADD START
						// 念のためここでも多機能ルータ情報を取得する。
						kk0341b504 = childMap;
// △△△ ANK-3754-00-00 ADD END
						kikiSeizoNo  = (String) childMap.get(EKK0341B504CBSMsg1List.KIKI_SEIZO_NO);
						break;
					}
				}
			}
//↑↑↑2013-12-26追加　2014年２月案件IT2-2013-0000844（照査前登録での電話オプション追加でシステムエラー）↑↑↑
			
			// VLAN-ID確定フラグを取得
			String vlanIdFixFlg = (String)ekk0251b003Hash.get(EKK0251B003CBSMsg1List.VLAN_ID_FIX_FLG);

			// VLAN-ID確定フラグが確定済、かつVAの機器製造番号が設定されている場合
			if (
					VLAN_ID_FIX_FLG_ON.equals(vlanIdFixFlg)
					&& !JKKBpCommon.isNull(kikiSeizoNo))
			{
				// SOD発行フラグにtrueを設定
				sodHakkoFlg = true;
			}
		}
		// ▲▲▲▲▲ 2013/01/25 ST3-2013-000202 SOD発行フラグ復活 UPD E N D ▲▲▲▲▲
		// 20120423 ST2-2012-0000737 END

		//↓↓↓2012-02-20追加↓↓↓	ST2-2012-0000185対応
		String mapKey = null;
		//↑↑↑2012-02-20追加↑↑↑	ST2-2012-0000185対応

		/*************************************************************************************/
		/** 申込内容承認登録                                                                **/
		/*************************************************************************************/
		if (isShosazumi(svcKeiStat))
		{
			statusCode = callEKK0011D020SC(param, handle, requestParam, wkResultHash);
			mapKey = TEMPLATE_ID_EKK0011D020;

			// 異動日時
			requestParam.put(IDO_DTM, JKKBpCommon.getSysDateTimeStamp());

			// 失敗していたらステータスコードを返却する
			if (statusCode != 0)
			{
				return statusCode;
			}
		}

		/*************************************************************************************/
		/** 申込内容照査・後続業務依頼                                                      **/
		/*************************************************************************************/
		if (isShosazumi(svcKeiStat))
		{
			statusCode = callEKK0021C060SC(param, handle, requestParam, wkResultHash, mapKey);

			// 失敗していたらステータスコードを返却する
			if(statusCode != 0)
			{
				return statusCode;
			}
		}

		// 運用年月日
		String unyoYmd = (String)requestParam.get(UNYO_YMD);

		// 更新対象のオプションサービス契約＜電話＞一括路登録リストの取得
		jkkOpsvkeiTelIktAddCCList = (ArrayList<HashMap<String, Object>>)requestParam.get(JKKOPSVKEITELIKTADDCCLIST);

		// 送信データ分だけループ
		for(int i = 0 ; i < jkkOpsvkeiTelIktAddCCList.size() ; i++)
		{
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC = null;

			// １要素の取得
			jkkOpsvkeiTelIktAddCC = jkkOpsvkeiTelIktAddCCList.get(i);

			// 即時反映フラグを設定
			boolean isSokuji = unyoYmd.equals((String)jkkOpsvkeiTelIktAddCC.get(USE_START_YMD));
			// 通話指定額通知
			String opSvcCd = (String)jkkOpsvkeiTelIktAddCC.get(OP_SVC_CD);
			boolean isTwryoStiam = OP_SVC_CD_VALUE_TWRYO_STIAM.equals(opSvcCd);
			// 通話指定額通知がすでに登録されているか
			boolean existTwryoStiam = false;
			// OM-900 2013/08/28
			// 通話指定額通知更新判定フラグ
			boolean existTwryoFlg = false;
			// 進捗実行フラグ
			boolean prgExecFlg = true;
			// OM-900 2013/08/28
			
			// 利用開始日を上位階層に保持
			requestParam.put(USE_START_YMD, jkkOpsvkeiTelIktAddCC.get(USE_START_YMD));

			// **************************************************************************** //
			// オプションサービス処理                                                       //
			// **************************************************************************** //
			if(isSvcKei(jkkOpsvkeiTelIktAddCC))
			{
				// +++++++++++++++++++++++++++++++++++++++
				// 通話指定額通知判定
				// +++++++++++++++++++++++++++++++++++++++
				if(
						isTwryoStiam
						&& (
								null != jkkOpsvkeiTelIktAddCC.get(OP_SVC_KEI_NO)
								&& !"".equals(jkkOpsvkeiTelIktAddCC.get(OP_SVC_KEI_NO))
						)
				)
				{
					// 通話指定額通知の場合
					isSokuji = true;

					/*************************************************************************************/
					/** オプションサービス契約＜電話＞一意照会                                          **/
					/*************************************************************************************/
					statusCode = callEKK0371A010SC(
							param,
							handle,
							requestParam,
							jkkOpsvkeiTelIktAddCC,
							wkResultHash
					);

					// 失敗していたらステータスコードを返却する
					if(statusCode != 0)
					{
						return statusCode;
					}

					HashMap<String, Object> ekk0371a010Msg = (HashMap<String, Object>) wkResultHash.get(TEMPLATE_ID_EKK0371A010);

					if (null != ekk0371a010Msg)
					{
						CAANMsg[] ekk0371a010Msg1list = (CAANMsg[])ekk0371a010Msg.get(EKK0371A010CBSMsg.EKK0371A010CBSMSG1LIST);
						// OM-900 2013/08/28
						HashMap<String, Object> ekk0371a010CBSMSG1 = ekk0371a010Msg1list[0].getMsgData();
						// OM-900 2013/08/28
						
						// OM-900 2013/08/28
						// 画面から入力された通話料指定額到達通知指定金額
						String nowTsttStiam = (String)jkkOpsvkeiTelIktAddCC.get(TWRYO_STIAM_TTU_TCHI_STIAM);
						
						// ＤＢから取得する既存値
						String getTsttStiam = (String)ekk0371a010CBSMSG1.get(EKK0371A010CBSMsg1List.TWRYO_STIAM_TTU_TCHI_STIAM);
						
						if (null != ekk0371a010Msg1list && ekk0371a010Msg1list.length > 0)
						{
							
							// DB値が画面からの該当値が一致しない場合
							if (!getTsttStiam.equals(nowTsttStiam))
							{
								existTwryoFlg = true;
							}
							else
							{
								// 一致する場合は、進捗出さない
								prgExecFlg = false;
							}
							existTwryoStiam = true;
						}
						// OM-900 2013/08/28
					}
				}

				// +++++++++++++++++++++++++++++++++++++++
				// 通話指定額通知オプションが存在する場合（更新モード）
				// +++++++++++++++++++++++++++++++++++++++
				if (existTwryoStiam)
				{
					// OM-900 2013/08/28
					if (existTwryoFlg) {
						/*************************************************************************************/
						/** オプションサービス契約＜電話＞情報変更                                          **/
						/*************************************************************************************/
						statusCode = callEKK0371C050SC(
								param,
								handle,
								requestParam,
								jkkOpsvkeiTelIktAddCC,
								wkResultHash
						);
	
						// 失敗していたらステータスコードを返却する
						if(statusCode != 0)
						{
							return statusCode;
						}
	
						// 排他制御用の更新日時を更新
						if (wkResultHash != null)
						{
							setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0371C050);
						}
	
						/*************************************************************************************/
						/** ｅｏ光電話合計超過通知コード更新                                                **/
						/*************************************************************************************/
						statusCode = callEAC0401C020SC(
								param,
								handle,
								requestParam,
								wkResultHash
						);
	
						// 失敗していたらステータスコードを返却する
						if(statusCode != 0)
						{
							return statusCode;
						}
	
						//↓↓↓2012-08-21追加　IT2-2012-0001521対応のついで（通話料上限通知の進捗が正しく登録されない）↓↓↓
						// 進捗登録時に通話料上限通知のオプションサービス契約番号が設定されるよう、オプションサービス＜電話＞契約登録の前回処理結果を削除
						wkResultHash.remove(TEMPLATE_ID_EKK0371D010);	
						//↑↑↑2012-08-21追加　IT2-2012-0001521対応のついで（通話料上限通知の進捗が正しく登録されない）↑↑↑
					}
					// OM-900 2013/08/28
				}
				// +++++++++++++++++++++++++++++++++++++++
				// 通話指定額通知オプションが存在しない場合（登録モード）
				// +++++++++++++++++++++++++++++++++++++++
				else
				{
					/*************************************************************************************/
					/** オプションサービス契約＜電話＞登録                                              **/
					/*************************************************************************************/
					statusCode = callEKK0371D010SC(
							param,
							handle,
							requestParam,
							jkkOpsvkeiTelIktAddCC,
							wkResultHash
					);

					// 失敗していたらステータスコードを返却する
					if(statusCode != 0)
					{
						return statusCode;
					}

					// 排他制御用の更新日時を更新
					if (wkResultHash != null)
					{
						setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0371D010);
						//2012-07-25追加、更新後のオプションサービス契約主キー情報
						setOpSvcKeiKeyMapFromUpd(opSvcCd, wkResultHash, TEMPLATE_ID_EKK0371D010);
					}

					// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
					// サービス契約内訳ステータスが締結済以降の場合
					if (isTeiketsuzumi(svcKeiUcwkStat))
					// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
					{
						/*************************************************************************************/
						/** オプションサービス契約＜電話＞照査締結                                          **/
						/*************************************************************************************/
						statusCode = callEKK0371C030SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);

						// 失敗していたらステータスコードを返却する
						if (statusCode != 0)
						{
							return statusCode;
						}

						// 排他制御用の更新日時を更新
						if (wkResultHash != null)
						{
							setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0371C030);
							//2012-07-25追加、更新後のオプションサービス契約主キー情報
							setOpSvcKeiKeyMapFromUpd(opSvcCd, wkResultHash, TEMPLATE_ID_EKK0371C030);
						}

						// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
						// サービス契約内訳ステータスがサービス提供中以降の場合
						if (isTeikyo(svcKeiUcwkStat))
						// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
						{
// ANK-3754-00-00 ADD START
							// オプション開始可能かどうかチェックする
							if (isEnabledStartOption(handle, param, requestParam, opSvcCd, kk0341b002CbsMsg1List, kk0341b504)){
// ANK-3754-00-00 ADD END
								/*************************************************************************************/
								/** オプションサービス契約＜電話＞開始                                              **/
								/*************************************************************************************/
								statusCode = callEKK0371C040SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);
	
								// 失敗していたらステータスコードを返却する
								if (statusCode != 0)
								{
									return statusCode;
								}
	
								// 排他制御用の更新日時を更新
								if (wkResultHash != null)
								{
									setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0371C040);
									//2012-07-25追加、更新後のオプションサービス契約主キー情報
									setOpSvcKeiKeyMapFromUpd(opSvcCd, wkResultHash, TEMPLATE_ID_EKK0371C040);
								}
							// ANK-3754-00-00 ADD START
							}
							// ANK-3754-00-00 ADD END
						}
					}
					// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
					// サービス契約内訳ステータスが照査済の場合
					else if (isShosazumi(svcKeiUcwkStat))
					// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
					{
						/*************************************************************************************/
						/** オプションサービス契約＜電話＞照査                                              **/
						/*************************************************************************************/
						statusCode = callEKK0371C010SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);
	
						// 失敗していたらステータスコードを返却する
						if (statusCode != 0)
						{
							return statusCode;
						}
	
						// 排他制御用の更新日時を更新
						if (wkResultHash != null)
						{
							setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0371C010);
							//2012-07-25追加、更新後のオプションサービス契約主キー情報
							setOpSvcKeiKeyMapFromUpd(opSvcCd, wkResultHash, TEMPLATE_ID_EKK0371C010);
						}
					}
				}

// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD START
				String dataMapKey = fixedText;

				/*************************************************************************************/
				/*************************************************************************************/
				CAANMsg[] ekk0821a010OUT = callEKK0821A010(param, handle, dataMapKey, opSvcCd);

				opSvcNm  = ekk0821a010OUT[0].getString(EKK0821A010CBSMsg1List.OP_SVC_NM);
				prgTkjk1 = opSvcNm + PRG_TKJK_1_JYOHO + PRG_TKJK_1_TOUROKU;
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD END
			}
			// **************************************************************************** //
			// サブオプションサービス処理                                                   //
			// **************************************************************************** //
			else
			{
				// サブオプションサービスコード
				String sbOpSvcCd = (String)jkkOpsvkeiTelIktAddCC.get(SBOP_SVC_CD);		//2012-07-25追加

				// 指定されたオプションサービス契約番号
				String op_svc_kei_no       = (String)jkkOpsvkeiTelIktAddCC.get(KKSV0050_KKSV0050OP_KKSV005001CC_JKKOpsvkeiTelIktAddCCList.OP_SVC_KEI_NO);
				String kk0351_gene_add_dtm = (String)jkkOpsvkeiTelIktAddCC.get(PARAM_KK0351_GENE_ADD_DTM);

				if (op_svc_kei_no == null || "".equals(op_svc_kei_no))
				{
					String[] pair = opSvcKeiKeyMap.get(opSvcCd);
					if (null != pair)
					{
						op_svc_kei_no = pair[NO_POS];
						kk0351_gene_add_dtm = pair[GE_POS];
					}
				}
				else
				{
					setOpSvcKeiKeyMap(opSvcCd + CHBF_KEY, op_svc_kei_no, kk0351_gene_add_dtm);
				}

				/*************************************************************************************/
				/** サブオプションサービス契約＜電話＞登録                                          **/
				/*************************************************************************************/
				statusCode = callEKK0431D010SC(
						param,
						handle,
						requestParam,
						jkkOpsvkeiTelIktAddCC,
						wkResultHash,
						op_svc_kei_no
				);

				// 失敗していたらステータスコードを返却する
				if(statusCode != 0)
				{
					return statusCode;
				}

				// 排他制御用の更新日時を更新
				if (wkResultHash != null)
				{
					setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0431D010);
					//2012-07-25追加、更新後のサブオプションサービス契約主キー情報
					setSbopSvcKeiKeyMap(sbOpSvcCd, wkResultHash, TEMPLATE_ID_EKK0431D010);
				}

				// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
				// サービス契約内訳ステータスが締結済以降の場合
				if (isTeiketsuzumi(svcKeiUcwkStat))
				// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
				{
					/*************************************************************************************/
					/** サブオプションサービス契約＜電話＞照査締結                                      **/
					/*************************************************************************************/
					statusCode = callEKK0431C030SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);

					// 失敗していたらステータスコードを返却する
					if (statusCode != 0)
					{
						return statusCode;
					}

					// 排他制御用の更新日時を更新
					if (wkResultHash != null)
					{
						setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0431C030);
						//2012-07-25追加、更新後のサブオプションサービス契約主キー情報
						setSbopSvcKeiKeyMap(sbOpSvcCd, wkResultHash, TEMPLATE_ID_EKK0431C030);
					}

					// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
					// サービス契約内訳ステータスがサービス提供中以降の場合
					if (isTeikyo(svcKeiUcwkStat))
					// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
					{
						/*************************************************************************************/
						/** サブオプションサービス契約＜電話＞開始                                          **/
						/*************************************************************************************/
						statusCode = callEKK0431C040SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);

						// 失敗していたらステータスコードを返却する
						if (statusCode != 0)
						{
							return statusCode;
						}

						// 排他制御用の更新日時を更新
						if (wkResultHash != null)
						{
							setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0431C040);
							//2012-07-25追加、更新後のサブオプションサービス契約主キー情報
							setSbopSvcKeiKeyMap(sbOpSvcCd, wkResultHash, TEMPLATE_ID_EKK0431C040);
						}
					}
				}
				// ▼▼▼▼▼ 2012/12/19 IT2-2012-0002127 ADD START ▼▼▼▼▼
				// サービス契約内訳ステータスが照査済の場合
				else if (isShosazumi(svcKeiUcwkStat))
				// ▲▲▲▲▲ 2012/12/19 IT2-2012-0002127 ADD E N D ▲▲▲▲▲
				{
					/*************************************************************************************/
					/** サブオプションサービス契約＜電話＞照査                                          **/
					/*************************************************************************************/
					statusCode = callEKK0431C010SC(param, handle, requestParam, jkkOpsvkeiTelIktAddCC, wkResultHash);

					// 失敗していたらステータスコードを返却する
					if (statusCode != 0)
					{
						return statusCode;
					}

					// 排他制御用の更新日時を更新
					if (wkResultHash != null)
					{
						setSvKeiUpdDtm(requestParam, wkResultHash, TEMPLATE_ID_EKK0431C010);
						//2012-07-25追加、更新後のサブオプションサービス契約主キー情報
						setSbopSvcKeiKeyMap(sbOpSvcCd, wkResultHash, TEMPLATE_ID_EKK0431C010);
					}
				}

// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD START
				String dataMapKey = fixedText;

				/*************************************************************************************/
				/*************************************************************************************/
				CAANMsg[] ekk0831a010OUT = callEKK0831A010(param, handle, dataMapKey, sbOpSvcCd);

				opSvcNm  = ekk0831a010OUT[0].getString(EKK0831A010CBSMsg1List.SBOP_SVC_NM);
				prgTkjk1 = opSvcNm + PRG_TKJK_1_JYOHO + PRG_TKJK_1_TOUROKU;
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD END
			}

			String prgStat = "";

			// **************************************************************************** //
			// 即時適用の場合は 5102：オプション設定完了                                    //
			// **************************************************************************** //
			if (isSokuji)
			{
				prgStat = "5102";
			}
			// **************************************************************************** //
			// 即時適用の場合は 5101：オプション情報申請中                                  //
			// **************************************************************************** //
			else
			{
				prgStat = "5101";
			}
// OM-900 2013/08/28
			if (prgExecFlg)
			{
// OM-900 2013/08/28
				/*************************************************************************************/
				/** 進捗登録                                                                        **/
				/*************************************************************************************/
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 MOD START
				statusCode = callEKK1091D010SC(param, handle, requestParam, wkResultHash, prgStat, prgTkjk1);
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 MOD END
// OM-900 2013/08/28
			}
// OM-900 2013/08/28
			// 失敗していたらステータスコードを返却する
			if(statusCode != 0)
			{
				return statusCode;
			}

			// ＳＯＤ発行有無フラグ
			sodTerm.put(
					opSvcCd,
					new Boolean(
							isShosazumi(svcKeiStat)
							&& isSokuji
							&& (
									sodHakkoFlg
									|| (
											!sodHakkoFlg
											&& JKKSvcConst.OP_SVC_CD_TENSO.equals(opSvcCd)
									)
							)
					)
			);

			// 結果のキャッシュ
			CASH_RESULTS.add(wkResultHash);

			// ST1-2013-0000040 2013/01/09 start
			// 1件の処理結果をクリアする
			wkResultHash.put(TEMPLATE_ID_EKK0371D010, null);
			wkResultHash.put(TEMPLATE_ID_EKK0371C050, null);
			// ST1-2013-0000040 2013/01/09 end

			// サブオプションだった場合、サブオプションの結果をクリアする
			if (!isSvcKei(jkkOpsvkeiTelIktAddCC))
			{
				wkResultHash.put(TEMPLATE_ID_EKK0431D010, null);
			}
		}

		//↓↓↓2012-07-25追加　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↓↓↓
		/*************************************************************************************/
		/** ＳＯＤ発行                                                                      **/
		/*************************************************************************************/
		// SOD発行CC受け渡し用マップ編集
		editHakkoSODccMap(param, requestParam, wkResultHash);

		// SOD発行CC呼出し
		(new JKKHakkoSODCC()).hakkoSOD(handle, param, KKSV0050_KKSV0050OP.KKSV005003CC);
		//↑↑↑2012-07-25追加　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↑↑↑

		return statusCode;
	}


	/**
	 * 指定リスト要素がオプションサービスかサブオプションサービスかを判定する
	 * @param jkkOpsvkeiTelIktAddCC リストの要素
	 * @return オプションサービスか？
	 */
	private boolean isSvcKei(HashMap<String, Object> jkkOpsvkeiTelIktAddCC)
	{
		
		Object sbopSvcCd = null;
		String strSbopSvcCd = null;
		
		sbopSvcCd = jkkOpsvkeiTelIktAddCC.get(SBOP_SVC_CD);
		
		//サブオプションサービスコードが指定しているかどうかで判定
		if(sbopSvcCd == null)
		{
			return true;
		}
		
		strSbopSvcCd = (String)sbopSvcCd;
		if("".equals(strSbopSvcCd))
		{
			return true;
		}
		
		return false;
		
	}
	
	
	/**
	 * リクエストパラメータの取得
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return リクエストパラメータのHash
	 * @throws RequestParameterException 例外時にスローされます
	 */
	private HashMap<String, Object> analyzeRequestParam(IRequestParameterReadWrite param) 
	throws RequestParameterException
	{
		
		HashMap<String, Object> paramData = null;

		//データの受け取り
		paramData = (HashMap<String, Object>)param.getData(KKSV005001CC);

		return paramData;
		
	}

	/**
	 * オプションサービス契約＜電話＞登録SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param jkkOpsvkeiTelIktAddCC 処理対象Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws Throwable 
	 */
	private int callEKK0371D010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash)
			throws Throwable
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0371D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0371D010CBSMsg.class.getName());
		mappingEKK0371D010InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// エラーマッピング処理
		editResultRP(sIFResult, param, KKSV005001CC);
		
		errChk(sIFResult);

		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{

			resultHash.put(
					TEMPLATE_ID_EKK0371D010, 
					mappingEKK0371D010SCOutMsg(resultMsgs));
			
		}

		return status;
		
	}
	

	/**
	 * EKK0371D010の結果をHashとして抽出する
	 * @param resultMsgs EKK0371D010のテンプレートリスト
	 * @return EKK0371D010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0371D010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		retHash = msg.getMsgData();
		
		return retHash;
		
	}
	
	/**
	 * templateに対してEKK0371D010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param jkkOpsvkeiTelIktAddCC 処理対象Hash
	 * @param resultHash 結果条件
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0371D010InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371D010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0371D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371D010);

		//機能コード
		template.set(EKK0371D010CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));

		//パラメータ設定
		//オプションサービスコード
		template.set(
				EKK0371D010CBSMsg.OP_SVC_CD,
				jkkOpsvkeiTelIktAddCC.get(OP_SVC_CD));
		
		//料金コースコード
		template.set(
				EKK0371D010CBSMsg.PCRS_CD,
				jkkOpsvkeiTelIktAddCC.get(PCRS_CD));
				
		//料金プランコード
		template.set(
				EKK0371D010CBSMsg.PPLAN_CD,
				jkkOpsvkeiTelIktAddCC.get(PPLAN_CD));
			
		//親契約識別コード
		template.set(
				EKK0371D010CBSMsg.OYA_KEI_SKBT_CD,
				inHash.get(OYA_KEI_SKBT_CD));
		
		//SYSID
		template.set(
				EKK0371D010CBSMsg.SYSID,
				inHash.get(SYSID));
		
		//異動区分
		template.set(
				EKK0371D010CBSMsg.IDO_DIV,
				inHash.get(IDO_DIV));
		
		//サービス契約番号
		// IT1-2012-0002376 電話のオプションサービス契約にサービス契約番号が設定されている 2012/12/16 START
//		template.set(EKK0371D010CBSMsg.SVC_KEI_NO, inHash.get(SVC_KEI_NO));
		template.setNull(EKK0371D010CBSMsg.SVC_KEI_NO);
		// IT1-2012-0002376 電話のオプションサービス契約にサービス契約番号が設定されている 2012/12/16 END
		
		//サービス契約内訳番号
		template.set(EKK0371D010CBSMsg.SVC_KEI_UCWK_NO, inHash.get(SVC_KEI_UCWK_NO));

		//請求契約番号
		template.set(EKK0371D010CBSMsg.SEIKY_KEI_NO, inHash.get(SEIKY_KEI_NO));

		// 更新日時
		template.set(EKK0371D010CBSMsg.UPD_DTM_BF, inHash.get(EX_UPD_DTM));

		//申込明細番号		//2012-02-21
		String mskm_dtl_no = (String) inHash.get(EX_MSKM_DTL_NO);
		template.set(EKK0371D010CBSMsg.MSKM_DTL_NO, mskm_dtl_no);

		if (OP_SVC_CD_VALUE_TWRYO_STIAM.equals(jkkOpsvkeiTelIktAddCC.get(OP_SVC_CD))){
			// 通話料上限通知の場合
			// 通話料指定額到達通知指定金額
			template.set(
					EKK0371D010CBSMsg.TWRYO_STIAM_TTU_TCHI_STIAM,
					jkkOpsvkeiTelIktAddCC.get(TWRYO_STIAM_TTU_TCHI_STIAM));

			// サービス利用開始希望年月日に運用日をセットする
			template.set(EKK0371D010CBSMsg.SVC_USE_STA_KIBO_YMD, inHash.get(UNYO_YMD));
		}
		else{
			// 通話料指定額到達通知指定金額にnullをセットする
			template.setNull(EKK0371D010CBSMsg.TWRYO_STIAM_TTU_TCHI_STIAM);

			// サービス利用開始希望年月日
			template.set(EKK0371D010CBSMsg.SVC_USE_STA_KIBO_YMD, inHash.get(USE_START_YMD));
		}
		// 2012/09/10【ANK-0571-00-00】オプションサービス開始日変更対応 ADD-START
		// 表示用サービス提供開始年月日
		template.set(EKK0371D010CBSMsg.DSP_SVCTK_STAYMD, inHash.get(USE_START_YMD));
		// 2012/09/10【ANK-0571-00-00】オプションサービス開始日変更対応 ADD-END
	}
	
	
	/**
	 * 申込明細照査・後続業務依頼結SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @param mapKey 
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0021C060SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash, String mapKey)
			throws RequestParameterException, SCException
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0021C060への呼び出しパラメータ設定
		template = new CAANMsg(EKK0021C060CBSMsg.class.getName());
		mappingEKK0021C060InMsg(template, inHash, resultHash, mapKey);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{

			resultHash.put(
					TEMPLATE_ID_EKK0021C060, 
					mappingEKK0021C060SCOutMsg(resultMsgs));

		}

		return status;
		
	}
	

	/**
	 * EKK0021C060の結果をHashとして抽出する
	 * @param resultMsgs EKK0021C060のテンプレートリスト
	 * @return EKK0021C060の結果部分
	 */
	private HashMap<String, Object> mappingEKK0021C060SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		retHash = msg.getMsgData();
		
		return retHash;
		
	}
	
	/**
	 * templateに対してEKK0021C060の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param requestParam アプリ固有のパラメータ
	 * @param resultHash 結果ハッシュ
	 * @param mapKey 
	 */
	private void mappingEKK0021C060InMsg(CAANMsg template, HashMap<String, Object> inHash, HashMap<String, Object> resultHash, String mapKey)
	{

		HashMap<String, Object> parentMap = null;
		
		String mskm_dtl_no = null;
		String upd_dtm_bf = null;

		
		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0021C060CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0021C060CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021C060);

		//機能コード
		template.set(EKK0021C060CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));
		
		//パラメータ設定
//↓↓↓2012-04-17変更　ST2-2012-0000482対応↓↓↓
		parentMap = (HashMap<String, Object>)resultHash.get(mapKey);	//TEMPLATE_ID_EKK0011D020);
		if (TEMPLATE_ID_EKK0011D020.equals(mapKey))
		{
//			ArrayList<HashMap<String, Object>> childList = (ArrayList<HashMap<String, Object>>)parentMap.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
//			HashMap<String, Object> childMap = childList.get(0);
//			
//			//申込承認登録S-IFの出力マップから引継データを取得
//			mskm_dtl_no = (String) childMap.get(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
			upd_dtm_bf = (String) parentMap.get(EKK0011D020CBSMsg.UPD_DTM);
		}
//		else
//		{
//			//申込明細登録S-IFの出力マップから引継データを取得
//			mskm_dtl_no = (String) parentMap.get(EKK0021D010CBSMsg.MSKM_DTL_NO);
//			upd_dtm_bf = (String) parentMap.get(EKK0021D010CBSMsg.UPD_DTM);
//		}
		mskm_dtl_no = (String) inHash.get(EX_MSKM_DTL_NO);
		template.set(EKK1091D010CBSMsg.MSKM_DTL_NO, mskm_dtl_no);
//↑↑↑2012-04-17変更　ST2-2012-0000482対応↑↑↑

		//申込明細番号
		template.set(EKK0021C060CBSMsg.MSKM_DTL_NO, mskm_dtl_no);
		
		//運用年月日
		template.set(EKK0021C060CBSMsg.KZKWRK_REQYMD, inHash.get(UNYO_YMD));

		//更新年月日時分秒（更新前）
		template.set(EKK0021C060CBSMsg.UPD_DTM_BF, upd_dtm_bf);
	}


	/**
	 * 申込内容承認登録SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0011D020SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash)
			throws RequestParameterException, SCException
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0011D020への呼び出しパラメータ設定
		template = new CAANMsg(EKK0011D020CBSMsg.class.getName());
		mappingEKK0011D020InMsg(template, inHash, resultHash);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			HashMap<String, Object> resultMap = mappingEKK0011D020SCOutMsg(resultMsgs);
			resultHash.put(TEMPLATE_ID_EKK0011D020, resultMap);

			//申込明細番号は特別に抜き出して保管
			ArrayList<?> ekk0011d020MsgList = (ArrayList<?>)resultMap.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
			HashMap<?, ?> kk0021Map = (HashMap<?, ?>) ekk0011d020MsgList.get(0);
			Object mskm_dtl_no = kk0021Map.get(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
			inHash.put(EX_MSKM_DTL_NO, mskm_dtl_no);
		}

		return status;
		
	}
	
	/**
	 * EKK0011D020の結果をHashとして抽出する
	 * @param resultMsgs EKK0011D020のテンプレートリスト
	 * @return EKK0011D020の結果部分
	 */
	private HashMap<String, Object> mappingEKK0011D020SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> ekk0011D020Msg = null;
		ArrayList<HashMap> ekk0011D020MsgList = null;
		HashMap ekk0011D020MsgListElement = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		ekk0011D020Msg = msg.getMsgData();

		msgList = (CAANMsg[])ekk0011D020Msg.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
		ekk0011D020MsgList = new ArrayList<HashMap>();
		for(int i = 0 ; i < msgList.length ; i++)
		{
			CAANMsg element = null;
			element = msgList[i];
			ekk0011D020MsgListElement = element.getMsgData();
			ekk0011D020MsgList.add(ekk0011D020MsgListElement);
		}
		ekk0011D020Msg.remove(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
		ekk0011D020Msg.put(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST, ekk0011D020MsgList);
		
		return ekk0011D020Msg;
		
	}
	
	/**
	 * templateに対してEKK0011D020の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param resultHash 結果のハッシュ
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0011D020InMsg(CAANMsg template, HashMap<String, Object> inHash, HashMap<String, Object> resultHash)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0011D020CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0011D020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011D020);

		//機能コード--チェック＆登録
		template.set(EKK0011D020CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));
		
		//パラメータ設定
		//SYSID
		template.set(
				EKK0011D020CBSMsg.SYSID,
				inHash.get(SYSID));
		
		//申し込み種別コード
		template.set(
				EKK0011D020CBSMsg.MSKM_SBT_CD,
				inHash.get(MSKM_SBT_CD));
		
		//申込受付年月日時分秒
		template.set(
				EKK0011D020CBSMsg.MSKM_UK_DTM,
				inHash.get(UNYO_DTM));
		
		//申込年月日
		template.set(
				EKK0011D020CBSMsg.MSKM_YMD,
				inHash.get(UNYO_YMD));

		//コンシューマ営業用申込状態識別コード			//2011-11-16
		template.set(
				EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD,
				"04");
		
		//申込内容承認登録明細の枠を作成
		CAANMsg[] eKK0011D020CBSMSG1LIST = null;
		CAANMsg eKK0011D020CBSMSG1 = null;
		eKK0011D020CBSMSG1 = new CAANMsg(EKK0011D020CBSMsg1List.class.getName());
		fillCAANMSGNullMapping(eKK0011D020CBSMSG1, new EKK0011D020CBSMsg1List().getContents());
		eKK0011D020CBSMSG1LIST = new CAANMsg[]{eKK0011D020CBSMSG1};

		template.set(
				EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST,
				eKK0011D020CBSMSG1LIST);
		

	}
	
	/**
	 * サービス契約内訳一意照会SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0161A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash)
			throws RequestParameterException, SCException
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0161A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0161A010CBSMsg.class.getName());
		mappingEKK0161A010InMsg(template, inHash);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{

			resultHash.put(
					TEMPLATE_ID_EKK0161A010, 
					mappingEKK0161A010SCOutMsg(resultMsgs));
			
		}

		return status;
		
	}
	
	/**
	 * templateに対してEKK0161A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0161A010InMsg(CAANMsg template, HashMap<String, Object> inHash)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0161A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0161A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0161A010);

		//機能コード--サービス契約内訳一意照会(カレント)
		template.set(EKK0161A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, inHash.get(SVC_KEI_UCWK_NO));
		
		//ＫＥＹ＿予約適用年月日
		template.set(EKK0161A010CBSMsg.KEY_RSV_APLY_YMD, oPE_DATE);

	}
	
	/**
	 * EKK0161A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0161A010のテンプレートリスト
	 * @return EKK0161A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0161A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
		
	}
	
	/**
	 * 機器提供サービス契約一覧照会（サービス契約番号）SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0341B002SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash)
			throws RequestParameterException, SCException
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0341B002への呼び出しパラメータ設定
		template = new CAANMsg(EKK0341B002CBSMsg.class.getName());
		mappingEKK0341B002InMsg(template, inHash);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{

			resultHash.put(
					TEMPLATE_ID_EKK0341B002, 
					mappingEKK0341B002SCOutMsg(resultMsgs));
// ▽▽▽ ANK-3754-00-00 ADD START
			// マップに全レコードを登録する
			resultHash.put(
					ALLDATA_EKK0341B002, 
					resultMsgs[0].getMsgData().get(EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST));
			
// △△△ ANK-3754-00-00 ADD END
			
		}

		return status;
		
	}
	
	/**
	 * templateに対してEKK0341B002の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0341B002InMsg(CAANMsg template, HashMap<String, Object> inHash)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0341B002CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0341B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341B002);

		//機能コード--機器提供サービス契約一覧照会（サービス契約番号）
// IT1-2014-0000028 2014-01-22 MOD_START
//		template.set(EKK0341B002CBSMsg.FUNC_CODE, "1");
		template.set(EKK0341B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_6);
// IT1-2014-0000028 2014-01-22 MOD_END

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0341B002CBSMsg.KEY_SVC_KEI_NO, inHash.get(SVC_KEI_NO));

		//ＫＥＹ＿機器提供サービスコード
// IT1-2014-0000028 2014-01-22 MOD_START
//		template.set(EKK0341B002CBSMsg.KEY_KKTK_SVC_CD, KKTK_SVC_CD_EOH_TEL_VA);
		template.setNull(EKK0341B002CBSMsg.KEY_KKTK_SVC_CD);
// IT1-2014-0000028 2014-01-22 MOD_END

		//ＫＥＹ＿機器提供サービス契約番号			//2011-11-16
		template.setNull(EKK0341B002CBSMsg.KEY_KKTK_SVC_KEI_NO);

		//ＫＥＹ＿ソート区分						//2011-11-16
		template.setNull(EKK0341B002CBSMsg.KEY_SORT_KBN);

	}
	
	/**
	 * EKK0341B002の結果をHashとして抽出する
	 * @param resultMsgs EKK0341B002のテンプレートリスト
	 * @return EKK0341B002の結果部分
	 */
	private HashMap<String, Object> mappingEKK0341B002SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST);
//↓↓↓2013-12-26追加　2014年２月案件IT2-2013-0000844（照査前登録での電話オプション追加でシステムエラー）↓↓↓
		if (0 < msgList.length)
		{
//↑↑↑2013-12-26追加　2014年２月案件IT2-2013-0000844（照査前登録での電話オプション追加でシステムエラー）↑↑↑
			retHash = msgList[0].getMsgData();
		}

		return retHash;
		
	}
	
	/**
	 * サービス課金開始年月日を計算する<br/>
	 * 指定された利用開始年月日からサービス課金開始年月日を計算<br/>
	 * 2011/9/26現在の暫定仕様として、翌月１日<br/>
	 * 
	 * @return サービス課金開始年月日
	 * @since 2011-09-26
	 */
	private String getChrgStaYmd(String use_sta_ymd)
	{
		String strymd = "";
		int year = Integer.parseInt(use_sta_ymd.substring(0, 4));
		int mon = Integer.parseInt(use_sta_ymd.substring(4, 6));
//		int day = Integer.parseInt(use_sta_ymd.substring(6, 8));
		
		Calendar cal = Calendar.getInstance();
		cal.set(year, (mon-1), 1);			//１日
		cal.add(Calendar.MONTH, 1);			//翌月
		
		strymd = (new SimpleDateFormat("yyyyMMdd")).format(cal.getTime());

		return strymd;
	}

	/**
	 * @param requestParam
	 * @param wkResultHash
	 * @param templateId
	 */
	private void setSvKeiUpdDtm(Map<String, Object> requestParam, Map<String, Object> wkResultHash, String templateId)
	{
		String updDtm = getUpdDtm(wkResultHash, templateId);
		if (updDtm != null && !"".equals(updDtm))
		{
			requestParam.put(EX_UPD_DTM, updDtm);
		}
	}

//	/**
//	 * @param requestParam
//	 * @param wkResultHash
//	 * @param templateId
//	 */
//	private void setOpSvKeiGeneAddDtm(Map<String, Object> requestParam, Map<String, Object> wkResultHash,
//			String templateId)
//	{
//		Map<String, Object> map = (HashMap<String, Object>)wkResultHash.get(templateId);
//		String geneAddDtm = (String)map.get(EKK0371D010CBSMsg.KK0351_GENE_ADD_DTM);
//		if (geneAddDtm != null && !"".equals(geneAddDtm))
//		{
//			requestParam.put(KK0351_OP_GENE_ADD_DTM, geneAddDtm);
//		}
//	}
//
//	/**
//	 * @param requestParam
//	 * @param wkResultHash
//	 * @param templateId
//	 */
//	private void setSbOpSvKeiGeneAddDtm(Map<String, Object> requestParam, Map<String, Object> wkResultHash,
//			String templateId)
//	{
//		Map<String, Object> map = (HashMap<String, Object>)wkResultHash.get(templateId);
//		requestParam.put(KK0351_SBOP_GENE_ADD_DTM, (String)map.get(EKK0431D010CBSMsg.KK0401_GENE_ADD_DTM));
//	}

	/**
	 * @param obj
	 * @param key
	 * @return
	 */
	private String getUpdDtm(Map<String, Object> obj, String key)
	{
		Map<String, Object> map = (HashMap<String, Object>)obj.get(key);
		return (String)map.get("upd_dtm");
	}

	/**
	 * @param obj
	 * @param key
	 * @return
	 */
	private String getLastUpdDtm(Map<String, Object> obj, String key)
	{
		Map<String, Object> map = (HashMap<String, Object>)obj.get(key);
		return (String)map.get("last_upd_dtm");
	}

	/**
	 * サービス契約ステータスがサービス提供中以降の場合は<code>true</code>を返却します。
	 * 
	 * @param svcKeiStat
	 *            サービス契約ステータス
	 * @return 照査締結の是非
	 */
	private boolean isTeikyo(String svcKeiStat)
	{
		return "100".compareTo(svcKeiStat) <= 0;
	}

	/**
	 * サービス契約ステータスが締結済以降の場合は<code>true</code>を返却します。
	 * 
	 * @param svcKeiStat
	 *            サービス契約ステータス
	 * @return 照査締結の是非
	 */
	private boolean isTeiketsuzumi(String svcKeiStat)
	{
		return "030".compareTo(svcKeiStat) <= 0;
	}

	/**
	 * サービス契約ステータスが照査済以降の場合は<code>true</code>を返却します。
	 * 
	 * @param svcKeiStat
	 *            サービス契約ステータス
	 * @return 照査の是非
	 */
	private boolean isShosazumi(String svcKeiStat)
	{
		return "020".compareTo(svcKeiStat) <= 0;
	}

	/**
	 * オプションサービス契約＜電話＞照査SIFを呼び出し
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param handle
	 *            セッションハンドル
	 * @param inHash
	 *            条件用Hash
	 * @param jkkOpsvkeiTelIktAddCC
	 *            処理対象Hash
	 * @param resultHash
	 *            結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws Throwable 
	 */
	private int callEKK0371C010SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> inHash, HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// 呼び出しパラメータ設定
		template = new CAANMsg(EKK0371C010CBSMsg.class.getName());
		mappingEKK0371C010InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param, KKSV005001CC);
		
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if (status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0371C010, mappingEKK0371C010SCOutMsg(resultMsgs));
		}

		return status;

	}

	/**
	 * EKK0371C010の結果をHashとして抽出する
	 * 
	 * @param resultMsgs
	 *            EKK0371C010のテンプレートリスト
	 * @return EKK0371C010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0371C010SCOutMsg(CAANMsg[] resultMsgs)
	{
		return resultMsgs[0].getMsgData();
	}

	/**
	 * templateに対してEKK0371C010の条件に関する部分を設定する
	 * 
	 * @param template
	 *            条件の設定先
	 * @param inHash
	 *            設定条件
	 * @param jkkOpsvkeiTelIktAddCC
	 *            処理対象ハッシュ
	 * @param resultHash
	 *            結果のハッシュ
	 * @param requestParam
	 *            アプリ固有のパラメータ
	 */
	private void mappingEKK0371C010InMsg(CAANMsg template, HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC, HashMap<String, Object> resultHash)
	{
		HashMap<String, Object> eKK0371D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0371D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371C010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0371C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371C010);

		// 機能コード
		template.set(EKK0371C010CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));

		// オプションサービス契約番号
		template.set(EKK0371C010CBSMsg.OP_SVC_KEI_NO, eKK0371D010Hash.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO));

		// 異動区分
		template.set(EKK0371C010CBSMsg.IDO_DIV, inHash.get(IDO_DIV));

		// 更新年月日時分秒（更新前）
		template.set(EKK0371C010CBSMsg.UPD_DTM_BF, inHash.get(EX_UPD_DTM));
	}

	/**
	 * eo光電話通話合計超過通知コード変更SIFを呼び出し
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param handle
	 *            セッションハンドル
	 * @param inHash
	 *            条件用Hash
	 * @param resultHash
	 *            結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException
	 *             , SCException 例外時にスローされます
	 */
	private int callEAC0401C020SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> inHash, HashMap<String, Object> resultHash) throws RequestParameterException, SCException
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// 呼び出しパラメータ設定
		template = new CAANMsg(EAC0401C020CBSMsg.class.getName());
		mappingEAC0401C020InMsg(template, inHash);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if (status == 0)
		{
			resultHash.put(TEMPLATE_ID_EAC0401C020, mappingEAC0401C020SCOutMsg(resultMsgs));
		}

		return status;

	}

	/**
	 * EAC0401C020の結果をHashとして抽出する
	 * @param resultMsgs EKK0371C050のテンプレートリスト
	 * @return EAC0401C020の結果部分
	 */
	private HashMap<String, Object> mappingEAC0401C020SCOutMsg(CAANMsg[] resultMsgs)
	{
		return resultMsgs[0].getMsgData();
	}

	/**
	 * templateに対してEAC0401C020の条件に関する部分を設定する
	 * 
	 * @param template
	 *            条件の設定先
	 * @param inHash
	 *            設定条件
	 */
	private void mappingEAC0401C020InMsg(CAANMsg template, HashMap<String, Object> inHash)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EAC0401C020CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EAC0401C020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371C050);

		// 機能コード
		template.set(EAC0401C020CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));

		// サービス契約番号
		template.set(EAC0401C020CBSMsg.SVC_KEI_NO, inHash.get(SVC_KEI_NO));

		// サービス契約内訳番号
		template.set(EAC0401C020CBSMsg.SVC_KEI_UCWK_NO, inHash.get(SVC_KEI_UCWK_NO));

		// 請求年月
		template.set(EAC0401C020CBSMsg.SEIKY_YM,((String)inHash.get(UNYO_YMD)).substring(0, 6));
	}

	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * </pre>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editResultRP(
			Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			String fixedText) 
			throws Throwable 
	{

		// 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、ステータス取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		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);
		}

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ユーザデータ情報にエラー情報をマッピング
		// 項目の配列を取得
		Object[][] contents = getContents(templateId);
		// エラーIDをマッピング
		mappingErrId(inMap, template, contents);
		
		// 明細に対するマッピング処理
		// ※明細1のみ対応
		String msg1ListId = templateId + "CBSMsg1List";
		CAANMsg[] templateArray = template.getCAANMsgList(msg1ListId);
		if (templateArray != null)
		{
			ArrayList inList = (ArrayList)inMap.get(msg1ListId);
			if (inList == null)
			{
				inList = new ArrayList();
				inMap.put(msg1ListId, inList);
			}
			
			for (int i = 0; i < templateArray.length; i++)
			{
				if (i >= inList.size())
				{
					inList.add(new HashMap());
				}
			
				HashMap childMap = (HashMap)inList.get(i);
				CAANMsg childTemplate = templateArray[i];
				
				Object[][] msg1ListContents = getContents(msg1ListId);
				
				mappingErrId(childMap, childTemplate, msg1ListContents);
			}
		}
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * 各S/IFのエラーIDをマッピングする
	 * 
	 * @param inMap 入力マップ
	 * @param template サービスIFマップ
	 * @param contents サービスIFの項目配列
	 */
	private void mappingErrId(
			HashMap inMap,
			CAANMsg template,
			Object[][] contents)
	{
		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));
					}
				}
			}
		}
	}
	
	// 20120423 ST2-2012-0000737 END

	/**
	 * ＳＯＤ発行CC部品引渡し用データマップを編集
	 * 
	 * @param param
	 * @return
	 * @throws RequestParameterException 
	 */
	private void editHakkoSODccMap(
			IRequestParameterReadWrite param,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash
	) throws RequestParameterException
	{
		HashMap<String, Object> kksv005003ccMap = new HashMap<String, Object>();
		param.setData(KKSV0050_KKSV0050OP.KKSV005003CC, kksv005003ccMap);

		//機能コード‘１’を指定
		kksv005003ccMap.put(JCMConstants.FUNC_CODE_KEY, JPCModelConstant.FUNC_CD_1);

		// 対象データリスト
		ArrayList<HashMap<String, Object>> trgt_data_list = new ArrayList<HashMap<String, Object>>();

		// ****************************************************************** //
		// ＳＯＤ基本情報                                                     //
		// ****************************************************************** //
		HashMap<String, Object> sod_kihon_info = new HashMap<String, Object>();
		// ＳＹＳＩＤ
		sod_kihon_info.put(JKKHakkoSODConstCC.INFO_SYSID,   inHash.get(SYSID));
		// 異動区分
		sod_kihon_info.put(JKKHakkoSODConstCC.INFO_IDO_DIV, inHash.get(IDO_DIV));

		// ****************************************************************** //
		// ＳＯＤサービス契約情報                                             //
		// ****************************************************************** //
		HashMap<String, Object> svc_kei_info = new HashMap<String, Object>();
		// サービス契約番号
		svc_kei_info.put(JKKHakkoSODConstCC.INFO_SVC_KEI_NO,      inHash.get(SVC_KEI_NO));
		// 先サービス契約番号
		svc_kei_info.put(JKKHakkoSODConstCC.INFO_SAKI_SVC_KEI_NO, inHash.get(SVC_KEI_NO));

		// 機器提供サービス契約一覧照会（サービス契約番号）の結果より、機器製造番号を取得
		HashMap<String, Object> kk0341Map = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0341B002);

		// 参照情報　−　オプションサービス契約
		int j = 0;
		for (Entry<String, String[]> e : opSvcKeiKeyMap.entrySet())
		{
			String opSvcCd = e.getKey();
			String[] pair = e.getValue();

			HashMap<String, Object> opsvkei_info = new HashMap<String, Object>();

			String chbf_opSvcKeiNo        = null;		// 変更前オプションサービス契約番号
			String chbf_kk0351_geneAddDtm = null;		// 変更前オプションサービス契約世代登録年月日
			if (opSvcCd.matches("B[0-9]+" + CHBF_KEY))
			{
				chbf_opSvcKeiNo        = pair[NO_POS];
				chbf_kk0351_geneAddDtm = pair[GE_POS];
				// ST3-2013-0000603 転送電話選択オプション追加時にSODが発行されない 2013/03/08 START
				// 「_CHBF」を削除
				String wkOpSvcCd = opSvcCd.replace(CHBF_KEY, "");
				opSvcCd = wkOpSvcCd;
				// ST3-2013-0000603 転送電話選択オプション追加時にSODが発行されない 2013/03/08 END
			}

			// SOD発行フラグが立っていない場合は編集対象外
			Boolean canPutSOD = sodTerm.get(opSvcCd);
			if (null == canPutSOD || !canPutSOD)
			{
				continue;
			}

			// 変更前オプションサービス契約番号
			opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_OPSVKEI_NO,           chbf_opSvcKeiNo);
			// 変更前オプションサービス契約世代登録年月日時分秒
			opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_OPSVKEI_GENE_ADD_DTM, chbf_kk0351_geneAddDtm);
			// 変更後オプションサービス契約番号
			opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_NO,           pair[NO_POS]);
			// 変更後オプションサービス契約世代登録年月日時分秒
			opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_GENE_ADD_DTM, pair[GE_POS]);

			// 参照情報　−　サブオプションサービス契約
			Map<String, String[]> kk0401Map = sbopSvcKeiKeyMap.get(pair[NO_POS]);
			if (null != kk0401Map && 0 < kk0401Map.size())
			{
				for (String[] sbPair : kk0401Map.values())
				{
					HashMap<String, Object> opsvkei_info401 = new HashMap<String, Object>();

					// オプションサービス契約の情報を複製
					opsvkei_info401.putAll(opsvkei_info);

					// 変更前サブオプションサービス契約番号
					opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHBF_SBOPSVKEI_NO,           null);
					// 変更前サブオプションサービス契約世代登録年月日時分秒
					opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHBF_SBOPSVKEI_GENE_ADD_DTM, null);
					// 変更後サブオプションサービス契約番号
					opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHAF_SBOPSVKEI_NO,           sbPair[NO_POS]);
					// 変更後サブオプションサービス契約世代登録年月日時分秒
					opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHAF_SBOPSVKEI_GENE_ADD_DTM, sbPair[GE_POS]);

					// オプションサービス契約情報
					HashMap<String, Object> sod_map = getSODmap(trgt_data_list, (j ++));
					sod_map.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opsvkei_info401);
				}
			}
			else
			{
				// オプションサービス契約情報
				HashMap<String, Object> sod_map = getSODmap(trgt_data_list, (j ++));
				sod_map.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opsvkei_info);
			}

			// 割込電話オプションの場合は機器提供サービス契約の情報もセット
			if (JKKSvcConst.OP_SVC_CD_WARKMI.equals(opSvcCd) && null != kk0341Map)
			{
				String kktkSvcKeiNo     = (String)kk0341Map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
				String kk0341geneAddDtm = (String)kk0341Map.get(EKK0341B002CBSMsg1List.GENE_ADD_DTM);

				HashMap<String, Object> kktsvkei_info = new HashMap<String, Object>();

				// 変更前機器提供サービス契約番号
				kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_KKTSVKEI_NO,           kktkSvcKeiNo);
				// 変更前機器提供サービス契約世代登録年月日時分秒
				kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_KKTSVKEI_GENE_ADD_DTM, kk0341geneAddDtm);
				// 変更後機器提供サービス契約番号
				kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_KKTSVKEI_NO,           kktkSvcKeiNo);
				// 変更後機器提供サービス契約世代登録年月日時分秒
				kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_KKTSVKEI_GENE_ADD_DTM, kk0341geneAddDtm);

				// 機器提供サービス契約情報
				HashMap<String, Object> sod_map = getSODmap(trgt_data_list, (j-1));
				sod_map.put(JKKHakkoSODConstCC.KKTSVKEI_INFO, kktsvkei_info);
			}
		}

		// サービス契約内訳情報補完バッファ
		HashMap<String, Object> compkk0161Map = null;

		// 参照情報　−　サービス契約内訳
		int i = 0;
		Map<String, Object> kk0161Map = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0161A010);

		// オプションサービス契約の情報が在れば
		if (0 < j)
		{
			HashMap<String, Object> svc_kei_ucwk_info = new HashMap<String, Object>();
			// サービス契約内訳番号
			svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_SVC_KEI_UCWK_NO,                kk0161Map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_NO));
			// 変更前サービス契約内訳世代登録年月日時分秒
			svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_CHBF_SVC_KEI_UCWK_GENE_ADD_DTM, kk0161Map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));
			// 変更後サービス契約内訳世代登録年月日時分秒
			svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM, kk0161Map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));

			// サービス契約内訳情報
			HashMap<String, Object> sod_map = getSODmap(trgt_data_list, (i ++));
			sod_map.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, svc_kei_ucwk_info);

			compkk0161Map = svc_kei_ucwk_info;
		}

		for (int x = 0; x < trgt_data_list.size(); x ++)
		{
			// ＳＯＤマップ
			HashMap<String, Object> sod_map = trgt_data_list.get(x);

			// ＳＯＤ基本情報
			sod_map.put(JKKHakkoSODConstCC.SOD_KIHON_INFO, sod_kihon_info);

			// サービス契約情報
			sod_map.put(JKKHakkoSODConstCC.SVC_KEI_INFO, svc_kei_info);

			// サービス契約内訳情報
			Map<?, ?> svc_kei_ucwk_info = (Map<?, ?>) sod_map.get(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO);
			if (null == svc_kei_ucwk_info && null != compkk0161Map)
			{
				sod_map.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, compkk0161Map);					// 補完する
			}

			// 機器提供サービス契約情報
			Map<?, ?> kktk_svc_kei_info = (Map<?, ?>) sod_map.get(JKKHakkoSODConstCC.KKTSVKEI_INFO);
			if (null == kktk_svc_kei_info)
			{
				sod_map.put(JKKHakkoSODConstCC.KKTSVKEI_INFO, (new HashMap<String, Object>()));		// 補完する
			}
		}

		kksv005003ccMap.put(JKKHakkoSODConstCC.TRGT_DATA_LIST, trgt_data_list);
	}


	/**
	 * ArrayList内の指定位置のHashMapを取得<br/>
	 * 取得できない場合、新規作成<br/>
	 * <br/>
	 * 
	 * @param trgt_data_list
	 * @param pos
	 * @return SOD情報格納用HashMap
	 */
	private HashMap<String, Object> getSODmap(ArrayList<HashMap<String, Object>> trgt_data_list, int pos)
	{
		HashMap<String, Object> ret = null;
		int i = trgt_data_list.size();
		
		if (pos < i)
		{
			ret = trgt_data_list.get(pos);
		}
		
		if (null == ret)
		{
			if (pos < i)
			{
				trgt_data_list.set(pos, new HashMap<String, Object>());
			}
			else
			{
				while (pos >= i)
				{
					trgt_data_list.add(new HashMap<String, Object>());
					i ++;
				}
			}

			ret = trgt_data_list.get(pos);
		}
		
		assert (null != ret);

		return ret;
	}


	/** 親おや */
	private static final String CHBF_KEY = "_CHBF";

	/** オプションサービス契約番号の配列位置 */
	private static final int NO_POS = 0;

	/** 世代登録年月日時分秒の配列位置 */
	private static final int GE_POS = 1;

	/**
	 * オプションサービス契約キー情報マップ
	 */
	private Map<String, String[]> opSvcKeiKeyMap = null;

	/**
	 * サブオプションサービス契約キー情報マップ
	 */
	private Map<String, Map<String, String[]>> sbopSvcKeiKeyMap = null;

	private Map<String, Boolean> sodTerm = null;


	private void initOpSvcKeiKeyMap()
	{
		opSvcKeiKeyMap = new HashMap<String, String[]>();
		sbopSvcKeiKeyMap = new HashMap<String, Map<String,String[]>>();
		sodTerm = new HashMap<String, Boolean>();
	}


	private void setOpSvcKeiKeyMapFromUpd(String opSvcCd, HashMap<String, Object> dataMap, String mapKey)
	{
		Map<String, Object> map = (HashMap<String, Object>)dataMap.get(mapKey);

		if (null != map && 0 < map.size())
		{
//↓↓↓2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↓↓↓
			//指定オプションサービスコードをキーとしたデータがあると上書きされないようなので、一旦除く
			if (opSvcKeiKeyMap.containsKey(opSvcCd))
			{
				opSvcKeiKeyMap.remove(opSvcCd);
			}
//↑↑↑2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↑↑↑
			String opSvcKeiNo = (String)map.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO);
			String geneAddDtm = (String)map.get(EKK0371D010CBSMsg.KK0351_GENE_ADD_DTM);
			opSvcKeiKeyMap.put(opSvcCd, new String[]{opSvcKeiNo, geneAddDtm});
		}
	}


	private void setOpSvcKeiKeyMap(String opSvcCdKey, String op_svc_kei_no, String kk0351_gene_add_dtm)
	{
//↓↓↓2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↓↓↓
		//指定オプションサービスコードをキーとしたデータがあると上書きされないようなので、一旦除く
		if (opSvcKeiKeyMap.containsKey(opSvcCdKey))
		{
			opSvcKeiKeyMap.remove(opSvcCdKey);
		}
//↑↑↑2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↑↑↑
		opSvcKeiKeyMap.put(opSvcCdKey, new String[]{op_svc_kei_no, kk0351_gene_add_dtm});
	}


	private void setSbopSvcKeiKeyMap(String sbOpSvcCd, HashMap<String, Object> dataMap, String mapKey)
	{
		Map<String, Object> map = (HashMap<String, Object>)dataMap.get(mapKey);

		if (null != map && 0 < map.size())
		{
			String opSvcKeiNo = (String)map.get(EKK0431D010CBSMsg.OP_SVC_KEI_NO);
			String sbopSvcKeiNo = (String)map.get(EKK0431D010CBSMsg.SBOP_SVC_KEI_NO);
			String geneAddDtm = (String)map.get(EKK0431D010CBSMsg.KK0401_GENE_ADD_DTM);
			
			Map<String, String[]> sbopMap = sbopSvcKeiKeyMap.get(opSvcKeiNo);
			if (null == sbopMap)
			{
				sbopMap = new HashMap<String, String[]>();
				sbopSvcKeiKeyMap.put(opSvcKeiNo, sbopMap);
			}
//↓↓↓2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↓↓↓
			//指定オプションサービスコードをキーとしたデータがあると上書きされないようなので、一旦除く
			if (sbopMap.containsKey(sbOpSvcCd))
			{
				sbopMap.remove(sbOpSvcCd);
			}
//↑↑↑2013-04-05追加　IT1-2013-0000717（ＰＴ不具合のため対応）↑↑↑
			sbopMap.put(sbOpSvcCd, new String[]{sbopSvcKeiNo, geneAddDtm});
		}
	}


// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD START
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							CAANMsg inCAANMsg) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, inCAANMsg);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = templates[0].getInt("status");

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);
		
		//エラー情報のマップを取得
		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));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		
		return msg;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(ECK0011B002CBSMsg.STATUS);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		Iterator<String> it = template.getHashMap().keySet().iterator();
		while (it.hasNext())
		{
			String key = it.next();
			if (key.endsWith("_err"))
			{
				if (!template.isNull(key))
				{
					inMap.put(key, template.getString(key));
				}
			}
		}
		
		return param;
	}
	
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (key.endsWith("_err"))
			{
				String tmpKey = key.substring(0, key.length() - 4);
				
				if (!msg.containsKeyOfMsgData(tmpKey) || "".equals(msg.getObject(tmpKey)))
				{
					msg.setNull(tmpKey);
					continue;
				}
				Object obj = msg.getObject(tmpKey);
				if (obj instanceof CAANMsg[])
				{
					for (CAANMsg submsg : (CAANMsg[]) obj)
					{
						setNullToMsg(submsg);
					}
				}
			}
		}
	}
// 2012/10/30 【ANK-1223-00-00】進捗補足事項編集対応 ADD END

	/**************************************************************************/
	/** サービス-I/F実行共通処理領域                                         **/
	/**************************************************************************/
	private int callSCCmn(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> resultHash,
			CAANMsg template,
			HashMap<String, Object> sIFRequest,
			String templateId,
			String msg1ListKey,
			boolean listFlg
	) throws Throwable
	{
		ServiceComponentRequestInvoker scCall     = null;
		CAANMsg[]                      resultMsgs = null;
		Map<?, ?>                      sIFResult  = null;

		int status = 0;

		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param, KKSV005001CC);
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			if (listFlg)
			{
				resultHash.put(templateId, mappingOutMsgList(resultMsgs, msg1ListKey));
			}
			else
			{
				resultHash.put(templateId, mappingOutMsg(resultMsgs));
			}
		}

		return status;
	}

	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * @param	param	(I) 業務データ取得用I/F
	 * @return			オプションサービス契約作成数
	 * @throws	RequestParameterException
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly 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;
	}

	/**
	 * 条件部の共通する項目の設定<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	template	条件の設定先
	 * @throws	RequestParameterException
	 */
	public void editBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		// オペレータ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);
	}

	/**
	 * @param	param
	 * @param	msg
	 * @return	HashMap<String, Object>
	 * @throws	RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(
			IRequestParameterReadWrite param,
			CAANMsg msg
	) 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));

		// オペレータID
		msg.set(JCMConstants.OPERATOR_ID_KEY,      param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		msg.set(JCMConstants.OPERATE_DATE_KEY,     param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		msg.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		setNullToMsg(msg);

		CAANMsg[] templates = new CAANMsg[]{msg};
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * 持ちうるフィールドにNullマッピングで埋める<br>
	 * <br>
	 * @param	msg			対象クラス
	 * @param	contents	対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		// 要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			Object element = null;

			// キーに該当する箇所の取得
			element = contents[i][0];

			// Nullでマッピング
			msg.setNull((String)element);
		}
	}

	/**
	 * 結果をHashとして抽出する<br>
	 * <br>
	 * @param	resultMsgs	テンプレートリスト
	 * @param	msg1ListKey	
	 * @return				結果部分
	 */
	private HashMap<String, Object> mappingOutMsgList(CAANMsg[] resultMsgs, String msg1ListKey)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg                 msg     = null;
		CAANMsg[]               msgList = null;

		// 結果の抽出
		msg = resultMsgs[0];

		// 結果の取得
		msgList = (CAANMsg[])msg.getMsgData().get(msg1ListKey);
		retHash = msgList[0].getMsgData();

		return retHash;
	}

	/**
	 * 結果をHashとして抽出する<br>
	 * <br>
	 * @param	resultMsgs	テンプレートリスト
	 * @param	msg1ListKey	
	 * @return				結果部分
	 */
	private HashMap<String, Object> mappingOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg                 msg     = null;

		// 結果の抽出
		msg = resultMsgs[0];

		// 結果の取得
		retHash = msg.getMsgData();

		return retHash;
	}

	/**
	 * 各S/IFが保持する項目の配列を取得する<br>
	 * <br>
	 * @param	templateId	サービスIF_ID
	 * @return				項目の配列
	 */
	private Object[][] getContents(String templateId)
	{
		Object[][] contents = null;

		for (int i = 0; i < CONTENTS_LIST.length; i++)
		{
			if (((String)CONTENTS_LIST[i][0]).equals(templateId))
			{
				contents = (Object[][])CONTENTS_LIST[i][1];
				break;
			}
		}

		return contents;
	}

	/**
	 * エラーチェック処理
	 * 
	 * @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];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if ((0 != returnCode) || (0 != templateStatus))
		{
			throw new SCCallException(ERR_MSG, String.valueOf(returnCode), templateStatus);
		}
	}

	/**************************************************************************/
	/** サービス-I/F実行領域                                                 **/
	/**************************************************************************/
	/**
	 * EKK1091D010_進捗登録<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	prgStat		
	 * @param	prgTkjk1	
	 * @return				サービスインターフェースのリターンコード
	 * @throws	Throwable	
	 */
	private int callEKK1091D010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String prgStat,
			String prgTkjk1
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK1091D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK1091D010CBSMsg.class.getName());
		mappingEKK1091D010InMsg(template, inHash, resultHash, prgStat, prgTkjk1);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK1091D010,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK1091D010の条件に関する部分を設定する<br>
	 * <br>
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param resultHash 
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK1091D010InMsg(
			CAANMsg template,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String prgStat,
			String prgTkjk1
	)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK1091D010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010);

		// 機能コード
		template.set(EKK1091D010CBSMsg.FUNC_CODE,    inHash.get(FUNC_CODE));
		// サービス契約番号
		template.set(EKK1091D010CBSMsg.SVC_KEI_NO,   inHash.get(SVC_KEI_NO));
		// 異動区分
		template.set(EKK1091D010CBSMsg.IDO_DIV,      inHash.get(IDO_DIV));
		// 進捗ステータス
		template.set(EKK1091D010CBSMsg.PRG_STAT,     prgStat);
		// 進捗特記事項１
		template.set(EKK1091D010CBSMsg.PRG_TKJK_1,   prgTkjk1);
		// 請求契約番号
		template.set(EKK1091D010CBSMsg.SEIKY_KEI_NO, inHash.get(SEIKY_KEI_NO));
		// 申込明細番号
		template.set(EKK1091D010CBSMsg.MSKM_DTL_NO,  inHash.get(EX_MSKM_DTL_NO));

		// 異動理由明細
		CAANMsg[] ekk1091D010CBSMsg1List = null;
		CAANMsg ekk1091D010CBSMsg1 = null;
		ArrayList<HashMap<String, Object>> ido_rsn_cd_list = null;
		HashMap<String, Object> ido_rsn_cd_element = null;

		ido_rsn_cd_list = (ArrayList<HashMap<String, Object>>)inHash.get(IDO_RSN_CD_LIST);
		ekk1091D010CBSMsg1List = new CAANMsg[ido_rsn_cd_list.size()];

		for(int i = 0 ; i < ido_rsn_cd_list.size() ; i++)
		{
			// １要素取得
			ido_rsn_cd_element = ido_rsn_cd_list.get(i);

			ekk1091D010CBSMsg1 = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
			fillCAANMSGNullMapping(ekk1091D010CBSMsg1, new EKK1091D010CBSMsg1List().getContents());
			// 異動理由コード
			ekk1091D010CBSMsg1.set(EKK1091D010CBSMsg1List.IDO_RSN_CD,   ido_rsn_cd_element.get(IDO_RSN_CD));
			// 異動理由メモ
			ekk1091D010CBSMsg1.set(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, ido_rsn_cd_element.get(IDO_RSN_MEMO));

			ekk1091D010CBSMsg1List[i] = ekk1091D010CBSMsg1;
		}

		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, ekk1091D010CBSMsg1List);

		String ido_dtm = (String) inHash.get(IDO_DTM);
		if (null != ido_dtm && 0 < ido_dtm.length())
		{
			// 異動年月日時分秒 ← 指定異動の異動日時
			template.set(EKK1091D010CBSMsg.IDO_DTM, ido_dtm);
		}
		else
		{
			// 異動年月日時分秒 ← システム日時
			template.set(EKK1091D010CBSMsg.IDO_DTM, JCCModelCommon.getSysDateTimeStamp());
		}

		// オプションサービス契約番号
		HashMap<?, ?> ekk0371d010Msg = (HashMap<?, ?>)resultHash.get(TEMPLATE_ID_EKK0371D010);
		HashMap<?, ?> ekk0371c050Msg = (HashMap<?, ?>)resultHash.get(TEMPLATE_ID_EKK0371C050);
		if (ekk0371d010Msg != null)
		{
			Object op_svc_kei_no = ekk0371d010Msg.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO);
			template.set(EKK1091D010CBSMsg.OP_SVC_KEI_NO, op_svc_kei_no);
		}
		else if(ekk0371c050Msg != null)
		{
			// オプションサービス契約登録の場合
			Object op_svc_kei_no = ekk0371c050Msg.get(EKK0371C050CBSMsg.OP_SVC_KEI_NO);
			template.set(EKK1091D010CBSMsg.OP_SVC_KEI_NO, op_svc_kei_no);
		}
		else
		{
			// サブオプションの場合ここ
			HashMap<?, ?> ekk0431d010Msg = (HashMap<?, ?>)resultHash.get(TEMPLATE_ID_EKK0431D010);
			if (ekk0431d010Msg != null)
			{
				Object op_svc_kei_no = ekk0431d010Msg.get(EKK0431D010CBSMsg.OP_SVC_KEI_NO);
				template.set(EKK1091D010CBSMsg.OP_SVC_KEI_NO, op_svc_kei_no);
				Object sbop_svc_kei_no = ekk0431d010Msg.get(EKK0431D010CBSMsg.SBOP_SVC_KEI_NO);
				template.set(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, sbop_svc_kei_no);
			}
		}
	}

	/**
	 * EKK0371C030_オプションサービス契約＜電話＞照査締結<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 * @throws	Throwable 
	 */
	private int callEKK0371C030SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0371C030CBSMsg.class.getName());
		mappingEKK0371C030InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0371C030,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0371C030の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象ハッシュ
	 * @param	resultHash				結果のハッシュ
	 */
	private void mappingEKK0371C030InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash, 
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		HashMap<String, Object> eKK0371D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0371D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371C030CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0371C030CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371C030);

		// 機能コード
		template.set(EKK0371C030CBSMsg.FUNC_CODE,     inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0371C030CBSMsg.OP_SVC_KEI_NO, eKK0371D010Hash.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO));
		// 異動区分
		template.set(EKK0371C030CBSMsg.IDO_DIV,       inHash.get(IDO_DIV));
		// 更新年月日時分秒（更新前）
		template.set(EKK0371C030CBSMsg.UPD_DTM_BF,    inHash.get(EX_UPD_DTM));
	}

	/**
	 * EKK0371C040_オプションサービス契約＜電話＞開始<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 * @throws Throwable 
	 */
	private int callEKK0371C040SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0371C040への呼び出しパラメータ設定
		template = new CAANMsg(EKK0371C040CBSMsg.class.getName());
		mappingEKK0371C040InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0371C040,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0371C040の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 */
	private void mappingEKK0371C040InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash ,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		HashMap<String, Object> eKK0371D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0371D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371C040CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0371C040CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371C040);

		// 機能コード
		template.set(EKK0371C040CBSMsg.FUNC_CODE,     inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0371C040CBSMsg.OP_SVC_KEI_NO, eKK0371D010Hash.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO));
		// 異動区分
		template.set(EKK0371C040CBSMsg.IDO_DIV,       inHash.get(IDO_DIV));
		// 更新年月日時分秒（更新前）
		template.set(EKK0371C040CBSMsg.UPD_DTM_BF,    inHash.get(EX_UPD_DTM));
	}

	/**
	 * EKK0371C050_オプションサービス契約＜電話＞情報変更<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 */
	private int callEKK0371C050SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// 呼び出しパラメータ設定
		template = new CAANMsg(EKK0371C050CBSMsg.class.getName());
		mappingEKK0371C050InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0371C050,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0371C050の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 */
	private void mappingEKK0371C050InMsg(
			CAANMsg template,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371C050CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0371C050CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371C050);

		// 機能コード
		template.set(EKK0371C050CBSMsg.FUNC_CODE,                  inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0371C050CBSMsg.OP_SVC_KEI_NO,              jkkOpsvkeiTelIktAddCC.get(OP_SVC_KEI_NO));
		// 異動区分
		template.set(EKK0371C050CBSMsg.IDO_DIV,                    inHash.get(IDO_DIV));
		// 通話料指定額到達通知指定金額
		template.set(EKK0371C050CBSMsg.TWRYO_STIAM_TTU_TCHI_STIAM, jkkOpsvkeiTelIktAddCC.get(TWRYO_STIAM_TTU_TCHI_STIAM));
		// 申込明細番号
		template.set(EKK0371C050CBSMsg.MSKM_DTL_NO,                inHash.get(EX_MSKM_DTL_NO));

		// 更新年月日時分秒(更新前)
		if(null == inHash.get(EX_UPD_DTM) || "".equals(inHash.get(EX_UPD_DTM)))
		{
			template.set(EKK0371C050CBSMsg.UPD_DTM_BF,jkkOpsvkeiTelIktAddCC.get(UPD_DTM));
		}
		else
		{
			template.set(EKK0371C050CBSMsg.UPD_DTM_BF,inHash.get(EX_UPD_DTM));
		}
	}

	/**
	 * EKK0431D010_サブオプションサービス契約＜電話＞登録<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @param	op_svc_kei_no			オプションサービス契約番号
	 * @return							サービスインターフェースのリターンコード
	 * @throws	Throwable 
	 */
	private int callEKK0431D010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash,
			String op_svc_kei_no
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0431D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0431D010CBSMsg.class.getName());
		mappingEKK0431D010InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash, op_svc_kei_no);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0431D010,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0431D010の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				
	 * @param	op_svc_kei_no			
	 */
	private void mappingEKK0431D010InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String,Object> resultHash,
			String op_svc_kei_no
	)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0431D010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0431D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0431D010);

		// 機能コード
		template.set(EKK0431D010CBSMsg.FUNC_CODE,     inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0431D010CBSMsg.OP_SVC_KEI_NO, op_svc_kei_no);
		// サブオプションサービスコード
		template.set(EKK0431D010CBSMsg.SBOP_SVC_CD,   jkkOpsvkeiTelIktAddCC.get(SBOP_SVC_CD));
		// 料金コースコード
		template.set(EKK0431D010CBSMsg.PCRS_CD,       jkkOpsvkeiTelIktAddCC.get(PCRS_CD));
		// 料金プランコード
		template.set(EKK0431D010CBSMsg.PPLAN_CD,      jkkOpsvkeiTelIktAddCC.get(PPLAN_CD));
		// 異動区分
		template.set(EKK0431D010CBSMsg.IDO_DIV,       inHash.get(IDO_DIV));
		// 請求契約番号
		template.set(EKK0431D010CBSMsg.SEIKY_KEI_NO,  inHash.get(SEIKY_KEI_NO));
		// 排他制御用更新年月日
		template.set(EKK0431D010CBSMsg.UPD_DTM_BF,    inHash.get(EX_UPD_DTM));
		// 申込明細番号
		template.set(EKK0431D010CBSMsg.MSKM_DTL_NO,   inHash.get(EX_MSKM_DTL_NO));
		// サービス利用開始希望年月日
		template.set(EKK0431D010CBSMsg.SVC_USE_STA_KIBO_YMD, inHash.get(USE_START_YMD));
	}

	/**
	 * EKK0431C010_サブオプションサービス契約＜電話＞照査<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 * @throws	Throwable 
	 */
	private int callEKK0431C010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// 呼び出しパラメータ設定
		template = new CAANMsg(EKK0431C010CBSMsg.class.getName());
		mappingEKK0431C010InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0431C010,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0431C010の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象
	 * @param	resultHash				結果のハッシュ
	 */
	private void mappingEKK0431C010InMsg(
			CAANMsg template,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		HashMap<String, Object> eKK0431D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0431D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0431C010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0431C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0431C010);

		// 機能コード
		template.set(EKK0431C010CBSMsg.FUNC_CODE,       inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0431C010CBSMsg.OP_SVC_KEI_NO,   eKK0431D010Hash.get(EKK0431D010CBSMsg.OP_SVC_KEI_NO));
		// サブオプションサービス契約番号
		template.set(EKK0431C010CBSMsg.SBOP_SVC_KEI_NO, eKK0431D010Hash.get(EKK0431D010CBSMsg.SBOP_SVC_KEI_NO));
		// 異動区分
		template.set(EKK0431C010CBSMsg.IDO_DIV,         inHash.get(IDO_DIV));
		// 更新年月日時分秒（更新前）
		template.set(EKK0431C010CBSMsg.UPD_DTM_BF,      inHash.get(EX_UPD_DTM));
	}

	/**
	 * EKK0431C030_サブオプションサービス契約＜電話＞照査締結<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 * @throws	Throwable 
	 */
	private int callEKK0431C030SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0431C030への呼び出しパラメータ設定
		template = new CAANMsg(EKK0431C030CBSMsg.class.getName());
		mappingEKK0431C030InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0431C030,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0431C030の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象
	 * @param	resultHash				結果のハッシュ
	 */
	private void mappingEKK0431C030InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		HashMap<String, Object> eKK0431D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0431D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0431C030CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0431C030CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0431C030);

		// 機能コード
		template.set(EKK0431C030CBSMsg.FUNC_CODE,       inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0431C030CBSMsg.OP_SVC_KEI_NO,   eKK0431D010Hash.get(EKK0431D010CBSMsg.OP_SVC_KEI_NO));
		// サブオプションサービス契約番号
		template.set(EKK0431C030CBSMsg.SBOP_SVC_KEI_NO, eKK0431D010Hash.get(EKK0431D010CBSMsg.SBOP_SVC_KEI_NO));
		// 異動区分
		template.set(EKK0431C030CBSMsg.IDO_DIV,         inHash.get(IDO_DIV));
		// 更新年月日時分秒（更新前）
		template.set(EKK0431C030CBSMsg.UPD_DTM_BF,      inHash.get(EX_UPD_DTM));
	}

	/**
	 * EKK0431C040_サブオプションサービス契約＜電話＞使用開始<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				結果のハッシュ
	 * @return							サービスインターフェースのリターンコード
	 * @throws	Throwable 
	 */
	private int callEKK0431C040SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0431C040への呼び出しパラメータ設定
		template = new CAANMsg(EKK0431C040CBSMsg.class.getName());
		mappingEKK0431C040InMsg(template, inHash, jkkOpsvkeiTelIktAddCC, resultHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0431C040,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0431C040の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				アプリ固有のパラメータ
	 */
	private void mappingEKK0431C040InMsg(
			CAANMsg template, 
			HashMap<String, Object> inHash, 
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	)
	{
		HashMap<String, Object> eKK0431D010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0431D010);

		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0431C040CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0431C040CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0431C040);

		// 機能コード
		template.set(EKK0431C040CBSMsg.FUNC_CODE,       inHash.get(FUNC_CODE));
		// オプションサービス契約番号
		template.set(EKK0431C040CBSMsg.OP_SVC_KEI_NO,   eKK0431D010Hash.get(EKK0431D010CBSMsg.OP_SVC_KEI_NO));
		// サブオプションサービス契約番号
		template.set(EKK0431C040CBSMsg.SBOP_SVC_KEI_NO, eKK0431D010Hash.get(EKK0431D010CBSMsg.SBOP_SVC_KEI_NO));
		// サービス開始年月日
		template.set(EKK0431C040CBSMsg.SVC_STAYMD,      inHash.get(USE_START_YMD));
		//サービス課金開始年月日
		template.set(EKK0431C040CBSMsg.SVC_CHRG_STAYMD, getChrgStaYmd((String)jkkOpsvkeiTelIktAddCC.get(USE_START_YMD)));
		// 異動区分
		template.set(EKK0431C040CBSMsg.IDO_DIV,         inHash.get(IDO_DIV));
		// 更新年月日時分秒（更新前）
		template.set(EKK0431C040CBSMsg.UPD_DTM_BF,      inHash.get(EX_UPD_DTM));
	}

	/**
	 * EKK0081A010_サービス契約一意照会<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @return				サービスインターフェースのリターンコード
	 */
	private int callEKK0081A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		mappingEKK0081A010InMsg(template, inHash);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0081A010,
				EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST,
				OUTPUT_LIST
		);

		// ST2-2012-0000482 2012/04/02 ADD START
		// サービス契約の申込明細番号を保持しておく
		Map<String, Object> ekk0081a010 = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0081A010);
		if (ekk0081a010 != null)
		{
			inHash.put(EX_MSKM_DTL_NO, (String)ekk0081a010.get(EKK0081A010CBSMsg1List.MSKM_DTL_NO));
		}
		// ST2-2012-0000482 2012/04/02 ADD END

		return status;
	}

	/**
	 * templateに対してEKK0081A010の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template	条件の設定先
	 * @param	inHash		設定条件
	 */
	private void mappingEKK0081A010InMsg(CAANMsg template, HashMap<String, Object> inHash)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010);

		// 機能コード--サービス契約一意照会(ここだけはカレント)
		template.set(EKK0081A010CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO,   inHash.get(SVC_KEI_NO));
		// ＫＥＹ＿予約適用年月日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, oPE_DATE);
		// ＫＥＹ＿世代登録年月日時分（形だけの設定）
		template.set(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, oPE_DATE + "000000000");
	}

	/**
	 * EKK0371A010_オプションサービス契約＜電話＞一意照会<br>
	 * <br>
	 * @param	param					リクエストパラメータ
	 * @param	handle					セッションハンドル
	 * @param	inHash					条件用Hash
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象Hash
	 * @param	resultHash				アプリ固有のパラメータ
	 * @return							サービスインターフェースのリターンコード
	 */
	private int callEKK0371A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// 呼び出しパラメータ設定
		template = new CAANMsg(EKK0371A010CBSMsg.class.getName());
		mappingEKK0371A010InMsg(template, inHash, jkkOpsvkeiTelIktAddCC);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0371A010,
				null,
				OUTPUT_MSG
		);

		return status;
	}

	/**
	 * templateに対してEKK0371A010の条件に関する部分を設定する<br>
	 * <br>
	 * @param	template				条件の設定先
	 * @param	inHash					設定条件
	 * @param	jkkOpsvkeiTelIktAddCC	処理対象
	 */
	private void mappingEKK0371A010InMsg(
			CAANMsg template,
			HashMap<String, Object> inHash,
			HashMap<String, Object> jkkOpsvkeiTelIktAddCC
	)
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0371A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0371A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0371A010);

		// 機能コード
		template.set(EKK0371A010CBSMsg.FUNC_CODE,         JPCModelConstant.FUNC_CD_2);
		// オプションサービス契約番号
		template.set(EKK0371A010CBSMsg.KEY_OP_SVC_KEI_NO, jkkOpsvkeiTelIktAddCC.get(OP_SVC_KEI_NO));
	}

	// ▼▼▼▼▼ 2013/01/25 ST3-2013-0000202 SOD発行フラグ復活 UPD START ▼▼▼▼▼
	/**
	 * EKK0251B003_サービス契約回線内訳一覧照会（現在利用中）<br>
	 * <br>
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	Throwable	例外時にスローされます。
	 */
	private int callEKK0251B003SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> resultHash,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg                 template   = null;

		int status;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0251B003への呼び出しパラメータ設定
		template = new CAANMsg(EKK0251B003CBSMsg.class.getName());
		mappinEKK0251B003SCInMsg(template, param, svcKeiNo);

		status = callSCCmn(
				param,
				handle,
				resultHash,
				template,
				sIFRequest,
				TEMPLATE_ID_EKK0251B003,
				EKK0251B003CBSMsg.EKK0251B003CBSMSG1LIST,
				OUTPUT_LIST
		);

		return status;
	}

	/**
	 * templateに対してEKK0251B003の入力項目を設定する<br>
	 * <br>
	 * @param	template		条件の設定先
	 * @param	param			リクエストパラメータ
	 * @param	svcKeiNo		サービス契約番号
	 * @throws	RequestParameterException 
	 */
	private void mappinEKK0251B003SCInMsg(
			CAANMsg template,
			IRequestParameterReadWrite param,
			String svcKeiNo
	) throws RequestParameterException
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0251B003CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0251B003CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0251B003);

		// 機能コード--サービス契約一意照会
		template.set(EKK0251B003CBSMsg.FUNC_CODE,      JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿サービス契約番号
		template.set(EKK0251B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}
	// ▲▲▲▲▲ 2013/01/25 ST3-2013-000202 SOD発行フラグ復活 UPD E N D ▲▲▲▲▲

	/**
	 * 
	 */
	private CAANMsg[] callEKK0821A010(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			String dataMapKey,
			String opSvcCd
	) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall   = new ServiceComponentRequestInvoker();
		CAANMsg                        template = null;

		// ***** EKK0821A010（オプションサービス一意照会）*****
		template = new CAANMsg(EKK0821A010CBSMsg.class.getName());
		mappinEKK0821A010SCInMsg(template, param, opSvcCd);

		CAANMsg ekk0821a010CbsMsg = callSC(handle, scCall, param, dataMapKey, template);

		CAANMsg[] ekk0821a010CbsMsg1List = ekk0821a010CbsMsg.getCAANMsgList(EKK0821A010CBSMsg.EKK0821A010CBSMSG1LIST);

		return ekk0821a010CbsMsg1List;
	}

	/**
	 * 
	 * @param	template
	 * @param	param
	 * @param	opSvcCd
	 * @throws	RequestParameterException
	 */
	private void mappinEKK0821A010SCInMsg(
			CAANMsg template,
			IRequestParameterReadWrite param,
			String opSvcCd
	) throws RequestParameterException
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0821A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0821A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0821A010);

		// 機能コード
		template.set(EKK0821A010CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿オプションサービスコード
		template.set(EKK0821A010CBSMsg.KEY_OP_SVC_CD,    opSvcCd);

		// ＫＥＹ＿予約適用年月日
		template.set(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null));
	}

	/**
	 * 
	 */
	private CAANMsg[] callEKK0831A010(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			String dataMapKey,
			String opSvcCd
	) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall   = new ServiceComponentRequestInvoker();
		CAANMsg                        template = null;

		// ***** EKK0831A010（サブオプションサービス一意照会）*****
		template = new CAANMsg(EKK0831A010CBSMsg.class.getName());
		mappinEKK0831A010SCInMsg(template, param, opSvcCd);

		CAANMsg ekk0831a010CbsMsg = callSC(handle, scCall, param, dataMapKey, template);

		CAANMsg[] ekk0831a010CbsMsg1List = ekk0831a010CbsMsg.getCAANMsgList(EKK0831A010CBSMsg.EKK0831A010CBSMSG1LIST);

		return ekk0831a010CbsMsg1List;
	}

	/**
	 * 
	 * @param	template
	 * @param	param
	 * @param	opSvcCd
	 * @throws	RequestParameterException
	 */
	private void mappinEKK0831A010SCInMsg(
			CAANMsg template,
			IRequestParameterReadWrite param,
			String sbOpSvcCd
	) throws RequestParameterException
	{
		// まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0821A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0831A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0831A010);

		// 機能コード
		template.set(EKK0831A010CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_2);

		// ＫＥＹ＿サブオプションサービスコード
		template.set(EKK0831A010CBSMsg.KEY_SBOP_SVC_CD,  sbOpSvcCd);

		// ＫＥＹ＿世代登録年月日時分秒
		template.set(EKK0831A010CBSMsg.KEY_GENE_ADD_DTM, "");
	}


	/**
	 * 機器提供サービス契約一覧照会（サービス契約回線内訳番号）SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @param result 結果のハッシュのリスト
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0341B504SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			String svcKeiKaisenUcwkNo,
			HashMap<String, Object> resultHash)
			throws RequestParameterException, SCException
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		Map<?, ?> sIFResult = null;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EKK0341B504への呼び出しパラメータ設定
		template = new CAANMsg(EKK0341B504CBSMsg.class.getName());
		mappingEKK0341B504InMsg(template, svcKeiKaisenUcwkNo);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SIFの呼び出し
		sIFResult = (new ServiceComponentRequestInvoker()).run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		int status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(
					"EKK0341B504", 
					mappingEKK0341B504SCOutMsg(resultMsgs));
		}

		return status;
	}


	/**
	 * templateに対してEKK0341B504の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0341B504InMsg(CAANMsg template, String svcKeiKaisenUcwkNo)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0341B504CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0341B504CBSMsg.TEMPLATEID, "EKK0341B504");

		//機能コード--機器提供サービス契約一覧照会（サービス契約番号）
		template.set(EKK0341B504CBSMsg.FUNC_CODE, "1");

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0341B504CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);
	}
	
	
	/**
	 * EKK0341B504の結果をHashとして抽出する
	 * @param resultMsgs EKK0341B504のテンプレートリスト
	 * @return EKK0341B504の結果部分
	 */
	private ArrayList<HashMap<String, Object>> mappingEKK0341B504SCOutMsg(CAANMsg[] resultMsgs)
	{
		ArrayList<HashMap<String, Object>> retList = new ArrayList<HashMap<String, Object>>();
		
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0341B504CBSMsg.EKK0341B504CBSMSG1LIST);
		for (int i=0; i<msgList.length; i++)
		{
			HashMap<String, Object> retHash = msgList[0].getMsgData();
			retList.add(retHash);
		}
		
		return retList;
	}

// ANK-3754-00-00 ADD START

	/**
	 * オプションが開始可能かどうか返す
	 * <br>
	 * @param handle
	 * @param param
	 * @param requestParam
	 * @param opSvcCd
	 * @param ekk0341b002Cbs1MsgList
	 * @param kk0341b504
	 */
	private boolean isEnabledStartOption(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			HashMap<String, Object> requestParam,
			String opSvcCd, CAANMsg[] ekk0341b002Cbs1MsgList, Map<String, Object> kk0341b504) throws Throwable
	{
		// あんしん発着信サービスの場合、開始SIFの実行判定を行う
		if (JKKStrConst.OP_SVC_CD_ANSN_HCS_SVC.equals(opSvcCd))
		{
			String kktkSvcKeiNo = null;
			String kktkStat = null;
			if (ekk0341b002Cbs1MsgList != null && ekk0341b002Cbs1MsgList.length > 0)
			{
				// 機器リストには有効な多機能ルータしか存在しない。
				for(CAANMsg ekk0341b002 : ekk0341b002Cbs1MsgList)
				{
					String kkSvcCd = ekk0341b002.getString(EKK0341B002CBSMsg1List.KKTK_SVC_CD);
					// ▽▽▽ ANK-4315-00-00 MOD START
					//if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kkSvcCd))	// 多機能ルータ
					if (JKKStrConst.KKTK_SVC_CD_TAKINORT.equals(kkSvcCd) || JKKStrConst.KKTK_SVC_CD_HGW.equals(kkSvcCd))	// 多機能ルータまたはHGW
					// △△△ ANK-4315-00-00 MOD END
					{
// ▽▽▽ #84334 ADD START
						// 取得済のステータスの方が進んでいれば、上書きしない
						if (kktkStat != null && kktkStat.compareTo(ekk0341b002.getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_STAT)) > 0) 
						{
							continue;
						}
// ▲▲▲ #84334 ADD END
						kktkSvcKeiNo = ekk0341b002.getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
						kktkStat = ekk0341b002.getString(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_STAT);
					}
				}
			}
			
			// 機器が取得できない場合、もう１つの機器情報を確認する
			if (kktkStat == null && kk0341b504 != null)
			{
				kktkSvcKeiNo = (String)kk0341b504.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_NO);
				kktkStat = (String)kk0341b504.get(EKK0341B504CBSMsg1List.KKTK_SVC_KEI_STAT);
			}
			
			// 機器のステータスをチェック
			if (JKKStrConst.CD00056_STAT_TEIKYO_CHU.equals(kktkStat) || 
				JKKStrConst.CD00056_STAT_KEI_KYUSHI_CHU.equals(kktkStat) ||
				JKKStrConst.CD00056_STAT_KEI_TEISHI_CHU.equals(kktkStat)
				)
			{
				// 機器のステータスが提供中であれば、工事完了もしくは配送完了しているため開始はさせる
				return true;
			}
			else
			{
				// 機器のレコードが取得できるいる場合は、配送状態を確認する
				// 型番／製番が入っているかでも確認可能かもしれないが、
				// 工事会社配送かどうかを判定する必要があるので仕方がない
				if (kktkSvcKeiNo != null && kktkSvcKeiNo.length() > 0)
				{
					HashMap<String, Object> wkResultHash = new HashMap<String, Object>();
					/*************************************************************************************/
					/** 契約機器配送対象物品一覧照会                                                    **/
					/*************************************************************************************/
					int statusCode = callEDK0011B090SC(param,handle,requestParam, wkResultHash, kktkSvcKeiNo);
					// 失敗していたらステータスコードを返却する
					if(statusCode != 0)
					{
						throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode));
					}
					// 開始の条件は、配送完了済で工事会社配送以外
					ArrayList<HashMap<String, Object>> edk0011B090List = (ArrayList<HashMap<String, Object>>)wkResultHash.get(TEMPLATE_ID_EDK0011B090);
					
					for (HashMap<String, Object> ekk0011b090 : edk0011B090List)
					{
						// 配送済かつ、工事会社配送ではない（工事案件番号がNULL）
						if (JKKStrConst.HAISO_STAT_KANRYOU_ZM.equals(ekk0011b090.get(EDK0011B090CBSMsg1List.HAISO_STAT)) &&
// ▽▽▽ IT2-2020-0000014 Modify START
//							JKKCommonUtil.isNull(ekk0011b090.get(EDK0011B090CBSMsg1List.HISOS_KOCOMP_CD))
							JKKCommonUtil.isNull(ekk0011b090.get(EDK0011B090CBSMsg1List.KOJIAK_NO))
// △△△ IT2-2020-0000014 Modify END
							)
						{
							// 機器変更番号は見ない。（そもそも契約変更中の場合は、ステータスが提供中の為見なくて良い）
							return true;
						}
					}
				}
				else
				{
					// 本来は機器提供SV契約番号が取得できないことはない。（申込時点で機器が存在することは確認済の為）
					// デッドロジックになるかもしれないが、エラーとはしない。CCエラーにしておく
					throw new CCException("", new IllegalArgumentException("Not Found R0."));
				}
				return false;
			}
		}	
		return true;
	}

	/**
	 * 契約機器配送対象物品一覧照会SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEDK0011B090SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String kktkSvcCdTakinoR)
			throws RequestParameterException, SCException
	{
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		//サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);
		
		//EDK0011B090への呼び出しパラメータ設定
		template = new CAANMsg(EDK0011B090CBSMsg.class.getName());
		mappingEDK0011B090InMsg(template, kktkSvcCdTakinoR);
		editBasicCmn(param, template);
		
		//リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		//SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		//結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		//ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		//ステータスが0以外はエラーとなっている
		if(status == 0)
		{

			resultHash.put(
					TEMPLATE_ID_EDK0011B090, 
					mappingEDK0011B090SCOutMsg(resultMsgs));
			
		}

		return status;
		
	}
	
	/**
	 * templateに対してEDK0011B090の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param kktkSvcKeiNo アプリ固有のパラメータ
	 */
	private void mappingEDK0011B090InMsg(CAANMsg template, String kktkSvcKeiNo)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EDK0011B090CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EDK0011B090CBSMsg.TEMPLATEID, TEMPLATE_ID_EDK0011B090);

		//機能コード--契約機器配送対象物品一覧照会

		template.set(EDK0011B090CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		//ＫＥＹ＿ＫＥＹ＿機器提供サービス契約番号
		template.set(EDK0011B090CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
	}
	
	/**
	 * 契約機器配送対象物品一覧照会の結果をHashとして抽出する
	 * @param resultMsgs EDK0011B090のテンプレートリスト
	 * @return EDK0011B090の結果部分
	 */
	private ArrayList<HashMap<String, Object>> mappingEDK0011B090SCOutMsg(CAANMsg[] resultMsgs)
	{
		ArrayList<HashMap<String, Object>> retList = new ArrayList<HashMap<String, Object>>();
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EDK0011B090CBSMsg.EDK0011B090CBSMSG1LIST);
		for (int i=0; i<msgList.length; i++)
		{
			HashMap<String, Object> retHash = msgList[0].getMsgData();
			retList.add(retHash);
		}
		
		return retList;
	}	
// ANK-3754-00-00 ADD END

	/**************************************************************************/
	/** デリート                                                             **/
	/**************************************************************************/
// ST2-2012-0000482 2012/04/02 MOD START
//	/**
//	 * 申込明細登録S-IF実行
//	 * @param param
//	 * @param handle
//	 * @param inHash
//	 * @param resultHash
//	 * @return
//	 * @throws RequestParameterException
//	 * @throws SCException
//	 */
//	private int callEKK0021D010SC(
//			IRequestParameterReadWrite param,
//			SessionHandle handle, 
//			HashMap<String, Object> inHash,
//			HashMap<String, Object> resultHash) throws RequestParameterException, SCException
//	{
//		HashMap<String, Object> sIFRequest = null;
//		CAANMsg[] resultMsgs = null;
//		CAANMsg template = null;
//		Map<?, ?> sIFResult = null;
//		int status = 0;
//
//		//サービスIF共通の情報を設定
//		sIFRequest = editInMsgCmn(param);
//		
//		//EKK0011D020への呼び出しパラメータ設定
//		template = new CAANMsg(EKK0021D010CBSMsg.class.getName());
//		mappingEKK0021D010SCInMsg(template, inHash, resultHash);
//		editBasicCmn(param, template);
//		
//		//リクエスト用クラスの設定
//		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});
//
//		//SIFの呼び出し
//		sIFResult = (new ServiceComponentRequestInvoker()).run(sIFRequest, handle);
//
//		//結果の取得
//		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
//		
//		//ステータスコードの取得
//		status = template.getInt(JCMConstants.STATUS_INT_KEY);
//		
//		//ステータスが0以外はエラーとなっている
//		if(status == 0)
//		{
//			HashMap<String, Object> resultMap = mappingEKK0021D010SCOutMsg(resultMsgs);
//			resultHash.put(TEMPLATE_ID_EKK0021D010, resultMap);
//
//			//申込明細番号は特別に抜き出して保管
//			Object mskm_dtl_no = resultMap.get(EKK0021D010CBSMsg.MSKM_DTL_NO);
//			inHash.put(EX_MSKM_DTL_NO, mskm_dtl_no);
//		}
//
//		return status;
//	}
//	/**
//	 * EKK0021D010の結果をHashとして抽出する
//	 * @param resultMsgs EKK0081A010のテンプレートリスト
//	 * @return EKK0021D010の結果部分
//	 */
//	private HashMap<String, Object> mappingEKK0021D010SCOutMsg(CAANMsg[] resultMsgs)
//	{
//		
//		HashMap<String, Object> retHash = null;
//		CAANMsg msg = null;
//		
//		//結果の抽出
//		msg = resultMsgs[0];
//		
//		//結果の取得
//		retHash = msg.getHashMap();
//		
//		return retHash;
//		
//	}
//	/**
//	 * templateに対してEKK0021D010の条件に関する部分を設定する
//	 * @param template 条件の設定先
//	 * @param inHash 設定条件
//	 * @param resultHash アプリ固有のパラメータ
//	 */
//	private void mappingEKK0021D010SCInMsg(CAANMsg template, HashMap<String, Object> inHash, HashMap<String, Object> resultHash)
//	{
//
//		//まずは全条件のNullマッピング
//		fillCAANMSGNullMapping(template, new EKK0021D010CBSMsg().getContents());
//		
//		//テンプレートID(SIFのID)
//		template.set(EKK0021D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021D010);
//
//		//機能コード
//		template.set(EKK0021D010CBSMsg.FUNC_CODE, inHash.get(FUNC_CODE));
//		
//
//		// 申込番号
//		template.set(
//				EKK0021D010CBSMsg.MSKM_NO, 
//				inHash.get(MSKM_NO));
//		// 申込年月日←運用日
//		template.set(EKK0021D010CBSMsg.MSKM_YMD, 
//				inHash.get(MSKM_YMD));
//		// ＳＹＳＩＤ
//		template.set(
//				EKK0021D010CBSMsg.SYSID, 
//				inHash.get(SYSID));
//
//		// 更新年月日時分秒
//		template.set(EKK0021D010CBSMsg.UPD_DTM_BF, inHash.get(KK0011_UPD_DTM));
//	}
// ST2-2012-0000482 2012/04/02 MOD END

//↓↓↓2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↓↓↓
//	/**
//	 * １つ目のオーダ条件が存在するかを判定する
//	 * @param jkkOpsvkeiTelIktAddCC リストの要素
//	 * @return 第二オーダー条件の有無
//	 */
//	private boolean isFirstOdr(HashMap<String, Object> jkkOpsvkeiTelIktAddCC)
//	{
//		
//		if(jkkOpsvkeiTelIktAddCC.get(SVC_ORDER_CD) == null)
//		{
//			return false;
//		}
//		
//		if(jkkOpsvkeiTelIktAddCC.get(SVC_ORDER_CD).equals(""))
//		{
//			return false;
//		}
//		
//		return true;
//		
//	}
//	
//	/**
//	 * ２つ目のオーダ条件が存在するかを判定する
//	 * @param jkkOpsvkeiTelIktAddCC リストの要素
//	 * @return 第二オーダー条件の有無
//	 */
//	private boolean isSecondOdr(HashMap<String, Object> jkkOpsvkeiTelIktAddCC)
//	{
//		
//		if(jkkOpsvkeiTelIktAddCC.get(SVC_ORDER_CD2) == null)
//		{
//			return false;
//		}
//		
//		if(jkkOpsvkeiTelIktAddCC.get(SVC_ORDER_CD2).equals(""))
//		{
//			return false;
//		}
//		
//		return true;
//		
//	}
//↑↑↑2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↑↑↑

//↓↓↓2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↓↓↓
//	private int callEKK1551D010SC(
//			IRequestParameterReadWrite param,
//			SessionHandle handle,
//			HashMap<String, Object> inHash,
//			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
//			HashMap<String, Object> resultHash,
//			int index)
//			throws RequestParameterException, SCException, CCException
//	private HashMap<String, Object> mappingEKK1551D010SCOutMsg(CAANMsg[] resultMsgs)
//	private void mappingEKK1551D010InMsg(CAANMsg template, HashMap<String, Object> inHash,
//			HashMap<String, Object> jkkOpsvkeiTelIktAddCC, HashMap<String, Object> resultHash, int index)
//↑↑↑2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↑↑↑

//↓↓↓2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↓↓↓
//	private int callEKK1081D010SC(
//			IRequestParameterReadWrite param,
//			SessionHandle handle,
//			HashMap<String, Object> inHash,
//			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
//			HashMap<String, Object> resultHash,
//			int index)
//			throws RequestParameterException, SCException, CCException
//	private HashMap<String, Object> mappingEKK1081D010SCOutMsg(CAANMsg[] resultMsgs)
//	private void mappingEKK1081D010InMsg(
//			CAANMsg template, 
//			HashMap<String, Object> inHash,
//			HashMap<String, Object> jkkOpsvkeiTelIktAddCC,
//			HashMap<String, Object> resultHash,
//			int index)
//↑↑↑2012-07-25削除　ST2-2012-0001384対応（SOD発行処理は独自でやらない）↑↑↑

//	// 20120423 ST2-2012-0000737 START
//	/**
//	 * EKK0111A010_サービス契約＜eo光電話＞一意照会
//	 * @param param リクエストパラメータ
//	 * @param handle セッションハンドル
//	 * @param svcKeiNo サービス契約番号
//	 * @param geneAddDtm 世代登録年月日時分秒
//	 * @return サービス契約＜eo光電話＞一意照会の結果
//	 * @throws Throwable 例外時にスローされます。
//	 */
//	private CAANMsg callEKK0111A010SC(IRequestParameterReadWrite param,
//			SessionHandle handle,
//			String svcKeiNo,
//			String geneAddDtm
//			) throws Throwable {
//
//		ServiceComponentRequestInvoker scCall = null;
//		HashMap<String, Object> sIFRequest = null;
//		CAANMsg[] resultMsgs = null;
//		CAANMsg template = null;
//		Map<?, ?> sIFResult = null;
//
//		// サービスIF共通の情報を設定
//		sIFRequest = editInMsgCmn(param);
//		
//		// EKK0111A010への呼び出しパラメータ設定
//		template = new CAANMsg(EKK0111A010CBSMsg.class.getName());
//		mappinEKK0111A010SCInMsg(template, param, svcKeiNo, geneAddDtm);
//		editBasicCmn(param, template);
//		
//		// リクエスト用クラスの設定
//		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});
//
//		// SC呼び出しクラスの生成
//		scCall = new ServiceComponentRequestInvoker();
//		// SIFの呼び出し
//		sIFResult = scCall.run(sIFRequest, handle);
//
//		// エラーマッピング処理
//		editResultRP(sIFResult, param, KKSV005001CC);
//		
//		errChk(sIFResult);
//		
//		// 結果の取得
//		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
//		return resultMsgs[0];
//	}
//	/**
//	 * templateに対してEKK0111A010の入力項目を設定する
//	 * @param template 条件の設定先
//	 * @param svcKeiNo サービス契約番号
//	 * @param geneAddDtm 世代登録年月日時分秒
//	 * @throws RequestParameterException 
//	 */
//	private void mappinEKK0111A010SCInMsg(
//			CAANMsg template,
//			IRequestParameterReadWrite param,
//			String svcKeiNo,
//			String geneAddDtm
//			) throws RequestParameterException
//	{
//		// まずは全条件のNullマッピング
//		fillCAANMSGNullMapping(template, new EKK0111A010CBSMsg().getContents());
//		
//		// テンプレートID(SIFのID)
//		template.set(EKK0111A010CBSMsg.TEMPLATEID, "EKK0111A010");
//
//		// 機能コード--サービス契約一意照会
//		template.set(EKK0111A010CBSMsg.FUNC_CODE, "1");
//
//		// ＫＥＹ＿サービス契約番号
//		template.set(EKK0111A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
//		
//		// ＫＥＹ＿世代登録年月日時分秒
//		template.set(EKK0111A010CBSMsg.KEY_GENE_ADD_DTM, geneAddDtm);
//	}
//	// 20120423 ST2-2012-0000737 END

//	// ST2-2012-0000355 2012/03/12 ADD START
//	/**
//	 * @param requestParam
//	 * @param wkResultHash
//	 * @param templateId
//	 */
//	private void clearOpSvKeiGeneAddDtm(Map<String, Object> requestParam)
//	{
//		requestParam.put(KK0351_OP_GENE_ADD_DTM, "");
//	}
//
//	/**
//	 * @param requestParam
//	 * @param wkResultHash
//	 * @param templateId
//	 */
//	private String getOpSvKeiNo(Map<String, Object> requestParam, Map<String, Object> wkResultHash)
//	{
//		Map<String, Object> map = (HashMap<String, Object>)wkResultHash.get(TEMPLATE_ID_EKK0371D010);
//		return (String)map.get(EKK0371D010CBSMsg.OP_SVC_KEI_NO);
//	}
//	// ST2-2012-0000355 2012/03/12 ADD END

}
