/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUBfOpenChgPayWayLoginChkCC
*   ソースファイル名：JFUBfOpenChgPayWayLoginChkCC.java
*   作成者          ：富士通
*   日付            ：2018年05月08日
*＜機能概要＞
*   開通前支払方法変更ログインチェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v37.00      2018/05/08   FJ)岡井    【ANK-3119-00-00】開通前でもＷｅｂから支払方法を変更可能とする
*   v41.00      2019/03/12   FJ)岡井    【ANK-3577-00-00】アンケートWeb化対応
*
**********************************************************************/
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.exception.RequestParameterException;
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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021B504CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021B504CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B548CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B548CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0241B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0091B020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0091B020CBSMsg1List;

/**
 * 開通前支払方法変更ログインチェックコモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */

public class JFUBfOpenChgPayWayLoginChkCC extends JFUBaseCC
{

	/* ■□ 申込書番号（申込書明細番号）存在チェック一覧参照 ■□ */
	/** テンプレートID(申込書番号（申込書明細番号）存在チェック一覧参照) */
	private static final String TEMPLATE_ID_EKK0021B504 = "EKK0021B504";
	/** テンプレートID(申込書番号（申込書明細番号）存在チェック一覧参照明細) */
	private static final String TEMPLATE_ID_EKK0021B504_DETAIL = EKK0021B504CBSMsg.EKK0021B504CBSMSG1LIST;
	/** IN項目リスト(申込書番号（申込書明細番号）存在チェック一覧参照) */
	private static final List<String> IN_COLUMN_LIST_EKK0021B504 = Arrays.asList(EKK0021B504CBSMsg.KEY_MSKMSHO_NO);
	/** 関連チェックエラー項目(申込書番号（申込書明細番号）存在チェック一覧参照) */
	private static final String ERROR_COLUMN_EKK0021B504 = EKK0021B504CBSMsg.KEY_MSKMSHO_NO_ERR;
	/** SC実行結果取得キー(申込書番号（申込書明細番号）存在チェック一覧参照) */
	private static final String TEMP_TEMPLATE_KEY_EKK0021B504 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0021B504 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 申込明細_工事案件一覧照会（工事案件番号） ■□ */
	/** テンプレートID(申込明細_工事案件一覧照会（工事案件番号）) */
	private static final String TEMPLATE_ID_EKU0091B020 = "EKU0091B020";
	/** テンプレートID(申込明細_工事案件一覧照会（工事案件番号）明細) */
	private static final String TEMPLATE_ID_EKU0091B020_DETAIL = EKU0091B020CBSMsg.EKU0091B020CBSMSG1LIST;
	/** IN項目リスト(申込明細_工事案件一覧照会（工事案件番号）) */
	private static final List<String> IN_COLUMN_LIST_EKU0091B020 = Arrays.asList(EKU0091B020CBSMsg.KEY_KOJIAK_NO);
	/** 関連チェックエラー項目(申込明細_工事案件一覧照会（工事案件番号）) */
	private static final String ERROR_COLUMN_EKU0091B020 = EKU0091B020CBSMsg.KEY_KOJIAK_NO_ERR;
	/** SC実行結果取得キー(申込明細_工事案件一覧照会（工事案件番号）) */
	private static final String TEMP_TEMPLATE_KEY_EKU0091B020 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKU0091B020 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 申込明細一意照会 ■□ */
	/** テンプレートID(申込明細一意照会) */
	private static final String TEMPLATE_ID_EKK0021A010 = "EKK0021A010";
	/** テンプレートID(申込明細一意照会明細) */
	private static final String TEMPLATE_ID_EKK0021A010_DETAIL = EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST;
	/** IN項目リスト(申込明細一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0021A010 = Arrays.asList(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO);
	/** 関連チェックエラー項目(申込明細一意照会) */
	private static final String ERROR_COLUMN_EKK0021A010 = EKK0021A010CBSMsg.KEY_MSKM_DTL_NO_ERR;
	/** SC実行結果取得キー(申込明細一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0021A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0021A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ お客様一意照会 ■□ */
	/** テンプレートID(お客様一意照会) */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** テンプレートID(お客様一意照会明細) */
	private static final String TEMPLATE_ID_ECK0011A010_DETAIL = ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST;
	/** IN項目リスト(お客様一意照会) */
	private static final List<String> IN_COLUMN_LIST_ECK0011A010 = Arrays.asList(ECK0011A010CBSMsg.KEY_SYSID, ECK0011A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(お客様一意照会) */
	private static final String ERROR_COLUMN_ECK0011A010 = ECK0011A010CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(お客様一意照会) */
	private static final String TEMP_TEMPLATE_KEY_ECK0011A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_ECK0011A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 連絡先一覧照会 ■□ */
	/** テンプレートID(連絡先一覧照会) */
	private static final String TEMPLATE_ID_ECK0201B001 = "ECK0201B001";
	/** テンプレートID(連絡先一覧照会明細) */
	private static final String TEMPLATE_ID_ECK0201B001_DETAIL = ECK0201B001CBSMsg.ECK0201B001CBSMSG1LIST;
	/** IN項目リスト(連絡先一覧照会) */
	private static final List<String> IN_COLUMN_LIST_ECK0201B001 = Arrays.asList(ECK0201B001CBSMsg.KEY_SYSID, ECK0201B001CBSMsg.KEY_RRKS_CD,
			ECK0201B001CBSMsg.KEY_RRK_WAY_CD, ECK0201B001CBSMsg.KEY_RRKS_SBT_CD);
	/** 関連チェックエラー項目(連絡先一覧照会) */
	private static final String ERROR_COLUMN_ECK0201B001 = ECK0201B001CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(連絡先一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_ECK0201B001 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_ECK0201B001 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ サービス契約一覧照会(履歴) ■□ */
	/** テンプレートID(サービス契約一覧照会(履歴)) */
	private static final String TEMPLATE_ID_EKK0081B548 = "EKK0081B548";
	/** テンプレートID(サービス契約一覧照会(履歴)明細) */
	private static final String TEMPLATE_ID_EKK0081B548_DETAIL = EKK0081B548CBSMsg.EKK0081B548CBSMSG1LIST;
	/** IN項目リスト(サービス契約一覧照会(履歴)) */
	private static final List<String> IN_COLUMN_LIST_EKK0081B548 = Arrays.asList(EKK0081B548CBSMsg.KEY_SYSID,
			EKK0081B548CBSMsg.KEY_MSKM_DTL_NO);
	/** 関連チェックエラー項目(サービス契約一覧照会(履歴)) */
	private static final String ERROR_COLUMN_EKK0081B548 = EKK0081B548CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(サービス契約一覧照会(履歴)) */
	private static final String TEMP_TEMPLATE_KEY_EKK0081B548 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0081B548 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ サービス契約一意照会 ■□ */
	/** テンプレートID(サービス契約一意照会) */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** テンプレートID(サービス契約一意照会明細) */
	private static final String TEMPLATE_ID_EKK0081A010_DETAIL = EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST;
	/** IN項目リスト(サービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0081A010 = Arrays.asList(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, EKK0081A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(サービス契約一意照会) */
	private static final String ERROR_COLUMN_EKK0081A010 = EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(サービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0081A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0081A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ サービス契約回線内訳一覧照会 ■□ */
	/** テンプレートID(サービス契約回線内訳一覧照会（SYSID）2) */
	private static final String TEMPLATE_ID_EKK0241B001 = "EKK0241B001";
	/** テンプレートID(サービス契約回線内訳一覧照会（SYSID）2明細) */
	private static final String TEMPLATE_ID_EKK0241B001_DETAIL = EKK0241B001CBSMsg.EKK0241B001CBSMSG1LIST;
	/** IN項目リスト(サービス契約回線内訳一覧照会（SYSID）2) */
	private static final List<String> IN_COLUMN_LIST_EKK0241B001 = Arrays.asList(EKK0241B001CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目(サービス契約回線内訳一覧照会（SYSID）2) */
	private static final String ERROR_COLUMN_EKK0241B001 = EKK0241B001CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(サービス契約回線内訳一覧照会（SYSID）2) */
	private static final String TEMP_TEMPLATE_KEY_EKK0241B001 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0241B001 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ エラー項目ID ■□ */
	/** エラー項目ID：in_mskm_no_err */
	private static final String ERROR_ITEM_IN_MSKM_NO = "in_mskm_no_err";
	/** エラー項目ID：in_tel_no_err */
	private static final String ERROR_ITEM_IN_TEL_NO = "in_tel_no_err";
	/** エラー項目ID：mskm_no_not_found_err */
	private static final String ERROR_ITEM_MSKM_NO_NOT_FOUND = "mskm_no_not_found_err";
	/** エラー項目ID：tel_no_not_found_err */
	private static final String ERROR_ITEM_TEL_NO_NOT_FOUND = "tel_no_not_found_err";
	/** エラー項目ID：sysid_not_search_err */
	private static final String ERROR_ITEM_SYSID_NOT_SEARCH = "sysid_not_search_err";
	/** エラー項目ID：svc_kei_not_found_err */
	private static final String ERROR_ITEM_SVC_KEI_NOT_FOUND = "svc_kei_not_found_err";

	/* ■□ IN項目 ■□ */
	/** IN：申込番号 */
	private static final String IN_MSKM_NO = "in_mskm_no";
	/** IN：電話番号 */
	private static final String IN_TEL_NO = "in_tel_no";
	/** IN：口座振替受付画面遷移フラグ */
	private static final String IN_KOUFURI_TRANS_FLG = "in_koufuri_trans_flg";

	/* ■□ OUT項目 ■□ */
	/** OUT：SYSID */
	private static final String OUT_SYSID = "out_sysid";
	/** OUT：マンション物件番号 */
	private static final String OUT_MANSION_BUKKEN_NO = "out_mansion_bukken_no";
	/** OUT：契約者タイプコード */
	private static final String OUT_KEISHA_TYPE_CD = "out_keisha_type_cd";
	/** OUT：受付番号(申込書番号) */
	private static final String OUT_UK_NO = "out_uk_no";

	/* ■□ その他 ■□ */
	/** サービス契約ステータス：解約・キャンセル */
	private static final List<String> SVC_KEI_NG_STAT_LIST = Arrays.asList(JFUStrConst.CD00037_910, JFUStrConst.CD00037_920);
	/** 口座振替への画面遷移フラグ(口座振替からの戻りの処理) */
	private static final String KOUFURI_FLG_RET = "2";
	/** WORK：申込明細リスト */
	private static final String WORK_MSKM_DTL_LIST = "work_mskm_dtl_list";

	/**
	 * メイン処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap)param.getData(fixedText);
		String koufuriTransFlg = (String)inMap.get(IN_KOUFURI_TRANS_FLG);
		if (KOUFURI_FLG_RET.equals(koufuriTransFlg))
		{
			// 口座振替からの戻りの場合は処理しない
			return param;
		}

		// ●申込書番号(受付番号)、申込書明細番号(工事案件番号)の存在チェック
		chkMskmNo(handle, param, fixedText);

		// ●電話番号の紐付きチェック
		chkTelNo(handle, param, fixedText);

		return param;
	}

	/**
	 * チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドルo
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 申込書番号(受付番号)、申込書明細番号(工事案件番号)の存在チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void chkMskmNo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap)param.getData(fixedText);

		// 申込番号
		String inMskmNo = (String)inMap.get(IN_MSKM_NO);

		if(JFUBPCommon.isNull(inMskmNo))
		{
			// 申込番号が未設定
			setRelationErrorInfo(param, TEMPLATE_ID_EKK0021B504, ERROR_ITEM_IN_MSKM_NO, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
					String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}

		// ●EKK0021B504_申込書番号（申込書明細番号）存在チェック一覧参照
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EKK0021B504);
		// 上りマッピング
		setEKK0021B504(param, fixedText, inMskmNo);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0021B504, TEMPLATE_ID_EKK0021B504_DETAIL, IN_COLUMN_LIST_EKK0021B504,
				ERROR_COLUMN_EKK0021B504);
		// 結果取得
		List<HashMap> eKK0021B504List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0021B504),
				TEMPLATE_ID_EKK0021B504_DETAIL);

		// 結果チェック
		List<String> mskmDtlNoList = new ArrayList<String>();
		if(isNullForList(eKK0021B504List))
		{
			// ●EKU0091B020_申込明細_工事案件一覧照会（工事案件番号）
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKU0091B020);
			// 上りマッピング
			setEKU0091B020(param, fixedText, inMskmNo);
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKU0091B020, TEMPLATE_ID_EKU0091B020_DETAIL, IN_COLUMN_LIST_EKU0091B020,
					ERROR_COLUMN_EKU0091B020);
			// 結果取得
			List<HashMap> eKU0091B020List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKU0091B020),
					TEMPLATE_ID_EKU0091B020_DETAIL);

			if(isNullForList(eKU0091B020List))
			{
				// 結果なし
				setRelationErrorInfo(param, TEMPLATE_ID_EKK0021B504, ERROR_ITEM_MSKM_NO_NOT_FOUND, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
						String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			// 結果あり
			for (int i = 0; i < eKU0091B020List.size(); i++)
			{
				HashMap eKU0091B020Map = eKU0091B020List.get(i);
				if (!isNullForMapValue(eKU0091B020Map, EKU0091B020CBSMsg1List.MSKM_DTL_NO)
						&& !mskmDtlNoList.contains((String)eKU0091B020Map.get(EKU0091B020CBSMsg1List.MSKM_DTL_NO)))
				{
					mskmDtlNoList.add((String)eKU0091B020Map.get(EKU0091B020CBSMsg1List.MSKM_DTL_NO));
				}
			}
		}
		else
		{
			// 結果あり
			for (int i = 0; i < eKK0021B504List.size(); i++)
			{
				HashMap eKK0021B504Map = eKK0021B504List.get(i);
				if (!isNullForMapValue(eKK0021B504Map, EKK0021B504CBSMsg1List.MSKM_DTL_NO)
						&& !mskmDtlNoList.contains((String)eKK0021B504Map.get(EKK0021B504CBSMsg1List.MSKM_DTL_NO)))
				{
					mskmDtlNoList.add((String)eKK0021B504Map.get(EKK0021B504CBSMsg1List.MSKM_DTL_NO));
				}
			}
		}

		if(isNullForList(mskmDtlNoList))
		{
			// 結果なし
			setRelationErrorInfo(param, TEMPLATE_ID_EKK0021B504, ERROR_ITEM_MSKM_NO_NOT_FOUND, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
					String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}

		// 申込明細番号に紐付く申込明細情報を取得
		ArrayList<HashMap> mskmDtlList = new ArrayList<HashMap>();
		for (int i = 0; i < mskmDtlNoList.size(); i++)
		{
			String mskmDtlNo = mskmDtlNoList.get(i);

			// ●EKK0021A010_申込明細一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKK0021A010);
			// 上りマッピング
			setEKK0021A010(param, fixedText, mskmDtlNo);
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0021A010, TEMPLATE_ID_EKK0021A010_DETAIL, IN_COLUMN_LIST_EKK0021A010,
					ERROR_COLUMN_EKK0021A010);
			// 結果取得
			List<HashMap> eKK0021A010List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0021A010),
					TEMPLATE_ID_EKK0021A010_DETAIL);

			if(isNullForList(eKK0021A010List))
			{
				continue;
			}

			for (int j = 0; j < eKK0021A010List.size(); j++)
			{
				HashMap eKK0021A010Map = eKK0021A010List.get(j);

				if(eKK0021A010Map != null && eKK0021A010Map.size() > 0)
				{
					mskmDtlList.add(eKK0021A010Map);
				}
			}
		}

		// 申込明細リスト
		inMap.put(WORK_MSKM_DTL_LIST, mskmDtlList);
	}

	/**
	 * 電話番号の紐付きチェック処理です。
	 * 
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void chkTelNo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap)param.getData(fixedText);

		// 電話番号
		String inTelNo = (String)inMap.get(IN_TEL_NO);

		if(JFUBPCommon.isNull(inTelNo))
		{
			// 電話番号が未設定
			setRelationErrorInfo(param, TEMPLATE_ID_ECK0011A010, ERROR_ITEM_IN_TEL_NO, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
					String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}

		List<String> sysidList = new ArrayList<String>();
		List<String> telNoList = new ArrayList<String>();
		List<String> mansionBknNoList = new ArrayList<String>();

		// 申込明細リスト
		ArrayList<HashMap> mskmDtlList = (ArrayList<HashMap>)inMap.get(WORK_MSKM_DTL_LIST);

		// =======================================================
		// ★SYSIDチェック
		// =======================================================
		String sysid = JFUStrConst.EMPTY;
		for (int j = 0; j < mskmDtlList.size(); j++)
		{
			HashMap mskmDtlMap = mskmDtlList.get(j);

			if(!isNullForMapValue(mskmDtlMap, EKK0021A010CBSMsg1List.SYSID)
					&& !sysidList.contains((String)mskmDtlMap.get(EKK0021A010CBSMsg1List.SYSID)))
			{
				// SYSIDリストに格納
				sysidList.add((String)mskmDtlMap.get(EKK0021A010CBSMsg1List.SYSID));
			}
		}

		if(sysidList == null || sysidList.size() == 0 || sysidList.size() > 1)
		{
			// SYSIDが取得できない、または、SYSIDが複数存在する
			setRelationErrorInfo(param, TEMPLATE_ID_EKK0021A010, ERROR_ITEM_SYSID_NOT_SEARCH, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
					String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}
		else
		{
			// SYSIDを特定
			sysid = sysidList.get(0);
		}

		// =======================================================
		// ★契約者電話番号を取得
		// =======================================================
		String keishaTypeCd = JFUStrConst.EMPTY;
		// ●ECK0011A010_お客様一意照会
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_ECK0011A010);
		// 上りマッピング
		setECK0011A010(param, fixedText, sysid);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_ECK0011A010, TEMPLATE_ID_ECK0011A010_DETAIL, IN_COLUMN_LIST_ECK0011A010,
				ERROR_COLUMN_ECK0011A010);
		// 結果取得
		List<HashMap> eCK0011A010List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_ECK0011A010),
				TEMPLATE_ID_ECK0011A010_DETAIL);

		if(!isNullForList(eCK0011A010List))
		{
			for (int i = 0; i < eCK0011A010List.size(); i++)
			{
				HashMap eCK0011A010Map = eCK0011A010List.get(i);

				if(!isNullForMapValue(eCK0011A010Map, ECK0011A010CBSMsg1List.KEISHA_TELNO)
						&& !telNoList.contains((String)eCK0011A010Map.get(ECK0011A010CBSMsg1List.KEISHA_TELNO)))
				{
					// 契約者電話番号を格納
					telNoList.add((String)eCK0011A010Map.get(ECK0011A010CBSMsg1List.KEISHA_TELNO));
				}

				if(!isNullForMapValue(eCK0011A010Map, ECK0011A010CBSMsg1List.KEISHA_TYPE_CD))
				{
					// 契約者タイプコード
					keishaTypeCd = (String)eCK0011A010Map.get(ECK0011A010CBSMsg1List.KEISHA_TYPE_CD);
				}
			}
		}

		// =======================================================
		// ★連絡先電話番号を取得
		// =======================================================
		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_ECK0201B001);
		// 上りマッピング
		setECK0201B001(param, fixedText, sysid);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_ECK0201B001, TEMPLATE_ID_ECK0201B001_DETAIL, IN_COLUMN_LIST_ECK0201B001,
				ERROR_COLUMN_ECK0201B001);
		// 結果取得
		List<HashMap> eCK0201B001List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_ECK0201B001),
				TEMPLATE_ID_ECK0201B001_DETAIL);

		if(!isNullForList(eCK0201B001List))
		{
			for (int i = 0; i < eCK0201B001List.size(); i++)
			{
				HashMap eCK0201B001Map = eCK0201B001List.get(i);

				if(!isNullForMapValue(eCK0201B001Map, ECK0201B001CBSMsg1List.TELNO)
						&& JFUStrConst.CD00871_0.equals(eCK0201B001Map.get(ECK0201B001CBSMsg1List.RRKS_BUNRUI_CD))
						&& !telNoList.contains((String)eCK0201B001Map.get(ECK0201B001CBSMsg1List.TELNO)))
				{
					// 連絡先電話番号を格納
					telNoList.add((String)eCK0201B001Map.get(ECK0201B001CBSMsg1List.TELNO));
				}
			}
		}

		// =======================================================
		// ★申込書番号または申込書明細番号に紐付く回線電話番号を取得
		// =======================================================
		// ●申込書番号に紐付くサービス契約情報リストを取得
		ArrayList<HashMap> mskmSvcKeiList = getMskmSvcKeiList(handle, param, fixedText, mskmDtlList);

		if(isNullForList(mskmSvcKeiList))
		{
			// サービス契約情報なしエラー
			setRelationErrorInfo(param, TEMPLATE_ID_EKK0081A010, ERROR_ITEM_SVC_KEI_NOT_FOUND, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)),
					String.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}

		for (int n = 0; n < mskmSvcKeiList.size(); n++)
		{
			HashMap mskmSvcKeiMap = mskmSvcKeiList.get(n);

			if(isNullForMapValue(mskmSvcKeiMap, EKK0081A010CBSMsg1List.SVC_KEI_NO))
			{
				continue;
			}

			// ●EKK0241B001_サービス契約回線内訳一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKK0241B001);
			// 上りマッピング
			setEKK0241B001(param, fixedText, (String)mskmSvcKeiMap.get(EKK0081A010CBSMsg1List.SVC_KEI_NO));
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0241B001, TEMPLATE_ID_EKK0241B001_DETAIL, IN_COLUMN_LIST_EKK0241B001,
					ERROR_COLUMN_EKK0241B001);
			// 結果取得
			List<HashMap> eKK0241B001List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0241B001),
					TEMPLATE_ID_EKK0241B001_DETAIL);

			if(!isNullForList(eKK0241B001List))
			{
				for (int m = 0; m < eKK0241B001List.size(); m++)
				{
					HashMap eKK0241B001Map = eKK0241B001List.get(m);

					if(!isNullForMapValue(eKK0241B001Map, EKK0241B001CBSMsg1List.KAISEN_PLACE_TELNO)
							&& !telNoList.contains((String)eKK0241B001Map.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_TELNO)))
					{
						// 回線場所電話番号を格納
						telNoList.add((String)eKK0241B001Map.get(EKK0241B001CBSMsg1List.KAISEN_PLACE_TELNO));
					}

					if(!isNullForMapValue(eKK0241B001Map, EKK0241B001CBSMsg1List.MANSION_BUKKEN_NO)
							&& !mansionBknNoList.contains((String)eKK0241B001Map.get(EKK0241B001CBSMsg1List.MANSION_BUKKEN_NO)))
					{
						// マンション物件番号を格納
						mansionBknNoList.add((String)eKK0241B001Map.get(EKK0241B001CBSMsg1List.MANSION_BUKKEN_NO));
					}
				}
			}
		}

		// =======================================================
		// ★電話番号存在チェック
		// =======================================================
		if(telNoList == null || telNoList.size() == 0 || !telNoList.contains(inTelNo))
		{
			// 電話番号が取得できていない、または、取得した電話番号に含まれない
			setRelationErrorInfo(param, TEMPLATE_ID_ECK0011A010, ERROR_ITEM_TEL_NO_NOT_FOUND, fixedText);
			throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
					.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
		}

		// =======================================================
		// ★受付番号(申込書番号)取得
		// =======================================================
		String netMskmshoNo = JFUStrConst.EMPTY;
		String telMskmshoNo = JFUStrConst.EMPTY;
		String tvMskmshoNo = JFUStrConst.EMPTY;
		String outMskmshoNo = JFUStrConst.EMPTY;
		if(!isNullForList(mskmSvcKeiList))
		{
			for (int n = 0; n < mskmSvcKeiList.size(); n++)
			{
				HashMap mskmSvcKeiMap = mskmSvcKeiList.get(n);

				if(mskmSvcKeiMap == null || mskmSvcKeiMap.size() == 0)
				{
					continue;
				}

				// 料金グループコード
				String prcGrpCd = (String)mskmSvcKeiMap.get(EKK0081A010CBSMsg1List.PRC_GRP_CD);
				// 受付番号(申込書番号)
				String mskmshoNo = (String)mskmSvcKeiMap.get(EKK0021A010CBSMsg1List.MSKMSHO_NO);

				if(JFUStrConst.CD00133_02.equals(prcGrpCd) || JFUStrConst.CD00133_03.equals(prcGrpCd) || JFUStrConst.CD00133_04.equals(prcGrpCd))
				{
					// ネット
					netMskmshoNo = mskmshoNo;
				}
				else if(JFUStrConst.CD00133_10.equals(prcGrpCd))
				{
					// 電話
					telMskmshoNo = mskmshoNo;
				}
				else if(JFUStrConst.CD00133_11.equals(prcGrpCd) || JFUStrConst.CD00133_12.equals(prcGrpCd) || JFUStrConst.CD00133_13.equals(prcGrpCd))
				{
					// テレビ
					tvMskmshoNo = mskmshoNo;
				}
			}

			// ネット、電話、テレビの順で受付番号(申込書番号)を取得する
			if(!JFUBPCommon.isNull(netMskmshoNo))
			{
				// ネット
				outMskmshoNo = netMskmshoNo;
			}
			else if(!JFUBPCommon.isNull(telMskmshoNo))
			{
				// 電話
				outMskmshoNo = telMskmshoNo;
			}
			else if(!JFUBPCommon.isNull(tvMskmshoNo))
			{
				// テレビ
				outMskmshoNo = tvMskmshoNo;
			}
			else
			{
				// 上記以外
				outMskmshoNo = JFUStrConst.EMPTY;
			}
		}

		// =======================================================
		// ★アウトプット設定
		// =======================================================
		// SYSID
		inMap.put(OUT_SYSID, sysid);
		// 契約者タイプコード
		inMap.put(OUT_KEISHA_TYPE_CD, keishaTypeCd);
		// 受付番号(申込書番号)
		inMap.put(OUT_UK_NO, outMskmshoNo);

		// マンション物件番号
		if(!isNullForList(mansionBknNoList))
		{
			inMap.put(OUT_MANSION_BUKKEN_NO, mansionBknNoList.get(0));
		}
		else
		{
			inMap.put(OUT_MANSION_BUKKEN_NO, JFUStrConst.EMPTY);
		}
	}

	/**
	 * 申込書番号に紐付くサービス契約リストを取得します。
	 * 
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param mskmDtlList
	 * @return サービス契約リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap> getMskmSvcKeiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList mskmDtlList) throws Exception
	{
		HashMap<String, Object> inMap = (HashMap)param.getData(fixedText);

		ArrayList<HashMap> svcKeiInfoList = new ArrayList<HashMap>();

		for (int i = 0; i < mskmDtlList.size(); i++)
		{
			HashMap mskmDtlMap = (HashMap)mskmDtlList.get(i);

			// SYSID
			String sysid = (String)mskmDtlMap.get(EKK0021A010CBSMsg1List.SYSID);
			// 申込明細番号
			String mskmDtlNo = (String)mskmDtlMap.get(EKK0021A010CBSMsg1List.MSKM_DTL_NO);
			// 受付番号(申込書番号)
			String mskmshoNo = (String)mskmDtlMap.get(EKK0021A010CBSMsg1List.MSKMSHO_NO);

			// ●EKK0081B548_サービス契約一覧照会(履歴)
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKK0081B548);
			// 上りマッピング
			setEKK0081B548(param, fixedText, sysid, mskmDtlNo);
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0081B548, TEMPLATE_ID_EKK0081B548_DETAIL, IN_COLUMN_LIST_EKK0081B548,
					ERROR_COLUMN_EKK0081B548);
			// 結果取得
			List<HashMap> eKK0081B548List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0081B548),
						TEMPLATE_ID_EKK0081B548_DETAIL);

			if(isNullForList(eKK0081B548List))
			{
				continue;
			}

			// カレント情報取得
			for (int j = 0; j < eKK0081B548List.size(); j++)
			{
				HashMap eKK0081B548Map = eKK0081B548List.get(j);

				if(isNullForMapValue(eKK0081B548Map, EKK0081B548CBSMsg1List.SVC_KEI_NO))
				{
					continue;
				}

				// ●EKK0081A010_サービス契約一意照会
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_EKK0081A010);
				// 上りマッピング
				setEKK0081A010(param, fixedText, (String)eKK0081B548Map.get(EKK0081B548CBSMsg1List.SVC_KEI_NO));
				//検索エラーなし設定
				ignoreSearchError(param, fixedText);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0081A010, TEMPLATE_ID_EKK0081A010_DETAIL, IN_COLUMN_LIST_EKK0081A010,
						ERROR_COLUMN_EKK0081A010);
				// 結果取得
				List<HashMap> eKK0081A010List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0081A010),
							TEMPLATE_ID_EKK0081A010_DETAIL);

				if(isNullForList(eKK0081A010List))
				{
					continue;
				}

				for (int k = 0; k < eKK0081A010List.size(); k++)
				{
					HashMap eKK0081A010Map = eKK0081A010List.get(k);

					if(isNullForMapValue(eKK0081A010Map, EKK0081A010CBSMsg1List.SYSID))
					{
						continue;
					}

					if(!sysid.equals(eKK0081A010Map.get(EKK0081A010CBSMsg1List.SYSID)))
					{
						// SYSIDが異なるものは除外する
						continue;
					}

					if(SVC_KEI_NG_STAT_LIST.contains(eKK0081A010Map.get(EKK0081A010CBSMsg1List.SVC_KEI_STAT)))
					{
						// 910、920は除外する
						continue;
					}

					// 受付番号(申込書番号)を格納
					eKK0081A010Map.put(EKK0021A010CBSMsg1List.MSKMSHO_NO, mskmshoNo);

					svcKeiInfoList.add(eKK0081A010Map);
				}
			}
		}

		return svcKeiInfoList;
	}

	/**
	 * 申込書番号（申込書明細番号）存在チェック一覧参照の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param mskmNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0021B504(IRequestParameterReadWrite param, String fixedText, String mskmNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿申込書番号
		inMap.put(EKK0021B504CBSMsg.KEY_MSKMSHO_NO, mskmNo);
	}

	/**
	 * 申込明細_工事案件一覧照会（工事案件番号）の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param mskmNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKU0091B020(IRequestParameterReadWrite param, String fixedText, String mskmNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿申込書番号
		inMap.put(EKU0091B020CBSMsg.KEY_KOJIAK_NO, mskmNo);
	}

	/**
	 * 申込明細一意照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param mskmDtlNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0021A010(IRequestParameterReadWrite param, String fixedText, String mskmDtlNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿申込明細番号
		inMap.put(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, mskmDtlNo);
	}

	/**
	 * お客様一意照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param sysid
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setECK0011A010(IRequestParameterReadWrite param, String fixedText, String sysid) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿SYSID
		inMap.put(ECK0011A010CBSMsg.KEY_SYSID, sysid);
		// ＫＥＹ＿予約適用年月日
		inMap.put(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 連絡先一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param sysid
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setECK0201B001(IRequestParameterReadWrite param, String fixedText, String sysid) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿SYSID
		inMap.put(ECK0201B001CBSMsg.KEY_SYSID, sysid);
		// ＫＥＹ＿連絡方法コード
		inMap.put(ECK0201B001CBSMsg.KEY_RRK_WAY_CD, JFUStrConst.CD00790_003);
		// ＫＥＹ＿連絡先種別コード
		inMap.put(ECK0201B001CBSMsg.KEY_RRKS_SBT_CD, JFUStrConst.CD00254_2);
	}

	/**
	 * サービス契約一覧照会(履歴)の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param sysid
	 * @param mskmDtlNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0081B548(IRequestParameterReadWrite param, String fixedText, String sysid, String mskmDtlNo)
		throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿SYSID
		inMap.put(EKK0081B548CBSMsg.KEY_SYSID, sysid);
		// ＫＥＹ＿申込明細番号
		inMap.put(EKK0081B548CBSMsg.KEY_MSKM_DTL_NO, mskmDtlNo);
	}

	/**
	 * サービス契約一意照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param svcKeiNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0081A010(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * サービス契約回線内訳一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param svcKeiNo
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0241B001(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿SYSID
		inMap.put(EKK0241B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * リストのNULLチェック処理です。
	 * 
	 * <br>
	 * @param list リスト
	 * @return true:NULLまたは空 / false:値あり
	 */
	@SuppressWarnings("unchecked")
	private boolean isNullForList(List list)
	{
		boolean result = false;

		if(list == null || list.size() == 0)
		{
			// リストがNULLまたは空
			result = true;
		}

		return result;
	}

	/**
	 * マップ値のNULLチェック処理です。
	 * 
	 * <br>
	 * @param map マップ
	 * @param itemNm 項目名
	 * @return true:NULLまたは空 / false:値あり
	 */
	@SuppressWarnings("unchecked")
	private boolean isNullForMapValue(HashMap map, String itemNm)
	{
		boolean result = true;

		if (map != null && map.containsKey(itemNm) && !JFUBPCommon.isNull(map.get(itemNm)))
		{
			// マップがNULL以外、マップに指定キーが存在する、値がNULLまたは空でない
			result = false;
		}

		return result;
	}
}
