/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKFamipaRelationalCheckCC
*   ソースファイル名：JKKFamipaRelationalCheckCC.java
*   作成者          ：富士通
*   日付            ：2013年01月12日
*＜機能概要＞
*   ファミリーパック関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2013/01/12   FJ          新規作成 ST2-2013-0000082
*   
**********************************************************************/
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 com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JKKFamiilyPackConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0251B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B008CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B509CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2091B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2091B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2101B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2101B001CBSMsg1List;

/**
 * ファミリーパック関連チェックコモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKFamipaRelCheckCC extends JKKBaseNetChgRelCheckCC
{

	/** フロント用サービスID */
	private static final String FU_SVC_ID = "FUSV";

	/** IN項目:サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** IN項目:料金コースコード */
	private static final String IN_PARAM_KEY_PCRS_CD = "key_pcrs_cd";

	/* ===== 最大契約数チェック ===== */
	/* ■□ 割引サービス一意照会SC ■□ */
	/** テンプレートID(割引サービス一意照会) */
	private static final String TEMPLATE_ID_3 = "EKK0841A010";
	/** テンプレートID(割引サービス一意照会明細) */
	private static final String TEMPLATE_ID_3_DETAIL = EKK0841A010CBSMsg.EKK0841A010CBSMSG1LIST;
	/** IN項目リスト(割引サービス一意照会) */
	private static final List<String> IN_COLUMN_LIST_3 =
			Arrays.asList(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, EKK0841A010CBSMsg.KEY_GENE_ADD_DTM, EKK0841A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(割引サービス一意照会) */
	private static final String ERROR_COLUMN_3 = EKK0841A010CBSMsg.KEY_WRIB_SVC_CD_ERR;
	/** SC実行結果取得キー(割引サービス一意照会) */
	private static final String TEMP_TEMPLATE_KEY_3 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_3 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 割引サービス契約(予約とカレント件数)一覧照会SC ■□ */
	/** テンプレートID(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final String TEMPLATE_ID_4 = "EKK0451B506";
	/** テンプレートID(割引サービス契約(予約とカレント件数)一覧照会明細) */
	private static final String TEMPLATE_ID_4_DETAIL = EKK0451B506CBSMsg.EKK0451B506CBSMSG1LIST;
	/** IN項目リスト(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final List<String> IN_COLUMN_LIST_4 =
			Arrays.asList(EKK0451B506CBSMsg.KEY_SYSID, EKK0451B506CBSMsg.KEY_SVC_KEI_NO, EKK0451B506CBSMsg.KEY_WRIB_SVC_CD);
	/** 関連チェックエラー項目(割引サービス契約(予約とカレント件数)一覧照会)(契約数超過) */
	private static final String ERROR_COLUMN_4_MAX_CNT = "max_kei_cnt_err";
	/** 関連チェックエラー項目(割引サービス契約(予約とカレント件数)一覧照会)(契約済) */
	private static final String ERROR_COLUMN_4_KEI_SUMI = "kei_sumi_err";
	/** SC実行結果取得キー(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_4 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_4 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ===== メール予約中チェック ===== */
	/* ■□ オプションサービス契約(予約件数)一覧照会SC ■□ */
	/** テンプレートID(オプションサービス契約(予約件数)一覧照会) */
	private static final String TEMPLATE_ID_5 = "EKK0351B509";
	/** テンプレートID(オプションサービス契約(予約件数)一覧照会明細) */
	private static final String TEMPLATE_ID_5_DETAIL = EKK0351B509CBSMsg.EKK0351B509CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約(予約件数)一覧照会) */
	private static final List<String> IN_COLUMN_LIST_5 = Arrays.asList(EKK0351B509CBSMsg.KEY_SVC_KEI_NO, EKK0351B509CBSMsg.KEY_OP_SVC_CD);
	/** 関連チェックエラー項目(オプションサービス契約(予約件数)一覧照会) */
	private static final String ERROR_COLUMN_5 = "mail_rsv_err";
	/** SC実行結果取得キー(オプションサービス契約(予約件数)一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_5 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_5 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 機器提供サービス契約一覧照会SC ■□ */
	/** テンプレートID(機器提供サービス契約一覧照会) */
	private static final String TEMPLATE_ID_6 = "EKK0341B008";
	/** テンプレートID(機器提供サービス契約一覧照会明細) */
	private static final String TEMPLATE_ID_6_DETAIL = EKK0341B008CBSMsg.EKK0341B008CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一覧照会) */
	private static final List<String> IN_COLUMN_LIST_6 = Arrays.asList(EKK0341B008CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目(機器提供サービス契約一覧照会) */
	private static final String ERROR_COLUMN_6 = EKK0341B008CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(機器提供サービス契約一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_6 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_6 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 異動予約一覧照会SC ■□ */
	/** テンプレートID(異動予約一覧照会) */
	private static final String TEMPLATE_ID_7 = "EKK1681B001";
	/** テンプレートID(異動予約一覧照会明細) */
	private static final String TEMPLATE_ID_7_DETAIL = EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST;
	/** IN項目リスト(異動予約一覧照会) */
	private static final List<String> IN_COLUMN_LIST_7 =
			Arrays.asList(EKK1681B001CBSMsg.KEY_IDO_DIV, EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, EKK1681B001CBSMsg.KEY_RSV_APLY_YMD,
					EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, EKK1681B001CBSMsg.KEY_SYSID,
					EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO,
					EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_KOJIAK_NO, EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, EKK1681B001CBSMsg.KEY_SORT_KBN);
	/** 関連チェックエラー項目(異動予約一覧照会) */
	private static final String ERROR_COLUMN_7 = "pcrs_chg_incomp_err";
	/** SC実行結果取得キー(異動予約一覧照会)(プラン変更中チェック) */
	private static final String TEMP_TEMPLATE_KEY_7_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_7 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/** ファミリーパック契約上限 */
	private static final int FAMIPA_LIMIT = 1;
	
	/** 機器提供サービスコード：ＢＢＲ */
	private static final String KKTK_SVC_CD_BBR = "C014";
	
	/**
	 * ファミリーパック関連チェック実行処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite executeCheck(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		try
		{
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			// IN項目:料金コースコード 
			String inParamPcrsCd = (String)inMap.get(IN_PARAM_KEY_PCRS_CD);
			// IN項目:サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);

			/* ■□ 最大契約数チェック処理@ ■□ */
			// ●割引サービス一意照会
			// 上りマッピング
			setInMapWribSvcUniqueSearch(param, fixedText, JKKFamiilyPackConst.KK0841_WRIB_SVC_CD_FAMIPA);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_3, TEMPLATE_ID_3_DETAIL, IN_COLUMN_LIST_3, ERROR_COLUMN_3);

			// 上限適用回数
			String upplAplycntStr = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_3, TEMPLATE_ID_3_DETAIL, EKK0841A010CBSMsg1List.UPPL_APLY_CNT, 0);

			// 上限適用回数設定有
			if (!JKKBPActCommon.isNull(upplAplycntStr))
			{
				// 上限適用回数
				int upplAplyCnt = Integer.parseInt(upplAplycntStr);

				// ●割引サービス契約(予約とカレント件数)一覧照会(SYSID)
				// 上りマッピング
				setInMapWribSvcKeiCntSearch(param, fixedText, JPCModelConstant.FUNC_CD_1);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_4, TEMPLATE_ID_4_DETAIL, IN_COLUMN_LIST_4, ERROR_COLUMN_4_MAX_CNT);

				// 契約数
				int contCnt =
						Integer.parseInt(getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_4), TEMPLATE_ID_4_DETAIL,
								EKK0451B506CBSMsg1List.CNT, 0));

				// 契約数上限チェック
				if (contCnt >= upplAplyCnt)
				{
					// 最大契約数超過エラー
					setRelationErrorInfo(param, TEMPLATE_ID_4, ERROR_COLUMN_4_MAX_CNT, fixedText);
					throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
							.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
				}
			}

			/* ■□ 契約済チェック処理D ■□ */
			// ●割引サービス契約(予約とカレント件数)一覧照会
			// 上りマッピング
			setInMapWribSvcKeiCntSearch(param, fixedText, JPCModelConstant.FUNC_CD_2);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_4, TEMPLATE_ID_4_DETAIL, IN_COLUMN_LIST_4, ERROR_COLUMN_4_KEI_SUMI);

			// 契約数
			int contSumiCnt =
					Integer.parseInt(getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_4), TEMPLATE_ID_4_DETAIL,
							EKK0451B506CBSMsg1List.CNT, 0));

			// 契約済チェック
			if (FAMIPA_LIMIT <= contSumiCnt)
			{
				// 契約済みエラー
				setRelationErrorInfo(param, TEMPLATE_ID_4, ERROR_COLUMN_4_KEI_SUMI, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

			/* ■□ メール予約中チェック処理A ■□ */
			// ●オプションサービス契約(予約件数)一覧照会
			// 上りマッピング
			setInMapOpSvcRsvCntSearch(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_5, TEMPLATE_ID_5_DETAIL, IN_COLUMN_LIST_5, ERROR_COLUMN_5);
			// メール予約中チェック
			if (Integer.parseInt(getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_5, TEMPLATE_ID_5_DETAIL, EKK0451B506CBSMsg1List.CNT, 0)) > 0)
			{
				// メール予約中エラー
				setRelationErrorInfo(param, TEMPLATE_ID_5, ERROR_COLUMN_5, fixedText);
				throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
						.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
			}

//			/* ■□ 工事未完了チェック(ファミリーパック) ■□ */
//			executeUnderConstructionChkFp(handle, param, fixedText);
//			/* ■□ プラン変更収容替工事依頼の追加ルータ出荷指図済みチェック ■□ */
//			setInMapRouterDirectionsCheck(param, fixedText, inParamPcrsCd, inParamSvcKeiNo);
//			executeRouterDirectionsCheck(handle, param, fixedText);

			// ●フロント(ネット変更)の場合
			if (!JKKBPActCommon.isNull(param.getUsecaseID()) && param.getUsecaseID().startsWith(FU_SVC_ID))
			{
				// ●機器提供サービス契約一覧照会
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_6);
				// 検索エラーなし設定 
				ignoreSearchError(param, fixedText);
				// 上りマッピング
				setInMapKktkSvcKeiSearch(param, fixedText, inParamSvcKeiNo);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_6, TEMPLATE_ID_6_DETAIL, IN_COLUMN_LIST_6, ERROR_COLUMN_6);
				List<HashMap> kktkSvcKeiList = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_6), TEMPLATE_ID_6_DETAIL);

				String targetMskmDtlNo = null;

				// 機器提供サービス契約（ルータ）取得
				for (HashMap kktkSvcKeiMap : kktkSvcKeiList)
				{
					String targetKktkSvcCd = (String)kktkSvcKeiMap.get(EKK0341B008CBSMsg1List.KKTK_SVC_CD);

					// 予約手続中のルーターが存在する場合、申込明細番号取得
					if (JKKFamiilyPackConst.KK0771_KKTK_SVC_CD_C014.equals(targetKktkSvcCd))
					{
						String targetRsvAplyCd = (String)kktkSvcKeiMap.get(EKK0341B008CBSMsg1List.RSV_APLY_CD);

						if (JKKFamiilyPackConst.CD00343_1.equals(targetRsvAplyCd))
						{
							targetMskmDtlNo = (String)kktkSvcKeiMap.get(EKK0341B008CBSMsg1List.MSKM_DTL_NO);
							break;
						}
					}

				}

				// ●異動予約一覧照会
				if (!JKKBPActCommon.isNull(targetMskmDtlNo))
				{
					// ユーザデータ初期化
					initData(param, fixedText, IN_COLUMN_LIST_7);
					// 検索エラーなし設定 
					ignoreSearchError(param, fixedText);
					// 上りマッピング
					setInMapIdoRsvSearchCeck(param, fixedText, targetMskmDtlNo, JKKFamiilyPackConst.CD00576_00009, JKKFamiilyPackConst.CD01167_003);
					// サービスIF実行
					executeSC(handle, param, fixedText, TEMPLATE_ID_7, TEMPLATE_ID_7_DETAIL, IN_COLUMN_LIST_7, ERROR_COLUMN_7);
					
					// プラン変更の異動予約が存在する場合
					if (isExistsTemplateDetail(inMap, TEMP_TEMPLATE_KEY_7_1, TEMPLATE_ID_7_DETAIL))
					{
						// ルータ申し込み予約中チェック
						super.executeRouterRsvCheck(handle, param, fixedText);
					}
				}
			}
			
			// ファミリーパック割引登録チェック
			HashMap<String, String> errInfo = new HashMap<String, String>();
			boolean errFlg = chkRootaAddMod(handle, param, inMap, fixedText, inParamSvcKeiNo);
			errInfo.put("FamilyPackErrFlg", !errFlg ? "ルータエラー" : "");
			param.setData("KKSV023804CC", errInfo);
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}
	
	/**
	 * デバッグログを出力します。<BR>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	@SuppressWarnings("static-access")
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JKKFamipaRelCheckCC：log；" + dumpObj, null, null, null);
	}
	
	/**
	 * ファミリーパック割引登録チェック
	 * ベーシックルータが既に住変工事の移動機器として登録されている場合,エラー.
	 * 
	 * @param  handle
	 * @param  param
	 * @param  inMap
	 * @param  fixedText
	 * @param  svcKeiNo
	 * @return true：正常、false：エラー
	 * @throws Exception 
	 */
	private boolean chkRootaAddMod(SessionHandle handle,
										IRequestParameterReadWrite param,
										HashMap inMap,
										String fixedText,
										String svcKeiNo) throws Exception {
		
		printlnEjbLog("chkRootaAddMod_start");
		
		// 住所変更番号特定
		List<String> addChgNoList  = retAddChgNo(handle, param, inMap, fixedText, svcKeiNo);
		if (addChgNoList == null || addChgNoList.size() == 0) {
			// そもそも[住所変更番号]が特定不可時は,チェックOK
			printlnEjbLog("[住所変更番号]が特定不可：true");
			printlnEjbLog("chkRootaAddMod_end");
			return true;
		}
		// 変更対象契約番号特定
		List<String> kkTkSvcNoList = retKkTkSvcKeiNo(handle, param, inMap, fixedText, svcKeiNo);
		if (kkTkSvcNoList == null || kkTkSvcNoList.size() == 0) {
			// そもそも[変更対象契約番号]が特定不可時は,チェックOK
			printlnEjbLog("[変更対象契約番号]が特定不可：true");
			printlnEjbLog("chkRootaAddMod_end");
			return true;
		}
		
		// チェック処理
		for (String addChgNo : addChgNoList) {
			List<HashMap> ekk2101B001List = execEkk2101B001(handle, param, inMap, fixedText, addChgNo);
			if (ekk2101B001List == null || ekk2101B001List.size() == 0) {
				continue;
			}
			
			// [KK2101_住所変更明細一覧]件数分
			for (HashMap ekk2101B001Map : ekk2101B001List) {
				
				// [KK2101_変更対象契約番号]取得
				String chgTgKeiNo = (String) ekk2101B001Map.get(EKK2101B001CBSMsg1List.CHG_TG_KEI_NO);
				if (JKKStringUtil.isNullBlank(chgTgKeiNo)) {
					continue;
				}
				
				// [KK0341_機器提供サービス契約番号]件数分
				for (String kkTkSvcNo : kkTkSvcNoList) {
					if (chgTgKeiNo.equals(kkTkSvcNo)) {
						
						// [KK2101_変更前識別番号][KK2101_変更後識別番号]取得
						String chbfSkbtNo = (String) ekk2101B001Map.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
						String chafSkbtNo = (String) ekk2101B001Map.get(EKK2101B001CBSMsg1List.CHAF_SKBT_NO);
						
						if (!JKKStringUtil.isNullBlank(chbfSkbtNo) && !JKKStringUtil.isNullBlank(chafSkbtNo)) {
							// [KK2101_変更対象契約番号]と[KK0341_機器提供サービス契約番号]
							// が一致する場合,エラー.
							printlnEjbLog("[KK2101_変更対象契約番号]と[KK0341_機器提供サービス契約番号]が一致：false");
							printlnEjbLog("chkRootaAddMod_end");
							return false;
						}
					}
				}
			}
		}
		printlnEjbLog("正常終了：true");
		printlnEjbLog("chkRootaAddMod_end");
		return true;
	}
	
	/**
	 * サービス契約番号に紐づく,[住所変更番号]を取得して返却する.
	 * 
	 * @param  handle
	 * @param  param
	 * @param  inMap
	 * @param  fixedText
	 * @param  svcKeiNo
	 * @throws Exception 
	 */
	private List<String> retAddChgNo(SessionHandle handle,
										IRequestParameterReadWrite param,
										HashMap inMap,
										String fixedText,
										String svcKeiNo) throws Exception {
		
		printlnEjbLog("retAddChgNo_start");
		
		// 住所変更ステータス：登録済
		final String stat001 = "001";
		
		List<String> ret = new ArrayList<String>();
		
		// EKK0251B001：回線対象サービス契約一覧照会
		List<HashMap> ekk0251B001List = execEkk0251B001(handle, param, inMap, fixedText, svcKeiNo);
		if (ekk0251B001List == null || ekk0251B001List.size() == 0) {
			return null;
		}
		for (HashMap ekk0251B001Map : ekk0251B001List) {
			
			String svcKeiKaisenUcwkNo = (String) ekk0251B001Map.get(EKK0251B001CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO);
			
			// サービス契約回線内訳番号が,[null]又は[空白]時は処理しない.
			if (JKKStringUtil.isNullBlank(svcKeiKaisenUcwkNo)) {
				continue;
			}
			
			// EKK2091B001：住所変更一覧照会照会
			List<HashMap> ekk2091B001List = execEkk2091B001(handle, param, inMap, fixedText, svcKeiKaisenUcwkNo);
			if (ekk2091B001List == null || ekk2091B001List.size() == 0) {
				continue;
			}
			for (HashMap ekk2091B001Map : ekk2091B001List) {
				
				String adchgNo = (String) ekk2091B001Map.get(EKK2091B001CBSMsg1List.ADCHG_NO);
				String addStat = (String) ekk2091B001Map.get(EKK2091B001CBSMsg1List.ADCHG_STAT);
				
				// 住所変更番号が,[null]又は[空白]時は処理しない.
				// 住所変更ステータスが,[001：登録済]以外は処理しない.
				if (JKKStringUtil.isNullBlank(adchgNo) || !stat001.equals(addStat)) {
					continue;
				}
				
				// [住所変更番号]設定
				ret.add(adchgNo);
			}
		}
		printlnEjbLog("retAddChgNo_end");
		return ret;
	}
	
	/**
	 * サービス契約番号に紐づく,[機器提供サービス契約番号]を取得して返却する.
	 * 
	 * @param  handle
	 * @param  param
	 * @param  inMap
	 * @param  fixedText
	 * @param  svcKeiNo
	 * @throws Exception 
	 */
	private List<String> retKkTkSvcKeiNo(SessionHandle handle,
											IRequestParameterReadWrite param,
											HashMap inMap,
											String fixedText,
											String svcKeiNo) throws Exception {
		
		printlnEjbLog("retKkTkSvcKeiNo_start");
		
		List<String> ret = new ArrayList<String>();
		
		// EKK0341B002：機器提供サービス契約照会
		List<HashMap> ekk0341B002List = execEkk0341B002(handle, param, inMap, fixedText, svcKeiNo);
		if (ekk0341B002List == null || ekk0341B002List.size() == 0) {
			return null;
		}
		for (HashMap ekk0341B002Map : ekk0341B002List) {
			
			String kkTkSvcKeiNo = (String) ekk0341B002Map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO);
			
			// 機器提供サービス契約番号が,[null]又は[空白]時は処理しない.
			if (JKKStringUtil.isNullBlank(kkTkSvcKeiNo)) {
				continue;
			}
			
			// [機器提供サービス契約番号]設定
			ret.add(kkTkSvcKeiNo);
		}
		printlnEjbLog("retKkTkSvcKeiNo_end");
		return ret;
	}
	
	/**
	 * EKK0341B002：機器提供サービス契約照会
	 * 
	 * @param  handle
	 * @param  param
	 * @param  inMap
	 * @param  fixedText
	 * @param  svcKeiNo
	 * @return 
	 * @throws Exception 
	 */
	private List<HashMap> execEkk0341B002(SessionHandle handle,
											IRequestParameterReadWrite param,
											HashMap inMap,
											String fixedText,
											String svcKeiNo) throws Exception {
		
		printlnEjbLog("execEkk0341B002_start");
		// KEY
		List<String> ekk0341b002List = Arrays.asList(EKK0341B002CBSMsg.KEY_SVC_KEI_NO,
														EKK0341B002CBSMsg.KEY_KKTK_SVC_CD,
														EKK0341B002CBSMsg.KEY_KKTK_SVC_KEI_NO,
														EKK0341B002CBSMsg.KEY_SORT_KBN);
		
		// テンプレート
		final String templateId            = "EKK0341B002";
		// テンプレート明細
		final String templateDetail        = EKK0341B002CBSMsg.EKK0341B002CBSMSG1LIST;
		// SC実行結果取得キー
		final String scExecKey             = TEMP_TEMPLATE_PRIFIX + templateId + TEMP_TEMPLATE_PRIFIX_SEP;
		
		// ユーザデータ初期化
		initData(param, fixedText, ekk0341b002List);
		// 検索エラーなし設定 
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setUpForEkk0341B002(param, fixedText, svcKeiNo, KKTK_SVC_CD_BBR);
		// サービスIF実行
		executeSC(handle, param, fixedText, templateId, templateDetail, ekk0341b002List, null);
		
		printlnEjbLog("execEkk0341B002_end");
		return getTemplateList(inMap, getMaxTempTempleteKey(inMap, scExecKey), templateDetail);
	}
	
	/**
	 * EKK2091B001：住所変更一覧照会
	 * 
	 * @param handle
	 * @param param
	 * @param inMap
	 * @param fixedText
	 * @param svcKeiNo
	 * @return
	 * @throws Exception 
	 */
	private List<HashMap> execEkk0251B001(SessionHandle handle,
											IRequestParameterReadWrite param,
											HashMap inMap,
											String fixedText,
											String svcKeiNo) throws Exception {
		
		printlnEjbLog("execEkk0251B001_start");
		
		// KEY
		final List<String> ekk0251b001List = Arrays.asList(EKK0251B001CBSMsg.KEY_SVC_KEI_NO);
		// テンプレート
		final String templateId            = "EKK0251B001";
		// テンプレート明細
		final String templateDetail        = EKK0251B001CBSMsg.EKK0251B001CBSMSG1LIST;
		// SC実行結果取得キー
		final String scExecKey             = TEMP_TEMPLATE_PRIFIX + templateId + TEMP_TEMPLATE_PRIFIX_SEP;
		
		// ユーザデータ初期化
		initData(param, fixedText, ekk0251b001List);
		// 検索エラーなし設定 
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setUpForEkk0251B001(param, fixedText, svcKeiNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, templateId, templateDetail, ekk0251b001List, null);
		
		printlnEjbLog("execEkk0251B001_end");
		return getTemplateList(inMap, getMaxTempTempleteKey(inMap, scExecKey), templateDetail);
	}
	
	/**
	 * EKK2091B001：住所変更一覧照会
	 * 
	 * @param handle
	 * @param param
	 * @param inMap
	 * @param fixedText
	 * @param svcKeiKaisenUcwkNo
	 * @return
	 * @throws Exception 
	 */
	private List<HashMap> execEkk2091B001(SessionHandle handle,
											IRequestParameterReadWrite param,
											HashMap inMap,
											String fixedText,
											String svcKeiKaisenUcwkNo) throws Exception {
		
		printlnEjbLog("execEkk2091B001_start");
		
		// KEY
		final List<String> ekk2091b001List = Arrays.asList(EKK2091B001CBSMsg.KEY_ADCHG_NO,
															EKK2091B001CBSMsg.KEY_ITNM_SVKEI_KISUW_NO,
															EKK2091B001CBSMsg.KEY_MSKM_NO);
		// テンプレート
		final String templateId     = "EKK2091B001";
		// テンプレート明細
		final String templateDetail = EKK2091B001CBSMsg.EKK2091B001CBSMSG1LIST;
		// SC実行結果取得キー
		final String scExecKey      = TEMP_TEMPLATE_PRIFIX + templateId + TEMP_TEMPLATE_PRIFIX_SEP;
		
		// ユーザデータ初期化
		initData(param, fixedText, ekk2091b001List);
		// 検索エラーなし設定 
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setUpForEkk2091B001(param, fixedText, svcKeiKaisenUcwkNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, templateId, templateDetail, ekk2091b001List, null);
		
		printlnEjbLog("execEkk2091B001_end");
		
		return getTemplateList(inMap, getMaxTempTempleteKey(inMap, scExecKey), templateDetail);
	}
	
	/**
	 * EKK2101B001：住所変更明細一覧照会
	 * 
	 * @param  handle
	 * @param  param
	 * @param  inMap
	 * @param  fixedText
	 * @param  addChgNo
	 * @param  chgTgKeiNo
	 * @return 
	 * @throws Exception 
	 */
	private List<HashMap> execEkk2101B001(SessionHandle handle,
											IRequestParameterReadWrite param,
											HashMap inMap,
											String fixedText,
											String addChgNo) throws Exception {
		
		printlnEjbLog("execEkk2101B001_start");
		
		// KEY
		final List<String> ekk2101b001List = Arrays.asList(EKK2101B001CBSMsg.KEY_ADCHG_NO,
															EKK2101B001CBSMsg.KEY_ADCHG_DTL_NO,
															EKK2101B001CBSMsg.KEY_ADCHG_DTL_SBT_CD);
		// テンプレート
		final String templateId     = "EKK2101B001";
		// テンプレート明細
		final String templateDetail = EKK2101B001CBSMsg.EKK2101B001CBSMSG1LIST;
		// SC実行結果取得キー
		final String scExecKey      = TEMP_TEMPLATE_PRIFIX + templateId + TEMP_TEMPLATE_PRIFIX_SEP;
		
		// ユーザデータ初期化
		initData(param, fixedText, ekk2101b001List);
		// 検索エラーなし設定 
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setUpForEkk2101B001(param, fixedText, addChgNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, templateId, templateDetail, ekk2101b001List, null);
		
		printlnEjbLog("execEkk2101B001_end");
		
		return getTemplateList(inMap, getMaxTempTempleteKey(inMap, scExecKey), templateDetail);
	}
	
	/**
	 * EKK2101B001：上り電文設定
	 * 
	 * @param param
	 * @param fixedText
	 * @param addChgNo
	 * @throws RequestParameterException
	 */
	private void setUpForEkk2101B001(IRequestParameterReadWrite param,
										String fixedText,
										String addChgNo) throws RequestParameterException {
		
		printlnEjbLog("setUpForEkk2101B001_start");
		
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ユーザデータ取得
		HashMap inMap = (HashMap) param.getData(fixedText);
		// KEY_住所変更番号
		inMap.put(EKK2101B001CBSMsg.KEY_ADCHG_NO, addChgNo);
		
		printlnEjbLog("setUpForEkk2101B001_end");
	}
	
	/**
	 * EKK2091B001：上り電文設定
	 * 
	 * @param param
	 * @param fixedText
	 * @param svcKeiKaisenUcwkNo
	 * @throws RequestParameterException
	 */
	private void setUpForEkk2091B001(IRequestParameterReadWrite param,
										String fixedText,
										String svcKeiKaisenUcwkNo) throws RequestParameterException {
		
		printlnEjbLog("setUpForEkk2091B001_start");
		
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ユーザデータ取得
		HashMap inMap = (HashMap) param.getData(fixedText);
		// KEY_移転元サービス契約回線内訳番号
		inMap.put(EKK2091B001CBSMsg.KEY_ITNM_SVKEI_KISUW_NO, svcKeiKaisenUcwkNo);
		
		printlnEjbLog("setUpForEkk2091B001_end");
	}
	
	/**
	 * EKK0251B001：上り電文設定
	 * 
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @throws RequestParameterException
	 */
	private void setUpForEkk0251B001(IRequestParameterReadWrite param,
										String fixedText,
										String svcKeiNo) throws RequestParameterException {
		
		printlnEjbLog("setUpForEkk0251B001_start");
		
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// KEY_サービス契約番号
		inMap.put(EKK0251B001CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		
		printlnEjbLog("setUpForEkk0251B001_end");
	}
	
	/**
	 * EKK0341B002：上り電文設定
	 * 
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @param kktkSvcCd
	 * @throws RequestParameterException
	 */
	private void setUpForEkk0341B002(IRequestParameterReadWrite param,
										String fixedText,
										String svcKeiNo,
										String kktkSvcCd) throws RequestParameterException {
		
		printlnEjbLog("setUpForEkk0341B002_start");
		
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// KEY_サービス契約番号
		inMap.put(EKK0341B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		// KEY_機器提供サービスコード
		inMap.put(EKK0341B002CBSMsg.KEY_KKTK_SVC_CD, kktkSvcCd);
		
		printlnEjbLog("setUpForEkk0341B002_end");
	}
	
	/**
	 * チェック処理
	 * 
	 * <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;
	}

	/**
	 * 上りマッピング項目設定(割引サービス一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcCd 割引サービスコード
	 * @throws RequestParameterException
	 */
	private void setInMapWribSvcUniqueSearch(IRequestParameterReadWrite param, String fixedText, String wribSvcCd) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, wribSvcCd);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD, JKKBPActCommon.getOpeDate(null));

	}

	/**
	 * 上りマッピング項目設定(割引サービス契約(予約とカレント件数)一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param funcCd 機能コード
	 * @throws RequestParameterException
	 */
	private void setInMapWribSvcKeiCntSearch(IRequestParameterReadWrite param, String fixedText, String funcCd) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, funcCd);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0451B506CBSMsg.KEY_WRIB_SVC_CD, JKKFamiilyPackConst.KK0841_WRIB_SVC_CD_FAMIPA);
	}

	/**
	 * 上りマッピング項目設定(オプションサービス契約(予約件数)一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapOpSvcRsvCntSearch(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービスコード
		inMap.put(EKK0351B509CBSMsg.KEY_OP_SVC_CD, JKKFamiilyPackConst.CD00136_B001);
	}

	/**
	 * 上りマッピング項目設定(プラン変更収容替工事依頼の追加ルータ出荷指図済みチェック)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapRouterDirectionsCheck(IRequestParameterReadWrite param, String fixedText, String pcrsCd, String svcKeiNo)
			throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 料金コースコード
		inMap.put(IN_PARAM_KEY_PCRS_CD, pcrsCd);
		// サービス契約番号
		inMap.put(IN_PARAM_KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * 上りマッピング項目設定(機器提供サービス契約一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapKktkSvcKeiSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0341B008CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * 上りマッピング項目設定(異動予約一覧照会:予約チェック)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @param idoDiv 異動区分
	 * @param idoRsvDtlCd 異動予約詳細コード
	 * @throws RequestParameterException
	 */
	private void setInMapIdoRsvSearchCeck(IRequestParameterReadWrite param, String fixedText, String mskmDtlNo, String idoDiv, String idoRsvDtlCd)
			throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿申込明細番号
		inMap.put(EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, mskmDtlNo);
		// ＫＥＹ＿異動区分
		inMap.put(EKK1681B001CBSMsg.KEY_IDO_DIV, idoDiv);
		// ＫＥＹ＿異動予約詳細コード
		inMap.put(EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, idoRsvDtlCd);
	}
}
