/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKGetSvcKeiCommonInfCC
*	ソースファイル名：JCKGetSvcKeiCommonInfCC.java
*	作成者			：FJ
*	日付			：2012年02月01日
*＜機能概要＞
*	共通ヘッダ部の、サービス契約情報取得を行う部品の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/02/01	FAP)庭山	新規作成
*	v4.00.00	2012/11/07	FAP)庭山	【IT1-2012-0001709】対応
*	v4.01.00	2012/11/12	FAP)庭山	【IT1-2012-0001710】対応
*	v4.02.00	2013/02/28	FAP)野口	【IT1-2012-0002413】対応
*   v4.03.00	2013/03/22	FAP)辛	    【OT-2013-0000455】対応
*   v6.00.00	2014/01/14	FAP)辛	    【OM-2014-0000091】対応
*  v37.00.00	2018/03/12	FJ)三原		【ANK-3366-00-00】eo光設備卸対応
*  v57.00.00	2022/01/13	FJ)杉本		【ANK-4075-00-00】マンション卸回線(WI-FIスキーム)の不備対応
*  v73.00.00	2025/01/14	FJ) 星野	【IT1-2025-0000002】
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JZMCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0241B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0241B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * サービス契約共通情報取得部品。<p>
 * <BR>
 * @author 富士通
 */
public class JCKGetSvcKeiCommonInfCC extends AbstractCommonComponent
{
	/** コード名称管理一意照会 */
	private static final String TEMPLATE_ID_EZM0171A010 = "EZM0171A010";
	/** 業務パラメータ管理一意照会 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	/** サービス契約共通情報一覧照会 */
	private static final String TEMPLATE_ID_EKK0081B010 = "EKK0081B010";
	/** 割引サービス契約一覧照会（割引サービス指定） */
	private static final String TEMPLATE_ID_EKK0451B010 = "EKK0451B010";
	/** 回線対象サービス契約一覧照会 */
	private static final String TEMPLATE_ID_EKK0241B002 = "EKK0241B002";
	/** 回線対象サービス契約一覧照会（サービス契約番号） */
	private static final String TEMPLATE_ID_EKK0241B003 = "EKK0241B003";
	/* ++++++++++ v6.00.00 追加開始 ++++++++++ */
	/** 料金コース一意照会 */
	private static final String TEMPLATE_ID_EKK0791A010 = "EKK0791A010";
// IT1-2025-0000002対応 20250114 星野 DEL START
//	/** 料金コース速度コード ペアID */
//	private static final String PCRS_SPEED_CD_04 = "04";
// IT1-2025-0000002対応 20250114 星野 DEL END
	/* ++++++++++ v6.00.00 追加完了 ++++++++++ */
	
	/**
	 * サービス契約共通情報を取得する。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getSvcCommonInf(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		String svcKeiNo = (String)ccMsg.get("key_svc_kei_no");
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービス契約共通情報一覧照会
		Object[][] ekk0081b010In = {{EKK0081B010CBSMsg.TEMPLATEID,     TEMPLATE_ID_EKK0081B010},
									{EKK0081B010CBSMsg.FUNC_CODE,      "1"},
									{EKK0081B010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}};
		
		CAANMsg[] ekk0081b010Out = callSC(handle, scCall, param, fixedText, ekk0081b010In).getCAANMsgList(EKK0081B010CBSMsg.EKK0081B010CBSMSG1LIST);
		if (ekk0081b010Out == null || ekk0081b010Out.length == 0)
		{
			return param;
		}
		
		CAANMsg svcTemplate = ekk0081b010Out[0];
		
		//ccMsg.put("mansion_id", svcTemplate.getString(EKK0081B010CBSMsg1List.MANSION_ID));				// マンションＩＤ
		ccMsg.put("cust_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.CUST_NM));					// お客様名
		ccMsg.put("keisha_telno", svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_TELNO));			// 契約者電話番号
		ccMsg.put("svc_kei_no", svcTemplate.getString(EKK0081B010CBSMsg1List.SVC_KEI_NO));				// サービス契約番号
		ccMsg.put("seiky_kei_no", svcTemplate.getString(EKK0081B010CBSMsg1List.SEIKY_KEI_NO));			// 請求契約番号
		ccMsg.put("sysid", svcTemplate.getString(EKK0081B010CBSMsg1List.SYSID));						// ＳＹＳＩＤ
		ccMsg.put("eoid", svcTemplate.getString(EKK0081B010CBSMsg1List.EOID));							// ｅｏＩＤ
		ccMsg.put("pcrs_cd", svcTemplate.getString(EKK0081B010CBSMsg1List.PCRS_CD));					// 料金コースコード
		ccMsg.put("prc_grp_cd", svcTemplate.getString(EKK0081B010CBSMsg1List.PRC_GRP_CD));				// 料金グループコード
		ccMsg.put("prc_grp_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.PRC_GRP_NM));				// 料金グループ名
		ccMsg.put("pplan_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.PPLAN_NM));					// 料金プラン名
		
		/* ++++++++++ v6.00.00 追加開始 ++++++++++ */
		boolean setPareID = false;
		setPareID = isDispPairID(handle, scCall, param, fixedText, svcTemplate.getString(EKK0081B010CBSMsg1List.PCRS_CD));
		if(setPareID)
		{
			ccMsg.put("mansion_id", svcTemplate.getString(EKK0081B010CBSMsg1List.PAIRID));// ペアＩＤ
		}
		else
		{
			ccMsg.put("mansion_id", svcTemplate.getString(EKK0081B010CBSMsg1List.MANSION_ID));// マンションＩＤ
		}
		/* ++++++++++ v6.00.00 追加開始 ++++++++++ */
		
// ++++++++++ v4.02.00 追加開始 ++++++++++
		ccMsg.put("rsv_jokyo", svcTemplate.getString(EKK0081B010CBSMsg1List.RSV_JYOKYO));				// 予約状況
// ++++++++++ v4.02.00 追加終了 ++++++++++
		
		String prcGrpCd = svcTemplate.getString(EKK0081B010CBSMsg1List.PRC_GRP_CD);
		String pid = "";
		String catid = "";
		String bknNm = "";
		
		// ｅｏ光ネットマンションタイプの場合
		if (JKKStrConst.CD00133_04.equals(prcGrpCd))
		{
			// P-ID、M-ID、マンション名を設定
			pid = svcTemplate.getString(EKK0081B010CBSMsg1List.PID);
			/* ++++++++++ v6.00.00 変更開始 ++++++++++ */
			if(!setPareID)
			{
				catid = svcTemplate.getString(EKK0081B010CBSMsg1List.MANSION_ID);
			}
			/* ++++++++++ v6.00.00 変更開始 ++++++++++ */
			bknNm = svcTemplate.getString(EKK0081B010CBSMsg1List.MSBSN_KRTG_BKN_NM);
		}
		// ｅｏ光ネットメゾンタイプの場合
		else if (JKKStrConst.CD00133_03.equals(prcGrpCd))
		{
			// P-ID、メゾン名を設定
			pid = svcTemplate.getString(EKK0081B010CBSMsg1List.PID);
			bknNm = svcTemplate.getString(EKK0081B010CBSMsg1List.MSBSN_KRTG_BKN_NM);
		}
		// ｅｏ光電話の場合
		else if (JKKStrConst.CD00133_10.equals(prcGrpCd))
		{
			// P-ID、M-ID(マンションの場合のみ)、マンション名(メゾン名)を設定
			pid = svcTemplate.getString(EKK0081B010CBSMsg1List.PID);
			bknNm = svcTemplate.getString(EKK0081B010CBSMsg1List.MSBSN_KRTG_BKN_NM);
			
			if (JKKStrConst.MANSION_BUKKEN_CD_MANSION.equals(svcTemplate.getString(EKK0081B010CBSMsg1List.MANSION_BUKKEN_CD)))
			{
				catid = svcTemplate.getString(EKK0081B010CBSMsg1List.MANSION_ID);
			}
		}
		// ｅｏ光テレビの場合
		else if (JKKStrConst.CD00133_11.equals(prcGrpCd) || JKKStrConst.CD00133_12.equals(prcGrpCd) || JKKStrConst.CD00133_13.equals(prcGrpCd))
		{
			// P-ID、CAT-ID(マンションの場合のみ)、マンション名(メゾン名)を設定
			pid = svcTemplate.getString(EKK0081B010CBSMsg1List.PID);
			bknNm = svcTemplate.getString(EKK0081B010CBSMsg1List.MSBSN_KRTG_BKN_NM);
			catid = svcTemplate.getString(EKK0081B010CBSMsg1List.CATID);
		}
		ccMsg.put("p_id", pid);					// Ｐ−ＩＤ
		ccMsg.put("cat_id", catid);				// ＣＡＴ−ＩＤ
		ccMsg.put("kisnusekei_bkn_nm", bknNm);	// 回線使用契約物件名
		
		// 契約者住所
		ccMsg.put("keisha_ad", JZMCommonUtil.getPtn01(svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_STATE_NM),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_CITY_NM),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_OAZTSU_NM),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_AZCHO_NM),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_BNCHIGO),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_ADRTTM),
														svcTemplate.getString(EKK0081B010CBSMsg1List.KEISHA_ADRRM)));
		// ＡＤＳＬ表示フラグ
		ccMsg.put("adsl_dsp_flg", getAdslDspFlg(svcTemplate.getString(EKK0081B010CBSMsg1List.PRC_GRP_CD)));
		// ファミリーパック
		ccMsg.put("family_pack_um", getFamilyPackUm(handle, scCall, param, fixedText, svcKeiNo));
		// 異動区分名称
		ccMsg.put("ido_nm", getCdDivNm(handle, scCall, param, fixedText, JZM0171Constant.CD00576, (String)ccMsg.get("ido_div")));
		// サービス契約ステータス名称
		/*-----v4.03.00 修正開始--------------------------------------------*/
//		ccMsg.put("svc_kei_stat_nm", getCdDivNm(handle,
//												scCall,
//												param,
//												fixedText,
//												JZM0171Constant.CD00037, svcTemplate.getString(EKK0081B010CBSMsg1List.SVC_KEI_STAT)));
		
		ccMsg.put("svc_kei_stat_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.SVC_KEI_STAT_NM));
		/*-----v4.03.00 修正終了--------------------------------------------*/
		
		// 督促ステータス名称
		// ルータ有無
		JKKSameScreenHeaderCC routerCC = new JKKSameScreenHeaderCC();
		routerCC.runGetSameScreenHeaderInfo(handle, param, fixedText);
		
		// ANK-3366-00-00 ADD START
		// 卸先事業者名
		ccMsg.put("orsjgs_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.ORSJGS_NM));
		// ANK-3366-00-00 ADD END
		// ANK-4075-00-00 ADD START
		// スキームタイプ名
		ccMsg.put("scm_type_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.SCM_TYPE_NM));
		// スキーム事業者名
		ccMsg.put("scm_jgs_nm", svcTemplate.getString(EKK0081B010CBSMsg1List.SCM_JGS_NM));
		// ANK-4075-00-00 ADD END
		
		return param;
	}

	/**
	 * チェック処理<br>
	 * サービスコンポーネント実行用CAANMsgを返却します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param (I) 業務データ取得用I/F
	 * @param fixedText (I) ユーザ定義文字列
	 * @return HashMap
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	@SuppressWarnings("unchecked")
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		Object[][] ekk0081b010In = {{EKK0081B010CBSMsg.TEMPLATEID,     TEMPLATE_ID_EKK0081B010},
									{EKK0081B010CBSMsg.FUNC_CODE,      "1"},
									{EKK0081B010CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("key_svc_kei_no")}};
		
		templates.add(((CAANMsg[])editInMsg(param, ekk0081b010In).get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		return paramMap;
	}

	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * @param param デルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates CAANMsgクラス配列
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
													CAANMsg[] templates,
													int returnCode,
													String fixedText) throws Throwable
	{
		HashMap<String, Object> dataMap = (HashMap)param.getData(fixedText);
		for (CAANMsg template : templates)
		{
			CAANMsg[] workTemplates = {template};
			editErrorInfoEKK0081B010(param, dataMap, workTemplates, returnCode);
		}
		return param;
	}

	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
							ServiceComponentRequestInvoker scCall,
							IRequestParameterReadWrite param,
							String dataMapKey,
							Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		
		int templateStatus = msg.getInt(EKK0081B010CBSMsg.STATUS);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		return msg;
	}

	/**
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * エラー情報を設定します。
	 * 
	 * @param msg
	 * @param map
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (key.endsWith("_err"))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, msg.getString(key));
					}
				}
			}
		}
	}

	/**
	 * 
	 * @param param
	 * @param inMap
	 * @param templates
	 * @param returnCode
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfoEKK0081B010(IRequestParameterReadWrite param,
																HashMap<String, Object> inMap,
																CAANMsg[] templates,
																int returnCode) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK0081B010CBSMsg.STATUS);
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		if (!template.isNull(EKK0081B010CBSMsg.KEY_SVC_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_svc_kei_no_err"))
			{
				inMap.put("key_svc_kei_no_err", template.getString(EKK0081B010CBSMsg.KEY_SVC_KEI_NO_ERR));
			}
		}
		return param;
	}

	/**
	 * ファミリーパック有無を取得します。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo
	 * @return String
	 * @throws Exception
	 */
	private String getFamilyPackUm(SessionHandle handle,
										ServiceComponentRequestInvoker scCall,
										IRequestParameterReadWrite param,
										String fixedText,
										String svcKeiNo) throws Exception
	{
		String value = "無";
		
		// ***** EZM0321A010（業務パラメータ管理一意照会）*****
		Object[][] ezm0321a010In = {{EZM0321A010CBSMsg.TEMPLATEID,        TEMPLATE_ID_EZM0321A010},
									{EZM0321A010CBSMsg.FUNC_CODE,         "1"},
									{EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, "KK_FP_KEI_UM_JDG"}};
		
		CAANMsg[] ezm0321a010 = callSC(handle, scCall, param, fixedText, ezm0321a010In).getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		if (ezm0321a010 == null || ezm0321a010.length == 0)
		{
			return value;
		}
		
		String wribSvcCd = ezm0321a010[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		
		// 回線対象サービス契約一覧照会（サービス契約番号）
		Object[][] ekk0241b003In = {{EKK0241B003CBSMsg.TEMPLATEID,     TEMPLATE_ID_EKK0241B003},
									{EKK0241B003CBSMsg.FUNC_CODE,      "1"},
									{EKK0241B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}};
		
		CAANMsg[] ekk0241b003Out = callSC(handle, scCall, param, fixedText, ekk0241b003In).getCAANMsgList(EKK0241B003CBSMsg.EKK0241B003CBSMSG1LIST);
		
		if (ekk0241b003Out == null || ekk0241b003Out.length == 0)
		{
			return value;
		}
		
		// 回線対象サービス契約一覧照会
		Object[][] ekk0241b002In = {{EKK0241B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0241B002},
									{EKK0241B002CBSMsg.FUNC_CODE,  "1"},
									{EKK0241B002CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO,
										ekk0241b003Out[0].getString(EKK0241B003CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO)}};
		
		CAANMsg[] ekk0241b002Out = callSC(handle, scCall, param, fixedText, ekk0241b002In).getCAANMsgList(EKK0241B002CBSMsg.EKK0241B002CBSMSG1LIST);
		
		for (int i = 0; i < ekk0241b002Out.length; i++)
		{
			// ***** EKK0451B010（割引サービス契約一覧照会（割引サービス指定））*****
			Object[][] ekk0451b010In = {{EKK0451B010CBSMsg.TEMPLATEID,      TEMPLATE_ID_EKK0451B010},
										{EKK0451B010CBSMsg.FUNC_CODE,       "1"},
										{EKK0451B010CBSMsg.KEY_SVC_KEI_NO,  ekk0241b002Out[i].getString(EKK0241B002CBSMsg1List.SVC_KEI_NO)},
										{EKK0451B010CBSMsg.KEY_WRIB_SVC_CD, wribSvcCd}};
			
			CAANMsg[] ekk0451b010Out = callSC(handle,
												scCall,
												param,
												fixedText,
												ekk0451b010In).getCAANMsgList(EKK0451B010CBSMsg.EKK0451B010CBSMSG1LIST);
			
			if (ekk0451b010Out != null && ekk0451b010Out.length > 0)
			{
				value = "有";
				break;
			}
		}
		
		return value;
	}

	/**
	 * コード名称を取得します。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param cdSbtCd
	 * @param cdDiv
	 * @return String
	 * @throws Exception
	 */
	private String getCdDivNm(SessionHandle handle,
										ServiceComponentRequestInvoker scCall,
										IRequestParameterReadWrite param,
										String fixedText,
										String cdSbtCd,
										String cdDiv) throws Exception
	{
		if (cdDiv == null || cdDiv.length() == 0)
		{
			return "";
		}
		
		// ***** EZM0171A010（コード名称管理一意照会）*****
		Object[][] ezm0171a010IN = {{EZM0171A010CBSMsg.TEMPLATEID,    TEMPLATE_ID_EZM0171A010},
									{EZM0171A010CBSMsg.FUNC_CODE,     "1"},
									{EZM0171A010CBSMsg.KEY_CD_SBT_CD, cdSbtCd},
									{EZM0171A010CBSMsg.KEY_CD_DIV,    cdDiv}};
		
		CAANMsg[] ezm0171a010OUT = callSC(handle, scCall, param, fixedText, ezm0171a010IN).getCAANMsgList(EZM0171A010CBSMsg.EZM0171A010CBSMSG1LIST);
		
		if (ezm0171a010OUT != null && ezm0171a010OUT.length > 0)
		{
			return ezm0171a010OUT[0].getString(EZM0171A010CBSMsg1List.CD_DIV_NM);
		}
		
		return "";
	}

	/**
	 * ＡＤＳＬ表示フラグを取得します。
	 * 
	 * @param prcGrpCd
	 * @return String
	 */
	private String getAdslDspFlg(String prcGrpCd)
	{
		if (JKKStrConst.CD00133_05.equals(prcGrpCd) || JKKStrConst.CD00133_06.equals(prcGrpCd))
		{
			return "1";
		}
		
		return "0";
	}
	
	/* ++++++++++ v6.00.00 追加開始 ++++++++++ */
	/**
	 * 料金コースコードから画面にマンションIDかペアIDを表示するか判定する。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param pcrs_cd
	 * @param rsv_aply_ymd
	 * @return true:ペアID 表示、false:マンションID表示
	 * @throws Throwable
	 */
	private boolean isDispPairID(SessionHandle handle,
									ServiceComponentRequestInvoker scCall,
									IRequestParameterReadWrite param,
									String dataMapKey,
									String pcrs_cd) throws Throwable
	{
		// ***** EKK0791A010（料金コース一意照会）******
		Object[][] ekk0791a010IN = {
				{ EKK0791A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0791A010 },
				{ EKK0791A010CBSMsg.FUNC_CODE, "2" }, // "2"固定
				{ EKK0791A010CBSMsg.KEY_PCRS_CD, pcrs_cd },
				{ EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null) },
		};
		
		// 料金コース一意照会サービスインターフェイスの実行
		CAANMsg[] ekk0791a010cbsMsg1list 
			= callSC(handle, scCall, param, dataMapKey, ekk0791a010IN).getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
		// 料金コース一意照会結果の１件目を取得する。
		CAANMsg ekk0791a010cbsMsg1 =  ekk0791a010cbsMsg1list[0];
		
		// 料金コース速度コードを取得し、1G以上の場合 true を返す。
// IT1-2025-0000002対応 20250114 星野 MOD START
//		if(PCRS_SPEED_CD_04.equals(ekk0791a010cbsMsg1.getString(EKK0791A010CBSMsg1List.PCRS_SPEED_CD)))
		if(JKKStrConst.CD00688_OVER1G_LIST.contains(ekk0791a010cbsMsg1.getString(EKK0791A010CBSMsg1List.PCRS_SPEED_CD)))
// IT1-2025-0000002対応 20250114 星野 MOD END
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	/* ++++++++++ v6.00.00 追加完了 ++++++++++ */
	
}
