/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddTnmtCompsCC
*   ソースファイル名：JFUAddTnmtCompsCC.java
*   作成者          ：富士通
*   日付            ：2014年05月09日
*＜機能概要＞
*   端末補償登録コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00       2014/05/09   FJ)岡井     【ANK-2054-00-00】スマートリンク端末補償
*   v9.00       2014/05/27   FJ)岡井     【ANK-2054-00-00】スマートリンク端末補償 進捗登録修正
*   v9.00       2014/06/03   FJ)岡井     【ANK-2054-00-00】スマートリンク端末補償 停止中処理削除
*   v9.00       2014/06/05   FJ)岡井     【ANK-2054-00-00】スマートリンク端末補償 排他制御修正
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B507CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B507CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811C070CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811D010CBSMsg;

/**
 * 端末補償登録コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAddTnmtCompsCC extends JFUBaseCC
{
	// ■申込内容承認登録(EKK0011D020)
	/** テンプレートID(申込内容承認登録) */
	private static final String TMP_ID_EKK0011D020 = "EKK0011D020";
	/** テンプレートID(申込内容承認登録明細) */
	private static final String TMP_DTL_EKK0011D020 = EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST;
	/** IN項目リスト(申込内容承認登録) */
	private static final List<String> IN_COL_LIST_EKK0011D020 = Arrays.asList(EKK0011D020CBSMsg.SYSID, EKK0011D020CBSMsg.MSKM_SBT_CD,
			EKK0011D020CBSMsg.MSKM_UK_DTM, EKK0011D020CBSMsg.MSKM_YMD, EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD);
	/** 関連チェックエラー項目(申込内容承認登録) */
	private static final String ERR_COL_EKK0011D020 = EKK0011D020CBSMsg.SYSID_ERR;

	// ■申込明細照査・後続業務依頼(EKK0021C060)
	/** テンプレートID(申込明細照査・後続業務依頼) */
	private static final String TMP_ID_EKK0021C060 = "EKK0021C060";
	/** テンプレートID(申込明細照査・後続業務依頼明細) */
	private static final String TMP_DTL_EKK0021C060 = null;
	/** IN項目リスト(申込明細照査・後続業務依頼) */
	private static final List<String> IN_COL_LIST_EKK0021C060 = Arrays.asList(EKK0021C060CBSMsg.MSKM_DTL_NO, EKK0021C060CBSMsg.KZKWRK_REQYMD,
			EKK0021C060CBSMsg.UPD_DTM_BF, EKK0021C060CBSMsg.IDO_DIV);
	/** 関連チェックエラー項目(申込明細照査・後続業務依頼) */
	private static final String ERR_COL_EKK0021C060 = EKK0021C060CBSMsg.MSKM_DTL_NO_ERR;

	// ■課金先一覧照会（機器提供サービス契約番号）
	/** テンプレートID(課金先一覧照会（機器提供サービス契約番号）) */
	private static final String TMP_ID_EKK0321B507 = "EKK0321B507";
	/** テンプレートID(課金先一覧照会（機器提供サービス契約番号）明細) */
	private static final String TMP_DTL_EKK0321B507 = EKK0321B507CBSMsg.EKK0321B507CBSMSG1LIST;
	/** IN項目リスト(課金先一覧照会（機器提供サービス契約番号）) */
	private static final List<String> IN_COL_LIST_EKK0321B507 = Arrays.asList(EKK0321B507CBSMsg.KEY_KKTK_SVC_KEI_NO);
	/** 関連チェックエラー項目(課金先一覧照会（機器提供サービス契約番号）) */
	private static final String ERR_COL_EKK0321B507 = EKK0321B507CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR;

	// ■機器オプションサービス契約登録
	/** テンプレートID(機器オプションサービス契約登録) */
	private static final String TMP_ID_EKK2811D010 = "EKK2811D010";
	/** テンプレートID(機器オプションサービス契約登録明細) */
	private static final String TMP_DTL_EKK2811D010 = null;
	/** IN項目リスト(機器オプションサービス契約登録) */
	private static final List<String> IN_COL_LIST_EKK2811D010 = Arrays.asList(EKK2811D010CBSMsg.KKOP_SVC_CD,
			EKK2811D010CBSMsg.PCRS_CD, EKK2811D010CBSMsg.PPLAN_CD, EKK2811D010CBSMsg.KKTK_SVC_KEI_NO, EKK2811D010CBSMsg.SYSID,
			EKK2811D010CBSMsg.MSKM_DTL_NO, EKK2811D010CBSMsg.RSV_APLY_CD, EKK2811D010CBSMsg.SEIKY_KEI_NO, EKK2811D010CBSMsg.IDO_DIV,
			EKK2811D010CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(機器オプションサービス契約登録) */
	private static final String ERR_COL_EKK2811D010 = EKK2811D010CBSMsg.KKTK_SVC_KEI_NO_ERR;

	// ■機器オプションサービス契約照査
	/** テンプレートID(機器オプションサービス契約照査) */
	private static final String TMP_ID_EKK2811C030 = "EKK2811C030";
	/** テンプレートID(機器オプションサービス契約照査明細) */
	private static final String TMP_DTL_EKK2811C030 = null;
	/** IN項目リスト(機器オプションサービス契約照査) */
	private static final List<String> IN_COL_LIST_EKK2811C030 = Arrays.asList(EKK2811C030CBSMsg.KKOP_SVC_KEI_NO,
			EKK2811C030CBSMsg.IDO_DIV, EKK2811C030CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(機器オプションサービス契約照査) */
	private static final String ERR_COL_EKK2811C030 = EKK2811C030CBSMsg.KKOP_SVC_KEI_NO_ERR;

	// ■機器オプションサービス契約締結
	/** テンプレートID(機器オプションサービス契約締結) */
	private static final String TMP_ID_EKK2811C040 = "EKK2811C040";
	/** テンプレートID(機器オプションサービス契約締結明細) */
	private static final String TMP_DTL_EKK2811C040 = null;
	/** IN項目リスト(機器オプションサービス契約締結) */
	private static final List<String> IN_COL_LIST_EKK2811C040 = Arrays.asList(EKK2811C040CBSMsg.KKOP_SVC_KEI_NO,
			EKK2811C040CBSMsg.IDO_DIV, EKK2811C040CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(機器オプションサービス契約締結) */
	private static final String ERR_COL_EKK2811C040 = EKK2811C040CBSMsg.KKOP_SVC_KEI_NO_ERR;

	// ■機器オプションサービス契約開始
	/** テンプレートID(機器オプションサービス契約開始) */
	private static final String TMP_ID_EKK2811C070 = "EKK2811C070";
	/** テンプレートID(機器オプションサービス契約開始明細) */
	private static final String TMP_DTL_EKK2811C070 = null;
	/** IN項目リスト(機器オプションサービス契約開始) */
	private static final List<String> IN_COL_LIST_EKK2811C070 = Arrays.asList(EKK2811C070CBSMsg.KKOP_SVC_KEI_NO,
			EKK2811C070CBSMsg.IDO_DIV, EKK2811C070CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(機器オプションサービス契約開始) */
	private static final String ERR_COL_EKK2811C070 = EKK2811C070CBSMsg.KKOP_SVC_KEI_NO_ERR;

	// ■進捗登録
	/** テンプレートID(進捗登録) */
	private static final String TMP_ID_EKK1091D010 = "EKK1091D010";
	/** テンプレートID(進捗登録明細) */
	private static final String TMP_DTL_EKK1091D010 = null;
	/** IN項目リスト(進捗登録) */
	private static final List<String> IN_COL_LIST_EKK1091D010 = Arrays.asList(EKK1091D010CBSMsg.SVC_KEI_NO, EKK1091D010CBSMsg.MSKM_DTL_NO,
			EKK1091D010CBSMsg.IDO_DIV, EKK1091D010CBSMsg.IDO_DTM, EKK1091D010CBSMsg.PRG_STAT, EKK1091D010CBSMsg.PRG_TKJK_1,
			EKK1091D010CBSMsg.KKTK_SVC_KEI_NO);
	/** 関連チェックエラー項目(進捗登録) */
	private static final String ERR_COL_EKK1091D010 = EKK1091D010CBSMsg.SVC_KEI_NO_ERR;

	// ■IN項目
	/** サービス契約番号 */
	private static final String IN_SVC_KEI_NO = "svc_kei_no";
	/** 進捗特記事項 */
	private static final String IN_PRG_TKJK = "prg_tkjk";
	/** 機器提供サービス契約番号 */
	private static final String IN_KKTK_SVC_KEI_NO = "kktk_svc_kei_no";
	/** 機器提供サービス契約ステータス */
	private static final String IN_KKTK_SVC_KEI_STAT = "kktk_svc_kei_stat";
	/** 料金プランコード */
	private static final String IN_PPLAN_CD = "pplan_cd";
	/** SYSID */
	private static final String IN_SYSID = "sysid";
	/** 更新年月日時分秒 */
	private static final String IN_UPD_DTM = "upd_dtm";
	/** 端末補償登録リスト */
	private static final String IN_ADD_COMPS_LIST = "add_comps_list";

	// ■OUT項目
	/** 端末補償登録リスト */
	private static final String OUT_ADD_FIN_COMPS_LIST = "add_fin_comps_list";

	/**
	 * 端末補償登録処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果格納マップ
		HashMap resultMap = new HashMap();

		// ●IN項目のチェック＆値取得処理
		if(!chkAndGetInItemsVal(param, fixedText, resultMap))
		{
			outDebugLog("■■■IN項目値不正■■■");

			// リクエストパラメータを初期化
			param.removeData(fixedText);
			// リクエストパラメータに結果情報を設定
			param.setData(fixedText, resultMap);

			return param;
		}

		// ●端末補償登録処理
		addTnmtComps(handle, param, fixedText, resultMap);

		// リクエストパラメータを初期化
		param.removeData(fixedText);
		// リクエストパラメータに結果情報を設定
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * チェック処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * IN項目のチェックと値取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 * @return チェック結果
	 */
	private boolean chkAndGetInItemsVal(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// チェック結果
		boolean result = true;

		// サービス契約番号
		if(JFUBPCommon.isNull(dataMap.get(IN_SVC_KEI_NO)))
		{
			result = false;
		}
		else
		{
			resultMap.put(IN_SVC_KEI_NO, (String)dataMap.get(IN_SVC_KEI_NO));
		}

		// 進捗特記事項
		if(JFUBPCommon.isNull(dataMap.get(IN_PRG_TKJK)))
		{
			result = false;
		}
		else
		{
			resultMap.put(IN_PRG_TKJK, (String)dataMap.get(IN_PRG_TKJK));
		}

		// 端末補償登録リスト
		if(isNullForAnyType((ArrayList)(dataMap.get(IN_ADD_COMPS_LIST))))
		{
			result = false;
		}
		else
		{
			resultMap.put(IN_ADD_COMPS_LIST, (ArrayList)(dataMap.get(IN_ADD_COMPS_LIST)));
		}

		return result;
	}

	/**
	 * 端末補償登録処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 */
	private void addTnmtComps(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// サービス契約番号
		String svcKeiNo = (String)dataMap.get(IN_SVC_KEI_NO);
		// 進捗特記事項
		String prgTkjk = (String)dataMap.get(IN_PRG_TKJK);
		// 更新年月日時分秒
		String lastUpdDtm = (String)dataMap.get(IN_UPD_DTM);
		// 登録リスト取得
		ArrayList addList = (ArrayList)(dataMap.get(IN_ADD_COMPS_LIST));

		// 登録可能ステータス
		List<String> addStat = Arrays.asList(JFUStrConst.CD00056_010, JFUStrConst.CD00056_020, JFUStrConst.CD00056_030,
				JFUStrConst.CD00056_100);
		// 照査可能ステータス
		List<String> shosaStat = Arrays.asList(JFUStrConst.CD00056_020, JFUStrConst.CD00056_030, JFUStrConst.CD00056_100);
		// 締結可能ステータス
		List<String> teiketsuStat = Arrays.asList(JFUStrConst.CD00056_030, JFUStrConst.CD00056_100);
		// 開始可能ステータス
		List<String> startStat = Arrays.asList(JFUStrConst.CD00056_100);
		// 進捗登録可能ステータス
		List<String> addPrgStat = Arrays.asList(JFUStrConst.CD00056_020, JFUStrConst.CD00056_030, JFUStrConst.CD00056_100);

		// 機器オプションサービス契約番号
		String kkopSvcKeiNo = JFUStrConst.EMPTY;
		// 申込明細番号
		String mskmDtlNo = JFUStrConst.EMPTY;
		// 更新年月日時分秒(申込)
		String mskmUpdDtm = JFUStrConst.EMPTY;
		// 申込実行フラグ
		boolean addMskm = true;

		// 登録完了リスト
		ArrayList addFinList = new ArrayList();

		// 登録リスト件数分登録処理を行う
		for (int i = 0; i < addList.size(); i++)
		{
			HashMap childMap = (HashMap)addList.get(i);

			// 機器提供サービス契約番号
			String kktkSvcKeiNo = (String)childMap.get(IN_KKTK_SVC_KEI_NO);
			// 機器提供サービス契約ステータス
			String kktkSvcKeiStat = (String)childMap.get(IN_KKTK_SVC_KEI_STAT);
			// 料金プランコード
			String pplanCd = (String)childMap.get(IN_PPLAN_CD);
			// SYSID
			String sysid = (String)childMap.get(IN_SYSID);

			if(JFUBPCommon.isNull(kktkSvcKeiNo) || JFUBPCommon.isNull(kktkSvcKeiStat))
			{
				// どれか1つでも値が設定されていない場合、エラーとする
				outDebugLog("■■■IN項目値不正の為、処理しない■■■");

				setRelationErrorInfo(param, TMP_ID_EKK2811D010, EKK2811D010CBSMsg.KKTK_SVC_KEI_NO_ERR, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
						String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			// ●課金先一覧照会（機器提供サービス契約番号）(EKK0321B507)
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0321B507);
			// 検索エラーなし
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setEKK0321B507(param, fixedText, kktkSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TMP_ID_EKK0321B507, TMP_DTL_EKK0321B507, IN_COL_LIST_EKK0321B507, ERR_COL_EKK0321B507);
			// 明細取得
			ArrayList eKK0321B507List = (ArrayList)dataMap.get(TMP_DTL_EKK0321B507);

			if(isNullForAnyType(eKK0321B507List))
			{
				// 請求情報が取得できない場合、エラーとする
				outDebugLog("■■■課金先一覧照会（機器提供サービス契約番号）(EKK0321B507)：検索結果無し■■■");

				setRelationErrorInfo(param, TMP_ID_EKK2811D010, EKK2811D010CBSMsg.KKTK_SVC_KEI_NO_ERR, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
						String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			// ■請求契約番号取得(機器に紐付く請求先が1つという前提)
			String seikyKeiNo = (String)((HashMap)eKK0321B507List.get(0)).get(EKK0321B507CBSMsg1List.SEIKY_KEI_NO);

			// ★1回のみ
			if(addMskm)
			{
				// ●申込内容承認登録(EKK0011D020)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK0011D020);
				// 上りマッピング
				setEKK0011D020(param, fixedText, sysid);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK0011D020, TMP_DTL_EKK0011D020, IN_COL_LIST_EKK0011D020, ERR_COL_EKK0011D020);
				// 明細取得
				ArrayList eKK0011D020List = (ArrayList)dataMap.get(TMP_DTL_EKK0011D020);
	
				if(isNullForAnyType(eKK0011D020List))
				{
					// 申込情報が取得できない場合、エラーとする
					outDebugLog("■■■申込内容承認登録(EKK0011D020)：登録結果無し■■■");

					setRelationErrorInfo(param, TMP_ID_EKK2811D010, EKK2811D010CBSMsg.KKTK_SVC_KEI_NO_ERR, fixedText);
					throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
							String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
				}

				// ■申込明細番号
				mskmDtlNo = (String)((HashMap)eKK0011D020List.get(0)).get(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
				// ■更新年月日時分秒(申込)
				mskmUpdDtm = (String)dataMap.get(EKK0011D020CBSMsg.UPD_DTM);
				// フラグをfalseに更新
				addMskm = false;
			}

			// 登録処理対象ステータス：「010,020,030,100」
			if(addStat.contains(kktkSvcKeiStat))
			{
				// ●機器オプションサービス契約登録(EKK2811D010)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK2811D010);
				// 上りマッピング
				setEKK2811D010(param, fixedText, pplanCd, kktkSvcKeiNo, sysid, mskmDtlNo, seikyKeiNo, lastUpdDtm);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK2811D010, TMP_DTL_EKK2811D010, IN_COL_LIST_EKK2811D010, ERR_COL_EKK2811D010);

				// 機器オプションサービス契約番号取得
				kkopSvcKeiNo = (String)dataMap.get(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO);
				// 更新年月日時分秒(登録)取得
				lastUpdDtm = (String)dataMap.get(EKK2811D010CBSMsg.UPD_DTM);
			}

			// 照査処理対象ステータス：「020,030,100」
			if(shosaStat.contains(kktkSvcKeiStat))
			{
				// ●機器オプションサービス契約照査(EKK2811C030)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK2811C030);
				// 上りマッピング
				setEKK2811C030(param, fixedText, kkopSvcKeiNo, lastUpdDtm);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK2811C030, TMP_DTL_EKK2811C030, IN_COL_LIST_EKK2811C030, ERR_COL_EKK2811C030);

				// 更新年月日時分秒(照査)取得
				lastUpdDtm = (String)dataMap.get(EKK2811C030CBSMsg.UPD_DTM);
			}

			// 締結処理対象ステータス：「030,100」
			if(teiketsuStat.contains(kktkSvcKeiStat))
			{
				// ●機器オプションサービス契約締結(EKK2811C040)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK2811C040);
				// 上りマッピング
				setEKK2811C040(param, fixedText, kkopSvcKeiNo, lastUpdDtm);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK2811C040, TMP_DTL_EKK2811C040, IN_COL_LIST_EKK2811C040, ERR_COL_EKK2811C040);

				// 更新年月日時分秒(締結)取得
				lastUpdDtm = (String)dataMap.get(EKK2811C040CBSMsg.UPD_DTM);
			}

			// 開始処理対象ステータス：「100」
			if(startStat.contains(kktkSvcKeiStat))
			{
				// ●機器オプションサービス契約開始(EKK2811C070)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK2811C070);
				// 上りマッピング
				setEKK2811C070(param, fixedText, kkopSvcKeiNo, lastUpdDtm);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK2811C070, TMP_DTL_EKK2811C070, IN_COL_LIST_EKK2811C070, ERR_COL_EKK2811C070);

				// 更新年月日時分秒(開始)取得
				lastUpdDtm = (String)dataMap.get(EKK2811C070CBSMsg.UPD_DTM);
			}

			// 進捗登録処理対象ステータス：「020,030,100」
			if(addPrgStat.contains(kktkSvcKeiStat))
			{
				// ●進捗登録(EKK1091D010)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK1091D010);
				// 上りマッピング
				setEKK1091D010(param, fixedText, svcKeiNo, prgTkjk, mskmDtlNo, kktkSvcKeiNo);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK1091D010, TMP_DTL_EKK1091D010, IN_COL_LIST_EKK1091D010, ERR_COL_EKK1091D010);
			}

			// ★最後のみ
			if(i == addList.size() - 1)
			{
				// ●申込明細照査・後続業務依頼(EKK0021C060)
				// ユーザデータ初期化
				initData(param, fixedText, IN_COL_LIST_EKK0021C060);
				// 上りマッピング
				setEKK0021C060(param, fixedText, mskmDtlNo, mskmUpdDtm);
				// サービスIF実行
				executeSC(handle, param, fixedText, TMP_ID_EKK0021C060, TMP_DTL_EKK0021C060, IN_COL_LIST_EKK0021C060, ERR_COL_EKK0021C060);
			}

			// 登録完了リストに情報を格納
			HashMap addFinMap = new HashMap();
			addFinMap.put(IN_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
			addFinMap.put(EKK2811D010CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
			addFinMap.put(EKK0011D020CBSMsg1List.MSKM_DTL_NO, mskmDtlNo);
			addFinList.add(addFinMap);
		}

		// 登録情報存在チェック
		if(isNullForAnyType(addFinList))
		{
			// 登録情報が存在しない場合エラーとする。
			outDebugLog("■■■登録結果存在無しエラー■■■");

			setRelationErrorInfo(param, TMP_ID_EKK2811D010, EKK2811D010CBSMsg.KKTK_SVC_KEI_NO_ERR, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String.valueOf(RETURN_CODE_NORMAL),
					JPCModelConstant.RELATION_ERR);
		}

		// 返却情報格納
		resultMap.put(OUT_ADD_FIN_COMPS_LIST, addFinList);
	}

	/**
	 * 申込内容承認登録の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysid SYSID
	 * @throws Exception 例外
	 */
	private void setEKK0011D020(IRequestParameterReadWrite param, String fixedText, String sysid) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// SYSID
		dataMap.put(EKK0011D020CBSMsg.SYSID, sysid);
		// 申込種別コード
		dataMap.put(EKK0011D020CBSMsg.MSKM_SBT_CD, JFUStrConst.KK0971_MSKM_SBT_CD_00022);
		// 申込受付年月日時分秒
		dataMap.put(EKK0011D020CBSMsg.MSKM_UK_DTM, JFUBPCommon.getOpeDateTimeStamp(null));
		// 申込年月日
		dataMap.put(EKK0011D020CBSMsg.MSKM_YMD, JFUBPCommon.getOpeDate(null));
		// コンシューマ営業用申込状態識別コード
		dataMap.put(EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD, JFUStrConst.CD00760_04);

		// 申込内容承認登録明細
		ArrayList list = new ArrayList();
		HashMap map = new HashMap();

		// 申込形態コード
		map.put(EKK0011D020CBSMsg1List.MSKM_FORM_CD, JFUStrConst.CD00591_01);
		list.add(map);

		dataMap.put(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST, list);
	}

	/**
	 * 申込明細照査・後続業務依頼の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception 例外
	 */
	private void setEKK0021C060(IRequestParameterReadWrite param, String fixedText, String mskmDtlNo, String updDtm) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 申込明細番号
		dataMap.put(EKK0021C060CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// 後続業務依頼年月日
		dataMap.put(EKK0021C060CBSMsg.KZKWRK_REQYMD, JFUBPCommon.getOpeDate(null));
		// 更新年月日時分秒(更新前)
		dataMap.put(EKK0021C060CBSMsg.UPD_DTM_BF, updDtm);
		// 異動区分
		dataMap.put(EKK0021C060CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
	}

	/**
	 * 課金先一覧照会（機器提供サービス契約番号）の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @throws Exception 
	 */
	private void setEKK0321B507(IRequestParameterReadWrite param, String fixedText, String kktkSvcKeiNo) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);
		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿機器提供サービス契約番号
		dataMap.put(EKK0321B507CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
	}

	/**
	 * 機器オプションサービス契約登録の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pplanCd 料金プランコード
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param sysid SYSID
	 * @param mskmDtlNo 申込明細番号
	 * @param seikyKeiNo 請求契約番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception 例外
	 */
	private void setEKK2811D010(IRequestParameterReadWrite param, String fixedText, String pplanCd, String kktkSvcKeiNo,
			String sysid, String mskmDtlNo, String seikyKeiNo, String updDtm) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 機器オプションサービスコード
		dataMap.put(EKK2811D010CBSMsg.KKOP_SVC_CD, JFUStrConst.KK2801_KKOP_SVC_CD_G03);
		// 料金コースコード
		dataMap.put(EKK2811D010CBSMsg.PCRS_CD, JFUStrConst.CD00134_G05);
		// 料金プランコード
		dataMap.put(EKK2811D010CBSMsg.PPLAN_CD, pplanCd);
		// 機器提供サービス契約番号
		dataMap.put(EKK2811D010CBSMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		// SYSID
		dataMap.put(EKK2811D010CBSMsg.SYSID, sysid);
		// 申込明細番号
		dataMap.put(EKK2811D010CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// 予約適用コード
		dataMap.put(EKK2811D010CBSMsg.RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
		// 請求契約番号
		dataMap.put(EKK2811D010CBSMsg.SEIKY_KEI_NO, seikyKeiNo);
		// 異動区分
		dataMap.put(EKK2811D010CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
		// 更新年月日時分秒(更新前)
		dataMap.put(EKK2811D010CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 機器オプションサービス契約照査の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception 例外
	 */
	private void setEKK2811C030(IRequestParameterReadWrite param, String fixedText, String kkopSvcKeiNo, String updDtm) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 機器オプションサービス契約番号
		dataMap.put(EKK2811C030CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		// 異動区分
		dataMap.put(EKK2811C030CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
		// 更新年月日時分秒
		dataMap.put(EKK2811C030CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 機器オプションサービス契約締結の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception 例外
	 */
	private void setEKK2811C040(IRequestParameterReadWrite param, String fixedText, String kkopSvcKeiNo, String updDtm) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 機器オプションサービス契約番号
		dataMap.put(EKK2811C040CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		// 異動区分
		dataMap.put(EKK2811C040CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
		// 更新年月日時分秒
		dataMap.put(EKK2811C040CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 機器オプションサービス契約開始の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @param updDtm 更新年月日時分秒
	 * @throws Exception 例外
	 */
	private void setEKK2811C070(IRequestParameterReadWrite param, String fixedText, String kkopSvcKeiNo, String updDtm) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 機器オプションサービス契約番号
		dataMap.put(EKK2811C070CBSMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		// 異動区分
		dataMap.put(EKK2811C070CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
		// 更新年月日時分秒
		dataMap.put(EKK2811C070CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 進捗登録の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @param prgTkjk 進捗特記事項
	 * @param mskmDtlNo 進捗特記事項
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @throws Exception 例外
	 */
	private void setEKK1091D010(IRequestParameterReadWrite param, String fixedText, String svcKeiNo, String prgTkjk,
			String mskmDtlNo, String kktkSvcKeiNo) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// 申込明細番号
		dataMap.put(EKK1091D010CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// サービス契約番号
		dataMap.put(EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo);
		// 機器提供サービス契約番号
		dataMap.put(EKK1091D010CBSMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		// 異動区分
		dataMap.put(EKK1091D010CBSMsg.IDO_DIV, JFUStrConst.CD00576_00026);
		// 異動年月日時分秒
		dataMap.put(EKK1091D010CBSMsg.IDO_DTM, JFUBPCommon.getOpeDateTimeStamp(null));
		// 進捗ステータス
		dataMap.put(EKK1091D010CBSMsg.PRG_STAT, JFUStrConst.CD00647_H001);
		// 進捗特記事項1
		dataMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, prgTkjk);
	}

	/**
	 * 様々な型のNULLチェックを行います。
	 * 
	 * <br>
	 * @param obj チェック対象
	 * @return チェック結果
	 */
	private boolean isNullForAnyType(Object obj)
	{
		boolean result = false;

		if(obj == null)
		{
			// 引数がNULL
			result = true;
		}
		else if(obj instanceof ArrayList)
		{
			// ArrayList型
			result = obj == null || ((ArrayList)obj).size() == 0;
		}
		else if(obj instanceof HashMap)
		{
			// HashMap型
			result = obj == null || ((HashMap)obj).size() == 0;
		}

		return result;
	}

	/**
	 * デバッグログを出力します。
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void outDebugLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
}
