/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKPackOpHktgiAddCC
*   ソースファイル名：JKKPackOpHktgiAddCC.java
*   作成者          ：富士通
*   日付            ：2024年10月01日
*＜機能概要＞
*   パックオプション引継登録を行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v72.00.00    2024/10/01   FJ）        新規作成
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.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.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681C010CBSMsg;

/**
 * 
 * パックオプション引継登録CCクラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKPackOpHktgiAddCC extends AbstractCommonComponent
{
	/*********** クラスフィールド ******************/
	/** ----- 作業用クラスフィールド ----- **/
	/** 運用日付 */
	private String oPE_DATE = "";
	
	/** セキュリティパック操作CCマップのキー */
	private static final String SECURITY_PACK_OPERATE_CC_MAP_KEY = "SecurityPackOperateCC";
	/** 割引サービス契約操作CCマップのActionキー: クリエイト */
	private static final String WRIB_SVC_KEI_OPERATE_CC_MAP_KEY_CREATE = "create";
	/** 割引サービス契約操作CCマップのActionキー: デリート */
	private static final String WRIB_SVC_KEI_OPERATE_CC_MAP_KEY_DELETE = "delete";
	/** ファミリーパック割引*/
	private static final String WRIB_SVC_CD1 = "W00000006";
	/** ｅｏセキュリティーパック*/
	private static final String WRIB_SVC_CD2 = "W00000010";
	/** 対象データリスト(登録候補契約明細・登録候補対象契約明細・更新対象明細) */
	private static final String TARGET_LIST = "target_list";
	/** 対象データリスト(異動理由コード明細) */
	private static final String IDO_RSN_CD_LIST = "ido_rsn_cd_list";
	
	/** ----- リクエスト・レスポンス パラメータ ----- **/
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";
	/** 異動区分*/
	private static final String IDO_DIV = "ido_div";
	/** サービス契約番号(引継先契約者情報)*/
	private static final String HIKISAKI_SVC_KEI_NO = "hikisaki_svc_kei_no";
	/** サービス契約番号*/
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** 割引サービスコード*/
	private static final String WRIB_SVC_CD = "wrib_svc_cd";
	/** 割引サービス契約番号*/
	private static final String WRIB_SVC_KEI_NO = "wrib_svc_kei_no";
	/** 割引サービス対象契約番号*/
	private static final String WRIB_SVC_TRGT_KEI_NO = "wrib_svc_trgt_kei_no";
	/** 異動予約番号*/
	private static final String IDO_RSV_NO = "ido_rsv_no";
	/** 更新年月日時分秒(異動予約)*/
	private static final String UPD_DTM_BF = "upd_dtm_bf";
	/** SYSID(引継先契約者情報)*/
	private static final String HIKISAKI_SYSID = "hikisaki_sysid";
	/** SYSID*/
	private static final String SYSID = "sysid";
	/** 申込明細番号*/
	private static final String MSKM_DTL_NO = "mskm_dtl_no";
	/** 更新年月日時分秒(サービス契約・引継先契約者情報)*/
	private static final String HIKISAKI_SK_UPD_DTM_BF = "hikisaki_sk_upd_dtm_bf";
	/** 更新年月日時分秒(サービス契約)*/
	private static final String SK_UPD_DTM_BF = "sk_upd_dtm_bf";
	/** 番号*/
	private static final String NO  = "no";
	/** 契約種別*/
	private static final String KEI_KIND  = "kei_kind";
	/** 申込年月日*/
	private static final String MSKM_YMD = "mskm_ymd";
	/** 異動理由コード*/
	private static final String IDO_RSN_CD = "ido_rsn_cd";
	/** 違約金コード*/
	private static final String PNLTY_CD = "pnlty_cd";
	/** 前月解約*/
	private static final String WRIB_SVC_KEI_ZENGETU_KAIYAKU = "wrib_svc_kei_zengetu_kaiyaku";
	/** 登録選択*/
	private static final String ADD_CHOICE = "add_choice";
	/** サービスコード*/
	private static final String SVC_CD = "svc_cd";
	/** 即時適用フラグ*/
	private static final String APLY_JUN = "aply_jun";
	/** 対象契約識別コード*/
	private static final String TG_KEI_SKBT_CD = "tg_kei_skbt_cd";
	/** サービス契約内訳番号*/
	private static final String SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";
	/** オプションサービス契約番号*/
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	/** サブオプションサービス契約番号*/
	private static final String SBOP_SVC_KEI_NO = "sbop_svc_kei_no";
	/** 機器提供サービス契約番号*/
	private static final String KKTK_SVC_KEI_NO = "kktk_svc_kei_no";
	/** 割引サービス対象サービスコード*/
	private static final String WRIB_SVC_TRGT_SVC_CD = "wrib_svc_trgt_svc_cd";
	/** ｅｏ光多機能ルーター交換有無*/
	private static final String TAKINOU_RTR_CHG_UMU = "takinou_rtr_chg_umu";
	/** 所有ルーター*/
	private static final String USE_RTR = "use_rtr";
	/** 利用開始希望日*/
	private static final String RIYO_STA_YMD = "riyo_sta_ymd";
	/** 申込起算年月日*/
	private static final String MSKM_KISAN_YMD = "mskm_kisan_ymd";
	/** 異動理由メモ*/
	private static final String IDO_RSN_MEMO = "ido_rsn_memo";
	/** キャンペーンコード*/
	private static final String CAMPAIGN_CD = "campaign_cd";

	
	/** ----- テンプレートID ----- **/
	/** サービス契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** 異動予約異動予約状態変更 **/
	private static final String TEMPLATE_ID_EKK1681C010 = "EKK1681C010";
	/** 割引サービス対象契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0481A010 = "EKK0481A010";
	/** 割引サービス契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0451A010 = "EKK0451A010";
	/** 進捗登録 **/
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
	

	/**
	 * パックオプション引継メインメソッド
	 * @param	handle		セッションハンドル
	 * @param	param		リクエストパラメータ
	 * @param	fixedText	サービスメッセージ
	 * @return				リクエストパラメータ
	 * @throws	Throwable	例外時にスローします
	 */
	public IRequestParameterReadWrite PackOpHktgiUpd(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText
	) throws Throwable
	{
		// ステータスコード
		int statusCode = 0;

		// 運用日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);

		// 設定パラメータ格納用
		HashMap<String, Object> paramHash = new HashMap<String, Object>();

		// リクエストパラメータ情報取得
		HashMap<String, Object> rootData = (HashMap<String, Object>)param.getData(fixedText);

		// S-IF結果格納用
		HashMap<String, Object> resultHash =  new HashMap<String, Object>();
		
		// 共通INPUT項目を保持
		paramHash.put(FUNC_CODE, rootData.get(JCMConstants.FUNC_CODE_KEY));
		paramHash.put(IDO_DIV, rootData.get(IDO_DIV));
		paramHash.put(IDO_RSV_NO, rootData.get(IDO_RSV_NO));
		paramHash.put(UPD_DTM_BF, rootData.get(UPD_DTM_BF));
		
		// 機能コードが「0(取消更新)」の時は、引継処理を行わない。
		if ("1".equals((String)rootData.get(JCMConstants.FUNC_CODE_KEY)))
		{
			// 更新INPUT項目を保持
			paramHash.put(HIKISAKI_SVC_KEI_NO, rootData.get(HIKISAKI_SVC_KEI_NO));
			paramHash.put(SVC_KEI_NO, rootData.get(SVC_KEI_NO));
			paramHash.put(MSKM_DTL_NO, rootData.get(MSKM_DTL_NO));
			paramHash.put(WRIB_SVC_CD, rootData.get(WRIB_SVC_CD));
			paramHash.put(WRIB_SVC_KEI_NO, rootData.get(WRIB_SVC_KEI_NO));
			paramHash.put(WRIB_SVC_TRGT_KEI_NO, rootData.get(WRIB_SVC_TRGT_KEI_NO));
			
			try 
			{
				// CC操作共通を呼出
				statusCode = CCCall(param, handle, paramHash, resultHash);
			} 
			catch (Exception e) 
			{
				ArrayList<HashMap<String, Object>> ErrList =
					(ArrayList<HashMap<String, Object>>) param.getControlMapData("ERROR_INFO");
				for (HashMap<String, Object> target : ErrList) 
				{
					statusCode = Integer.valueOf(target.get("STATUS").toString());
				}
				// ERROR_INFOからステータスを取得できない場合
				if(0 == statusCode)
				{
					statusCode = 1100;
				}
			}
		}
		
		// CC操作共通でエラーとなっている場合は、異動予約更新は動かさない。
		if(statusCode == 0)
		{
			// 異動予約更新
			statusCode = callEKK1681C010SC(param, handle, paramHash, resultHash);
		}
		
		// リターンコードの設定
		String formatStatus = String.format("%1$04d", statusCode);
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);

		// 処理終了
		return param;
	}
	
	/**
	 * セキュリティパック・割引サービス契約操作CCの呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int CCCall(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash
	) throws Throwable
	{
		int status = 0;
		
		// 共通項目の照会
		// サービス契約一意照会(引継先)
		status = callEKK0081A010SC(param, handle, inHash, resultHash, (String) inHash.get(HIKISAKI_SVC_KEI_NO));
		if(status != 0)
		{
			return status;
		}
		// サービス契約一意照会(引継先)の結果取得
		HashMap<String, Object> eKK0081A010Hash_HIKISAKI = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0081A010);
		
		
		// サービス契約一意照会(引継元)
		status = callEKK0081A010SC(param, handle, inHash, resultHash, (String) inHash.get(SVC_KEI_NO));
		if(status != 0)
		{
			return status;
		}
		// サービス契約一意照会(引継元)の結果取得
		HashMap<String, Object> eKK0081A010Hash_HIKIMOTO = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0081A010);
		
		// 照会結果を格納
		inHash.put(HIKISAKI_SYSID, (String)eKK0081A010Hash_HIKISAKI.get(EKK0081A010CBSMsg1List.SYSID));
		inHash.put(SYSID, (String)eKK0081A010Hash_HIKIMOTO.get(EKK0081A010CBSMsg1List.SYSID));
		inHash.put(HIKISAKI_SK_UPD_DTM_BF, (String)eKK0081A010Hash_HIKISAKI.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		inHash.put(SK_UPD_DTM_BF, (String)eKK0081A010Hash_HIKIMOTO.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		inHash.put(SVC_CD, (String)eKK0081A010Hash_HIKISAKI.get(EKK0081A010CBSMsg1List.SVC_CD));
		
		// 割引サービスコードが"W00000006"(ファミリーパック)の場合
		if (WRIB_SVC_CD1.equals(inHash.get(WRIB_SVC_CD)))
		{
			// 独立項目の照会
			
			// 割引サービス契約一意照会(引継先)
			status = callEKK0451A010SC(param, handle, inHash, resultHash, (String) inHash.get(WRIB_SVC_KEI_NO));
			if(status != 0)
			{
				return status;
			}
			// 割引サービス契約一意照会(引継先)の結果取得
			HashMap<String, Object> eKK0451A010Hash_HIKISAKI = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0451A010);
			
			// 割引サービス対象契約一意照会(引継先)
			status = callEKK0481A010SC(param, handle, inHash, resultHash, (String) inHash.get(WRIB_SVC_KEI_NO),  (String) inHash.get(WRIB_SVC_TRGT_KEI_NO));
			if(status != 0)
			{
				return status;
			}
			// 割引サービス対象契約一意照会(引継先)の結果取得
			HashMap<String, Object> eKK0481A010Hash_HIKISAKI = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0481A010);
			
			
			// 照会結果を格納
			inHash.put(APLY_JUN, (String)eKK0451A010Hash_HIKISAKI.get(EKK0451A010CBSMsg1List.APLY_JUN));
			inHash.put(MSKM_KISAN_YMD, (String)eKK0451A010Hash_HIKISAKI.get(EKK0451A010CBSMsg1List.MSKM_KISAN_YMD));
			
			inHash.put(TG_KEI_SKBT_CD, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.TG_KEI_SKBT_CD));
			inHash.put(SVC_KEI_UCWK_NO, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.SVC_KEI_UCWK_NO));
			inHash.put(OP_SVC_KEI_NO, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.OP_SVC_KEI_NO));
			inHash.put(SBOP_SVC_KEI_NO, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.SBOP_SVC_KEI_NO));
			inHash.put(KKTK_SVC_KEI_NO, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.KKTK_SVC_KEI_NO));
			inHash.put(WRIB_SVC_TRGT_SVC_CD, (String)eKK0481A010Hash_HIKISAKI.get(EKK0481A010CBSMsg1List.WRIB_SVC_TRGT_SVC_CD));
			
			// 割引サービス契約操作共通コンポーネントを呼出
			updWribSvcKeiOperate(handle, param, inHash);
		}
		// 割引サービスコードが"W00000010"(セキュリティーパック)の場合
		else if (WRIB_SVC_CD2.equals(inHash.get(WRIB_SVC_CD)))
		{
			// セキュリティーパック操作共通コンポーネントを呼出
			Map<String, Object> securityPack = updSecurityPack(handle, param, inHash);
			// 進捗登録
			status = securityPackAddPrg(param, handle, inHash, resultHash, securityPack);
			
		}
		
		return status;
	}
	
	/**
	 * 割引サービス契約CC関連情報を設定します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg セキュリティーオプション登録CCマップ
	 * @param mskmDtlNo 申込明細番号
	 * @param svcKeiMsg サービス契約一意照会明細
	 * @return セキュリティパック操作CCマップ
	 * @throws Throwable 例外が発生した場合
	 */
	private void updWribSvcKeiOperate(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			HashMap<String, Object> inHash
			)
	throws Throwable
	{
		// 割引サービス契約操作CC・KKSV023801CCマップ
		Map<String, Object> KKSV023801Map = new HashMap<String, Object>();
		// マッピング
		
		ArrayList listKKSV023801 = new ArrayList();
		HashMap dataMapKKSV023801 = new HashMap();
		
		// データリストに各設定値を格納
		// 機能コード
		KKSV023801Map.put(FUNC_CODE, "1");
		// 登録選択
		dataMapKKSV023801.put(ADD_CHOICE, "true");
		// SYSID
		dataMapKKSV023801.put(SYSID, inHash.get(HIKISAKI_SYSID));
		// 契約種別
		dataMapKKSV023801.put(KEI_KIND, "w");
		// 割引サービスコード
		dataMapKKSV023801.put(SVC_CD, inHash.get(WRIB_SVC_CD));
		// 即時適用フラグ
		dataMapKKSV023801.put(APLY_JUN, inHash.get(APLY_JUN));
		// 利用開始希望日
		dataMapKKSV023801.put(RIYO_STA_YMD, oPE_DATE);
		// キャンペーンコード
		dataMapKKSV023801.put(CAMPAIGN_CD, "");
		
		// マップ情報をデータリストに設定
		listKKSV023801.add(dataMapKKSV023801);
		
		// 対象データリストをデータマップに設定
		KKSV023801Map.put(TARGET_LIST, listKKSV023801);
		// 対象データマップをINPUTパラメータに設定
		param.setData("KKSV023801CC", KKSV023801Map);
		
		
		// 割引サービス契約操作CC・KKSV023802CCマップ
		Map<String, Object> KKSV023802Map = new HashMap<String, Object>();
		// マッピング
		
		ArrayList listKKSV023802 = new ArrayList();
		HashMap dataMapKKSV023802 = new HashMap();
		
		// データリストに各設定値を格納
		// 機能コード
		KKSV023802Map.put(FUNC_CODE, "1");
		// 通番
		dataMapKKSV023802.put(NO, "0");
		// 対象契約識別コード
		dataMapKKSV023802.put(TG_KEI_SKBT_CD, inHash.get(TG_KEI_SKBT_CD));
		// サービス契約番号
		dataMapKKSV023802.put(SVC_KEI_NO, inHash.get(HIKISAKI_SVC_KEI_NO));
		// サービス契約内訳番号
		dataMapKKSV023802.put(SVC_KEI_UCWK_NO, inHash.get(SVC_KEI_UCWK_NO));
		// オプションサービス契約番号
		dataMapKKSV023802.put(OP_SVC_KEI_NO, inHash.get(OP_SVC_KEI_NO));
		// サブオプションサービス契約番号
		dataMapKKSV023802.put(SBOP_SVC_KEI_NO, inHash.get(SBOP_SVC_KEI_NO));
		// 機器提供サービス契約番号
		dataMapKKSV023802.put(KKTK_SVC_KEI_NO, inHash.get(KKTK_SVC_KEI_NO));
		// 割引サービス対象サービスコード
		dataMapKKSV023802.put(WRIB_SVC_TRGT_SVC_CD, inHash.get(WRIB_SVC_TRGT_SVC_CD));
		
		// マップ情報をデータリストに設定
		listKKSV023802.add(dataMapKKSV023802);
		
		// 対象データリストをデータマップに設定
		KKSV023802Map.put(TARGET_LIST, listKKSV023802);
		// 対象データマップをINPUTパラメータに設定
		param.setData("KKSV023802CC", KKSV023802Map);
		
		
		// 割引サービス契約操作CC・KKSV023803CCマップ
		Map<String, Object> KKSV023803Map = new HashMap<String, Object>();
		// マッピング
		
		ArrayList listKKSV023803 = new ArrayList();
		HashMap dataMapKKSV023803 = new HashMap();
		
		// データリストに各設定値を格納
		// 機能コード
		KKSV023803Map.put(FUNC_CODE, "1");
		// 申込年月日
		KKSV023803Map.put(MSKM_YMD, oPE_DATE);
		// 異動区分
		KKSV023803Map.put(IDO_DIV, inHash.get(IDO_DIV));
		// SYSID
		KKSV023803Map.put(SYSID, inHash.get(HIKISAKI_SYSID));
		// 異動理由メモ
		KKSV023803Map.put(IDO_RSN_MEMO, "");
		// 異動理由コード
		dataMapKKSV023803.put(IDO_RSN_CD, JKKStrConst.CD00846_OTHER);
		// ｅｏ光多機能ルーター交換有無
		dataMapKKSV023803.put(TAKINOU_RTR_CHG_UMU, "");
		// 所有ルーター
		dataMapKKSV023803.put(USE_RTR, "");
		
		// マップ情報をデータリストに設定
		listKKSV023803.add(dataMapKKSV023803);
		
		// 対象データリストをデータマップに設定
		KKSV023803Map.put(IDO_RSN_CD_LIST, listKKSV023803);
		// 対象データマップをINPUTパラメータに設定
		param.setData("KKSV023803CC", KKSV023803Map);
		
		// 割引サービス契約操作CC・KKSV024001CCマップ
		Map<String, Object> KKSV024001Map = new HashMap<String, Object>();
		// マッピング
		ArrayList listKKSV024001 = new ArrayList();
		HashMap dataMapKKSV024001 = new HashMap();
		
		// 機能コード
		KKSV024001Map.put(FUNC_CODE, "1");
		// 割引サービス契約番号
		dataMapKKSV024001.put(NO, inHash.get(WRIB_SVC_KEI_NO));
		// 契約種別
		dataMapKKSV024001.put(KEI_KIND, "w");
		
		// マップ情報をデータリストに設定
		listKKSV024001.add(dataMapKKSV024001);
		
		// 対象データリストをデータマップに設定
		KKSV024001Map.put(TARGET_LIST, listKKSV024001);
		// 対象データマップをINPUTパラメータに設定
		
		param.setData("KKSV024001CC", KKSV024001Map);
		
		
		// 割引サービス契約操作CC・KKSV024002CCマップ
		Map<String, Object> KKSV023402Map = new HashMap<String, Object>();
		// マッピング
		ArrayList listKKSV024002 = new ArrayList();
		HashMap dataMapKKSV024002 = new HashMap();
		
		// 機能コード
		KKSV023402Map.put(FUNC_CODE, "1");
		// 解約日付
		KKSV023402Map.put(MSKM_YMD, oPE_DATE);
		// 異動区分
		KKSV023402Map.put(IDO_DIV, inHash.get(IDO_DIV));
		// SYSID
		KKSV023402Map.put(SYSID, inHash.get(SYSID));
		// 異動理由コード
		dataMapKKSV024002.put(IDO_RSN_CD, JKKStrConst.CD00846_OTHER);
		// 違約金コード
		dataMapKKSV024002.put(PNLTY_CD, "");
		// 前月解約
		dataMapKKSV024002.put(WRIB_SVC_KEI_ZENGETU_KAIYAKU, "");
		
		// マップ情報をデータリストに設定
		listKKSV024002.add(dataMapKKSV024002);
		
		// 対象データリストをデータマップに設定
		KKSV023402Map.put(IDO_RSN_CD_LIST, listKKSV024002);
		// 対象データマップをINPUTパラメータに設定
		
		param.setData("KKSV024002CC", KKSV023402Map);
		
		// 割引CC実行(解約)
		new JKKWribSvcKeiOperateCC().execute(handle, param,WRIB_SVC_KEI_OPERATE_CC_MAP_KEY_DELETE);
		// 割引CC実行(登録)
		new JKKWribSvcKeiOperateCC().execute(handle, param,WRIB_SVC_KEI_OPERATE_CC_MAP_KEY_CREATE);
		
		return;
	}
	
	/**
	 * セキュリティーパックCC関連情報を設定。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg セキュリティーオプション登録CCマップ
	 * @param mskmDtlNo 申込明細番号
	 * @param svcKeiMsg サービス契約一意照会明細
	 * @return セキュリティパック操作CCマップ
	 * @throws Throwable 例外が発生した場合
	 */
	private Map<String, Object>  updSecurityPack(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			HashMap<String, Object> inHash
			)
	throws Throwable
	{
		// セキュリティパック操作CCマップ
		Map<String, Object> securityPackMap = new HashMap<String, Object>();
		// 上りマッピング
		
		// 機能コード
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_FUNC_CD, "1");
		// 基準年月日
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_BASE_YMD, oPE_DATE);
		// 引継有無
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_HIKITUGI_UM, JKKStrConst.CD_DIV_UM_ARI);
		// 異動区分
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_IDO_DIV, inHash.get(IDO_DIV));

		// 登録用情報リスト
		List<Map<String, Object>> addInfoList = null;

		addInfoList = new ArrayList<Map<String, Object>>();
		Map<String, Object> addInfo = new HashMap<String, Object>();
		
		// SYSID
		addInfo.put(JKKSecurityPackOperateCC.KEY_SYSID_ADD, inHash.get(HIKISAKI_SYSID));
		// サービス契約番号
		addInfo.put(JKKSecurityPackOperateCC.KEY_SVC_KEI_NO_ADD, inHash.get(HIKISAKI_SVC_KEI_NO));
		// 申込明細番号
		addInfo.put(JKKSecurityPackOperateCC.KEY_MSKM_DTL_NO_ADD, inHash.get(MSKM_DTL_NO));
		// 更新年月日時分秒（サービス契約）
		addInfo.put(JKKSecurityPackOperateCC.KEY_UPD_DTM_BF_ADD, inHash.get(HIKISAKI_SK_UPD_DTM_BF));
		// セキュリティーパック対象フラグ
		addInfo.put(JKKSecurityPackOperateCC.KEY_SECURITY_PACK_TG_FLG_ADD, JKKStrConst.CD_DIV_UM_ARI);
		// プレミアムパック対象フラグ：無
		addInfo.put(JKKSecurityPackOperateCC.KEY_PREMIUM_PACK_TG_FLG_ADD, JKKStrConst.CD_DIV_UM_NASHI);
		// インターネットサギウォール対象フラグ
		addInfo.put(JKKSecurityPackOperateCC.KEY_INETSGWL_TG_FLG_ADD, JKKStrConst.CD_DIV_UM_NASHI);
		// インターネットサギウォール利用開始希望日
		addInfo.put(JKKSecurityPackOperateCC.KEY_INETSGWL_START_YMD_ADD, "");
		// ノートンファミリープレミア対象フラグ
		addInfo.put(JKKSecurityPackOperateCC.KEY_NTFMLPRM_TG_FLG_ADD, JKKStrConst.CD_DIV_UM_NASHI);
		// ノートンファミリープレミア利用開始希望日
		addInfo.put(JKKSecurityPackOperateCC.KEY_NTFMLPRM_START_YMD_ADD, "");
		// リモートサポートプラス対象フラグ
		addInfo.put(JKKSecurityPackOperateCC.KEY_RMTSPRT_TG_FLG_ADD, JKKStrConst.CD_DIV_UM_NASHI);

		addInfoList.add(addInfo);
		
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_ADD_INFO_LIST, addInfoList);
		
		
		// 解約用情報リスト
		List<Map<String, Object>> cancelInfoList = null;

		cancelInfoList = new ArrayList<Map<String, Object>>();
		Map<String, Object> cancelInfo = new HashMap<String, Object>();
		
		// SYSID
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_SYSID_CANCEL, inHash.get(SYSID));
		// サービス契約番号
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_SVC_KEI_NO_CANCEL, inHash.get(SVC_KEI_NO));
		// 申込明細番号
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_MSKM_DTL_NO_CANCEL, inHash.get(MSKM_DTL_NO));
		// 更新年月日時分秒（サービス契約）
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_UPD_DTM_BF_CANCEL, inHash.get(SK_UPD_DTM_BF));
		// セキュリティーパック対象フラグ
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_SECURITY_PACK_TG_FLG_CANCEL, JKKStrConst.CD_DIV_UM_ARI);
		// セキュリティーパック課金非課金コード
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_SECURITY_PACK_CHRG_HICHRG_CD_CANCEL, "");
		// プレミアムパック対象フラグ
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_PREMIUM_PACK_TG_FLG_CANCEL, JKKStrConst.CD_DIV_UM_NASHI);
		// プレミアムパック課金非課金コード
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_PREMIUM_PACK_CHRG_HICHRG_CD_CANCEL, "");
		// インターネットサギウォール対象フラグ
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_INETSGWL_TG_FLG_CANCEL, JKKStrConst.CD_DIV_UM_NASHI);
		// インターネットサギウォール課金非課金コード
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_INETSGWL_CHRG_HICHRG_CD_CANCEL, "");
		// ノートンファミリープレミア対象フラグ
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_NTFMLPRM_TG_FLG_CANCEL, JKKStrConst.CD_DIV_UM_NASHI);
		// ノートンファミリープレミア課金非課金コード
		cancelInfo.put(JKKSecurityPackOperateCC.KEY_NTFMLPRM_CHRG_HICHRG_CD_CANCEL, "");
		// リモートサポートプラス対象フラグ
		addInfo.put(JKKSecurityPackOperateCC.KEY_RMTSPRT_TG_FLG_CANCEL, JKKStrConst.CD_DIV_UM_NASHI);
		
		cancelInfoList.add(cancelInfo);
		
		securityPackMap.put(JKKSecurityPackOperateCC.KEY_CANCEL_INFO_LIST, cancelInfoList);
		
		param.setData(SECURITY_PACK_OPERATE_CC_MAP_KEY, securityPackMap);
		
		// セキュパCC実行
		new JKKSecurityPackOperateCC().execute(handle, param, SECURITY_PACK_OPERATE_CC_MAP_KEY);
		
		param.removeData(SECURITY_PACK_OPERATE_CC_MAP_KEY);
		
		return securityPackMap;
	}


	/**
	 * 異動予約異動予約状態SIFを呼び出し
	 * @param param リクエストパラメータ
	 * @param handle セッションハンドル
	 * @param inHash 条件用Hash
	 * @param resultHash 結果のハッシュ
	 * @return サービスインターフェースのリターンコード
	 * @throws RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK1681C010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			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;
		
		String iFcase = TEMPLATE_ID_EKK1681C010;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK1681C010への呼び出しパラメータ設定
		template = new CAANMsg(EKK1681C010CBSMsg.class.getName());
		mappingEKK1681C010InMsg(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);

		// エラーマッピング処理
		editResultRP(sIFResult, param);

		// エラーチェック
		errChk(sIFResult, iFcase);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK1681C010, mappingEKK1681C010SCOutMsg(resultMsgs));
		}

		return status;
	}
	
	/**
	 * templateに対してEKK1681C010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param resultHash アプリ固有のパラメータ
	 */
	private void mappingEKK1681C010InMsg(CAANMsg template, HashMap<String, Object> inHash, HashMap<String, Object> resultHash)
	{
		//全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK1681C010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK1681C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681C010);

		//機能コード
		template.set(EKK1681C010CBSMsg.FUNC_CODE, "1");
		
		// 異動予約番号
		template.set(EKK1681C010CBSMsg.IDO_RSV_NO, inHash.get(IDO_RSV_NO));
		
		// 更新年月日時分秒(更新前)
		template.set(EKK1681C010CBSMsg.UPD_DTM_BF, inHash.get(UPD_DTM_BF));
		
		// INPUT項目_機能コードによって取消・反映分岐
		if ("0".equals(inHash.get(FUNC_CODE)))
		{
			// 異動予約状態コード( 02:取消済 )
			template.set(EKK1681C010CBSMsg.IDO_RSV_STAT_CD, "02");
			// 異動予約取消年月日
			template.set(EKK1681C010CBSMsg.IDO_RSV_CL_YMD, oPE_DATE);
			
		}else if  ("1".equals(inHash.get(FUNC_CODE)))
		{
			// 異動予約状態コード( 01:反映済 )
			template.set(EKK1681C010CBSMsg.IDO_RSV_STAT_CD, "01");
			// 異動予約反映年月日
			template.set(EKK1681C010CBSMsg.IDO_RSV_HANEI_YMD, oPE_DATE);
		}
	}
	
	/**
	 * EKK1681C010の結果をHashとして抽出する
	 * @param resultMsgs EKK1681C010のテンプレートリスト
	 * @return EKK1681C010の結果部分
	 */
	private HashMap<String, Object> mappingEKK1681C010SCOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		retHash = msg.getHashMap();
		
		return retHash;
	}
	
	/**
	 * 持ちうるフィールドにNullマッピングで埋める
	 * @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);
		}
	}
	
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception 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;
	}
	
	/**
	 * 条件部の共通する項目の設定
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	private 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);
	}
	
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * <br>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	private void editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Throwable 
	{
		// 戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
	}
	
	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList, String iFcase) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		int templateStatus = 0;
		// ステータス
		if (TEMPLATE_ID_EKK0081A010.equals(iFcase))
		{
			templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);
		}
		if (TEMPLATE_ID_EKK1681C010.equals(iFcase))
		{
			templateStatus = template.getInt(EKK1681C010CBSMsg.STATUS);
		}
		if (TEMPLATE_ID_EKK0481A010.equals(iFcase))
		{
			templateStatus = template.getInt(EKK0481A010CBSMsg.STATUS);
		}
		if (TEMPLATE_ID_EKK0451A010.equals(iFcase))
		{
			templateStatus = template.getInt(EKK0451A010CBSMsg.STATUS);
		}
		if (TEMPLATE_ID_EKK1091D010.equals(iFcase))
		{
			templateStatus = template.getInt(EKK1091D010CBSMsg.STATUS);
		}
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * サービス契約一意照会SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0081A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		String iFcase = TEMPLATE_ID_EKK0081A010;
		
		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		mappingEKK0081A010InMsg(template, inHash, svcKeiNo);
		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);

		// エラーチェック
		errChk(sIFResult, iFcase);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0081A010, mappingEKK0081A010SCOutMsg(resultMsgs));
		}

		return status;
		
	}
	
	/**
	 * templateに対してEKK0081A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0081A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String svcKeiNo)
	{
		//全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010);

		//機能コード--サービス契約一意照会(ここだけはカレント)
		template.set(EKK0081A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		
		//ＫＥＹ＿予約適用年月日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, oPE_DATE);
		
		//カレント検索なので setNull にすべし
		template.setNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * EKK0081A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0081A010のテンプレートリスト
	 * @return EKK0081A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0081A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * 割引サービス契約番号SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0451A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String WribSvcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;
		
		String iFcase = TEMPLATE_ID_EKK0451A010;
		
		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0451A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0451A010CBSMsg.class.getName());
		mappingEKK0451A010InMsg(template, inHash, WribSvcKeiNo);
		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);

		// エラーチェック
		errChk(sIFResult, iFcase);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0451A010, mappingEKK0451A010SCOutMsg(resultMsgs));
		}
		
		return status;
	}
	
	/**
	 * templateに対してEKK0451A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0451A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String WribSvcKeiNo)
	{
		//全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0451A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0451A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0451A010);

		//機能コード--サービス契約一意照会
		template.set(EKK0451A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿割引サービス契約番号
		template.set(EKK0451A010CBSMsg.KEY_WRIB_SVC_KEI_NO, WribSvcKeiNo);
		
		//ＫＥＹ＿予約適用年月日
		template.set(EKK0451A010CBSMsg.KEY_RSV_APLY_YMD, oPE_DATE);
		
		//カレント検索なので setNull
		template.setNull(EKK0451A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * EKK0451A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0451A010のテンプレートリスト
	 * @return EKK0451A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0451A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0451A010CBSMsg.EKK0451A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * 割引サービス契約番号SIFを呼び出し
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0481A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String WribSvcKeiNo,
			String WribSvcTrgtKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		String iFcase = TEMPLATE_ID_EKK0481A010;
		
		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0481A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0481A010CBSMsg.class.getName());
		mappingEKK0481A010InMsg(template, inHash, WribSvcKeiNo, WribSvcTrgtKeiNo);
		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);

		// エラーチェック
		errChk(sIFResult, iFcase);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0481A010, mappingEKK0481A010SCOutMsg(resultMsgs));
		}

		return status;
	}
	
	/**
	 * templateに対してEKK0481A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0481A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String WribSvcKeiNo, String WribSvcTrgtKeiNo)
	{
		//全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0481A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0481A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0481A010);

		//機能コード--サービス契約一意照会
		template.set(EKK0481A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿割引サービス契約番号
		template.set(EKK0481A010CBSMsg.KEY_WRIB_SVC_KEI_NO, WribSvcKeiNo);
		
		//ＫＥＹ＿割引サービス対象契約番号
		template.set(EKK0481A010CBSMsg.KEY_WRIB_SVC_TRGT_KEI_NO, WribSvcTrgtKeiNo);
		
		//ＫＥＹ＿世代登録年月日時分秒
		template.set(EKK0481A010CBSMsg.KEY_GENE_ADD_DTM, oPE_DATE);
		
		//カレント検索なので setNull
		template.setNull(EKK0481A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * EKK0481A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0481A010のテンプレートリスト
	 * @return EKK0481A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0481A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0481A010CBSMsg.EKK0481A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * 進捗登録SIFを呼び出し
	 * @param	param		リクエストパラメータ
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	prgMsg	進捗登録情報
	 * @param prgTkjk1 進捗特記事項1
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK1091D010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			Map<String, Object> prgMsg,
			String prgTkjk1
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		String iFcase = TEMPLATE_ID_EKK1091D010;
		
		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK1091D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK1091D010CBSMsg.class.getName());
		mappingEKK1091D010InMsg(template, inHash, prgMsg, prgTkjk1);
		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);

		// エラーチェック
		errChk(sIFResult, iFcase);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK1091D010, mappingEKK1091D010SCOutMsg(resultMsgs));
		}
		
		return status;
	}
	
	/**
	 * templateに対してEKK1091D010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param prgMsg 進捗登録情報
	 * @param prgTkjk1 進捗特記事項1
	 */
	private void mappingEKK1091D010InMsg(CAANMsg template, HashMap<String, Object> inHash, Map<String, Object> prgMsg, String prgTkjk1)
	{
		//全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK1091D010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010);
		
		// 機能コード
		template.set(EKK1091D010CBSMsg.FUNC_CODE, "1");
		// 申込明細番号
		template.set(EKK1091D010CBSMsg.MSKM_DTL_NO, (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_MSKM_DTL_NO));
		// 請求契約番号
		template.set(EKK1091D010CBSMsg.SEIKY_KEI_NO, (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_SEIKY_KEI_NO));
		// サービス契約番号
		template.set(EKK1091D010CBSMsg.SVC_KEI_NO, (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_SVC_KEI_NO));
		// オプションサービス契約番号
		template.set(EKK1091D010CBSMsg.OP_SVC_KEI_NO, (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_OP_SVC_KEI_NO));
		// 割引サービス契約番号
		template.set(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO, (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_WRIB_SVC_KEI_NO));
		// 異動区分
		template.set(EKK1091D010CBSMsg.IDO_DIV, inHash.get(IDO_DIV));
		// 異動年月日時分秒
		template.set(EKK1091D010CBSMsg.IDO_DTM, JCCBPCommon.getSysDateTimeStamp());
		// 進捗ステータス
		template.set(EKK1091D010CBSMsg.PRG_STAT,  (String)prgMsg.get(JKKSecurityPackOperateCC.KEY_PRG_STAT));
		// 異動理由明細.異動理由コード
		CAANMsg idoRsnTemp = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
		idoRsnTemp.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, JKKStrConst.CD00846_OTHER);
		// 異動理由明細.異動理由メモ
		idoRsnTemp.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
		// 異動理由明細
		CAANMsg[] list = new CAANMsg[1];
		list[0] = idoRsnTemp;
		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, list);
	}
	
	/**
	 * EKK1091D010の結果をHashとして抽出する
	 * @param resultMsgs EKK1091D010のテンプレートリスト
	 * @return EKK1091D010の結果部分
	 */
	private HashMap<String, Object> mappingEKK1091D010SCOutMsg(CAANMsg[] resultMsgs)
	{
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * セキュリティーパック関連情報の進捗を登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg セキュリティーオプション登録CCマップ
	 * @param securityPackMap セキュリティパック操作CCマップ
	 * @throws Throwable 例外が発生した場合
	 */
	private int securityPackAddPrg(
			IRequestParameterReadWrite param,
			SessionHandle handle, 
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			Map<String, Object> securityPackMap)
	throws Throwable
	{
		int status = 0;
		// 進捗特記事項1
		String prgTkjk1 = "";
		
		if (null == securityPackMap || securityPackMap.isEmpty())
		{
			return status;
		}
		
		// 登録用情報リストの処理結果明細を取得
		List<Map<String, Object>> addInfoList = (List<Map<String, Object>>)securityPackMap.get(JKKSecurityPackOperateCC.KEY_ADD_INFO_LIST);
		if (null != addInfoList && 0 < addInfoList.size())
		{
			List<Map<String, Object>> tranResultList = (List<Map<String, Object>>)addInfoList.get(0).get(JKKSecurityPackOperateCC.KEY_TRAN_RESULT_LIST);
			for (Map<String, Object> tranResult : tranResultList)
			{
				if (!JKKStringUtil.isNullBlank((String)tranResult.get(JKKSecurityPackOperateCC.KEY_PRG_STAT)))
				{
					// 進捗登録
					status = callEKK1091D010SC(param, handle, inHash, resultHash, tranResult, prgTkjk1);
					if(status != 0)
					{
						return status;
					}
				}
			}
		}
		
		// 解約用情報リストの処理結果明細を取得
		List<Map<String, Object>> cancelInfoList = (List<Map<String, Object>>)securityPackMap.get(JKKSecurityPackOperateCC.KEY_CANCEL_INFO_LIST);
		if (null != cancelInfoList && 0 < cancelInfoList.size())
		{
			List<Map<String, Object>> tranResultList = (List<Map<String, Object>>)cancelInfoList.get(0).get(JKKSecurityPackOperateCC.KEY_TRAN_RESULT_LIST);
			for (Map<String, Object> tranResult : tranResultList)
			{
				if (!JKKStringUtil.isNullBlank((String)tranResult.get(JKKSecurityPackOperateCC.KEY_PRG_STAT)))
				{
					// 進捗登録
					status = callEKK1091D010SC(param, handle, inHash, resultHash, tranResult, prgTkjk1);
				}
			}
		}
		
		return status;
	}
}
