/*********************************************************************
 * All Rights reserved, Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JFUGetTaknkikiModelInfoUtil
 *   ソースファイル名：JFUGetTaknkikiModelInfoUtil.java
 *   作成者          ：富士通
 *   日付            ：2012年11月13日
 *＜機能概要＞
 *   宅内機器型式情報取得処理部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00       2012/11/13   FJ）齋藤    新規作成
 *   v5.00       2013/02/12   FJ）大村    【ANK-1421-00-00】IP-STB
 *   v5.00       2013/03/08   FJ) 瀧澤    【IT1-2013-0000407】IP-STBの型式候補の取得方法を変更
 *   v6.00       2013/11/14   FJ) 文元    【IT2-2013-0000783】テレビのコース変更時、STB(ブルーレイ)の場合にシステムエラーとなる不具合改修
 *   v39.00      2018/08/23   FJ) 美濃原  【ANK-3488-00-00】４KSTB（ACASチップ）導入対応
 *   v39.00      2018/11/29   FJ) 美濃原  【OM-2018-0001176】既契約のSTB選択リスト作成条件をHDD容量コードに変更
 *   v62.00      2022/10/14   FJ）美濃原  【ANK-4335-00-00】ACAS対応新STB導入対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JFUStrConst;
import eo.common.util.JFUCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK1861B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1861B501CBSMsg1List;

/**
 * 宅内機器型式情報取得部品。
 * 
 * @author FJ
 */
public class JFUGetTaknkikiModelInfoUtil
{

	/** テンプレートID */
	public static final String TEMPLATE_ID = "EKK1861B501";

	/** エラーリスト */
	private static final String ERR_LIST = "err_list";

	/** 検索結果リスト */
	private static final String RESULT_LIST = "result_list";

	/** RETURN_MESSAGE */
	private static final String RETURN_MESSAGE = "RETURN_MESSAGE_";

	/** Status Format */
	private static final String STATUS_FORMAT = "%1$04d";

	/** エラーメッセージ：該当データなし */
	private static final String CC_ERR_MSG_NO_DATA_FOUND = "該当データなしエラー";

	/** 項目ID：ＢＣＡＳ不要ＳＴＢフラグ */
	private static final String OUT_BCAS_FUYO_FUYO_STB_FLG = "bcas_fuyo_stb_flg";

	/** ＢＣＡＳ不要ＳＴＢフラグ  "1"：B-CAS不要 */
	private static final String BCAS_FUYO = "1";
	/** ＢＣＡＳ不要ＳＴＢフラグ  "0"：B-CAS必要 */
	private static final String BCAS_NEED = "0";

	/**
	 * 宅内機器型式情報取得処理。
	 * 
	 * @param handle
	 *            セッションマネージャなどを持ったハンドル
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap
	 *            ユーザデータ情報
	 * @return IRequestParameterReadWrite パラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 * 
	 */
	public HashMap<?, ?> getTaknkikiModelInfo(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws Exception
	{

		// パラメータを取得します。
		IRequestParameterReadWrite useParam = param;

		// SC呼び出し部品のインスタンスを生成します。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピングの処理結果を設定するマップを生成します。
		HashMap<String, Object> paramMap = this.editInMsg(useParam, inMap); // 上りマッピング

		// 検索処理
		Map<?, ?> result = scCall.run(paramMap, handle); // SC呼び出し

		// 下りマッピング処理を行います。
		HashMap<?, ?> outMap = this.editOutMsg(useParam, result, inMap);

		return outMap;
	}

	/**
	 * 宅内機器型式情報取得処理用メッセージ設定処理
	 * 
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap
	 *            ユーザデータ情報
	 * @return HashMap 宅内機器型式情報取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, HashMap inMap) 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));

		// ユーザデータ情報
		CAANMsg template = new CAANMsg(EKK1861B501CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK1861B501CBSMsg.TEMPLATEID, TEMPLATE_ID);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		if(JFUBPCommon.isNull((String)inMap.get("func_code")))
		{
			// 機能コード（デフォルト：１（チェック＆登録）
			template.set(EKK1861B501CBSMsg.FUNC_CODE, "1");
		}
		else
		{
			// 機能コードが設定されている場合、設定値を使用
			template.set(EKK1861B501CBSMsg.FUNC_CODE, (String)inMap.get("func_code"));
		}


		// ◇業務データの設定
		// 宅内機器種別コード → ＫＥＹ＿宅内機器種別コード
		if (JFUStrConst.EMPTY.equals((String)inMap.get("taknkiki_sbt_cd")))
		{
			template.setNull(EKK1861B501CBSMsg.KEY_TAKNKIKI_SBT_CD);
		}
		else
		{
			template.set(EKK1861B501CBSMsg.KEY_TAKNKIKI_SBT_CD, (String)inMap.get("taknkiki_sbt_cd"));
		}

		// 保有ルーターコード → ＫＥＹ＿保有ルーターコード
		if (JFUStrConst.EMPTY.equals((String)inMap.get("hoyu_router_cd")))
		{
			template.setNull(EKK1861B501CBSMsg.KEY_HOYU_ROUTER_CD);
		}
		else
		{
			template.set(EKK1861B501CBSMsg.KEY_HOYU_ROUTER_CD, (String)inMap.get("hoyu_router_cd"));
		}

		// 料金コースコード → ＫＥＹ＿料金コースコード
		if (JFUStrConst.EMPTY.equals((String)inMap.get("pcrs_cd")))
		{
			template.setNull(EKK1861B501CBSMsg.KEY_PCRS_CD);
		}
		else
		{
			template.set(EKK1861B501CBSMsg.KEY_PCRS_CD, (String)inMap.get("pcrs_cd"));
		}

		if(JFUBPCommon.isNull((String)inMap.get("hoyu_taknkiki_model_cd")))
		{
			template.setNull(EKK1861B501CBSMsg.HOYU_TAKNKIKI_MODEL_CD);
		}
		else
		{
			template.set(EKK1861B501CBSMsg.HOYU_TAKNKIKI_MODEL_CD, (String)inMap.get("hoyu_taknkiki_model_cd"));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 宅内機器型式情報取得処理用メッセージ取得処理
	 * 
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param resultList
	 *            検索結果
	 * @param inMap
	 * @return IRequestParameterReadWrite 宅内機器型式情報取得処理情報取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	private HashMap editOutMsg(IRequestParameterReadWrite param, Map<?, ?> resultList, HashMap inMap) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得します。
		CAANMsg[] templates = (CAANMsg[])resultList.get(JCMConstants.TEMPLATE_LIST_KEY);

		// リターンコード取得
		Integer returnCode = (Integer)resultList.get(JCMConstants.RET_CD_INT_KEY);

		// 検索結果情報を設定するマップを生成します。
		HashMap oupMap = this.getTemplate(templates, inMap);

		// エラー情報の設定
		oupMap = this.setErrorList(param, templates, returnCode.intValue(), oupMap);

		return oupMap;
	}

	/**
	 * エラー情報マッピング処理
	 * 
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates
	 *            サービスインターフェイスの実行結果を格納しているテンプレート
	 * @param returnCode
	 *            サービスインターフェイスを実行後のリタンコード
	 * @param maps
	 *            検索結果情報Map
	 * @return IRequestParameterReadWrite 宅内機器型式情報取得処理用メッセージ設定したパラメータオブジェクト
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public HashMap setErrorList(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, HashMap map) throws RequestParameterException
	{

		// エラーリストを設定します。
		ArrayList errlist = new ArrayList();

		// エラーマップを設定します。
		HashMap errMap = new HashMap();

		// ユーザデータ情報を取得します。
		HashMap inMap = map;

		for (int i = 0; i < templates.length; i++)
		{

			CAANMsg template = templates[i];
			int templateStatus = template.getInt(EKK1861B501CBSMsg.STATUS);
			if (0 != returnCode)
			{
				templateStatus = 9000;
			}

			if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE + String.format(STATUS_FORMAT, templateStatus)))
			{
				templateStatus = 0;
			}

			int bpStatus = 0;
			Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if (null == obj)
			{
				bpStatus = -1;
			}
			else
			{
				bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
			}

			if (templateStatus > bpStatus)
			{

				// BPにサービスコンポーネントのステータスを設定します。
				String formatStatus = String.format(STATUS_FORMAT, templateStatus);
				String message = JCMAPLConstMgr.getString(RETURN_MESSAGE + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}

			// 宅内機器型式情報取得マップ.ＫＥＹ＿宅内機器種別コードエラー → ＫＥＹ＿宅内機器種別コードのエラー情報返却
			if (!template.isNull(EKK1861B501CBSMsg.KEY_TAKNKIKI_SBT_CD_ERR))
			{
				errMap.put(EKK1861B501CBSMsg.KEY_TAKNKIKI_SBT_CD_ERR, template.getString(EKK1861B501CBSMsg.KEY_TAKNKIKI_SBT_CD_ERR));
			}

			// 宅内機器型式情報取得マップ.ＫＥＹ＿保有ルーター区分エラー → ＫＥＹ＿保有ルーター区分のエラー情報返却
			if (!template.isNull(EKK1861B501CBSMsg.KEY_HOYU_ROUTER_CD_ERR))
			{
				errMap.put(EKK1861B501CBSMsg.KEY_HOYU_ROUTER_CD_ERR, template.getString(EKK1861B501CBSMsg.KEY_HOYU_ROUTER_CD_ERR));
			}

			// 宅内機器型式情報取得マップ.ＫＥＹ＿料金コースコードエラー → ＫＥＹ＿料金コースコードのエラー情報返却
			if (!template.isNull(EKK1861B501CBSMsg.KEY_PCRS_CD_ERR))
			{
				errMap.put(EKK1861B501CBSMsg.KEY_PCRS_CD_ERR, template.getString(EKK1861B501CBSMsg.KEY_PCRS_CD_ERR));
			}

			// エラー情報をリストに設定します。
			errlist.add(errMap);
		}

		inMap.put(ERR_LIST, errlist);
		return inMap;
	}

	/**
	 * 宅内機器型式情報取得情報返却情報設定処理
	 * 
	 * @param templates
	 *            宅内機器型式情報取得処理の返却情報が設定されているパラメータオブジェクト
	 * @param stat_flg
	 *            ステータスフラグ
	 * @param inMap
	 *            ユーザー情報
	 * @return map 宅内機器型式情報取得処理の返却情報を設定したMap
	 * @exception Exceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	private HashMap getTemplate(CAANMsg[] templates, HashMap inMap) throws Exception
	{

		// 返却情報を格納するマップ、リストを生成します。
		HashMap resultMap = new HashMap();
		ArrayList list = new ArrayList();

		// 返却情報を取得します。
		CAANMsg template = templates[0];

		// ■以下、マスタに存在した情報の取得処理■
		CAANMsg[] templateArray = template.getCAANMsgList(EKK1861B501CBSMsg.EKK1861B501CBSMSG1LIST);
		CAANMsg childTemplate = null;
		HashMap map = new HashMap();

		// 返却情報を格納
		resultMap.put(RESULT_LIST, list);

		if (templateArray == null)
		{
			return resultMap;
		}

		// 取得件数分処理
		for (int i = 0; i < templateArray.length; i++)
		{

			map = new HashMap();

			// １レコード分の情報を取得
			childTemplate = templateArray[i];

			// 宅内機器型式コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.TAKNKIKI_MODEL_CD))
			{
				map.put("taknkiki_model_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("taknkiki_model_cd", childTemplate.getString(EKK1861B501CBSMsg1List.TAKNKIKI_MODEL_CD));
			}

			// 機器識別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.KK_SKBT_CD))
			{
				map.put("kk_skbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("kk_skbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.KK_SKBT_CD));
			}

			// 宅内機器型式名
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.ZM0411_TAKNKIKI_MODEL_NM))
			{
				map.put("zm0411_taknkiki_model_nm", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("zm0411_taknkiki_model_nm", childTemplate.getString(EKK1861B501CBSMsg1List.ZM0411_TAKNKIKI_MODEL_NM));
			}

			// 略称名
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.ALI_NM))
			{
				map.put("ali_nm", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("ali_nm", childTemplate.getString(EKK1861B501CBSMsg1List.ALI_NM));
			}

			// メーカーコード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MAKER_CD))
			{
				map.put("maker_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("maker_cd", childTemplate.getString(EKK1861B501CBSMsg1List.MAKER_CD));
			}

			// メーカー機器型番
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MAKER_KK_MDL_NO))
			{
				map.put("maker_kk_mdl_no", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("maker_kk_mdl_no", childTemplate.getString(EKK1861B501CBSMsg1List.MAKER_KK_MDL_NO));
			}

			// 宅内機器種別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.TAKNKIKI_SBT_CD))
			{
				map.put("taknkiki_sbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("taknkiki_sbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.TAKNKIKI_SBT_CD));
			}

			// 製造開始年月日
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SEIZO_STA_YMD))
			{
				map.put("seizo_sta_ymd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("seizo_sta_ymd", childTemplate.getString(EKK1861B501CBSMsg1List.SEIZO_STA_YMD));
			}

			// 製造終了年月日
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SEIZO_END_YMD))
			{
				map.put("seizo_end_ymd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("seizo_end_ymd", childTemplate.getString(EKK1861B501CBSMsg1List.SEIZO_END_YMD));
			}

			// メーカー保証期限年月日
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MAKER_HOSHO_KIGEN_YMD))
			{
				map.put("maker_hosho_kigen_ymd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("maker_hosho_kigen_ymd", childTemplate.getString(EKK1861B501CBSMsg1List.MAKER_HOSHO_KIGEN_YMD));
			}

			// メーカー保証期間
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MAKER_HOSHO_PRD))
			{
				map.put("maker_hosho_prd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("maker_hosho_prd", childTemplate.getString(EKK1861B501CBSMsg1List.MAKER_HOSHO_PRD));
			}

			// STB内蔵CASコード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.STB_NAIZO_CAS_CD))
			{
				map.put("stb_naizo_cas_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("stb_naizo_cas_cd", childTemplate.getString(EKK1861B501CBSMsg1List.STB_NAIZO_CAS_CD));
			}

			// STBメーカー固有制御機種コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.STB_MAKER_KOYU_CTL_MDL_CD))
			{
				map.put("stb_maker_koyu_ctl_mdl_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("stb_maker_koyu_ctl_mdl_cd", childTemplate.getString(EKK1861B501CBSMsg1List.STB_MAKER_KOYU_CTL_MDL_CD));
			}

			// STBHDD内蔵フラグ
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.STB_HDD_NAIZO_FLG))
			{
				map.put("stb_hdd_naizo_flg", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("stb_hdd_naizo_flg", childTemplate.getString(EKK1861B501CBSMsg1List.STB_HDD_NAIZO_FLG));
			}

			// 修理交換グループ種別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SHURI_KOKAN_GRP_SBT_CD))
			{
				map.put("shuri_kokan_grp_sbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("shuri_kokan_grp_sbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.SHURI_KOKAN_GRP_SBT_CD));
			}

			// PON種別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.PON_SBT_CD))
			{
				map.put("pon_sbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("pon_sbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.PON_SBT_CD));
			}

			// ルーター速度種別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.ROUTER_SPEED_SBT_CD))
			{
				map.put("router_speed_sbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("router_speed_sbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.ROUTER_SPEED_SBT_CD));
			}

			// HDD容量コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.HDD_CAPA_CD))
			{
				map.put("hdd_capa_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("hdd_capa_cd", childTemplate.getString(EKK1861B501CBSMsg1List.HDD_CAPA_CD));
			}

			// ポート数
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.PORT_CNT))
			{
				map.put("port_cnt", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("port_cnt", childTemplate.getString(EKK1861B501CBSMsg1List.PORT_CNT));
			}

			// 無料ルーター表示文言
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MRYO_ROUTER_DSP_MONGON))
			{
				map.put("mryo_router_dsp_mongon", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("mryo_router_dsp_mongon", childTemplate.getString(EKK1861B501CBSMsg1List.MRYO_ROUTER_DSP_MONGON));
			}

			// 保有ルーターコード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.HOYU_ROUTER_CD))
			{
				map.put("hoyu_router_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("hoyu_router_cd", childTemplate.getString(EKK1861B501CBSMsg1List.HOYU_ROUTER_CD));
			}

			// OPMSルーター種類コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.OPMS_ROUTER_KIND_CD))
			{
				map.put("opms_router_kind_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("opms_router_kind_cd", childTemplate.getString(EKK1861B501CBSMsg1List.OPMS_ROUTER_KIND_CD));
			}

			// 有料無料コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.YRYO_MRYO_CD))
			{
				map.put("yryo_mryo_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("yryo_mryo_cd", childTemplate.getString(EKK1861B501CBSMsg1List.YRYO_MRYO_CD));
			}

			// OLS機能有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.OLS_KINO_UM))
			{
				map.put("ols_kino_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("ols_kino_um", childTemplate.getString(EKK1861B501CBSMsg1List.OLS_KINO_UM));
			}

			// 製造番号有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SEIZO_NO_UM))
			{
				map.put("seizo_no_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("seizo_no_um", childTemplate.getString(EKK1861B501CBSMsg1List.SEIZO_NO_UM));
			}

			// MAC情報有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MAC_INF_UM))
			{
				map.put("mac_inf_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("mac_inf_um", childTemplate.getString(EKK1861B501CBSMsg1List.MAC_INF_UM));
			}

			// VONUBSパススルー可否
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.VONU_BSPT_KH))
			{
				map.put("vonu_bspt_kh", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("vonu_bspt_kh", childTemplate.getString(EKK1861B501CBSMsg1List.VONU_BSPT_KH));
			}

			// 工事会社配送有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.KOJI_COMP_HAISO_UM))
			{
				map.put("koji_comp_haiso_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("koji_comp_haiso_um", childTemplate.getString(EKK1861B501CBSMsg1List.KOJI_COMP_HAISO_UM));
			}

			// 配送抑止有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.HAISO_YOKSI_UM))
			{
				map.put("haiso_yoksi_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("haiso_yoksi_um", childTemplate.getString(EKK1861B501CBSMsg1List.HAISO_YOKSI_UM));
			}

			// 工事後出荷有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.KOJI_AF_SHKA_UM))
			{
				map.put("koji_af_shka_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("koji_af_shka_um", childTemplate.getString(EKK1861B501CBSMsg1List.KOJI_AF_SHKA_UM));
			}

			// USIM有無
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.USIM_UM))
			{
				map.put("usim_um", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("usim_um", childTemplate.getString(EKK1861B501CBSMsg1List.USIM_UM));
			}

			// Ver
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.VER))
			{
				map.put("ver", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("ver", childTemplate.getString(EKK1861B501CBSMsg1List.VER));
			}

			// IPv6対応フラグ
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.IPV6_TAIO_FLG))
			{
				map.put("ipv6_taio_flg", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("ipv6_taio_flg", childTemplate.getString(EKK1861B501CBSMsg1List.IPV6_TAIO_FLG));
			}

			// 入荷時ROM状態コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.NYUKA_JI_ROM_STAT_CD))
			{
				map.put("nyuka_ji_rom_stat_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("nyuka_ji_rom_stat_cd", childTemplate.getString(EKK1861B501CBSMsg1List.NYUKA_JI_ROM_STAT_CD));
			}

			// サービス別宅内機器型式候補番号
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_NO))
			{
				map.put("svcbt_tkmdl_kho_no", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("svcbt_tkmdl_kho_no", childTemplate.getString(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_NO));
			}

			// 宅内機器型式抽出条件種別コード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.TKMDL_CHSHT_JOKEN_SBT_CD))
			{
				map.put("tkmdl_chsht_joken_sbt_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("tkmdl_chsht_joken_sbt_cd", childTemplate.getString(EKK1861B501CBSMsg1List.TKMDL_CHSHT_JOKEN_SBT_CD));
			}

			// 料金グループコード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.PRC_GRP_CD))
			{
				map.put("prc_grp_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("prc_grp_cd", childTemplate.getString(EKK1861B501CBSMsg1List.PRC_GRP_CD));
			}

			// 料金コースコード
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.PCRS_CD))
			{
				map.put("pcrs_cd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("pcrs_cd", childTemplate.getString(EKK1861B501CBSMsg1List.PCRS_CD));
			}

			// サービス別宅内機器型式候補適用開始年月日
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_TSTAYMD))
			{
				map.put("svcbt_tkmdl_kho_tstaymd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("svcbt_tkmdl_kho_tstaymd", childTemplate.getString(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_TSTAYMD));
			}

			// サービス別宅内機器型式候補適用終了年月日
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_TENDYMD))
			{
				map.put("svcbt_tkmdl_kho_tendymd", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("svcbt_tkmdl_kho_tendymd", childTemplate.getString(EKK1861B501CBSMsg1List.SVCBT_TKMDL_KHO_TENDYMD));
			}

			// 登録可否
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.ADD_KH))
			{
				map.put("add_kh", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("add_kh", childTemplate.getString(EKK1861B501CBSMsg1List.ADD_KH));
			}

			// 機種変更可否
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.MDL_CHG_KH))
			{
				map.put("mdl_chg_kh", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("mdl_chg_kh", childTemplate.getString(EKK1861B501CBSMsg1List.MDL_CHG_KH));
			}

			// 修理交換可否
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.SHURI_KOKAN_KH))
			{
				map.put("shuri_kokan_kh", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("shuri_kokan_kh", childTemplate.getString(EKK1861B501CBSMsg1List.SHURI_KOKAN_KH));
			}

			// 表示順
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.DSP_JUN))
			{
				map.put("dsp_jun", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("dsp_jun", childTemplate.getString(EKK1861B501CBSMsg1List.DSP_JUN));
			}

			// 保有機器表示順
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.HOYU_TAKNKIKI_DSP_JUN))
			{
				map.put("hoyu_taknkiki_dsp_jun", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("hoyu_taknkiki_dsp_jun", childTemplate.getString(EKK1861B501CBSMsg1List.HOYU_TAKNKIKI_DSP_JUN));
			}
			
			// 標準型式フラグ
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.STDARD_MODEL_FLG))
			{
				map.put("stdard_model_flg", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("stdard_model_flg", childTemplate.getString(EKK1861B501CBSMsg1List.STDARD_MODEL_FLG));
			}

			// 料金コース名
			if (childTemplate.isNull(EKK1861B501CBSMsg1List.PCRS_NM))
			{
				map.put("pcrs_nm", JFUStrConst.EMPTY);
			}
			else
			{
				map.put("pcrs_nm", childTemplate.getString(EKK1861B501CBSMsg1List.PCRS_NM));
			}

			list.add(map);
		}

		return resultMap;
	}

	/**
	 * 宅内機器型式取得処理。
	 * 
	 * @param handle
	 *            セッションマネージャなどを持ったハンドル
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap
	 *            ユーザデータ情報
	 * @return IRequestParameterReadWrite パラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 * 
	 */
	@SuppressWarnings("unchecked")
	public ArrayList getTaknkiki(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws Exception
	{

		ArrayList resultlist = new ArrayList();

		HashMap resultMap = getTaknkikiModelInfo(handle, param, inMap);
		ArrayList list = (ArrayList)resultMap.get(RESULT_LIST);

		for (int i = 0; i < list.size(); i++)
		{
			HashMap outMap = (HashMap)list.get(i);

			if (JFUStrConst.CD00003_1.equals(outMap.get("add_kh")) && "1".equals(outMap.get("stdard_model_flg")))
			{
				resultlist.add(outMap);
				break;
			}
		}

		// 使用可能な機器リストが存在しない場合エラー
		if (resultlist.size() == 0)
		{
			// 例外スロー(該当データなし)
			throw new CCException(CC_ERR_MSG_NO_DATA_FOUND, new Exception());
		}

		return resultlist;
	}

	/**
	 * 宅内機器型式リスト取得処理(STB用)。
	 * 
	 * @param handle
	 *            セッションマネージャなどを持ったハンドル
	 * @param param
	 *            モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap
	 *            ユーザデータ情報
	 * @return IRequestParameterReadWrite パラメータオブジェクト
	 * @exception Exceptionがスローされます。
	 * 
	 */
	@SuppressWarnings("unchecked")
	public ArrayList getTaknkikiStbList(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> inMap) throws Exception
	{

		ArrayList resultlist = new ArrayList();

		HashMap resultMap = getTaknkikiModelInfo(handle, param, inMap);
		ArrayList list = (ArrayList)resultMap.get(RESULT_LIST);

		// 機器リストが存在しない場合エラー
		if (list.size() == 0)
		{
			// 例外スロー(該当データなし)
			throw new CCException(CC_ERR_MSG_NO_DATA_FOUND, new Exception());
		}
		
		// 保有宅内機器型式コード（変更の場合に設定されている。追加は未設定。）
		String hoyuTaknkikiModelCd = parseStr(inMap.get("hoyu_taknkiki_model_cd"));
		String hddCapaCd = parseStr(inMap.get("hoyu_hdd_capa_cd"));

		// B-CAS不要STBのHDD容量コード
		List<String> hdlist = JFUBPCommon.getWorkParamSplit(handle, param, JFUStrConst.KK_HDD_CAPA_BCASNONE);
		// ＳＴＢ機器変更ＨＤＤ容量チェック
		List<String> fuHddCapaChk = JFUBPCommon.getWorkParamSplit(handle, param, JFUStrConst.FU_HDD_CAPA_CHK);
		ArrayList wkkikiList = new ArrayList();
		for (int i = 0; i < list.size(); i++)
		{
			HashMap outMap = (HashMap)list.get(i);
			// 「案件番号：ANK-3488-00-00」４KSTB（ACASチップ）導入対応 "上位機種変更"の制御を削除
			String wHddCapaCd = parseStr(outMap.get("hdd_capa_cd"));
			// 契約中機器のＨＤＤ容量コードが異なるもののみ追加（※ＨＤＤ容量が同じで宅内機器型式コードが存在する）
			if (isSakseiTrgt(fuHddCapaChk, hddCapaCd, wHddCapaCd))
			{
				// B-CAS不要STBフラグ
				String stbFlg = BCAS_NEED;
				if (JFUBPCommon.isBcasFuyo(hdlist, wHddCapaCd))
				{
					stbFlg = BCAS_FUYO;
				}
				outMap.put(OUT_BCAS_FUYO_FUYO_STB_FLG, stbFlg);
				wkkikiList.add(outMap);
			}
		}
		
		// 保有宅内機器型式コードの表示順より大きい表示順の機器、が1件も無かった場合（案件番号：ANK-3488-00-00の修正により、ありえないはず）
		if (wkkikiList.size() == 0)
		{
			// 保有宅内機器型式コードは最新グレードの機種である為、空のリストを返却する
			return resultlist;
		}

		// 表示するものがあるかどうかのチェック（登録可否＝"1" 且つ 標準型式フラグ＝"1"）
		Boolean existFlg = false;
		for (int i = 0; i < wkkikiList.size(); i++)
		{
			HashMap outMap = (HashMap)wkkikiList.get(i);

			if (JFUStrConst.CD00003_1.equals(outMap.get("add_kh")) && "1".equals(outMap.get("stdard_model_flg")))
			{
				existFlg = true;
				break;
			}

		}

		// 表示するべき機器リストが存在しない場合エラー
		if (existFlg == false)
		{
			// 例外スロー(該当データなし)
			throw new CCException(CC_ERR_MSG_NO_DATA_FOUND, new Exception());
		}

		// 退避用リスト
		ArrayList tempList = new ArrayList();

		// 保有宅内機器型式コードが存在する場合はそれ以下の機器は除外する。
		// 登録可否＝"1" 且つ 標準型式フラグ＝"1"のリストを返す。
		for (int i = wkkikiList.size() - 1; i >= 0; i--)
		{
			HashMap outMap = (HashMap)wkkikiList.get(i);

			if (!JFUCommonUtil.isNull(hoyuTaknkikiModelCd))
			{
				if (hoyuTaknkikiModelCd.equals(outMap.get("taknkiki_model_cd")))
				{
					continue;
				}
			}

			// 表示するものを退避用リストに設定（登録可否＝"1" 且つ 標準型式フラグ＝"1"）
			if (JFUStrConst.CD00003_1.equals(outMap.get("add_kh")) && "1".equals(outMap.get("stdard_model_flg")))
			{
				tempList.add(outMap);
			}

		}

		// 順番の入れ替えて設定
		for (int i = tempList.size() - 1; i >= 0; i--)
		{
			HashMap outMap = (HashMap)tempList.get(i);
			resultlist.add(outMap);
		}

		return resultlist;
	}

	/**
	 * 文字列変換
	 * 
	 * <br>
	 * @param val 値
	 * @return 変換値
	 */
	private String parseStr(Object val)
	{
		String rtnVal = JFUStrConst.EMPTY;
		if (!JFUBPCommon.isNull(val))
		{
			rtnVal = (String)val;
		}
		return rtnVal;
	}

	/**
	 * 機器のプルダウンリスト作成対象のＨＤＤ容量コードか判定する。
	 * 
	 * @param fuHddCapaChk
	 *            ＳＴＢ機器変更ＨＤＤ容量チェック対象のHDD容量コードリスト
	 * @param hddCapaCd
	 *            保有機器のＨＤＤ容量コード
	 * @param wHddCapaCd
	 *            機器のプルダウンリスト作成候補となるＨＤＤ容量コード
	 * @return true：対象、false：対象外
	 */
	private boolean isSakseiTrgt(List<String> fuHddCapaChk, String hddCapaCd,
			String wHddCapaCd) {

		if (hddCapaCd.equals(wHddCapaCd)) {
			// 同一HDD容量コードの機器交換は不可能とするため、該当する機器のプルダウンリストは作成しない。
			return false;
		}
		if (fuHddCapaChk == null || fuHddCapaChk.size() == 0) {
			return true;
		}
		if (fuHddCapaChk.contains(hddCapaCd)
				&& fuHddCapaChk.contains(wHddCapaCd)) {
			// 保有機器と相互変換不可のＨＤＤ容量コードの場合は、該当する機器のプルダウンリストは作成しない。
			return false;
		}
		return true;
	}
}
